diff options
| author | AOhassan <37305877+AOhassan@users.noreply.github.com> | 2019-12-12 13:51:42 -0800 | 
|---|---|---|
| committer | Chad Smith <chad.smith@canonical.com> | 2019-12-12 14:51:42 -0700 | 
| commit | 129b1c4ea250619bd7caed7aaffacc796b0139f2 (patch) | |
| tree | 96970dbb7ef64d5f1399659dbf4a5f46519f81ef /cloudinit/sources/helpers | |
| parent | e2840f1771158748780a768f6bfbb117cd7610c6 (diff) | |
| download | vyos-cloud-init-129b1c4ea250619bd7caed7aaffacc796b0139f2.tar.gz vyos-cloud-init-129b1c4ea250619bd7caed7aaffacc796b0139f2.zip | |
azure: avoid re-running cloud-init when instance-id is byte-swapped (#84)
Azure stores the instance ID with an incorrect byte ordering for the
first three hyphen delimited parts. This results in invalid
is_new_instance checks forcing Azure datasource to recrawl the metadata
service.
When persisting instance-id from the metadata service, swap the
instance-id string byte order such that it is consistent with
that returned by dmi information. Check whether the instance-id
string is a byte-swapped match when determining correctly whether 
the Azure platform instance-id has actually changed. 
Diffstat (limited to 'cloudinit/sources/helpers')
| -rwxr-xr-x | cloudinit/sources/helpers/azure.py | 27 | 
1 files changed, 27 insertions, 0 deletions
| diff --git a/cloudinit/sources/helpers/azure.py b/cloudinit/sources/helpers/azure.py index f5cdb3fd..fc760581 100755 --- a/cloudinit/sources/helpers/azure.py +++ b/cloudinit/sources/helpers/azure.py @@ -7,6 +7,7 @@ import re  import socket  import struct  import time +import textwrap  from cloudinit.net import dhcp  from cloudinit import stages @@ -48,6 +49,32 @@ def azure_ds_telemetry_reporter(func):      return impl +def is_byte_swapped(previous_id, current_id): +    """ +    Azure stores the instance ID with an incorrect byte ordering for the +    first parts. This corrects the byte order such that it is consistent with +    that returned by the metadata service. +    """ +    if previous_id == current_id: +        return False + +    def swap_bytestring(s, width=2): +        dd = [byte for byte in textwrap.wrap(s, 2)] +        dd.reverse() +        return ''.join(dd) + +    parts = current_id.split('-') +    swapped_id = '-'.join([ +            swap_bytestring(parts[0]), +            swap_bytestring(parts[1]), +            swap_bytestring(parts[2]), +            parts[3], +            parts[4] +        ]) + +    return previous_id == swapped_id + +  @azure_ds_telemetry_reporter  def get_boot_telemetry():      """Report timestamps related to kernel initialization and systemd | 
