Просмотр исходного кода

Moved snapshot service to event system and added delete method to snapshot service

Nuwan Goonasekera 7 лет назад
Родитель
Сommit
f9d065c4b4

+ 6 - 0
cloudbridge/cloud/base/resources.py

@@ -490,6 +490,12 @@ class BaseSnapshot(BaseCloudResource, BaseObjectLifeCycleMixin, Snapshot):
             timeout=timeout,
             interval=interval)
 
+    def delete(self):
+        """
+        Delete this snapshot.
+        """
+        return self._provider.storage.snapshots.delete(self)
+
 
 class BaseKeyPair(BaseCloudResource, KeyPair):
 

+ 20 - 0
cloudbridge/cloud/base/services.py

@@ -207,6 +207,26 @@ class BaseSnapshotService(
         super(BaseSnapshotService, self).__init__(provider)
         self._service_event_pattern += ".storage.snapshots"
 
+    def get(self, snapshot_id):
+        return self.dispatch(self, "provider.storage.snapshots.get",
+                             snapshot_id)
+
+    def list(self, limit=None, marker=None):
+        return self.dispatch(self, "provider.storage.snapshots.list",
+                             limit=limit, marker=marker)
+
+    def find(self, **kwargs):
+        return self.dispatch(self, "provider.storage.snapshots.find",
+                             **kwargs)
+
+    def create(self, label, volume, description=None):
+        return self.dispatch(self, "provider.storage.snapshots.create",
+                             label, volume=volume, description=description)
+
+    def delete(self, snapshot):
+        return self.dispatch(self, "provider.storage.snapshots.delete",
+                             snapshot)
+
 
 class BaseBucketService(
         BasePageableObjectMixin, BucketService, BaseCloudService):

+ 10 - 1
cloudbridge/cloud/interfaces/services.py

@@ -379,7 +379,7 @@ class SnapshotService(PageableObjectMixin, CloudService):
     __metaclass__ = ABCMeta
 
     @abstractmethod
-    def get(self, volume_id):
+    def get(self, snapshot_id):
         """
         Returns a snapshot given its id.
 
@@ -431,6 +431,15 @@ class SnapshotService(PageableObjectMixin, CloudService):
         """
         pass
 
+    def delete(self, snapshot):
+        """
+        Delete an existing snapshot.
+
+        :type snapshot: ``str`` or :class:`Snapshot`
+        :param snapshot: The object or ID of the snapshot to be deleted.
+        """
+        pass
+
 
 class StorageService(CloudService):
 

+ 0 - 3
cloudbridge/cloud/providers/aws/resources.py

@@ -597,9 +597,6 @@ class AWSSnapshot(BaseSnapshot):
             # set the status to unknown
             self._unknown_state = True
 
-    def delete(self):
-        self._snapshot.delete()
-
     def create_volume(self, placement, size=None, volume_type=None, iops=None):
         label = "from-snap-{0}".format(self.label or self.id)
         cb_vol = self._provider.storage.volumes.create(

+ 20 - 4
cloudbridge/cloud/providers/aws/services.py

@@ -284,12 +284,16 @@ class AWSSnapshotService(BaseSnapshotService):
                                   cb_resource=AWSSnapshot,
                                   boto_collection_name='snapshots')
 
-    def get(self, snapshot_id):
+    @implement(event_pattern="provider.storage.snapshots.get",
+               priority=BaseVolumeService.STANDARD_EVENT_PRIORITY)
+    def _get(self, snapshot_id):
         log.debug("Getting AWS Snapshot Service with the id: %s",
                   snapshot_id)
         return self.svc.get(snapshot_id)
 
-    def find(self, **kwargs):
+    @implement(event_pattern="provider.storage.snapshots.find",
+               priority=BaseVolumeService.STANDARD_EVENT_PRIORITY)
+    def _find(self, **kwargs):
         # Filter by description or label
         label = kwargs.get('label', None)
 
@@ -304,11 +308,15 @@ class AWSSnapshotService(BaseSnapshotService):
         filters = ['label']
         return cb_helpers.generic_find(filters, kwargs, obj_list)
 
-    def list(self, limit=None, marker=None):
+    @implement(event_pattern="provider.storage.snapshots.list",
+               priority=BaseVolumeService.STANDARD_EVENT_PRIORITY)
+    def _list(self, limit=None, marker=None):
         return self.svc.list(limit=limit, marker=marker,
                              OwnerIds=['self'])
 
-    def create(self, label, volume, description=None):
+    @implement(event_pattern="provider.storage.snapshots.create",
+               priority=BaseVolumeService.STANDARD_EVENT_PRIORITY)
+    def _create(self, label, volume, description=None):
         """
         Creates a new snapshot of a given volume.
         """
@@ -327,6 +335,14 @@ class AWSSnapshotService(BaseSnapshotService):
             cb_snap.description = description
         return cb_snap
 
+    @implement(event_pattern="provider.storage.snapshots.delete",
+               priority=BaseVolumeService.STANDARD_EVENT_PRIORITY)
+    def _delete(self, snapshot):
+        cb_snap = (snapshot if isinstance(snapshot, AWSSnapshot)
+                   else self.get(snapshot))
+        # pylint:disable=protected-access
+        cb_snap._snapshot.delete()
+
 
 class AWSBucketService(BaseBucketService):
 

+ 0 - 6
cloudbridge/cloud/providers/azure/resources.py

@@ -637,12 +637,6 @@ class AzureSnapshot(BaseSnapshot):
             # set the state to unknown
             self._state = 'unknown'
 
-    def delete(self):
-        """
-        Delete this snapshot.
-        """
-        self._provider.azure_client.delete_snapshot(self.id)
-
     def create_volume(self, placement=None,
                       size=None, volume_type=None, iops=None):
         """

+ 19 - 4
cloudbridge/cloud/providers/azure/services.py

@@ -351,7 +351,9 @@ class AzureSnapshotService(BaseSnapshotService):
     def __init__(self, provider):
         super(AzureSnapshotService, self).__init__(provider)
 
-    def get(self, ss_id):
+    @implement(event_pattern="provider.storage.snapshots.get",
+               priority=BaseVolumeService.STANDARD_EVENT_PRIORITY)
+    def _get(self, ss_id):
         """
         Returns a snapshot given its id.
         """
@@ -363,7 +365,9 @@ class AzureSnapshotService(BaseSnapshotService):
             log.exception(cloud_error)
             return None
 
-    def find(self, **kwargs):
+    @implement(event_pattern="provider.storage.snapshots.find",
+               priority=BaseVolumeService.STANDARD_EVENT_PRIORITY)
+    def _find(self, **kwargs):
         obj_list = self
         filters = ['label']
         matches = cb_helpers.generic_find(filters, kwargs, obj_list)
@@ -377,7 +381,9 @@ class AzureSnapshotService(BaseSnapshotService):
         return ClientPagedResultList(self.provider,
                                      matches if matches else [])
 
-    def list(self, limit=None, marker=None):
+    @implement(event_pattern="provider.storage.snapshots.list",
+               priority=BaseVolumeService.STANDARD_EVENT_PRIORITY)
+    def _list(self, limit=None, marker=None):
         """
                List all snapshots.
         """
@@ -386,7 +392,9 @@ class AzureSnapshotService(BaseSnapshotService):
                  self.provider.azure_client.list_snapshots()]
         return ClientPagedResultList(self.provider, snaps, limit, marker)
 
-    def create(self, label, volume, description=None):
+    @implement(event_pattern="provider.storage.snapshots.create",
+               priority=BaseVolumeService.STANDARD_EVENT_PRIORITY)
+    def _create(self, label, volume, description=None):
         """
         Creates a new snapshot of a given volume.
         """
@@ -414,6 +422,13 @@ class AzureSnapshotService(BaseSnapshotService):
                                                                 params)
         return AzureSnapshot(self.provider, azure_snap)
 
+    @implement(event_pattern="provider.storage.volumes.delete",
+               priority=BaseVolumeService.STANDARD_EVENT_PRIORITY)
+    def _delete(self, snapshot):
+        snap_id = (snapshot.id if isinstance(snapshot, AzureSnapshot)
+                   else snapshot)
+        self.provider.azure_client.delete_snapshot(snap_id)
+
 
 class AzureBucketService(BaseBucketService):
     def __init__(self, provider):

+ 0 - 11
cloudbridge/cloud/providers/gce/resources.py

@@ -2051,17 +2051,6 @@ class GCESnapshot(BaseSnapshot):
             # snapshot no longer exists
             self._snapshot['status'] = SnapshotState.UNKNOWN
 
-    def delete(self):
-        """
-        Delete this snapshot.
-        """
-        (self._provider
-         .gce_compute
-         .snapshots()
-         .delete(project=self._provider.project_name,
-                 snapshot=self.name)
-         .execute())
-
     def create_volume(self, placement, size=None, volume_type=None, iops=None):
         """
         Create a new Volume from this Snapshot.

+ 33 - 8
cloudbridge/cloud/providers/gce/services.py

@@ -1111,14 +1111,18 @@ class GCESnapshotService(BaseSnapshotService):
     def __init__(self, provider):
         super(GCESnapshotService, self).__init__(provider)
 
-    def get(self, snapshot_id):
+    @implement(event_pattern="provider.storage.snapshots.get",
+               priority=BaseVolumeService.STANDARD_EVENT_PRIORITY)
+    def _get(self, snapshot_id):
         """
         Returns a snapshot given its id.
         """
         snapshot = self.provider.get_resource('snapshots', snapshot_id)
         return GCESnapshot(self.provider, snapshot) if snapshot else None
 
-    def find(self, limit=None, marker=None, **kwargs):
+    @implement(event_pattern="provider.storage.snapshots.find",
+               priority=BaseVolumeService.STANDARD_EVENT_PRIORITY)
+    def _find(self, limit=None, marker=None, **kwargs):
         """
         Searches for a snapshot by a given list of attributes.
         """
@@ -1149,7 +1153,9 @@ class GCESnapshotService(BaseSnapshotService):
                                      response.get('nextPageToken'),
                                      False, data=snapshots)
 
