Pass flavor metadata into heat template
[snaps.git] / snaps / openstack / tests / create_stack_tests.py
index dc04894..7da5bc7 100644 (file)
@@ -22,7 +22,8 @@ import snaps
 from snaps import file_utils
 from snaps.config.flavor import FlavorConfig
 from snaps.config.image import ImageConfig
-from snaps.config.stack import StackConfigError, StackConfig
+from snaps.config.stack import (StackConfigError, StackConfig,
+    STATUS_UPDATE_COMPLETE)
 from snaps.openstack.create_flavor import OpenStackFlavor
 from snaps.openstack.create_image import OpenStackImage
 
@@ -208,7 +209,7 @@ class CreateStackSuccessTests(OSIntegrationTestCase):
             env_values=self.env_values)
         self.stack_creator = OpenStackHeatStack(
             self.os_creds, stack_settings)
-        created_stack = self.stack_creator.create()
+        created_stack = self.stack_creator.create(block=True)
         self.assertIsNotNone(created_stack)
 
         retrieved_stack = heat_utils.get_stack_by_id(self.heat_cli,
@@ -239,7 +240,7 @@ class CreateStackSuccessTests(OSIntegrationTestCase):
         self.stack_creator = OpenStackHeatStack(
             self.os_creds, stack_settings)
         with self.assertRaises(StackCreationError):
-            self.stack_creator.create()
+            self.stack_creator.create(block=True)
 
     def test_create_stack_template_dict(self):
         """
@@ -256,7 +257,7 @@ class CreateStackSuccessTests(OSIntegrationTestCase):
             env_values=self.env_values)
         self.stack_creator = OpenStackHeatStack(
             self.os_creds, stack_settings)
-        created_stack = self.stack_creator.create()
+        created_stack = self.stack_creator.create(block=True)
         self.assertIsNotNone(created_stack)
 
         retrieved_stack = heat_utils.get_stack_by_id(self.heat_cli,
@@ -280,7 +281,7 @@ class CreateStackSuccessTests(OSIntegrationTestCase):
             env_values=self.env_values)
         self.stack_creator = OpenStackHeatStack(
             self.os_creds, stack_settings)
-        created_stack = self.stack_creator.create()
+        created_stack = self.stack_creator.create(block=True)
         self.assertIsNotNone(created_stack)
 
         retrieved_stack = heat_utils.get_stack_by_id(self.heat_cli,
@@ -324,7 +325,7 @@ class CreateStackSuccessTests(OSIntegrationTestCase):
             env_values=self.env_values)
         self.stack_creator = OpenStackHeatStack(
             self.os_creds, stack_settings)
-        created_stack1 = self.stack_creator.create()
+        created_stack1 = self.stack_creator.create(block=True)
 
         retrieved_stack = heat_utils.get_stack_by_id(self.heat_cli,
                                                      created_stack1.id)
@@ -335,7 +336,7 @@ class CreateStackSuccessTests(OSIntegrationTestCase):
 
         # Should be retrieving the instance data
         stack_creator2 = OpenStackHeatStack(self.os_creds, stack_settings)
-        stack2 = stack_creator2.create()
+        stack2 = stack_creator2.create(block=True)
         self.assertEqual(created_stack1.id, stack2.id)
 
     def test_retrieve_network_creators(self):
@@ -349,7 +350,7 @@ class CreateStackSuccessTests(OSIntegrationTestCase):
             env_values=self.env_values)
         self.stack_creator = OpenStackHeatStack(
             self.os_creds, stack_settings)
-        created_stack = self.stack_creator.create()
+        created_stack = self.stack_creator.create(block=True)
         self.assertIsNotNone(created_stack)
 
         net_creators = self.stack_creator.get_network_creators()
@@ -390,7 +391,7 @@ class CreateStackSuccessTests(OSIntegrationTestCase):
             env_values=self.env_values)
         self.stack_creator = OpenStackHeatStack(
             self.os_creds, stack_settings)
-        created_stack = self.stack_creator.create()
+        created_stack = self.stack_creator.create(block=True)
         self.assertIsNotNone(created_stack)
 
         vm_inst_creators = self.stack_creator.get_vm_inst_creators()
@@ -447,6 +448,7 @@ class CreateStackFloatingIpTests(OSIntegrationTestCase):
             'image2_name': self.image_creator.image_settings.name,
             'flavor1_name': self.flavor1_name,
             'flavor2_name': self.flavor2_name,
+            'flavor_extra_specs': self.flavor_metadata,
             'net_name': self.network_name,
             'subnet_name': self.subnet_name,
             'inst1_name': self.vm_inst1_name,
@@ -502,7 +504,7 @@ class CreateStackFloatingIpTests(OSIntegrationTestCase):
         self.stack_creator = OpenStackHeatStack(
             self.os_creds, stack_settings,
             [self.image_creator.image_settings])
-        created_stack = self.stack_creator.create()
+        created_stack = self.stack_creator.create(block=True)
         self.assertIsNotNone(created_stack)
 
         self.vm_inst_creators = self.stack_creator.get_vm_inst_creators(
@@ -531,7 +533,7 @@ class CreateStackFloatingIpTests(OSIntegrationTestCase):
         self.stack_creator = OpenStackHeatStack(
             self.os_creds, stack_settings,
             [self.image_creator.image_settings])
-        created_stack = self.stack_creator.create()
+        created_stack = self.stack_creator.create(block=True)
         self.assertIsNotNone(created_stack)
 
         derived_stack = create_stack.generate_creator(
@@ -557,6 +559,114 @@ class CreateStackNestedResourceTests(OSIntegrationTestCase):
     Tests to ensure that nested heat templates work
     """
 
+    def setUp(self):
+        self.user_roles = ['heat_stack_owner']
+
+        super(self.__class__, self).__start__()
+
+        self.guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
+
+        self.heat_cli = heat_utils.heat_client(self.os_creds, self.os_session)
+        self.stack_creator = None
+
+        self.image_creator = OpenStackImage(
+            self.os_creds, openstack_tests.cirros_image_settings(
+                name="{}-{}".format(self.guid, 'image'),
+                image_metadata=self.image_metadata))
+        self.image_creator.create()
+
+        flavor_config = openstack_tests.get_flavor_config(
+            name="{}-{}".format(self.guid, 'flavor-name'), ram=256, disk=10,
+            vcpus=1, metadata=self.flavor_metadata)
+        self.flavor_creator = OpenStackFlavor(
+            self.admin_os_creds, flavor_config)
+        self.flavor_creator.create()
+
+        env_values = {
+            'network_name': self.guid + '-network',
+            'public_network': self.ext_net_name,
+            'agent_image': self.image_creator.image_settings.name,
+            'agent_flavor': self.flavor_creator.flavor_settings.name,
+            'key_name': self.guid + '-key',
+        }
+
+        heat_tmplt_path = pkg_resources.resource_filename(
+            'snaps.openstack.tests.heat', 'agent-group.yaml')
+        heat_resource_path = pkg_resources.resource_filename(
+            'snaps.openstack.tests.heat', 'agent.yaml')
+
+        stack_settings = StackConfig(
+            name="{}-{}".format(
+                self.__class__.__name__, str(self.guid) + '-stack'),
+            template_path=heat_tmplt_path,
+            resource_files=[heat_resource_path],
+            env_values=env_values)
+
+        self.stack_creator = OpenStackHeatStack(
+            self.os_creds, stack_settings,
+            [self.image_creator.image_settings])
+
+        self.vm_inst_creators = list()
+
+    def tearDown(self):
+        """
+        Cleans the stack and downloaded stack file
+        """
+        if self.stack_creator:
+            try:
+                self.stack_creator.clean()
+            except:
+                pass
+
+        if self.image_creator:
+            try:
+                self.image_creator.clean()
+            except:
+                pass
+
+        if self.flavor_creator:
+            try:
+                self.flavor_creator.clean()
+            except:
+                pass
+
+        for vm_inst_creator in self.vm_inst_creators:
+            try:
+                keypair_settings = vm_inst_creator.keypair_settings
+                if keypair_settings and keypair_settings.private_filepath:
+                    expanded_path = os.path.expanduser(
+                        keypair_settings.private_filepath)
+                    os.chmod(expanded_path, 0o755)
+                    os.remove(expanded_path)
+            except:
+                pass
+
+        super(self.__class__, self).__clean__()
+
+    def test_nested(self):
+        """
+        Tests the creation of an OpenStack stack from Heat template file and
+        the retrieval of two VM instance creators and attempt to connect via
+        SSH to the first one with a floating IP.
+        """
+        created_stack = self.stack_creator.create(block=True)
+        self.assertIsNotNone(created_stack)
+
+        self.vm_inst_creators = self.stack_creator.get_vm_inst_creators(
+            heat_keypair_option='private_key')
+        self.assertIsNotNone(self.vm_inst_creators)
+        self.assertEqual(1, len(self.vm_inst_creators))
+
+        for vm_inst_creator in self.vm_inst_creators:
+            self.assertTrue(
+                create_instance_tests.validate_ssh_client(vm_inst_creator))
+
+
+class CreateStackUpdateTests(OSIntegrationTestCase):
+    """
+    Tests to ensure that stack update commands work
+    """
+
     def setUp(self):
         self.user_roles = ['heat_stack_owner']
 
@@ -639,13 +749,14 @@ class CreateStackNestedResourceTests(OSIntegrationTestCase):
 
         super(self.__class__, self).__clean__()
 
-    def test_nested(self):
+    def test_update(self):
         """
-        Tests the creation of an OpenStack stack from Heat template file and
+        Tests the update of an OpenStack stack from Heat template file
+        by changing the number of VM instances from 1 to 2, and
         the retrieval of two VM instance creators and attempt to connect via
         SSH to the first one with a floating IP.
         """
-        created_stack = self.stack_creator.create()
+        created_stack = self.stack_creator.create(block=True)
         self.assertIsNotNone(created_stack)
 
         self.vm_inst_creators = self.stack_creator.get_vm_inst_creators(
@@ -657,6 +768,28 @@ class CreateStackNestedResourceTests(OSIntegrationTestCase):
             self.assertTrue(
                 create_instance_tests.validate_ssh_client(vm_inst_creator))
 
+        env_values = {
+            'network_name': self.guid + '-network',
+            'public_network': self.ext_net_name,
+            'agent_count': 2,
+            'agent_image': self.image_creator.image_settings.name,
+            'agent_flavor': self.flavor_creator.flavor_settings.name,
+            'key_name': self.guid + '-key',
+        }
+
+        updated_stack = self.stack_creator.update(env_values, block=True)
+        self.assertIsNotNone(updated_stack)
+        self.assertEqual(STATUS_UPDATE_COMPLETE, updated_stack.status)
+
+        self.vm_inst_creators = self.stack_creator.get_vm_inst_creators(
+            heat_keypair_option='private_key')
+        self.assertIsNotNone(self.vm_inst_creators)
+        self.assertEqual(2, len(self.vm_inst_creators))
+
+        for vm_inst_creator in self.vm_inst_creators:
+            self.assertTrue(
+                create_instance_tests.validate_ssh_client(vm_inst_creator))
+
 
 class CreateStackRouterTests(OSIntegrationTestCase):
     """
@@ -699,7 +832,7 @@ class CreateStackRouterTests(OSIntegrationTestCase):
             env_values=self.env_values)
         self.stack_creator = OpenStackHeatStack(
             self.os_creds, stack_settings)
-        self.created_stack = self.stack_creator.create()
+        self.created_stack = self.stack_creator.create(block=True)
         self.assertIsNotNone(self.created_stack)
 
     def tearDown(self):
@@ -765,7 +898,7 @@ class CreateStackVolumeTests(OSIntegrationTestCase):
             env_values=self.env_values)
         self.stack_creator = OpenStackHeatStack(
             self.os_creds, stack_settings)
-        self.created_stack = self.stack_creator.create()
+        self.created_stack = self.stack_creator.create(block=True)
         self.assertIsNotNone(self.created_stack)
 
     def tearDown(self):
@@ -851,7 +984,7 @@ class CreateStackFlavorTests(OSIntegrationTestCase):
             template_path=self.heat_tmplt_path)
         self.stack_creator = OpenStackHeatStack(
             self.os_creds, stack_settings)
-        self.created_stack = self.stack_creator.create()
+        self.created_stack = self.stack_creator.create(block=True)
         self.assertIsNotNone(self.created_stack)
 
     def tearDown(self):
@@ -917,7 +1050,7 @@ class CreateStackKeypairTests(OSIntegrationTestCase):
             env_values=self.env_values)
         self.stack_creator = OpenStackHeatStack(
             self.os_creds, stack_settings)
-        self.created_stack = self.stack_creator.create()
+        self.created_stack = self.stack_creator.create(block=True)
         self.assertIsNotNone(self.created_stack)
 
         self.keypair_creators = list()
@@ -1001,7 +1134,7 @@ class CreateStackSecurityGroupTests(OSIntegrationTestCase):
             env_values=self.env_values)
         self.stack_creator = OpenStackHeatStack(
             self.os_creds, stack_settings)
-        self.created_stack = self.stack_creator.create()
+        self.created_stack = self.stack_creator.create(block=True)
         self.assertIsNotNone(self.created_stack)
 
     def tearDown(self):
@@ -1090,7 +1223,7 @@ class CreateStackNegativeTests(OSIntegrationTestCase):
         self.stack_creator = OpenStackHeatStack(
             self.os_creds, stack_settings)
         with self.assertRaises(HTTPBadRequest):
-            self.stack_creator.create()
+            self.stack_creator.create(block=True)
 
     def test_bad_stack_file(self):
         """
@@ -1101,7 +1234,7 @@ class CreateStackNegativeTests(OSIntegrationTestCase):
         self.stack_creator = OpenStackHeatStack(
             self.os_creds, stack_settings)
         with self.assertRaises(IOError):
-            self.stack_creator.create()
+            self.stack_creator.create(block=True)
 
 
 class CreateStackFailureTests(OSIntegrationTestCase):
@@ -1198,7 +1331,7 @@ class CreateStackFailureTests(OSIntegrationTestCase):
 
         with self.assertRaises(StackError):
             try:
-                self.stack_creator.create()
+                self.stack_creator.create(block=True)
             except StackError:
                 resources = heat_utils.get_resources(
                     self.heat_cli, self.stack_creator.get_stack().id)