ソースを参照

KeyPairService refactored

almahmoud 7 年 前
コミット
1bc80039db

+ 50 - 12
cloudbridge/cloud/base/services.py

@@ -6,6 +6,7 @@ import logging
 import cloudbridge.cloud.base.helpers as cb_helpers
 import cloudbridge.cloud.base.helpers as cb_helpers
 from cloudbridge.cloud.base.middleware import implement
 from cloudbridge.cloud.base.middleware import implement
 from cloudbridge.cloud.base.resources import BaseBucket
 from cloudbridge.cloud.base.resources import BaseBucket
+from cloudbridge.cloud.base.resources import BaseKeyPair
 from cloudbridge.cloud.base.resources import BaseNetwork
 from cloudbridge.cloud.base.resources import BaseNetwork
 from cloudbridge.cloud.base.resources import BaseRouter
 from cloudbridge.cloud.base.resources import BaseRouter
 from cloudbridge.cloud.base.resources import BaseSubnet
 from cloudbridge.cloud.base.resources import BaseSubnet
@@ -101,23 +102,60 @@ class BaseKeyPairService(
         super(BaseKeyPairService, self).__init__(provider)
         super(BaseKeyPairService, self).__init__(provider)
         self._service_event_pattern += ".security.key_pairs"
         self._service_event_pattern += ".security.key_pairs"
 
 
+    def get(self, key_pair_id):
+        """
+        Returns a key_pair given its ID. Returns ``None`` if the key_pair
+        does not exist.
+
+        :type key_pair_id: str
+        :param key_pair_id: The id of the desired key pair.
+
+        :rtype: ``KeyPair``
+        :return:  ``None`` is returned if the key pair does not exist, and
+                  the key pair's provider-specific CloudBridge object is
+                  returned if the key pair is found.
+        """
+        return self.dispatch(self, "provider.storage.key_pairs.get",
+                             key_pair_id)
+
+    def find(self, **kwargs):
+        """
+        Returns a list of key pairs filtered by the given keyword arguments.
+        Accepted search arguments are: 'name'
+        """
+        return self.dispatch(self, "provider.storage.key_pairs.find", **kwargs)
+
+    def list(self, limit=None, marker=None):
+        """
+        List all key pairs.
+        """
+        return self.dispatch(self, "provider.storage.key_pairs.list",
+                             limit=limit, marker=marker)
+
+    def create(self, name, location=None):
+        """
+        Create a new key pair.
+
+        :type name: str
+        :param name: The name of the key pair to be created. Note that names
+                     must be unique, and are unchangeable.
+
+        :rtype: ``KeyPair``
+        :return:  The created key pair's provider-specific CloudBridge object.
+        """
+        BaseKeyPair.assert_valid_resource_name(name)
+        return self.dispatch(self, "provider.storage.key_pairs.create",
+                             name, location=location)
+
     def delete(self, key_pair_id):
     def delete(self, key_pair_id):
         """
         """
         Delete an existing key pair.
         Delete an existing key pair.
 
 
         :type key_pair_id: str
         :type key_pair_id: str
-        :param key_pair_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.
-        """
-        log.info("Deleting the existing key pair %s", key_pair_id)
-        kp = self.get(key_pair_id)
-        if kp:
-            kp.delete()
-        return True
+        :param key_pair_id: The ID of the key pair to be deleted.
+        """
+        return self.dispatch(self, "provider.storage.key_pairs.delete",
+                             key_pair_id)
 
 
 
 
 class BaseVMFirewallService(
 class BaseVMFirewallService(

+ 27 - 0
cloudbridge/cloud/providers/aws/helpers.py

@@ -96,12 +96,39 @@ class BotoGenericService(object):
             if sr.resource.model.name == collection_model.resource.model.name)
             if sr.resource.model.name == collection_model.resource.model.name)
         return getattr(self.boto_conn, resource_model.name)
         return getattr(self.boto_conn, resource_model.name)
 
 
+    def get_raw(self, resource_id):
+        """
+        Returns a single resource.
+
+        :type resource_id: ``str``
+        :param resource_id: ID of the boto resource to fetch
+
+        :returns An unwrapped AWS resource
+        """
+        try:
+            log.debug("Retrieving resource: %s with id: %s",
+                      self.boto_collection_model.name, resource_id)
+            obj = self.boto_resource(resource_id)
+            obj.load()
+            log.debug("Successfully Retrieved: %s", obj)
+            return obj
+        except ClientError as exc:
+            error_code = exc.response['Error']['Code']
+            if any(status in error_code for status in
+                   ('NotFound', 'InvalidParameterValue', 'Malformed', '404')):
+                log.debug("Object not found: %s", resource_id)
+                return None
+            else:
+                raise exc
+
     def get(self, resource_id):
     def get(self, resource_id):
         """
         """
         Returns a single resource.
         Returns a single resource.
 
 
         :type resource_id: ``str``
         :type resource_id: ``str``
         :param resource_id: ID of the boto resource to fetch
         :param resource_id: ID of the boto resource to fetch
+
+        :returns A CloudBridge wrapped resource
         """
         """
         try:
         try:
             log.debug("Retrieving resource: %s with id: %s",
             log.debug("Retrieving resource: %s with id: %s",

+ 18 - 4
cloudbridge/cloud/providers/aws/services.py

@@ -88,14 +88,20 @@ class AWSKeyPairService(BaseKeyPairService):
                                   cb_resource=AWSKeyPair,
                                   cb_resource=AWSKeyPair,
                                   boto_collection_name='key_pairs')
                                   boto_collection_name='key_pairs')
 
 
-    def get(self, key_pair_id):
+    @implement(event_pattern="provider.security.key_pairs.get",
+               priority=BaseKeyPairService.STANDARD_EVENT_PRIORITY)
+    def _get(self, key_pair_id):
         log.debug("Getting Key Pair Service %s", key_pair_id)
         log.debug("Getting Key Pair Service %s", key_pair_id)
         return self.svc.get(key_pair_id)
         return self.svc.get(key_pair_id)
 
 
-    def list(self, limit=None, marker=None):
+    @implement(event_pattern="provider.security.key_pairs.list",
+               priority=BaseKeyPairService.STANDARD_EVENT_PRIORITY)
+    def _list(self, limit=None, marker=None):
         return self.svc.list(limit=limit, marker=marker)
         return self.svc.list(limit=limit, marker=marker)
 
 
-    def find(self, **kwargs):
+    @implement(event_pattern="provider.security.key_pairs.find",
+               priority=BaseKeyPairService.STANDARD_EVENT_PRIORITY)
+    def _find(self, **kwargs):
         name = kwargs.pop('name', None)
         name = kwargs.pop('name', None)
 
 
         # All kwargs should have been popped at this time.
         # All kwargs should have been popped at this time.
@@ -106,7 +112,9 @@ class AWSKeyPairService(BaseKeyPairService):
         log.debug("Searching for Key Pair %s", name)
         log.debug("Searching for Key Pair %s", name)
         return self.svc.find(filter_name='key-name', filter_value=name)
         return self.svc.find(filter_name='key-name', filter_value=name)
 
 
-    def create(self, name, public_key_material=None):
+    @implement(event_pattern="provider.security.key_pairs.create",
+               priority=BaseKeyPairService.STANDARD_EVENT_PRIORITY)
+    def _create(self, name, public_key_material=None):
         log.debug("Creating Key Pair Service %s", name)
         log.debug("Creating Key Pair Service %s", name)
         AWSKeyPair.assert_valid_resource_name(name)
         AWSKeyPair.assert_valid_resource_name(name)
         private_key = None
         private_key = None
@@ -124,6 +132,12 @@ class AWSKeyPairService(BaseKeyPairService):
             else:
             else:
                 raise e
                 raise e
 
 
+    @implement(event_pattern="provider.security.key_pairs.delete",
+               priority=BaseKeyPairService.STANDARD_EVENT_PRIORITY)
+    def _delete(self, key_pair_id):
+        aws_kp = self.svc.get_raw(key_pair_id)
+        aws_kp.delete()
+
 
 
 class AWSVMFirewallService(BaseVMFirewallService):
 class AWSVMFirewallService(BaseVMFirewallService):
 
 

+ 0 - 3
cloudbridge/cloud/providers/azure/resources.py

@@ -1605,9 +1605,6 @@ class AzureKeyPair(BaseKeyPair):
     def name(self):
     def name(self):
         return self._key_pair.Name
         return self._key_pair.Name
 
 
-    def delete(self):
-        self._provider.azure_client.delete_public_key(self._key_pair)
-
 
 
 class AzureRouter(BaseRouter):
 class AzureRouter(BaseRouter):
     def __init__(self, provider, route_table):
     def __init__(self, provider, route_table):

+ 18 - 4
cloudbridge/cloud/providers/azure/services.py

@@ -145,7 +145,9 @@ class AzureKeyPairService(BaseKeyPairService):
     def __init__(self, provider):
     def __init__(self, provider):
         super(AzureKeyPairService, self).__init__(provider)
         super(AzureKeyPairService, self).__init__(provider)
 
 
-    def get(self, key_pair_id):
+    @implement(event_pattern="provider.security.key_pairs.get",
+               priority=BaseKeyPairService.STANDARD_EVENT_PRIORITY)
+    def _get(self, key_pair_id):
         try:
         try:
             key_pair = self.provider.azure_client.\
             key_pair = self.provider.azure_client.\
                 get_public_key(key_pair_id)
                 get_public_key(key_pair_id)
@@ -158,7 +160,9 @@ class AzureKeyPairService(BaseKeyPairService):
             log.debug(error)
             log.debug(error)
             return None
             return None
 
 
-    def list(self, limit=None, marker=None):
+    @implement(event_pattern="provider.security.key_pairs.list",
+               priority=BaseKeyPairService.STANDARD_EVENT_PRIORITY)
+    def _list(self, limit=None, marker=None):
         key_pairs, resume_marker = self.provider.azure_client.list_public_keys(
         key_pairs, resume_marker = self.provider.azure_client.list_public_keys(
             AzureKeyPairService.PARTITION_KEY, marker=marker,
             AzureKeyPairService.PARTITION_KEY, marker=marker,
             limit=limit or self.provider.config.default_result_limit)
             limit=limit or self.provider.config.default_result_limit)
@@ -169,7 +173,9 @@ class AzureKeyPairService(BaseKeyPairService):
                                      supports_total=False,
                                      supports_total=False,
                                      data=results)
                                      data=results)
 
 
