@@ -135,6 +135,41 @@ func (c *client) ResolveTemplate(
135
135
return templateID , nil
136
136
}
137
137
138
+ // ResolveDiskOffering Retrieves diskOffering by using disk offering ID if ID is provided and confirm returned
139
+ // disk offering name matches name provided in spec.
140
+ // If disk offering ID is not provided, the disk offering name is used to retrieve disk offering ID.
141
+ func (c * client ) ResolveDiskOffering (csMachine * infrav1.CloudStackMachine ) (diskOfferingID string , retErr error ) {
142
+ if len (csMachine .Spec .DiskOffering .ID ) > 0 {
143
+ csDiskOffering , count , err := c .cs .DiskOffering .GetDiskOfferingByID (csMachine .Spec .DiskOffering .ID )
144
+ if err != nil {
145
+ return "" , multierror .Append (retErr , errors .Wrapf (
146
+ err , "could not get DiskOffering by ID %s" , csMachine .Spec .DiskOffering .ID ))
147
+ } else if count != 1 {
148
+ return "" , multierror .Append (retErr , errors .Errorf (
149
+ "expected 1 DiskOffering with UUID %s, but got %d" , csMachine .Spec .DiskOffering .ID , count ))
150
+ }
151
+
152
+ if len (csMachine .Spec .DiskOffering .Name ) > 0 && csMachine .Spec .DiskOffering .Name != csDiskOffering .Name {
153
+ return "" , multierror .Append (retErr , errors .Errorf (
154
+ "diskOffering name %s does not match name %s returned using UUID %s" ,
155
+ csMachine .Spec .DiskOffering .Name , csDiskOffering .Name , csMachine .Spec .DiskOffering .ID ))
156
+ }
157
+ return csMachine .Spec .DiskOffering .ID , nil
158
+ }
159
+ if len (csMachine .Spec .DiskOffering .Name ) == 0 {
160
+ return "" , nil
161
+ }
162
+ diskID , count , err := c .cs .DiskOffering .GetDiskOfferingID (csMachine .Spec .DiskOffering .Name )
163
+ if err != nil {
164
+ return "" , multierror .Append (retErr , errors .Wrapf (
165
+ err , "could not get DiskOffering ID from %s" , csMachine .Spec .DiskOffering .Name ))
166
+ } else if count != 1 {
167
+ return "" , multierror .Append (retErr , errors .Errorf (
168
+ "expected 1 DiskOffering with name %s, but got %d" , csMachine .Spec .DiskOffering .Name , count ))
169
+ }
170
+ return diskID , nil
171
+ }
172
+
138
173
// GetOrCreateVMInstance CreateVMInstance will fetch or create a VM instance, and
139
174
// sets the infrastructure machine spec and status accordingly.
140
175
func (c * client ) GetOrCreateVMInstance (
@@ -159,6 +194,10 @@ func (c *client) GetOrCreateVMInstance(
159
194
if err != nil {
160
195
return err
161
196
}
197
+ diskOfferingID , err := c .ResolveDiskOffering (csMachine )
198
+ if err != nil {
199
+ return err
200
+ }
162
201
163
202
// Create VM instance.
164
203
p := c .cs .VirtualMachine .NewDeployVirtualMachineParams (offeringID , templateID , csMachine .Status .ZoneID )
@@ -167,6 +206,7 @@ func (c *client) GetOrCreateVMInstance(
167
206
p .SetNetworkids ([]string {zone .Spec .Network .ID })
168
207
setIfNotEmpty (csMachine .Name , p .SetName )
169
208
setIfNotEmpty (csMachine .Name , p .SetDisplayname )
209
+ setIfNotEmpty (diskOfferingID , p .SetDiskofferingid )
170
210
171
211
setIfNotEmpty (csMachine .Spec .SSHKey , p .SetKeypair )
172
212
@@ -218,7 +258,12 @@ func (c *client) DestroyVMInstance(csMachine *infrav1.CloudStackMachine) error {
218
258
219
259
// Attempt deletion regardless of machine state.
220
260
p := c .cs .VirtualMachine .NewDestroyVirtualMachineParams (* csMachine .Spec .InstanceID )
261
+ volIDs , err := c .listVMInstanceVolumeIDs (* csMachine .Spec .InstanceID )
262
+ if err != nil {
263
+ return err
264
+ }
221
265
p .SetExpunge (true )
266
+ setArrayIfNotEmpty (volIDs , p .SetVolumeids )
222
267
if _ , err := c .csAsync .VirtualMachine .DestroyVirtualMachine (p ); err != nil &&
223
268
strings .Contains (strings .ToLower (err .Error ()), "unable to find uuid for id" ) {
224
269
// VM doesn't exist. Success...
@@ -241,3 +286,21 @@ func (c *client) DestroyVMInstance(csMachine *infrav1.CloudStackMachine) error {
241
286
242
287
return errors .New ("VM deletion in progress" )
243
288
}
289
+
290
+ func (c * client ) listVMInstanceVolumeIDs (instanceID string ) ([]string , error ) {
291
+ p := c .cs .Volume .NewListVolumesParams ()
292
+ p .SetVirtualmachineid (instanceID )
293
+
294
+ listVOLResp , err := c .csAsync .Volume .ListVolumes (p )
295
+ if err != nil {
296
+ return nil , err
297
+ }
298
+
299
+ var ret []string
300
+ for _ , vol := range listVOLResp .Volumes {
301
+ ret = append (ret , vol .Id )
302
+ }
303
+
304
+ return ret , nil
305
+
306
+ }
0 commit comments