Browse Source

Refactored base.py by splitting it into a package.

Nuwan Goonasekera 10 years ago
parent
commit
038366fd10

+ 4 - 0
cloudbridge/cloud/base/__init__.py

@@ -0,0 +1,4 @@
+"""
+Public interface exports
+"""
+from .impl import BaseCloudProvider  # noqa

+ 92 - 0
cloudbridge/cloud/base/impl.py

@@ -0,0 +1,92 @@
+"""
+Base implementation of a provider interface
+"""
+import os
+
+from cloudbridge.cloud.interfaces import CloudProvider
+from cloudbridge.cloud.interfaces.resources import Configuration
+
+DEFAULT_RESULT_LIMIT = 50
+
+
+class BaseConfiguration(Configuration):
+
+    def __init__(self, user_config):
+        self.update(user_config)
+
+    @property
+    def default_result_limit(self):
+        """
+        Get the maximum number of results to return for a
+        list method
+
+        :rtype: ``int``
+        :return: The maximum number of results to return
+        """
+        return self.get('default_result_limit', DEFAULT_RESULT_LIMIT)
+
+    @property
+    def debug_mode(self):
+        """
+        A flag indicating whether CloudBridge is in debug mode. Setting
+        this to True will cause the underlying provider's debug
+        output to be turned on.
+
+        The flag can be toggled by sending in the cb_debug value via
+        the config dictionary, or setting the CB_DEBUG environment variable.
+
+        :rtype: ``bool``
+        :return: Whether debug mode is on.
+        """
+        return self.get('cb_debug', os.environ.get('CB_DEBUG', False))
+
+
+class BaseCloudProvider(CloudProvider):
+
+    def __init__(self, config):
+        self._config = BaseConfiguration(config)
+
+    @property
+    def config(self):
+        return self._config
+
+    @property
+    def name(self):
+        return str(self.__class__.__name__)
+
+    def has_service(self, service_type):
+        """
+        Checks whether this provider supports a given service.
+
+        :type service_type: str or :class:``.CloudServiceType``
+        :param service_type: Type of service to check support for.
+
+        :rtype: bool
+        :return: ``True`` if the service type is supported.
+        """
+        try:
+            if getattr(self, service_type):
+                return True
+        except AttributeError:
+            pass  # Undefined service type
+        return False
+
+    def _get_config_value(self, key, default_value):
+        """
+        A convenience method to extract a configuration value.
+
+        :type key: str
+        :param key: a field to look for in the ``self.config`` field
+
+        :type default_value: anything
+        : param default_value: the default value to return if a value for the
+                               ``key`` is not available
+
+        :return: a configuration value for the supplied ``key``
+        """
+        if isinstance(self.config, dict):
+            return self.config.get(key, default_value)
+        else:
+            return getattr(self.config, key) if hasattr(
+                self.config, key) and getattr(self.config, key) else \
+                default_value

+ 1 - 220
cloudbridge/cloud/base.py → cloudbridge/cloud/base/resources.py

@@ -1,21 +1,16 @@
 """
-Implementation of common methods across cloud providers.
+Base implementation for data objects exposed through a provider or service
 """
-
 import itertools
 import logging
-import os
 import time
-
 import six
 
-from cloudbridge.cloud.interfaces import CloudProvider
 from cloudbridge.cloud.interfaces.resources \
     import InvalidConfigurationException
 from cloudbridge.cloud.interfaces.resources import Bucket
 from cloudbridge.cloud.interfaces.resources import BucketObject
 from cloudbridge.cloud.interfaces.resources import CloudResource
-from cloudbridge.cloud.interfaces.resources import Configuration
 from cloudbridge.cloud.interfaces.resources import Instance
 from cloudbridge.cloud.interfaces.resources import InstanceState
 from cloudbridge.cloud.interfaces.resources import InstanceType
@@ -35,108 +30,10 @@ from cloudbridge.cloud.interfaces.resources import SnapshotState
 from cloudbridge.cloud.interfaces.resources import Volume
 from cloudbridge.cloud.interfaces.resources import VolumeState
 from cloudbridge.cloud.interfaces.resources import WaitStateException