-    def find(self, **kwargs):
+    @implement(event_pattern="provider.security.key_pairs.find",
+               priority=BaseKeyPairService.STANDARD_EVENT_PRIORITY)
+    def _find(self, **kwargs):
         obj_list = self
         obj_list = self
         filters = ['name']
         filters = ['name']
         matches = cb_helpers.generic_find(filters, kwargs, obj_list)
         matches = cb_helpers.generic_find(filters, kwargs, obj_list)
@@ -183,7 +189,9 @@ class AzureKeyPairService(BaseKeyPairService):
         return ClientPagedResultList(self.provider,
         return ClientPagedResultList(self.provider,
                                      matches if matches else [])
                                      matches if matches else [])
 
 
-    def create(self, name, public_key_material=None):
+    @implement(event_pattern="provider.security.key_pairs.create",
+               priority=BaseKeyPairService.STANDARD_EVENT_PRIORITY)
+    def _create(self, name, public_key_material=None):
         AzureKeyPair.assert_valid_resource_name(name)
         AzureKeyPair.assert_valid_resource_name(name)
 
 
         key_pair = self.get(name)
         key_pair = self.get(name)
@@ -208,6 +216,12 @@ class AzureKeyPairService(BaseKeyPairService):
         key_pair.material = private_key
         key_pair.material = private_key
         return key_pair
         return key_pair
 
 
