summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2012-06-27 18:00:27 +0000
committerGerrit Code Review <review@openstack.org>2012-06-27 18:00:27 +0000
commit1393541902a13c12e4ef910fc41e20791f05107d (patch)
tree53c3e1b08ddd9c17e2148531c1f1a7ea5e5ee58a
parent8e768dc5500649f12b87c8569d0d646fa4e47ed4 (diff)
parenta5130faf80d29b1a6ed80d03b2b167a54c209911 (diff)
Merge "metadata: cleanup pubkey representation"
-rw-r--r--nova/api/metadata/base.py20
-rw-r--r--nova/tests/test_metadata.py10
2 files changed, 25 insertions, 5 deletions
diff --git a/nova/api/metadata/base.py b/nova/api/metadata/base.py
index 3f7db817d..1b0ac441b 100644
--- a/nova/api/metadata/base.py
+++ b/nova/api/metadata/base.py
@@ -136,10 +136,18 @@ class InstanceMetadata():
if self.userdata_b64 is not None:
data['user-data'] = self.userdata_b64
- # public-keys should be in meta-data only if user specified one
+ # public keys are strangely rendered in ec2 metadata service
+ # meta-data/public-keys/ returns '0=keyname' (with no trailing /)
+ # and only if there is a public key given.
+ # '0=keyname' means there is a normally rendered dict at
+ # meta-data/public-keys/0
+ #
+ # meta-data/public-keys/ : '0=%s' % keyname
+ # meta-data/public-keys/0/ : 'openssh-key'
+ # meta-data/public-keys/0/openssh-key : '%s' % publickey
if self.instance['key_name']:
data['meta-data']['public-keys'] = {
- '0': {'_name': self.instance['key_name'],
+ '0': {'_name': "0=" + self.instance['key_name'],
'openssh-key': self.instance['key_data']}}
if False: # TODO(vish): store ancestor ids
@@ -241,12 +249,14 @@ def ec2_md_print(data):
for key in sorted(data.keys()):
if key == '_name':
continue
- output += key
if isinstance(data[key], dict):
if '_name' in data[key]:
- output += '=' + str(data[key]['_name'])
+ output += str(data[key]['_name'])
else:
- output += '/'
+ output += key + '/'
+ else:
+ output += key
+
output += '\n'
return output[:-1]
elif isinstance(data, list):
diff --git a/nova/tests/test_metadata.py b/nova/tests/test_metadata.py
index 1d2cc37aa..0c3c5b574 100644
--- a/nova/tests/test_metadata.py
+++ b/nova/tests/test_metadata.py
@@ -180,6 +180,16 @@ class MetadataTestCase(test.TestCase):
self.assertEqual(base._format_instance_mapping(ctxt, instance_ref1),
expected)
+ def test_pubkey(self):
+ md = fake_InstanceMetadata(self.stubs, copy(self.instance))
+ data = md.get_ec2_metadata(version='2009-04-04')
+ pubkey_ent = data['meta-data']['public-keys']
+
+ self.assertEqual(base.ec2_md_print(pubkey_ent),
+ "0=%s" % self.instance['key_name'])
+ self.assertEqual(base.ec2_md_print(pubkey_ent['0']['openssh-key']),
+ self.instance['key_data'])
+
class MetadataHandlerTestCase(test.TestCase):
"""Test that metadata is returning proper values."""