Răsfoiți Sursa

Moved volumes, snapshots and buckets to the storage service, removing block_store and object_store services

Nuwan Goonasekera 8 ani în urmă
părinte
comite
940fc7504d

+ 7 - 7
cloudbridge/cloud/base/services.py

@@ -3,7 +3,7 @@ Base implementation for services available through a provider
 """
 from cloudbridge.cloud.interfaces.resources import Router
 
-from cloudbridge.cloud.interfaces.services import BlockStoreService
+from cloudbridge.cloud.interfaces.services import BucketService
 from cloudbridge.cloud.interfaces.services import CloudService
 from cloudbridge.cloud.interfaces.services import ComputeService
 from cloudbridge.cloud.interfaces.services import FloatingIPService
@@ -13,11 +13,11 @@ from cloudbridge.cloud.interfaces.services import InstanceService
 from cloudbridge.cloud.interfaces.services import KeyPairService
 from cloudbridge.cloud.interfaces.services import NetworkService
 from cloudbridge.cloud.interfaces.services import NetworkingService
-from cloudbridge.cloud.interfaces.services import ObjectStoreService
 from cloudbridge.cloud.interfaces.services import RegionService
 from cloudbridge.cloud.interfaces.services import RouterService
 from cloudbridge.cloud.interfaces.services import SecurityService
 from cloudbridge.cloud.interfaces.services import SnapshotService
+from cloudbridge.cloud.interfaces.services import StorageService
 from cloudbridge.cloud.interfaces.services import SubnetService
 from cloudbridge.cloud.interfaces.services import VMFirewallService
 from cloudbridge.cloud.interfaces.services import VMTypeService
@@ -56,10 +56,10 @@ class BaseSnapshotService(
         super(BaseSnapshotService, self).__init__(provider)
 
 
-class BaseBlockStoreService(BlockStoreService, BaseCloudService):
+class BaseStorageService(StorageService, BaseCloudService):
 
     def __init__(self, provider):
-        super(BaseBlockStoreService, self).__init__(provider)
+        super(BaseStorageService, self).__init__(provider)
 
 
 class BaseImageService(
@@ -69,11 +69,11 @@ class BaseImageService(
         super(BaseImageService, self).__init__(provider)
 
 
-class BaseObjectStoreService(
-        BasePageableObjectMixin, ObjectStoreService, BaseCloudService):
+class BaseBucketService(
+        BasePageableObjectMixin, BucketService, BaseCloudService):
 
     def __init__(self, provider):
-        super(BaseObjectStoreService, self).__init__(provider)
+        super(BaseBucketService, self).__init__(provider)
 
 
 class BaseSecurityService(SecurityService, BaseCloudService):

+ 11 - 26
cloudbridge/cloud/interfaces/provider.py

@@ -89,9 +89,9 @@ class CloudProvider(object):
 
         .. code-block:: python
 
-            if provider.has_service(CloudServiceType.OBJECT_STORE):
+            if provider.has_service(CloudServiceType.BUCKET):
                print("Provider supports object store services")
-               provider.object_store.list()
+               provider.storage.buckets.list()
 
 
         :type service_type: :class:`.CloudServiceType`
@@ -172,38 +172,23 @@ class CloudProvider(object):
         pass
 
     @abstractproperty
-    def block_store(self):
+    def storage(self):
         """
-        Provides access to the volume and snapshot services in this
-        provider.
+        Provides access to storage related services in this provider.
+        This includes the volume, snapshot and bucket services,
 
         Example:
 
         .. code-block:: python
 
-            volumes = provider.block_store.volumes.list()
-            snapshots = provider.block_store.snapshots.list()
-
-        :rtype: :class:`.BlockStoreService`
-        :return: a BlockStoreService object
-        """
-        pass
-
-    @abstractproperty
-    def object_store(self):
-        """
-        Provides access to object storage services in this provider.
-
-        Example:
-
-        .. code-block:: python
-
-            if provider.has_service(CloudServiceType.OBJECT_STORE):
+            volumes = provider.storage.volumes.list()
+            snapshots = provider.storage.snapshots.list()
+            if provider.has_service(CloudServiceType.BUCKET):
                print("Provider supports object store services")
-               print(provider.object_store.list())
+               print(provider.storage.buckets.list())
 
-        :rtype: ``object`` of :class:`.ObjectStoreService`
-        :return: an ObjectStoreService object
+        :rtype: :class:`.StorageService`
+        :return: a StorageService object
         """
         pass
 

+ 4 - 5
cloudbridge/cloud/interfaces/resources.py

@@ -13,16 +13,15 @@ class CloudServiceType(object):
     Providers can implement the ``has_service`` method and clients can check
     for the availability of a service with::
 
-        if (provider.has_service(CloudServiceTypes.OBJECTSTORE))
+        if (provider.has_service(CloudServiceTypes.BUCKET))
             ...
 
     """
     COMPUTE = 'compute'
     IMAGE = 'image'
     SECURITY = 'security'
