You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@libcloud.apache.org by an...@apache.org on 2017/04/10 02:37:20 UTC

[1/2] libcloud git commit: Added methods for managing SSH key pairs for OnApp

Repository: libcloud
Updated Branches:
  refs/heads/trunk f4f91b182 -> bdd0b34e8


Added methods for managing SSH key pairs for OnApp

Closes #1018


Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo
Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/a65f32e9
Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/a65f32e9
Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/a65f32e9

Branch: refs/heads/trunk
Commit: a65f32e9c0682a46670b0790934dba949dd3e31e
Parents: f4f91b1
Author: Tinu Cleatus <ti...@gmail.com>
Authored: Tue Apr 4 18:52:52 2017 +0530
Committer: Anthony Shaw <an...@apache.org>
Committed: Mon Apr 10 12:36:22 2017 +1000

----------------------------------------------------------------------
 docs/examples/compute/onapp/functionality.py    | 31 ++++++++
 libcloud/compute/drivers/onapp.py               | 81 +++++++++++++++++++-
 .../compute/fixtures/onapp/get_key_pair.json    |  9 +++
 .../compute/fixtures/onapp/import_key_pair.json |  9 +++
 .../compute/fixtures/onapp/list_key_pairs.json  | 20 +++++
 .../test/compute/fixtures/onapp/profile.json    | 12 +++
 libcloud/test/compute/test_onapp.py             | 45 +++++++++++
 7 files changed, 205 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/a65f32e9/docs/examples/compute/onapp/functionality.py
----------------------------------------------------------------------
diff --git a/docs/examples/compute/onapp/functionality.py b/docs/examples/compute/onapp/functionality.py
index 2465114..216a3e2 100644
--- a/docs/examples/compute/onapp/functionality.py
+++ b/docs/examples/compute/onapp/functionality.py
@@ -65,3 +65,34 @@ driver.destroy_node(node)
 #
 for image in driver.list_images():
     print(image)
+
+#
+# List key pairs
+#
+for key_pair in driver.list_key_pairs():
+    print(key_pair)
+
+#
+# Get key pair
+#
+id = 2  # ID of key pair
+key_pair = driver.get_key_pair(id)
+print(key_pair)
+
+#
+# Import key pair from string
+#
+name = 'example'  # this param is unused
+key = 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC8uuUq...'
+key_pair = driver.import_key_pair_from_string(name, key)
+
+#
+# Import key pair from file
+#
+driver.import_key_pair_from_file('example', '~/.ssh/id_rsa.pub')
+
+#
+# Delete key pair
+#
+key_pair = driver.list_key_pairs()[0]
+driver.delete_key_pair(key_pair)

http://git-wip-us.apache.org/repos/asf/libcloud/blob/a65f32e9/libcloud/compute/drivers/onapp.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/drivers/onapp.py b/libcloud/compute/drivers/onapp.py
index 543e107..aea042d 100644
--- a/libcloud/compute/drivers/onapp.py
+++ b/libcloud/compute/drivers/onapp.py
@@ -1,8 +1,10 @@
 import json
 
-from libcloud.compute.base import Node, NodeDriver, NodeImage
-from libcloud.common.onapp import OnAppConnection
+from libcloud.utils.py3 import httplib
 from libcloud.utils.networking import is_private_subnet
+
+from libcloud.common.onapp import OnAppConnection
+from libcloud.compute.base import Node, NodeDriver, NodeImage, KeyPair
 from libcloud.compute.providers import Provider
 
 
@@ -327,10 +329,85 @@ class OnAppNodeDriver(NodeDriver):
             templates.append(self._to_image(template["image_template"]))
         return templates
 
