Added the ability to give the tests the ability to add in flavor metadata. 71/29671/3
authorspisarski <s.pisarski@cablelabs.com>
Thu, 2 Mar 2017 19:01:34 +0000 (12:01 -0700)
committerspisarski <s.pisarski@cablelabs.com>
Mon, 6 Mar 2017 16:07:48 +0000 (09:07 -0700)
NFVI's configured for OVS/DPDK and fd.io scenarios required special
metadata for flavors in order for VM instances to be activated. This
patch allows for setting a value to be applied to all tests. With
this change, the default value is being removed that only partially
addressed this issue.

JIRA: SNAPS-38

Change-Id: Ic42944a849f710f631fe7ac6fbefb720a73f0b77
Signed-off-by: spisarski <s.pisarski@cablelabs.com>
snaps/openstack/create_flavor.py
snaps/openstack/tests/create_flavor_tests.py
snaps/openstack/tests/create_instance_tests.py
snaps/openstack/tests/os_source_file_test.py
snaps/provisioning/tests/ansible_utils_tests.py
snaps/test_suite_builder.py
snaps/unit_test_suite.py

index 68a7080..30271c1 100644 (file)
@@ -22,7 +22,8 @@ __author__ = 'spisarski'
 
 logger = logging.getLogger('create_image')
 
-DEFAULT_METADATA = {'hw:mem_page_size': 'any'}
+MEM_PAGE_SIZE_ANY = {'hw:mem_page_size': 'any'}
+MEM_PAGE_SIZE_LARGE = {'hw:mem_page_size': 'large'}
 
 
 class OpenStackFlavor:
@@ -88,7 +89,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, metadata=DEFAULT_METADATA):
+                 rxtx_factor=1.0, is_public=True, metadata=None):
         """
         Constructor
         :param config: dict() object containing the configuration settings using the attribute names below as each
index 7660665..ad135ee 100644 (file)
@@ -10,7 +10,6 @@
 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
@@ -170,7 +169,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)
+        self.assertEquals(None, settings.metadata)
 
     def test_config_with_name_ram_disk_vcpus_only(self):
         settings = FlavorSettings(config={'name': 'foo', 'ram': 1, 'disk': 2, 'vcpus': 3})
@@ -183,7 +182,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)
+        self.assertEquals(None, settings.metadata)
 
     def test_all(self):
         metadata = {'foo': 'bar'}
index 1daf701..40fb779 100644 (file)
@@ -28,7 +28,7 @@ from snaps.openstack.create_image import OpenStackImage
 from snaps.openstack.create_security_group import SecurityGroupSettings, OpenStackSecurityGroup
 from snaps.openstack.tests import openstack_tests, validation_utils
 from snaps.openstack.utils import nova_utils
-from snaps.openstack.tests.os_source_file_test import OSComponentTestCase, OSIntegrationTestCase
+from snaps.openstack.tests.os_source_file_test import OSIntegrationTestCase
 
 __author__ = 'spisarski'
 
@@ -267,7 +267,7 @@ class SimpleHealthCheck(OSIntegrationTestCase):
             # Create Flavor
             self.flavor_creator = OpenStackFlavor(
                 self.admin_os_creds,
-                FlavorSettings(name=guid + '-flavor-name', ram=1024, disk=10, vcpus=1))
+                FlavorSettings(name=guid + '-flavor-name', ram=1024, disk=10, vcpus=1, metadata=self.flavor_metadata))
             self.flavor_creator.create()
         except Exception as e:
             self.tearDown()
@@ -380,7 +380,7 @@ class CreateInstanceSimpleTests(OSIntegrationTestCase):
             # Create Flavor
             self.flavor_creator = OpenStackFlavor(
                 self.admin_os_creds,
-                FlavorSettings(name=guid + '-flavor-name', ram=2048, disk=10, vcpus=2))
+                FlavorSettings(name=guid + '-flavor-name', ram=2048, disk=10, vcpus=2, metadata=self.flavor_metadata))
             self.flavor_creator.create()
 
             # Create Network
@@ -497,7 +497,7 @@ class CreateInstanceSingleNetworkTests(OSIntegrationTestCase):
             # Create Flavor
             self.flavor_creator = OpenStackFlavor(
                 self.admin_os_creds,
-                FlavorSettings(name=guid + '-flavor-name', ram=2048, disk=10, vcpus=2))
+                FlavorSettings(name=guid + '-flavor-name', ram=2048, disk=10, vcpus=2, metadata=self.flavor_metadata))
             self.flavor_creator.create()
 
             self.keypair_creator = OpenStackKeypair(
@@ -761,7 +761,7 @@ class CreateInstancePortManipulationTests(OSIntegrationTestCase):
             # Create Flavor
             self.flavor_creator = OpenStackFlavor(
                 self.admin_os_creds,
-                FlavorSettings(name=guid + '-flavor-name', ram=2048, disk=10, vcpus=2))
+                FlavorSettings(name=guid + '-flavor-name', ram=2048, disk=10, vcpus=2, metadata=self.flavor_metadata))
             self.flavor_creator.create()
         except Exception as e:
             self.tearDown()
@@ -948,7 +948,7 @@ class CreateInstancePortManipulationTests(OSIntegrationTestCase):
             self.inst_creator.create()
 
 
-class CreateInstanceOnComputeHost(OSComponentTestCase):
+class CreateInstanceOnComputeHost(OSIntegrationTestCase):
     """
     Test for the CreateInstance where one VM is deployed to each compute node
     """
@@ -958,6 +958,8 @@ class CreateInstanceOnComputeHost(OSComponentTestCase):
         Instantiates the CreateImage object that is responsible for downloading and creating an OS image file
         within OpenStack
         """
