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

Added basic implementation of Image Service.

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

+ 19 - 2
cloudbridge/providers/ec2/impl.py

@@ -3,13 +3,14 @@ Provider implementation based on boto library for EC2-compatible clouds.
 """
 
 import os
-import boto
 
+import boto
 from boto.ec2.regioninfo import RegionInfo
 
 from cloudbridge.providers.base import BaseCloudProvider
 
 from .services import EC2ComputeService
+from .services import EC2ImageService
 from .services import EC2SecurityService
 
 
@@ -34,7 +35,7 @@ class EC2CloudProviderV1(BaseCloudProvider):
 
         # Initialize provider services
         self.compute = EC2ComputeService(self)
-        self.images = None  # EC2ImageService(self)
+        self.images = EC2ImageService(self)
         self.security = EC2SecurityService(self)
         self.block_store = None  # EC2BlockStore(self)
         self.object_store = None  # EC2ObjectStore(self)
@@ -54,3 +55,19 @@ class EC2CloudProviderV1(BaseCloudProvider):
                                     path=self.ec2_conn_path,
                                     validate_certs=False)
         return ec2_conn
+
+    def _connect_s3(self):
+        """
+        Get a boto connection object for the given cloud.
+        """
+        r = RegionInfo(name=self.region_name, endpoint=self.region_endpoint)
+        ec2_conn = boto.connect_ec2(aws_access_key_id=self.a_key,
+                                    aws_secret_access_key=self.s_key,
+                                    # api_version is needed for availability zone support for EC2
+                                    api_version='2012-06-01' if self.cloud_type == 'ec2' else None,
+                                    is_secure=self.is_secure,
+                                    region=r,
+                                    port=self.ec2_port,
+                                    path=self.ec2_conn_path,
+                                    validate_certs=False)
+        return ec2_conn

+ 32 - 0
cloudbridge/providers/ec2/services.py

@@ -5,6 +5,7 @@ Services implemented by this provider
 from cloudbridge.providers.base import BaseKeyPair
 from cloudbridge.providers.base import BaseSecurityGroup
 from cloudbridge.providers.interfaces import ComputeService
+from cloudbridge.providers.interfaces import ImageService
 from cloudbridge.providers.interfaces import InstanceType
 from cloudbridge.providers.interfaces import KeyPair
 from cloudbridge.providers.interfaces import MachineImage
@@ -12,6 +13,7 @@ from cloudbridge.providers.interfaces import PlacementZone
 from cloudbridge.providers.interfaces import SecurityGroup
 from cloudbridge.providers.interfaces import SecurityService
 
+from .types import EC2Image
 from .types import EC2Instance
 
 
@@ -41,6 +43,36 @@ class EC2SecurityService(SecurityService):
         return [BaseSecurityGroup(group.name) for group in groups]
 
 
+class EC2ImageService(ImageService):
+
+    def __init__(self, provider):
+        self.provider = provider
+
+    def get_image(self, id):
+        """
+        Returns an Image given its id
+        """
+        image = self.provider.ec2_conn.get_image(id)
+        if image:
+            return EC2Image(self.provider, image)
+        else:
+            return None
+
+    def find_image(self, name):
+        """
+        Searches for an image by a given list of attributes
+        """
+        raise NotImplementedError(
+            'find_image not implemented by this provider')
+
+    def list_images(self):
+        """
+        List all images.
+        """
+        images = self.provider.ec2_conn.get_all_images()
+        return [EC2Image(self.provider, image) for image in images]
+
+
 class EC2ComputeService(ComputeService):
 
     def __init__(self, provider):

+ 52 - 0
cloudbridge/providers/ec2/types.py

@@ -5,6 +5,50 @@ DataTypes used by this provider
 from cloudbridge.providers.base import BaseKeyPair
 from cloudbridge.providers.base import BaseSecurityGroup
 from cloudbridge.providers.interfaces import Instance
+from cloudbridge.providers.interfaces import MachineImage
+
+
+class EC2Image(MachineImage):
+
+    def __init__(self, provider, image):
+        self.provider = provider
+        if isinstance(image, MachineImage):
+            self._ec2_image = image._ec2_image
+        else:
+            self._ec2_image = image
+
+    def image_id(self):
+        """
+        Get the image identifier.
+
+        :rtype: ``str``
+        :return: ID for this instance as returned by the cloud middleware.
+        """
+        return self._ec2_image.id
+
+    def name(self):
+        """
+        Get the image name.
+
+        :rtype: ``str``
+        :return: Name for this image as returned by the cloud middleware.
+        """
+        return self._ec2_image.name
+
+    def description(self):
+        """
+        Get the image description.
+
+        :rtype: ``str``
+        :return: Description for this image as returned by the cloud middleware
+        """
+        return self._ec2_image.description
+
+    def delete(self):
+        """
+        Delete this image
+        """
+        self._ec2_image.deregister()
 
 
 class EC2Instance(Instance):
@@ -95,3 +139,11 @@ class EC2Instance(Instance):
         Get the name of the key pair associated with this instance.
         """
         return BaseKeyPair(self._ec2_instance.key_name)
+
+    def create_image(self, name):
+        """
+        Create a new image based on this instance.
+        """
+        image_id = self._ec2_instance.create_image(name)
+        image = self.provider.images.get_image(image_id)
+        return EC2Image(self.provider, image)

+ 20 - 9
cloudbridge/providers/interfaces.py

@@ -341,15 +341,6 @@ class ImageService(ProviderService):
         raise NotImplementedError(
             'list_images not implemented by this provider')
 
