Explorar el Código

Added get() method to keypair service and made the find() method return
a list, to improve consistency with other services. Closes issue:
https://github.com/gvlproject/cloudbridge/issues/8

Nuwan Goonasekera hace 10 años
padre
commit
52ccd07d89

+ 4 - 4
cloudbridge/cloud/base.py

@@ -719,19 +719,19 @@ class BaseKeyPairService(
     def __init__(self, provider):
     def __init__(self, provider):
         super(BaseKeyPairService, self).__init__(provider)
         super(BaseKeyPairService, self).__init__(provider)
 
 
-    def delete(self, name):
+    def delete(self, keypair_id):
         """
         """
         Delete an existing key pair.
         Delete an existing key pair.
 
 
-        :type name: str
-        :param name: The name of the key pair to be deleted.
+        :type keypair_id: str
+        :param keypair_id: The id of the key pair to be deleted.
 
 
         :rtype: ``bool``
         :rtype: ``bool``
         :return:  ``True`` if the key does not exist. Note that this implies
         :return:  ``True`` if the key does not exist. Note that this implies
                   that the key may not have been deleted by this method but
                   that the key may not have been deleted by this method but
                   instead has not existed in the first place.
                   instead has not existed in the first place.
         """
         """
-        kp = self.find(name=name)
+        kp = self.get(keypair_id)
         if kp:
         if kp:
             kp.delete()
             kp.delete()
         return True
         return True

+ 23 - 4
cloudbridge/cloud/interfaces/services.py

@@ -623,6 +623,25 @@ class KeyPairService(PageableObjectMixin, ProviderService):
     """
     """
     __metaclass__ = ABCMeta
     __metaclass__ = ABCMeta
 
 
+    @abstractmethod
+    def get(self, keypair_id):
+        """
+        Returns a KeyPair given its ID. Returns ``None`` if the KeyPair
+        does not exist. On some providers, such as AWS and Openstack,
+        the KeyPair id is the same as its name.
+
+        Example:
+
+        .. code-block:: python
+
+            keypair = provider.security.keypairs.get('my_keypair_id')
+            print(keypair.id, keypair.name)
+
+        :rtype: :class:`.KeyPair`
+        :return:  a KeyPair instance
+        """
+        pass
+
     @abstractmethod
     @abstractmethod
     def list(self, limit=None, marker=None):
     def list(self, limit=None, marker=None):
         """
         """
@@ -634,7 +653,7 @@ class KeyPairService(PageableObjectMixin, ProviderService):
         pass
         pass
 
 
     @abstractmethod
     @abstractmethod
-    def find(self, name):
+    def find(self, name, limit=None, marker=None):
         """
         """
         Searches for a key pair by a given list of attributes.
         Searches for a key pair by a given list of attributes.
 
 
@@ -657,12 +676,12 @@ class KeyPairService(PageableObjectMixin, ProviderService):
         pass
         pass
 
 
     @abstractmethod
     @abstractmethod
-    def delete(self, name):
+    def delete(self, keypair_id):
         """
         """
         Delete an existing SecurityGroup.
         Delete an existing SecurityGroup.
 
 
-        :type name: str
-        :param name: The name of the key pair to be deleted.
+        :type keypair_id: str
+        :param keypair_id: The id of the key pair to be deleted.
 
 
         :rtype: ``bool``
         :rtype: ``bool``
         :return:  ``True`` if the key does not exist, ``False`` otherwise. Note
         :return:  ``True`` if the key does not exist, ``False`` otherwise. Note

+ 19 - 5
cloudbridge/cloud/providers/aws/services.py

@@ -79,6 +79,17 @@ class AWSKeyPairService(BaseKeyPairService):
     def __init__(self, provider):
     def __init__(self, provider):
         super(AWSKeyPairService, self).__init__(provider)
         super(AWSKeyPairService, self).__init__(provider)
 
 
+    def get(self, keypair_id):
+        """
+        Returns a KeyPair given its id.
+        """
+        try:
+            kps = self.provider.ec2_conn.get_all_key_pairs(
+                keynames=[keypair_id])
+            return AWSKeyPair(self.provider, kps[0])
+        except EC2ResponseError:
+            return None
+
     def list(self, limit=None, marker=None):
     def list(self, limit=None, marker=None):
         """
         """
         List all key pairs associated with this account.
         List all key pairs associated with this account.
@@ -91,15 +102,18 @@ class AWSKeyPairService(BaseKeyPairService):
         return ClientPagedResultList(self.provider, key_pairs,
         return ClientPagedResultList(self.provider, key_pairs,
                                      limit=limit, marker=marker)
                                      limit=limit, marker=marker)
 
 
-    def find(self, name):
+    def find(self, name, limit=None, marker=None):
         """
         """
         Searches for a key pair by a given list of attributes.
         Searches for a key pair by a given list of attributes.
         """
         """
         try:
         try:
-            kp = self.provider.ec2_conn.get_all_key_pairs([name])[0]
-            return AWSKeyPair(self.provider, kp)
+            key_pairs = [
+                AWSKeyPair(self.provider, kp) for kp in
+                self.provider.ec2_conn.get_all_key_pairs(keynames=[name])]
         except EC2ResponseError:
         except EC2ResponseError:
-            return None
+            key_pairs = []
+        return ClientPagedResultList(self.provider, key_pairs,
+                                     limit=limit, marker=marker)
 
 
     def create(self, name):
     def create(self, name):
         """
         """
@@ -111,7 +125,7 @@ class AWSKeyPairService(BaseKeyPairService):
         :rtype: ``object`` of :class:`.KeyPair`
         :rtype: ``object`` of :class:`.KeyPair`
         :return:  A keypair instance or None if one was not be created.
         :return:  A keypair instance or None if one was not be created.
         """
         """
-        kp = self.find(name=name)
+        kp = self.get(name)
         if kp:
         if kp:
             return kp
             return kp
         kp = self.provider.ec2_conn.create_key_pair(name)
         kp = self.provider.ec2_conn.create_key_pair(name)

+ 17 - 7
cloudbridge/cloud/providers/openstack/services.py

@@ -77,6 +77,16 @@ class OpenStackKeyPairService(BaseKeyPairService):
     def __init__(self, provider):
     def __init__(self, provider):
         super(OpenStackKeyPairService, self).__init__(provider)
         super(OpenStackKeyPairService, self).__init__(provider)
 
 
+    def get(self, keypair_id):
+        """
+        Returns a KeyPair given its id.
+        """
+        try:
+            return OpenStackKeyPair(
+                self.provider, self.provider.nova.keypairs.get(keypair_id))
+        except NovaNotFound:
+            return None
+
     def list(self, limit=None, marker=None):
     def list(self, limit=None, marker=None):
         """
         """
         List all key pairs associated with this account.
         List all key pairs associated with this account.
@@ -91,15 +101,15 @@ class OpenStackKeyPairService(BaseKeyPairService):
         return ClientPagedResultList(self.provider, results,
         return ClientPagedResultList(self.provider, results,
                                      limit=limit, marker=marker)
                                      limit=limit, marker=marker)
 
 
-    def find(self, name):
+    def find(self, name, limit=None, marker=None):
         """
         """
         Searches for a key pair by a given list of attributes.
         Searches for a key pair by a given list of attributes.
         """
         """
-        try:
-            kp = self.provider.nova.keypairs.find(name=name)
-            return OpenStackKeyPair(self.provider, kp)
-        except NovaNotFound:
-            return None
+        keypairs = self.provider.nova.keypairs.findall(name=name)
+        results = [OpenStackKeyPair(self.provider, kp)
+                   for kp in keypairs]
+        return ClientPagedResultList(self.provider, results,
+                                     limit=limit, marker=marker)
 
 
     def create(self, name):
     def create(self, name):
         """
         """
@@ -111,7 +121,7 @@ class OpenStackKeyPairService(BaseKeyPairService):
         :rtype: ``object`` of :class:`.KeyPair`
         :rtype: ``object`` of :class:`.KeyPair`
         :return:  A keypair instance or ``None`` if one was not be created.
         :return:  A keypair instance or ``None`` if one was not be created.
         """
         """
-        kp = self.find(name=name)
+        kp = self.get(name)
         if kp:
         if kp:
             return kp
             return kp
         kp = self.provider.nova.keypairs.create(name)
         kp = self.provider.nova.keypairs.create(name)

+ 19 - 10
test/test_security_service.py

@@ -15,29 +15,38 @@ class CloudSecurityServiceTestCase(ProviderTestBase):
         kp = self.provider.security.key_pairs.create(name=name)
         kp = self.provider.security.key_pairs.create(name=name)
         with helpers.cleanup_action(
         with helpers.cleanup_action(
             lambda:
             lambda:
-                self.provider.security.key_pairs.delete(name=kp.name)
+                self.provider.security.key_pairs.delete(kp.id)
         ):
         ):
             # test list method
             # test list method
             kpl = self.provider.security.key_pairs.list()
             kpl = self.provider.security.key_pairs.list()
-            found_kpl = [i for i in kpl if i.name == name]
+            list_kpl = [i for i in kpl if i.name == name]
             self.assertTrue(
             self.assertTrue(
-                len(found_kpl) == 1,
+                len(list_kpl) == 1,
                 "List keypairs does not return the expected keypair %s" %
                 "List keypairs does not return the expected keypair %s" %
                 name)
                 name)
 
 
             # check iteration
             # check iteration
-            found_kpl = [i for i in self.provider.security.key_pairs
-                         if i.name == name]
+            iter_kpl = [i for i in self.provider.security.key_pairs
+                        if i.name == name]
             self.assertTrue(
             self.assertTrue(
-                len(found_kpl) == 1,
+                len(iter_kpl) == 1,
                 "Iter keypairs does not return the expected keypair %s" %
                 "Iter keypairs does not return the expected keypair %s" %
                 name)
                 name)
 
 
-            found_kp = self.provider.security.key_pairs.find(name=name)
+            # check find
+            find_kp = self.provider.security.key_pairs.find(name=name)[0]
             self.assertTrue(
             self.assertTrue(
-                found_kp == kp,
+                find_kp == kp,
                 "Find key pair did not return the expected key {0}."
                 "Find key pair did not return the expected key {0}."
                 .format(name))
                 .format(name))
+
+            # check get
+            get_kp = self.provider.security.key_pairs.get(name)
+            self.assertTrue(
+                get_kp == kp,
+                "Get key pair did not return the expected key {0}."
+                .format(name))
+
             recreated_kp = self.provider.security.key_pairs.create(name=name)
             recreated_kp = self.provider.security.key_pairs.create(name=name)
             self.assertTrue(
             self.assertTrue(
                 recreated_kp == kp,
                 recreated_kp == kp,
@@ -50,8 +59,8 @@ class CloudSecurityServiceTestCase(ProviderTestBase):
             "Key pair {0} should have been deleted but still exists."
             "Key pair {0} should have been deleted but still exists."
             .format(name))
             .format(name))
         no_kp = self.provider.security.key_pairs.find(name='bogus_kp')
         no_kp = self.provider.security.key_pairs.find(name='bogus_kp')
-        self.assertTrue(
-            no_kp is None,
+        self.assertFalse(
+            no_kp,
             "Found a key pair {0} that should not exist?".format(no_kp))
             "Found a key pair {0} that should not exist?".format(no_kp))
 
 
     def test_key_pair(self):
     def test_key_pair(self):