-    def list(self, limit=None, marker=None):
+    @implement(event_pattern="provider.storage.snapshots.list",
+               priority=BaseVolumeService.STANDARD_EVENT_PRIORITY)
+    def _list(self, limit=None, marker=None):
         """
         List all snapshots.
         """
@@ -1170,7 +1176,9 @@ class GCESnapshotService(BaseSnapshotService):
                                      response.get('nextPageToken'),
                                      False, data=snapshots)
 
-    def create(self, label, volume, description=None):
+    @implement(event_pattern="provider.storage.snapshots.create",
+               priority=BaseVolumeService.STANDARD_EVENT_PRIORITY)
+    def _create(self, label, volume, description=None):
         """
         Creates a new snapshot of a given volume.
         """
@@ -1197,6 +1205,18 @@ class GCESnapshotService(BaseSnapshotService):
         cb_snap = self.get(name)
         return cb_snap
 
+    @implement(event_pattern="provider.storage.snapshots.delete",
+               priority=BaseVolumeService.STANDARD_EVENT_PRIORITY)
+    def _delete(self, snapshot):
+        cb_snap = (snapshot if isinstance(snapshot, GCESnapshot)
+                   else self.get(snapshot))
+        (self._provider
+         .gce_compute
+         .snapshots()
+         .delete(project=self.provider.project_name,
+                 snapshot=cb_snap.name)
+         .execute())
+
 
 class GCSBucketService(BaseBucketService):
 