-    def create_image(self):
-        """
-        Create a new image.
-        :return:  an Image object
-        :rtype: ``object`` of :class:`.Image`
-        """
-        raise NotImplementedError(
-            'create_image not implemented by this provider')
-
 
 class ObjectStoreService(ProviderService):
 
@@ -577,6 +568,15 @@ class Instance(object):
         raise NotImplementedError(
             'key_pair_name not implemented by this provider')
 
+    def create_image(self, name):
+        """
+        Create a new image based on this instance.
+        :return:  an Image object
+        :rtype: ``object`` of :class:`.Image`
+        """
+        raise NotImplementedError(
+            'create_image not implemented by this provider')
+
 
 class MachineImage(object):
 
@@ -610,6 +610,16 @@ class MachineImage(object):
         raise NotImplementedError(
             'MachineImage.description not implemented by this provider')
 
+    def delete(self):
+        """
+        Delete this image
+
+        :rtype: ``bool``
+        :return: True if the operation succeeded
+        """
+        raise NotImplementedError(
+            'MachineImage.delete not implemented by this provider')
+
 
 class Volume(object):
 
@@ -787,6 +797,7 @@ class KeyPair(object):
 
 
 class PlacementZone(object):
+
     """
     A placement zone object.
     """

+ 2 - 1
cloudbridge/providers/openstack/impl.py

@@ -12,6 +12,7 @@ from novaclient import client as nova_client
 from cloudbridge.providers.base import BaseCloudProvider
 
 from .services import OpenStackComputeService
+from .services import OpenStackImageService
 from .services import OpenStackSecurityService
 
 
@@ -32,7 +33,7 @@ class OpenStackCloudProviderV1(BaseCloudProvider):
         self.keystone = self._connect_keystone()
 
         self.compute = OpenStackComputeService(self)
-        # self.images = EC2ImageService(self)
+        self.images = OpenStackImageService(self)
         self.security = OpenStackSecurityService(self)
         # self.block_store = EC2BlockStore(self)
         # self.object_store = EC2ObjectStore(self)

+ 32 - 0
cloudbridge/providers/openstack/services.py

@@ -5,6 +5,7 @@ Services implemented by this provider
 from cloudbridge.providers.base import BaseKeyPair
 from cloudbridge.providers.base import BaseSecurityGroup
 from cloudbridge.providers.interfaces import ComputeService
+from cloudbridge.providers.interfaces import ImageService
 from cloudbridge.providers.interfaces import InstanceType
 from cloudbridge.providers.interfaces import InstanceTypesService
 from cloudbridge.providers.interfaces import KeyPair
@@ -13,6 +14,7 @@ from cloudbridge.providers.interfaces import PlacementZone
 from cloudbridge.providers.interfaces import SecurityGroup
 from cloudbridge.providers.interfaces import SecurityService
 
+from .types import OpenStackImage
 from .types import OpenStackInstance
 from .types import OpenStackInstanceType
 
@@ -43,6 +45,36 @@ class OpenStackSecurityService(SecurityService):
         return [BaseSecurityGroup(group.name) for group in groups]
 
 
+class OpenStackImageService(ImageService):
+
+    def __init__(self, provider):
+        self.provider = provider
+
+    def get_image(self, id):
+        """
+        Returns an Image given its id
+        """
+        image = self.provider.nova.images.get(id)
+        if image:
+            return OpenStackImage(self.provider, image)
+        else:
+            return None
+
+    def find_image(self, name):
+        """
+        Searches for an image by a given list of attributes
+        """
+        raise NotImplementedError(
+            'find_image not implemented by this provider')
+
+    def list_images(self):
+        """
+        List all images.
+        """
+        images = self.provider.nova.images.list()
+        return [OpenStackImage(self.provider, image) for image in images]
+
+
 class OpenStackInstanceTypesService(InstanceTypesService):
 
     def __init__(self, provider):

+ 51 - 0
cloudbridge/providers/openstack/types.py

@@ -6,6 +6,50 @@ from cloudbridge.providers.base import BaseKeyPair
 from cloudbridge.providers.base import BaseSecurityGroup
 from cloudbridge.providers.interfaces import Instance
 from cloudbridge.providers.interfaces import InstanceType
+from cloudbridge.providers.interfaces import MachineImage
+
+
+class OpenStackImage(MachineImage):
+
+    def __init__(self, provider, os_image):
+        self.provider = provider
+        if isinstance(os_image):
+            self._os_image = os_image._os_image
+        else:
+            self._os_image = os_image
+
+    def image_id(self):
+        """
+        Get the image identifier.
+
+        :rtype: ``str``
+        :return: ID for this instance as returned by the cloud middleware.
+        """
+        return self._os_image.id
+
+    def name(self):
+        """
+        Get the image name.
+
+        :rtype: ``str``
+        :return: Name for this image as returned by the cloud middleware.
+        """
+        return self._os_image.name
+
+    def description(self):
+        """
+        Get the image description.
+
+        :rtype: ``str``
+        :return: Description for this image as returned by the cloud middleware
+        """
+        return self._os_image.description
+
+    def delete(self):
+        """
+        Delete this image
+        """
+        self._os_image.delete()
 
 
 class OpenStackInstanceType(InstanceType):
@@ -111,3 +155,10 @@ class OpenStackInstance(Instance):
         Get the name of the key pair associated with this instance.
         """
         return BaseKeyPair(self._os_instance.key_name)
+
+    def create_image(self, name):
+        """
+        Create a new image based on this instance.
+        """
+        image_id = self._os_instance.create_image(name)
+        return OpenStackImage(self.provider, self.provider.images.get(image_id))