+        super(self.__class__, self).__start__()
+
         guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
         self.vm_inst_name = guid + '-inst'
         self.port_base_name = guid + 'port'
@@ -975,17 +977,17 @@ class CreateInstanceOnComputeHost(OSComponentTestCase):
 
         try:
             # Create Network
-            self.network_creator = OpenStackNetwork(self.os_creds, self.priv_net_config.network_settings)
+            self.network_creator = OpenStackNetwork(self.admin_os_creds, self.priv_net_config.network_settings)
             self.network_creator.create()
 
             # Create Flavor
             self.flavor_creator = OpenStackFlavor(
-                self.os_creds,
-                FlavorSettings(name=guid + '-flavor-name', ram=512, disk=1, vcpus=1))
+                self.admin_os_creds,
+                FlavorSettings(name=guid + '-flavor-name', ram=512, disk=1, vcpus=1, metadata=self.flavor_metadata))
             self.flavor_creator.create()
 
             # Create Image
-            self.image_creator = OpenStackImage(self.os_creds, self.os_image_settings)
+            self.image_creator = OpenStackImage(self.admin_os_creds, self.os_image_settings)
             self.image_creator.create()
 
         except Exception as e:
@@ -1020,12 +1022,14 @@ class CreateInstanceOnComputeHost(OSComponentTestCase):
             except Exception as e:
                 logger.error('Unexpected exception cleaning image with message - ' + e.message)
 
+        super(self.__class__, self).__clean__()
+
     def test_deploy_vm_to_each_compute_node(self):
         """
         Tests the creation of OpenStack VM instances to each compute node.
         """
         from snaps.openstack.utils import nova_utils
-        nova = nova_utils.nova_client(self.os_creds)
+        nova = nova_utils.nova_client(self.admin_os_creds)
         zones = nova_utils.get_nova_availability_zones(nova)
 
         # Create Instance on each server/zone
@@ -1040,7 +1044,7 @@ class CreateInstanceOnComputeHost(OSComponentTestCase):
                 name=inst_name, flavor=self.flavor_creator.flavor_settings.name, availability_zone=zone,
                 port_settings=[port_settings])
             inst_creator = OpenStackVmInstance(
-                self.os_creds, instance_settings, self.image_creator.image_settings)
+                self.admin_os_creds, instance_settings, self.image_creator.image_settings)
             self.inst_creators.append(inst_creator)
             inst_creator.create()
 
@@ -1116,7 +1120,8 @@ class CreateInstancePubPrivNetTests(OSIntegrationTestCase):
             # Create Flavor
             self.flavor_creator = OpenStackFlavor(
                 self.admin_os_creds,
-                FlavorSettings(name=self.guid + '-flavor-name', ram=2048, disk=10, vcpus=2))
+                FlavorSettings(name=self.guid + '-flavor-name', ram=2048, disk=10, vcpus=2,
+                               metadata=self.flavor_metadata))
             self.flavor_creator.create()
 
             # Create Keypair
