Merge changes from topics 'YARDSTICK-1346', 'YARDSTICK-1345', 'YARDSTICK-1344'
authorRodolfo Alonso Hernandez <rodolfo.alonso.hernandez@intel.com>
Tue, 24 Jul 2018 11:00:01 +0000 (11:00 +0000)
committerGerrit Code Review <gerrit@opnfv.org>
Tue, 24 Jul 2018 11:00:01 +0000 (11:00 +0000)
* changes:
  Add pktgen test case base files
  Add pktgen traffic profile
  Add DPDK pktgen traffic generator

12 files changed:
ansible/roles/install_yardstick/tasks/main.yml
dashboard/opnfv_yardstick_tc058.json
yardstick/common/ansible_common.py
yardstick/common/kubernetes_utils.py
yardstick/orchestrator/kubernetes.py
yardstick/service/environment.py
yardstick/tests/unit/benchmark/core/test_task.py
yardstick/tests/unit/benchmark/core/test_testcase.py
yardstick/tests/unit/common/test_ansible_common.py
yardstick/tests/unit/common/test_kubernetes_utils.py
yardstick/tests/unit/orchestrator/test_kubernetes.py
yardstick/tests/unit/service/test_environment.py

index 0975efa..203acc3 100644 (file)
@@ -41,7 +41,7 @@
   pip:
     requirements: "{{ yardstick_dir }}/requirements.txt"
     virtualenv: "{{ yardstick_dir }}/virtualenv"
-  async: 600
+  async: 900
   poll: 0
   register: pip_installer
   when: virtual_environment == True
@@ -49,7 +49,7 @@
 - name: Install Yardstick requirements
   pip:
     requirements: "{{ yardstick_dir }}/requirements.txt"
-  async: 600
+  async: 900
   poll: 0
   register: pip_installer
   when: virtual_environment == False
@@ -59,7 +59,7 @@
     jid: "{{ pip_installer.ansible_job_id }}"
   register: job_result
   until: job_result.finished
-  retries: 150
+  retries: 180
 
 - name: Install Yardstick code (venv)
   pip:
index 55b5a5f..ed2a175 100644 (file)
@@ -6,7 +6,7 @@
   "gnetId": null,
   "graphTooltip": 0,
   "hideControls": false,
-  "id": 33,
+  "id": null,
   "links": [],
   "refresh": "1m",
   "rows": [
index ca5a110..dee7044 100644 (file)
@@ -12,8 +12,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from __future__ import absolute_import
-
 import cgitb
 import collections
 import contextlib as cl
@@ -23,11 +21,11 @@ import os
 from collections import Mapping, MutableMapping, Iterable, Callable, deque
 from functools import partial
 from itertools import chain
-from subprocess import CalledProcessError, Popen, PIPE
-from tempfile import NamedTemporaryFile
+import subprocess
+import tempfile
 
 import six
-import six.moves.configparser as ConfigParser
+from six.moves import configparser
 import yaml
 from six import StringIO
 from chainmap import ChainMap
@@ -134,10 +132,9 @@ class CustomTemporaryFile(object):
         else:
             self.data_types = self.DEFAULT_DATA_TYPES
         # must open "w+" so unicode is encoded correctly
-        self.creator = partial(NamedTemporaryFile, mode="w+", delete=False,
-                               dir=directory,
-                               prefix=prefix,
-                               suffix=self.suffix)
+        self.creator = partial(
+            tempfile.NamedTemporaryFile, mode="w+", delete=False,
+            dir=directory, prefix=prefix, suffix=self.suffix)
 
     def make_context(self, data, write_func, descriptor='data'):
         return TempfileContext(data, write_func, descriptor, self.data_types,
@@ -191,8 +188,8 @@ class FileNameGenerator(object):
         if not prefix.endswith('_'):
             prefix += '_'
 
-        temp_file = NamedTemporaryFile(delete=False, dir=directory,
-                                       prefix=prefix, suffix=suffix)
+        temp_file = tempfile.NamedTemporaryFile(delete=False, dir=directory,
+                                                prefix=prefix, suffix=suffix)
         with cl.closing(temp_file):
             return temp_file.name
 
@@ -474,7 +471,7 @@ class AnsibleCommon(object):
 
         prefix = '_'.join([self.prefix, prefix, 'inventory'])
         ini_temp_file = IniMapTemporaryFile(directory=directory, prefix=prefix)
-        inventory_config = ConfigParser.ConfigParser(allow_no_value=True)
+        inventory_config = configparser.ConfigParser(allow_no_value=True)
         # disable default lowercasing
         inventory_config.optionxform = str
         return ini_temp_file.make_context(self.inventory_dict, write_func,
@@ -510,7 +507,7 @@ class AnsibleCommon(object):
         return timeout
 
     def _generate_ansible_cfg(self, directory):
-        parser = ConfigParser.ConfigParser()
+        parser = configparser.ConfigParser()
         parser.add_section('defaults')
         parser.set('defaults', 'host_key_checking', 'False')
 
@@ -541,12 +538,12 @@ class AnsibleCommon(object):
         cmd = ['ansible', 'all', '-m', 'setup', '-i',
                inventory_path, '--tree', sut_dir]
 
-        proc = Popen(cmd, stdout=PIPE, cwd=directory)
+        proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, cwd=directory)
         output, _ = proc.communicate()
         retcode = proc.wait()
         LOG.debug("exit status = %s", retcode)
         if retcode != 0:
-            raise CalledProcessError(retcode, cmd, output)
+            raise subprocess.CalledProcessError(retcode, cmd, output)
 
     def _gen_sut_info_dict(self, sut_dir):
         sut_info = {}
@@ -617,12 +614,13 @@ class AnsibleCommon(object):
                     # 'timeout': timeout / 2,
                 })
                 with Timer() as timer:
