Browse Source

Remove dependency on cinder in favour of openstacksdk

Nuwan Goonasekera 6 năm trước cách đây
mục cha
commit
9466cc3640

+ 3 - 2
cloudbridge/base/resources.py

@@ -165,8 +165,9 @@ class BaseObjectLifeCycleMixin(ObjectLifeCycleMixin):
                 time.sleep(interval)
                 if time.time() > end_time:
                     raise WaitStateException(
-                        "Waited too long for object: {0} to become ready. It's"
-                        " still in state: {1}".format(self, self.state))
+                        "Waited too long for object: {0} to reach a desired"
+                        "state: {1}. It's still in state: {2}".format(
+                            self, target_states, self.state))
             self.refresh()
         log.debug("Object: %s successfully reached target state: %s",
                   self, self.state)

+ 0 - 20
cloudbridge/providers/openstack/provider.py

@@ -2,8 +2,6 @@
 
 import inspect
 
-from cinderclient import client as cinder_client
-
 from keystoneauth1 import session
 
 from keystoneclient import client as keystone_client
@@ -60,7 +58,6 @@ class OpenStackCloudProvider(BaseCloudProvider):
         self._nova = None
         self._keystone = None
         self._glance = None
-        self._cinder = None
         self._swift = None
         self._neutron = None
         self._os_conn = None
@@ -146,12 +143,6 @@ class OpenStackCloudProvider(BaseCloudProvider):
 #             self._glance = self._connect_glance()
 #         return self._glance
 
-    @property
-    def cinder(self):
-        if not self._cinder:
-            self._cinder = self._connect_cinder()
-        return self._cinder
-
     @property
     def swift(self):
         if not self._swift:
@@ -237,17 +228,6 @@ class OpenStackCloudProvider(BaseCloudProvider):
             keystone.authenticate()
             return keystone
 
-    def _connect_cinder(self):
-        """Get an OpenStack Cinder (block storage) client object."""
-        api_version = self._get_config_value(
-            'os_volume_api_version',
-            get_env('OS_VOLUME_API_VERSION', 2))
-
-        return cinder_client.Client(api_version,
-                                    auth_url=self.auth_url,
-                                    session=self._keystone_session,
-                                    region_name=self.region_name)
-
 #     def _connect_glance(self):
 #         """
 #         Get an OpenStack Glance (VM images) client object for the given

+ 13 - 10
cloudbridge/providers/openstack/resources.py

@@ -586,7 +586,7 @@ class OpenStackVolume(BaseVolume):
         """
         self.assert_valid_resource_label(value)
         self._volume.name = value
-        self._volume.update(name=value or "")
+        self._volume.commit(self._provider.os_conn.block_storage)
 
     @property
     def description(self):
@@ -595,7 +595,7 @@ class OpenStackVolume(BaseVolume):
     @description.setter
     def description(self, value):
         self._volume.description = value
-        self._volume.update(description=value)
+        self._volume.commit(self._provider.os_conn.block_storage)
 
     @property
     def size(self):
@@ -634,13 +634,16 @@ class OpenStackVolume(BaseVolume):
         instance_id = instance.id if isinstance(
             instance,
             OpenStackInstance) else instance
-        self._volume.attach(instance_id, device)
+        self._provider.os_conn.compute.create_volume_attachment(
+            server=instance_id, volume_id=self.id, device=device)
 
     def detach(self, force=False):
         """
         Detach this volume from an instance.
         """
-        self._volume.detach()
+        for attachment in self._volume.attachments:
+            self._provider.os_conn.compute.delete_volume_attachment(
+                attachment['id'], attachment['server_id'])
 
     def create_snapshot(self, label, description=None):
         """