-    VOLUME = 'volume'
-    BLOCKSTORE = 'block_store'
-    OBJECTSTORE = 'object_store'
+    VOLUME = 'storage.volumes'
+    BUCKET = 'storage.buckets'
 
 
 class CloudResource(object):
@@ -714,7 +713,7 @@ class LaunchConfig(object):
             lc.add_volume_device(size=100, delete_on_terminate=True)
 
             # 2. Create and attach a volume based on a snapshot
-            snap = provider.block_store.snapshots.get('<my_snapshot_id>')
+            snap = provider.storage.snapshots.get('<my_snapshot_id>')
             lc.add_volume_device(source=snap)
 
             # 3. Create+attach a volume based on an image and set it as root

+ 38 - 15
cloudbridge/cloud/interfaces/services.py

@@ -408,11 +408,12 @@ class SnapshotService(PageableObjectMixin, CloudService):
         pass
 
 
-class BlockStoreService(CloudService):
+class StorageService(CloudService):
 
     """
-    The Block Store Service interface provides access to block device services,
-    such as volume and snapshot services in the provider.
+    The Storage Service interface provides access to block device services,
+    such as volume and snapshot services, as well as object store services,
+    such as buckets, in the provider.
     """
     __metaclass__ = ABCMeta
 
@@ -426,11 +427,11 @@ class BlockStoreService(CloudService):
         .. code-block:: python
 
             # print all volumes
-            for vol in provider.block_store.volumes:
+            for vol in provider.storage.volumes:
                 print(vol.id, vol.name)
 
             # find volume by name
-            vol = provider.block_store.volumes.find(name='my_vol')[0]
+            vol = provider.storage.volumes.find(name='my_vol')[0]
             print(vol.id, vol.name)
 
         :rtype: :class:`.VolumeService`
@@ -448,15 +449,37 @@ class BlockStoreService(CloudService):
         .. code-block:: python
 
             # print all snapshots
-            for snap in provider.block_store.snapshots:
+            for snap in provider.storage.snapshots:
                 print(snap.id, snap.name)
 
             # find snapshot by name
-            snap = provider.block_store.snapshots.find(name='my_snap')[0]
+            snap = provider.storage.snapshots.find(name='my_snap')[0]
             print(snap.id, snap.name)
 
         :rtype: :class:`.SnapshotService`
-        :return: an SnapshotService object
+        :return: a SnapshotService object
+        """
+        pass
+
+    @abstractproperty
+    def buckets(self):
+        """
+        Provides access to object storage services in this provider.
+
+        Example:
+
+        .. code-block:: python
+
+            # print all buckets
+            for bucket in provider.storage.buckets:
+                print(bucket.id, bucket.name)
+
+            # find bucket by name
+            bucket = provider.storage.buckets.find(name='my_bucket')[0]
+            print(bucket.id, bucket.name)
+
+        :rtype: :class:`.BucketService`
+        :return: a BucketService object
         """
         pass
 
@@ -908,11 +931,11 @@ class GatewayService(CloudService):
         pass
 
 
-class ObjectStoreService(PageableObjectMixin, CloudService):
+class BucketService(PageableObjectMixin, CloudService):
 
     """