-from cloudbridge.cloud.interfaces.services import BlockStoreService
-from cloudbridge.cloud.interfaces.services import CloudService
-from cloudbridge.cloud.interfaces.services import ComputeService
-from cloudbridge.cloud.interfaces.services import ImageService
-from cloudbridge.cloud.interfaces.services import InstanceService
-from cloudbridge.cloud.interfaces.services import InstanceTypesService
-from cloudbridge.cloud.interfaces.services import KeyPairService
-from cloudbridge.cloud.interfaces.services import ObjectStoreService
-from cloudbridge.cloud.interfaces.services import RegionService
-from cloudbridge.cloud.interfaces.services import SecurityGroupService
-from cloudbridge.cloud.interfaces.services import SecurityService
-from cloudbridge.cloud.interfaces.services import SnapshotService
-from cloudbridge.cloud.interfaces.services import VolumeService
 
 
 log = logging.getLogger(__name__)
 
-DEFAULT_RESULT_LIMIT = 50
-
-
-class BaseConfiguration(Configuration):
-
-    def __init__(self, user_config):
-        self.update(user_config)
-
-    @property
-    def default_result_limit(self):
-        """
-        Get the maximum number of results to return for a
-        list method
-
-        :rtype: ``int``
-        :return: The maximum number of results to return
-        """
-        return self.get('default_result_limit', DEFAULT_RESULT_LIMIT)
-
-    @property
-    def debug_mode(self):
-        """
-        A flag indicating whether CloudBridge is in debug mode. Setting
-        this to True will cause the underlying provider's debug
-        output to be turned on.
-
-        The flag can be toggled by sending in the cb_debug value via
-        the config dictionary, or setting the CB_DEBUG environment variable.
-
-        :rtype: ``bool``
-        :return: Whether debug mode is on.
-        """
-        return self.get('cb_debug', os.environ.get('CB_DEBUG', False))
-
-
-class BaseCloudProvider(CloudProvider):
-
-    def __init__(self, config):
-        self._config = BaseConfiguration(config)
-
-    @property
-    def config(self):
-        return self._config
-
-    @property
-    def name(self):
-        return str(self.__class__.__name__)
-
-    def has_service(self, service_type):
-        """
-        Checks whether this provider supports a given service.
-
-        :type service_type: str or :class:``.CloudServiceType``
-        :param service_type: Type of service to check support for.
-
-        :rtype: bool
-        :return: ``True`` if the service type is supported.
-        """
-        try:
-            if getattr(self, service_type):
-                return True
-        except AttributeError:
-            pass  # Undefined service type
-        return False
-
-    def _get_config_value(self, key, default_value):
-        """
-        A convenience method to extract a configuration value.
-
-        :type key: str
-        :param key: a field to look for in the ``self.config`` field
-
-        :type default_value: anything
-        : param default_value: the default value to return if a value for the
-                               ``key`` is not available
-
-        :return: a configuration value for the supplied ``key``
-        """
-        if isinstance(self.config, dict):
-            return self.config.get(key, default_value)
-        else:
-            return getattr(self.config, key) if hasattr(
-                self.config, key) and getattr(self.config, key) else \
-                default_value
-
 
 class BaseCloudResource(CloudResource):
 
@@ -684,119 +581,3 @@ class BaseBucket(BasePageableObjectMixin, Bucket, BaseCloudResource):
     def __repr__(self):
         return "<CB-{0}: {1}>".format(self.__class__.__name__,
                                       self.name)
