Replace nova get flavor with shade client. 33/59133/1
authorShobhi Jain <shobhi.jain@intel.com>
Thu, 5 Apr 2018 15:04:08 +0000 (16:04 +0100)
committerEmma Foley <emma.l.foley@intel.com>
Wed, 27 Jun 2018 16:16:42 +0000 (17:16 +0100)
Rename get_flavor_by_name with get_flavor.
Function get_flavor now uses shade client.

JIRA: YARDSTICK-1088

Change-Id: Ic82127e475baf39643be0a254b177f3058b85748
Signed-off-by: Shobhi Jain <shobhi.jain@intel.com>
(cherry picked from commit 35bbd618b1e69a5b5edbd64a333720bfa5a92400)

yardstick/benchmark/scenarios/lib/get_flavor.py
yardstick/common/exceptions.py
yardstick/common/openstack_utils.py
yardstick/tests/unit/benchmark/scenarios/lib/test_get_flavor.py
yardstick/tests/unit/common/test_openstack_utils.py

index d5e3394..6727a73 100644 (file)
@@ -6,14 +6,11 @@
 # which accompanies this distribution, and is available at
 # http://www.apache.org/licenses/LICENSE-2.0
 ##############################################################################
-
-from __future__ import print_function
-from __future__ import absolute_import
-
 import logging
 
 from yardstick.benchmark.scenarios import base
-import yardstick.common.openstack_utils as op_utils
+from yardstick.common import openstack_utils
+from yardstick.common import exceptions
 
 LOG = logging.getLogger(__name__)
 
@@ -26,8 +23,12 @@ class GetFlavor(base.Scenario):
     def __init__(self, scenario_cfg, context_cfg):
         self.scenario_cfg = scenario_cfg
         self.context_cfg = context_cfg
-        self.options = self.scenario_cfg['options']
-        self.flavor_name = self.options.get("flavor_name", "TestFlavor")
+        self.options = self.scenario_cfg["options"]
+        self.name_or_id = self.options["name_or_id"]
+        self.filters = self.options.get("filters")
+        self.get_extra = self.options.get("get_extra", True)
+        self.shade_client = openstack_utils.get_shade_client()
+
         self.setup_done = False
 
     def setup(self):
@@ -41,14 +42,18 @@ class GetFlavor(base.Scenario):
         if not self.setup_done:
             self.setup()
 
-        LOG.info("Querying flavor: %s", self.flavor_name)
-        flavor = op_utils.get_flavor_by_name(self.flavor_name)
-        if flavor:
-            LOG.info("Get flavor successful!")
-            values = [self._change_obj_to_dict(flavor)]
-        else:
-            LOG.info("Get flavor: no flavor matched!")
-            values = []
+        LOG.info("Querying flavor: %s", self.name_or_id)
+        flavor = openstack_utils.get_flavor(
+            self.shade_client, self.name_or_id, filters=self.filters,
+            get_extra=self.get_extra)
+
+        if not flavor:
+            result.update({"get_flavor": 0})
+            LOG.error("Get flavor failed!")
+            raise exceptions.ScenarioGetFlavorError
 
-        keys = self.scenario_cfg.get('output', '').split()
+        result.update({"get_flavor": 1})
+        LOG.info("Get flavor successful!")
+        values = [flavor]
+        keys = self.scenario_cfg.get("output", '').split()
         return self._push_to_outputs(keys, values)
index cb8fabd..fdf2146 100644 (file)
@@ -242,6 +242,10 @@ class ScenarioGetServerError(YardstickException):
     message = 'Nova Get Server Scenario failed'
 
 
+class ScenarioGetFlavorError(YardstickException):
+    message = 'Nova Get Falvor Scenario failed'
+
+
 class ApiServerError(YardstickException):
     message = 'An unkown exception happened to Api Server!'
 
index 0220c42..68cf0a5 100644 (file)
@@ -363,12 +363,22 @@ def get_flavor_id(nova_client, flavor_name):    # pragma: no cover
     return flavor_id
 
 
-def get_flavor_by_name(name):   # pragma: no cover
-    flavors = get_nova_client().flavors.list()
+def get_flavor(shade_client, name_or_id, filters=None, get_extra=True):
+    """Get a flavor by name or ID.
+
+    :param name_or_id: Name or ID of the flavor.
+    :param filters: A dictionary of meta data to use for further filtering.
+    :param get_extra: Whether or not the list_flavors call should get the extra
+    flavor specs.
+
+    :returns: A flavor ``munch.Munch`` or None if no matching flavor is found.
+    """
     try:
