Updated Branches: refs/heads/trunk a5fc9d515 -> 12abd62e9
LIBCLOUD-380: Add import_keypair functions and tests Signed-off-by: Tomaz Muraus <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/2be6b006 Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/2be6b006 Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/2be6b006 Branch: refs/heads/trunk Commit: 2be6b006928639917cbda1641a98eeb5a13040a3 Parents: a5fc9d5 Author: Sebastien Goasguen <[email protected]> Authored: Thu Aug 22 05:23:12 2013 -0400 Committer: Tomaz Muraus <[email protected]> Committed: Thu Aug 22 21:59:39 2013 +0200 ---------------------------------------------------------------------- libcloud/compute/drivers/cloudstack.py | 36 ++++++++++++++++++++ .../compute/fixtures/cloudstack/dummy_rsa.pub | 1 + .../cloudstack/registerSSHKeyPair_default.json | 1 + libcloud/test/compute/test_cloudstack.py | 35 ++++++++++++++----- 4 files changed, 64 insertions(+), 9 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/libcloud/blob/2be6b006/libcloud/compute/drivers/cloudstack.py ---------------------------------------------------------------------- diff --git a/libcloud/compute/drivers/cloudstack.py b/libcloud/compute/drivers/cloudstack.py index d7ec86f..0726501 100644 --- a/libcloud/compute/drivers/cloudstack.py +++ b/libcloud/compute/drivers/cloudstack.py @@ -19,6 +19,7 @@ from libcloud.compute.base import Node, NodeDriver, NodeImage, NodeLocation,\ NodeSize, StorageVolume from libcloud.compute.types import NodeState, LibcloudError +import os class CloudStackNode(Node): "Subclass of Node so we can expose our extension methods." @@ -658,6 +659,41 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver): res = self._sync_request('deleteSSHKeyPair', name=name, **extra_args) return res['success'] + def ex_import_keypair_from_string(self, name, key_material): + """ + Imports a new public key where the public key is passed in as a string + + @param name: The name of the public key to import. + @type name: C{str} + + @param key_material: The contents of a public key file. + @type key_material: C{str} + + @rtype: C{dict} + """ + + res = self._sync_request('registerSSHKeyPair', name=name, publickey=key_material) + return { + 'keyName': res['keypair']['name'], + 'keyFingerprint': res['keypair']['fingerprint'] + } + + def ex_import_keypair(self, name, keyfile): + """ + Imports a new public key where the public key is passed via a filename + + @param name: The name of the public key to import. + @type name: C{str} + + @param keyfile: The filename with path of the public key to import. + @type keyfile: C{str} + + @rtype: C{dict} + """ + with open(os.path.expanduser(keyfile)) as fh: + content = fh.read() + return self.ex_import_keypair_from_string(name, content) + def ex_list_security_groups(self, **kwargs): """ Lists Security Groups http://git-wip-us.apache.org/repos/asf/libcloud/blob/2be6b006/libcloud/test/compute/fixtures/cloudstack/dummy_rsa.pub ---------------------------------------------------------------------- diff --git a/libcloud/test/compute/fixtures/cloudstack/dummy_rsa.pub b/libcloud/test/compute/fixtures/cloudstack/dummy_rsa.pub new file mode 100644 index 0000000..1d18ad6 --- /dev/null +++ b/libcloud/test/compute/fixtures/cloudstack/dummy_rsa.pub @@ -0,0 +1 @@ +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCw3Fw6AdX+3Ul3lRJIPE0Hd5oBaHnCVB1Wl325FVeJZeQiKF9Z0sw+/StWuo2ZA5ra6/A8X7tITiO7goUncdd7xLT3r3UCwKGNZXrTn8e2Kutqd9S7EN+SUh63kZmcEQsFCuC3hg0O8TzG5ROQxukYc+7PAvcYk7+KV8r3B5eh2lvp5tHTpCX/63pm4zHm5rnE38DnESeh4Dh2R8hkhnoxo9ixQCdETbufUTo5abCkKbcf8/1+qA5A13uXqBsx/KtmZX0SvyQW3hKFPGXSaYxAE/u+DZU8Myr/dDKLrGPYt6e5CSXlQLFcnz99akuVdqOP9ygPGcgwlAajOZgt+Vwn [email protected] http://git-wip-us.apache.org/repos/asf/libcloud/blob/2be6b006/libcloud/test/compute/fixtures/cloudstack/registerSSHKeyPair_default.json ---------------------------------------------------------------------- diff --git a/libcloud/test/compute/fixtures/cloudstack/registerSSHKeyPair_default.json b/libcloud/test/compute/fixtures/cloudstack/registerSSHKeyPair_default.json new file mode 100644 index 0000000..f52ee31 --- /dev/null +++ b/libcloud/test/compute/fixtures/cloudstack/registerSSHKeyPair_default.json @@ -0,0 +1 @@ +{ "registersshkeypairresponse": { "keypair": { "name": "foobar", "fingerprint": "c4:a1:e5:d4:50:84:a9:4c:6b:22:ee:d6:57:02:b8:15" } } } http://git-wip-us.apache.org/repos/asf/libcloud/blob/2be6b006/libcloud/test/compute/test_cloudstack.py ---------------------------------------------------------------------- diff --git a/libcloud/test/compute/test_cloudstack.py b/libcloud/test/compute/test_cloudstack.py index 2f27539..943f7d5 100644 --- a/libcloud/test/compute/test_cloudstack.py +++ b/libcloud/test/compute/test_cloudstack.py @@ -14,6 +14,7 @@ # limitations under the License. import sys +import os from libcloud.utils.py3 import httplib from libcloud.utils.py3 import urlparse @@ -196,17 +197,17 @@ class CloudStackNodeDriverTest(unittest.TestCase, TestCaseMixin): location = self.driver.list_locations()[0] self.assertEquals('Sydney', location.name) - def test_start_node(self): + def test_ex_start_node(self): node = self.driver.list_nodes()[0] res = node.ex_start() self.assertEquals('Starting', res) - def test_stop_node(self): + def test_ex_stop_node(self): node = self.driver.list_nodes()[0] res = node.ex_stop() self.assertEquals('Stopped', res) - def test_list_keypairs(self): + def test_ex_list_keypairs(self): keypairs = self.driver.ex_list_keypairs() fingerprint = '00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:' + \ '00:00:00:00:00' @@ -214,29 +215,45 @@ class CloudStackNodeDriverTest(unittest.TestCase, TestCaseMixin): self.assertEqual(keypairs[0]['name'], 'cs-keypair') self.assertEqual(keypairs[0]['fingerprint'], fingerprint) - def test_create_keypair(self): + def test_ex_create_keypair(self): self.assertRaises( LibcloudError, self.driver.ex_create_keypair, 'cs-keypair') - def test_delete_keypair(self): + def test_ex_delete_keypair(self): res = self.driver.ex_delete_keypair('cs-keypair') self.assertTrue(res) - def test_list_security_groups(self): + def test_ex_import_keypair(self): + fingerprint = 'c4:a1:e5:d4:50:84:a9:4c:6b:22:ee:d6:57:02:b8:15' + path = os.path.join(os.path.dirname(__file__), "fixtures", "cloudstack", "dummy_rsa.pub") + + res = self.driver.ex_import_keypair('foobar', path) + self.assertEqual(res['keyName'], 'foobar') + self.assertEqual(res['keyFingerprint'], fingerprint) + + def test_ex_import_keypair_from_string(self): + fingerprint = 'c4:a1:e5:d4:50:84:a9:4c:6b:22:ee:d6:57:02:b8:15' + path = os.path.join(os.path.dirname(__file__), "fixtures", "cloudstack", "dummy_rsa.pub") + + res = self.driver.ex_import_keypair_from_string('foobar', open(path).read()) + self.assertEqual(res['keyName'], 'foobar') + self.assertEqual(res['keyFingerprint'], fingerprint) + + def test_ex_list_security_groups(self): groups = self.driver.ex_list_security_groups() self.assertEqual(groups[0]['name'], 'default') - def test_create_security_group(self): + def test_ex_create_security_group(self): group = self.driver.ex_create_security_group(name='MySG') self.assertEqual(group['name'], 'MySG') - def test_delete_security_group(self): + def test_ex_delete_security_group(self): res = self.driver.ex_delete_security_group(name='MySG') self.assertTrue(res) - def test_authorize_security_group_ingress(self): + def test_ex_authorize_security_group_ingress(self): res = self.driver.ex_authorize_security_group_ingress('MySG', 'TCP', '22',
