@@ -39,6 +39,21 @@ type Machine struct {
39
39
PublicIPName string
40
40
}
41
41
42
+ func (a * API ) getAvset () string {
43
+ if a .Opts .AvailabilitySet == "" {
44
+ return ""
45
+ }
46
+ return fmt .Sprintf ("/subscriptions/%s/resourceGroups/%s/providers/Microsoft.Compute/availabilitySets/%s" , a .Opts .SubscriptionID , a .Opts .ResourceGroup , a .Opts .AvailabilitySet )
47
+ }
48
+
49
+ func (a * API ) getVMRG (rg string ) string {
50
+ vmrg := rg
51
+ if a .Opts .ResourceGroup != "" {
52
+ vmrg = a .Opts .ResourceGroup
53
+ }
54
+ return vmrg
55
+ }
56
+
42
57
func (a * API ) getVMParameters (name , userdata , sshkey , storageAccountURI string , ip * network.PublicIPAddress , nic * network.Interface ) compute.VirtualMachine {
43
58
osProfile := compute.OSProfile {
44
59
AdminUsername : util .StrToPtr ("core" ),
@@ -156,10 +171,18 @@ func (a *API) getVMParameters(name, userdata, sshkey, storageAccountURI string,
156
171
}
157
172
}
158
173
174
+ availabilitySetID := a .getAvset ()
175
+ if availabilitySetID != "" {
176
+ vm .VirtualMachineProperties .AvailabilitySet = & compute.SubResource {ID : & availabilitySetID }
177
+ }
178
+
159
179
return vm
160
180
}
161
181
162
182
func (a * API ) CreateInstance (name , userdata , sshkey , resourceGroup , storageAccount string , network Network ) (* Machine , error ) {
183
+ // only VMs are created in the user supplied resource group, kola still manages a resource group
184
+ // for the gallery and storage account.
185
+ vmResourceGroup := a .getVMRG (resourceGroup )
163
186
subnet := network .subnet
164
187
165
188
ip , err := a .createPublicIP (resourceGroup )
@@ -181,22 +204,31 @@ func (a *API) CreateInstance(name, userdata, sshkey, resourceGroup, storageAccou
181
204
vmParams := a .getVMParameters (name , userdata , sshkey , fmt .Sprintf ("https://%s.blob.core.windows.net/" , storageAccount ), ip , nic )
182
205
plog .Infof ("Creating Instance %s" , name )
183
206
184
- future , err := a .compClient .CreateOrUpdate (context .TODO (), resourceGroup , name , vmParams )
207
+ clean := func () {
208
+ _ , _ = a .compClient .Delete (context .TODO (), vmResourceGroup , name , & forceDelete )
209
+ _ , _ = a .intClient .Delete (context .TODO (), resourceGroup , * nic .Name )
210
+ _ , _ = a .ipClient .Delete (context .TODO (), resourceGroup , * ip .Name )
211
+ }
212
+
213
+ future , err := a .compClient .CreateOrUpdate (context .TODO (), vmResourceGroup , name , vmParams )
185
214
if err != nil {
215
+ clean ()
186
216
return nil , err
187
217
}
188
218
err = future .WaitForCompletionRef (context .TODO (), a .compClient .Client )
189
219
if err != nil {
220
+ clean ()
190
221
return nil , err
191
222
}
192
223
_ , err = future .Result (a .compClient )
193
224
if err != nil {
225
+ clean ()
194
226
return nil , err
195
227
}
196
228
plog .Infof ("Instance %s created" , name )
197
229
198
230
err = util .WaitUntilReady (5 * time .Minute , 10 * time .Second , func () (bool , error ) {
199
- vm , err := a .compClient .Get (context .TODO (), resourceGroup , name , "" )
231
+ vm , err := a .compClient .Get (context .TODO (), vmResourceGroup , name , "" )
200
232
if err != nil {
201
233
return false , err
202
234
}
@@ -209,13 +241,11 @@ func (a *API) CreateInstance(name, userdata, sshkey, resourceGroup, storageAccou
209
241
})
210
242
plog .Infof ("Instance %s ready" , name )
211
243
if err != nil {
212
- _ , _ = a .compClient .Delete (context .TODO (), resourceGroup , name , & forceDelete )
213
- _ , _ = a .intClient .Delete (context .TODO (), resourceGroup , * nic .Name )
214
- _ , _ = a .ipClient .Delete (context .TODO (), resourceGroup , * ip .Name )
244
+ clean ()
215
245
return nil , fmt .Errorf ("waiting for machine to become active: %v" , err )
216
246
}
217
247
218
- vm , err := a .compClient .Get (context .TODO (), resourceGroup , name , "" )
248
+ vm , err := a .compClient .Get (context .TODO (), vmResourceGroup , name , "" )
219
249
if err != nil {
220
250
return nil , err
221
251
}
@@ -245,6 +275,7 @@ func (a *API) CreateInstance(name, userdata, sshkey, resourceGroup, storageAccou
245
275
// TerminateInstance deletes a VM created by CreateInstance. Public IP, NIC and
246
276
// OS disk are deleted automatically together with the VM.
247
277
func (a * API ) TerminateInstance (machine * Machine , resourceGroup string ) error {
278
+ resourceGroup = a .getVMRG (resourceGroup )
248
279
future , err := a .compClient .Delete (context .TODO (), resourceGroup , machine .ID , & forceDelete )
249
280
if err != nil {
250
281
return err
@@ -272,7 +303,8 @@ func (a *API) GetConsoleOutput(name, resourceGroup, storageAccount string) ([]by
272
303
k := * kr .Keys
273
304
key := * k [0 ].Value
274
305
275
- vm , err := a .compClient .Get (context .TODO (), resourceGroup , name , compute .InstanceViewTypesInstanceView )
306
+ vmResourceGroup := a .getVMRG (resourceGroup )
307
+ vm , err := a .compClient .Get (context .TODO (), vmResourceGroup , name , compute .InstanceViewTypesInstanceView )
276
308
if err != nil {
277
309
return nil , fmt .Errorf ("could not get VM: %v" , err )
278
310
}
0 commit comments