+    def list_key_pairs(self):
+        """
+        List all the available key pair objects.
+
+        :rtype: ``list`` of :class:`.KeyPair` objects
+        """
+        user_id = self.connection.request('/profile.json').object['user']['id']
+        response = self.connection.request('/users/%s/ssh_keys.json' % user_id)
+        ssh_keys = []
+        for ssh_key in response.object:
+            ssh_keys.append(self._to_key_pair(ssh_key['ssh_key']))
+        return ssh_keys
+
+    def get_key_pair(self, name):
+        """
+        Retrieve a single key pair.
+
+        :param name: ID of the key pair to retrieve.
+        :type name: ``str``
+
+        :rtype: :class:`.KeyPair` object
+        """
+        user_id = self.connection.request('/profile.json').object['user']['id']
+        response = self.connection.request(
+            '/users/%s/ssh_keys/%s.json' % (user_id, name))
+        return self._to_key_pair(response.object['ssh_key'])
+
+    def import_key_pair_from_string(self, name, key_material):
+        """
+        Import a new public key from string.
+
+        :param name: Key pair name (unused).
+        :type name: ``str``
+
+        :param key_material: Public key material.
+        :type key_material: ``str``
+
+        :rtype: :class:`.KeyPair` object
+        """
+        data = json.dumps({'key': key_material})
+        user_id = self.connection.request('/profile.json').object['user']['id']
+        response = self.connection.request(
+            '/users/%s/ssh_keys.json' % user_id,
+            data=data,
+            headers={
+                "Content-type": "application/json"},
+            method="POST")
+        return self._to_key_pair(response.object['ssh_key'])
+
+    def delete_key_pair(self, key):
+        """
+        Delete an existing key pair.
+
+        :param key_pair: Key pair object.
+        :type key_pair: :class:`.KeyPair`
+
+        :return: True on success
+        :rtype: ``bool``
+        """
+        key_id = key.name
+        response = self.connection.request(
+            '/settings/ssh_keys/%s.json' % key_id,
+            method='DELETE')
+        return response.status == httplib.NO_CONTENT
+
     #
     # Helper methods
     #
 