-        return next((a for a in flavors if a.name == name))
-    except StopIteration:
-        log.exception('No flavor matched')
+        return shade_client.get_flavor(name_or_id, filters=filters,
+                                       get_extra=get_extra)
+    except exc.OpenStackCloudException as o_exc:
+        log.error("Error [get_flavor(shade_client, '%s')]. "
+                  "Exception message: %s", name_or_id, o_exc.orig_message)
 
 
 def delete_flavor(flavor_id):    # pragma: no cover
index 15a6f7c..1c13643 100644 (file)
@@ -6,20 +6,52 @@
 # which accompanies this distribution, and is available at
 # http://www.apache.org/licenses/LICENSE-2.0
 ##############################################################################
+from oslo_utils import uuidutils
 import unittest
 import mock
 
-from yardstick.benchmark.scenarios.lib.get_flavor import GetFlavor
+from yardstick.common import openstack_utils
+from yardstick.common import exceptions
+from yardstick.benchmark.scenarios.lib import get_flavor
 
 
 class GetFlavorTestCase(unittest.TestCase):
 
-    @mock.patch('yardstick.common.openstack_utils.get_flavor_by_name')
-    def test_get_flavor(self, mock_get_flavor_by_name):
-        options = {
-            'flavor_name': 'yardstick_test_flavor'
-        }
-        args = {"options": options}
-        obj = GetFlavor(args, {})
-        obj.run({})
-        mock_get_flavor_by_name.assert_called_once()
+    def setUp(self):
+
+        self._mock_get_flavor = mock.patch.object(
+            openstack_utils, 'get_flavor')
+        self.mock_get_flavor = self._mock_get_flavor.start()
+        self._mock_get_shade_client = mock.patch.object(
+            openstack_utils, 'get_shade_client')
+        self.mock_get_shade_client = self._mock_get_shade_client.start()
+        self._mock_log = mock.patch.object(get_flavor, 'LOG')
+        self.mock_log = self._mock_log.start()
+        self.args = {'options': {'name_or_id': 'yardstick_flavor'}}
+        self.result = {}
+
+        self.getflavor_obj = get_flavor.GetFlavor(self.args, mock.ANY)
+        self.addCleanup(self._stop_mock)
+
+    def _stop_mock(self):
+        self._mock_get_flavor.stop()
+        self._mock_get_shade_client.stop()
+        self._mock_log.stop()
+
+    def test_run(self):
+        _uuid = uuidutils.generate_uuid()
+        self.getflavor_obj.scenario_cfg = {'output': 'flavor'}
+        self.mock_get_flavor.return_value = (
+            {'name': 'flavor-name', 'id': _uuid})
+        output = self.getflavor_obj.run(self.result)
+        self.assertDictEqual({'get_flavor': 1}, self.result)
+        self.assertDictEqual({'flavor': {'name': 'flavor-name', 'id': _uuid}},
+                             output)
+        self.mock_log.info.asset_called_once_with('Get flavor successful!')
+
+    def test_run_fail(self):
+        self.mock_get_flavor.return_value = None
+        with self.assertRaises(exceptions.ScenarioGetFlavorError):
+            self.getflavor_obj.run(self.result)
+        self.assertDictEqual({'get_flavor': 0}, self.result)
+        self.mock_log.error.assert_called_once_with('Get flavor failed!')
index 89a810c..81bcd8c 100644 (file)
@@ -489,3 +489,25 @@ class GetServerTestCase(unittest.TestCase):
                                             'server_name_or_id')
         mock_logger.error.assert_called_once()
         self.assertIsNone(output)
+
+
+class GetFlavorTestCase(unittest.TestCase):
+
+    def test_get_flavor(self):
+        self.mock_shade_client = mock.Mock()
+        _uuid = uuidutils.generate_uuid()
+        self.mock_shade_client.get_flavor.return_value = {
+            'name': 'flavor_name', 'id': _uuid}
+        output = openstack_utils.get_flavor(self.mock_shade_client,
+                                            'flavor_name_or_id')
+        self.assertEqual({'name': 'flavor_name', 'id': _uuid}, output)
+
+    @mock.patch.object(openstack_utils, 'log')
+    def test_get_flavor_exception(self, mock_logger):
+        self.mock_shade_client = mock.Mock()
+        self.mock_shade_client.get_flavor.side_effect = (
+            exc.OpenStackCloudException('error message'))
+        output = openstack_utils.get_flavor(self.mock_shade_client,
+                                            'flavor_name_or_id')
+        mock_logger.error.assert_called_once()
+        self.assertIsNone(output)