summaryrefslogtreecommitdiff
path: root/cloudinit/sources/DataSourceAzure.py
diff options
context:
space:
mode:
Diffstat (limited to 'cloudinit/sources/DataSourceAzure.py')
-rw-r--r--cloudinit/sources/DataSourceAzure.py23
1 files changed, 21 insertions, 2 deletions
diff --git a/cloudinit/sources/DataSourceAzure.py b/cloudinit/sources/DataSourceAzure.py
index 5aea0c5c..865238cf 100644
--- a/cloudinit/sources/DataSourceAzure.py
+++ b/cloudinit/sources/DataSourceAzure.py
@@ -93,6 +93,7 @@ class MetadataType(Enum):
class PPSType(Enum):
NONE = "None"
+ OS_DISK = "PreprovisionedOSDisk"
RUNNING = "Running"
SAVABLE = "Savable"
UNKNOWN = "Unknown"
@@ -577,6 +578,9 @@ class DataSourceAzure(sources.DataSource):
if pps_type == PPSType.SAVABLE:
self._wait_for_all_nics_ready()
+ elif pps_type == PPSType.OS_DISK:
+ self._report_ready_for_pps(create_marker=False)
+ self._wait_for_pps_os_disk_shutdown()
md, userdata_raw, cfg, files = self._reprovision()
# fetch metadata again as it has changed after reprovisioning
@@ -970,7 +974,7 @@ class DataSourceAzure(sources.DataSource):
)
@azure_ds_telemetry_reporter
- def _report_ready_for_pps(self) -> None:
+ def _report_ready_for_pps(self, *, create_marker: bool = True) -> None:
"""Report ready for PPS, creating the marker file upon completion.
:raises sources.InvalidMetaDataException: On error reporting ready.
@@ -982,7 +986,17 @@ class DataSourceAzure(sources.DataSource):
report_diagnostic_event(msg, logger_func=LOG.error)
raise sources.InvalidMetaDataException(msg) from error
- self._create_report_ready_marker()
+ if create_marker:
+ self._create_report_ready_marker()
+
+ @azure_ds_telemetry_reporter
+ def _wait_for_pps_os_disk_shutdown(self):
+ report_diagnostic_event(
+ "Waiting for host to shutdown VM...",
+ logger_func=LOG.info,
+ )
+ sleep(31536000)
+ raise BrokenAzureDataSource("Shutdown failure for PPS disk.")
@azure_ds_telemetry_reporter
def _check_if_nic_is_primary(self, ifname):
@@ -1403,6 +1417,11 @@ class DataSourceAzure(sources.DataSource):
):
pps_type = PPSType.SAVABLE
elif (
+ ovf_cfg.get("PreprovisionedVMType", None) == PPSType.OS_DISK.value
+ or self._ppstype_from_imds(imds_md) == PPSType.OS_DISK.value
+ ):
+ pps_type = PPSType.OS_DISK
+ elif (
ovf_cfg.get("PreprovisionedVm") is True
or ovf_cfg.get("PreprovisionedVMType", None)
== PPSType.RUNNING.value