almahmoud 7 лет назад
Родитель
Сommit
80e30eeeae

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

@@ -487,6 +487,9 @@ class BaseSnapshot(BaseCloudResource, BaseObjectLifeCycleMixin, Snapshot):
             timeout=timeout,
             interval=interval)
 
+    def delete(self):
+        self._provider.storage.snapshots.delete(self.id)
+
 
 class BaseKeyPair(BaseCloudResource, KeyPair):
 

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

@@ -9,6 +9,7 @@ from cloudbridge.cloud.base.resources import BaseBucket
 from cloudbridge.cloud.base.resources import BaseKeyPair
 from cloudbridge.cloud.base.resources import BaseNetwork
 from cloudbridge.cloud.base.resources import BaseRouter
+from cloudbridge.cloud.base.resources import BaseSnapshot
 from cloudbridge.cloud.base.resources import BaseSubnet
 from cloudbridge.cloud.base.resources import BaseVMFirewall
 from cloudbridge.cloud.base.resources import BaseVolume
@@ -323,6 +324,64 @@ class BaseSnapshotService(
         super(BaseSnapshotService, self).__init__(provider)
         self._service_event_pattern += ".storage.snapshots"
 
+    def get(self, snapshot_id):
+        """
+        Returns a snapshot given its ID. Returns ``None`` if the snapshot
+        does not exist.
+
+        :type snapshot_id: str
+        :param snapshot_id: The id of the desired snapshot.
+
+        :rtype: ``Snapshot``
+        :return:  ``None`` is returned if the snapshot does not exist, and
+                  the snapshot's provider-specific CloudBridge object is
+                  returned if the snapshot is found.
+        """
+        return self.dispatch(self, "provider.storage.snapshots.get",
+                             snapshot_id)
+
+    def find(self, **kwargs):
+        """
+        Returns a list of snapshots filtered by the given keyword arguments.
+        Accepted search arguments are: 'label'
+        """
+        return self.dispatch(self, "provider.storage.snapshots.find",
+                             **kwargs)
+
+    def list(self, limit=None, marker=None):
+        """
+        List all snapshots.
+        """
+        return self.dispatch(self, "provider.storage.snapshots.list",
+                             limit=limit, marker=marker)
+
+    def create(self, label, volume, description=None):
+        """
+        Create a new snapshot.
+
+        :type label: str
+        :param label: The label of the snapshot to be created. Note that labels
+                     do not have to be unique, and are changeable.
+        :type volume: ``Volume``
+        :param volume: The volume from which to create this snapshot.
+
+        :rtype: ``Snapshot``
+        :return:  The created snapshot's provider-specific CloudBridge object.
+        """
+        BaseSnapshot.assert_valid_resource_label(label)
+        return self.dispatch(self, "provider.storage.snapshots.create",
+                             label, volume, description)
+
+    def delete(self, snapshot_id):
+        """
+        Delete an existing snapshot.
+
+        :type snapshot_id: str
+        :param snapshot_id: The ID of the snapshot to be deleted.
+        """
+        return self.dispatch(self, "provider.storage.snapshots.delete",
+                             snapshot_id)
+
 
 class BaseBucketService(
         BasePageableObjectMixin, BucketService, BaseCloudService):

+ 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(

+ 18 - 14
cloudbridge/cloud/providers/aws/services.py

@@ -279,12 +279,14 @@ class AWSSnapshotService(BaseSnapshotService):
                                   cb_resource=AWSSnapshot,
                                   boto_collection_name='snapshots')
 
-    def get(self, snapshot_id):
-        log.debug("Getting AWS Snapshot Service with the id: %s",
-                  snapshot_id)
+    @implement(event_pattern="provider.storage.snapshots.get",
+               priority=BaseSnapshotService.STANDARD_EVENT_PRIORITY)
+    def _get(self, snapshot_id):
         return self.svc.get(snapshot_id)
 
-    def find(self, **kwargs):
+    @implement(event_pattern="provider.storage.snapshots.find",
+               priority=BaseSnapshotService.STANDARD_EVENT_PRIORITY)
+    def _find(self, **kwargs):
         # Filter by description or label
         label = kwargs.get('label', None)
 
@@ -299,19 +301,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=BaseSnapshotService.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):
-        """
-        Creates a new snapshot of a given volume.
-        """
-        log.debug("Creating a new AWS snapshot Service with the "
-                  "parameters [label: %s volume: %s description: %s]",
-                  label, volume, description)
-        AWSSnapshot.assert_valid_resource_label(label)
-
+    @implement(event_pattern="provider.storage.snapshots.create",
+               priority=BaseSnapshotService.STANDARD_EVENT_PRIORITY)
+    def _create(self, label, volume, description=None):
         volume_id = volume.id if isinstance(volume, AWSVolume) else volume
 
         cb_snap = self.svc.create('create_snapshot', VolumeId=volume_id)
