Merge "Update and test the last of the LXDDriver non-migration methods"

This commit is contained in:
Jenkins 2016-07-26 10:37:21 +00:00 committed by Gerrit Code Review
commit bd34627ac5
3 changed files with 216 additions and 268 deletions

View File

@ -14,16 +14,12 @@
# under the License.
import collections
import json
import platform
import mock
from nova import context
from nova import exception
from nova import test
from nova.compute import arch
from nova.compute import hv_type
from nova.compute import power_state
from nova.compute import vm_mode
from nova.network import model as network_model
from nova.tests.unit import fake_instance
from pylxd import exceptions as lxdcore_exceptions
@ -881,12 +877,12 @@ class LXDDriverTest(test.NoDBTestCase):
@mock.patch.object(driver.utils, 'execute')
def test_get_available_resource(self, execute, open, statvfs):
expected = {
'cpu_info': json.dumps({
'cpu_info': {
"features": "fake flag goes here",
"model": "Fake CPU",
"topology": {"sockets": 1, "threads": "4", "cores": "5"},
"arch": "x86_64", "vendor": "FakeVendor"
}),
},
'hypervisor_hostname': 'fake_hostname',
'hypervisor_type': 'lxd',
'hypervisor_version': '011',
@ -926,48 +922,125 @@ class LXDDriverTest(test.NoDBTestCase):
lxd_driver = driver.LXDDriver(None)
value = lxd_driver.get_available_resource(None)
self.assertEqual(expected, value)
return
value = self.connection.get_available_resource(None)
# This is funky, but json strings make for fragile tests.
value['cpu_info'] = json.loads(value['cpu_info'])
value['supported_instances'] = [[arch.I686, hv_type.LXD,
vm_mode.EXE],
[arch.X86_64, hv_type.LXD,
vm_mode.EXE],
[arch.I686, hv_type.LXC,
vm_mode.EXE],
[arch.X86_64, hv_type.LXC,
vm_mode.EXE]]
expected = {'cpu_info': {u'arch': platform.uname()[5],
u'features': u'fake flag goes here',
u'model': u'Fake CPU',
u'topology': {u'cores': u'5',
u'sockets': u'10',
u'threads': u'4'},
u'vendor': u'FakeVendor'},
'hypervisor_hostname': 'fake_hostname',
'hypervisor_type': 'lxd',
'hypervisor_version': '011',
'local_gb': 1000,
'local_gb_used': 500,
'memory_mb': 10000,
'memory_mb_used': 8000,
'numa_topology': None,
'supported_instances': [[arch.I686, hv_type.LXD,
vm_mode.EXE],
[arch.X86_64, hv_type.LXD,
vm_mode.EXE],
[arch.I686, hv_type.LXC,
vm_mode.EXE],
[arch.X86_64, hv_type.LXC,
vm_mode.EXE]],
'vcpus': 200,
'vcpus_used': 0}
self.assertEqual(expected, value)
execute.assert_called_once_with('lscpu')
self.assertEqual([mock.call('/proc/cpuinfo', 'r'),
mock.call('/proc/meminfo')],
open.call_args_list)
statvfs.assert_called_once_with('/fake/lxd/root')
def test_refresh_instance_security_rules(self):
ctx = context.get_admin_context()
instance = fake_instance.fake_instance_obj(ctx, name='test')
firewall = mock.Mock()
lxd_driver = driver.LXDDriver(None)
lxd_driver.firewall_driver = firewall
lxd_driver.refresh_instance_security_rules(instance)
firewall.refresh_instance_security_rules.assert_called_once_with(
instance)
def test_ensure_filtering_rules_for_instance(self):
ctx = context.get_admin_context()
instance = fake_instance.fake_instance_obj(ctx, name='test')
firewall = mock.Mock()
network_info = object()
lxd_driver = driver.LXDDriver(None)
lxd_driver.firewall_driver = firewall
lxd_driver.ensure_filtering_rules_for_instance(instance, network_info)
firewall.ensure_filtering_rules_for_instance.assert_called_once_with(
instance, network_info)
def test_filter_defer_apply_on(self):
firewall = mock.Mock()
lxd_driver = driver.LXDDriver(None)
lxd_driver.firewall_driver = firewall
lxd_driver.filter_defer_apply_on()
firewall.filter_defer_apply_on.assert_called_once_with()
def test_filter_defer_apply_off(self):
firewall = mock.Mock()
lxd_driver = driver.LXDDriver(None)
lxd_driver.firewall_driver = firewall
lxd_driver.filter_defer_apply_off()
firewall.filter_defer_apply_off.assert_called_once_with()
def test_unfilter_instance(self):
ctx = context.get_admin_context()
instance = fake_instance.fake_instance_obj(ctx, name='test')
firewall = mock.Mock()
network_info = object()
lxd_driver = driver.LXDDriver(None)
lxd_driver.firewall_driver = firewall
lxd_driver.unfilter_instance(instance, network_info)
firewall.unfilter_instance.assert_called_once_with(
instance, network_info)
@mock.patch.object(driver.utils, 'execute')
def test_get_host_uptime(self, execute):
expected = '00:00:00 up 0 days, 0:00 , 0 users, load average: 0'
execute.return_value = (expected, 'stderr')
lxd_driver = driver.LXDDriver(None)
result = lxd_driver.get_host_uptime()
self.assertEqual(expected, result)
@mock.patch('nova.virt.lxd.driver.psutil.cpu_times')
@mock.patch('nova.virt.lxd.driver.open')
@mock.patch.object(driver.utils, 'execute')
def test_get_host_cpu_stats(self, execute, open, cpu_times):
cpu_times.return_value = [
'1', 'b', '2', '3', '4'
]
execute.return_value = (
'Model name: Fake CPU\n'
'Vendor ID: FakeVendor\n'
'Socket(s): 10\n'
'Core(s) per socket: 5\n'
'Thread(s) per core: 4\n\n',
None)
open.return_value = six.moves.cStringIO(
'flags: fake flag goes here\n'
'processor: 2\n\n')
expected = {
'user': 1, 'iowait': 4, 'frequency': 0, 'kernel': 2, 'idle': 3}
lxd_driver = driver.LXDDriver(None)
result = lxd_driver.get_host_cpu_stats()
self.assertEqual(expected, result)
def test_get_volume_connector(self):
expected = {
'host': 'fakehost',
'initiator': 'fake',
'ip': self.CONF.my_block_storage_ip
}
ctx = context.get_admin_context()
instance = fake_instance.fake_instance_obj(ctx, name='test')
lxd_driver = driver.LXDDriver(None)
result = lxd_driver.get_volume_connector(instance)
self.assertEqual(expected, result)
@mock.patch('nova.virt.lxd.driver.socket.gethostname')
def test_get_available_nodes(self, gethostname):
gethostname.return_value = 'nova-lxd'
expected = ['nova-lxd']
lxd_driver = driver.LXDDriver(None)
result = lxd_driver.get_available_nodes()
self.assertEqual(expected, result)

View File

@ -12,14 +12,8 @@
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import inspect
import os
import ddt
import mock
from oslo_config import cfg
from nova import test
from nova.virt import fake
@ -28,15 +22,6 @@ from nova.virt.lxd import utils as container_dir
import stubs
class LXDTestConfig(test.NoDBTestCase):
def test_config(self):
self.assertIsInstance(driver.CONF.lxd, cfg.ConfigOpts.GroupAttr)
self.assertEqual(os.path.abspath('/var/lib/lxd'),
os.path.abspath(driver.CONF.lxd.root_dir))
self.assertEqual(-1, driver.CONF.lxd.timeout)
@ddt.ddt
@mock.patch.object(container_dir, 'CONF', stubs.MockConf())
@mock.patch.object(driver, 'CONF', stubs.MockConf())
@ -56,51 +41,6 @@ class LXDTestDriver(test.NoDBTestCase):
self.driver = driver.LXDDriver(mock.MagicMock())
self.driver.container_migrate = mock.MagicMock()
def test_capabilities(self):
self.assertFalse(self.connection.capabilities['has_imagecache'])
self.assertFalse(self.connection.capabilities['supports_recreate'])
self.assertFalse(
self.connection.capabilities['supports_migrate_to_same_host'])
self.assertTrue(
self.connection.capabilities['supports_attach_interface'])
@stubs.annotated_data(
('refresh_instance_security_rules', (mock.Mock(),)),
('ensure_filtering_rules_for_instance', (mock.Mock(), mock.Mock())),
('filter_defer_apply_on',),
('filter_defer_apply_off',),
('unfilter_instance', (mock.Mock(), mock.Mock())),
)
def test_firewall_calls(self, name, args=()):
with mock.patch.object(self.connection,
'firewall_driver') as mf:
driver_method = getattr(self.connection, name)
firewall_method = getattr(mf, name)
self.assertEqual(
firewall_method.return_value,
driver_method(*args))
firewall_method.assert_called_once_with(*args)
@mock.patch.object(driver.utils, 'execute')
def test_get_host_uptime(self, me):
me.return_value = ('out', 'err')
self.assertEqual('out',
self.connection.get_host_uptime())
@mock.patch('socket.gethostname', mock.Mock(return_value='mock_hostname'))
def test_get_available_nodes(self):
self.assertEqual(
['mock_hostname'], self.connection.get_available_nodes())
@mock.patch('socket.gethostname', mock.Mock(return_value='mock_hostname'))
@stubs.annotated_data(
('mock_hostname', True),
('wrong_hostname', False),
)
def test_node_is_available(self, nodename, available):
self.assertEqual(available,
self.connection.node_is_available(nodename))
def test_pre_live_migration(self):
"""Verify the pre_live_migration call."""
self.driver.pre_live_migration(
@ -195,67 +135,3 @@ class LXDTestDriver(test.NoDBTestCase):
mock.sentinel.dest_check_data,
mock.sentinel.block_device_info
)
@ddt.ddt
class LXDTestDriverNoops(test.NoDBTestCase):
def setUp(self):
super(LXDTestDriverNoops, self).setUp()
self.connection = driver.LXDDriver(fake.FakeVirtAPI())
@ddt.data(
'list_instance_uuids',
'get_diagnostics',
'get_instance_diagnostics',
'get_all_bw_counters',
'get_all_volume_usage',
'soft_delete',
'check_instance_shared_storage_local',
'check_instance_shared_storage_remote',
'get_instance_disk_info',
'poll_rebooting_instances',
'host_power_action',
'host_maintenance_mode',
'set_host_enabled',
'block_stats',
'add_to_aggregate',
'remove_from_aggregate',
'undo_aggregate_operation',
'volume_snapshot_create',
'volume_snapshot_delete',
'quiesce',
'unquiesce',
)
def test_notimplemented(self, method):
call = getattr(self.connection, method)
argspec = inspect.getargspec(call)
self.assertRaises(
NotImplementedError,
call,
*([None] * (len(argspec.args) - 1)))
@ddt.data(
'post_interrupted_snapshot_cleanup',
'check_instance_shared_storage_cleanup',
'manage_image_cache',
)
def test_pass(self, method):
call = getattr(self.connection, method)
argspec = inspect.getargspec(call)
self.assertEqual(
None,
call(*([None] * (len(argspec.args) - 1))))
@stubs.annotated_data(
('deallocate_networks_on_reschedule', False),
('macs_for_instance', None),
('get_per_instance_usage', {}),
('instance_on_disk', False),
)
def test_return(self, method, expected):
call = getattr(self.connection, method)
argspec = inspect.getargspec(call)
self.assertEqual(
expected,
call(*([None] * (len(argspec.args) - 1))))

View File

@ -706,6 +706,100 @@ class LXDDriver(driver.ComputeDriver):
return data
# XXX: rockstar (20 Jul 2016) - nova-lxd does not support
# `get_instance_disk_info`
# XXX: rockstar (20 Jul 2016) - nova-lxd does not support
# `refresh_security_group_rules`
def refresh_instance_security_rules(self, instance):
return self.firewall_driver.refresh_instance_security_rules(
instance)
# XXX: rockstar (20 Jul 2016) - nova-lxd does not support
# `reset_network`
def ensure_filtering_rules_for_instance(self, instance, network_info):
return self.firewall_driver.ensure_filtering_rules_for_instance(
instance, network_info)
def filter_defer_apply_on(self):
return self.firewall_driver.filter_defer_apply_on()
def filter_defer_apply_off(self):
return self.firewall_driver.filter_defer_apply_off()
def unfilter_instance(self, instance, network_info):
return self.firewall_driver.unfilter_instance(
instance, network_info)
# XXX: rockstar (20 Jul 2016) - nova-lxd does not support
# `set_admin_password`
# XXX: rockstar (20 Jul 2016) - nova-lxd does not support
# `inject_file`
# XXX: rockstar (20 Jul 2016) - nova-lxd does not support
# `change_instance_metadata`
# XXX: rockstar (20 Jul 2016) - nova-lxd does not support
# `inject_network_info`
# XXX: rockstar (20 Jul 2016) - nova-lxd does not support
# `poll_rebooting_instances`
# XXX: rockstar (20 Jul 2016) - nova-lxd does not support
# `host_power_action`
# XXX: rockstar (20 Jul 2016) - nova-lxd does not support
# `host_power_action`
# XXX: rockstar (20 Jul 2016) - nova-lxd does not support
# `set_host_enabled`
def get_host_uptime(self):
out, err = utils.execute('env', 'LANG=C', 'uptime')
return out
# XXX: rockstar (20 Jul 2016) - nova-lxd does not support
# `plug_vifs`
# XXX: rockstar (20 Jul 2016) - nova-lxd does not support
# `unplug_vifs`
def get_host_cpu_stats(self):
return {
'kernel': int(psutil.cpu_times()[2]),
'idle': int(psutil.cpu_times()[3]),
'user': int(psutil.cpu_times()[0]),
'iowait': int(psutil.cpu_times()[4]),
'frequency': _get_cpu_info().get('cpu mhz', 0)
}
# XXX: rockstar (20 Jul 2016) - nova-lxd does not support
# `block_stats`
# XXX: rockstar (20 Jul 2016) - nova-lxd does not support
# `add_to_aggregate`
# XXX: rockstar (20 Jul 2016) - nova-lxd does not support
# `remove_from_aggregate`
# XXX: rockstar (20 Jul 2016) - nova-lxd does not support
# `undo_aggregate_operation`
def get_volume_connector(self, instance):
return {'ip': CONF.my_block_storage_ip,
'initiator': 'fake',
'host': 'fakehost'}
def get_available_nodes(self, refresh=False):
hostname = socket.gethostname()
return [hostname]
# XXX: rockstar (20 Jul 2016) - nova-lxd does not support
# `volume_snapshot_create`
# XXX: rockstar (20 Jul 2016) - nova-lxd does not support
# `volume_snapshot_delete`
# XXX: rockstar (20 Jul 2016) - nova-lxd does not support
# `default_root_device_name`
# XXX: rockstar (20 Jul 2016) - nova-lxd does not support
# `default_device_names_for_instance`
# XXX: rockstar (20 Jul 2016) - nova-lxd does not support
# `get_device_name_for_instance`
# XXX: rockstar (20 Jul 2016) - nova-lxd does not support
# `quiesce`
# XXX: rockstar (20 Jul 2016) - nova-lxd does not support
# `unquiesce`
# XXX: rockstar (5 July 2016) - The methods and code below this line
# have not been through the cleanup process. We know the cleanup process
# is complete when there is no more code below this comment, and the
@ -834,101 +928,6 @@ class LXDDriver(driver.ComputeDriver):
block_device_info
)
# XXX: rockstar (20 Jul 2016) - nova-lxd does not support
# `get_instance_disk_info`
# XXX: rockstar (20 Jul 2016) - nova-lxd does not support
# `refresh_security_group_rules`
def refresh_instance_security_rules(self, instance):
return self.firewall_driver.refresh_instance_security_rules(
instance)
# XXX: rockstar (20 Jul 2016) - nova-lxd does not support
# `reset_network`
def ensure_filtering_rules_for_instance(self, instance, network_info):
return self.firewall_driver.ensure_filtering_rules_for_instance(
instance, network_info)
def filter_defer_apply_on(self):
return self.firewall_driver.filter_defer_apply_on()
def filter_defer_apply_off(self):
return self.firewall_driver.filter_defer_apply_off()
def unfilter_instance(self, instance, network_info):
return self.firewall_driver.unfilter_instance(
instance, network_info)
# XXX: rockstar (20 Jul 2016) - nova-lxd does not support
# `set_admin_password`
# XXX: rockstar (20 Jul 2016) - nova-lxd does not support
# `inject_file`
# XXX: rockstar (20 Jul 2016) - nova-lxd does not support
# `change_instance_metadata`
# XXX: rockstar (20 Jul 2016) - nova-lxd does not support
# `inject_network_info`
# XXX: rockstar (20 Jul 2016) - nova-lxd does not support
# `poll_rebooting_instances`
# XXX: rockstar (20 Jul 2016) - nova-lxd does not support
# `host_power_action`
# XXX: rockstar (20 Jul 2016) - nova-lxd does not support
# `host_power_action`
# XXX: rockstar (20 Jul 2016) - nova-lxd does not support
# `set_host_enabled`
def get_host_uptime(self):
out, err = utils.execute('env', 'LANG=C', 'uptime')
return out
# XXX: rockstar (20 Jul 2016) - nova-lxd does not support
# `plug_vifs`
# XXX: rockstar (20 Jul 2016) - nova-lxd does not support
# `unplug_vifs`
def get_host_cpu_stats(self):
cpuinfo = self._get_cpu_info()
return {
'kernel': int(psutil.cpu_times()[2]),
'idle': int(psutil.cpu_times()[3]),
'user': int(psutil.cpu_times()[0]),
'iowait': int(psutil.cpu_times()[4]),
'frequency': cpuinfo.get('cpu mhz', 0)
}
# XXX: rockstar (20 Jul 2016) - nova-lxd does not support
# `block_stats`
# XXX: rockstar (20 Jul 2016) - nova-lxd does not support
# `add_to_aggregate`
# XXX: rockstar (20 Jul 2016) - nova-lxd does not support
# `remove_from_aggregate`
# XXX: rockstar (20 Jul 2016) - nova-lxd does not support
# `undo_aggregate_operation`
def get_volume_connector(self, instance):
return {'ip': CONF.my_block_storage_ip,
'initiator': 'fake',
'host': 'fakehost'}
def get_available_nodes(self, refresh=False):
hostname = socket.gethostname()
return [hostname]
# XXX: rockstar (20 Jul 2016) - nova-lxd does not support
# `volume_snapshot_create`
# XXX: rockstar (20 Jul 2016) - nova-lxd does not support
# `volume_snapshot_delete`
# XXX: rockstar (20 Jul 2016) - nova-lxd does not support
# `default_root_device_name`
# XXX: rockstar (20 Jul 2016) - nova-lxd does not support
# `default_device_names_for_instance`
# XXX: rockstar (20 Jul 2016) - nova-lxd does not support
# `get_device_name_for_instance`
# XXX: rockstar (20 Jul 2016) - nova-lxd does not support
# `quiesce`
# XXX: rockstar (20 Jul 2016) - nova-lxd does not support
# `unquiesce`
#
# LXDDriver "private" implementation methods
#