Просмотр исходного кода

Restructured compute service - renamed methods to list, get, create,
find and moved to InstanceService.

nuwan_ag 10 лет назад
Родитель
Сommit
f591bedc37

+ 31 - 21
cloudbridge/providers/aws/services.py

@@ -7,6 +7,7 @@ import requests
 from cloudbridge.providers.base import BaseBlockStoreService
 from cloudbridge.providers.base import BaseComputeService
 from cloudbridge.providers.base import BaseImageService
+from cloudbridge.providers.base import BaseInstanceService
 from cloudbridge.providers.base import BaseInstanceTypesService
 from cloudbridge.providers.base import BaseKeyPairService
 from cloudbridge.providers.base import BaseObjectStoreService
@@ -14,7 +15,6 @@ from cloudbridge.providers.base import BaseSecurityGroupService
 from cloudbridge.providers.base import BaseSecurityService
 from cloudbridge.providers.base import BaseSnapshotService
 from cloudbridge.providers.base import BaseVolumeService
-
 from cloudbridge.providers.interfaces import InstanceType
 from cloudbridge.providers.interfaces import KeyPair
 from cloudbridge.providers.interfaces import MachineImage
@@ -379,16 +379,37 @@ class AWSComputeService(BaseComputeService):
 
     def __init__(self, provider):
         super(AWSComputeService, self).__init__(provider)
-        self._instance_types = AWSInstanceTypesService(self.provider)
+        self._instance_type_svc = AWSInstanceTypesService(self.provider)
+        self._instance_svc = AWSInstanceService(self.provider)
 
     @property
     def instance_types(self):
-        return self._instance_types
+        return self._instance_type_svc
+
+    @property
+    def instances(self):
+        return self._instance_svc
 
-    def create_instance(self, name, image, instance_type, zone=None,
-                        keypair=None, security_groups=None, user_data=None,
-                        block_device_mapping=None, network_interfaces=None,
-                        **kwargs):
+    def list_regions(self):
+        """
+        List all data center regions for this provider.
+
+        :rtype: ``list`` of :class:`.Region`
+        :return: list of Region objects
+        """
+        raise NotImplementedError(
+            'list_regions not implemented by this provider')
+
+
+class AWSInstanceService(BaseInstanceService):
+
+    def __init__(self, provider):
+        super(AWSInstanceService, self).__init__(provider)
+
+    def create(self, name, image, instance_type, zone=None,
+               keypair=None, security_groups=None, user_data=None,
+               block_device_mapping=None, network_interfaces=None,
+               **kwargs):
         """
         Creates a new virtual machine instance.
         """
@@ -419,7 +440,7 @@ class AWSComputeService(BaseComputeService):
             instance.name = name
         return instance
 
-    def get_instance(self, instance_id):
+    def get(self, instance_id):
         """
         Returns an instance given its id. Returns None
         if the object does not exist.
@@ -431,7 +452,7 @@ class AWSComputeService(BaseComputeService):
         else:
             return None
 
-    def find_instance(self, name):
+    def find(self, name):
         """
         Searches for an instance by a given list of attributes.
 
@@ -441,7 +462,7 @@ class AWSComputeService(BaseComputeService):
         raise NotImplementedError(
             'find_instance not implemented by this provider')
 
-    def list_instances(self):
+    def list(self):
         """
         List all instances.
         """
@@ -450,17 +471,6 @@ class AWSComputeService(BaseComputeService):
                 for res in reservations
                 for inst in res.instances]
 
-    def list_regions(self):
-        """
-        List all data center regions for this provider.
-
-        :rtype: ``list`` of :class:`.Region`
-        :return: list of Region objects
-        """
-        raise NotImplementedError(
-            'list_regions not implemented by this provider')
-
-
 AWS_INSTANCE_DATA_DEFAULT_URL = "https://swift.rc.nectar.org.au:8888/v1/" \
                                 "AUTH_377/cloud-bridge/aws/instance_data.json"
 

+ 18 - 4
cloudbridge/providers/base.py

@@ -20,10 +20,18 @@ from cloudbridge.providers.interfaces import SnapshotState
 from cloudbridge.providers.interfaces import Volume
 from cloudbridge.providers.interfaces import VolumeState
 from cloudbridge.providers.interfaces import WaitStateException