@@ -322,6 +320,12 @@ class AWSSnapshotService(BaseSnapshotService):
             cb_snap.description = description
         return cb_snap
 
+    @implement(event_pattern="provider.storage.snapshots.delete",
+               priority=BaseSnapshotService.STANDARD_EVENT_PRIORITY)
+    def _delete(self, snapshot_id):
+        aws_snap = self.svc.get_raw(snapshot_id)
+        aws_snap.delete()
+
 
 class AWSBucketService(BaseBucketService):
 

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

@@ -634,12 +634,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):
         """

+ 18 - 15
cloudbridge/cloud/providers/azure/services.py

@@ -350,19 +350,20 @@ class AzureSnapshotService(BaseSnapshotService):
     def __init__(self, provider):
         super(AzureSnapshotService, self).__init__(provider)
 
-    def get(self, ss_id):
-        """
-        Returns a snapshot given its id.
-        """
+    @implement(event_pattern="provider.storage.snapshots.get",
+               priority=BaseSnapshotService.STANDARD_EVENT_PRIORITY)
+    def _get(self, snapshot_id):
         try:
-            snapshot = self.provider.azure_client.get_snapshot(ss_id)
+            snapshot = self.provider.azure_client.get_snapshot(snapshot_id)
             return AzureSnapshot(self.provider, snapshot)
         except (CloudError, InvalidValueException) as cloud_error:
             # Azure raises the cloud error if the resource not available
             log.exception(cloud_error)
             return None
 
-    def find(self, **kwargs):
+    @implement(event_pattern="provider.storage.snapshots.find",
+               priority=BaseSnapshotService.STANDARD_EVENT_PRIORITY)
+    def _find(self, **kwargs):
         obj_list = self
         filters = ['label']
         matches = cb_helpers.generic_find(filters, kwargs, obj_list)
@@ -376,20 +377,17 @@ class AzureSnapshotService(BaseSnapshotService):
         return ClientPagedResultList(self.provider,
                                      matches if matches else [])
 
-    def list(self, limit=None, marker=None):
-        """
-               List all snapshots.
-        """
+    @implement(event_pattern="provider.storage.snapshots.list",
+               priority=BaseSnapshotService.STANDARD_EVENT_PRIORITY)
+    def _list(self, limit=None, marker=None):
         snaps = [AzureSnapshot(self.provider, obj)
                  for obj in
                  self.provider.azure_client.list_snapshots()]
         return ClientPagedResultList(self.provider, snaps, limit, marker)
 
-    def create(self, label, volume, description=None):
-        """
-        Creates a new snapshot of a given volume.
-        """
-        AzureSnapshot.assert_valid_resource_label(label)
+    @implement(event_pattern="provider.storage.snapshots.create",
+               priority=BaseSnapshotService.STANDARD_EVENT_PRIORITY)
+    def _create(self, label, volume, description=None):
         snapshot_name = AzureSnapshot._generate_name_from_label(label,
                                                                 "cb-snap")
         tags = {'Label': label}
@@ -413,6 +411,11 @@ class AzureSnapshotService(BaseSnapshotService):
                                                                 params)
         return AzureSnapshot(self.provider, azure_snap)
 
+    @implement(event_pattern="provider.storage.snapshots.delete",
+               priority=BaseSnapshotService.STANDARD_EVENT_PRIORITY)
+    def _delete(self, snapshot_id):
+        self.provider.azure_client.delete_snapshot(snapshot_id)
+
 
 class AzureBucketService(BaseBucketService):
     def __init__(self, provider):

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

@@ -2045,17 +2045,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.

+ 9 - 13
cloudbridge/cloud/providers/gce/services.py

@@ -1074,16 +1074,10 @@ class GCESnapshotService(BaseSnapshotService):
         super(GCESnapshotService, self).__init__(provider)
 
     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, label, limit=None, marker=None):
-        """
-        Searches for a snapshot by a given list of attributes.
-        """
         filtr = 'labels.cblabel eq ' + label
         max_result = limit if limit is not None and limit < 500 else 500
         response = (self.provider
@@ -1104,9 +1098,6 @@ class GCESnapshotService(BaseSnapshotService):
                                      False, data=snapshots)
 
     def list(self, limit=None, marker=None):
-        """
-        List all snapshots.
-        """
         max_result = limit if limit is not None and limit < 500 else 500
         response = (self.provider
                         .gce_compute
@@ -1125,10 +1116,6 @@ class GCESnapshotService(BaseSnapshotService):
                                      False, data=snapshots)
 
     def create(self, label, volume, description=None):
-        """
-        Creates a new snapshot of a given volume.
-        """
-        GCESnapshot.assert_valid_resource_label(label)
         name = GCESnapshot._generate_name_from_label(label, 'cbsnap')
         volume_name = volume.name if isinstance(volume, GCEVolume) else volume
         snapshot_body = {
@@ -1151,6 +1138,15 @@ class GCESnapshotService(BaseSnapshotService):
         cb_snap = self.get(name)
         return cb_snap
 
+    def delete(self, snapshot_id):
+        gce_snap = self.provider.get_resource('snapshots', snapshot_id)
+        (self.provider
+             .gce_compute
+             .snapshots()
+             .delete(project=self.provider.project_name,
+                     snapshot=gce_snap.get('name'))
+             .execute())
+
 
 class GCSBucketService(BaseBucketService):
 

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

@@ -764,12 +764,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.

+ 18 - 17
cloudbridge/cloud/providers/openstack/services.py

@@ -363,11 +363,9 @@ class OpenStackSnapshotService(BaseSnapshotService):
     def __init__(self, provider):
         super(OpenStackSnapshotService, self).__init__(provider)
 
-    def get(self, snapshot_id):
-        """
-        Returns a snapshot given its id.
-        """
-        log.debug("Getting OpenStack snapshot with the id: %s", snapshot_id)
+    @implement(event_pattern="provider.storage.snapshots.get",
+               priority=BaseSnapshotService.STANDARD_EVENT_PRIORITY)
+    def _get(self, snapshot_id):
         try:
             return OpenStackSnapshot(
                 self.provider,
@@ -376,7 +374,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=BaseSnapshotService.STANDARD_EVENT_PRIORITY)
+    def _find(self, **kwargs):
         label = kwargs.pop('label', None)
 
         # All kwargs should have been popped at this time.
@@ -396,10 +396,9 @@ class OpenStackSnapshotService(BaseSnapshotService):
 
         return oshelpers.to_server_paged_list(self.provider, cb_snaps)
 
-    def list(self, limit=None, marker=None):
-        """
-        List all snapshot.
-        """
+    @implement(event_pattern="provider.storage.snapshots.list",
+               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(
@@ -408,13 +407,9 @@ class OpenStackSnapshotService(BaseSnapshotService):
                              'marker': marker})]
         return oshelpers.to_server_paged_list(self.provider, cb_snaps, limit)
 
-    def create(self, label, volume, description=None):
-        """
-        Creates a new snapshot of a given volume.
-        """
-        log.debug("Creating a new snapshot of the %s volume.", label)
-        OpenStackSnapshot.assert_valid_resource_label(label)
-
+    @implement(event_pattern="provider.storage.snapshots.create",
+               priority=BaseSnapshotService.STANDARD_EVENT_PRIORITY)
+    def _create(self, label, volume, description=None):
         volume_id = (volume.id if isinstance(volume, OpenStackVolume)
                      else volume)
 
@@ -423,6 +418,12 @@ class OpenStackSnapshotService(BaseSnapshotService):
             description=description)
         return OpenStackSnapshot(self.provider, os_snap)
 
+    @implement(event_pattern="provider.storage.snapshots.delete",
+               priority=BaseSnapshotService.STANDARD_EVENT_PRIORITY)
+    def _delete(self, snapshot_id):
+        os_snap = self.provider.cinder.volume_snapshots.get(snapshot_id)
+        os_snap.delete()
+
 
 class OpenStackBucketService(BaseBucketService):