-
-
-class BaseCloudService(CloudService):
-
-    def __init__(self, provider):
-        self._provider = provider
-
-    @property
-    def provider(self):
-        return self._provider
-
-
-class BaseComputeService(ComputeService, BaseCloudService):
-
-    def __init__(self, provider):
-        super(BaseComputeService, self).__init__(provider)
-
-
-class BaseVolumeService(
-        BasePageableObjectMixin, VolumeService, BaseCloudService):
-
-    def __init__(self, provider):
-        super(BaseVolumeService, self).__init__(provider)
-
-
-class BaseSnapshotService(
-        BasePageableObjectMixin, SnapshotService, BaseCloudService):
-
-    def __init__(self, provider):
-        super(BaseSnapshotService, self).__init__(provider)
-
-
-class BaseBlockStoreService(BlockStoreService, BaseCloudService):
-
-    def __init__(self, provider):
-        super(BaseBlockStoreService, self).__init__(provider)
-
-
-class BaseImageService(
-        BasePageableObjectMixin, ImageService, BaseCloudService):
-
-    def __init__(self, provider):
-        super(BaseImageService, self).__init__(provider)
-
-
-class BaseObjectStoreService(
-        BasePageableObjectMixin, ObjectStoreService, BaseCloudService):
-
-    def __init__(self, provider):
-        super(BaseObjectStoreService, self).__init__(provider)
-
-
-class BaseSecurityService(SecurityService, BaseCloudService):
-
-    def __init__(self, provider):
-        super(BaseSecurityService, self).__init__(provider)
-
-
-class BaseKeyPairService(
-        BasePageableObjectMixin, KeyPairService, BaseCloudService):
-
-    def __init__(self, provider):
-        super(BaseKeyPairService, self).__init__(provider)
-
-    def delete(self, keypair_id):
-        """
-        Delete an existing key pair.
-
-        :type keypair_id: str
-        :param keypair_id: The id of the key pair to be deleted.
-
-        :rtype: ``bool``
-        :return:  ``True`` if the key does not exist. Note that this implies
-                  that the key may not have been deleted by this method but
-                  instead has not existed in the first place.
-        """
-        kp = self.get(keypair_id)
-        if kp:
-            kp.delete()
-        return True
-
-
-class BaseSecurityGroupService(
-        BasePageableObjectMixin, SecurityGroupService, BaseCloudService):
-
-    def __init__(self, provider):
-        super(BaseSecurityGroupService, self).__init__(provider)
-
-
-class BaseInstanceTypesService(
-        BasePageableObjectMixin, InstanceTypesService, BaseCloudService):
-
-    def __init__(self, provider):
-        super(BaseInstanceTypesService, self).__init__(provider)
-
-    def find(self, **kwargs):
-        name = kwargs.get('name')
-        if name:
-            return [itype for itype in self.list() if itype.name == name]
-        else:
-            raise TypeError(
-                "Invalid parameters for search. Supported attributes: {name}")
-
-
-class BaseInstanceService(
-        BasePageableObjectMixin, InstanceService, BaseCloudService):
-
-    def __init__(self, provider):
-        super(BaseInstanceService, self).__init__(provider)
-
-
-class BaseRegionService(
-        BasePageableObjectMixin, RegionService, BaseCloudService):
-
-    def __init__(self, provider):
-        super(BaseRegionService, self).__init__(provider)

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