+    @implement(event_pattern="provider.security.key_pairs.delete",
+               priority=BaseKeyPairService.STANDARD_EVENT_PRIORITY)
+    def _delete(self, key_pair_id):
+        az_kp = self.provider.azure_client.get_public_key(key_pair_id)
+        self.provider.azure_client.delete_public_key(az_kp)
+
 
 
 class AzureStorageService(BaseStorageService):
 class AzureStorageService(BaseStorageService):
     def __init__(self, provider):
     def __init__(self, provider):

+ 15 - 5
cloudbridge/cloud/providers/gce/services.py

@@ -77,7 +77,9 @@ class GCEKeyPairService(BaseKeyPairService):
     def __init__(self, provider):
     def __init__(self, provider):
         super(GCEKeyPairService, self).__init__(provider)
         super(GCEKeyPairService, self).__init__(provider)
 
 
-    def get(self, key_pair_id):
+    @implement(event_pattern="provider.security.key_pairs.get",
+               priority=BaseKeyPairService.STANDARD_EVENT_PRIORITY)
+    def _get(self, key_pair_id):
         """
         """
         Returns a KeyPair given its ID.
         Returns a KeyPair given its ID.
         """
         """
@@ -87,7 +89,9 @@ class GCEKeyPairService(BaseKeyPairService):
         else:
         else:
             return None
             return None
 
 
