[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