@@ -265,7 +265,7 @@ private string GetExtensionStatusMessage()
265
265
/// <summary>
266
266
/// This function gets the VM model, fills in the OSDisk properties with encryptionSettings and does an UpdateVM
267
267
/// </summary>
268
- private AzureOperationResponse < VirtualMachine > UpdateVmEncryptionSettings ( )
268
+ private AzureOperationResponse < VirtualMachine > UpdateVmEncryptionSettings ( DiskEncryptionSettings encryptionSettingsBackup )
269
269
{
270
270
string statusMessage = GetExtensionStatusMessage ( ) ;
271
271
@@ -282,14 +282,6 @@ private AzureOperationResponse<VirtualMachine> UpdateVmEncryptionSettings()
282
282
null ) ) ;
283
283
}
284
284
285
- DiskEncryptionSettings encryptionSettingsBackup = vmParameters . StorageProfile . OsDisk . EncryptionSettings ;
286
-
287
- if ( encryptionSettingsBackup == null )
288
- {
289
- encryptionSettingsBackup = new DiskEncryptionSettings ( ) ;
290
- encryptionSettingsBackup . Enabled = false ;
291
- }
292
-
293
285
DiskEncryptionSettings encryptionSettings = new DiskEncryptionSettings ( ) ;
294
286
encryptionSettings . Enabled = true ;
295
287
encryptionSettings . DiskEncryptionKey = new KeyVaultSecretReference ( ) ;
@@ -315,21 +307,50 @@ private AzureOperationResponse<VirtualMachine> UpdateVmEncryptionSettings()
315
307
Tags = vmParameters . Tags
316
308
} ;
317
309
318
- AzureOperationResponse < VirtualMachine > updateResult = this . ComputeClient . ComputeManagementClient . VirtualMachines . CreateOrUpdateWithHttpMessagesAsync (
319
- this . ResourceGroupName ,
320
- vmParameters . Name ,
321
- parameters ) . GetAwaiter ( ) . GetResult ( ) ;
310
+ AzureOperationResponse < VirtualMachine > updateResult = null ;
322
311
323
- if ( ! updateResult . Response . IsSuccessStatusCode )
312
+ // The 2nd pass. TODO: If something goes wrong here, try to revert to encryptionSettingsBackup.
313
+ if ( encryptionSettingsBackup . Enabled != true )
314
+ {
315
+ updateResult = this . ComputeClient . ComputeManagementClient . VirtualMachines . CreateOrUpdateWithHttpMessagesAsync (
316
+ this . ResourceGroupName ,
317
+ vmParameters . Name ,
318
+ parameters ) . GetAwaiter ( ) . GetResult ( ) ;
319
+ }
320
+ else
324
321
{
322
+
323
+ // stop-update-start
324
+ // stop vm
325
+ this . ComputeClient . ComputeManagementClient . VirtualMachines
326
+ . DeallocateWithHttpMessagesAsync ( this . ResourceGroupName , this . VMName ) . GetAwaiter ( )
327
+ . GetResult ( ) ;
328
+
329
+ // update vm
325
330
vmParameters = ( this . ComputeClient . ComputeManagementClient . VirtualMachines . Get (
326
- this . ResourceGroupName , this . VMName ) ) ;
327
- vmParameters . StorageProfile . OsDisk . EncryptionSettings = encryptionSettingsBackup ;
331
+ this . ResourceGroupName , this . VMName ) ) ;
332
+ vmParameters . StorageProfile . OsDisk . EncryptionSettings = encryptionSettings ;
333
+ parameters = new VirtualMachine
334
+ {
335
+ DiagnosticsProfile = vmParameters . DiagnosticsProfile ,
336
+ HardwareProfile = vmParameters . HardwareProfile ,
337
+ StorageProfile = vmParameters . StorageProfile ,
338
+ NetworkProfile = vmParameters . NetworkProfile ,
339
+ OsProfile = vmParameters . OsProfile ,
340
+ Plan = vmParameters . Plan ,
341
+ AvailabilitySet = vmParameters . AvailabilitySet ,
342
+ Location = vmParameters . Location ,
343
+ Tags = vmParameters . Tags
344
+ } ;
328
345
329
- this . ComputeClient . ComputeManagementClient . VirtualMachines . CreateOrUpdateWithHttpMessagesAsync (
346
+ updateResult = this . ComputeClient . ComputeManagementClient . VirtualMachines . CreateOrUpdateWithHttpMessagesAsync (
330
347
this . ResourceGroupName ,
331
348
vmParameters . Name ,
332
349
parameters ) . GetAwaiter ( ) . GetResult ( ) ;
350
+
351
+ // start vm
352
+ this . ComputeClient . ComputeManagementClient . VirtualMachines
353
+ . StartWithHttpMessagesAsync ( ResourceGroupName , this . VMName ) . GetAwaiter ( ) . GetResult ( ) ;
333
354
}
334
355
335
356
return updateResult ;
@@ -467,6 +488,10 @@ public override void ExecuteCmdlet()
467
488
468
489
VirtualMachineExtension parameters = GetVmExtensionParameters ( virtualMachineResponse ) ;
469
490
491
+ DiskEncryptionSettings encryptionSettingsBackup = virtualMachineResponse . StorageProfile . OsDisk . EncryptionSettings ??
492
+ new DiskEncryptionSettings { Enabled = false } ;
493
+
494
+ // The "1st pass". If this goes wrong, just bubble up the error and abort.
470
495
AzureOperationResponse < VirtualMachineExtension > extensionPushResult = this . VirtualMachineExtensionClient . CreateOrUpdateWithHttpMessagesAsync (
471
496
this . ResourceGroupName ,
472
497
this . VMName ,
@@ -484,7 +509,8 @@ public override void ExecuteCmdlet()
484
509
null ) ) ;
485
510
}
486
511
487
- var op = UpdateVmEncryptionSettings ( ) ;
512
+ var op = UpdateVmEncryptionSettings ( encryptionSettingsBackup ) ;
513
+
488
514
var result = Mapper . Map < PSAzureOperationResponse > ( op ) ;
489
515
WriteObject ( result ) ;
490
516
}
0 commit comments