-    def list(self, limit=None, marker=None):
+    @implement(event_pattern="provider.security.key_pairs.list",
+               priority=BaseKeyPairService.STANDARD_EVENT_PRIORITY)
+    def _list(self, limit=None, marker=None):
         key_pairs = []
         key_pairs = []
         for item in helpers.find_matching_metadata_items(
         for item in helpers.find_matching_metadata_items(
                 self.provider, GCEKeyPair.KP_TAG_REGEX):
                 self.provider, GCEKeyPair.KP_TAG_REGEX):
@@ -97,7 +101,9 @@ class GCEKeyPairService(BaseKeyPairService):
         return ClientPagedResultList(self.provider, key_pairs,
         return ClientPagedResultList(self.provider, key_pairs,
                                      limit=limit, marker=marker)
                                      limit=limit, marker=marker)
 
 
-    def find(self, **kwargs):
+    @implement(event_pattern="provider.security.key_pairs.find",
+               priority=BaseKeyPairService.STANDARD_EVENT_PRIORITY)
+    def _find(self, **kwargs):
         """
         """
         Searches for a key pair by a given list of attributes.
         Searches for a key pair by a given list of attributes.
         """
         """
@@ -114,7 +120,9 @@ class GCEKeyPairService(BaseKeyPairService):
         return ClientPagedResultList(self.provider,
         return ClientPagedResultList(self.provider,
                                      matches if matches else [])
                                      matches if matches else [])
 
 
-    def create(self, name, public_key_material=None):
+    @implement(event_pattern="provider.security.key_pairs.create",
+               priority=BaseKeyPairService.STANDARD_EVENT_PRIORITY)
+    def _create(self, name, public_key_material=None):
         GCEKeyPair.assert_valid_resource_name(name)
         GCEKeyPair.assert_valid_resource_name(name)
 
 
         private_key = None
         private_key = None
@@ -139,7 +147,9 @@ class GCEKeyPairService(BaseKeyPairService):
                         'A KeyPair with name {0} already exists'.format(name))
                         'A KeyPair with name {0} already exists'.format(name))
             raise
             raise
 
 
