Refactoring of StackSettings to extend StackConfig
[snaps.git] / snaps / openstack / utils / tests / heat_utils_tests.py
index 56bed6b..d90fed4 100644 (file)
 # See the License for the specific language governing permissions and
 # limitations under the License.
 import logging
+import os
+
 import pkg_resources
 import uuid
 
 import time
 
-from snaps.openstack import create_stack
-from snaps.openstack.create_flavor import OpenStackFlavor, FlavorSettings
+import snaps.config.stack as stack_config
+from snaps.config.flavor import FlavorConfig
+from snaps.openstack.create_flavor import OpenStackFlavor
 
 from snaps.openstack.create_image import OpenStackImage
 from snaps.openstack.create_instance import OpenStackVmInstance
-from snaps.openstack.create_stack import StackSettings
+from snaps.openstack.create_stack import StackConfig
 from snaps.openstack.tests import openstack_tests
 from snaps.openstack.tests.os_source_file_test import OSComponentTestCase
 from snaps.openstack.utils import (
@@ -94,7 +97,7 @@ class HeatUtilsCreateSimpleStackTests(OSComponentTestCase):
         # Create Flavor
         self.flavor_creator = OpenStackFlavor(
             self.os_creds,
-            FlavorSettings(name=guid + '-flavor', ram=256, disk=10, vcpus=1))
+            FlavorConfig(name=guid + '-flavor', ram=256, disk=10, vcpus=1))
         self.flavor_creator.create()
 
         env_values = {'image_name': self.image_creator.image_settings.name,
@@ -104,10 +107,10 @@ class HeatUtilsCreateSimpleStackTests(OSComponentTestCase):
                       'inst_name': self.vm_inst_name}
         heat_tmplt_path = pkg_resources.resource_filename(
             'snaps.openstack.tests.heat', 'test_heat_template.yaml')