-                    proc = Popen(cmd, stdout=PIPE, **exec_args)
+                    proc = subprocess.Popen(cmd, stdout=subprocess.PIPE,
+                                            **exec_args)
                     output, _ = proc.communicate()
                     retcode = proc.wait()
                 LOG.debug("exit status = %s", retcode)
                 if retcode != 0:
-                    raise CalledProcessError(retcode, cmd, output)
+                    raise subprocess.CalledProcessError(retcode, cmd, output)
                 timeout -= timer.total_seconds()
 
             cmd.remove("--syntax-check")
@@ -632,10 +630,10 @@ class AnsibleCommon(object):
                 # TODO: add timeout support of use subprocess32 backport
                 # 'timeout': timeout,
             })
-            proc = Popen(cmd, stdout=PIPE, **exec_args)
+            proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, **exec_args)
             output, _ = proc.communicate()
             retcode = proc.wait()
             LOG.debug("exit status = %s", retcode)
             if retcode != 0:
-                raise CalledProcessError(retcode, cmd, output)
+                raise subprocess.CalledProcessError(retcode, cmd, output)
             return output
index f5b0443..c90f73e 100644 (file)
@@ -266,7 +266,8 @@ def create_network(scope, group, version, plural, body, namespace='default'):
             action='create', resource='Custom Object: Network')
 
 
-def delete_network(scope, group, version, plural, name, namespace='default'):
+def delete_network(scope, group, version, plural, name, namespace='default', skip_codes=None):
+    skip_codes = [] if not skip_codes else skip_codes
     api = get_custom_objects_api()
     try:
         if scope == consts.SCOPE_CLUSTER:
@@ -274,9 +275,12 @@ def delete_network(scope, group, version, plural, name, namespace='default'):
         else:
             api.delete_namespaced_custom_object(
                 group, version, namespace, plural, name, {})
-    except ApiException:
-        raise exceptions.KubernetesApiException(
-            action='delete', resource='Custom Object: Network')
+    except ApiException as e:
+        if e.status in skip_codes:
+            LOG.info(e.reason)
+        else:
+            raise exceptions.KubernetesApiException(
+                action='delete', resource='Custom Object: Network')
 
 
 def get_pod_list(namespace='default'):      # pragma: no cover
index 7b14502..594f679 100644 (file)
@@ -441,7 +441,7 @@ class NetworkObject(object):
 
     def delete(self):
         k8s_utils.delete_network(self.scope, self.group, self.version,
-                                 self.plural, self._name)
+                                 self.plural, self._name, skip_codes=[404])
 
 
 class KubernetesTemplate(object):
index 324589f..d910e31 100644 (file)
@@ -36,7 +36,7 @@ class Environment(Service):
 
         return self._format_sut_info(sut_info)
 
