Added the ability to add in configurable metadata to flavor creation. 67/28967/1
authorspisarski <s.pisarski@cablelabs.com>
Fri, 17 Feb 2017 16:21:59 +0000 (09:21 -0700)
committerspisarski <s.pisarski@cablelabs.com>
Fri, 17 Feb 2017 16:21:59 +0000 (09:21 -0700)
In order to properly support standard and DPDK installations, the
default metadata value is hw:mem_page_size=any.

JIRA: SNAPS-28
JIRA: FUNCTEST-737

Change-Id: Ic882e8f85a97320d65ede3d6a00735a909a4ead2
Signed-off-by: spisarski <s.pisarski@cablelabs.com>
snaps/openstack/create_flavor.py
snaps/openstack/tests/create_flavor_tests.py

index 60a87cd..68a7080 100644 (file)
@@ -22,6 +22,8 @@ __author__ = 'spisarski'
 
 logger = logging.getLogger('create_image')
 
+DEFAULT_METADATA = {'hw:mem_page_size': 'any'}
+
 
 class OpenStackFlavor:
     """
@@ -51,6 +53,9 @@ class OpenStackFlavor:
             logger.info('Found flavor with name - ' + self.flavor_settings.name)
         elif not cleanup:
             self.__flavor = nova_utils.create_flavor(self.__nova, self.flavor_settings)
+            if self.flavor_settings.metadata:
+                self.__flavor.set_keys(self.flavor_settings.metadata)
+            self.__flavor = nova_utils.get_flavor_by_name(self.__nova, self.flavor_settings.name)
         else:
             logger.info('Did not create flavor due to cleanup mode')
 
@@ -83,7 +88,7 @@ class FlavorSettings:
     """
 
     def __init__(self, config=None, name=None, flavor_id='auto', ram=None, disk=None, vcpus=None, ephemeral=0, swap=0,
-                 rxtx_factor=1.0, is_public=True):
+                 rxtx_factor=1.0, is_public=True, metadata=DEFAULT_METADATA):
         """
         Constructor
         :param config: dict() object containing the configuration settings using the attribute names below as each
@@ -98,6 +103,7 @@ class FlavorSettings:
         :param rxtx_factor: the receive/transmit factor to be set on ports if backend supports
                             QoS extension (default 1.0)
         :param is_public: denotes whether or not the flavor is public (default True)
+        :param metadata: freeform dict() for special metadata (default hw:mem_page_size=any)
         """
 
         if config:
@@ -131,6 +137,11 @@ class FlavorSettings:
                 self.is_public = config['is_public']
             else:
                 self.is_public = is_public
+
+            if config.get('metadata'):
+                self.metadata = config['metadata']
+            else:
+                self.metadata = metadata
         else:
             self.name = name
             self.flavor_id = flavor_id
@@ -141,6 +152,7 @@ class FlavorSettings:
             self.swap = swap
             self.rxtx_factor = rxtx_factor
             self.is_public = is_public
+            self.metadata = metadata
 
         if not self.name or not self.ram or not self.disk or not self.vcpus:
             raise Exception('The attributes name, ram, disk, and vcpus are required for FlavorSettings')
index c75bdf6..7660665 100644 (file)
@@ -10,6 +10,7 @@
 import uuid
 import unittest
 
+from snaps.openstack import create_flavor
 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
@@ -169,6 +170,7 @@ class FlavorSettingsUnitTests(unittest.TestCase):
         self.assertEquals(0, settings.swap)
         self.assertEquals(1.0, settings.rxtx_factor)
         self.assertEquals(True, settings.is_public)
+        self.assertEquals(create_flavor.DEFAULT_METADATA, settings.metadata)
 
     def test_config_with_name_ram_disk_vcpus_only(self):
         settings = FlavorSettings(config={'name': 'foo', 'ram': 1, 'disk': 2, 'vcpus': 3})
@@ -181,10 +183,12 @@ class FlavorSettingsUnitTests(unittest.TestCase):
         self.assertEquals(0, settings.swap)
         self.assertEquals(1.0, settings.rxtx_factor)
         self.assertEquals(True, settings.is_public)
+        self.assertEquals(create_flavor.DEFAULT_METADATA, settings.metadata)
 
     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)
+        metadata = {'foo': 'bar'}
+        settings = FlavorSettings(name='foo', flavor_id='bar', ram=1, disk=2, vcpus=3, ephemeral=4, swap=5,
+                                  rxtx_factor=6.0, is_public=False, metadata=metadata)
         self.assertEquals('foo', settings.name)
         self.assertEquals('bar', settings.flavor_id)
         self.assertEquals(1, settings.ram)
@@ -194,10 +198,13 @@ class FlavorSettingsUnitTests(unittest.TestCase):
         self.assertEquals(5, settings.swap)
         self.assertEquals(6.0, settings.rxtx_factor)
         self.assertEquals(False, settings.is_public)
+        self.assertEquals(metadata, settings.metadata)
 
     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})
+        metadata = {'foo': 'bar'}
+        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,
+                                          'metadata': metadata})
         self.assertEquals('foo', settings.name)
         self.assertEquals('bar', settings.flavor_id)
         self.assertEquals(1, settings.ram)
@@ -207,6 +214,7 @@ class FlavorSettingsUnitTests(unittest.TestCase):
         self.assertEquals(5, settings.swap)
         self.assertEquals(6.0, settings.rxtx_factor)
         self.assertEquals(False, settings.is_public)
+        self.assertEquals(metadata, settings.metadata)
 
 
 class CreateFlavorTests(OSComponentTestCase):