Initial patch with all code from CableLabs repository.
[snaps.git] / snaps / openstack / tests / create_flavor_tests.py
diff --git a/snaps/openstack/tests/create_flavor_tests.py b/snaps/openstack/tests/create_flavor_tests.py
new file mode 100644 (file)
index 0000000..c75bdf6
--- /dev/null
@@ -0,0 +1,311 @@
+# You may obtain a copy of the License at:
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+import uuid
+import unittest
+
+from snaps.openstack.create_flavor import FlavorSettings, OpenStackFlavor
+from snaps.openstack.tests.os_source_file_test import OSComponentTestCase
+from snaps.openstack.utils import nova_utils
+
+__author__ = 'spisarski'
+
+
+class FlavorSettingsUnitTests(unittest.TestCase):
+    """
+    Tests the construction of the FlavorSettings class
+    """
+
+    def test_no_params(self):
+        with self.assertRaises(Exception):
+            FlavorSettings()
+
+    def test_empty_config(self):
+        with self.assertRaises(Exception):
+            FlavorSettings(config=dict())
+
+    def test_name_only(self):
+        with self.assertRaises(Exception):
+            FlavorSettings(name='foo')
+
+    def test_config_with_name_only(self):
+        with self.assertRaises(Exception):
+            FlavorSettings(config={'name': 'foo'})
+
+    def test_name_ram_only(self):
+        with self.assertRaises(Exception):
+            FlavorSettings(name='foo', ram=1)
+
+    def test_config_with_name_ram_only(self):
+        with self.assertRaises(Exception):
+            FlavorSettings(config={'name': 'foo', 'ram': 1})
+
+    def test_name_ram_disk_only(self):
+        with self.assertRaises(Exception):
+            FlavorSettings(name='foo', ram=1, disk=1)
+
+    def test_config_with_name_ram_disk_only(self):
+        with self.assertRaises(Exception):
+            FlavorSettings(config={'name': 'foo', 'ram': 1, 'disk': 1})
+
+    def test_ram_string(self):
+        with self.assertRaises(Exception):
+            FlavorSettings(name='foo', ram='bar', disk=2, vcpus=3, ephemeral=4, swap=5, rxtx_factor=6.0,
+                           is_public=False)
+
+    def test_config_ram_string(self):
+        with self.assertRaises(Exception):
+            FlavorSettings(config={'name': 'foo', 'ram': 'bar', 'disk': 2, 'vcpus': 3, 'ephemeral': 4, 'swap': 5,
+                                   'rxtx_factor': 6.0, 'is_public': False})
+
+    def test_ram_float(self):
+        with self.assertRaises(Exception):
+            FlavorSettings(name='foo', ram=1.5, disk=2, vcpus=3, ephemeral=4, swap=5, rxtx_factor=6.0, is_public=False)
+
+    def test_config_ram_float(self):
+        with self.assertRaises(Exception):
+            FlavorSettings(config={'name': 'foo', 'ram': 1.5, 'disk': 2, 'vcpus': 3, 'ephemeral': 4, 'swap': 5,
+                                   'rxtx_factor': 6.0, 'is_public': False})
+
+    def test_disk_string(self):
+        with self.assertRaises(Exception):
+            FlavorSettings(name='foo', ram=1, disk='bar', vcpus=3, ephemeral=4, swap=5, rxtx_factor=6.0,
+                           is_public=False)
+
+    def test_config_disk_string(self):
+        with self.assertRaises(Exception):
+            FlavorSettings(config={'name': 'foo', 'ram': 1, 'disk': 'bar', 'vcpus': 3, 'ephemeral': 4, 'swap': 5,
+                                   'rxtx_factor': 6.0, 'is_public': False})
+
+    def test_disk_float(self):
+        with self.assertRaises(Exception):
+            FlavorSettings(name='foo', ram=1, disk=2.5, vcpus=3, ephemeral=4, swap=5, rxtx_factor=6.0, is_public=False)
+
+    def test_config_disk_float(self):
+        with self.assertRaises(Exception):
+            FlavorSettings(config={'name': 'foo', 'ram': 1, 'disk': 2.5, 'vcpus': 3, 'ephemeral': 4, 'swap': 5,
+                                   'rxtx_factor': 6.0, 'is_public': False})
+
+    def test_vcpus_string(self):
+        with self.assertRaises(Exception):
+            FlavorSettings(name='foo', ram=1, disk=2, vcpus='bar', ephemeral=4, swap=5, rxtx_factor=6.0,
+                           is_public=False)
+
+    def test_config_vcpus_string(self):
+        with self.assertRaises(Exception):
+            FlavorSettings(config={'name': 'foo', 'ram': 1, 'disk': 2, 'vcpus': 'bar', 'ephemeral': 4, 'swap': 5,
+                                   'rxtx_factor': 6.0, 'is_public': False})
+
+    def test_ephemeral_string(self):
+        with self.assertRaises(Exception):
+            FlavorSettings(name='foo', ram=1, disk=2, vcpus=3, ephemeral='bar', swap=5, rxtx_factor=6.0,
+                           is_public=False)
+
+    def test_config_ephemeral_string(self):
+        with self.assertRaises(Exception):
+            FlavorSettings(config={'name': 'foo', 'ram': 1, 'disk': 2, 'vcpus': 3, 'ephemeral': 'bar', 'swap': 5,
+                                   'rxtx_factor': 6.0, 'is_public': False})
+
+    def test_ephemeral_float(self):
+        with self.assertRaises(Exception):
+            FlavorSettings(name='foo', ram=1, disk=2, vcpus=3, ephemeral=4.5, swap=5, rxtx_factor=6.0, is_public=False)
+
+    def test_config_ephemeral_float(self):
+        with self.assertRaises(Exception):
+            FlavorSettings(config={'name': 'foo', 'ram': 1, 'disk': 2, 'vcpus': 3, 'ephemeral': 4.5, 'swap': 5,
+                                   'rxtx_factor': 6.0, 'is_public': False})
+
+    def test_swap_string(self):
+        with self.assertRaises(Exception):
+            FlavorSettings(name='foo', ram=1, disk=2, vcpus=3, ephemeral=4, swap='bar', rxtx_factor=6.0,
+                           is_public=False)
+
+    def test_config_swap_string(self):
+        with self.assertRaises(Exception):
+            FlavorSettings(config={'name': 'foo', 'ram': 1, 'disk': 2, 'vcpus': 3, 'ephemeral': 4, 'swap': 'bar',
+                                   'rxtx_factor': 6.0, 'is_public': False})
+
+    def test_swap_float(self):
+        with self.assertRaises(Exception):
+            FlavorSettings(name='foo', ram=1, disk=2, vcpus=3, ephemeral=4, swap=5.5, rxtx_factor=6.0, is_public=False)
+
+    def test_config_swap_float(self):
+        with self.assertRaises(Exception):
+            FlavorSettings(config={'name': 'foo', 'ram': 1, 'disk': 2, 'vcpus': 3, 'ephemeral': 4, 'swap': 5.5,
+                                   'rxtx_factor': 6.0, 'is_public': False})
+
+    def test_rxtx_string(self):
+        with self.assertRaises(Exception):
+            FlavorSettings(name='foo', ram=1, disk=2, vcpus=3, ephemeral=4, swap=5, rxtx_factor='bar', is_public=False)
+
+    def test_config_rxtx_string(self):
+        with self.assertRaises(Exception):
+            FlavorSettings(config={'name': 'foo', 'ram': 1, 'disk': 2, 'vcpus': 3, 'ephemeral': 4, 'swap': 5,
+                                   'rxtx_factor': 'bar', 'is_public': False})
+
+    def test_is_pub_string(self):
+        with self.assertRaises(Exception):
+            FlavorSettings(name='foo', ram=1, disk=2, vcpus=3, ephemeral=4, swap=5, rxtx_factor=6.0, is_public='bar')
+
+    def test_config_is_pub_string(self):
+        with self.assertRaises(Exception):
+            FlavorSettings(config={'name': 'foo', 'ram': 1, 'disk': 2, 'vcpus': 3, 'ephemeral': 4, 'swap': 5,
+                                   'rxtx_factor': 6.0, 'is_public': 'bar'})
+
+    def test_name_ram_disk_vcpus_only(self):
+        settings = FlavorSettings(name='foo', ram=1, disk=2, vcpus=3)
+        self.assertEquals('foo', settings.name)
+        self.assertEquals('auto', settings.flavor_id)
+        self.assertEquals(1, settings.ram)
+        self.assertEquals(2, settings.disk)
+        self.assertEquals(3, settings.vcpus)
+        self.assertEquals(0, settings.ephemeral)
+        self.assertEquals(0, settings.swap)
+        self.assertEquals(1.0, settings.rxtx_factor)
+        self.assertEquals(True, settings.is_public)
+
+    def test_config_with_name_ram_disk_vcpus_only(self):
+        settings = FlavorSettings(config={'name': 'foo', 'ram': 1, 'disk': 2, 'vcpus': 3})
+        self.assertEquals('foo', settings.name)
+        self.assertEquals('auto', settings.flavor_id)
+        self.assertEquals(1, settings.ram)
+        self.assertEquals(2, settings.disk)
+        self.assertEquals(3, settings.vcpus)
+        self.assertEquals(0, settings.ephemeral)
+        self.assertEquals(0, settings.swap)
+        self.assertEquals(1.0, settings.rxtx_factor)
+        self.assertEquals(True, settings.is_public)
+
+    def test_all(self):
+        settings = FlavorSettings(name='foo', flavor_id='bar', ram=1, disk=2, vcpus=3, ephemeral=4, swap=5, rxtx_factor=6.0,
+                                  is_public=False)
+        self.assertEquals('foo', settings.name)
+        self.assertEquals('bar', settings.flavor_id)
+        self.assertEquals(1, settings.ram)
+        self.assertEquals(2, settings.disk)
+        self.assertEquals(3, settings.vcpus)
+        self.assertEquals(4, settings.ephemeral)
+        self.assertEquals(5, settings.swap)
+        self.assertEquals(6.0, settings.rxtx_factor)
+        self.assertEquals(False, settings.is_public)
+
+    def test_config_all(self):
+        settings = FlavorSettings(config={'name': 'foo', 'flavor_id': 'bar', 'ram': 1, 'disk': 2, 'vcpus': 3, 'ephemeral': 4,
+                                          'swap': 5, 'rxtx_factor': 6.0, 'is_public': False})
+        self.assertEquals('foo', settings.name)
+        self.assertEquals('bar', settings.flavor_id)
+        self.assertEquals(1, settings.ram)
+        self.assertEquals(2, settings.disk)
+        self.assertEquals(3, settings.vcpus)
+        self.assertEquals(4, settings.ephemeral)
+        self.assertEquals(5, settings.swap)
+        self.assertEquals(6.0, settings.rxtx_factor)
+        self.assertEquals(False, settings.is_public)
+
+
+class CreateFlavorTests(OSComponentTestCase):
+    """
+    Test for the CreateSecurityGroup class defined in create_security_group.py
+    """
+
+    def setUp(self):
+        """
+        Instantiates the CreateSecurityGroup object that is responsible for downloading and creating an OS image file
+        within OpenStack
+        """
+        guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
+        self.flavor_name = guid + 'name'
+
+        self.nova = nova_utils.nova_client(self.os_creds)
+
+        # Initialize for cleanup
+        self.flavor_creator = None
+
+    def tearDown(self):
+        """
+        Cleans the image and downloaded image file
+        """
+        if self.flavor_creator:
+            self.flavor_creator.clean()
+
+    def test_create_flavor(self):
+        """
+        Tests the creation of an OpenStack flavor.
+        """
+        # Create Flavor
+        flavor_settings = FlavorSettings(name=self.flavor_name, ram=1, disk=1, vcpus=1)
+        self.flavor_creator = OpenStackFlavor(self.os_creds, flavor_settings)
+        flavor = self.flavor_creator.create()
+        self.assertTrue(validate_flavor(flavor_settings, flavor))
+
+    def test_create_flavor_existing(self):
+        """
+        Tests the creation of an OpenStack flavor then starts another creator to ensure it has not been done twice.
+        """
+        # Create Flavor
+        flavor_settings = FlavorSettings(name=self.flavor_name, ram=1, disk=1, vcpus=1)
+        self.flavor_creator = OpenStackFlavor(self.os_creds, flavor_settings)
+        flavor = self.flavor_creator.create()
+        self.assertTrue(validate_flavor(flavor_settings, flavor))
+
+        flavor_creator_2 = OpenStackFlavor(self.os_creds, flavor_settings)
+        flavor2 = flavor_creator_2.create()
+
+        self.assertEquals(flavor.id, flavor2.id)
+
+    def test_create_clean_flavor(self):
+        """
+        Tests the creation and cleanup of an OpenStack flavor.
+        """
+        # Create Flavor
+        flavor_settings = FlavorSettings(name=self.flavor_name, ram=1, disk=1, vcpus=1)
+        self.flavor_creator = OpenStackFlavor(self.os_creds, flavor_settings)
+        flavor = self.flavor_creator.create()
+        self.assertTrue(validate_flavor(flavor_settings, flavor))
+
+        # Clean Flavor
+        self.flavor_creator.clean()
+
+        self.assertIsNone(self.flavor_creator.get_flavor())
+        self.assertIsNone(nova_utils.get_flavor_by_name(self.nova, flavor_settings.name))
+
+    def test_create_delete_flavor(self):
+        """
+        Tests the creation of an OpenStack Security Group, the deletion, then cleanup to ensure clean() does not
+        raise any exceptions.
+        """
+        # Create Flavor
+        flavor_settings = FlavorSettings(name=self.flavor_name, ram=1, disk=1, vcpus=1)
+        self.flavor_creator = OpenStackFlavor(self.os_creds, flavor_settings)
+        flavor = self.flavor_creator.create()
+        self.assertTrue(validate_flavor(flavor_settings, flavor))
+
+        # Delete Flavor
+        nova_utils.delete_flavor(self.nova, flavor)
+        self.assertIsNone(nova_utils.get_flavor_by_name(self.nova, flavor_settings.name))
+
+        # Attempt to cleanup
+        self.flavor_creator.clean()
+
+        self.assertIsNone(self.flavor_creator.get_flavor())
+
+        # TODO - Add more tests to exercise all configuration options
+
+
+def validate_flavor(flavor_settings, flavor):
+    """
+    Validates the flavor_settings against the OpenStack flavor object
+    :param flavor_settings: the settings used to create the flavor
+    :param flavor: the OpenStack flavor object
+    """
+    return flavor is not None \
+           and flavor_settings.name == flavor.name \
+           and flavor_settings.ram == flavor.ram \
+           and flavor_settings.disk == flavor.disk \
+           and flavor_settings.vcpus == flavor.vcpus