-    def delete(self, key_pair_id):
+    @implement(event_pattern="provider.security.key_pairs.delete",
+               priority=BaseKeyPairService.STANDARD_EVENT_PRIORITY)
+    def _delete(self, key_pair_id):
         kp = self.get(key_pair_id)
         kp = self.get(key_pair_id)
         if kp:
         if kp:
             helpers.remove_metadata_item(
             helpers.remove_metadata_item(

+ 18 - 4
cloudbridge/cloud/providers/openstack/services.py

@@ -131,7 +131,9 @@ class OpenStackKeyPairService(BaseKeyPairService):
     def __init__(self, provider):
     def __init__(self, provider):
         super(OpenStackKeyPairService, self).__init__(provider)
         super(OpenStackKeyPairService, self).__init__(provider)
 
 
-    def get(self, key_pair_id):
+    @implement(event_pattern="provider.security.key_pairs.get",
+               priority=BaseKeyPairService.STANDARD_EVENT_PRIORITY)
+    def _get(self, key_pair_id):
         """
         """
         Returns a KeyPair given its id.
         Returns a KeyPair given its id.
         """
         """
@@ -143,7 +145,9 @@ class OpenStackKeyPairService(BaseKeyPairService):
             log.debug("KeyPair %s was not found.", key_pair_id)
             log.debug("KeyPair %s was not found.", key_pair_id)
             return None
             return None
 
 
-    def list(self, limit=None, marker=None):
+    @implement(event_pattern="provider.security.key_pairs.list",
+               priority=BaseKeyPairService.STANDARD_EVENT_PRIORITY)
+    def _list(self, limit=None, marker=None):
         """
         """
         List all key pairs associated with this account.
         List all key pairs associated with this account.
 
 
@@ -158,7 +162,9 @@ class OpenStackKeyPairService(BaseKeyPairService):
         return ClientPagedResultList(self.provider, results,
         return ClientPagedResultList(self.provider, results,
                                      limit=limit, marker=marker)
                                      limit=limit, marker=marker)
 
 
-    def find(self, **kwargs):
+    @implement(event_pattern="provider.security.key_pairs.find",
+               priority=BaseKeyPairService.STANDARD_EVENT_PRIORITY)
+    def _find(self, **kwargs):
         name = kwargs.pop('name', None)
         name = kwargs.pop('name', None)
 
 
         # All kwargs should have been popped at this time.
         # All kwargs should have been popped at this time.
@@ -172,7 +178,9 @@ class OpenStackKeyPairService(BaseKeyPairService):
         log.debug("Searching for %s in: %s", name, keypairs)
         log.debug("Searching for %s in: %s", name, keypairs)
         return ClientPagedResultList(self.provider, results)
         return ClientPagedResultList(self.provider, results)
 
 
-    def create(self, name, public_key_material=None):
+    @implement(event_pattern="provider.security.key_pairs.create",
+               priority=BaseKeyPairService.STANDARD_EVENT_PRIORITY)
+    def _create(self, name, public_key_material=None):
         log.debug("Creating a new key pair with the name: %s", name)
         log.debug("Creating a new key pair with the name: %s", name)
         OpenStackKeyPair.assert_valid_resource_name(name)
         OpenStackKeyPair.assert_valid_resource_name(name)
 
 
@@ -191,6 +199,12 @@ class OpenStackKeyPairService(BaseKeyPairService):
         cb_kp.material = private_key
         cb_kp.material = private_key
         return cb_kp
         return cb_kp
 
 
+    @implement(event_pattern="provider.security.key_pairs.delete",
+               priority=BaseKeyPairService.STANDARD_EVENT_PRIORITY)
+    def _delete(self, key_pair_id):
+        os_kp = self.provider.nova.keypairs.get(key_pair_id)
+        os_kp.delete()
+
 
 
 class OpenStackVMFirewallService(BaseVMFirewallService):
 class OpenStackVMFirewallService(BaseVMFirewallService):