Adds Stack Update
[snaps.git] / snaps / openstack / tests / create_stack_tests.py
index a320aa0..be4d6ea 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()
@@ -502,7 +503,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 +532,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(
@@ -647,7 +648,7 @@ class CreateStackNestedResourceTests(OSIntegrationTestCase):
         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(
@@ -660,6 +661,135 @@ class CreateStackNestedResourceTests(OSIntegrationTestCase):
                 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']
+
+        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=self.guid + '-image',
+                image_metadata=self.image_metadata))
+        self.image_creator.create()
+
+        self.flavor_creator = OpenStackFlavor(
+            self.admin_os_creds,
+            FlavorConfig(
+                name=self.guid + '-flavor-name', ram=256, disk=10, vcpus=1))
+        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=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_update(self):
+        """
+        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(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))
+
+        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):
     """
     Tests for the CreateStack class defined in create_stack.py where the
@@ -701,7 +831,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):
@@ -767,7 +897,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):
@@ -853,7 +983,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):
@@ -919,7 +1049,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()
@@ -1003,7 +1133,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):
@@ -1092,7 +1222,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):
         """
@@ -1103,7 +1233,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):
@@ -1200,7 +1330,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)