-    def _load_pod_info(self):
+    def _load_pod_info(self):  # pragma: no cover
         if self.pod is None:
             raise MissingPodInfoError
 
@@ -51,10 +51,10 @@ class Environment(Service):
         except (ValueError, KeyError):
             raise UnsupportedPodFormatError
 
-    def _format_sut_info(self, sut_info):
+    def _format_sut_info(self, sut_info):  # pragma: no cover
         return {k: self._format_node_info(v) for k, v in sut_info.items()}
 
-    def _format_node_info(self, node_info):
+    def _format_node_info(self, node_info):  # pragma: no cover
         info = []
         facts = node_info.get('ansible_facts', {})
 
@@ -93,9 +93,9 @@ class Environment(Service):
 
         return info
 
-    def _get_interface_info(self, facts, name):
+    def _get_interface_info(self, facts, name):  # pragma: no cover
         mac = facts.get('ansible_{}'.format(name), {}).get('macaddress')
         return [name, mac] if mac else []
 
-    def _get_device_info(self, name, info):
+    def _get_device_info(self, name, info):  # pragma: no cover
         return ['disk_{}'.format(name), info.get('size')]
index 3523663..e1414c2 100644 (file)
@@ -9,11 +9,13 @@
 
 import copy
 import io
+import logging
 import os
 import sys
 
 import mock
 import six
+from six.moves import builtins
 import unittest
 import uuid
 
@@ -322,9 +324,9 @@ class TaskTestCase(unittest.TestCase):
         actual_result = t._parse_options(options)
         self.assertEqual(expected_result, actual_result)
 
-    @mock.patch('six.moves.builtins.open', side_effect=mock.mock_open())
+    @mock.patch.object(builtins, 'open', side_effect=mock.mock_open())
     @mock.patch.object(task, 'utils')
-    @mock.patch('logging.root')
+    @mock.patch.object(logging, 'root')
     def test_set_log(self, mock_logging_root, *args):
         task_obj = task.Task()
         task_obj.task_id = 'task_id'
@@ -561,7 +563,8 @@ key2:
         mock_open.assert_has_calls([mock.call('args_file'),
                                     mock.call('task_file')])
 
-    def test__render_task_error_arguments(self):
+    @mock.patch.object(builtins, 'print')
+    def test__render_task_error_arguments(self, *args):
         with self.assertRaises(exceptions.TaskRenderArgumentError):
             task.TaskParser('task_file')._render_task('value1="var3"', None)
 
index 1194658..077848d 100644 (file)
@@ -7,28 +7,28 @@
 # http://www.apache.org/licenses/LICENSE-2.0
 ##############################################################################
 
-# Unittest for yardstick.cmd.commands.testcase
-
-from __future__ import absolute_import
-import unittest
+import mock
+from six.moves import builtins
 
 from yardstick.benchmark.core import testcase
+from yardstick.tests.unit import base as ut_base
 
 
 class Arg(object):
 
     def __init__(self):
-        self.casename = ('opnfv_yardstick_tc001',)
+        self.casename = ('opnfv_yardstick_tc001', )
 
 
-class TestcaseUT(unittest.TestCase):
+class TestcaseTestCase(ut_base.BaseUnitTestCase):
 
     def test_list_all(self):
         t = testcase.Testcase()
         result = t.list_all("")
         self.assertIsInstance(result, list)
 
-    def test_show(self):
+    @mock.patch.object(builtins, 'print')
+    def test_show(self, *args):
         t = testcase.Testcase()
         casename = Arg()
         result = t.show(casename)
index 48d8a60..bf82f62 100644 (file)
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-
-from __future__ import absolute_import
-
-import os
-import tempfile
+import collections
 import shutil
-from collections import defaultdict
+import subprocess
+import tempfile
 
 import mock
-import unittest
-
-from six.moves.configparser import ConfigParser
-from six.moves import StringIO
+from six import moves
+from six.moves import configparser
 
 from yardstick.common import ansible_common
+from yardstick.tests.unit import base as ut_base
 
-PREFIX = 'yardstick.common.ansible_common'
 
+class OverwriteDictTestCase(ut_base.BaseUnitTestCase):
 
