@@ -13,3 +13,82 @@ type Compute struct {
1313 BatchPools []BatchPool `tree:"batch_pools"`
1414 DiskAttachments []DiskAttachment `tree:"disk_attachments"`
1515}
16+
17+ // PostProcess links each managed disk to the VM it is attached to via
18+ // DiskAttachment entries or via the VM's inline OS/data disk references.
19+ func (c * Compute ) PostProcess () {
20+ diskByID := make (map [string ]* ManagedDisk )
21+ for i := range c .ManagedDisks {
22+ if id := c .ManagedDisks [i ].ID ; id != "" {
23+ diskByID [id ] = & c .ManagedDisks [i ]
24+ }
25+ }
26+
27+ link := func (managedDiskID string , set func (* ManagedDisk )) {
28+ if managedDiskID == "" {
29+ return
30+ }
31+ if disk , ok := diskByID [managedDiskID ]; ok {
32+ set (disk )
33+ }
34+ }
35+
36+ for _ , att := range c .DiskAttachments {
37+ vmID := att .VirtualMachineID .Value ()
38+ link (att .ManagedDiskID .Value (), func (disk * ManagedDisk ) {
39+ for i := range c .VirtualMachines {
40+ if c .VirtualMachines [i ].ID == vmID {
41+ disk .Relationships .VirtualMachine = & c .VirtualMachines [i ]
42+ return
43+ }
44+ }
45+ for i := range c .LinuxVirtualMachines {
46+ if c .LinuxVirtualMachines [i ].ID == vmID {
47+ disk .Relationships .LinuxVirtualMachine = & c .LinuxVirtualMachines [i ]
48+ return
49+ }
50+ }
51+ for i := range c .WindowsVirtualMachines {
52+ if c .WindowsVirtualMachines [i ].ID == vmID {
53+ disk .Relationships .WindowsVirtualMachine = & c .WindowsVirtualMachines [i ]
54+ return
55+ }
56+ }
57+ })
58+ }
59+
60+ for i := range c .VirtualMachines {
61+ vm := & c .VirtualMachines [i ]
62+ setVM := func (d * ManagedDisk ) { d .Relationships .VirtualMachine = vm }
63+ if vm .OSDisk != nil {
64+ link (vm .OSDisk .ManagedDiskID .Value (), setVM )
65+ }
66+ if vm .StorageOSDisk != nil {
67+ link (vm .StorageOSDisk .ManagedDiskID .Value (), setVM )
68+ }
69+ for _ , dd := range vm .StorageDataDisks {
70+ if dd == nil {
71+ continue
72+ }
73+ link (dd .ManagedDiskID .Value (), setVM )
74+ }
75+ }
76+
77+ for i := range c .LinuxVirtualMachines {
78+ vm := & c .LinuxVirtualMachines [i ]
79+ if vm .OSDisk != nil {
80+ link (vm .OSDisk .ManagedDiskID .Value (), func (d * ManagedDisk ) {
81+ d .Relationships .LinuxVirtualMachine = vm
82+ })
83+ }
84+ }
85+
86+ for i := range c .WindowsVirtualMachines {
87+ vm := & c .WindowsVirtualMachines [i ]
88+ if vm .OSDisk != nil {
89+ link (vm .OSDisk .ManagedDiskID .Value (), func (d * ManagedDisk ) {
90+ d .Relationships .WindowsVirtualMachine = vm
91+ })
92+ }
93+ }
94+ }
0 commit comments