diff -Nru cloud-init-0.7.5/debian/changelog cloud-init-0.7.5/debian/changelog --- cloud-init-0.7.5/debian/changelog 2016-02-05 20:36:36.000000000 +0000 +++ cloud-init-0.7.5/debian/changelog 2016-03-03 15:48:07.000000000 +0000 @@ -1,3 +1,12 @@ +cloud-init (0.7.5-0ubuntu1.17) trusty; urgency=medium + + * Microsoft Azure: + - d/patches/lp-1551419-azure-handle-flipped-uuid-endianness.patch: Handle + cases where the endianness of the DMI UUID used for the instance ID has + changed since last boot.(LP: #1551419) + + -- Daniel Watkins Wed, 02 Mar 2016 14:23:18 +0000 + cloud-init (0.7.5-0ubuntu1.16) trusty; urgency=medium * Joyent Smart DataOS: diff -Nru cloud-init-0.7.5/debian/patches/lp-1551419-azure-handle-flipped-uuid-endianness.patch cloud-init-0.7.5/debian/patches/lp-1551419-azure-handle-flipped-uuid-endianness.patch --- cloud-init-0.7.5/debian/patches/lp-1551419-azure-handle-flipped-uuid-endianness.patch 1970-01-01 00:00:00.000000000 +0000 +++ cloud-init-0.7.5/debian/patches/lp-1551419-azure-handle-flipped-uuid-endianness.patch 2016-03-03 15:48:07.000000000 +0000 @@ -0,0 +1,61 @@ +--- a/cloudinit/sources/DataSourceAzure.py ++++ b/cloudinit/sources/DataSourceAzure.py +@@ -256,11 +256,57 @@ + return len(fnmatch.filter(os.listdir(mp), '*[!cdrom]*')) + + ++def _batch_gen(data, batch_size): ++ # Generate batches of batch_size from data ++ for i in range(0, len(data), batch_size): ++ yield data[i:i+batch_size] ++ ++ ++def _get_reversed_endianness_uuid(uuid): ++ uuid_parts = uuid.split('-') ++ for part_number in [0, 1, 2]: ++ original_part = uuid_parts[part_number] ++ hex_bytes = _batch_gen(original_part, 2) ++ reversed_endianness_part = ''.join(reversed(list(hex_bytes))) ++ uuid_parts[part_number] = reversed_endianness_part ++ return '-'.join(uuid_parts) ++ ++ ++def _get_last_boot_instance_uuid(): ++ return util.read_file_or_url( ++ '/var/lib/cloud/data/instance-id').contents.strip() ++ ++ + def get_instance_id(): + """ + Read the instance ID from dmi data ++ ++ If the reported UUID is the previous instance ID with endianness changed ++ (as per LP #1551419), then that previous instance ID will be used. + """ +- return util.read_dmi_data('system-uuid') ++ reported_instance_uuid = util.read_dmi_data('system-uuid') ++ LOG.debug('Reported instance UUID: %s', reported_instance_uuid) ++ if not os.path.exists('/var/lib/cloud/data/instance-id'): ++ LOG.debug('No last-boot instance ID') ++ # This is first boot of a fresh instance ++ return reported_instance_uuid ++ last_boot_instance_uuid = _get_last_boot_instance_uuid() ++ LOG.debug('Current instance UUID: %s', last_boot_instance_uuid) ++ if last_boot_instance_uuid == reported_instance_uuid: ++ LOG.debug('Reported UUID is unchanged') ++ return reported_instance_uuid ++ reversed_endianness_uuid = _get_reversed_endianness_uuid( ++ reported_instance_uuid) ++ LOG.debug('Reported instance UUID with reversed endianness: %s', ++ reversed_endianness_uuid) ++ if last_boot_instance_uuid == reversed_endianness_uuid: ++ # The endianness of the instance UUID has changed, keep using the ++ # last_boot UUID ++ LOG.debug('Reported UUID is last-boot UUID with endianness reversed;' ++ ' continuing to use last-boot instance ID') ++ return last_boot_instance_uuid ++ LOG.debug('Reported UUID is different; using it as instance ID.') ++ return reported_instance_uuid + + + def find_fabric_formatted_ephemeral_part(): diff -Nru cloud-init-0.7.5/debian/patches/series cloud-init-0.7.5/debian/patches/series --- cloud-init-0.7.5/debian/patches/series 2016-02-05 20:36:36.000000000 +0000 +++ cloud-init-0.7.5/debian/patches/series 2016-03-03 15:48:07.000000000 +0000 @@ -20,3 +20,4 @@ lp-1506244-azure-ssh-key-values.patch lp-1506187-azure_use_unique_vm_id.patch lp-1540965-SmartOS-Add-support-for-Joyent-LX-Brand-Zones.patch +lp-1551419-azure-handle-flipped-uuid-endianness.patch