@@ -711,7 +714,7 @@ class OpenStackSnapshot(BaseSnapshot):
         """
         self.assert_valid_resource_label(value)
         self._snapshot.name = value
-        self._snapshot.update(name=value or "")
+        self._snapshot.commit(self._provider.os_conn.block_storage)
 
     @property
     def description(self):
@@ -720,7 +723,7 @@ class OpenStackSnapshot(BaseSnapshot):
     @description.setter
     def description(self, value):
         self._snapshot.description = value
-        self._snapshot.update(description=value)
+        self._snapshot.commit(self._provider.os_conn.block_storage)
 
     @property
     def size(self):
@@ -758,12 +761,12 @@ class OpenStackSnapshot(BaseSnapshot):
         """
         Create a new Volume from this Snapshot.
         """
-        vol_label = "from-snap-{0}".format(self.id or self.label)
+        vol_label = "from-snap-{0}".format(self.label or self.id)
         self.assert_valid_resource_label(vol_label)
         size = size if size else self._snapshot.size
-        os_vol = self._provider.cinder.volumes.create(
-            size, name=vol_label, availability_zone=self._provider.zone_name,
-            snapshot_id=self._snapshot.id)
+        os_vol = self._provider.os_conn.block_storage.create_volume(
+            size=size, name=vol_label, snapshot_id=self._snapshot.id,
+            availability_zone=self._provider.zone_name)
         cb_vol = OpenStackVolume(self._provider, os_vol)
         return cb_vol
 

+ 27 - 34
cloudbridge/providers/openstack/services.py

@@ -3,8 +3,6 @@ Services implemented by the OpenStack provider.
 """
 import logging
 
-from cinderclient.exceptions import NotFound as CinderNotFound
-
 from neutronclient.common.exceptions import NeutronClientException
 from neutronclient.common.exceptions import PortNotFoundClient
 
@@ -383,8 +381,8 @@ class OpenStackVolumeService(BaseVolumeService):
               priority=BaseVolumeService.STANDARD_EVENT_PRIORITY)
     def get(self, volume_id):
         try:
-            os_vol = self.provider.cinder.volumes.get(volume_id)
-        except CinderNotFound:
+            os_vol = self.provider.os_conn.block_storage.get_volume(volume_id)
+        except (NotFoundException, ResourceNotFound):
             log.debug("Volume %s was not found.", volume_id)
             return None
         if os_vol.availability_zone != self.provider.service_zone_name(self):
@@ -409,30 +407,24 @@ class OpenStackVolumeService(BaseVolumeService):
                 "attributes: %s" % (kwargs, 'label'))
 
         log.debug("Searching for an OpenStack Volume with the label %s", label)
-        search_opts = {'name': label,
-                       'availability_zone':
-                           self.provider.service_zone_name(self)}
         cb_vols = [
             OpenStackVolume(self.provider, vol)
-            for vol in self.provider.cinder.volumes.list(
-                search_opts=search_opts,
+            for vol in self.provider.os_conn.block_storage.volumes(
+                name=label,
                 limit=oshelpers.os_result_limit(self.provider),
-                marker=None)]
-
+                marker=None)
+            if vol.availability_zone == self.provider.service_zone_name(self)]
         return oshelpers.to_server_paged_list(self.provider, cb_vols)
 
     @dispatch(event="provider.storage.volumes.list",
               priority=BaseVolumeService.STANDARD_EVENT_PRIORITY)
     def list(self, limit=None, marker=None):
-        search_opts = {'availability_zone': self.provider
-                                                .service_zone_name(self)}
         cb_vols = [
             OpenStackVolume(self.provider, vol)
-            for vol in self.provider.cinder.volumes.list(
-                search_opts=search_opts,
+            for vol in self.provider.os_conn.block_storage.volumes(
                 limit=oshelpers.os_result_limit(self.provider, limit),
-                marker=marker)]
-
+                marker=marker)
+            if vol.availability_zone == self.provider.service_zone_name(self)]
         return oshelpers.to_server_paged_list(self.provider, cb_vols, limit)
 
     @dispatch(event="provider.storage.volumes.create",
@@ -443,19 +435,19 @@ class OpenStackVolumeService(BaseVolumeService):
         snapshot_id = snapshot.id if isinstance(
             snapshot, OpenStackSnapshot) and snapshot else snapshot
 
-        os_vol = self.provider.cinder.volumes.create(
-            size, name=label, description=description,
+        os_vol = self.provider.os_conn.block_storage.create_volume(
+            size=size, name=label, description=description,
             availability_zone=zone_name, snapshot_id=snapshot_id)
         return OpenStackVolume(self.provider, os_vol)
 
     @dispatch(event="provider.storage.volumes.delete",
               priority=BaseVolumeService.STANDARD_EVENT_PRIORITY)
     def delete(self, volume):
-        volume = (volume if isinstance(volume, OpenStackVolume)
-                  else self.get(volume))
-        if volume:
+        vol = (volume if isinstance(volume, OpenStackVolume)
+               else self.get(volume))
+        if vol:
             # pylint:disable=protected-access
-            volume._volume.delete()
+            self.provider.os_conn.block_storage.delete_volume(vol._volume)
 
 
 class OpenStackSnapshotService(BaseSnapshotService):
@@ -469,8 +461,8 @@ class OpenStackSnapshotService(BaseSnapshotService):
         try:
             return OpenStackSnapshot(
                 self.provider,
-                self.provider.cinder.volume_snapshots.get(snapshot_id))
-        except CinderNotFound:
+                self.provider.os_conn.block_storage.get_snapshot(snapshot_id))
+        except (NotFoundException, ResourceNotFound):
             log.debug("Snapshot %s was not found.", snapshot_id)
             return None
 
@@ -492,7 +484,8 @@ class OpenStackSnapshotService(BaseSnapshotService):
                   "params: %s", search_opts)
         cb_snaps = [
             OpenStackSnapshot(self.provider, snap) for
-            snap in self.provider.cinder.volume_snapshots.list(search_opts)
+            snap in self.provider.os_conn.block_storage.snapshots(
+                **search_opts)
             if snap.name == label]
 
         return oshelpers.to_server_paged_list(self.provider, cb_snaps)