-    The Object Storage Service interface provides access to the underlying
-    object store capabilities of this provider. This service is optional and
+    The Bucket Service interface provides access to the underlying
+    object storage capabilities of this provider. This service is optional and
     the :func:`CloudProvider.has_service()` method should be used to verify its
     availability before using the service.
     """
@@ -929,7 +952,7 @@ class ObjectStoreService(PageableObjectMixin, CloudService):
 
         .. code-block:: python
 
-            bucket = provider.object_store.get('my_bucket_id')
+            bucket = provider.storage.buckets.get('my_bucket_id')
             print(bucket.id, bucket.name)
 
         :rtype: :class:`.Bucket`
@@ -946,7 +969,7 @@ class ObjectStoreService(PageableObjectMixin, CloudService):
 
         .. code-block:: python
 
-            buckets = provider.object_store.find(name='my_bucket_name')
+            buckets = provider.storage.buckets.find(name='my_bucket_name')
             for bucket in buckets:
                 print(bucket.id, bucket.name)
 
@@ -964,7 +987,7 @@ class ObjectStoreService(PageableObjectMixin, CloudService):
 
         .. code-block:: python
 
-            buckets = provider.object_store.find(name='my_bucket_name')
+            buckets = provider.storage.buckets.find(name='my_bucket_name')
             for bucket in buckets:
                 print(bucket.id, bucket.name)
 
@@ -985,7 +1008,7 @@ class ObjectStoreService(PageableObjectMixin, CloudService):
 
         .. code-block:: python
 
-            bucket = provider.object_store.create('my_bucket_name')
+            bucket = provider.storage.buckets.create('my_bucket_name')
             print(bucket.name)
 
 

+ 4 - 10
cloudbridge/cloud/providers/aws/provider.py

@@ -14,11 +14,10 @@ except ImportError:
 from cloudbridge.cloud.base import BaseCloudProvider
 from cloudbridge.cloud.interfaces import TestMockHelperMixin
 
-from .services import AWSBlockStoreService
 from .services import AWSComputeService
 from .services import AWSNetworkingService
-from .services import AWSObjectStoreService
 from .services import AWSSecurityService
+from .services import AWSStorageService
 
 
 class AWSCloudProvider(BaseCloudProvider):
@@ -63,8 +62,7 @@ class AWSCloudProvider(BaseCloudProvider):
         self._compute = AWSComputeService(self)
         self._networking = AWSNetworkingService(self)
         self._security = AWSSecurityService(self)
-        self._block_store = AWSBlockStoreService(self)
-        self._object_store = AWSObjectStoreService(self)
+        self._storage = AWSStorageService(self)
 
     @property
     def session(self):
@@ -101,12 +99,8 @@ class AWSCloudProvider(BaseCloudProvider):
         return self._security
 
     @property
-    def block_store(self):
-        return self._block_store
-
-    @property
-    def object_store(self):
-        return self._object_store
+    def storage(self):
+        return self._storage
 
     def _connect_ec2(self):
         """

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

@@ -98,7 +98,7 @@ class AWSMachineImage(BaseMachineImage):
 
         self._ec2_image.deregister()
         self.wait_for([MachineImageState.UNKNOWN, MachineImageState.ERROR])
-        snapshot = self._provider.block_store.snapshots.get(snapshot_id[0])
+        snapshot = self._provider.storage.snapshots.get(snapshot_id[0])
         if snapshot:
             snapshot.delete()
 
@@ -396,7 +396,7 @@ class AWSVolume(BaseVolume):
     @property
     def source(self):
         if self._volume.snapshot_id:
