Merge "Update and test the last of the LXDDriver non-migration methods"
This commit is contained in:
commit
bd34627ac5
|
@ -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)
|
||||
|
|
|
@ -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))))
|
||||
|
|
|
@ -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
|
||||
#
|
||||
|
|
Loading…
Reference in New Issue