@@ -0,0 +1,133 @@
+"""
+Base implementation for services available through a provider
+"""
+from cloudbridge.cloud.interfaces.services import BlockStoreService
+from cloudbridge.cloud.interfaces.services import CloudService
+from cloudbridge.cloud.interfaces.services import ComputeService
+from cloudbridge.cloud.interfaces.services import ImageService
+from cloudbridge.cloud.interfaces.services import InstanceService
+from cloudbridge.cloud.interfaces.services import InstanceTypesService
+from cloudbridge.cloud.interfaces.services import KeyPairService
+from cloudbridge.cloud.interfaces.services import ObjectStoreService
+from cloudbridge.cloud.interfaces.services import RegionService
+from cloudbridge.cloud.interfaces.services import SecurityGroupService
+from cloudbridge.cloud.interfaces.services import SecurityService
+from cloudbridge.cloud.interfaces.services import SnapshotService
+from cloudbridge.cloud.interfaces.services import VolumeService
+from .resources import BasePageableObjectMixin
+
+
+class BaseCloudService(CloudService):
+
+    def __init__(self, provider):
+        self._provider = provider
+
+    @property
+    def provider(self):
+        return self._provider
+
+
+class BaseComputeService(ComputeService, BaseCloudService):
+
+    def __init__(self, provider):
+        super(BaseComputeService, self).__init__(provider)
+
+
+class BaseVolumeService(
+        BasePageableObjectMixin, VolumeService, BaseCloudService):
+
+    def __init__(self, provider):
+        super(BaseVolumeService, self).__init__(provider)
+
+
+class BaseSnapshotService(
+        BasePageableObjectMixin, SnapshotService, BaseCloudService):
+
+    def __init__(self, provider):
+        super(BaseSnapshotService, self).__init__(provider)
+
+
+class BaseBlockStoreService(BlockStoreService, BaseCloudService):
+
+    def __init__(self, provider):
+        super(BaseBlockStoreService, self).__init__(provider)
+
+
+class BaseImageService(
+        BasePageableObjectMixin, ImageService, BaseCloudService):
+
+    def __init__(self, provider):
+        super(BaseImageService, self).__init__(provider)
+
+
+class BaseObjectStoreService(
+        BasePageableObjectMixin, ObjectStoreService, BaseCloudService):
+
+    def __init__(self, provider):
+        super(BaseObjectStoreService, self).__init__(provider)
+
+
+class BaseSecurityService(SecurityService, BaseCloudService):
+
+    def __init__(self, provider):
+        super(BaseSecurityService, self).__init__(provider)
+
+
+class BaseKeyPairService(
+        BasePageableObjectMixin, KeyPairService, BaseCloudService):
+
+    def __init__(self, provider):
+        super(BaseKeyPairService, self).__init__(provider)
+
+    def delete(self, keypair_id):
+        """
+        Delete an existing key pair.
+
+        :type keypair_id: str
+        :param keypair_id: The id of the key pair to be deleted.
+
+        :rtype: ``bool``
+        :return:  ``True`` if the key does not exist. Note that this implies
+                  that the key may not have been deleted by this method but
+                  instead has not existed in the first place.
+        """
+        kp = self.get(keypair_id)
+        if kp:
+            kp.delete()
+        return True
+
+
+class BaseSecurityGroupService(
+        BasePageableObjectMixin, SecurityGroupService, BaseCloudService):
+
+    def __init__(self, provider):
+        super(BaseSecurityGroupService, self).__init__(provider)
+
+
+class BaseInstanceTypesService(
+        BasePageableObjectMixin, InstanceTypesService, BaseCloudService):
+
+    def __init__(self, provider):
+        super(BaseInstanceTypesService, self).__init__(provider)
+
+    def find(self, **kwargs):
+        name = kwargs.get('name')
+        if name:
+            return [itype for itype in self.list() if itype.name == name]
+        else:
+            raise TypeError(
+                "Invalid parameters for search. Supported attributes: {name}")
+
+
+class BaseInstanceService(
+        BasePageableObjectMixin, InstanceService, BaseCloudService):
+
+    def __init__(self, provider):
+        super(BaseInstanceService, self).__init__(provider)
+
+
+class BaseRegionService(
+        BasePageableObjectMixin, RegionService, BaseCloudService):
+
+    def __init__(self, provider):
+        super(BaseRegionService, self).__init__(provider)

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

@@ -7,19 +7,19 @@ from boto.exception import EC2ResponseError
 from boto.s3.key import Key
 from retrying import retry
 