-        self.stack_settings1 = StackSettings(
+        self.stack_settings1 = StackConfig(
             name=stack_name1, template_path=heat_tmplt_path,
             env_values=env_values)
-        self.stack_settings2 = StackSettings(
+        self.stack_settings2 = StackConfig(
             name=stack_name2, template_path=heat_tmplt_path,
             env_values=env_values)
         self.stack1 = None
@@ -116,7 +119,7 @@ class HeatUtilsCreateSimpleStackTests(OSComponentTestCase):
 
     def tearDown(self):
         """
-        Cleans the image and downloaded image file
+        Cleans the stack and image
         """
         if self.stack1:
             try:
@@ -269,7 +272,7 @@ class HeatUtilsCreateComplexStackTests(OSComponentTestCase):
                       'external_net_name': self.ext_net_name}
         heat_tmplt_path = pkg_resources.resource_filename(
             'snaps.openstack.tests.heat', 'floating_ip_heat_template.yaml')
-        stack_settings = StackSettings(
+        stack_settings = StackConfig(
             name=stack_name, template_path=heat_tmplt_path,
             env_values=env_values)
         self.heat_client = heat_utils.heat_client(self.os_creds)
@@ -277,23 +280,27 @@ class HeatUtilsCreateComplexStackTests(OSComponentTestCase):
 
         self.assertTrue(stack_active(self.heat_client, self.stack))
 
+        self.keypair1_settings = None
+        self.keypair2_settings = None
+
     def tearDown(self):
         """
-        Cleans the image and downloaded image file
+        Cleans the stack and image
         """
         if self.stack:
             try:
                 heat_utils.delete_stack(self.heat_client, self.stack)
                 # Wait until stack deployment has completed
-                end_time = time.time() + create_stack.STACK_COMPLETE_TIMEOUT
+                end_time = (time.time() +
+                            stack_config.STACK_COMPLETE_TIMEOUT)
                 is_deleted = False
                 while time.time() < end_time:
                     status = heat_utils.get_stack_status(self.heat_client,
                                                          self.stack.id)
-                    if status == create_stack.STATUS_DELETE_COMPLETE:
+                    if status == stack_config.STATUS_DELETE_COMPLETE:
                         is_deleted = True
                         break
-                    elif status == create_stack.STATUS_DELETE_FAILED:
+                    elif status == stack_config.STATUS_DELETE_FAILED:
                         is_deleted = False
                         break
 
@@ -308,7 +315,7 @@ class HeatUtilsCreateComplexStackTests(OSComponentTestCase):
                     for server in servers:
                         vm_settings = settings_utils.create_vm_inst_settings(
                             nova, neutron, server)
-                        img_settings = settings_utils.determine_image_settings(
+                        img_settings = settings_utils.determine_image_config(
                             glance, server,
                             [self.image_creator1.image_settings,
                              self.image_creator2.image_settings])
@@ -335,6 +342,18 @@ class HeatUtilsCreateComplexStackTests(OSComponentTestCase):
             except:
                 pass
 
+        if self.keypair1_settings:
+            expanded_path = os.path.expanduser(
+                self.keypair1_settings.private_filepath)
+            os.chmod(expanded_path, 0o755)
+            os.remove(expanded_path)
+
+        if self.keypair2_settings:
+            expanded_path = os.path.expanduser(
+                self.keypair2_settings.private_filepath)
+            os.chmod(expanded_path, 0o755)
+            os.remove(expanded_path)
+
     def test_get_settings_from_stack(self):
         """
         Tests that a heat template with floating IPs and can have the proper
@@ -368,7 +387,7 @@ class HeatUtilsCreateComplexStackTests(OSComponentTestCase):
         self.assertIsNotNone(servers)
         self.assertEqual(2, len(servers))
 
-        image_settings = settings_utils.determine_image_settings(
+        image_settings = settings_utils.determine_image_config(
             glance, servers[0],
             [self.image_creator1.image_settings,
              self.image_creator2.image_settings])
@@ -381,7 +400,7 @@ class HeatUtilsCreateComplexStackTests(OSComponentTestCase):
             self.assertEqual(
                 self.image_creator2.image_settings.name, image_settings.name)
 
-        image_settings = settings_utils.determine_image_settings(
+        image_settings = settings_utils.determine_image_config(
             glance, servers[1],
             [self.image_creator1.image_settings,
              self.image_creator2.image_settings])
@@ -392,17 +411,17 @@ class HeatUtilsCreateComplexStackTests(OSComponentTestCase):
             self.assertEqual(
                 self.image_creator2.image_settings.name, image_settings.name)
 
-        keypair1_settings = settings_utils.determine_keypair_settings(
+        self.keypair1_settings = settings_utils.determine_keypair_config(
             self.heat_client, self.stack, servers[0],
             priv_key_key='private_key')
-        self.assertIsNotNone(keypair1_settings)
-        self.assertEqual(self.keypair_name, keypair1_settings.name)
+        self.assertIsNotNone(self.keypair1_settings)
+        self.assertEqual(self.keypair_name, self.keypair1_settings.name)
 
-        keypair2_settings = settings_utils.determine_keypair_settings(
+        self.keypair2_settings = settings_utils.determine_keypair_config(
             self.heat_client, self.stack, servers[1],
             priv_key_key='private_key')
-        self.assertIsNotNone(keypair2_settings)
-        self.assertEqual(self.keypair_name, keypair2_settings.name)
+        self.assertIsNotNone(self.keypair2_settings)
+        self.assertEqual(self.keypair_name, self.keypair2_settings.name)
 
 
 class HeatUtilsRouterTests(OSComponentTestCase):
@@ -429,7 +448,7 @@ class HeatUtilsRouterTests(OSComponentTestCase):
 
         heat_tmplt_path = pkg_resources.resource_filename(
             'snaps.openstack.tests.heat', 'router_heat_template.yaml')
-        self.stack_settings = StackSettings(
+        self.stack_settings = StackConfig(
             name=stack_name, template_path=heat_tmplt_path,
             env_values=env_values)
         self.stack = None
@@ -455,15 +474,15 @@ class HeatUtilsRouterTests(OSComponentTestCase):
             self.heat_client, self.stack_settings)
 
         # Wait until stack deployment has completed
-        end_time = time.time() + create_stack.STACK_COMPLETE_TIMEOUT
+        end_time = time.time() + stack_config.STACK_COMPLETE_TIMEOUT
         is_active = False
         while time.time() < end_time:
             status = heat_utils.get_stack_status(self.heat_client,
                                                  self.stack.id)
-            if status == create_stack.STATUS_CREATE_COMPLETE:
+            if status == stack_config.STATUS_CREATE_COMPLETE:
                 is_active = True
                 break
-            elif status == create_stack.STATUS_CREATE_FAILED:
+            elif status == stack_config.STATUS_CREATE_FAILED:
                 is_active = False
                 break
 
@@ -504,7 +523,7 @@ class HeatUtilsVolumeTests(OSComponentTestCase):
 
         heat_tmplt_path = pkg_resources.resource_filename(
             'snaps.openstack.tests.heat', 'volume_heat_template.yaml')
-        self.stack_settings = StackSettings(
+        self.stack_settings = StackConfig(
             name=stack_name, template_path=heat_tmplt_path,
             env_values=env_values)
         self.stack = None
@@ -513,7 +532,7 @@ class HeatUtilsVolumeTests(OSComponentTestCase):
 
     def tearDown(self):
         """
-        Cleans the image and downloaded image file
+        Cleans the stack
         """
         if self.stack:
             try:
@@ -584,7 +603,7 @@ class HeatUtilsFlavorTests(OSComponentTestCase):
 
         heat_tmplt_path = pkg_resources.resource_filename(
             'snaps.openstack.tests.heat', 'flavor_heat_template.yaml')
-        self.stack_settings = StackSettings(
+        self.stack_settings = StackConfig(
             name=stack_name, template_path=heat_tmplt_path)
         self.stack = None
         self.heat_client = heat_utils.heat_client(self.os_creds)
@@ -592,7 +611,7 @@ class HeatUtilsFlavorTests(OSComponentTestCase):
 
     def tearDown(self):
         """
-        Cleans the image and downloaded image file
+        Cleans the stack
         """
         if self.stack:
             try:
@@ -638,12 +657,11 @@ class HeatUtilsKeypairTests(OSComponentTestCase):
         stack_name = guid + '-stack'
         self.keypair_name = guid + '-kp'
 
-        env_values = {
-            'keypair_name': self.keypair_name}
+        env_values = {'keypair_name': self.keypair_name}
 
         heat_tmplt_path = pkg_resources.resource_filename(
             'snaps.openstack.tests.heat', 'keypair_heat_template.yaml')
-        self.stack_settings = StackSettings(
+        self.stack_settings = StackConfig(
             name=stack_name, template_path=heat_tmplt_path,
             env_values=env_values)
         self.stack = None
@@ -652,7 +670,7 @@ class HeatUtilsKeypairTests(OSComponentTestCase):
 
     def tearDown(self):
         """
-        Cleans the image and downloaded image file
+        Cleans the stack
         """
         if self.stack:
             try:
@@ -689,6 +707,82 @@ class HeatUtilsKeypairTests(OSComponentTestCase):
         self.assertEqual(self.keypair_name, keypair.name)
 
 
+class HeatUtilsSecurityGroupTests(OSComponentTestCase):
+    """
+    Test Heat volume functionality
+    """
+
+    def setUp(self):
+        """
+        Instantiates OpenStack instances that cannot be spawned by Heat
+        """
+        guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
+        stack_name = guid + '-stack'
+        self.sec_grp_name = guid + '-sec-grp'
+
+        env_values = {'security_group_name': self.sec_grp_name}
+
+        heat_tmplt_path = pkg_resources.resource_filename(
+            'snaps.openstack.tests.heat', 'security_group_heat_template.yaml')
+        self.stack_settings = StackConfig(
+            name=stack_name, template_path=heat_tmplt_path,
+            env_values=env_values)
+        self.stack = None
+        self.heat_client = heat_utils.heat_client(self.os_creds)
+        self.neutron = neutron_utils.neutron_client(self.os_creds)
+
+    def tearDown(self):
+        """
+        Cleans the stack
+        """
+        if self.stack:
+            try:
+                heat_utils.delete_stack(self.heat_client, self.stack)
+            except:
+                pass
+
+    def test_create_security_group_with_stack(self):
+        """
+        Tests the creation of an OpenStack SecurityGroup with Heat.
+        """
+        self.stack = heat_utils.create_stack(
+            self.heat_client, self.stack_settings)
+        self.assertTrue(stack_active(self.heat_client, self.stack))
+
+        sec_grp = heat_utils.get_stack_security_groups(
+            self.heat_client, self.neutron, self.stack)[0]
+
+        self.assertEqual(self.sec_grp_name, sec_grp.name)
+        self.assertEqual('Test description', sec_grp.description)
+        self.assertEqual(2, len(sec_grp.rules))
+
+        has_ssh_rule = False
+        has_icmp_rule = False
+
+        for rule in sec_grp.rules:
+            if (rule.security_group_id == sec_grp.id
+                    and rule.direction == 'egress'
+                    and rule.ethertype == 'IPv4'
+                    and rule.port_range_min == 22
+                    and rule.port_range_max == 22
+                    and rule.protocol == 'tcp'
+                    and rule.remote_group_id is None
+                    and rule.remote_ip_prefix == '0.0.0.0/0'):
+                has_ssh_rule = True
+            if (rule.security_group_id == sec_grp.id
+                    and rule.direction == 'ingress'
+                    and rule.ethertype == 'IPv4'
+                    and rule.port_range_min is None
+                    and rule.port_range_max is None
+                    and rule.protocol == 'icmp'
+                    and rule.remote_group_id is None
+                    and rule.remote_ip_prefix == '0.0.0.0/0'):
+                has_icmp_rule = True
+
+        self.assertTrue(has_ssh_rule)
+        self.assertTrue(has_icmp_rule)
+
+
 def stack_active(heat_cli, stack):
     """
     Blocks until stack application has successfully completed or failed
@@ -697,14 +791,14 @@ def stack_active(heat_cli, stack):
     :return: T/F
     """
     # Wait until stack deployment has completed
-    end_time = time.time() + create_stack.STACK_COMPLETE_TIMEOUT
+    end_time = time.time() + stack_config.STACK_COMPLETE_TIMEOUT
     is_active = False
     while time.time() < end_time:
         status = heat_utils.get_stack_status(heat_cli, stack.id)
-        if status == create_stack.STATUS_CREATE_COMPLETE:
+        if status == stack_config.STATUS_CREATE_COMPLETE:
             is_active = True
             break
-        elif status == create_stack.STATUS_CREATE_FAILED:
+        elif status == stack_config.STATUS_CREATE_FAILED:
             is_active = False
             break