-from cloudbridge.providers.interfaces.services import ImageService,\
-    ProviderService, ComputeService, VolumeService, SnapshotService,\
-    BlockStoreService, ObjectStoreService, SecurityService, KeyPairService,\
-    SecurityGroupService, InstanceTypesService
+from cloudbridge.providers.interfaces.services import InstanceTypesService
+from cloudbridge.providers.interfaces.services import KeyPairService
+from cloudbridge.providers.interfaces.services import ObjectStoreService
+from cloudbridge.providers.interfaces.services import SecurityGroupService
+from cloudbridge.providers.interfaces.services import SecurityService
+from cloudbridge.providers.interfaces.services import BlockStoreService
+from cloudbridge.providers.interfaces.services import ComputeService
+from cloudbridge.providers.interfaces.services import ImageService
+from cloudbridge.providers.interfaces.services import InstanceService
+from cloudbridge.providers.interfaces.services import ProviderService
+from cloudbridge.providers.interfaces.services import SnapshotService
+from cloudbridge.providers.interfaces.services import VolumeService
 
 
 log = logging.getLogger(__name__)
@@ -349,3 +357,9 @@ class BaseInstanceTypesService(InstanceTypesService, BaseProviderService):
 
     def __init__(self, provider):
         super(BaseInstanceTypesService, self).__init__(provider)
+
+
+class BaseInstanceService(InstanceService, BaseProviderService):
+
+    def __init__(self, provider):
+        super(BaseInstanceService, self).__init__(provider)

+ 46 - 28
cloudbridge/providers/interfaces/services.py

@@ -29,63 +29,81 @@ class ComputeService(ProviderService):
     """
     __metaclass__ = ABCMeta
 
-    @abstractmethod
-    def get_instance(self, instance_id):
+    @abstractproperty
+    def instance_types(self):
         """
-        Returns an instance given its id. Returns None
-        if the object does not exist.
+        Provides access to all Instance type related services in this provider.
 
-        :rtype: ``object`` of :class:`.Instance`
-        :return:  an Instance object
+        :rtype: ``object`` of :class:`.InstanceTypeService`
+        :return:  an InstanceTypeService object
+        """
+        pass
+
+    @abstractproperty
+    def instances(self):
+        """
+        Provides access to all Instance related services in this provider.
+
+        :rtype: ``object`` of :class:`.InstanceService`
+        :return:  an InstanceService object
         """
         pass
 
     @abstractmethod
-    def find_instance(self, name):
+    def list_regions(self):
         """
-        Searches for an instance by a given list of attributes.
+        List all data center regions for this provider.
 
-        :rtype: ``object`` of :class:`.Instance`
-        :return: an Instance object
+        :rtype: ``list`` of :class:`.Region`
+        :return: list of Region objects
         """
         pass
 
+
+class InstanceService(ProviderService):
+    """
+    Provides access to instances in a provider, including creating,
+    listing and deleting instances.
+    """
+    __metaclass__ = ABCMeta
+
     @abstractmethod
-    def list_instances(self):
+    def get(self, instance_id):
         """
-        List all instances.
+        Returns an instance given its id. Returns None
+        if the object does not exist.
 
-        :rtype: ``list`` of :class:`.Instance`
-        :return: list of Instance objects
+        :rtype: ``object`` of :class:`.Instance`
+        :return:  an Instance object
         """
         pass
 
-    @abstractproperty
-    def instance_types(self):
+    @abstractmethod
+    def find(self, name):
         """
-        Provides access to all Instance type related services in this provider.
+        Searches for an instance by a given list of attributes.
 
-        :rtype: ``object`` of :class:`.InstanceTypeService`
-        :return:  an InstanceTypeService object
+        :rtype: ``object`` of :class:`.Instance`
+        :return: an Instance object
         """
         pass
 
     @abstractmethod
-    def list_regions(self):
+    def list(self):
         """
-        List all data center regions for this provider.
+        List all instances.
 
-        :rtype: ``list`` of :class:`.Region`
-        :return: list of Region objects
+        :rtype: ``list`` of :class:`.Instance`
+        :return: list of Instance objects
         """
         pass
 
     @abstractmethod
-    def create_instance(self, name, image, instance_type, zone=None,
-                        keypair=None, security_groups=None, user_data=None,
-                        block_device_mapping=None, network_interfaces=None,
-                        launch_configuration=None,
-                        **kwargs):
+    def create(self, name, image, instance_type, zone=None,
+               keypair=None, security_groups=None, user_data=None,
+               block_device_mapping=None, network_interfaces=None,
+               launch_configuration=None,
+               **kwargs):
         """
         Creates a new virtual machine instance.
 

+ 30 - 19
cloudbridge/providers/openstack/services.py

@@ -7,6 +7,7 @@ from novaclient.exceptions import NotFound as NovaNotFound
 from cloudbridge.providers.base import BaseBlockStoreService
 from cloudbridge.providers.base import BaseComputeService
 from cloudbridge.providers.base import BaseImageService
+from cloudbridge.providers.base import BaseInstanceService
 from cloudbridge.providers.base import BaseInstanceTypesService
 from cloudbridge.providers.base import BaseKeyPairService
 from cloudbridge.providers.base import BaseObjectStoreService
