Skip to content

Commit

Permalink
Merge pull request #10189 from HappyTobi/fix_vm_deletion
Browse files Browse the repository at this point in the history
UPDATE delete VMs that are in failed state
  • Loading branch information
tombuildsstuff authored Jan 27, 2021
2 parents 93f8876 + 9f20056 commit 6d3e581
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 24 deletions.
30 changes: 18 additions & 12 deletions azurerm/internal/services/compute/linux_virtual_machine_resource.go
Original file line number Diff line number Diff line change
Expand Up @@ -1089,19 +1089,25 @@ func resourceLinuxVirtualMachineDelete(d *schema.ResourceData, meta interface{})
return fmt.Errorf("retrieving Linux Virtual Machine %q (Resource Group %q): %+v", id.Name, id.ResourceGroup, err)
}

// ISSUE: XXX
// shutting down the Virtual Machine prior to removing it means users are no longer charged for the compute
// thus this can be a large cost-saving when deleting larger instances
log.Printf("[DEBUG] Powering Off Linux Virtual Machine %q (Resource Group %q)..", id.Name, id.ResourceGroup)
skipShutdown := !meta.(*clients.Client).Features.VirtualMachine.GracefulShutdown
powerOffFuture, err := client.PowerOff(ctx, id.ResourceGroup, id.Name, utils.Bool(skipShutdown))
if err != nil {
return fmt.Errorf("powering off Linux Virtual Machine %q (Resource Group %q): %+v", id.Name, id.ResourceGroup, err)
}
if err := powerOffFuture.WaitForCompletionRef(ctx, client.Client); err != nil {
return fmt.Errorf("waiting for power off of Linux Virtual Machine %q (Resource Group %q): %+v", id.Name, id.ResourceGroup, err)
// If the VM was in a Failed state we can skip powering off, since that'll fail
if strings.EqualFold(*existing.ProvisioningState, "failed") {
log.Printf("[DEBUG] Powering Off Linux Virtual Machine was skipped because the VM was in %q state %q (Resource Group %q).", *existing.ProvisioningState, id.Name, id.ResourceGroup)
} else {
//ISSUE: 4920
// shutting down the Virtual Machine prior to removing it means users are no longer charged for some Azure resources
// thus this can be a large cost-saving when deleting larger instances
// https://docs.microsoft.com/en-us/azure/virtual-machines/states-lifecycle
log.Printf("[DEBUG] Powering Off Linux Virtual Machine %q (Resource Group %q)..", id.Name, id.ResourceGroup)
skipShutdown := !meta.(*clients.Client).Features.VirtualMachine.GracefulShutdown
powerOffFuture, err := client.PowerOff(ctx, id.ResourceGroup, id.Name, utils.Bool(skipShutdown))
if err != nil {
return fmt.Errorf("powering off Linux Virtual Machine %q (Resource Group %q): %+v", id.Name, id.ResourceGroup, err)
}
if err := powerOffFuture.WaitForCompletionRef(ctx, client.Client); err != nil {
return fmt.Errorf("waiting for power off of Linux Virtual Machine %q (Resource Group %q): %+v", id.Name, id.ResourceGroup, err)
}
log.Printf("[DEBUG] Powered Off Linux Virtual Machine %q (Resource Group %q).", id.Name, id.ResourceGroup)
}
log.Printf("[DEBUG] Powered Off Linux Virtual Machine %q (Resource Group %q).", id.Name, id.ResourceGroup)

log.Printf("[DEBUG] Deleting Linux Virtual Machine %q (Resource Group %q)..", id.Name, id.ResourceGroup)
// @tombuildsstuff: sending `nil` here omits this value from being sent - which matches
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1175,19 +1175,25 @@ func resourceWindowsVirtualMachineDelete(d *schema.ResourceData, meta interface{
return fmt.Errorf("retrieving Windows Virtual Machine %q (Resource Group %q): %+v", id.Name, id.ResourceGroup, err)
}

// ISSUE: XXX
// shutting down the Virtual Machine prior to removing it means users are no longer charged for the compute
// thus this can be a large cost-saving when deleting larger instances
log.Printf("[DEBUG] Powering Off Windows Virtual Machine %q (Resource Group %q)..", id.Name, id.ResourceGroup)
skipShutdown := !meta.(*clients.Client).Features.VirtualMachine.GracefulShutdown
powerOffFuture, err := client.PowerOff(ctx, id.ResourceGroup, id.Name, utils.Bool(skipShutdown))
if err != nil {
return fmt.Errorf("powering off Windows Virtual Machine %q (Resource Group %q): %+v", id.Name, id.ResourceGroup, err)
}
if err := powerOffFuture.WaitForCompletionRef(ctx, client.Client); err != nil {
return fmt.Errorf("waiting for power off of Windows Virtual Machine %q (Resource Group %q): %+v", id.Name, id.ResourceGroup, err)
// If the VM was in a Failed state we can skip powering off, since that'll fail
if strings.EqualFold(*existing.ProvisioningState, "failed") {
log.Printf("[DEBUG] Powering Off Windows Virtual Machine was skipped because the VM was in %q state %q (Resource Group %q).", *existing.ProvisioningState, id.Name, id.ResourceGroup)
} else {
//ISSUE: 4920
// shutting down the Virtual Machine prior to removing it means users are no longer charged for some Azure resources
// thus this can be a large cost-saving when deleting larger instances
// https://docs.microsoft.com/en-us/azure/virtual-machines/states-lifecycle
log.Printf("[DEBUG] Powering Off Windows Virtual Machine %q (Resource Group %q)..", id.Name, id.ResourceGroup)
skipShutdown := !meta.(*clients.Client).Features.VirtualMachine.GracefulShutdown
powerOffFuture, err := client.PowerOff(ctx, id.ResourceGroup, id.Name, utils.Bool(skipShutdown))
if err != nil {
return fmt.Errorf("powering off Windows Virtual Machine %q (Resource Group %q): %+v", id.Name, id.ResourceGroup, err)
}
if err := powerOffFuture.WaitForCompletionRef(ctx, client.Client); err != nil {
return fmt.Errorf("waiting for power off of Windows Virtual Machine %q (Resource Group %q): %+v", id.Name, id.ResourceGroup, err)
}
log.Printf("[DEBUG] Powered Off Windows Virtual Machine %q (Resource Group %q).", id.Name, id.ResourceGroup)
}
log.Printf("[DEBUG] Powered Off Windows Virtual Machine %q (Resource Group %q).", id.Name, id.ResourceGroup)

log.Printf("[DEBUG] Deleting Windows Virtual Machine %q (Resource Group %q)..", id.Name, id.ResourceGroup)
// @tombuildsstuff: sending `nil` here omits this value from being sent - which matches
Expand Down

0 comments on commit 6d3e581

Please sign in to comment.