[lxc-devel] [nova-lxd/master] Pylxd2.0 defined
zulcss on Github
lxc-bot at linuxcontainers.org
Wed Jun 8 16:47:22 UTC 2016
A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 615 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20160608/860e2051/attachment.bin>
-------------- next part --------------
From 9d968e10f00177fd0cd7c520d43c0ce27492bd2b Mon Sep 17 00:00:00 2001
From: Chuck Short <chuck.short at canonical.com>
Date: Wed, 8 Jun 2016 12:28:37 -0400
Subject: [PATCH 1/3] Remove container_defined method
Remove the container_defined method since pylxd will
raise an exception if the container does not exist.
Signed-off-by: Chuck Short <chuck.short at canonical.com>
---
nova/tests/unit/virt/lxd/test_driver_api.py | 13 -------------
nova/tests/unit/virt/lxd/test_migrate.py | 8 --------
nova/tests/unit/virt/lxd/test_operations.py | 3 ---
nova/tests/unit/virt/lxd/test_session.py | 19 -------------------
nova/virt/lxd/container_snapshot.py | 4 ----
nova/virt/lxd/migrate.py | 15 ---------------
nova/virt/lxd/operations.py | 3 ---
nova/virt/lxd/session.py | 25 -------------------------
8 files changed, 90 deletions(-)
diff --git a/nova/tests/unit/virt/lxd/test_driver_api.py b/nova/tests/unit/virt/lxd/test_driver_api.py
index ea07616..83dfad2 100644
--- a/nova/tests/unit/virt/lxd/test_driver_api.py
+++ b/nova/tests/unit/virt/lxd/test_driver_api.py
@@ -153,19 +153,6 @@ def test_list_instances_fail(self):
)
@stubs.annotated_data(
- ('exists', [True], exception.InstanceExists),
- ('fail', lxd_exceptions.APIError('Fake', 500), exception.NovaException)
- )
- def test_spawn_defined(self, tag, side_effect, expected):
- instance = stubs.MockInstance()
- self.ml.container_defined.side_effect = side_effect
- self.assertRaises(
- expected,
- self.connection.spawn,
- {}, instance, {}, [], 'secret')
- self.ml.container_defined.called_once_with('mock_instance')
-
- @stubs.annotated_data(
('undefined', False),
('404', lxd_exceptions.APIError('Not found', 404)),
)
diff --git a/nova/tests/unit/virt/lxd/test_migrate.py b/nova/tests/unit/virt/lxd/test_migrate.py
index fe8e4dc..3f92f0f 100644
--- a/nova/tests/unit/virt/lxd/test_migrate.py
+++ b/nova/tests/unit/virt/lxd/test_migrate.py
@@ -45,11 +45,9 @@ def test_migrate_disk_power_off_resize(self):
dest = 'fakeip'
with test.nested(
- mock.patch.object(session.LXDAPISession, 'container_defined'),
mock.patch.object(config.LXDContainerConfig, 'create_profile'),
mock.patch.object(session.LXDAPISession, 'profile_update')
) as (
- mock_container_defined,
mock_create_profile,
mock_profile_update
):
@@ -57,8 +55,6 @@ def test_migrate_disk_power_off_resize(self):
self.migrate.migrate_disk_and_power_off(
context, instance, dest, flavor,
network_info))
- mock_container_defined.assert_called_once_with(instance.name,
- instance)
mock_create_profile.assert_called_once_with(instance,
network_info)
@@ -68,13 +64,11 @@ def test_confirm_migration(self):
network_info = mock.Mock()
with test.nested(
- mock.patch.object(session.LXDAPISession, 'container_defined'),
mock.patch.object(session.LXDAPISession, 'profile_delete'),
mock.patch.object(session.LXDAPISession, 'container_destroy'),
mock.patch.object(operations.LXDContainerOperations,
'unplug_vifs'),
) as (
- mock_container_defined,
mock_profile_delete,
mock_container_destroy,
mock_unplug_vifs):
@@ -82,8 +76,6 @@ def test_confirm_migration(self):
self.migrate.confirm_migration(migration,
instance,
network_info))
- mock_container_defined.assert_called_once_with(instance.name,
- instance)
mock_profile_delete.assert_called_once_with(instance)
mock_unplug_vifs.assert_called_once_with(instance,
network_info)
diff --git a/nova/tests/unit/virt/lxd/test_operations.py b/nova/tests/unit/virt/lxd/test_operations.py
index 163f203..cda01cd 100644
--- a/nova/tests/unit/virt/lxd/test_operations.py
+++ b/nova/tests/unit/virt/lxd/test_operations.py
@@ -61,7 +61,6 @@ def test_spawn_container(self):
block_device_info = mock.Mock()
with test.nested(
- mock.patch.object(session.LXDAPISession, 'container_defined'),
mock.patch.object(container_ops.LXDContainerOperations,
'_fetch_image'),
mock.patch.object(container_ops.LXDContainerOperations,
@@ -73,14 +72,12 @@ def test_spawn_container(self):
mock.patch.object(container_ops.LXDContainerOperations,
'_setup_container')
) as (
- mock_container_defined,
mock_fetch_image,
mock_setup_network,
mock_setup_profile,
mock_add_configdrive,
mock_setup_container
):
- mock_container_defined.return_value = False
self.assertEqual(None,
self.operations.spawn(context, instance,
image_meta,
diff --git a/nova/tests/unit/virt/lxd/test_session.py b/nova/tests/unit/virt/lxd/test_session.py
index e142c22..0be5d4e 100644
--- a/nova/tests/unit/virt/lxd/test_session.py
+++ b/nova/tests/unit/virt/lxd/test_session.py
@@ -229,25 +229,6 @@ def test_container_info_fail(self):
self.session.container_info, instance)
@stubs.annotated_data(
- ('exists', True),
- ('missing', False),
- )
- def test_container_defined(self, tag, side_effect):
- """
- container_defined returns True if the container
- exists on an LXD host, False otherwise, verify
- the apporiate return value is returned.
- """
- instance = stubs._fake_instance()
- self.ml.container_defined.return_value = side_effect
- if side_effect:
- self.assertTrue(self.session.container_defined(
- instance.name, instance))
- if not side_effect:
- self.assertFalse(self.session.container_defined(
- instance.name, instance))
-
- @stubs.annotated_data(
('1', True, (200, fake_api.fake_operation_info_ok()))
)
def test_container_start(self, tag, defined, side_effect=None):
diff --git a/nova/virt/lxd/container_snapshot.py b/nova/virt/lxd/container_snapshot.py
index 3f750e0..9794c6d 100644
--- a/nova/virt/lxd/container_snapshot.py
+++ b/nova/virt/lxd/container_snapshot.py
@@ -16,7 +16,6 @@
import nova.conf
from nova.compute import task_states
-from nova import exception
from nova import i18n
from nova import image
import os
@@ -65,9 +64,6 @@ def snapshot(self, context, instance, image_id, update_task_state):
LOG.debug('snapshot called for instance', instance=instance)
try:
- if not self.session.container_defined(instance.name, instance):
- raise exception.InstanceNotFound(instance_id=instance.name)
-
with lockutils.lock(self.lock_path,
lock_file_prefix=('lxd-snapshot-%s' %
instance.name),
diff --git a/nova/virt/lxd/migrate.py b/nova/virt/lxd/migrate.py
index d8978d2..f5a2ba9 100644
--- a/nova/virt/lxd/migrate.py
+++ b/nova/virt/lxd/migrate.py
@@ -16,7 +16,6 @@
import os
import nova.conf
-from nova import exception
from nova import i18n
from nova import utils
from nova.virt import configdrive
@@ -63,10 +62,6 @@ def migrate_disk_and_power_off(self, context, instance, dest,
else:
LOG.debug('Migration target host: %s' % dest)
- if not self.session.container_defined(instance.name, instance):
- msg = _('Instance is not found.')
- raise exception.NovaException(msg)
-
try:
if same_host:
container_profile = self.config.create_profile(instance,
@@ -87,11 +82,6 @@ def migrate_disk_and_power_off(self, context, instance, dest,
def confirm_migration(self, migration, instance, network_info):
LOG.debug("confirm_migration called", instance=instance)
- if not self.session.container_defined(instance.name, instance):
- msg = _('Failed to find container %(instance)s') % \
- {'instance': instance.name}
- raise exception.NovaException(msg)
-
try:
self.session.profile_delete(instance)
self.session.container_destroy(instance.name,
@@ -108,9 +98,6 @@ def finish_migration(self, context, migration, instance, disk_info,
block_device_info=None, power_on=True):
LOG.debug("finish_migration called", instance=instance)
- if self.session.container_defined(instance.name, instance):
- return
-
try:
# Ensure that the instance directory exists
instance_dir = \
@@ -156,8 +143,6 @@ def finish_revert_migration(self, context, instance, network_info,
block_device_info=None, power_on=True):
LOG.debug('finish_revert_migration called for instance',
instance=instance)
- if self.session.container_defined(instance.name, instance):
- self.session.container_start(instance.name, instance)
def _get_hostname(self, host, instance):
LOG.debug('_get_hostname called for instance', instance=instance)
diff --git a/nova/virt/lxd/operations.py b/nova/virt/lxd/operations.py
index a7d1dae..1a7bf61 100644
--- a/nova/virt/lxd/operations.py
+++ b/nova/virt/lxd/operations.py
@@ -107,9 +107,6 @@ def spawn(self, context, instance, image_meta, injected_files,
instance_name = instance.name
- if self.session.container_defined(instance_name, instance):
- raise exception.InstanceExists(name=instance.name)
-
try:
# Ensure that the instance directory exists
diff --git a/nova/virt/lxd/session.py b/nova/virt/lxd/session.py
index 65d415b..7cfc279 100644
--- a/nova/virt/lxd/session.py
+++ b/nova/virt/lxd/session.py
@@ -225,31 +225,6 @@ def container_info(self, instance):
{'instance': instance.name, 'reason': e},
instance=instance)
- def container_defined(self, instance_name, instance):
- """Determine if the container exists
-
- :param instance_name: container anme
- :param instance: nova instance opbject
- :return: True if exists otherwise False
-
- """
- LOG.debug('container_defined for instance', instance=instance)
- try:
- client = self.get_session()
- return client.container_defined(instance_name)
- except lxd_exceptions.APIError as ex:
- if ex.status_code == 404:
- return False
- else:
- msg = _('Failed to get container status: %s') % ex
- raise exception.NovaException(msg)
- except Exception as e:
- with excutils.save_and_reraise_exception():
- LOG.error(_LE('Error from LXD during container_defined'
- '%(instance)s: %(reason)s'),
- {'instance': instance.name, 'reason': e},
- instance=instance)
-
def container_start(self, instance_name, instance):
"""Start an LXD container
From dd5d8a5ae318c1d0b26035456996b7b1b06fcbfb Mon Sep 17 00:00:00 2001
From: Chuck Short <chuck.short at canonical.com>
Date: Wed, 8 Jun 2016 12:31:08 -0400
Subject: [PATCH 2/3] Remove image_defined method
Remove the image_defined method since pylxd will raise
an exception if the fingerprint is not found.
Signed-off-by: Chuck Short <chuck.short at canonical.com>
---
nova/tests/unit/virt/lxd/test_session.py | 8 --------
nova/virt/lxd/image.py | 3 ---
nova/virt/lxd/session.py | 28 ----------------------------
3 files changed, 39 deletions(-)
diff --git a/nova/tests/unit/virt/lxd/test_session.py b/nova/tests/unit/virt/lxd/test_session.py
index 0be5d4e..953cb00 100644
--- a/nova/tests/unit/virt/lxd/test_session.py
+++ b/nova/tests/unit/virt/lxd/test_session.py
@@ -513,14 +513,6 @@ def setUp(self):
self.session = session.LXDAPISession()
- def test_image_defined(self):
- """Test the image is defined in the LXD hypervisor."""
- instance = stubs._fake_instance()
- self.ml.alias_defined.return_value = True
- self.assertTrue(self.session.image_defined(instance))
- calls = [mock.call.alias_defined(instance.image_ref)]
- self.assertEqual(calls, self.ml.method_calls)
-
def test_alias_create(self):
"""Test the alias is created."""
instance = stubs._fake_instance()
diff --git a/nova/virt/lxd/image.py b/nova/virt/lxd/image.py
index dee13ac..dda3364 100644
--- a/nova/virt/lxd/image.py
+++ b/nova/virt/lxd/image.py
@@ -75,9 +75,6 @@ def setup_image(self, context, instance, image_meta):
instance.image_ref),
external=True):
- if self.client.image_defined(instance):
- return
-
base_dir = self.container_dir.get_base_dir()
if not os.path.exists(base_dir):
fileutils.ensure_tree(base_dir)
diff --git a/nova/virt/lxd/session.py b/nova/virt/lxd/session.py
index 7cfc279..71cb1f5 100644
--- a/nova/virt/lxd/session.py
+++ b/nova/virt/lxd/session.py
@@ -467,34 +467,6 @@ def container_init(self, config, instance):
#
# Image related API methods.
#
-
- def image_defined(self, instance):
- """Checks existence of an image on the local LXD image store
-
- :param instance: The nova instance
-
- Returns True if supplied image exists on the host, False otherwise
- """
- LOG.debug('image_defined called for instance', instance=instance)
- try:
- client = self.get_session()
- return client.alias_defined(instance.image_ref)
- except lxd_exceptions.APIError as ex:
- if ex.status_code == 404:
- return False
- else:
- msg = _('Failed to communicate with LXD API %(instance)s:'
- ' %(reason)s') % {'instance': instance.image_ref,
- 'reason': ex}
- LOG.error(msg)
- raise exception.NovaException(msg)
- except Exception as e:
- with excutils.save_and_reraise_exception():
- LOG.error(_LE('Error from LXD during image_defined '
- '%(instance)s: %(reason)s'),
- {'instance': instance.image_ref, 'reason': e},
- instance=instance)
-
def create_alias(self, alias, instance):
"""Creates an alias for a given image
From f2943bc25b606bc0e5af7ec70d80ca4d04008cd1 Mon Sep 17 00:00:00 2001
From: Chuck Short <chuck.short at canonical.com>
Date: Wed, 8 Jun 2016 12:38:08 -0400
Subject: [PATCH 3/3] Remove profile_defined method
Remove profile_defined method since pylxd will raise an
exception if the profile is not available.
Signed-off-by: Chuck Short <chuck.short at canonical.com>
---
nova/tests/unit/virt/lxd/test_session.py | 23 ++-----------
nova/virt/lxd/session.py | 55 --------------------------------
2 files changed, 2 insertions(+), 76 deletions(-)
diff --git a/nova/tests/unit/virt/lxd/test_session.py b/nova/tests/unit/virt/lxd/test_session.py
index 953cb00..1308b53 100644
--- a/nova/tests/unit/virt/lxd/test_session.py
+++ b/nova/tests/unit/virt/lxd/test_session.py
@@ -538,41 +538,22 @@ def setUp(self):
self.session = session.LXDAPISession()
- @stubs.annotated_data(
- ('empty', [], []),
- ('valid', ['test'], ['test']),
- )
- def test_profile_list(self, tag, side_effect, expected):
- self.ml.profile_list.return_value = side_effect
- self.assertEqual(expected,
- self.session.profile_list())
-
- def test_profile_list_fail(self):
- self.ml.profile_list.side_effect = (
- lxd_exceptions.APIError('Fake', 500))
- self.assertRaises(
- exception.NovaException,
- self.session.profile_list)
-
def test_profile_create(self):
instance = stubs._fake_instance()
config = mock.Mock()
- self.ml.profile_defined.return_value = True
self.ml.profile_create.return_value = \
(200, fake_api.fake_standard_return())
self.assertEqual((200, fake_api.fake_standard_return()),
self.session.profile_create(config,
instance))
- calls = [mock.call.profile_list(),
- mock.call.profile_create(config)]
+ calls = [mock.call.profile_create(config)]
self.assertEqual(calls, self.ml.method_calls)
def test_profile_delete(self):
instance = stubs._fake_instance()
- self.ml.profile_defined.return_value = True
self.ml.profile_delete.return_value = \
(200, fake_api.fake_standard_return())
- self.assertEqual(None,
+ self.assertEqual((200, fake_api.fake_standard_return()),
self.session.profile_delete(instance))
diff --git a/nova/virt/lxd/session.py b/nova/virt/lxd/session.py
index 71cb1f5..6e6d8e4 100644
--- a/nova/virt/lxd/session.py
+++ b/nova/virt/lxd/session.py
@@ -572,48 +572,6 @@ def operation_info(self, operation_id, instance):
#
# Profile methods
#
- def profile_list(self):
- LOG.debug('profile_list called for instance')
- try:
- client = self.get_session()
- return client.profile_list()
- except lxd_exceptions.APIError as ex:
- msg = _('Failed to communicate with LXD API: %(reason)s') \
- % {'reason': ex}
- LOG.error(msg)
- raise exception.NovaException(msg)
- except Exception as ex:
- with excutils.save_and_reraise_exception():
- LOG.error(_LE('Error from LXD during profile_list: '
- '%(reason)s') % {'reason': ex})
-
- def profile_defined(self, instance_name, instance):
- """Validate if the profile is available on the LXD
- host
-
- :param instance: nova instance object
- """
- LOG.debug('profile_defined called for instance',
- instance=instance)
- try:
- found = False
- if instance_name in self.profile_list():
- found = True
- return found
- except lxd_exceptions.APIError as ex:
- if ex.status_code == 404:
- return False
- else:
- msg = _('Failed to communicate with LXD API %(instance)s:'
- ' %(reason)s') % {'instance': instance.name,
- 'reason': ex}
- raise exception.NovaException(msg)
- except Exception as ex:
- with excutils.save_and_reraise_exception():
- LOG.error(
- _LE('Failed to determine profile %(instance)s:'
- ' %(reason)s'),
- {'instance': instance.name, 'reason': ex})
def profile_create(self, config, instance):
"""Create an LXD container profile
@@ -624,11 +582,6 @@ def profile_create(self, config, instance):
LOG.debug('profile_create called for instance',
instance=instance)
try:
- if self.profile_defined(instance.name, instance):
- msg = _('Profile already exists %(instance)s') % \
- {'instance': instance.name}
- raise exception.NovaException(msg)
-
client = self.get_session()
return client.profile_create(config)
except lxd_exceptions.APIError as ex:
@@ -650,11 +603,6 @@ def profile_update(self, config, instance):
"""
LOG.debug('profile_udpate called for instance', instance=instance)
try:
- if not self.profile_defined(instance.name, instance):
- msg = _('Profile not found %(instance)s') % \
- {'instance': instance.name}
- raise exception.NovaException(msg)
-
client = self.get_session()
return client.profile_update(instance.name, config)
except lxd_exceptions.APIError as ex:
@@ -676,9 +624,6 @@ def profile_delete(self, instance):
"""
LOG.debug('profile_delete called for instance', instance=instance)
try:
- if not self.profile_defined(instance.name, instance):
- return
-
client = self.get_session()
return client.profile_delete(instance.name)
except lxd_exceptions.APIError as ex:
More information about the lxc-devel
mailing list