From 6d8b58dc6f1cbda8d664b3487674f87049491c74 Mon Sep 17 00:00:00 2001 From: Michael Still Date: Mon, 9 Jan 2017 15:15:20 +1100 Subject: [PATCH] Cache boot time roles for vendordata. Some external vendordata services want to provide metadata based on the role of the user who started the instance. It would be confusing if the metadata returned changed later if the role of the user changed, so we cache the boot time roles and then pass those to the external vendordata service. Change-Id: Ieb84c945f4f9a21c2b7b892f9b1ead84dca441e9 --- nova/api/metadata/vendordata_dynamic.py | 4 +++- nova/compute/manager.py | 5 +++++ nova/tests/unit/compute/test_compute.py | 12 +++++++----- ...ata-reboot-cache-boot-roles-6051fabcd4981928.yaml | 8 ++++++++ 4 files changed, 23 insertions(+), 6 deletions(-) create mode 100644 releasenotes/notes/vendordata-reboot-cache-boot-roles-6051fabcd4981928.yaml diff --git a/nova/api/metadata/vendordata_dynamic.py b/nova/api/metadata/vendordata_dynamic.py index 4f4b521445..1344aa70b0 100644 --- a/nova/api/metadata/vendordata_dynamic.py +++ b/nova/api/metadata/vendordata_dynamic.py @@ -78,7 +78,9 @@ class DynamicVendorData(vendordata.VendorDataDriver): 'image-id': self.instance.image_ref, 'user-data': self.instance.user_data, 'hostname': self.instance.hostname, - 'metadata': self.instance.metadata} + 'metadata': self.instance.metadata, + 'boot-roles': self.instance.system_metadata.get( + 'boot_roles', '')} headers = {'Content-Type': 'application/json', 'Accept': 'application/json', 'User-Agent': 'openstack-nova-vendordata'} diff --git a/nova/compute/manager.py b/nova/compute/manager.py index 84b024863d..2f40d73061 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -1887,6 +1887,11 @@ class ComputeManager(manager.Manager): action=fields.NotificationAction.CREATE, phase=fields.NotificationPhase.START) + # NOTE(mikal): cache the keystone roles associated with the instance + # at boot time for later reference + instance.system_metadata.update( + {'boot_roles': ','.join(context.roles)}) + self._check_device_tagging(requested_networks, block_device_mapping) try: diff --git a/nova/tests/unit/compute/test_compute.py b/nova/tests/unit/compute/test_compute.py index 023bf10c03..6a36f14d79 100644 --- a/nova/tests/unit/compute/test_compute.py +++ b/nova/tests/unit/compute/test_compute.py @@ -8232,12 +8232,14 @@ class ComputeAPITestCase(BaseTestCase): self.assertEqual(instance.task_state, task_states.REBUILDING) sys_meta = {k: v for k, v in instance.system_metadata.items() if not k.startswith('instance_type')} - self.assertEqual(sys_meta, + self.assertEqual( {'image_kernel_id': uuids.kernel_id, - 'image_min_disk': '1', - 'image_ramdisk_id': uuids.ramdisk_id, - 'image_something_else': 'meow', - 'preserved': 'preserve this!'}) + 'image_min_disk': '1', + 'image_ramdisk_id': uuids.ramdisk_id, + 'image_something_else': 'meow', + 'preserved': 'preserve this!', + 'boot_roles': ''}, + sys_meta) def test_rebuild(self): self._test_rebuild(vm_state=vm_states.ACTIVE) diff --git a/releasenotes/notes/vendordata-reboot-cache-boot-roles-6051fabcd4981928.yaml b/releasenotes/notes/vendordata-reboot-cache-boot-roles-6051fabcd4981928.yaml new file mode 100644 index 0000000000..1c709df668 --- /dev/null +++ b/releasenotes/notes/vendordata-reboot-cache-boot-roles-6051fabcd4981928.yaml @@ -0,0 +1,8 @@ +--- +features: + - | + The vendordata metadata system now caches boot time roles. Some external + vendordata services want to provide metadata based on the role of the user + who started the instance. It would be confusing if the metadata returned + changed later if the role of the user changed, so we cache the boot time + roles and then pass those to the external vendordata service.