-class OverwriteDictTestCase(unittest.TestCase):
     def test_overwrite_dict_cfg(self):
-        c = ConfigParser(allow_no_value=True)
+        c = configparser.ConfigParser(allow_no_value=True)
         d = {
             "section_a": "empty_value",
             "section_b": {"key_c": "Val_d", "key_d": "VAL_D"},
@@ -43,86 +38,78 @@ class OverwriteDictTestCase(unittest.TestCase):
         # Python3 and Python2 convert empty values into None or ''
         # we don't really care but we need to compare correctly for unittest
         self.assertTrue(c.has_option("section_a", "empty_value"))
-        self.assertEqual(sorted(c.items("section_b")), [('key_c', 'Val_d'), ('key_d', 'VAL_D')])
+        self.assertEqual(sorted(c.items("section_b")),
+                         [('key_c', 'Val_d'), ('key_d', 'VAL_D')])
         self.assertTrue(c.has_option("section_c", "key_c"))
         self.assertTrue(c.has_option("section_c", "key_d"))
 
 
-class FilenameGeneratorTestCase(unittest.TestCase):
-    @mock.patch('{}.NamedTemporaryFile'.format(PREFIX))
+class FilenameGeneratorTestCase(ut_base.BaseUnitTestCase):
+
+    @mock.patch.object(tempfile, 'NamedTemporaryFile')
     def test__handle_existing_file(self, _):
-        ansible_common.FileNameGenerator._handle_existing_file("/dev/null")
+        ansible_common.FileNameGenerator._handle_existing_file('/dev/null')
 
     def test_get_generator_from_file(self):
-        ansible_common.FileNameGenerator.get_generator_from_filename("/dev/null", "", "", "")
+        ansible_common.FileNameGenerator.get_generator_from_filename(
+            '/dev/null', '', '', '')
 
     def test_get_generator_from_file_middle(self):
-        ansible_common.FileNameGenerator.get_generator_from_filename("/dev/null", "", "",
-                                                                     "null")
+        ansible_common.FileNameGenerator.get_generator_from_filename(
+            '/dev/null', '', '', 'null')
 
     def test_get_generator_from_file_prefix(self):
-        ansible_common.FileNameGenerator.get_generator_from_filename("/dev/null", "", "null",
-                                                                     "middle")
+        ansible_common.FileNameGenerator.get_generator_from_filename(
+            '/dev/null', '', 'null', 'middle')
 
 
-class AnsibleNodeTestCase(unittest.TestCase):
-    def test_ansible_node(self):
-        ansible_common.AnsibleNode()
+class AnsibleNodeTestCase(ut_base.BaseUnitTestCase):
 
     def test_ansible_node_len(self):
-        a = ansible_common.AnsibleNode()
-        len(a)
+        self.assertEqual(0, len(ansible_common.AnsibleNode()))
 
     def test_ansible_node_repr(self):
-        a = ansible_common.AnsibleNode()
-        repr(a)
+        self.assertEqual('AnsibleNode<{}>', repr(ansible_common.AnsibleNode()))
 
     def test_ansible_node_iter(self):
-        a = ansible_common.AnsibleNode()
-        for _ in a:
-            pass
+        node = ansible_common.AnsibleNode(data={'a': 1, 'b': 2, 'c': 3})
+        for key in node:
+            self.assertIn(key, ('a', 'b', 'c'))
 
     def test_is_role(self):
-        a = ansible_common.AnsibleNode()
-        self.assertFalse(a.is_role("", default="foo"))
+        node = ansible_common.AnsibleNode()
+        self.assertFalse(node.is_role('', default='foo'))
 
     def test_ansible_node_get_tuple(self):
-        a = ansible_common.AnsibleNode({"name": "name"})
-        self.assertEqual(a.get_tuple(), ('name', a))
+        node = ansible_common.AnsibleNode({'name': 'name'})
+        self.assertEqual(node.get_tuple(), ('name', node))
 
     def test_gen_inventory_line(self):
-        a = ansible_common.AnsibleNode(defaultdict(str))
+        a = ansible_common.AnsibleNode(collections.defaultdict(str))
         self.assertEqual(a.gen_inventory_line(), "")
 
     def test_ansible_node_delitem(self):
-        a = ansible_common.AnsibleNode({"name": "name"})
-        del a['name']
+        node = ansible_common.AnsibleNode({'name': 'name'})
+        self.assertEqual(1, len(node))
+        del node['name']
+        self.assertEqual(0, len(node))
 
     def test_ansible_node_getattr(self):
-        a = ansible_common.AnsibleNode({"name": "name"})
-        self.assertIsNone(getattr(a, "nosuch", None))
+        node = ansible_common.AnsibleNode({'name': 'name'})
+        self.assertIsNone(getattr(node, 'nosuch', None))
 
 
-class AnsibleNodeDictTestCase(unittest.TestCase):
-    def test_ansible_node_dict(self):
-        n = ansible_common.AnsibleNode
-        ansible_common.AnsibleNodeDict(n, {})
+class AnsibleNodeDictTestCase(ut_base.BaseUnitTestCase):
 
     def test_ansible_node_dict_len(self):
         n = ansible_common.AnsibleNode
         a = ansible_common.AnsibleNodeDict(n, {})
-        len(a)
+        self.assertEqual(0, len(a))
 
     def test_ansible_node_dict_repr(self):
         n = ansible_common.AnsibleNode
         a = ansible_common.AnsibleNodeDict(n, {})
-        repr(a)
-
-    def test_ansible_node_dict_iter(self):
-        n = ansible_common.AnsibleNode
-        a = ansible_common.AnsibleNodeDict(n, {})
-        for _ in a:
-            pass
+        self.assertEqual('{}', repr(a))
 
     def test_ansible_node_dict_get(self):
         n = ansible_common.AnsibleNode
@@ -144,12 +131,15 @@ class AnsibleNodeDictTestCase(unittest.TestCase):
                          ["name ansible_ssh_pass=PASS ansible_user=user"])
 
 
