← Back to team overview

cloud-init-dev team mailing list archive

[Merge] ~chad.smith/cloud-init:cleanup/render-az-instance-data-for-azure into cloud-init:master

 

Chad Smith has proposed merging ~chad.smith/cloud-init:cleanup/render-az-instance-data-for-azure into cloud-init:master.

Commit message:
azure: render avaiability zone in instance-data.json

Azure's IMDS service provides availability zone location information.
Expose that compute.location information as the instance availability zone.

Requested reviews:
  cloud-init commiters (cloud-init-dev)

For more details, see:
https://code.launchpad.net/~chad.smith/cloud-init/+git/cloud-init/+merge/353530

Example Azure IMDS instance-data.json:

{
 "base64-encoded-keys": [
  "ds/meta-data/random_seed",
  "ds/user-data"
 ],
 "ds": {
  "meta-data": {
   "azure_data": {
    "configurationsettype": "LinuxProvisioningConfiguration"
   },
   "imds": {
    "compute": {
     "location": "eastus2",
     "name": "my-c1",
     "offer": "UbuntuServer",
     "osType": "Linux",
     "placementGroupId": "",
     "platformFaultDomain": "0",
     "platformUpdateDomain": "0",
     "publisher": "Canonical",
     "resourceGroupName": "srugroup1",
     "sku": "18.10-DAILY",
     "subscriptionId": "12aad61c-6de4-4e53-a6c6-5aff52a83777",
     "tags": "",
     "version": "18.10.201808150",
     "vmId": "a23bf3e3-ed47-4ae3-919f-8e4b445a5624",
     "vmScaleSetName": "",
     "vmSize": "Standard_DS1_v2",
     "zone": ""
    },
    "network": {
     "interface": [
      {
       "ipv4": {
        "ipAddress": [
         {
          "privateIpAddress": "10.0.0.4",
          "publicIpAddress": "104.210.15.52"
         }
        ],
        "subnet": [
         {
          "address": "10.0.0.0",
          "prefix": "24"
         }
        ]
       },
       "ipv6": {
        "ipAddress": []
       },
       "macAddress": "000D3A04186B"
      }
     ]
    }
   },
   "instance-id": "e3f33ba2-47ed-e34a-919f-8e4b445a5624",
   "local-hostname": "my-c1",
   "random_seed": "T0VNMGQAAAABTVZSVFVBTE1JQ1JPU0ZUAhcABk1TRlSXAAAA8AwjVxwe3X9w76ahFp8SESrhF6AtP/c/rTcRlJNgsqTyQc85yMgLeIuXcpQvBsF0vxstzBuBqbY64qpQ2N2YNw=="
  },
  "user-data": "I2Nsb3VkLWNvbmZpZwpzc2hfaW1wb3J0X2lkOiBbY2hhZC5zbWl0aF0KaG9zdG5hbWU6IFNSVS13b3JrZWQKcnVuY21kOgogICAgICAgICAgLSBlY2hvICdoaScKICAgICAgICAgIC0gZWNobyAnaGknICAgIyBDaGVjayBMUDogIzE3NjQyNjQgU2NoZW1hOiBkbyBub3Qgd2FybiBvbiBkdXBsaWNhdGUgaXRlbXMgaW4gY29tbWFuZHMKCg==",
  "vendor-data": null
 },
 "v1": {
  "availability-zone": null,
  "cloud-name": "azure",
  "instance-id": "e3f33ba2-47ed-e34a-919f-8e4b445a5624",
  "local-hostname": "my-c1",
  "region": null
 }
}

-- 
Your team cloud-init commiters is requested to review the proposed merge of ~chad.smith/cloud-init:cleanup/render-az-instance-data-for-azure into cloud-init:master.
diff --git a/cloudinit/sources/DataSourceAzure.py b/cloudinit/sources/DataSourceAzure.py
index 783445e..658b935 100644
--- a/cloudinit/sources/DataSourceAzure.py
+++ b/cloudinit/sources/DataSourceAzure.py
@@ -308,6 +308,13 @@ class DataSourceAzure(sources.DataSource):
                     util.logexc(LOG, "handling set_hostname failed")
         return False
 