@@ -501,11 +494,11 @@ class OpenStackSnapshotService(BaseSnapshotService):
               priority=BaseSnapshotService.STANDARD_EVENT_PRIORITY)
     def list(self, limit=None, marker=None):
         cb_snaps = [
-            OpenStackSnapshot(self.provider, snap) for
-            snap in self.provider.cinder.volume_snapshots.list(
-                search_opts={'limit': oshelpers.os_result_limit(self.provider,
-                                                                limit),
-                             'marker': marker})]
+            OpenStackSnapshot(self.provider, snap)
+            for snap in self.provider.os_conn.block_storage.snapshots(
+                limit=oshelpers.os_result_limit(self.provider, limit),
+                marker=marker)
+        ]
         return oshelpers.to_server_paged_list(self.provider, cb_snaps, limit)
 
     @dispatch(event="provider.storage.snapshots.create",
@@ -515,8 +508,8 @@ class OpenStackSnapshotService(BaseSnapshotService):
         volume_id = (volume.id if isinstance(volume, OpenStackVolume)
                      else volume)
 
-        os_snap = self.provider.cinder.volume_snapshots.create(
-            volume_id, name=label,
+        os_snap = self.provider.os_conn.block_storage.create_snapshot(
+            volume_id=volume_id, name=label,
             description=description)
         return OpenStackSnapshot(self.provider, os_snap)
 
@@ -527,7 +520,7 @@ class OpenStackSnapshotService(BaseSnapshotService):
              self.get(snapshot))
         if s:
             # pylint:disable=protected-access
-            s._snapshot.delete()
+            self.provider.os_conn.block_storage.delete_snapshot(s._snapshot)
 
 
 class OpenStackBucketService(BaseBucketService):

+ 5 - 6
setup.py

@@ -51,12 +51,11 @@ REQS_GCP = [
 ]
 REQS_OPENSTACK = [
     'openstacksdk>=0.12.0',
-    'python-novaclient>=7.0.0,<=11.0',
-    'python-glanceclient>=2.5.0,<=2.12',
-    'python-cinderclient>=1.9.0,<=4.0',
-    'python-swiftclient>=3.2.0,<=3.6',
-    'python-neutronclient>=6.0.0,<=6.9',
-    'python-keystoneclient>=3.13.0,<=3.17'
+    'python-novaclient>=7.0.0',
+    'python-glanceclient>=2.5.0',
+    'python-swiftclient>=3.2.0',
+    'python-neutronclient>=6.0.0',
+    'python-keystoneclient>=3.13.0'
 ]
 REQS_FULL = REQS_BASE + REQS_AWS + REQS_AZURE + REQS_GCP + REQS_OPENSTACK
 # httpretty is required with/for moto 1.0.0 or AWS tests fail

+ 2 - 1
tests/test_block_store_service.py

@@ -131,7 +131,8 @@ class CloudBlockStoreServiceTestCase(ProviderTestBase):
                 self.assertEqual(test_vol.attachments.instance_id,
                                  test_instance.id)
                 if (self.provider.PROVIDER_ID != 'azure' and
-                        self.provider.PROVIDER_ID != 'gcp'):
+                        self.provider.PROVIDER_ID != 'gcp' and
+                        self.provider.PROVIDER_ID != 'openstack'):
                     self.assertEqual(test_vol.attachments.device,
                                      "/dev/sda2")
                 test_vol.detach()