-class AnsibleCommonTestCase(unittest.TestCase):
-    def test_get_timeouts(self):
-        self.assertAlmostEqual(ansible_common.AnsibleCommon.get_timeout(-100), 1200.0)
+class AnsibleCommonTestCase(ut_base.BaseUnitTestCase):
 
-    def test__init__(self):
-        ansible_common.AnsibleCommon({})
+    @staticmethod
+    def _delete_tmpdir(dir):
+        shutil.rmtree(dir)
+
+    def test_get_timeouts(self):
+        self.assertAlmostEqual(
+            ansible_common.AnsibleCommon.get_timeout(-100), 1200.0)
 
     def test_reset(self):
         a = ansible_common.AnsibleCommon({})
@@ -184,81 +174,68 @@ class AnsibleCommonTestCase(unittest.TestCase):
         a.deploy_dir = "d"
         self.assertEqual(a.deploy_dir, "d")
 
-    @mock.patch('{}.open'.format(PREFIX))
-    def test__gen_ansible_playbook_file_list(self, _):
+    @mock.patch.object(moves.builtins, 'open')
+    def test__gen_ansible_playbook_file_list(self, *args):
         d = tempfile.mkdtemp()
-        try:
-            a = ansible_common.AnsibleCommon({})
-            a._gen_ansible_playbook_file(["a"], d)
-        finally:
-            os.rmdir(d)
-
-    @mock.patch('{}.NamedTemporaryFile'.format(PREFIX))
-    @mock.patch('{}.open'.format(PREFIX))
-    def test__gen_ansible_inventory_file(self, _, __):
+        self.addCleanup(self._delete_tmpdir, d)
+        a = ansible_common.AnsibleCommon({})
+        a._gen_ansible_playbook_file(["a"], d)
+
+    @mock.patch.object(tempfile, 'NamedTemporaryFile')
+    @mock.patch.object(moves.builtins, 'open')
+    def test__gen_ansible_inventory_file(self, *args):
         nodes = [{
             "name": "name", "user": "user", "password": "PASS",
             "role": "role",
         }]
         d = tempfile.mkdtemp()