-from cloudbridge.cloud.base import BaseBucket
-from cloudbridge.cloud.base import BaseBucketObject
-from cloudbridge.cloud.base import BaseInstance
-from cloudbridge.cloud.base import BaseInstanceType
-from cloudbridge.cloud.base import BaseKeyPair
-from cloudbridge.cloud.base import BaseMachineImage
-from cloudbridge.cloud.base import BasePlacementZone
-from cloudbridge.cloud.base import BaseRegion
-from cloudbridge.cloud.base import BaseSecurityGroup
-from cloudbridge.cloud.base import BaseSecurityGroupRule
-from cloudbridge.cloud.base import BaseSnapshot
-from cloudbridge.cloud.base import BaseVolume
-from cloudbridge.cloud.base import ClientPagedResultList
+from cloudbridge.cloud.base.resources import BaseBucket
+from cloudbridge.cloud.base.resources import BaseBucketObject
+from cloudbridge.cloud.base.resources import BaseInstance
+from cloudbridge.cloud.base.resources import BaseInstanceType
+from cloudbridge.cloud.base.resources import BaseKeyPair
+from cloudbridge.cloud.base.resources import BaseMachineImage
+from cloudbridge.cloud.base.resources import BasePlacementZone
+from cloudbridge.cloud.base.resources import BaseRegion
+from cloudbridge.cloud.base.resources import BaseSecurityGroup
+from cloudbridge.cloud.base.resources import BaseSecurityGroupRule
+from cloudbridge.cloud.base.resources import BaseSnapshot
+from cloudbridge.cloud.base.resources import BaseVolume
+from cloudbridge.cloud.base.resources import ClientPagedResultList
 from cloudbridge.cloud.interfaces.resources import InstanceState
 from cloudbridge.cloud.interfaces.resources import MachineImageState
 from cloudbridge.cloud.interfaces.resources import SnapshotState

+ 15 - 15
cloudbridge/cloud/providers/aws/services.py

@@ -8,21 +8,21 @@ from boto.ec2.blockdevicemapping import BlockDeviceType
 from boto.exception import EC2ResponseError
 import requests
 
-from cloudbridge.cloud.base import BaseBlockStoreService
-from cloudbridge.cloud.base import BaseComputeService
-from cloudbridge.cloud.base import BaseImageService
-from cloudbridge.cloud.base import BaseInstanceService
-from cloudbridge.cloud.base import BaseInstanceTypesService
-from cloudbridge.cloud.base import BaseKeyPairService
-from cloudbridge.cloud.base import BaseLaunchConfig
-from cloudbridge.cloud.base import BaseObjectStoreService
-from cloudbridge.cloud.base import BaseRegionService
-from cloudbridge.cloud.base import BaseSecurityGroupService
-from cloudbridge.cloud.base import BaseSecurityService
-from cloudbridge.cloud.base import BaseSnapshotService
-from cloudbridge.cloud.base import BaseVolumeService
-from cloudbridge.cloud.base import ClientPagedResultList
-from cloudbridge.cloud.base import ServerPagedResultList
+from cloudbridge.cloud.base.resources import BaseLaunchConfig
+from cloudbridge.cloud.base.resources import ClientPagedResultList
+from cloudbridge.cloud.base.resources import ServerPagedResultList
+from cloudbridge.cloud.base.services import BaseBlockStoreService
+from cloudbridge.cloud.base.services import BaseComputeService
+from cloudbridge.cloud.base.services import BaseImageService
+from cloudbridge.cloud.base.services import BaseInstanceService
+from cloudbridge.cloud.base.services import BaseInstanceTypesService
+from cloudbridge.cloud.base.services import BaseKeyPairService
+from cloudbridge.cloud.base.services import BaseObjectStoreService
+from cloudbridge.cloud.base.services import BaseRegionService
+from cloudbridge.cloud.base.services import BaseSecurityGroupService
+from cloudbridge.cloud.base.services import BaseSecurityService
+from cloudbridge.cloud.base.services import BaseSnapshotService
+from cloudbridge.cloud.base.services import BaseVolumeService
 from cloudbridge.cloud.interfaces.resources \
     import InvalidConfigurationException
 from cloudbridge.cloud.interfaces.resources import InstanceType

+ 1 - 1
cloudbridge/cloud/providers/openstack/helpers.py

