from functest.opnfv_tests.openstack.snaps import snaps_utils
 from functest.utils.constants import CONST
 
+from snaps.openstack.create_flavor import FlavorSettings, OpenStackFlavor
 from snaps.openstack.create_image import ImageSettings
 from snaps.openstack.create_network import NetworkSettings, SubnetSettings
 from snaps.openstack.create_router import RouterSettings
     if hasattr(CONST, 'openstack_extra_properties'):
         GLANCE_IMAGE_EXTRA_PROPERTIES = CONST.__getattribute__(
             'openstack_extra_properties')
-    FLAVOR_NAME = "m1.tiny"
+    FLAVOR_NAME = CONST.__getattribute__('rally_flavor_name')
+    FLAVOR_ALT_NAME = CONST.__getattribute__('rally_flavor_alt_name')
+    FLAVOR_EXTRA_SPECS = None
+    if hasattr(CONST, 'flavor_extra_specs'):
+        FLAVOR_EXTRA_SPECS = CONST.__getattribute__('flavor_extra_specs')
 
     RALLY_DIR = pkg_resources.resource_filename(
         'functest', 'opnfv_tests/openstack/rally')
         self.image_name = None
         self.ext_net_name = None
         self.priv_net_id = None
+        self.flavor_name = None
+        self.flavor_alt_name = None
         self.smoke = None
         self.test_name = None
         self.start_time = None
     def _build_task_args(self, test_file_name):
         task_args = {'service_list': [test_file_name]}
         task_args['image_name'] = self.image_name
-        task_args['flavor_name'] = self.FLAVOR_NAME
+        task_args['flavor_name'] = self.flavor_name
+        task_args['flavor_alt_name'] = self.flavor_alt_name
         task_args['glance_image_location'] = self.GLANCE_IMAGE_PATH
         task_args['glance_image_format'] = self.GLANCE_IMAGE_FORMAT
         task_args['tmpl_dir'] = self.TEMPLATE_DIR
         subnet_name = self.RALLY_PRIVATE_SUBNET_NAME + self.guid
         router_name = self.RALLY_ROUTER_NAME + self.guid
         self.image_name = self.GLANCE_IMAGE_NAME + self.guid
+        self.flavor_name = self.FLAVOR_NAME + self.guid
+        self.flavor_alt_name = self.FLAVOR_ALT_NAME + self.guid
         self.ext_net_name = snaps_utils.get_ext_net_name(self.os_creds)
 
         LOGGER.debug("Creating image '%s'...", self.image_name)
             raise Exception("Failed to create router")
         self.creators.append(router_creator)
 
+        LOGGER.debug("Creating flavor '%s'...", self.flavor_name)
+        flavor_creator = OpenStackFlavor(
+            self.os_creds, FlavorSettings(
+                name=self.flavor_name, ram=512, disk=1, vcpus=1,
+                metadata=self.FLAVOR_EXTRA_SPECS))
+        if flavor_creator is None or flavor_creator.create() is None:
+            raise Exception("Failed to create flavor")
+        self.creators.append(flavor_creator)
+
+        LOGGER.debug("Creating flavor '%s'...", self.flavor_alt_name)
+        flavor_alt_creator = OpenStackFlavor(
+            self.os_creds, FlavorSettings(
+                name=self.flavor_alt_name, ram=1024, disk=1, vcpus=1,
+                metadata=self.FLAVOR_EXTRA_SPECS))
+        if flavor_alt_creator is None or flavor_alt_creator.create() is None:
+            raise Exception("Failed to create flavor")
+        self.creators.append(flavor_alt_creator)
+
     def _run_tests(self):
         if self.test_name == 'all':
             for test in self.TESTS:
 
         mock_get_net.assert_called()
         mock_create_router.assert_called()
 
+    @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_utils.'
+                'get_ext_net_name', return_value='test_net_name')
+    @mock.patch('snaps.openstack.utils.deploy_utils.create_image',
+                return_value=mock.Mock())
+    @mock.patch('snaps.openstack.utils.deploy_utils.create_network',
+                return_value=mock.Mock())
+    @mock.patch('snaps.openstack.utils.deploy_utils.create_router',
+                return_value=mock.Mock())
+    @mock.patch('snaps.openstack.create_flavor.OpenStackFlavor.create',
+                return_value=None)
+    def test_prepare_env_flavor_creation_failed(
+            self, mock_create_flavor, mock_create_router, mock_create_net,
+            mock_get_img, mock_get_net):
+        self.rally_base.TESTS = ['test1', 'test2']
+        self.rally_base.test_name = 'test1'
+        with self.assertRaises(Exception):
+            self.rally_base._prepare_env()
+        mock_create_net.assert_called()
+        mock_get_img.assert_called()
+        mock_get_net.assert_called()
+        mock_create_router.assert_called()
+        mock_create_flavor.assert_called_once()
+
+    @mock.patch('functest.opnfv_tests.openstack.snaps.snaps_utils.'
+                'get_ext_net_name', return_value='test_net_name')
+    @mock.patch('snaps.openstack.utils.deploy_utils.create_image',
+                return_value=mock.Mock())
+    @mock.patch('snaps.openstack.utils.deploy_utils.create_network',
+                return_value=mock.Mock())
+    @mock.patch('snaps.openstack.utils.deploy_utils.create_router',
+                return_value=mock.Mock())
+    @mock.patch('snaps.openstack.create_flavor.OpenStackFlavor.create',
+                side_effect=[mock.Mock, None])
+    def test_prepare_env_flavor_alt_creation_failed(
+            self, mock_create_flavor, mock_create_router, mock_create_net,
+            mock_get_img, mock_get_net):
+        self.rally_base.TESTS = ['test1', 'test2']
+        self.rally_base.test_name = 'test1'
+        with self.assertRaises(Exception):
+            self.rally_base._prepare_env()
+        mock_create_net.assert_called()
+        mock_get_img.assert_called()
+        mock_get_net.assert_called()
+        mock_create_router.assert_called()
+        self.assertEqual(mock_create_flavor.call_count, 2)
+
     @mock.patch('functest.opnfv_tests.openstack.rally.rally.RallyBase.'
                 '_run_task', return_value=mock.Mock())
     def test_run_tests_all(self, mock_run_task):