-        try:
-            a = ansible_common.AnsibleCommon(nodes)
-            a.gen_inventory_ini_dict()
-            inv_context = a._gen_ansible_inventory_file(d)
-            with inv_context:
-                c = StringIO()
-                inv_context.write_func(c)
-                self.assertIn("ansible_ssh_pass=PASS", c.getvalue())
-        finally:
-            os.rmdir(d)
-
-    @mock.patch('{}.NamedTemporaryFile'.format(PREFIX))
-    @mock.patch('{}.open'.format(PREFIX))
-    def test__gen_ansible_playbook_file_list_multiple(self, _, __):
+        self.addCleanup(self._delete_tmpdir, d)
+        a = ansible_common.AnsibleCommon(nodes)
+        a.gen_inventory_ini_dict()
+        inv_context = a._gen_ansible_inventory_file(d)
+        with inv_context:
+            c = moves.StringIO()
+            inv_context.write_func(c)
+            self.assertIn("ansible_ssh_pass=PASS", c.getvalue())
+
+    @mock.patch.object(tempfile, 'NamedTemporaryFile')
+    @mock.patch.object(moves.builtins, 'open')
+    def test__gen_ansible_playbook_file_list_multiple(self, *args):
         d = tempfile.mkdtemp()
-        try:
-            a = ansible_common.AnsibleCommon({})
-            a._gen_ansible_playbook_file(["a", "b"], d)
-        finally:
-            os.rmdir(d)
-
-    @mock.patch('{}.NamedTemporaryFile'.format(PREFIX))
-    @mock.patch('{}.Popen'.format(PREFIX))
-    @mock.patch('{}.open'.format(PREFIX))
-    def test_do_install_tmp_dir(self, _, mock_popen, __):
+        self.addCleanup(self._delete_tmpdir, d)
+        a = ansible_common.AnsibleCommon({})
+        a._gen_ansible_playbook_file(["a", "b"], d)
+
+    @mock.patch.object(tempfile, 'NamedTemporaryFile')
+    @mock.patch.object(subprocess, 'Popen')
+    @mock.patch.object(moves.builtins, 'open')
+    def test_do_install_tmp_dir(self, _, mock_popen, *args):
         mock_popen.return_value.communicate.return_value = "", ""
         mock_popen.return_value.wait.return_value = 0
         d = tempfile.mkdtemp()
-        try:
-            a = ansible_common.AnsibleCommon({})
-            a.do_install('', d)
-        finally:
-            os.rmdir(d)
-
-    @mock.patch('{}.NamedTemporaryFile'.format(PREFIX))
-    @mock.patch('{}.Popen'.format(PREFIX))
-    @mock.patch('{}.open'.format(PREFIX))
-    def test_execute_ansible_check(self, _, mock_popen, __):
+        self.addCleanup(self._delete_tmpdir, d)
+        a = ansible_common.AnsibleCommon({})
+        a.do_install('', d)
+
+    @mock.patch.object(tempfile, 'NamedTemporaryFile')
+    @mock.patch.object(moves.builtins, 'open')
+    @mock.patch.object(subprocess, 'Popen')
+    def test_execute_ansible_check(self, mock_popen, *args):
         mock_popen.return_value.communicate.return_value = "", ""
         mock_popen.return_value.wait.return_value = 0
         d = tempfile.mkdtemp()
-        try:
-            a = ansible_common.AnsibleCommon({})
-            a.execute_ansible('', d, ansible_check=True, verbose=True)
-        finally:
-            os.rmdir(d)
+        self.addCleanup(self._delete_tmpdir, d)
+        a = ansible_common.AnsibleCommon({})
+        a.execute_ansible('', d, ansible_check=True, verbose=True)
 
     def test_get_sut_info(self):
         d = tempfile.mkdtemp()
         a = ansible_common.AnsibleCommon({})
-        try:
+        self.addCleanup(self._delete_tmpdir, d)
+        with mock.patch.object(a, '_exec_get_sut_info_cmd'):
             a.get_sut_info(d)
-        finally:
-            shutil.rmtree(d)
 
     def test_get_sut_info_not_exist(self):
         a = ansible_common.AnsibleCommon({})
-        try:
+        with self.assertRaises(OSError):
             a.get_sut_info('/hello/world')
-        except OSError:
-            pass
index 42aa9f7..9dca270 100644 (file)
@@ -240,6 +240,19 @@ class DeleteNetworkTestCase(base.BaseUnitTestCase):
                 constants.SCOPE_CLUSTER, mock.ANY, mock.ANY, mock.ANY,
                 mock.ANY)
 
