From 9260ea1493fa4dfdb648f9376782a82f52664e5b Mon Sep 17 00:00:00 2001 From: andrewbogott Date: Tue, 30 Jun 2015 01:07:55 -0500 Subject: [PATCH] Include project_id in instance metadata. Instances sometimes need to know what project they're in in order to manage permissions or naming. This change allows an instance to grab its project id without needing keystone auth or other work-arounds. Implements blueprint project-id-in-metadata DocImpact: Update release notes and the metadata-service doc page. Closes-Bug: #1470179 Change-Id: Idf2ea1473a545a51e1a4e50579da585d8f674f74 --- nova/api/metadata/base.py | 3 +++ nova/tests/unit/test_metadata.py | 15 +++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/nova/api/metadata/base.py b/nova/api/metadata/base.py index bac4b7c512..e7e37788e5 100644 --- a/nova/api/metadata/base.py +++ b/nova/api/metadata/base.py @@ -330,6 +330,9 @@ class InstanceMetadata(object): if self._check_os_version(GRIZZLY, version): metadata['random_seed'] = base64.b64encode(os.urandom(512)) + if self._check_os_version(LIBERTY, version): + metadata['project_id'] = self.instance.project_id + self.set_mimetype(MIME_TYPE_APPLICATION_JSON) return jsonutils.dumps(metadata) diff --git a/nova/tests/unit/test_metadata.py b/nova/tests/unit/test_metadata.py index eece3176b1..12a9e0866f 100644 --- a/nova/tests/unit/test_metadata.py +++ b/nova/tests/unit/test_metadata.py @@ -528,6 +528,21 @@ class OpenStackMetadataTestCase(test.TestCase): mdjson = mdinst.lookup("/openstack/2012-08-10/meta_data.json") self.assertNotIn("random_seed", jsonutils.loads(mdjson)) + def test_project_id(self): + fakes.stub_out_key_pair_funcs(self.stubs) + mdinst = fake_InstanceMetadata(self.stubs, self.instance) + + # verify that 2015-10-15 has the 'project_id' field + mdjson = mdinst.lookup("/openstack/2015-10-15/meta_data.json") + mddict = jsonutils.loads(mdjson) + + self.assertIn("project_id", mddict) + self.assertEqual(mddict["project_id"], self.instance.project_id) + + # verify that older version do not have it + mdjson = mdinst.lookup("/openstack/2013-10-17/meta_data.json") + self.assertNotIn("project_id", jsonutils.loads(mdjson)) + def test_no_dashes_in_metadata(self): # top level entries in meta_data should not contain '-' in their name fakes.stub_out_key_pair_funcs(self.stubs)