os-xenapi/os_xenapi/tests/plugins/test_xenhost.py
naichuans 2672b644c1 XenAPI: add unit test for Dom0 plugin xenhost.py: other
Currently all our OpenStack Dom0 plugins are moved to os-xenapi,
see https://github.com/openstack/os-xenapi/tree/master/os_xenapi
/dom0/etc/xapi.d/plugins
but some of them don't have any unit test, this task is to add
unit test for xenhost.py.
The whole test would include more than one commits. This one
include: Networking config, GC and PCI type checking

Change-Id: I649c9db296062c2b42bf848b1ceb8d530b88c818
2017-05-12 09:30:51 +00:00

999 lines
44 KiB
Python

# Copyright (c) 2017 Citrix Systems, Inc
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
try:
import json
except ImportError:
import simplejson as json
import mock
from mock import call
from os_xenapi.tests.plugins import plugin_test
import time
class FakeXenAPIException(Exception):
pass
class XenHostRunCmdTestCase(plugin_test.PluginTestBase):
def setUp(self):
super(XenHostRunCmdTestCase, self).setUp()
self.host = self.load_plugin("xenhost.py")
self.pluginlib = self.load_plugin("dom0_pluginlib.py")
def test_run_command(self):
self.mock_patch_object(self.host.utils,
'run_command',
'fake_run_cmd_return')
cmd_result = self.host._run_command('fake_command')
self.assertEqual(cmd_result, 'fake_run_cmd_return')
self.host.utils.run_command.assert_called_with(
'fake_command', cmd_input=None)
def test_run_command_exception(self):
side_effect = [self.host.utils.SubprocessException(
'fake_cmdline', 0,
'fake_out', 'fake_err')]
self.mock_patch_object(self.host.utils,
'run_command',
'fake_run_cmd_return')
self.host.utils.run_command.side_effect = side_effect
self.assertRaises(self.pluginlib.PluginError,
self.host._run_command,
'fake_command')
self.host.utils.run_command.assert_called_with(
'fake_command', cmd_input=None)
class VMOperationTestCase(plugin_test.PluginTestBase):
def setUp(self):
super(VMOperationTestCase, self).setUp()
self.host = self.load_plugin("xenhost.py")
self.pluginlib = self.load_plugin("dom0_pluginlib.py")
self.mock_patch_object(self.host,
'_run_command',
'fake_run_cmd_return')
@mock.patch.object(time, 'sleep')
def test_resume_compute(self, mock_sleep):
self.mock_patch_object(self.session.xenapi.VM,
'start')
self.host._resume_compute(self.session,
'fake_compute_ref',
'fake_compute_uuid')
self.session.xenapi.VM.start.assert_called_with(
'fake_compute_ref', False, True)
mock_sleep.time.assert_not_called()
@mock.patch.object(time, 'sleep')
def test_resume_compute_exception_compute_VM_restart(self, mock_sleep):
side_effect_xenapi_failure = FakeXenAPIException
self.mock_patch_object(self.session.xenapi.VM,
'start')
self.host.XenAPI.Failure = FakeXenAPIException
self.session.xenapi.VM.start.side_effect = \
side_effect_xenapi_failure
self.host._resume_compute(self.session,
'fake_compute_ref',
'fake_compute_uuid')
self.session.xenapi.VM.start.assert_called_with(
'fake_compute_ref', False, True)
self.host._run_command.assert_called_with(
["xe", "vm-start", "uuid=%s" % 'fake_compute_uuid']
)
mock_sleep.assert_not_called()
@mock.patch.object(time, 'sleep')
def test_resume_compute_exception_wait_slave_available(self, mock_sleep):
side_effect_xenapi_failure = FakeXenAPIException
side_effect_plugin_error = [self.pluginlib.PluginError(
"Wait for the slave to become available"),
None]
self.mock_patch_object(self.session.xenapi.VM,
'start')
self.session.xenapi.VM.start.side_effect = \
side_effect_xenapi_failure
self.host._run_command.side_effect = side_effect_plugin_error
self.host.XenAPI.Failure = FakeXenAPIException
expected = [call(["xe", "vm-start", "uuid=%s" % 'fake_compute_uuid']),
call(["xe", "vm-start", "uuid=%s" % 'fake_compute_uuid'])]
self.host._resume_compute(self.session,
'fake_compute_ref',
'fake_compute_uuid')
self.session.xenapi.VM.start.assert_called_with(
'fake_compute_ref', False, True)
self.assertEqual(expected, self.host._run_command.call_args_list)
mock_sleep.assert_called_once()
@mock.patch.object(time, 'sleep')
def test_resume_compute_exception_unrecoverable(self, mock_sleep):
fake_compute_ref = -1
side_effect_xenapi_failure = FakeXenAPIException
side_effect_plugin_error = (
[self.pluginlib.PluginError]
* self.host.DEFAULT_TRIES)
self.mock_patch_object(self.session.xenapi.VM,
'start')
self.session.xenapi.VM.start.side_effect = \
side_effect_xenapi_failure
self.host.XenAPI.Failure = FakeXenAPIException
self.host._run_command.side_effect = side_effect_plugin_error
self.assertRaises(self.pluginlib.PluginError,
self.host._resume_compute,
self.session,
fake_compute_ref,
'fake_compute_uuid')
self.session.xenapi.VM.start.assert_called_with(
-1, False, True)
self.host._run_command.assert_called_with(
["xe", "vm-start", "uuid=%s" % 'fake_compute_uuid']
)
mock_sleep.assert_called()
def test_set_host_enabled_no_enabled_key_in_arg_dict(self):
temp_dict = {}
self.assertRaises(self.pluginlib.PluginError,
self.host.set_host_enabled,
self.host, temp_dict)
def test_set_host_enabled_unexpected_enabled_key(self):
temp_dict = {}
temp_dict.update({'enabled': 'unexpected_status'})
temp_dict.update({'host_uuid': 'fake_host_uuid'})
self.assertRaises(self.pluginlib.PluginError,
self.host.set_host_enabled,
self.host, temp_dict)
def test_set_host_enabled_host_enable_disable_cmd_return_not_empty(self):
temp_dict = {}
temp_dict.update({'enabled': 'true'})
temp_dict.update({'host_uuid': 'fake_host_uuid'})
fake_run_command_return = 'not empty'
self.host._run_command.return_value = fake_run_command_return
self.assertRaises(self.pluginlib.PluginError,
self.host.set_host_enabled,
self.host, temp_dict)
self.host._run_command.assert_called_once
def test_set_host_enabled_request_host_enabled(self):
temp_dict = {}
side_effects = ['', 'any_value']
temp_dict.update({'enabled': 'true'})
temp_dict.update({'host_uuid': 'fake_host_uuid'})
expected = [call(['xe', 'host-enable', 'uuid=fake_host_uuid']),
call(['xe', 'host-param-get', 'uuid=fake_host_uuid',
'param-name=enabled'])]
self.host._run_command.side_effect = side_effects
self.host.set_host_enabled(self.host, temp_dict)
self.assertEqual(self.host._run_command.call_args_list, expected)
def test_set_host_enabled_request_cmd_host_disable(self):
temp_dict = {}
side_effects = ['', 'any_value']
temp_dict.update({'enabled': 'false'})
temp_dict.update({'host_uuid': 'fake_host_uuid'})
expected = [call(["xe", "host-disable", "uuid=%s" %
temp_dict['host_uuid']],),
call(["xe", "host-param-get", "uuid=%s"
% temp_dict['host_uuid'],
"param-name=enabled"],)]
self.host._run_command.side_effect = side_effects
self.host.set_host_enabled(self.host, temp_dict)
self.assertEqual(self.host._run_command.call_args_list, expected)
def test_set_host_enabled_confirm_host_enabled(self):
temp_dict = {}
side_effects = ['', 'true']
temp_dict.update({'enabled': 'true'})
temp_dict.update({'host_uuid': 'fake_host_uuid'})
self.host._run_command.side_effect = side_effects
result_status = self.host.set_host_enabled(self.host, temp_dict)
self.assertEqual(result_status, '{"status": "enabled"}')
def test_set_host_enabled_confirm_host_disabled(self):
temp_dict = {}
side_effects = ['', 'any_value']
temp_dict.update({'enabled': 'false'})
temp_dict.update({'host_uuid': 'fake_host_uuid'})
self.host._run_command.side_effect = side_effects
result_status = self.host.set_host_enabled(self.host, temp_dict)
self.assertEqual(result_status, '{"status": "disabled"}')
class HostOptTestCase(plugin_test.PluginTestBase):
def setUp(self):
super(HostOptTestCase, self).setUp()
self.host = self.load_plugin("xenhost.py")
self.pluginlib = self.load_plugin("dom0_pluginlib.py")
self.mock_patch_object(self.host,
'_run_command',
'fake_run_cmd_return')
# may be removed because the operation would be deprecate
def test_power_action_disable_cmd_result_not_empty(self):
temp_arg_dict = {'host_uuid': 'fake_host_uuid'}
self.host._run_command.return_value = 'not_empty'
expected_cmd_arg = ["xe", "host-disable", "uuid=%s" %
'fake_host_uuid']
self.assertRaises(self.pluginlib.PluginError,
self.host._power_action,
'fake_action', temp_arg_dict)
self.host._run_command.assert_called_with(expected_cmd_arg)
# may be removed because the operation would be deprecate
def test_power_action_shutdown_cmd_result_not_empty(self):
side_effects = [None, 'not_empty']
temp_arg_dict = {'host_uuid': 'fake_host_uuid'}
self.host._run_command.side_effect = side_effects
expected_cmd_arg_list = [call(["xe", "host-disable", "uuid=%s"
% 'fake_host_uuid']),
call(["xe", "vm-shutdown", "--multiple",
"resident-on=%s" % 'fake_host_uuid'])]
self.assertRaises(self.pluginlib.PluginError,
self.host._power_action,
'fake_action', temp_arg_dict)
self.assertEqual(self.host._run_command.call_args_list,
expected_cmd_arg_list)
# may be removed because the operation would be deprecate
def test_power_action_input_cmd_result_not_empty(self):
side_effects = [None, None, 'not_empty']
temp_arg_dict = {'host_uuid': 'fake_host_uuid'}
self.host._run_command.side_effect = side_effects
cmds = {"reboot": "host-reboot",
"startup": "host-power-on",
"shutdown": "host-shutdown"}
fake_action = 'reboot' # 'statup' and 'shutdown' should be same
expected_cmd_arg_list = [call(["xe", "host-disable", "uuid=%s"
% 'fake_host_uuid']),
call(["xe", "vm-shutdown", "--multiple",
"resident-on=%s" % 'fake_host_uuid']),
call(["xe", cmds[fake_action], "uuid=%s" %
'fake_host_uuid'])]
self.assertRaises(self.pluginlib.PluginError,
self.host._power_action,
fake_action, temp_arg_dict)
self.assertEqual(self.host._run_command.call_args_list,
expected_cmd_arg_list)
def test_power_action(self):
temp_arg_dict = {'host_uuid': 'fake_host_uuid'}
self.host._run_command.return_value = None
cmds = {"reboot": "host-reboot",
"startup": "host-power-on",
"shutdown": "host-shutdown"}
fake_action = 'reboot' # 'statup' and 'shutdown' should be same
expected_cmd_arg_list = [call(["xe", "host-disable", "uuid=%s"
% 'fake_host_uuid']),
call(["xe", "vm-shutdown", "--multiple",
"resident-on=%s" % 'fake_host_uuid']),
call(["xe", cmds[fake_action], "uuid=%s" %
'fake_host_uuid'])]
expected_result = {"power_action": fake_action}
action_result = self.host._power_action(fake_action, temp_arg_dict)
self.assertEqual(self.host._run_command.call_args_list,
expected_cmd_arg_list)
self.assertEqual(action_result, expected_result)
def test_host_reboot(self):
fake_action = 'reboot'
self.mock_patch_object(self.host,
'_power_action',
'fake_action_result')
self.host.host_reboot(self.host, 'fake_arg_dict')
self.host._power_action.assert_called_with(fake_action,
'fake_arg_dict')
def test_host_shutdown(self):
fake_action = 'shutdown'
self.mock_patch_object(self.host,
'_power_action',
'fake_action_result')
self.host.host_shutdown(self.host, 'fake_arg_dict')
self.host._power_action.assert_called_with(fake_action,
'fake_arg_dict')
def test_host_start(self):
fake_action = 'startup'
self.mock_patch_object(self.host,
'_power_action',
'fake_action_result')
self.host.host_start(self.host, 'fake_arg_dict')
self.host._power_action.assert_called_with(fake_action,
'fake_arg_dict')
def test_host_join(self):
temp_arg_dict = {'url': 'fake_url',
'user': 'fake_user',
'password': 'fake_password',
'master_addr': 'fake_master_addr',
'master_user': 'fake_master_user',
'master_pass': 'fake_master_pass',
'compute_uuid': 'fake_compute_uuid'}
self.mock_patch_object(self.host, '_resume_compute')
self.host.XenAPI = mock.Mock()
self.host.XenAPI.Session = mock.Mock()
self.host.host_join(self.host, temp_arg_dict)
self.host.XenAPI.Session().login_with_password.assert_called_once()
self.host.XenAPI.Session().xenapi.pool.join.assert_called_with(
'fake_master_addr',
'fake_master_user',
'fake_master_pass')
self.host._resume_compute.assert_called_with(
self.host.XenAPI.Session(),
self.host.XenAPI.Session().xenapi.VM.get_by_uuid(
'fake_compute_uuid'),
'fake_compute_uuid')
def test_host_join_force_join(self):
temp_arg_dict = {'force': 'true',
'master_addr': 'fake_master_addr',
'master_user': 'fake_master_user',
'master_pass': 'fake_master_pass',
'compute_uuid': 'fake_compute_uuid'}
self.mock_patch_object(self.host, '_resume_compute')
self.host.XenAPI = mock.Mock()
self.host.XenAPI.Session = mock.Mock()
self.host.host_join(self.host, temp_arg_dict)
self.host.XenAPI.Session().login_with_password.assert_called_once()
self.host.XenAPI.Session().xenapi.pool.join_force.assert_called_with(
'fake_master_addr',
'fake_master_user',
'fake_master_pass')
self.host._resume_compute.assert_called_with(
self.host.XenAPI.Session(),
self.host.XenAPI.Session().xenapi.VM.get_by_uuid(
'fake_compute_uuid'),
'fake_compute_uuid')
def test_host_data(self):
temp_arg_dict = {'host_uuid': 'fake_host_uuid'}
fake_dict_after_cleanup = {'new_key': 'new_value'}
fake_config_setting = {'config': 'fake_config_setting'}
self.host._run_command.return_value = 'fake_resp'
self.mock_patch_object(self.host,
'parse_response',
'fake_parsed_data')
self.mock_patch_object(self.host,
'cleanup',
fake_dict_after_cleanup)
self.mock_patch_object(self.host,
'_get_config_dict',
fake_config_setting)
expected_ret_dict = fake_dict_after_cleanup
expected_ret_dict.update(fake_config_setting)
return_host_data = self.host.host_data(self.host,
temp_arg_dict)
self.host._run_command.assert_called_with(
["xe", "host-param-list", "uuid=%s" % temp_arg_dict['host_uuid']]
)
self.host.parse_response.assert_called_with('fake_resp')
self.host.cleanup('fake_parsed_data')
self.host._get_config_dict.assert_called_once()
self.assertEqual(expected_ret_dict, json.loads(return_host_data))
def test_parse_response(self):
fake_resp = 'fake_name ( fake_flag): fake_value'
expected_parsed_resp = {'fake_name': 'fake_value'}
result_data = self.host.parse_response(fake_resp)
self.assertEqual(result_data, expected_parsed_resp)
def test_parse_response_one_invalid_line(self):
fake_resp = "(exeception line)\n \
fake_name ( fake_flag): fake_value"
expected_parsed_resp = {'fake_name': 'fake_value'}
result_data = self.host.parse_response(fake_resp)
self.assertEqual(result_data, expected_parsed_resp)
def test_host_uptime(self):
self.host._run_command.return_value = 'fake_uptime'
uptime_return = self.host.host_uptime(self.host, 'fake_arg_dict')
self.assertEqual(uptime_return, '{"uptime": "fake_uptime"}')
class ConfigOptTestCase(plugin_test.PluginTestBase):
def setUp(self):
super(ConfigOptTestCase, self).setUp()
self.host = self.load_plugin("xenhost.py")
self.pluginlib = self.load_plugin("dom0_pluginlib.py")
self.mock_patch_object(self.host,
'_run_command',
'fake_run_cmd_return')
def test_get_config_no_config_key(self):
temp_dict = {'params': '{"key": "fake_key"}'}
fake_conf_dict = {}
self.mock_patch_object(self.host,
'_get_config_dict',
fake_conf_dict)
config_return = self.host.get_config(self.host, temp_dict)
self.assertEqual(json.loads(config_return), "None")
self.host._get_config_dict.assert_called_once()
def test_get_config_json(self):
temp_dict = {'params': '{"key": "fake_key"}'}
fake_conf_dict = {'fake_key': 'fake_conf_key'}
self.mock_patch_object(self.host,
'_get_config_dict',
fake_conf_dict)
config_return = self.host.get_config(self.host, temp_dict)
self.assertEqual(json.loads(config_return), 'fake_conf_key')
self.host._get_config_dict.assert_called_once()
def test_get_config_dict(self):
temp_dict = {'params': {"key": "fake_key"}}
fake_conf_dict = {'fake_key': 'fake_conf_key'}
self.mock_patch_object(self.host,
'_get_config_dict',
fake_conf_dict)
config_return = self.host.get_config(self.host, temp_dict)
self.assertEqual(json.loads(config_return), 'fake_conf_key')
self.host._get_config_dict.assert_called_once()
def test_set_config_remove_none_key(self):
temp_arg_dict = {'params': {"key": "fake_key", "value": None}}
temp_conf = {'fake_key': 'fake_value'}
self.mock_patch_object(self.host,
'_get_config_dict',
temp_conf)
self.mock_patch_object(self.host,
'_write_config_dict')
self.host.set_config(self.host, temp_arg_dict)
self.assertTrue("fake_key" not in temp_conf)
self.host._get_config_dict.assert_called_once()
self.host._write_config_dict.assert_called_with(temp_conf)
def test_set_config_overwrite_key_value(self):
temp_arg_dict = {'params': {"key": "fake_key", "value": "new_value"}}
temp_conf = {'fake_key': 'fake_value'}
self.mock_patch_object(self.host,
'_get_config_dict',
temp_conf)
self.mock_patch_object(self.host,
'_write_config_dict')
self.host.set_config(self.host, temp_arg_dict)
self.assertTrue('fake_key' in temp_conf)
self.host._get_config_dict.assert_called_once()
temp_conf.update({'fake_key': 'new_value'})
self.host._write_config_dict.assert_called_with(temp_conf)
class NetworkTestCase(plugin_test.PluginTestBase):
def setUp(self):
super(NetworkTestCase, self).setUp()
self.host = self.load_plugin("xenhost.py")
self.pluginlib = self.load_plugin("dom0_pluginlib.py")
self.mock_patch_object(self.host,
'_run_command',
'fake_run_cmd_return')
def test_ovs_add_patch_port(self):
brige_name = 'fake_brige_name'
port_name = 'fake_port_name'
peer_port_name = 'fake_peer_port_name'
side_effects = [brige_name, port_name, peer_port_name]
self.mock_patch_object(self.pluginlib,
'exists')
self.pluginlib.exists.side_effect = side_effects
expected_cmd_args = ['ovs-vsctl', '--', '--if-exists', 'del-port',
port_name, '--', 'add-port', brige_name,
'fake_port_name', '--', 'set', 'interface',
'fake_port_name', 'type=patch',
'options:peer=%s' % peer_port_name]
expected_pluginlib_arg_list = [call('fake_args', 'bridge_name'),
call('fake_args', 'port_name'),
call('fake_args', 'peer_port_name')]
self.host._ovs_add_patch_port('fake_args')
self.host._run_command.assert_called_with(expected_cmd_args)
self.assertEqual(self.pluginlib.exists.call_args_list,
expected_pluginlib_arg_list)
def test_ovs_del_port(self):
bridge_name = 'fake_brige_name'
port_name = 'fake_port_name'
side_effects = [bridge_name, port_name]
self.mock_patch_object(self.pluginlib,
'exists')
self.pluginlib.exists.side_effect = side_effects
expected_cmd_args = ['ovs-vsctl', '--', '--if-exists', 'del-port',
bridge_name, port_name]
expected_pluginlib_arg_list = [call('fake_args', 'bridge_name'),
call('fake_args', 'port_name')]
self.host._ovs_del_port('fake_args')
self.host._run_command.assert_called_with(expected_cmd_args)
self.assertEqual(self.pluginlib.exists.call_args_list,
expected_pluginlib_arg_list)
def test_ovs_del_br(self):
bridge_name = 'fake_brige_name'
self.mock_patch_object(self.pluginlib,
'exists',
bridge_name)
expected_cmd_args = ['ovs-vsctl', '--', '--if-exists',
'del-br', bridge_name]
self.host._ovs_del_br('fake_args')
self.pluginlib.exists.assert_called_with('fake_args', 'bridge_name')
self.host._run_command.assert_called_with(expected_cmd_args)
def test_ovs_set_if_external_id(self):
interface = 'fake_interface'
extneral_id = 'fake_extneral_id'
value = 'fake_value'
side_effects = [interface, extneral_id, value]
self.mock_patch_object(self.pluginlib,
'exists')
self.pluginlib.exists.side_effect = side_effects
expected_cmd_args = ['ovs-vsctl', 'set', 'Interface', interface,
'external-ids:%s=%s' % (extneral_id, value)]
expected_pluginlib_arg_list = [call('fake_args', 'interface'),
call('fake_args', 'extneral_id'),
call('fake_args', 'value')]
self.host._ovs_set_if_external_id('fake_args')
self.host._run_command.assert_called_with(expected_cmd_args)
self.assertEqual(self.pluginlib.exists.call_args_list,
expected_pluginlib_arg_list)
def test_ovs_add_port(self):
bridge_name = 'fake_brige_name'
port_name = 'fake_port_name'
side_effects = [bridge_name, port_name]
self.mock_patch_object(self.pluginlib,
'exists')
self.pluginlib.exists.side_effect = side_effects
expected_cmd_args = ['ovs-vsctl', '--', '--if-exists', 'del-port',
port_name, '--', 'add-port', bridge_name,
port_name]
expected_pluginlib_arg_list = [call('fake_args', 'bridge_name'),
call('fake_args', 'port_name')]
self.host._ovs_add_port('fake_args')
self.host._run_command.assert_called_with(expected_cmd_args)
self.assertEqual(self.pluginlib.exists.call_args_list,
expected_pluginlib_arg_list)
def test_ovs_create_port(self):
bridge_name = 'fake_brige_name'
port_name = 'fake_port_name'
iface_id = 'fake_iface_id'
mac = 'fake_mac'
status = 'fake_status'
side_effects = [bridge_name, port_name, iface_id, mac, status]
self.mock_patch_object(self.pluginlib,
'exists')
self.pluginlib.exists.side_effect = side_effects
expected_cmd_args = ['ovs-vsctl', '--', '--if-exists', 'del-port',
port_name, '--', 'add-port', bridge_name,
port_name, '--', 'set', 'Interface', port_name,
'external_ids:iface-id=%s' % iface_id,
'external_ids:iface-status=%s' % status,
'external_ids:attached-mac=%s' % mac,
'external_ids:xs-vif-uuid=%s' % iface_id]
expected_pluginlib_arg_list = [call('fake_args', 'bridge'),
call('fake_args', 'port'),
call('fake_args', 'iface-id'),
call('fake_args', 'mac'),
call('fake_args', 'status')]
self.host._ovs_create_port('fake_args')
self.pluginlib.exists.assert_called()
self.host._run_command.assert_called_with(expected_cmd_args)
self.assertEqual(self.pluginlib.exists.call_args_list,
expected_pluginlib_arg_list)
def test_ip_link_get_dev(self):
device_name = 'fake_device_name'
expected_cmd_args = ['ip', 'link', 'show', device_name]
self.mock_patch_object(self.pluginlib,
'exists',
device_name)
self.host._ip_link_get_dev('fake_args')
self.pluginlib.exists.assert_called_with('fake_args', 'device_name')
self.host._run_command.assert_called_with(expected_cmd_args)
def test_ip_link_del_dev(self):
device_name = 'fake_device_name'
expected_cmd_args = ['ip', 'link', 'delete', device_name]
self.mock_patch_object(self.pluginlib,
'exists',
'fake_device_name')
self.host._ip_link_del_dev('fake_args')
self.pluginlib.exists.assert_called_with('fake_args', 'device_name')
self.host._run_command.assert_called_with(expected_cmd_args)
def test_ip_link_add_veth_pair(self):
dev1_name = 'fake_brige_name'
dev2_name = 'fake_port_name'
side_effects = [dev1_name, dev2_name]
self.mock_patch_object(self.pluginlib,
'exists')
self.pluginlib.exists.side_effect = side_effects
expected_cmd_args = ['ip', 'link', 'add', dev1_name, 'type',
'veth', 'peer', 'name', dev2_name]
expected_pluginlib_arg_list = [call('fake_args', 'dev1_name'),
call('fake_args', 'dev2_name')]
self.host._ip_link_add_veth_pair('fake_args')
self.host._run_command.assert_called_with(expected_cmd_args)
self.assertEqual(self.pluginlib.exists.call_args_list,
expected_pluginlib_arg_list)
def test_ip_link_set_dev(self):
device_name = 'fake_device_name'
option = 'fake_option'
side_effects = [device_name, option]
self.mock_patch_object(self.pluginlib,
'exists')
self.pluginlib.exists.side_effect = side_effects
expected_cmd_args = ['ip', 'link', 'set', device_name, option]
expected_pluginlib_arg_list = [call('fake_args', 'device_name'),
call('fake_args', 'option')]
self.host._ip_link_set_dev('fake_args')
self.host._run_command.assert_called_with(expected_cmd_args)
self.assertEqual(self.pluginlib.exists.call_args_list,
expected_pluginlib_arg_list)
def test_ip_link_set_promisc(self):
device_name = 'fake_device_name'
option = 'fake_option'
side_effects = [device_name, option]
self.mock_patch_object(self.pluginlib,
'exists')
self.pluginlib.exists.side_effect = side_effects
expected_cmd_args = ['ip', 'link', 'set', device_name, 'promisc',
option]
expected_pluginlib_arg_list = [call('fake_args', 'device_name'),
call('fake_args', 'option')]
self.host._ip_link_set_promisc('fake_args')
self.host._run_command.assert_called_with(expected_cmd_args)
self.assertEqual(self.pluginlib.exists.call_args_list,
expected_pluginlib_arg_list)
def test_brctl_add_br(self):
bridge_name = 'fake_bridge_name'
cmd_args = 'fake_option'
side_effects = [bridge_name, cmd_args]
self.pluginlib.exists.side_effect = side_effects
self.mock_patch_object(self.pluginlib,
'exists',
bridge_name)
expected_cmd_args = ['brctl', 'addbr', bridge_name]
self.host._brctl_add_br('fake_args')
self.pluginlib.exists.assert_called_with('fake_args', 'bridge_name')
self.host._run_command.assert_called_with(expected_cmd_args)
def test_brctl_del_br(self):
bridge_name = 'fake_bridge_name'
self.mock_patch_object(self.pluginlib,
'exists',
bridge_name)
expected_cmd_args = ['brctl', 'delbr', bridge_name]
self.host._brctl_del_br('fake_args')
self.pluginlib.exists.assert_called_with('fake_args', 'bridge_name')
self.host._run_command.assert_called_with(expected_cmd_args)
def test_brctl_set_fd(self):
bridge_name = 'fake_device_name'
fd = 'fake_fd'
side_effects = [bridge_name, fd]
self.mock_patch_object(self.pluginlib,
'exists')
self.pluginlib.exists.side_effect = side_effects
expected_cmd_args = ['brctl', 'setfd', bridge_name, fd]
expected_pluginlib_arg_list = [call('fake_args', 'bridge_name'),
call('fake_args', 'fd')]
self.host._brctl_set_fd('fake_args')
self.host._run_command.assert_called_with(expected_cmd_args)
self.assertEqual(self.pluginlib.exists.call_args_list,
expected_pluginlib_arg_list)
def test_brctl_set_stp(self):
bridge_name = 'fake_device_name'
option = 'fake_option'
side_effects = [bridge_name, option]
self.mock_patch_object(self.pluginlib,
'exists')
self.pluginlib.exists.side_effect = side_effects
expected_cmd_args = ['brctl', 'stp', bridge_name, option]
expected_pluginlib_arg_list = [call('fake_args', 'bridge_name'),
call('fake_args', 'option')]
self.host._brctl_set_stp('fake_args')
self.host._run_command.assert_called_with(expected_cmd_args)
self.assertEqual(self.pluginlib.exists.call_args_list,
expected_pluginlib_arg_list)
def test_brctl_add_if(self):
bridge_name = 'fake_device_name'
if_name = 'fake_if_name'
side_effects = [bridge_name, if_name]
self.mock_patch_object(self.pluginlib,
'exists')
self.pluginlib.exists.side_effect = side_effects
expected_cmd_args = ['brctl', 'addif', bridge_name, if_name]
expected_pluginlib_arg_list = [call('fake_args', 'bridge_name'),
call('fake_args', 'interface_name')]
self.host._brctl_add_if('fake_args')
self.host._run_command.assert_called_with(expected_cmd_args)
self.assertEqual(self.pluginlib.exists.call_args_list,
expected_pluginlib_arg_list)
def test_brctl_del_if(self):
bridge_name = 'fake_device_name'
if_name = 'fake_if_name'
side_effects = [bridge_name, if_name]
self.mock_patch_object(self.pluginlib,
'exists')
self.pluginlib.exists.side_effect = side_effects
expected_cmd_args = ['brctl', 'delif', bridge_name, if_name]
expected_pluginlib_arg_list = [call('fake_args', 'bridge_name'),
call('fake_args', 'interface_name')]
self.host._brctl_del_if('fake_args')
self.host._run_command.assert_called_with(expected_cmd_args)
self.assertEqual(self.pluginlib.exists.call_args_list,
expected_pluginlib_arg_list)
@mock.patch.object(json, 'loads')
def test_iptables_config(self, mock_json_loads):
self.mock_patch_object(self.pluginlib,
'exists',
'fake_cmd_args')
self.mock_patch_object(self.pluginlib,
'optional',
'fake_cmd_pro_input')
self.host._run_command.return_value = 'fake_run_cmd_resule'
mock_json_loads.return_value = ['iptables-save']
expected = json.dumps(dict(out='fake_run_cmd_resule', err=''))
ret_str = self.host.iptables_config('fake_session', 'fake_args')
self.pluginlib.exists.assert_called_once()
self.pluginlib.optional.assert_called_once()
mock_json_loads.assert_called_with('fake_cmd_args')
self.assertEqual(ret_str, expected)
self.host._run_command.assert_called_with(
map(str, ['iptables-save']), 'fake_cmd_pro_input')
@mock.patch.object(json, 'loads')
def test_iptables_config_plugin_error(self, mock_json_loads):
self.mock_patch_object(self.pluginlib,
'exists')
self.mock_patch_object(self.pluginlib,
'optional')
self.assertRaises(self.pluginlib.PluginError,
self.host.iptables_config,
'fake_session', 'fake_args')
self.pluginlib.exists.assert_called_once()
self.pluginlib.optional.assert_called_once()
mock_json_loads.assert_called_with(None)
def test_network_config_invalid_cmd(self):
fake_invalid_cmd = 0
self.mock_patch_object(self.pluginlib,
'exists',
fake_invalid_cmd)
self.assertRaises(self.pluginlib.PluginError,
self.host.network_config,
'fake_session', 'fake_args')
self.pluginlib.exists.assert_called_with('fake_args', 'cmd')
def test_network_config_unexpected_cmd(self):
fake_unexpected_cmd = 'fake_unknow_cmd'
self.mock_patch_object(self.pluginlib,
'exists',
fake_unexpected_cmd)
self.assertRaises(self.pluginlib.PluginError,
self.host.network_config,
'fake_session', 'fake_args')
self.pluginlib.exists.assert_called_with('fake_args', 'cmd')
def test_network_config(self):
fake_valid_cmd = 'ovs_add_patch_port'
side_effects = [fake_valid_cmd, 'fake_cmd_args']
self.mock_patch_object(self.pluginlib,
'exists')
self.pluginlib.exists.side_effect = side_effects
mock_func = self.mock_patch_object(self.host,
'_ovs_add_patch_port')
self.host.ALLOWED_NETWORK_CMDS['ovs_add_patch_port'] = mock_func
self.host.network_config('fake_session', 'fake_args')
self.pluginlib.exists.assert_called_with('fake_args', 'args')
self.host._ovs_add_patch_port.assert_called_with('fake_cmd_args')
class XenHostTestCase(plugin_test.PluginTestBase):
def setUp(self):
super(XenHostTestCase, self).setUp()
self.host = self.load_plugin("xenhost.py")
self.pluginlib = self.load_plugin("dom0_pluginlib.py")
self.mock_patch_object(self.host,
'_run_command',
'fake_run_cmd_return')
def test_clean_up(self):
fake_arg_dict = {
'enabled': 'enabled',
'memory-total': '0',
'memory-overhead': '1',
'memory-free': '2',
'memory-free-computed': '3',
'uuid': 'fake_uuid',
'name-label': 'fake_name-label',
'name-description': 'fake_name-description',
'hostname': 'fake_hostname',
'address': 'fake_address',
'other-config': 'config:fake_other-config_1; \
config:fake_other-config_2',
'capabilities': 'fake_cap_1; fake_cap_2',
'cpu_info': 'cpu_count:1; family:101; unknow:1'
}
expected_out = {
'enabled': 'enabled',
'host_memory': {'total': 0,
'overhead': 1,
'free': 2,
'free-computed': 3},
'host_uuid': 'fake_uuid',
'host_name-label': 'fake_name-label',
'host_name-description': 'fake_name-description',
'host_hostname': 'fake_hostname',
'host_ip_address': 'fake_address',
'host_other-config': {'config': 'fake_other-config_1',
'config': 'fake_other-config_2'},
'host_capabilities': ['fake_cap_1', 'fake_cap_2'],
'host_cpu_info': {'cpu_count': 1, 'family': 101,
'unknow': '1'}
}
out = self.host.cleanup(fake_arg_dict)
self.assertEqual(out, expected_out)
def test_clean_up_exception_invalid_memory_value(self):
fake_arg_dict = {
'enabled': 'enabled',
'memory-total': 'invalid',
'memory-overhead': 'invalid',
'memory-free': 'invalid',
'memory-free-computed': 'invalid',
'uuid': 'fake_uuid',
'name-label': 'fake_name-label',
'name-description': 'fake_name-description',
'hostname': 'fake_hostname',
'address': 'fake_address',
'other-config': 'config:fake_other-config_1; \
config:fake_other-config_2',
'capabilities': 'fake_cap_1; fake_cap_2',
'cpu_info': 'cpu_count:1; family:101; unknow:1'
}
expected_out = {
'enabled': 'enabled',
'host_memory': {'total': None,
'overhead': None,
'free': None,
'free-computed': None},
'host_uuid': 'fake_uuid',
'host_name-label': 'fake_name-label',
'host_name-description': 'fake_name-description',
'host_hostname': 'fake_hostname',
'host_ip_address': 'fake_address',
'host_other-config': {'config': 'fake_other-config_1',
'config': 'fake_other-config_2'},
'host_capabilities': ['fake_cap_1', 'fake_cap_2'],
'host_cpu_info': {'cpu_count': 1, 'family': 101,
'unknow': '1'}
}
out = self.host.cleanup(fake_arg_dict)
self.assertEqual(out, expected_out)
def test_query_gc_running(self):
fake_cmd_result = "Currently running: True"
self.host._run_command.return_value = fake_cmd_result
query_gc_result = self.host.query_gc('fake_session',
'fake_sr_uuid',
'fake_vdi_uuid')
self.assertTrue(query_gc_result)
self.host._run_command.assert_called_with(
["/opt/xensource/sm/cleanup.py",
"-q", "-u", 'fake_sr_uuid'])
def test_query_gc_not_running(self):
fake_cmd_result = "Currently running: False"
self.host._run_command.return_value = fake_cmd_result
query_gc_result = self.host.query_gc('fake_session',
'fake_sr_uuid',
'fake_vdi_uuid')
self.assertFalse(query_gc_result)
self.host._run_command.assert_called_with(
["/opt/xensource/sm/cleanup.py",
"-q", "-u", 'fake_sr_uuid'])
def test_get_pci_device_details(self):
self.host.get_pci_device_details('fake_session')
self.host._run_command.assert_called_with(
["lspci", "-vmmnk"])
def test_get_pci_type_no_domain(self):
fake_pci_device = '00:00.0'
self.host._run_command.return_value = ['fake_pci_type', ]
self.host.get_pci_type('fake_session', fake_pci_device)
self.host._run_command.assert_called_with(
["ls", "/sys/bus/pci/devices/" + '0000:'
+ fake_pci_device + "/"])
def test_get_pci_type_physfn(self):
fake_pci_device = '0000:00:00.0'
self.host._run_command.return_value = ['physfn', ]
output = self.host.get_pci_type('fake_session', fake_pci_device)
self.host._run_command.assert_called_with(
["ls", "/sys/bus/pci/devices/" + fake_pci_device + "/"])
self.assertEqual(output, 'type-VF')
def test_get_pci_type_virtfn(self):
fake_pci_device = '0000:00:00.0'
self.host._run_command.return_value = ['virtfn', ]
output = self.host.get_pci_type('fake_session', fake_pci_device)
self.host._run_command.assert_called_with(
["ls", "/sys/bus/pci/devices/" + fake_pci_device + "/"])
self.assertEqual(output, 'type-PF')
def test_get_pci_type_PCI(self):
fake_pci_device = '0000:00:00.0'
self.host._run_command.return_value = ['other', ]
output = self.host.get_pci_type('fake_session', fake_pci_device)
self.host._run_command.assert_called_with(
["ls", "/sys/bus/pci/devices/" + fake_pci_device + "/"])
self.assertEqual(output, 'type-PCI')