@@ -14,7 +15,6 @@ from cloudbridge.providers.base import BaseSecurityGroupService
 from cloudbridge.providers.base import BaseSecurityService
 from cloudbridge.providers.base import BaseSnapshotService
 from cloudbridge.providers.base import BaseVolumeService
-
 from cloudbridge.providers.interfaces import InstanceType
 from cloudbridge.providers.interfaces import KeyPair
 from cloudbridge.providers.interfaces import MachineImage
@@ -392,16 +392,36 @@ class OpenStackComputeService(BaseComputeService):
 
     def __init__(self, provider):
         super(OpenStackComputeService, self).__init__(provider)
-        self._instance_types = OpenStackInstanceTypesService(self._provider)
+        self._instance_type_svc = OpenStackInstanceTypesService(self._provider)
+        self._instance_svc = OpenStackInstanceService(self._provider)
 
     @property
     def instance_types(self):
-        return self._instance_types
+        return self._instance_type_svc
+
+    @property
+    def instances(self):
+        return self._instance_svc
+
+    def list_regions(self):
+        """
+        List all data center regions.
+        """
+        # detailed must be set to ``False`` because the (default) ``True``
+        # value requires Admin priviledges
+        regions = self._provider.nova.availability_zones.list(detailed=False)
+        return [OpenStackRegion(self._provider, region) for region in regions]
+
 
-    def create_instance(self, name, image, instance_type, zone=None,
-                        keypair=None, security_groups=None, user_data=None,
-                        block_device_mapping=None, network_interfaces=None,
-                        **kwargs):
+class OpenStackInstanceService(BaseInstanceService):
+
+    def __init__(self, provider):
+        super(OpenStackInstanceService, self).__init__(provider)
+
+    def create(self, name, image, instance_type, zone=None,
+               keypair=None, security_groups=None, user_data=None,
+               block_device_mapping=None, network_interfaces=None,
+               **kwargs):
         """
         Creates a new virtual machine instance.
         """
@@ -433,14 +453,14 @@ class OpenStackComputeService(BaseComputeService):
             userdata=user_data)
         return OpenStackInstance(self._provider, os_instance)
 
-    def find_instance(self, name):
+    def find(self, name):
         """
         Searches for an instance by a given list of attributes.
         """
         raise NotImplementedError(
             'find_instance not implemented by this provider')
 
-    def list_instances(self):
+    def list(self):
         """
         List all instances.
         """
@@ -448,16 +468,7 @@ class OpenStackComputeService(BaseComputeService):
         return [OpenStackInstance(self._provider, instance)
                 for instance in instances]
 
-    def list_regions(self):
-        """
-        List all data center regions.
-        """
-        # detailed must be set to ``False`` because the (default) ``True``
-        # value requires Admin priviledges
-        regions = self._provider.nova.availability_zones.list(detailed=False)
-        return [OpenStackRegion(self._provider, region) for region in regions]
-
-    def get_instance(self, instance_id):
+    def get(self, instance_id):
         """
         Returns an instance given its id.
         """

+ 1 - 1
test/helpers.py

@@ -65,7 +65,7 @@ def get_provider_test_data(provider, key):
 
 
 def create_test_instance(provider, instance_name):
-    return provider.compute.create_instance(
+    return provider.compute.instances.create(
         instance_name,
         get_provider_test_data(provider, 'image'),
         get_provider_test_data(provider, 'instance_type'))

+ 4 - 3
test/test_provider_compute_service.py

@@ -18,14 +18,14 @@ class ProviderComputeServiceTestCase(ProviderTestBase):
         inst = helpers.create_test_instance(self.provider, name)
         with helpers.exception_action(lambda: inst.terminate()):
             inst.wait_till_ready(interval=self.get_test_wait_interval())
-            all_instances = self.provider.compute.list_instances()
+            all_instances = self.provider.compute.instances.list()
             found_instances = [i for i in all_instances if i.name == name]
             self.assertTrue(
                 len(found_instances) == 1,
                 "List instances does not return the expected instance %s" %
                 name)
 
-            get_inst = self.provider.compute.get_instance(
+            get_inst = self.provider.compute.instances.get(
                 inst.instance_id)
             self.assertTrue(
                 found_instances[0].instance_id ==
@@ -47,7 +47,8 @@ class ProviderComputeServiceTestCase(ProviderTestBase):
                 [InstanceState.TERMINATED, InstanceState.UNKNOWN],
                 terminal_states=[InstanceState.ERROR],
                 interval=self.get_test_wait_interval())
-            deleted_inst = self.provider.compute.get_instance(inst.instance_id)
+            deleted_inst = self.provider.compute.instances.get(
+                inst.instance_id)
             self.assertTrue(
                 deleted_inst is None or deleted_inst.state in (
                     InstanceState.TERMINATED,