+    @property
+    def availability_zone(self):
+        imds_md = self.metadata.get('imds')
+        if imds_md:
+            return self.metadata.get('compute', {}).get('location')
+        return None
+
     def get_metadata_from_agent(self):
         temp_hostname = self.metadata.get('local-hostname')
         agent_cmd = self.ds_cfg['agent_command']
diff --git a/tests/unittests/test_datasource/test_azure.py b/tests/unittests/test_datasource/test_azure.py
index 4e428b7..6371cb6 100644
--- a/tests/unittests/test_datasource/test_azure.py
+++ b/tests/unittests/test_datasource/test_azure.py
@@ -83,7 +83,26 @@ def construct_valid_ovf_env(data=None, pubkeys=None,
     return content
 
 
-NETWORK_METADATA = {
+IMDS_METADATA = {
+    "compute": {
+        "location": "eastus2",
+        "name": "my-c1",
+        "offer": "UbuntuServer",
+        "osType": "Linux",
+        "placementGroupId": "",
+        "platformFaultDomain": "0",
+        "platformUpdateDomain": "0",
+        "publisher": "Canonical",
+        "resourceGroupName": "srugroup1",
+        "sku": "18.10-DAILY",
+        "subscriptionId": "12aad61c-6de4-4e53-a6c6-5aff52a83777",
+        "tags": "",
+        "version": "18.10.201808150",
+        "vmId": "a23bf3e3-ed47-4ae3-919f-8e4b445a5624",
+        "vmScaleSetName": "",
+        "vmSize": "Standard_DS1_v2",
+        "zone": ""
+    },
     "network": {
         "interface": [
             {
@@ -127,9 +146,9 @@ class TestGetMetadataFromIMDS(HttprettyTestCase):
         """Do not perform DHCP setup when nic is already up."""
         m_net_is_up.return_value = True
         m_readurl.return_value = url_helper.StringResponse(
-            json.dumps(NETWORK_METADATA).encode('utf-8'))
+            json.dumps(IMDS_METADATA).encode('utf-8'))
         self.assertEqual(
-            NETWORK_METADATA,
+            IMDS_METADATA,
             dsaz.get_metadata_from_imds('eth9', retries=3))
 
         m_net_is_up.assert_called_with('eth9')
@@ -146,10 +165,10 @@ class TestGetMetadataFromIMDS(HttprettyTestCase):
         """Perform DHCP setup when nic is not up."""
         m_net_is_up.return_value = False
         m_readurl.return_value = url_helper.StringResponse(
-            json.dumps(NETWORK_METADATA).encode('utf-8'))
+            json.dumps(IMDS_METADATA).encode('utf-8'))
 
         self.assertEqual(
-            NETWORK_METADATA,
+            IMDS_METADATA,
             dsaz.get_metadata_from_imds('eth9', retries=2))
 
         m_net_is_up.assert_called_with('eth9')
@@ -186,6 +205,7 @@ class TestGetMetadataFromIMDS(HttprettyTestCase):
 class TestAzureDataSource(CiTestCase):
 
     with_logs = True
+    maxDiff= None
 
     def setUp(self):
         super(TestAzureDataSource, self).setUp()
@@ -206,7 +226,7 @@ class TestAzureDataSource(CiTestCase):
         self.m_get_metadata_from_imds = self.patches.enter_context(
             mock.patch.object(
                 dsaz, 'get_metadata_from_imds',
-                mock.MagicMock(return_value=NETWORK_METADATA)))
+                mock.MagicMock(return_value=IMDS_METADATA)))
         self.m_fallback_nic = self.patches.enter_context(
             mock.patch('cloudinit.sources.net.find_fallback_nic',
                        return_value='eth9'))
@@ -438,13 +458,7 @@ fdescfs            /dev/fd          fdescfs rw              0 0
         expected_metadata = {
             'azure_data': {
                 'configurationsettype': 'LinuxProvisioningConfiguration'},
-            'imds': {'network': {'interface': [{
-                'ipv4': {'ipAddress': [
-                     {'privateIpAddress': '10.0.0.4',
-                      'publicIpAddress': '104.46.124.81'}],
-                      'subnet': [{'address': '10.0.0.0', 'prefix': '24'}]},
-                'ipv6': {'ipAddress': []},
-                'macAddress': '000D3A047598'}]}},
+            'imds': IMDS_METADATA,
             'instance-id': 'test-instance-id',
             'local-hostname': u'myhost',
             'random_seed': 'wild'}

Follow ups