@@ -2,7 +2,7 @@
 Helper functions
 """
 import itertools
-from cloudbridge.cloud.base import ServerPagedResultList
+from cloudbridge.cloud.base.resources import ServerPagedResultList
 
 
 def os_result_limit(provider, requested_limit):

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

@@ -6,18 +6,18 @@ import shutil
 import ipaddress
 from swiftclient.exceptions import ClientException
 
-from cloudbridge.cloud.base import BaseBucket
-from cloudbridge.cloud.base import BaseBucketObject
-from cloudbridge.cloud.base import BaseInstance
-from cloudbridge.cloud.base import BaseInstanceType
-from cloudbridge.cloud.base import BaseKeyPair
-from cloudbridge.cloud.base import BaseMachineImage
-from cloudbridge.cloud.base import BasePlacementZone
-from cloudbridge.cloud.base import BaseRegion
-from cloudbridge.cloud.base import BaseSecurityGroup
-from cloudbridge.cloud.base import BaseSecurityGroupRule
-from cloudbridge.cloud.base import BaseSnapshot
-from cloudbridge.cloud.base import BaseVolume
+from cloudbridge.cloud.base.resources import BaseBucket
+from cloudbridge.cloud.base.resources import BaseBucketObject
+from cloudbridge.cloud.base.resources import BaseInstance
+from cloudbridge.cloud.base.resources import BaseInstanceType
+from cloudbridge.cloud.base.resources import BaseKeyPair
+from cloudbridge.cloud.base.resources import BaseMachineImage
+from cloudbridge.cloud.base.resources import BasePlacementZone
+from cloudbridge.cloud.base.resources import BaseRegion
+from cloudbridge.cloud.base.resources import BaseSecurityGroup
+from cloudbridge.cloud.base.resources import BaseSecurityGroupRule
+from cloudbridge.cloud.base.resources import BaseSnapshot
+from cloudbridge.cloud.base.resources import BaseVolume
 from cloudbridge.cloud.interfaces.resources import InstanceState
 from cloudbridge.cloud.interfaces.resources import MachineImageState
 from cloudbridge.cloud.interfaces.resources import SnapshotState

+ 14 - 14
cloudbridge/cloud/providers/openstack/services.py

@@ -7,20 +7,20 @@ import re
 from cinderclient.exceptions import NotFound as CinderNotFound
 from novaclient.exceptions import NotFound as NovaNotFound
 
-from cloudbridge.cloud.base import BaseBlockStoreService
-from cloudbridge.cloud.base import BaseComputeService
-from cloudbridge.cloud.base import BaseImageService
-from cloudbridge.cloud.base import BaseInstanceService
-from cloudbridge.cloud.base import BaseInstanceTypesService
-from cloudbridge.cloud.base import BaseKeyPairService
-from cloudbridge.cloud.base import BaseLaunchConfig
-from cloudbridge.cloud.base import BaseObjectStoreService
-from cloudbridge.cloud.base import BaseRegionService
-from cloudbridge.cloud.base import BaseSecurityGroupService
-from cloudbridge.cloud.base import BaseSecurityService
-from cloudbridge.cloud.base import BaseSnapshotService
-from cloudbridge.cloud.base import BaseVolumeService
-from cloudbridge.cloud.base import ClientPagedResultList
+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 BaseComputeService
+from cloudbridge.cloud.base.services import BaseImageService
+from cloudbridge.cloud.base.services import BaseInstanceService
+from cloudbridge.cloud.base.services import BaseInstanceTypesService
+from cloudbridge.cloud.base.services import BaseKeyPairService
+from cloudbridge.cloud.base.services import BaseObjectStoreService
+from cloudbridge.cloud.base.services import BaseRegionService
+from cloudbridge.cloud.base.services import BaseSecurityGroupService
+from cloudbridge.cloud.base.services import BaseSecurityService
+from cloudbridge.cloud.base.services import BaseSnapshotService
+from cloudbridge.cloud.base.services import BaseVolumeService
 from cloudbridge.cloud.interfaces.resources import InstanceType
 from cloudbridge.cloud.interfaces.resources import KeyPair
 from cloudbridge.cloud.interfaces.resources import MachineImage

+ 2 - 2
test/test_cloud_helpers.py

@@ -1,7 +1,7 @@
 import itertools
 
-from cloudbridge.cloud.base import ClientPagedResultList
-from cloudbridge.cloud.base import ServerPagedResultList
+from cloudbridge.cloud.base.resources import ClientPagedResultList
+from cloudbridge.cloud.base.resources import ServerPagedResultList
 from test.helpers import ProviderTestBase