Sfoglia il codice sorgente

Refactoring and consistency improvement.

nuwan_ag 10 anni fa
parent
commit
9c5a9723ca

+ 4 - 7
cloudbridge/providers/ec2/__init__.py

@@ -6,12 +6,12 @@ import boto
 import os
 from boto.ec2.regioninfo import RegionInfo
 
-from cloudbridge.providers.interfaces import CloudProvider
+from cloudbridge.providers.base import BaseCloudProvider
 from cloudbridge.providers.interfaces import SecurityService
 from cloudbridge.providers.interfaces import KeyPair
 
 
-class EC2CloudProviderV1(CloudProvider):
+class EC2CloudProviderV1(BaseCloudProvider):
 
     def __init__(self, config):
         self.config = config
@@ -75,8 +75,5 @@ class EC2SecurityService(SecurityService):
         :rtype: ``list`` of :class:`.KeyPair`
         :return:  list of KeyPair objects
         """
-        kps = self.provider.ec2_conn.get_all_key_pairs()
-        kpl = []
-        for kp in kps:
-            kpl.append(KeyPair(kp.name))
-        return kpl
+        key_pairs = self.provider.ec2_conn.get_all_key_pairs()
+        return [KeyPair(kp.name) for kp in key_pairs]

+ 26 - 13
cloudbridge/providers/factory.py

@@ -24,12 +24,12 @@ class CloudProviderFactory():
         :rtype: list
         :return: A list of available providers and their interface versions.
         """
