Kaynağa Gözat

Implement Snapshot.create_volume method and add test

Enis Afgan 10 yıl önce
ebeveyn
işleme
35c25bf9ed

+ 2 - 2
cloudbridge/cloud/interfaces/resources.py

@@ -958,8 +958,8 @@ class Snapshot(ObjectLifeCycleMixin, CloudResource):
         """
         Create a new Volume from this Snapshot.
 
-        :type zone: str
-        :param zone: The availability zone in which the Volume will be created.
+        :type placement: str
+        :param placement: The availability zone where to create the Volume.
 
         :type size: int
         :param size: The size of the new volume, in GiB (optional). Defaults to

+ 8 - 2
cloudbridge/cloud/providers/aws/resources.py

@@ -488,8 +488,14 @@ class AWSSnapshot(BaseSnapshot):
         self._snapshot.delete()
 
     def create_volume(self, placement, size=None, volume_type=None, iops=None):
-        raise NotImplementedError(
-            'create_volume not implemented by this provider')
+        """
+        Create a new Volume from this Snapshot.
+        """
+        ec2_vol = self._snapshot.create_volume(placement, size, volume_type,
+                                               iops)
+        cb_vol = AWSVolume(self._provider, ec2_vol)
+        cb_vol.name = "Created from {0} ({1})".format(self.id, self.name)
+        return cb_vol
 
 
 class AWSKeyPair(BaseKeyPair):

+ 11 - 2
cloudbridge/cloud/providers/openstack/resources.py

@@ -519,8 +519,17 @@ class OpenStackSnapshot(BaseSnapshot):
         self._snapshot.delete()
 
     def create_volume(self, placement, size=None, volume_type=None, iops=None):
-        raise NotImplementedError(
-            'create_volume not implemented by this provider')
+        """
+        Create a new Volume from this Snapshot.
+        """
+        vol_name = "Created from {0} ({1})".format(self.id, self.name)
+        size = size if size else self._snapshot.size
+        os_vol = self._provider.cinder.volumes.create(
+            size, name=vol_name, availability_zone=placement,
+            snapshot_id=self._snapshot.id)
+        cb_vol = OpenStackVolume(self._provider, os_vol)
+        cb_vol.name = vol_name
+        return cb_vol
 
 
 class OpenStackKeyPair(BaseKeyPair):

+ 7 - 1
test/test_block_store_service.py

@@ -193,7 +193,7 @@ class CloudBlockStoreServiceTestCase(ProviderTestBase):
                                              get_snap.name,
                                              test_snap.name))
 
-                # Test volume creation based on this snapshot
+                # Test volume creation from a snapshot (via VolumeService)
                 sv_name = "CBUnitTestSnapVol-{0}".format(name)
                 snap_vol = self.provider.block_store.volumes.create(
                     sv_name,
@@ -203,6 +203,12 @@ class CloudBlockStoreServiceTestCase(ProviderTestBase):
                 with helpers.cleanup_action(lambda: snap_vol.delete()):
                     snap_vol.wait_till_ready()
 
+                # Test volume creation from a snapshot (via Snapshot)
+                snap_vol2 = test_snap.create_volume(
+                    helpers.get_provider_test_data(self.provider, "placement"))
+                with helpers.cleanup_action(lambda: snap_vol2.delete()):
+                    snap_vol2.wait_till_ready()
+
             snaps = self.provider.block_store.snapshots.list()
             found_snaps = [snap for snap in snaps
                            if snap.name == snap_name]