+    @mock.patch.object(kubernetes_utils, 'get_custom_objects_api')
+    @mock.patch.object(kubernetes_utils, 'LOG')
+    def test_execute_skip_exception(self, mock_log, mock_get_api):
+        mock_api = mock.Mock()
+        mock_api.delete_cluster_custom_object.side_effect = rest.ApiException(status=404)
+
+        mock_get_api.return_value = mock_api
+        kubernetes_utils.delete_network(
+            constants.SCOPE_CLUSTER, mock.ANY, mock.ANY, mock.ANY,
+            mock.ANY, skip_codes=[404])
+
+        mock_log.info.assert_called_once()
+
 
 class DeletePodTestCase(base.BaseUnitTestCase):
     @mock.patch.object(kubernetes_utils, 'get_core_api')
@@ -260,8 +273,9 @@ class DeletePodTestCase(base.BaseUnitTestCase):
         with self.assertRaises(exceptions.KubernetesApiException):
             kubernetes_utils.delete_pod(mock.ANY, skip_codes=[404])
 
+    @mock.patch.object(kubernetes_utils, 'LOG')
     @mock.patch.object(kubernetes_utils, 'get_core_api')
-    def test_execute_skip_exception(self, mock_get_api):
+    def test_execute_skip_exception(self, mock_get_api, *args):
         mock_api = mock.Mock()
         mock_api.delete_namespaced_pod.side_effect = rest.ApiException(status=404)
 
@@ -289,12 +303,11 @@ class DeleteServiceTestCase(base.BaseUnitTestCase):
         with self.assertRaises(exceptions.KubernetesApiException):
             kubernetes_utils.delete_service(mock.ANY, skip_codes=[404])
 
-    @mock.patch.object(kubernetes_utils, 'get_core_api')
     @mock.patch.object(kubernetes_utils, 'LOG')
-    def test_execute_skip_exception(self, mock_log, mock_get_api):
+    @mock.patch.object(kubernetes_utils, 'get_core_api')
+    def test_execute_skip_exception(self, mock_get_api, *args):
         mock_api = mock.Mock()
         mock_api.delete_namespaced_service.side_effect = rest.ApiException(status=404)
 
         mock_get_api.return_value = mock_api
         kubernetes_utils.delete_service(mock.ANY, skip_codes=[404])
-        mock_log.info.assert_called_once()
index 5a6f8c6..4bf6783 100644 (file)
@@ -543,7 +543,7 @@ class NetworkObjectTestCase(base.BaseUnitTestCase):
         net_obj._name = 'name'
         net_obj.delete()
         mock_delete_network.assert_called_once_with(
-            'scope', 'group', 'version', 'plural', 'name')
+            'scope', 'group', 'version', 'plural', 'name', skip_codes=[404])
 
 
 class ServiceNodePortObjectTestCase(base.BaseUnitTestCase):
index be4882e..779e6ea 100644 (file)
@@ -9,9 +9,8 @@
 
 import mock
 
-from yardstick.common.exceptions import UnsupportedPodFormatError
-from yardstick.service.environment import Environment
-from yardstick.service.environment import AnsibleCommon
+from yardstick.common import exceptions
+from yardstick.service import environment
 from yardstick.tests.unit import base as ut_base
 
 
@@ -31,15 +30,17 @@ class EnvironmentTestCase(ut_base.BaseUnitTestCase):
             ]
         }
 
-        with mock.patch.object(AnsibleCommon, 'gen_inventory_ini_dict'), \
-                mock.patch.object(AnsibleCommon, 'get_sut_info',
-                                  return_value={'node1': {}}):
-            env = Environment(pod=pod_info)
+        with mock.patch.object(environment.AnsibleCommon,
+                               'gen_inventory_ini_dict'), \
+                mock.patch.object(environment.AnsibleCommon, 'get_sut_info',
+                                  return_value={'node1': {}}), \
+                mock.patch.object(environment.Environment, '_format_sut_info'):
+            env = environment.Environment(pod=pod_info)
             env.get_sut_info()
 
     def test_get_sut_info_pod_str(self):
         pod_info = 'nodes'
 
-        env = Environment(pod=pod_info)
-        with self.assertRaises(UnsupportedPodFormatError):
+        env = environment.Environment(pod=pod_info)
+        with self.assertRaises(exceptions.UnsupportedPodFormatError):
             env.get_sut_info()