@@ -1269,7 +1274,8 @@ class InstanceSecurityGroupTests(OSIntegrationTestCase):
             # Create Flavor
             self.flavor_creator = OpenStackFlavor(
                 self.admin_os_creds,
-                FlavorSettings(name=self.guid + '-flavor-name', ram=2048, disk=10, vcpus=2))
+                FlavorSettings(name=self.guid + '-flavor-name', ram=2048, disk=10, vcpus=2,
+                               metadata=self.flavor_metadata))
             self.flavor_creator.create()
 
             self.port_settings = PortSettings(name=self.guid + '-port',
@@ -1519,32 +1525,36 @@ class CreateInstanceFromThreePartImage(OSIntegrationTestCase):
         try:
             # Create Images
             # Create the kernel image
-            kernel_image_settings = openstack_tests.cirros_url_image(name=self.image_name+'_kernel',
+            kernel_image_settings = openstack_tests.cirros_url_image(
+                name=self.image_name+'_kernel',
                 url='http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-kernel')
             self.image_creators.append(OpenStackImage(self.os_creds, kernel_image_settings))
             kernel_image = self.image_creators[-1].create()
 
             # Create the ramdisk image
-            ramdisk_image_settings = openstack_tests.cirros_url_image(name=self.image_name+'_ramdisk',
+            ramdisk_image_settings = openstack_tests.cirros_url_image(
+                name=self.image_name+'_ramdisk',
                 url='http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-initramfs')
             self.image_creators.append(OpenStackImage(self.os_creds, ramdisk_image_settings))
             ramdisk_image = self.image_creators[-1].create()
             self.assertIsNotNone(ramdisk_image)
 
             # Create the main image
-            os_image_settings = openstack_tests.cirros_url_image(name=self.image_name,
+            os_image_settings = openstack_tests.cirros_url_image(
+                name=self.image_name,
                 url='http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-disk.img')
-            properties = {}
+            properties = dict()
             properties['kernel_id'] = kernel_image.id
             properties['ramdisk_id'] = ramdisk_image.id
             os_image_settings.extra_properties = properties
             self.image_creators.append(OpenStackImage(self.os_creds, os_image_settings))
             created_image = self.image_creators[-1].create()
+            self.assertIsNotNone(created_image)
 
             # Create Flavor
             self.flavor_creator = OpenStackFlavor(
                 self.admin_os_creds,
-                FlavorSettings(name=guid + '-flavor-name', ram=2048, disk=10, vcpus=2))
+                FlavorSettings(name=guid + '-flavor-name', ram=2048, disk=10, vcpus=2, metadata=self.flavor_metadata))
             self.flavor_creator.create()
 
             # Create Network
@@ -1611,4 +1621,3 @@ class CreateInstanceFromThreePartImage(OSIntegrationTestCase):
 
         # Exception should not be thrown
         self.inst_creator.clean()
-
index fa8d197..20a8d80 100644 (file)
@@ -19,15 +19,16 @@ from snaps import file_utils
 import openstack_tests
 import logging
 
-# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-# To run these tests from an IDE, the CWD must be set to the python directory of this project
-# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 from snaps.openstack.create_project import ProjectSettings
 from snaps.openstack.create_user import UserSettings
 from snaps.openstack.utils import deploy_utils, keystone_utils
 
 dev_os_env_file = 'openstack/tests/conf/os_env.yaml'
 
+# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+# To run these tests from an IDE, the CWD must be set to the snaps directory of this project
+# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
 
 class OSComponentTestCase(unittest.TestCase):
 
@@ -68,16 +69,17 @@ class OSIntegrationTestCase(OSComponentTestCase):
     Super for test classes requiring a connection to OpenStack
     """
     def __init__(self, method_name='runTest', os_env_file=None, ext_net_name=None, http_proxy_str=None,
-                 ssh_proxy_cmd=None, use_keystone=False, log_level=logging.DEBUG):
+                 ssh_proxy_cmd=None, use_keystone=False, flavor_metadata=None, log_level=logging.DEBUG):
         super(OSIntegrationTestCase, self).__init__(method_name=method_name, os_env_file=os_env_file,
                                                     ext_net_name=ext_net_name, http_proxy_str=http_proxy_str,
                                                     ssh_proxy_cmd=ssh_proxy_cmd, log_level=log_level)
         self.use_keystone = use_keystone
         self.keystone = None
+        self.flavor_metadata = flavor_metadata
 
     @staticmethod
     def parameterize(testcase_klass, os_env_file, ext_net_name, http_proxy_str=None, ssh_proxy_cmd=None,
-                     use_keystone=False, log_level=logging.DEBUG):
+                     use_keystone=False, flavor_metadata=None, log_level=logging.DEBUG):
         """ Create a suite containing all tests taken from the given
             subclass, passing them the parameter 'param'.
         """
@@ -86,7 +88,7 @@ class OSIntegrationTestCase(OSComponentTestCase):
         suite = unittest.TestSuite()
         for name in test_names:
             suite.addTest(testcase_klass(name, os_env_file, ext_net_name, http_proxy_str, ssh_proxy_cmd, use_keystone,
-                                         log_level))
+                                         flavor_metadata, log_level))
         return suite
 
     """
index dc108e0..552171f 100644 (file)
@@ -85,7 +85,8 @@ class AnsibleProvisioningTests(OSIntegrationTestCase):
             # Create Flavor
             self.flavor_creator = create_flavor.OpenStackFlavor(
                 self.admin_os_creds,
-                create_flavor.FlavorSettings(name=guid + '-flavor-name', ram=2048, disk=10, vcpus=2))
+                create_flavor.FlavorSettings(name=guid + '-flavor-name', ram=2048, disk=10, vcpus=2,
+                                             metadata=self.flavor_metadata))
             self.flavor_creator.create()
 
             # Create Key/Pair
index b12602d..1768921 100644 (file)
@@ -134,7 +134,8 @@ def add_openstack_api_tests(suite, source_filename, ext_net_name, http_proxy_str
 
 
 def add_openstack_integration_tests(suite, source_filename, ext_net_name, proxy_settings=None, ssh_proxy_cmd=None,
-                                    use_keystone=True, use_floating_ips=True, log_level=logging.INFO):
+                                    use_keystone=True, flavor_metadata=None, use_floating_ips=True,
+                                    log_level=logging.INFO):
     """
     Adds tests written to exercise all long-running OpenStack integration tests meaning they will be creating VM
     instances and potentially performing some SSH functions through floating IPs
@@ -145,6 +146,8 @@ def add_openstack_integration_tests(suite, source_filename, ext_net_name, proxy_
     :param ssh_proxy_cmd: the command your environment requires for creating ssh connections through a proxy
     :param use_keystone: when True, tests requiring direct access to Keystone are added as these need to be running on
                          a host that has access to the cloud's private network
+    :param flavor_metadata: dict() object containing the metadata required by your flavor based on your configuration:
+                            (i.e. {'hw:mem_page_size': 'large'})
     :param use_floating_ips: when true, all tests requiring Floating IPs will be added to the suite
     :param log_level: the logging level
     :return: None as the tests will be adding to the 'suite' parameter object
@@ -155,60 +158,62 @@ def add_openstack_integration_tests(suite, source_filename, ext_net_name, proxy_
     # Creator Object tests
     suite.addTest(OSIntegrationTestCase.parameterize(CreateSecurityGroupTests, source_filename, ext_net_name,
                                                      http_proxy_str=proxy_settings, use_keystone=use_keystone,
-                                                     log_level=log_level))
+                                                     flavor_metadata=flavor_metadata, log_level=log_level))
     suite.addTest(OSIntegrationTestCase.parameterize(CreateImageSuccessTests, source_filename, ext_net_name,
                                                      http_proxy_str=proxy_settings, use_keystone=use_keystone,
-                                                     log_level=log_level))
+                                                     flavor_metadata=flavor_metadata, log_level=log_level))
     suite.addTest(OSIntegrationTestCase.parameterize(CreateImageNegativeTests, source_filename, ext_net_name,
                                                      http_proxy_str=proxy_settings, use_keystone=use_keystone,
-                                                     log_level=log_level))
+                                                     flavor_metadata=flavor_metadata, log_level=log_level))
     suite.addTest(OSIntegrationTestCase.parameterize(CreateMultiPartImageTests, source_filename, ext_net_name,
                                                      http_proxy_str=proxy_settings, use_keystone=use_keystone,
-                                                     log_level=log_level))
+                                                     flavor_metadata=flavor_metadata, log_level=log_level))
     suite.addTest(OSIntegrationTestCase.parameterize(CreateKeypairsTests, source_filename, ext_net_name,
                                                      http_proxy_str=proxy_settings, use_keystone=use_keystone,
-                                                     log_level=log_level))
+                                                     flavor_metadata=flavor_metadata, log_level=log_level))
     suite.addTest(OSIntegrationTestCase.parameterize(CreateNetworkSuccessTests, source_filename, ext_net_name,
                                                      http_proxy_str=proxy_settings, use_keystone=use_keystone,
-                                                     log_level=log_level))
+                                                     flavor_metadata=flavor_metadata, log_level=log_level))
     suite.addTest(OSIntegrationTestCase.parameterize(CreateRouterSuccessTests, source_filename, ext_net_name,
                                                      http_proxy_str=proxy_settings, use_keystone=use_keystone,
-                                                     log_level=log_level))
+                                                     flavor_metadata=flavor_metadata, log_level=log_level))
     suite.addTest(OSIntegrationTestCase.parameterize(CreateRouterNegativeTests, source_filename, ext_net_name,
                                                      http_proxy_str=proxy_settings, use_keystone=use_keystone,
-                                                     log_level=log_level))
+                                                     flavor_metadata=flavor_metadata, log_level=log_level))
 
     # VM Instances
     suite.addTest(OSIntegrationTestCase.parameterize(SimpleHealthCheck, source_filename, ext_net_name,
                                                      http_proxy_str=proxy_settings, use_keystone=use_keystone,
-                                                     log_level=log_level))
+                                                     flavor_metadata=flavor_metadata, log_level=log_level))
     suite.addTest(OSIntegrationTestCase.parameterize(CreateInstanceSimpleTests, source_filename, ext_net_name,
                                                      http_proxy_str=proxy_settings, use_keystone=use_keystone,
-                                                     log_level=log_level))
+                                                     flavor_metadata=flavor_metadata, log_level=log_level))
     suite.addTest(OSIntegrationTestCase.parameterize(CreateInstancePortManipulationTests, source_filename, ext_net_name,
                                                      http_proxy_str=proxy_settings, use_keystone=use_keystone,
-                                                     log_level=log_level))
+                                                     flavor_metadata=flavor_metadata, log_level=log_level))
     suite.addTest(OSIntegrationTestCase.parameterize(InstanceSecurityGroupTests, source_filename, ext_net_name,
                                                      http_proxy_str=proxy_settings, use_keystone=use_keystone,
-                                                     log_level=log_level))
-    suite.addTest(OSComponentTestCase.parameterize(CreateInstanceOnComputeHost, source_filename, ext_net_name,
-                                                   http_proxy_str=proxy_settings, log_level=log_level))
-    suite.addTest(OSComponentTestCase.parameterize(CreateInstanceFromThreePartImage, source_filename, ext_net_name,
-                                                   http_proxy_str=proxy_settings, log_level=log_level))
+                                                     flavor_metadata=flavor_metadata, log_level=log_level))
+    suite.addTest(OSIntegrationTestCase.parameterize(CreateInstanceOnComputeHost, source_filename, ext_net_name,
+                                                     http_proxy_str=proxy_settings, use_keystone=use_keystone,
+                                                     flavor_metadata=flavor_metadata, log_level=log_level))
+    suite.addTest(OSIntegrationTestCase.parameterize(CreateInstanceFromThreePartImage, source_filename, ext_net_name,
+                                                     http_proxy_str=proxy_settings, use_keystone=use_keystone,
+                                                     flavor_metadata=flavor_metadata, log_level=log_level))
 
     if use_floating_ips:
         suite.addTest(OSIntegrationTestCase.parameterize(CreateInstanceSingleNetworkTests, source_filename,
                                                          ext_net_name, http_proxy_str=proxy_settings,
                                                          ssh_proxy_cmd=ssh_proxy_cmd, use_keystone=use_keystone,
-                                                         log_level=log_level))
+                                                         flavor_metadata=flavor_metadata, log_level=log_level))
         suite.addTest(OSIntegrationTestCase.parameterize(CreateInstancePubPrivNetTests, source_filename,
                                                          ext_net_name, http_proxy_str=proxy_settings,
                                                          ssh_proxy_cmd=ssh_proxy_cmd, use_keystone=use_keystone,
-                                                         log_level=log_level))
+                                                         flavor_metadata=flavor_metadata, log_level=log_level))
         suite.addTest(OSIntegrationTestCase.parameterize(AnsibleProvisioningTests, source_filename,
                                                          ext_net_name, http_proxy_str=proxy_settings,
                                                          ssh_proxy_cmd=ssh_proxy_cmd, use_keystone=use_keystone,
-                                                         log_level=log_level))
+                                                         flavor_metadata=flavor_metadata, log_level=log_level))
 
 
 def add_openstack_staging_tests(suite, source_filename, ext_net_name, proxy_settings=None, log_level=logging.INFO):
index 720d547..ef66a8e 100644 (file)
 # See the License for the specific language governing permissions and
 # limitations under the License.
 import argparse
+import json
 import logging
-import unittest
 import os
+import unittest
 
 from snaps import test_suite_builder
 
@@ -28,8 +29,8 @@ LOG_LEVELS = {'FATAL': logging.FATAL, 'CRITICAL': logging.CRITICAL, 'ERROR': log
               'INFO': logging.INFO, 'DEBUG': logging.DEBUG}
 
 
-def __create_test_suite(source_filename, ext_net_name, proxy_settings, ssh_proxy_cmd, run_unit_tests, use_keystone,
-                        use_floating_ips, log_level):
+def __create_test_suite(source_filename, ext_net_name, proxy_settings, ssh_proxy_cmd, run_unit_tests, flavor_metadata,
+                        use_keystone, use_floating_ips, log_level):
     """
     Compiles the tests that should run
     :param source_filename: the OpenStack credentials file (required)
@@ -37,6 +38,7 @@ def __create_test_suite(source_filename, ext_net_name, proxy_settings, ssh_proxy
     :param run_unit_tests: when true, the tests not requiring OpenStack will be added to the test suite
     :param proxy_settings: <host>:<port> of the proxy server (optional)
     :param ssh_proxy_cmd: the command used to connect via SSH over some proxy server (optional)
+    :param flavor_metadata: dict() object containing the metadata for flavors created for test VM instance
     :param use_keystone: when true, tests creating users and projects will be exercised and must be run on a host that
                          has access to the cloud's administrative network
     :param use_floating_ips: when true, tests requiring floating IPs will be executed
@@ -60,6 +62,7 @@ def __create_test_suite(source_filename, ext_net_name, proxy_settings, ssh_proxy
     # Long running integration type tests
     test_suite_builder.add_openstack_integration_tests(suite, source_filename, ext_net_name, use_keystone=use_keystone,
                                                        proxy_settings=proxy_settings, ssh_proxy_cmd=ssh_proxy_cmd,
+                                                       flavor_metadata=flavor_metadata,
                                                        use_floating_ips=use_floating_ips, log_level=log_level)
     return suite
 
@@ -74,10 +77,16 @@ def main(arguments):
 
     log_level = LOG_LEVELS.get(arguments.log_level, logging.DEBUG)
 
+    flavor_metadata = None
+
+    if arguments.flavor_metadata:
+        flavor_metadata = json.loads(arguments.flavor_metadata)
+
     suite = None
     if arguments.env and arguments.ext_net:
         suite = __create_test_suite(arguments.env, arguments.ext_net, arguments.proxy, arguments.ssh_proxy_cmd,
                                     arguments.include_units != ARG_NOT_SET,
+                                    flavor_metadata,
                                     arguments.use_keystone != ARG_NOT_SET,
                                     arguments.no_floating_ips == ARG_NOT_SET, log_level)
     else:
@@ -126,6 +135,9 @@ if __name__ == '__main__':
                         help='When argument is set, all tests requiring Floating IPs will not be executed')
     parser.add_argument('-u', '--include-units', dest='include_units', default=ARG_NOT_SET, nargs='?',
                         help='When argument is set, all tests not requiring OpenStack will be executed')
+    parser.add_argument('-fm', '--flavor-meta', dest='flavor_metadata', required=False,
+                        default='{\"hw:mem_page_size\": \"any\"}',
+                        help='JSON string to be used as flavor metadata for all test instances created')
     args = parser.parse_args()
 
     main(args)