@@ -1216,10 +1236,15 @@ class GCSBucketService(BaseBucketService):
 
     @implement(event_pattern="provider.storage.buckets.find",
                priority=BaseBucketService.STANDARD_EVENT_PRIORITY)
-    def _find(self, name, limit=None, marker=None):
-        """
-        Searches in bucket names for a substring.
-        """
+    def _find(self, limit=None, marker=None, **kwargs):
+        name = kwargs.pop('name', None)
+
+        # All kwargs should have been popped at this time.
+        if len(kwargs) > 0:
+            raise InvalidParamException(
+                "Unrecognised parameters for search: %s. Supported "
+                "attributes: %s" % (kwargs, 'name'))
+
         buckets = [bucket for bucket in self if name in bucket.name]
         return ClientPagedResultList(self.provider, buckets, limit=limit,
                                      marker=marker)

+ 0 - 6
cloudbridge/cloud/providers/openstack/resources.py

@@ -766,12 +766,6 @@ class OpenStackSnapshot(BaseSnapshot):
             # set the status to unknown
             self._snapshot.status = 'unknown'
 
-    def delete(self):
-        """
-        Delete this snapshot.
-        """
-        self._snapshot.delete()
-
     def create_volume(self, placement, size=None, volume_type=None, iops=None):
         """
         Create a new Volume from this Snapshot.

+ 20 - 4
cloudbridge/cloud/providers/openstack/services.py

@@ -372,7 +372,9 @@ class OpenStackSnapshotService(BaseSnapshotService):
     def __init__(self, provider):
         super(OpenStackSnapshotService, self).__init__(provider)
 
-    def get(self, snapshot_id):
+    @implement(event_pattern="provider.storage.snapshots.get",
+               priority=BaseVolumeService.STANDARD_EVENT_PRIORITY)
+    def _get(self, snapshot_id):
         """
         Returns a snapshot given its id.
         """
@@ -385,7 +387,9 @@ class OpenStackSnapshotService(BaseSnapshotService):
             log.debug("Snapshot %s was not found.", snapshot_id)
             return None
 
-    def find(self, **kwargs):
+    @implement(event_pattern="provider.storage.snapshots.find",
+               priority=BaseVolumeService.STANDARD_EVENT_PRIORITY)
+    def _find(self, **kwargs):
         label = kwargs.pop('label', None)
 
         # All kwargs should have been popped at this time.
@@ -406,7 +410,9 @@ class OpenStackSnapshotService(BaseSnapshotService):
 
         return oshelpers.to_server_paged_list(self.provider, cb_snaps)
 
-    def list(self, limit=None, marker=None):
+    @implement(event_pattern="provider.storage.snapshots.list",
+               priority=BaseVolumeService.STANDARD_EVENT_PRIORITY)
+    def _list(self, limit=None, marker=None):
         """
         List all snapshot.
         """
@@ -418,7 +424,9 @@ class OpenStackSnapshotService(BaseSnapshotService):
                              'marker': marker})]
         return oshelpers.to_server_paged_list(self.provider, cb_snaps, limit)
 
-    def create(self, label, volume, description=None):
+    @implement(event_pattern="provider.storage.snapshots.create",
+               priority=BaseVolumeService.STANDARD_EVENT_PRIORITY)
+    def _create(self, label, volume, description=None):
         """
         Creates a new snapshot of a given volume.
         """
@@ -433,6 +441,14 @@ class OpenStackSnapshotService(BaseSnapshotService):
             description=description)
         return OpenStackSnapshot(self.provider, os_snap)
 
+    @implement(event_pattern="provider.storage.snapshots.delete",
+               priority=BaseVolumeService.STANDARD_EVENT_PRIORITY)
+    def _delete(self, snapshot):
+        cb_snap = (snapshot if isinstance(snapshot, OpenStackSnapshot)
+                   else self.get(snapshot))
+        # pylint:disable=protected-access
+        cb_snap._snapshot.delete()
+
 
 class OpenStackBucketService(BaseBucketService):