-            return self._provider.block_store.snapshots.get(
+            return self._provider.storage.snapshots.get(
                 self._volume.snapshot_id)
         return None
 
@@ -522,7 +522,7 @@ class AWSSnapshot(BaseSnapshot):
         self._snapshot.delete()
 
     def create_volume(self, placement, size=None, volume_type=None, iops=None):
-        cb_vol = self._provider.block_store.volumes.create(
+        cb_vol = self._provider.storage.volumes.create(
             name=self.name,
             size=size,
             zone=placement,

+ 11 - 6
cloudbridge/cloud/providers/aws/services.py

@@ -4,7 +4,7 @@ import string
 from botocore.exceptions import ClientError
 
 from cloudbridge.cloud.base.resources import ClientPagedResultList
-from cloudbridge.cloud.base.services import BaseBlockStoreService
+from cloudbridge.cloud.base.services import BaseBucketService
 from cloudbridge.cloud.base.services import BaseComputeService
 from cloudbridge.cloud.base.services import BaseFloatingIPService
 from cloudbridge.cloud.base.services import BaseGatewayService
@@ -13,11 +13,11 @@ from cloudbridge.cloud.base.services import BaseInstanceService
 from cloudbridge.cloud.base.services import BaseKeyPairService
 from cloudbridge.cloud.base.services import BaseNetworkService
 from cloudbridge.cloud.base.services import BaseNetworkingService
-from cloudbridge.cloud.base.services import BaseObjectStoreService
 from cloudbridge.cloud.base.services import BaseRegionService
 from cloudbridge.cloud.base.services import BaseRouterService
 from cloudbridge.cloud.base.services import BaseSecurityService
 from cloudbridge.cloud.base.services import BaseSnapshotService
+from cloudbridge.cloud.base.services import BaseStorageService
 from cloudbridge.cloud.base.services import BaseSubnetService
 from cloudbridge.cloud.base.services import BaseVMFirewallService
 from cloudbridge.cloud.base.services import BaseVMTypeService
@@ -124,14 +124,15 @@ class AWSVMFirewallService(BaseVMFirewallService):
             firewall.delete()
 
 
-class AWSBlockStoreService(BaseBlockStoreService):
+class AWSStorageService(BaseStorageService):
 
     def __init__(self, provider):
-        super(AWSBlockStoreService, self).__init__(provider)
+        super(AWSStorageService, self).__init__(provider)
 
         # Initialize provider services
         self._volume_svc = AWSVolumeService(self.provider)
         self._snapshot_svc = AWSSnapshotService(self.provider)
+        self._bucket_svc = AWSBucketService(self.provider)
 
     @property
     def volumes(self):
@@ -141,6 +142,10 @@ class AWSBlockStoreService(BaseBlockStoreService):
     def snapshots(self):
         return self._snapshot_svc
 
+    @property
+    def buckets(self):
+        return self._bucket_svc
+
 
 class AWSVolumeService(BaseVolumeService):
 
@@ -213,10 +218,10 @@ class AWSSnapshotService(BaseSnapshotService):
         return cb_snap
 
 
-class AWSObjectStoreService(BaseObjectStoreService):
+class AWSBucketService(BaseBucketService):
 
     def __init__(self, provider):
-        super(AWSObjectStoreService, self).__init__(provider)
+        super(AWSBucketService, self).__init__(provider)
         self.svc = BotoS3Service(provider=self.provider,
                                  cb_resource=AWSBucket,
                                  boto_collection_name='buckets')

+ 4 - 10
cloudbridge/cloud/providers/openstack/provider.py

@@ -22,11 +22,10 @@ from openstack import profile
 
 from swiftclient import client as swift_client
 
-from .services import OpenStackBlockStoreService
 from .services import OpenStackComputeService
 from .services import OpenStackNetworkingService
-from .services import OpenStackObjectStoreService
 from .services import OpenStackSecurityService
+from .services import OpenStackStorageService
 
 
 class OpenStackCloudProvider(BaseCloudProvider):
@@ -71,8 +70,7 @@ class OpenStackCloudProvider(BaseCloudProvider):
         self._compute = OpenStackComputeService(self)
         self._networking = OpenStackNetworkingService(self)
         self._security = OpenStackSecurityService(self)
-        self._block_store = OpenStackBlockStoreService(self)
-        self._object_store = OpenStackObjectStoreService(self)
+        self._storage = OpenStackStorageService(self)
 
     @property
     def nova(self):
@@ -185,12 +183,8 @@ class OpenStackCloudProvider(BaseCloudProvider):
         return self._security
 
     @property
-    def block_store(self):
-        return self._block_store
-
-    @property
-    def object_store(self):
-        return self._object_store
+    def storage(self):
+        return self._storage
 
     def _connect_nova(self):
         return self._connect_nova_region(self.region_name)

+ 4 - 4
cloudbridge/cloud/providers/openstack/resources.py

@@ -531,7 +531,7 @@ class OpenStackVolume(BaseVolume):
     @property
     def source(self):
         if self._volume.snapshot_id:
-            return self._provider.block_store.snapshots.get(
+            return self._provider.storage.snapshots.get(
                 self._volume.snapshot_id)
         return None
 
@@ -564,7 +564,7 @@ class OpenStackVolume(BaseVolume):
         """
         Create a snapshot of this Volume.
         """
-        return self._provider.block_store.snapshots.create(
+        return self._provider.storage.snapshots.create(
             name, self, description=description)
 
     def delete(self):
@@ -583,7 +583,7 @@ class OpenStackVolume(BaseVolume):
         Refreshes the state of this volume by re-querying the cloud provider
         for its latest state.
         """
-        vol = self._provider.block_store.volumes.get(
+        vol = self._provider.storage.volumes.get(
             self.id)
         if vol:
             self._volume = vol._volume  # pylint:disable=protected-access
@@ -659,7 +659,7 @@ class OpenStackSnapshot(BaseSnapshot):
         Refreshes the state of this snapshot by re-querying the cloud provider
         for its latest state.
         """
-        snap = self._provider.block_store.snapshots.get(
+        snap = self._provider.storage.snapshots.get(
             self.id)
         if snap:
             self._snapshot = snap._snapshot  # pylint:disable=protected-access

+ 11 - 6
cloudbridge/cloud/providers/openstack/services.py

@@ -9,7 +9,7 @@ from cinderclient.exceptions import NotFound as CinderNotFound
 
 from cloudbridge.cloud.base.resources import BaseLaunchConfig
 from cloudbridge.cloud.base.resources import ClientPagedResultList
-from cloudbridge.cloud.base.services import BaseBlockStoreService
+from cloudbridge.cloud.base.services import BaseBucketService
 from cloudbridge.cloud.base.services import BaseComputeService
 from cloudbridge.cloud.base.services import BaseFloatingIPService
 from cloudbridge.cloud.base.services import BaseGatewayService
@@ -18,11 +18,11 @@ from cloudbridge.cloud.base.services import BaseInstanceService
 from cloudbridge.cloud.base.services import BaseKeyPairService
 from cloudbridge.cloud.base.services import BaseNetworkService
 from cloudbridge.cloud.base.services import BaseNetworkingService
-from cloudbridge.cloud.base.services import BaseObjectStoreService
 from cloudbridge.cloud.base.services import BaseRegionService
 from cloudbridge.cloud.base.services import BaseRouterService
 from cloudbridge.cloud.base.services import BaseSecurityService
 from cloudbridge.cloud.base.services import BaseSnapshotService
+from cloudbridge.cloud.base.services import BaseStorageService
 from cloudbridge.cloud.base.services import BaseSubnetService
 from cloudbridge.cloud.base.services import BaseVMFirewallService
 from cloudbridge.cloud.base.services import BaseVMTypeService
@@ -278,14 +278,15 @@ class OpenStackVMTypeService(BaseVMTypeService):
         return oshelpers.to_server_paged_list(self.provider, cb_itypes, limit)
 
 
-class OpenStackBlockStoreService(BaseBlockStoreService):
+class OpenStackStorageService(BaseStorageService):
 
     def __init__(self, provider):
-        super(OpenStackBlockStoreService, self).__init__(provider)
+        super(OpenStackStorageService, self).__init__(provider)
 
         # Initialize provider services
         self._volume_svc = OpenStackVolumeService(self.provider)
         self._snapshot_svc = OpenStackSnapshotService(self.provider)
+        self._bucket_svc = OpenStackBucketService(self.provider)
 
     @property
     def volumes(self):
@@ -295,6 +296,10 @@ class OpenStackBlockStoreService(BaseBlockStoreService):
     def snapshots(self):
         return self._snapshot_svc
 
+    @property
+    def buckets(self):
+        return self._bucket_svc
+
 
 class OpenStackVolumeService(BaseVolumeService):
 
@@ -411,10 +416,10 @@ class OpenStackSnapshotService(BaseSnapshotService):
         return OpenStackSnapshot(self.provider, os_snap)
 
 
-class OpenStackObjectStoreService(BaseObjectStoreService):
+class OpenStackBucketService(BaseBucketService):
 
     def __init__(self, provider):
-        super(OpenStackObjectStoreService, self).__init__(provider)
+        super(OpenStackBucketService, self).__init__(provider)
 
     def get(self, bucket_id):
         """

+ 2 - 7
docs/api_docs/cloud/services.rst

@@ -28,9 +28,9 @@ SnapshotService
 .. autoclass:: cloudbridge.cloud.interfaces.services.SnapshotService
     :members:
 
-BlockStoreService
+StorageService
 -----------------
-.. autoclass:: cloudbridge.cloud.interfaces.services.BlockStoreService
+.. autoclass:: cloudbridge.cloud.interfaces.services.StorageService
     :members:
 
 ImageService
@@ -48,11 +48,6 @@ NetworkService
 .. autoclass:: cloudbridge.cloud.interfaces.services.NetworkService
     :members:
 
-ObjectStoreService
-------------------
-.. autoclass:: cloudbridge.cloud.interfaces.services.ObjectStoreService
-    :members:
-
 SecurityService
 ---------------
 .. autoclass:: cloudbridge.cloud.interfaces.services.SecurityService

+ 3 - 3
docs/concepts.rst

@@ -7,13 +7,13 @@ Conceptually, CloudBridge consists of the following types of objects.
 the gateway to using its services.
 
 2. Services - Represents a service provided by a cloud provider,
-such as its compute service, block storage service, object storage etc.
+such as its compute service, storage service, networking service etc.
 Services may in turn be divided into smaller services. Smaller services
 tend to have uniform methods, such as create, find and list. For example,
 InstanceService.list(), InstanceService.find() etc. which can be used
 to access cloud resources. Larger services tend to provide organisational
-structure only. For example, the block store service provides access to
-the VolumeService and SnapshotService.
+structure only. For example, the storage service provides access to
+the VolumeService, SnapshotService and BucketService.
 
 3. Resources - resources are objects returned by a service,
 and represent a remote resource. For example, InstanceService.list()

+ 3 - 3
docs/getting_started.rst

@@ -69,10 +69,10 @@ Once you have a reference to a provider, explore the cloud platform:
 
 .. code-block:: python
 
-    provider.compute.images.list()
     provider.security.security_groups.list()
-    provider.block_store.snapshots.list()
-    provider.object_store.list()
+    provider.compute.instance_types.list()
+    provider.storage.snapshots.list()
+    provider.storage.buckets.list()
 
 This will demonstrate the fact that the library was properly installed and your
 provider object is setup correctly but it is not very interesting. Therefore,

+ 3 - 3
docs/topics/block_storage.rst

@@ -14,9 +14,9 @@ performed via the :class:`.VolumeService`. To start, let's create a 1GB volume.
 
 .. code-block:: python
 
-    vol = provider.block_store.volumes.create('CloudBridge-vol', 1, 'us-east-1e')
+    vol = provider.storage.volumes.create('CloudBridge-vol', 1, 'us-east-1e')
     vol.wait_till_ready()
-    provider.block_store.volumes.list()
+    provider.storage.volumes.list()
 
 Next, let's attach the volume to a running instance as device ``/dev/sdh``::
 
@@ -54,7 +54,7 @@ long time for a snapshot to become ready, particularly on AWS.
 
 In order to make use of a snapshot, it is necessary to create a volume from it::
 
-    vol = provider.block_store.volumes.create(
+    vol = provider.storage.volumes.create(
         'CloudBridge-snap-vol', 1, 'us-east-1e', snapshot=snap)
 
 The newly created volume behaves just like any other volume and can be attached

+ 2 - 7
docs/topics/provider_development.rst

@@ -57,7 +57,7 @@ You should see the tests fail with the following message:
 .. code-block:: bash
 
     TypeError: Can't instantiate abstract class GCECloudProvider with abstract
-    methods block_store, compute, object_store, security, network
+    methods storage, compute, security, network
 
 6. Therefore, our next step is to implement these methods. We can start off by
 implementing these methods in ``provider.py`` and raising a
@@ -81,12 +81,7 @@ implementing these methods in ``provider.py`` and raising a
             "GCECloudProvider does not implement this service")
 
     @property
-    def block_store(self):
-        raise NotImplementedError(
-            "GCECloudProvider does not implement this service")
-
-    @property
-    def object_store(self):
+    def storage(self):
         raise NotImplementedError(
             "GCECloudProvider does not implement this service")
 

+ 15 - 15
test/test_block_store_service.py

@@ -18,14 +18,14 @@ import six
 
 class CloudBlockStoreServiceTestCase(ProviderTestBase):
 
-    @helpers.skipIfNoService(['block_store.volumes'])
+    @helpers.skipIfNoService(['storage.volumes'])
     def test_crud_volume(self):
         """
         Create a new volume, check whether the expected values are set,
         and delete it
         """
         def create_vol(name):
-            return self.provider.block_store.volumes.create(
+            return self.provider.storage.volumes.create(
                 name,
                 1,
                 helpers.get_provider_test_data(self.provider, "placement"))
@@ -35,10 +35,10 @@ class CloudBlockStoreServiceTestCase(ProviderTestBase):
             vol.wait_for([VolumeState.DELETED, VolumeState.UNKNOWN],
                          terminal_states=[VolumeState.ERROR])
 
-        sit.check_crud(self, self.provider.block_store.volumes, Volume,
+        sit.check_crud(self, self.provider.storage.volumes, Volume,
                        "cb_createvol", create_vol, cleanup_vol)
 
-    @helpers.skipIfNoService(['block_store.volumes'])
+    @helpers.skipIfNoService(['storage.volumes'])
     def test_attach_detach_volume(self):
         """
         Create a new volume, and attempt to attach it to an instance
@@ -55,7 +55,7 @@ class CloudBlockStoreServiceTestCase(ProviderTestBase):
             test_instance = helpers.get_test_instance(
                 self.provider, name, subnet=subnet)
 
-            test_vol = self.provider.block_store.volumes.create(
+            test_vol = self.provider.storage.volumes.create(
                 name, 1, test_instance.zone_id)
             with helpers.cleanup_action(lambda: test_vol.delete()):
                 test_vol.wait_till_ready()
@@ -68,7 +68,7 @@ class CloudBlockStoreServiceTestCase(ProviderTestBase):
                     [VolumeState.AVAILABLE],
                     terminal_states=[VolumeState.ERROR, VolumeState.DELETED])
 
-    @helpers.skipIfNoService(['block_store.volumes'])
+    @helpers.skipIfNoService(['storage.volumes'])
     def test_volume_properties(self):
         """
         Test volume properties
@@ -86,7 +86,7 @@ class CloudBlockStoreServiceTestCase(ProviderTestBase):
             test_instance = helpers.get_test_instance(
                 self.provider, name, subnet=subnet)
 
-            test_vol = self.provider.block_store.volumes.create(
+            test_vol = self.provider.storage.volumes.create(
                 name, 1, test_instance.zone_id, description=vol_desc)
             with helpers.cleanup_action(lambda: test_vol.delete()):
                 test_vol.wait_till_ready()
@@ -128,7 +128,7 @@ class CloudBlockStoreServiceTestCase(ProviderTestBase):
                     [VolumeState.AVAILABLE],
                     terminal_states=[VolumeState.ERROR, VolumeState.DELETED])
 
-    @helpers.skipIfNoService(['block_store.snapshots'])
+    @helpers.skipIfNoService(['storage.snapshots'])
     def test_crud_snapshot(self):
         """
         Create a new volume, create a snapshot of the volume, and check
@@ -136,7 +136,7 @@ class CloudBlockStoreServiceTestCase(ProviderTestBase):
         Delete everything afterwards.
         """
         name = "cb_crudsnap-{0}".format(helpers.get_uuid())
-        test_vol = self.provider.block_store.volumes.create(
+        test_vol = self.provider.storage.volumes.create(
             name,
             1,
             helpers.get_provider_test_data(self.provider, "placement"))
@@ -153,27 +153,27 @@ class CloudBlockStoreServiceTestCase(ProviderTestBase):
                     [SnapshotState.UNKNOWN],
                     terminal_states=[SnapshotState.ERROR])
 
-            sit.check_crud(self, self.provider.block_store.snapshots, Snapshot,
+            sit.check_crud(self, self.provider.storage.snapshots, Snapshot,
                            "cb_snap", create_snap, cleanup_snap)
 
             # Test creation of a snap via SnapshotService
             def create_snap2(name):
-                return self.provider.block_store.snapshots.create(
+                return self.provider.storage.snapshots.create(
                     name=name, volume=test_vol, description=name)
 
             if (self.provider.PROVIDER_ID == ProviderList.AWS and
                     not isinstance(self.provider, TestMockHelperMixin)):
                 time.sleep(15)  # Or get SnapshotCreationPerVolumeRateExceeded
-            sit.check_crud(self, self.provider.block_store.snapshots, Snapshot,
+            sit.check_crud(self, self.provider.storage.snapshots, Snapshot,
                            "cb_snaptwo", create_snap2, cleanup_snap)
 
-    @helpers.skipIfNoService(['block_store.snapshots'])
+    @helpers.skipIfNoService(['storage.snapshots'])
     def test_snapshot_properties(self):
         """
         Test snapshot properties
         """
         name = "cb_snapprop-{0}".format(uuid.uuid4())
-        test_vol = self.provider.block_store.volumes.create(
+        test_vol = self.provider.storage.volumes.create(
             name,
             1,
             helpers.get_provider_test_data(self.provider, "placement"))
@@ -211,7 +211,7 @@ class CloudBlockStoreServiceTestCase(ProviderTestBase):
 
                 # Test volume creation from a snapshot (via VolumeService)
                 sv_name = "cb_snapvol_{0}".format(test_snap.name)
-                snap_vol = self.provider.block_store.volumes.create(
+                snap_vol = self.provider.storage.volumes.create(
                     sv_name,
                     1,
                     helpers.get_provider_test_data(self.provider, "placement"),

+ 2 - 2
test/test_compute_service.py

@@ -204,7 +204,7 @@ class CloudComputeServiceTestCase(ProviderTestBase):
             (2 + vm_type.num_ephemeral_disks, len(lc.block_devices)))
 
     @helpers.skipIfNoService(['compute.instances', 'compute.images',
-                              'compute.vm_types', 'block_store.volumes'])
+                              'compute.vm_types', 'storage.volumes'])
     def test_block_device_mapping_attachments(self):
         name = "cb_blkattch-{0}".format(helpers.get_uuid())
 
@@ -212,7 +212,7 @@ class CloudComputeServiceTestCase(ProviderTestBase):
             raise self.skipTest("Not running BDM tests because OpenStack is"
                                 " not stable enough yet")
 
-        test_vol = self.provider.block_store.volumes.create(
+        test_vol = self.provider.storage.volumes.create(
            name,
            1,
            helpers.get_provider_test_data(self.provider,

+ 2 - 2
test/test_object_life_cycle.py

@@ -7,13 +7,13 @@ from cloudbridge.cloud.interfaces.exceptions import WaitStateException
 
 class CloudObjectLifeCycleTestCase(ProviderTestBase):
 
-    @helpers.skipIfNoService(['block_store.volumes'])
+    @helpers.skipIfNoService(['storage.volumes'])
     def test_object_life_cycle(self):
         """
         Test object life cycle methods by using a volume.
         """
         name = "cb_objlifecycle-{0}".format(helpers.get_uuid())
-        test_vol = self.provider.block_store.volumes.create(
+        test_vol = self.provider.storage.volumes.create(
             name,
             1,
             helpers.get_provider_test_data(self.provider, "placement"))

+ 15 - 15
test/test_object_store_service.py

@@ -21,14 +21,14 @@ import requests
 
 class CloudObjectStoreServiceTestCase(ProviderTestBase):
 
-    @helpers.skipIfNoService(['object_store'])
+    @helpers.skipIfNoService(['storage.buckets'])
     def test_crud_bucket(self):
         """
         Create a new bucket, check whether the expected values are set,
         and delete it.
         """
         def create_bucket(name):
-            return self.provider.object_store.create(name)
+            return self.provider.storage.buckets.create(name)
 
         def cleanup_bucket(bucket):
             bucket.delete()
@@ -49,11 +49,11 @@ class CloudObjectStoreServiceTestCase(ProviderTestBase):
             # bucket name cannot be an IP address
             create_bucket("197.10.100.42")
 
-        sit.check_crud(self, self.provider.object_store, Bucket,
+        sit.check_crud(self, self.provider.storage.buckets, Bucket,
                        "cb-crudbucket", create_bucket, cleanup_bucket,
                        skip_name_check=True)
 
-    @helpers.skipIfNoService(['object_store'])
+    @helpers.skipIfNoService(['storage.buckets'])
     def test_crud_bucket_object(self):
         test_bucket = None
 
@@ -71,13 +71,13 @@ class CloudObjectStoreServiceTestCase(ProviderTestBase):
 
         with helpers.cleanup_action(lambda: test_bucket.delete()):
             name = "cb-crudbucketobj-{0}".format(uuid.uuid4())
-            test_bucket = self.provider.object_store.create(name)
+            test_bucket = self.provider.storage.buckets.create(name)
 
             sit.check_crud(self, test_bucket, BucketObject,
                            "cb_bucketobj", create_bucket_obj,
                            cleanup_bucket_obj, skip_name_check=True)
 
-    @helpers.skipIfNoService(['object_store'])
+    @helpers.skipIfNoService(['storage.buckets'])
     def test_crud_bucket_object_properties(self):
         """
         Create a new bucket, upload some contents into the bucket, and
@@ -85,7 +85,7 @@ class CloudObjectStoreServiceTestCase(ProviderTestBase):
         Delete everything afterwards.
         """
         name = "cbtestbucketobjs-{0}".format(uuid.uuid4())
-        test_bucket = self.provider.object_store.create(name)
+        test_bucket = self.provider.storage.buckets.create(name)
 
         # ensure that the bucket is empty
         objects = test_bucket.list()
@@ -132,10 +132,10 @@ class CloudObjectStoreServiceTestCase(ProviderTestBase):
 
             sit.check_delete(self, test_bucket, obj)
 
-    @helpers.skipIfNoService(['object_store'])
+    @helpers.skipIfNoService(['storage.buckets'])
     def test_upload_download_bucket_content(self):
         name = "cbtestbucketobjs-{0}".format(uuid.uuid4())
-        test_bucket = self.provider.object_store.create(name)
+        test_bucket = self.provider.storage.buckets.create(name)
 
         with helpers.cleanup_action(lambda: test_bucket.delete()):
             obj_name = "hello_upload_download.txt"
@@ -155,13 +155,13 @@ class CloudObjectStoreServiceTestCase(ProviderTestBase):
                     target_stream2.write(data)
                 self.assertEqual(target_stream2.getvalue(), content)
 
-    @helpers.skipIfNoService(['object_store'])
+    @helpers.skipIfNoService(['storage.buckets'])
     def test_generate_url(self):
         if self.provider.PROVIDER_ID == ProviderList.OPENSTACK:
             raise self.skipTest("Skip until OpenStack impl is provided")
 
         name = "cbtestbucketobjs-{0}".format(uuid.uuid4())
-        test_bucket = self.provider.object_store.create(name)
+        test_bucket = self.provider.storage.buckets.create(name)
 
         with helpers.cleanup_action(lambda: test_bucket.delete()):
             obj_name = "hello_upload_download.txt"
@@ -180,10 +180,10 @@ class CloudObjectStoreServiceTestCase(ProviderTestBase):
                         " access generated url")
                 self.assertEqual(requests.get(url).content, content)
 
-    @helpers.skipIfNoService(['object_store'])
+    @helpers.skipIfNoService(['storage.buckets'])
     def test_upload_download_bucket_content_from_file(self):
         name = "cbtestbucketobjs-{0}".format(uuid.uuid4())
-        test_bucket = self.provider.object_store.create(name)
+        test_bucket = self.provider.storage.buckets.create(name)
 
         with helpers.cleanup_action(lambda: test_bucket.delete()):
             obj_name = "hello_upload_download.txt"
@@ -199,7 +199,7 @@ class CloudObjectStoreServiceTestCase(ProviderTestBase):
                     self.assertEqual(target_stream.getvalue(), f.read())
 
     @skip("Skip unless you want to test swift objects bigger than 5 Gig")
-    @helpers.skipIfNoService(['object_store'])
+    @helpers.skipIfNoService(['storage.buckets'])
     def test_upload_download_bucket_content_with_large_file(self):
         """
         Creates a 6 Gig file in the temp directory, then uploads it to
@@ -214,7 +214,7 @@ class CloudObjectStoreServiceTestCase(ProviderTestBase):
         with helpers.cleanup_action(lambda: os.remove(six_gig_file)):
             download_file = "{0}/cbtestfile-{1}".format(temp_dir, file_name)
             bucket_name = "cbtestbucketlargeobjs-{0}".format(uuid.uuid4())
-            test_bucket = self.provider.object_store.create(bucket_name)
+            test_bucket = self.provider.storage.buckets.create(bucket_name)
             with helpers.cleanup_action(lambda: test_bucket.delete()):
                 test_obj = test_bucket.create_object(file_name)
                 with helpers.cleanup_action(lambda: test_obj.delete()):