-        return [{"name": "openstack",
-                 "implementation":
+        return [{"name": ProviderList.OPENSTACK,
+                 "implementations":
                  [{"class": "cloudbridge.providers.openstack.OpenStackCloudProviderV1",
                    "version": 1}]},
-                {"name": "ec2",
-                 "implementation":
+                {"name": ProviderList.EC2,
+                 "implementations":
                  [{"class": "cloudbridge.providers.ec2.EC2CloudProviderV1",
                    "version": 1}]}]
 
@@ -52,7 +52,7 @@ class CloudProviderFactory():
         for provider in self.list_providers():
             if provider['name'] == name:
                 if version:
-                    match = [item for item in provider["implementation"]
+                    match = [item for item in provider["implementations"]
                              if item["version"] == version]
                     if match:
                         return match[0]["class"]
@@ -60,7 +60,7 @@ class CloudProviderFactory():
                         return None
                 else:
                     # Return latest available version
-                    return sorted((item for item in provider["implementation"]),
+                    return sorted((item for item in provider["implementations"]),
                                   key=lambda x: x["version"])[-1]["class"]
         return None
 
@@ -82,13 +82,26 @@ class CloudProviderFactory():
         :return:  a concrete provider instance
         :rtype: ``object`` of :class:`.CloudProvider`
         """
-        provider = self.find_provider_impl(name, version=version)
-        if provider is None:
+        impl = self.find_provider_impl(name, version=version)
+        if impl is None:
             raise NotImplementedError(
                 'A provider by name {0} implementing interface v1 could not be '
                 'found'.format(name))
-        else:
-            module_name, class_name = provider.rsplit(".", 1)
-            provider_class = getattr(importlib.import_module(module_name),
-                                     class_name)
-            return provider_class(config)
+        provider_class = self._get_provider_class(impl)
+        return provider_class(config)
+
+    def _get_provider_class(self, impl):
+        module_name, class_name = impl.rsplit(".", 1)
+        provider_class = getattr(importlib.import_module(module_name),
+                                 class_name)
+        return provider_class
+
+    def get_all_provider_classes(self):
+        """
+        Returns a list of classes for all available provider implementations
+        """
+        all_providers = []
+        for provider in self.list_providers():
+            for impl in provider["implementations"]:
+                all_providers.append(self._get_provider_class(impl["class"]))
+        return all_providers

+ 54 - 46
cloudbridge/providers/interfaces.py

@@ -52,6 +52,17 @@ class CloudProvider():
         raise NotImplementedError(
             'has_service not implemented by this provider')
 
+    def account(self):
+        """
+        Provides access to all user account related services in this provider.
+        This includes listing available tenancies.
+
+        :rtype: ``object`` of :class:`.ComputeService`
+        :return:  a ComputeService object
+        """
+        raise NotImplementedError(
+            'CloudProvider.Compute not implemented by this provider')
+
     def compute(self):
         """
         Provides access to all compute related services in this provider.
@@ -105,10 +116,10 @@ class CloudProvider():
             'CloudProvider.ObjectStore not implemented by this provider')
 
 
-class ComputeService():
+class ProviderService():
 
     """
-    Base interface for compute service supported by a provider
+    Base interface for any service supported by a provider
     """
 
     def provider(self):
@@ -121,6 +132,13 @@ class ComputeService():
         raise NotImplementedError(
             'ComputeService.Provider not implemented by this provider')
 
+
+class ComputeService(ProviderService):
+
+    """
+    Base interface for compute service supported by a provider
+    """
+
     def get_instance(self, id):
         """
         Returns an instance given its id.
@@ -182,22 +200,12 @@ class ComputeService():
             'create_instance not implemented by this provider')
 
 
-class VolumeService():
+class VolumeService(ProviderService):
 
     """
     Base interface for a Volume Service
     """
 
-    def provider(self):
-        """
-        Returns the provider instance associated with this Service
-
-        :rtype: ``object`` of :class:`.CloudProvider`
-        :return: a CloudProvider object
-        """
-        raise NotImplementedError(
-            'VolumeService.Provider not implemented by this provider')
-
     def get_volume(self, id):
         """
         Returns a volume given its id.
@@ -249,22 +257,12 @@ class VolumeService():
             'create_volume not implemented by this provider')
 
 
-class ImageService():
+class ImageService(ProviderService):
 
     """
     Base interface for an Image Service
     """
 
-    def provider(self):
-        """
-        Returns the provider instance associated with this service
-
-        :rtype: ``object`` of :class:`.CloudProvider`
-        :return:   a  provider instance
-        """
-        raise NotImplementedError(
-            'ImageService.Provider not implemented by this provider')
-
     def get_image(self, id):
         """
         Returns an Image given its id
@@ -305,22 +303,12 @@ class ImageService():
             'create_image not implemented by this provider')
 
 
-class ObjectStoreService():
+class ObjectStoreService(ProviderService):
 
     """
     Base interface for an Object Storage Service
     """
 
-    def provider(self):
-        """
-        Returns the provider instance associated with this service
-
-        :rtype: ``object`` of :class:`.CloudProvider`
-        :return:   a  provider instance
-        """
-        raise NotImplementedError(
-            'ObjectStoreService.Provider not implemented by this provider')
-
     def get_container(self, id):
         """
         Returns a container given its id
@@ -361,22 +349,12 @@ class ObjectStoreService():
             'create_container not implemented by this provider')
 
 
-class SecurityService():
+class SecurityService(ProviderService):
 
     """
     Base interface for an Image Service
     """
 
-    def provider(self):
-        """
-        Returns the provider instance associated with this service
-
-        :rtype: ``object`` of :class:`.CloudProvider`
-        :return:   a  provider instance
-        """
-        raise NotImplementedError(
-            'ComputeService.Provider not implemented by this provider')
-
     def list_key_pairs(self):
         """
         List all key pairs.
@@ -397,6 +375,36 @@ class SecurityService():
         raise NotImplementedError(
             'create_key_pair not implemented by this provider')
 
+    def list_security_groups(self):
+        """
+        Create a new SecurityGroup.
+
+        :rtype: ``object`` of :class:`.SecurityGroup`
+        :return:  A SecurityGroup instance
+        """
+        raise NotImplementedError(
+            'list_security_groups not implemented by this provider')
+
+    def create_security_group(self):
+        """
+        Create a new SecurityGroup.
+
+        :rtype: ``object`` of :class:`.KeyPair`
+        :return:  A keypair instance
+        """
+        raise NotImplementedError(
+            'create_security_group not implemented by this provider')
+
+    def delete_security_group(self):
+        """
+        Delete an existing SecurityGroup.
+
+        :rtype: ``bool``
+        :return:  True if successful, false otherwise
+        """
+        raise NotImplementedError(
+            'delete_security_group not implemented by this provider')
+
 
 class Instance():