diff options
| author | Jenkins <jenkins@review.openstack.org> | 2011-12-30 19:50:52 +0000 |
|---|---|---|
| committer | Gerrit Code Review <review@openstack.org> | 2011-12-30 19:50:52 +0000 |
| commit | ea21fe69655ae441eb9660e0579046355f6db4c1 (patch) | |
| tree | bfe0ff447a0276677e73e5948817ebadbfa2d69f /nova/api | |
| parent | 9920dbd49609c0dec1fab69808df7ef57f1cb5cc (diff) | |
| parent | 5bdc35b11574439057cfbdee17cf83c40da2cea2 (diff) | |
Merge "Adds EC2 ImportKeyPair API support."
Diffstat (limited to 'nova/api')
| -rw-r--r-- | nova/api/ec2/__init__.py | 2 | ||||
| -rw-r--r-- | nova/api/ec2/cloud.py | 39 |
2 files changed, 27 insertions, 14 deletions
diff --git a/nova/api/ec2/__init__.py b/nova/api/ec2/__init__.py index 3c1250f97..fcd08531a 100644 --- a/nova/api/ec2/__init__.py +++ b/nova/api/ec2/__init__.py @@ -278,7 +278,7 @@ class Authorizer(wsgi.Middleware): 'CreateKeyPair': ['all'], 'DeleteKeyPair': ['all'], 'DescribeSecurityGroups': ['all'], - 'ImportPublicKey': ['all'], + 'ImportKeyPair': ['all'], 'AuthorizeSecurityGroupIngress': ['netadmin'], 'RevokeSecurityGroupIngress': ['netadmin'], 'CreateSecurityGroup': ['netadmin'], diff --git a/nova/api/ec2/cloud.py b/nova/api/ec2/cloud.py index 1f5405dea..a965b84b6 100644 --- a/nova/api/ec2/cloud.py +++ b/nova/api/ec2/cloud.py @@ -388,26 +388,39 @@ class CloudController(object): 'keyMaterial': data['private_key']} # TODO(vish): when context is no longer an object, pass it here - def import_public_key(self, context, key_name, public_key, - fingerprint=None): + def _get_fingerprint(self, public_key): + tmpdir = tempfile.mkdtemp() + pubfile = os.path.join(tmpdir, 'temp.pub') + fh = open(pubfile, 'w') + fh.write(public_key) + fh.close() + try: + (out, err) = utils.execute('ssh-keygen', '-l', '-f', + '%s' % (pubfile)) + return out.split(' ')[1] + except: + raise + finally: + shutil.rmtree(tmpdir) + + def import_key_pair(self, context, key_name, public_key_material, + **kwargs): LOG.audit(_("Import key %s"), key_name, context=context) + try: + db.key_pair_get(context, context.user_id, key_name) + raise exception.KeyPairExists(key_name=key_name) + except exception.NotFound: + pass + public_key = base64.b64decode(public_key_material) + fingerprint = self._get_fingerprint(public_key) key = {} key['user_id'] = context.user_id key['name'] = key_name key['public_key'] = public_key - if fingerprint is None: - tmpdir = tempfile.mkdtemp() - pubfile = os.path.join(tmpdir, 'temp.pub') - fh = open(pubfile, 'w') - fh.write(public_key) - fh.close() - (out, err) = utils.execute('ssh-keygen', '-q', '-l', '-f', - '%s' % (pubfile)) - fingerprint = out.split(' ')[1] - shutil.rmtree(tmpdir) key['fingerprint'] = fingerprint db.key_pair_create(context, key) - return True + return {'keyName': key_name, + 'keyFingerprint': fingerprint} def delete_key_pair(self, context, key_name, **kwargs): LOG.audit(_("Delete key pair %s"), key_name, context=context) |
