forked from Azure/acs-engine
-
Notifications
You must be signed in to change notification settings - Fork 0
/
deletevm.go
80 lines (62 loc) · 2.37 KB
/
deletevm.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package operations
import (
"fmt"
"github.com/Azure/acs-engine/pkg/armhelpers"
log "github.com/sirupsen/logrus"
)
// CleanDeleteVirtualMachine deletes a VM and any associated OS disk
func CleanDeleteVirtualMachine(az armhelpers.ACSEngineClient, logger *log.Entry, resourceGroup, name string) error {
logger.Infof("fetching VM: %s/%s", resourceGroup, name)
vm, err := az.GetVirtualMachine(resourceGroup, name)
if err != nil {
logger.Errorf("failed to get VM: %s/%s: %s", resourceGroup, name, err.Error())
return err
}
vhd := vm.VirtualMachineProperties.StorageProfile.OsDisk.Vhd
managedDisk := vm.VirtualMachineProperties.StorageProfile.OsDisk.ManagedDisk
if vhd == nil && managedDisk == nil {
logger.Errorf("failed to get a valid os disk URI for VM: %s/%s", resourceGroup, name)
return fmt.Errorf("os disk does not have a VHD URI")
}
osDiskName := vm.VirtualMachineProperties.StorageProfile.OsDisk.Name
nicID := (*vm.VirtualMachineProperties.NetworkProfile.NetworkInterfaces)[0].ID
nicName, err := armhelpers.ResourceName(*nicID)
if err != nil {
return err
}
logger.Infof("found nic name for VM (%s/%s): %s", resourceGroup, name, nicName)
logger.Infof("deleting VM: %s/%s", resourceGroup, name)
_, deleteErrChan := az.DeleteVirtualMachine(resourceGroup, name, nil)
logger.Infof("waiting for vm deletion: %s/%s", resourceGroup, name)
if err := <-deleteErrChan; err != nil {
return err
}
logger.Infof("deleting nic: %s/%s", resourceGroup, nicName)
_, nicErrChan := az.DeleteNetworkInterface(resourceGroup, nicName, nil)
logger.Infof("waiting for nic deletion: %s/%s", resourceGroup, nicName)
if nicErr := <-nicErrChan; nicErr != nil {
return nicErr
}
if vhd != nil {
accountName, vhdContainer, vhdBlob, err := armhelpers.SplitBlobURI(*vhd.URI)
if err != nil {
return err
}
logger.Infof("found os disk storage reference: %s %s %s", accountName, vhdContainer, vhdBlob)
as, err := az.GetStorageClient(resourceGroup, accountName)
if err != nil {
return err
}
logger.Infof("deleting blob: %s/%s", vhdContainer, vhdBlob)
if err = as.DeleteBlob(vhdContainer, vhdBlob); err != nil {
return err
}
} else if managedDisk != nil {
logger.Infof("deleting managed disk: %s/%s", resourceGroup, *osDiskName)
_, diskErrChan := az.DeleteManagedDisk(resourceGroup, *osDiskName, nil)
if err := <-diskErrChan; err != nil {
return err
}
}
return nil
}