Setup hugepages on SA host(sriov, ovs_dpdk)
[yardstick.git] / yardstick / tests / unit / benchmark / contexts / standalone / test_sriov.py
index f0953ef..0809a98 100644 (file)
@@ -18,7 +18,11 @@ import mock
 import unittest
 
 from yardstick import ssh
+from yardstick.benchmark import contexts
+from yardstick.benchmark.contexts import base
+from yardstick.benchmark.contexts.standalone import model
 from yardstick.benchmark.contexts.standalone import sriov
+from yardstick.common import utils
 
 
 class SriovContextTestCase(unittest.TestCase):
@@ -28,7 +32,7 @@ class SriovContextTestCase(unittest.TestCase):
     NODES_DUPLICATE_SAMPLE = "nodes_duplicate_sample.yaml"
 
     ATTRS = {
-        'name': 'StandaloneSriov',
+        'name': contexts.CONTEXT_STANDALONESRIOV,
         'task_id': '1234567890',
         'file': 'pod',
         'flavor': {},
@@ -60,19 +64,22 @@ class SriovContextTestCase(unittest.TestCase):
         self.attrs = {
             'name': 'foo',
             'task_id': '1234567890',
-            'file': self._get_file_abspath(self.NODES_SRIOV_SAMPLE)
+            'file': self._get_file_abspath(self.NODES_SRIOV_SAMPLE),
         }
         self.sriov = sriov.SriovContext()
         self.addCleanup(self._remove_contexts)
 
-    def _remove_contexts(self):
-        if self.sriov in self.sriov.list:
-            self.sriov._delete_context()
-
-    @mock.patch('yardstick.benchmark.contexts.standalone.sriov.Libvirt')
-    @mock.patch('yardstick.benchmark.contexts.standalone.model.StandaloneContextHelper')
-    @mock.patch('yardstick.benchmark.contexts.standalone.model.Server')
-    def test___init__(self, mock_helper, mock_server, *args):
+    @staticmethod
+    def _remove_contexts():
+        for context in base.Context.list:
+            context._delete_context()
+        base.Context.list = []
+
+    @mock.patch.object(model, 'StandaloneContextHelper')
+    @mock.patch.object(model, 'Libvirt')
+    @mock.patch.object(model, 'Server')
+    def test___init__(self, mock_helper, mock_libvirt, mock_server):
+        # pylint: disable=unused-argument
         # NOTE(ralonsoh): this test doesn't cover function execution.
         self.sriov.helper = mock_helper
         self.sriov.vnf_node = mock_server
@@ -97,16 +104,18 @@ class SriovContextTestCase(unittest.TestCase):
         self.sriov.wait_for_vnfs_to_start = mock.Mock(return_value={})
         self.assertIsNone(self.sriov.deploy())
 
-    @mock.patch('yardstick.benchmark.contexts.standalone.sriov.Libvirt')
     @mock.patch.object(ssh, 'SSH', return_value=(0, "a", ""))
-    def test_undeploy(self, mock_ssh, *args):
+    @mock.patch.object(model, 'Libvirt')
+    def test_undeploy(self, mock_libvirt, mock_ssh):
+        # pylint: disable=unused-argument
+        # NOTE(ralonsoh): the pylint exception should be removed.
         self.sriov.vm_deploy = False
         self.assertIsNone(self.sriov.undeploy())
 
         self.sriov.vm_deploy = True
         self.sriov.connection = mock_ssh
-        self.sriov.vm_names = ['vm_0', 'vm_1']
-        self.sriov.drivers = ['vm_0', 'vm_1']
+        self.sriov.vm_names = ['vm-0', 'vm-1']
+        self.sriov.drivers = ['vm-0', 'vm-1']
         self.assertIsNone(self.sriov.undeploy())
 
     def _get_file_abspath(self, filename):
@@ -164,6 +173,22 @@ class SriovContextTestCase(unittest.TestCase):
         self.assertEqual(result['user'], 'root')
         self.assertEqual(result['key_filename'], '/root/.yardstick_key')
 
+    def test__get_physical_node_for_server(self):
+        attrs = self.attrs
+        attrs.update({'servers': {'server1': {}}})
+        self.sriov.init(attrs)
+
+        # When server is not from this context
+        result = self.sriov._get_physical_node_for_server('server1.another-context')
+        self.assertIsNone(result)
+
+        # When node_name is not from this context
+        result = self.sriov._get_physical_node_for_server('fake.foo-12345678')
+        self.assertIsNone(result)
+
+        result = self.sriov._get_physical_node_for_server('server1.foo-12345678')
+        self.assertEqual(result, 'node5.foo')
+
     def test__get_server_no_task_id(self):
         self.attrs['flags'] = {'no_setup': True}
         self.sriov.init(self.attrs)
@@ -230,41 +255,37 @@ class SriovContextTestCase(unittest.TestCase):
             ssh.return_value = ssh_mock
         self.sriov.vm_deploy = True
         self.sriov.connection = ssh_mock
-        self.sriov.vm_names = ['vm_0', 'vm_1']
+        self.sriov.vm_names = ['vm-0', 'vm-1']
         self.sriov.drivers = []
         self.sriov.networks = self.NETWORKS
         self.sriov.helper.get_mac_address = mock.Mock(return_value="")
         self.sriov._get_vf_data = mock.Mock(return_value="")
         self.assertIsNone(self.sriov.configure_nics_for_sriov())
 
-    @mock.patch('yardstick.benchmark.contexts.standalone.sriov.Libvirt')
-    @mock.patch.object(ssh, 'SSH')
-    def test__enable_interfaces(self, mock_ssh, *args):
-        mock_ssh.return_value = 0, "a", ""
-
+    @mock.patch.object(ssh, 'SSH', return_value=(0, "a", ""))
+    @mock.patch.object(model.Libvirt, 'add_sriov_interfaces',
+                       return_value='out_xml')
+    def test__enable_interfaces(self, mock_add_sriov, mock_ssh):
         self.sriov.vm_deploy = True
         self.sriov.connection = mock_ssh
-        self.sriov.vm_names = ['vm_0', 'vm_1']
+        self.sriov.vm_names = ['vm-0', 'vm-1']
         self.sriov.drivers = []
         self.sriov.networks = self.NETWORKS
-        self.sriov.get_vf_data = mock.Mock(return_value="")
-        self.assertIsNone(self.sriov._enable_interfaces(
-            0, 0, ["private_0"], 'test'))
-
-    @mock.patch('yardstick.benchmark.contexts.standalone.model.Server')
-    @mock.patch('yardstick.benchmark.contexts.standalone.sriov.Libvirt')
-    def test_setup_sriov_context(self, mock_libvirt, *args):
-        with mock.patch("yardstick.ssh.SSH") as ssh:
-            ssh_mock = mock.Mock(autospec=ssh.SSH)
-            ssh_mock.execute = \
-                mock.Mock(return_value=(0, "a", ""))
-            ssh_mock.put = \
-                mock.Mock(return_value=(0, "a", ""))
-            ssh.return_value = ssh_mock
-        self.sriov.vm_deploy = True
-        self.sriov.connection = ssh_mock
-        self.sriov.vm_names = ['vm_0', 'vm_1']
-        self.sriov.drivers = []
+        self.assertEqual(
+            'out_xml',
+            self.sriov._enable_interfaces(0, 0, ['private_0'], 'test'))
+        mock_add_sriov.assert_called_once_with(
+            '0000:00:0a.0', 0, self.NETWORKS['private_0']['mac'], 'test')
+
+    @mock.patch.object(utils, 'setup_hugepages')
+    @mock.patch.object(model.StandaloneContextHelper, 'check_update_key')
+    @mock.patch.object(model.Libvirt, 'build_vm_xml')
+    @mock.patch.object(model.Libvirt, 'check_if_vm_exists_and_delete')
+    @mock.patch.object(model.Libvirt, 'write_file')
+    @mock.patch.object(model.Libvirt, 'virsh_create_vm')
+    def test_setup_sriov_context(self, mock_create_vm, mock_write_file,
+                                 mock_check, mock_build_vm_xml,
+                                 mock_check_update_key, mock_setup_hugepages):
         self.sriov.servers = {
             'vnf_0': {
                 'network_ports': {
@@ -274,15 +295,44 @@ class SriovContextTestCase(unittest.TestCase):
                 }
             }
         }
-        self.sriov.networks = self.NETWORKS
-        self.sriov.host_mgmt = {}
-        self.sriov.flavor = {}
-        self.sriov.configure_nics_for_sriov = mock.Mock(return_value="")
-        mock_libvirt.build_vm_xml = mock.Mock(
-            return_value=[6, "00:00:00:00:00:01"])
-        self.sriov._enable_interfaces = mock.Mock(return_value="")
-        self.sriov.vnf_node.generate_vnf_instance = mock.Mock(return_value={})
-        self.assertIsNotNone(self.sriov.setup_sriov_context())
+        connection = mock.Mock()
+        self.sriov.connection = connection
+        self.sriov.host_mgmt = {'ip': '1.2.3.4'}
+        self.sriov.vm_flavor = {'ram': '1024'}
+        self.sriov.networks = 'networks'
+        self.sriov.configure_nics_for_sriov = mock.Mock()
+        self.sriov._name_task_id = 'fake_name'
+        cfg = '/tmp/vm_sriov_0.xml'
+        vm_name = 'vm-0'
+        mac = '00:00:00:00:00:01'
+        xml_out = mock.Mock()
+        mock_build_vm_xml.return_value = (xml_out, mac)
+        mock_check_update_key.return_value = 'node_2'
+        cdrom_img = '/var/lib/libvirt/images/cdrom-0.img'
+
+        with mock.patch.object(self.sriov, 'vnf_node') as mock_vnf_node, \
+                mock.patch.object(self.sriov, '_enable_interfaces') as \
+                mock_enable_interfaces:
+            mock_enable_interfaces.return_value = 'out_xml'
+            mock_vnf_node.generate_vnf_instance = mock.Mock(
+                return_value='node_1')
+            nodes_out = self.sriov.setup_sriov_context()
+        mock_setup_hugepages.assert_called_once_with(connection, 1024*1024)
+        mock_check_update_key.assert_called_once_with(connection, 'node_1', vm_name,
+                                                      self.sriov._name_task_id, cdrom_img,
+                                                      mac)
+        self.assertEqual(['node_2'], nodes_out)
+        mock_vnf_node.generate_vnf_instance.assert_called_once_with(
+            self.sriov.vm_flavor, 'networks', '1.2.3.4', 'vnf_0',
+            self.sriov.servers['vnf_0'], '00:00:00:00:00:01')
+        mock_build_vm_xml.assert_called_once_with(
+            connection, self.sriov.vm_flavor, vm_name, 0, cdrom_img)
+        mock_create_vm.assert_called_once_with(connection, cfg)
+        mock_check.assert_called_once_with(vm_name, connection)
+        mock_write_file.assert_called_once_with(cfg, 'out_xml')
+        mock_enable_interfaces.assert_has_calls([
+            mock.call(0, mock.ANY, ['private_0'], mock.ANY),
+            mock.call(0, mock.ANY, ['public_0'], mock.ANY)], any_order=True)
 
     def test__get_vf_data(self):
         with mock.patch("yardstick.ssh.SSH") as ssh:
@@ -294,7 +344,7 @@ class SriovContextTestCase(unittest.TestCase):
             ssh.return_value = ssh_mock
         self.sriov.vm_deploy = True
         self.sriov.connection = ssh_mock
-        self.sriov.vm_names = ['vm_0', 'vm_1']
+        self.sriov.vm_names = ['vm-0', 'vm-1']
         self.sriov.drivers = []
         self.sriov.servers = {
             'vnf_0': {