+    def _to_key_pair(self, data):
+        extra = {'created_at': data['created_at'],
+                 'updated_at': data['updated_at']}
+        return KeyPair(name=data['id'],
+                       fingerprint=None,
+                       public_key=data['key'],
+                       private_key=None,
+                       driver=self,
+                       extra=extra)
+
     def _to_image(self, template):
         extra = {'distribution': template['operating_system_distro'],
                  'operating_system': template['operating_system'],

http://git-wip-us.apache.org/repos/asf/libcloud/blob/a65f32e9/libcloud/test/compute/fixtures/onapp/get_key_pair.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/onapp/get_key_pair.json b/libcloud/test/compute/fixtures/onapp/get_key_pair.json
new file mode 100644
index 0000000..654861a
--- /dev/null
+++ b/libcloud/test/compute/fixtures/onapp/get_key_pair.json
@@ -0,0 +1,9 @@
+{
+  "ssh_key": {
+    "id": 1,
+    "user_id": 123,
+    "key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC8uuUqh0cXhx5s9AxlQHCWzQoS9w0qy/WN/I/CZuy4p+mQYhOYSqBi/aqf4/wySyOtzez785IGBriX24zk6vMcfSuB7wgHzCGZ433zAkdZu39nPPpCo3WWZmJ3GKYjEN+yNJNG8kR3OW3N0mRSId3ebFZoLUafli8sSt6XeXHgeLPfEvbpiEdKxHskRsZHP8JoM2tQD9Ms5/9KPbbhg4geeu9FO28kozacBdyQMS1db+45b9xz0L9GPYO0NasESq9cC4BvlhPvAFHDT1kio6DjjhZ5kUK7OcmRK+8/Jk+9cTSj9MzVMCwRni3HyA37/Mu4qBpDkR9sPwgJ9G/UY7ZP John@Johns-MacBook-Pro",
+    "created_at": "2017-03-22T19:11:32.000+05:30",
+    "updated_at": "2017-03-22T19:11:32.000+05:30"
+  }
+}

http://git-wip-us.apache.org/repos/asf/libcloud/blob/a65f32e9/libcloud/test/compute/fixtures/onapp/import_key_pair.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/onapp/import_key_pair.json b/libcloud/test/compute/fixtures/onapp/import_key_pair.json
new file mode 100644
index 0000000..b80b162
--- /dev/null
+++ b/libcloud/test/compute/fixtures/onapp/import_key_pair.json
@@ -0,0 +1,9 @@
+{
+  "ssh_key": {
+    "id": 3,
+    "user_id": 123,
+    "key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC8uuUq",
+    "created_at": "2017-03-22T19:11:32.000+05:30",
+    "updated_at": "2017-03-22T19:11:32.000+05:30"
+  }
+}

http://git-wip-us.apache.org/repos/asf/libcloud/blob/a65f32e9/libcloud/test/compute/fixtures/onapp/list_key_pairs.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/onapp/list_key_pairs.json b/libcloud/test/compute/fixtures/onapp/list_key_pairs.json
new file mode 100644
index 0000000..2ee58c5
--- /dev/null
+++ b/libcloud/test/compute/fixtures/onapp/list_key_pairs.json
@@ -0,0 +1,20 @@
+[
+  {
+    "ssh_key": {
+      "id": 1,
+      "user_id": 123,
+      "key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC8uuUqh0cXhx5s9AxlQHCWzQoS9w0qy/WN/I/CZuy4p+mQYhOYSqBi/aqf4/wySyOtzez785IGBriX24zk6vMcfSuB7wgHzCGZ433zAkdZu39nPPpCo3WWZmJ3GKYjEN+yNJNG8kR3OW3N0mRSId3ebFZoLUafli8sSt6XeXHgeLPfEvbpiEdKxHskRsZHP8JoM2tQD9Ms5/9KPbbhg4geeu9FO28kozacBdyQMS1db+45b9xz0L9GPYO0NasESq9cC4BvlhPvAFHDT1kio6DjjhZ5kUK7OcmRK+8/Jk+9cTSj9MzVMCwRni3HyA37/Mu4qBpDkR9sPwgJ9G/UY7ZP John@Johns-MacBook-Pro",
+      "created_at": "2017-03-22T19:11:32.000+05:30",
+      "updated_at": "2017-03-22T19:11:32.000+05:30"
+    }
+  },
+  {
+    "ssh_key": {
+      "id": 2,
+      "user_id": 123,
+      "key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCx/N6Mm/8BapBlTPhjnrj06yyAKYDTfBgIOzhPzdq1rco6FS7JVUot3zY4pX3ZUkLJh5JDsNz9FyqyGpXBzO3G7QpDhGggjqfYxpsR9VQBDNC8YKpQdaa6j2s1yJsI0cb+/sQl9SC/9WyBCceK3mzPt5AsSzdY0hA2+jPYuCzvTT/S0qfsk2WyvA+fK7ue7yWD/8KSNQx2/xsP3GU+/Ck5D7w+8ck1oUVXAFoO/WUIEwbx5u9wurv73GsK6Pqgt1tjtNznS50JsyHmayeZzrX1hr33PE9IarlUzWAUj4zvpdDTpCm/u2f2UnmSJJ0cT45NUUG085WTyhy2ZHBz3jOT John@Johns-iMac",
+      "created_at": "2017-03-24T14:31:24.000+05:30",
+      "updated_at": "2017-03-24T14:31:24.000+05:30"
+    }
+  }
+]

http://git-wip-us.apache.org/repos/asf/libcloud/blob/a65f32e9/libcloud/test/compute/fixtures/onapp/profile.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/onapp/profile.json b/libcloud/test/compute/fixtures/onapp/profile.json
new file mode 100644
index 0000000..5c3ae26
--- /dev/null
+++ b/libcloud/test/compute/fixtures/onapp/profile.json
@@ -0,0 +1,12 @@
+{
+  "user": {
+    "id": 123,
+    "identifier": "abcdef123345",
+    "email": "abc@example.com",
+    "first_name": "John",
+    "last_name": "Smith",
+    "status": "active",
+    "created_at": "2017-03-22T20:39:36.000+07:00",
+    "updated_at": "2017-03-22T20:39:36.000+07:00"
+  }
+}

http://git-wip-us.apache.org/repos/asf/libcloud/blob/a65f32e9/libcloud/test/compute/test_onapp.py
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/test_onapp.py b/libcloud/test/compute/test_onapp.py
index 6559c3c..c5d1641 100644
--- a/libcloud/test/compute/test_onapp.py
+++ b/libcloud/test/compute/test_onapp.py
@@ -81,6 +81,32 @@ class OnAppNodeTestCase(LibcloudTestCase):
         self.assertEqual(256, extra['min_memory_size'])
         self.assertEqual('rhel', extra['distribution'])
 
+    def test_list_key_pairs(self):
+        keys = self.driver.list_key_pairs()
+        self.assertEqual(2, len(keys))
+        self.assertEqual(1, keys[0].name)
+        self.assertIsNotNone(keys[0].public_key)
+        self.assertIsNotNone(keys[1].public_key)
+
+    def test_get_key_pair(self):
+        key = self.driver.get_key_pair(1)
+        self.assertEqual(1, key.name)
+        self.assertIsNotNone(key.public_key)
+
+    def test_import_key_pair_from_string(self):
+        key = self.driver.import_key_pair_from_string(
+            'name',
+            'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC8uuUq')
+        self.assertEqual(3, key.name)
+        self.assertEqual(
+            'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC8uuUq',
+            key.public_key)
+
+    def test_delete_key_pair(self):
+        key = self.driver.get_key_pair(1)
+        response = self.driver.delete_key_pair(key)
+        self.assertTrue(response)
+
 
 class OnAppMockHttp(MockHttpTestCase):
     fixtures = ComputeFileFixtures('onapp')
@@ -104,6 +130,25 @@ class OnAppMockHttp(MockHttpTestCase):
         body = self.fixtures.load('list_images.json')
         return (httplib.OK, body, {}, httplib.responses[httplib.OK])
 
+    def _profile_json(self, method, url, body, headers):
+        body = self.fixtures.load('profile.json')
+        return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+    def _users_123_ssh_keys_json(self, method, url, body, headers):
+        if method == 'GET':
+            body = self.fixtures.load('list_key_pairs.json')
+        else:
+            body = self.fixtures.load('import_key_pair.json')
+        return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+    def _users_123_ssh_keys_1_json(self, method, url, body, headers):
+        body = self.fixtures.load('get_key_pair.json')
+        return (httplib.OK, body, {}, httplib.responses[httplib.OK])
+
+    def _settings_ssh_keys_1_json(self, method, url, body, headers):
+        return (httplib.NO_CONTENT, '', {},
+                httplib.responses[httplib.NO_CONTENT])
+
 
 if __name__ == '__main__':
     sys.exit(unittest.main())


[2/2] libcloud git commit: changes for #1018

Posted by an...@apache.org.
changes for #1018


Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo
Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/bdd0b34e
Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/bdd0b34e
Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/bdd0b34e

Branch: refs/heads/trunk
Commit: bdd0b34e8b2bd27b393cd64650bafc2d8400016f
Parents: a65f32e
Author: Anthony Shaw <an...@apache.org>
Authored: Mon Apr 10 12:37:13 2017 +1000
Committer: Anthony Shaw <an...@apache.org>
Committed: Mon Apr 10 12:37:13 2017 +1000

----------------------------------------------------------------------
 CHANGES.rst | 4 ++++
 1 file changed, 4 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/bdd0b34e/CHANGES.rst
----------------------------------------------------------------------
diff --git a/CHANGES.rst b/CHANGES.rst
index 1400f6c..d356eb8 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -14,6 +14,10 @@ Common
 Compute
 ~~~~~~~
 
+- Add keypair management to OnApp driver
+  [GITHUB-1018]
+  (Tinu Cleatus)
+
 - Add missing regions in AWS storage and compute drivers
   [GITHUB-1019]
   (Alex Misstear)