@@ -272,6 +272,38 @@ func (c *Client) CreateOrUpdateAsync(ctx context.Context, resourceGroupName stri
272
272
return future , nil
273
273
}
274
274
275
+ // WaitForCreateOrUpdateResult waits for the response of the create or update request
276
+ func (c * Client ) WaitForCreateOrUpdateResult (ctx context.Context , future * azure.Future , resourceGroupName string ) (* http.Response , error ) {
277
+ mc := metrics .NewMetricContext ("vmss" , "wait_for_create_or_update_result" , resourceGroupName , c .subscriptionID , "" )
278
+ res , err := c .armClient .WaitForAsyncOperationResult (ctx , future , "VMSSWaitForCreateOrUpdateResult" )
279
+ mc .Observe (err )
280
+ return res , err
281
+ }
282
+
283
+ // WaitForDeleteInstancesResult waits for the response of the delete instance request
284
+ func (c * Client ) WaitForDeleteInstancesResult (ctx context.Context , future * azure.Future , resourceGroupName string ) (* http.Response , error ) {
285
+ mc := metrics .NewMetricContext ("vmss" , "wait_for_delete_instances_result" , resourceGroupName , c .subscriptionID , "" )
286
+ res , err := c .armClient .WaitForAsyncOperationResult (ctx , future , "VMSSWaitForDeleteInstancesResult" )
287
+ mc .Observe (err )
288
+ return res , err
289
+ }
290
+
291
+ // WaitForDeallocateInstancesResult waits for the response of the delete instance request
292
+ func (c * Client ) WaitForDeallocateInstancesResult (ctx context.Context , future * azure.Future , resourceGroupName string ) (* http.Response , error ) {
293
+ mc := metrics .NewMetricContext ("vmss" , "wait_for_deallocate_instances_result" , resourceGroupName , c .subscriptionID , "" )
294
+ res , err := c .armClient .WaitForAsyncOperationResult (ctx , future , "VMSSWaitForDeallocateInstancesResult" )
295
+ mc .Observe (err )
296
+ return res , err
297
+ }
298
+
299
+ // WaitForStartInstancesResult waits for the response of the delete instance request
300
+ func (c * Client ) WaitForStartInstancesResult (ctx context.Context , future * azure.Future , resourceGroupName string ) (* http.Response , error ) {
301
+ mc := metrics .NewMetricContext ("vmss" , "wait_for_start_instances_result" , resourceGroupName , c .subscriptionID , "" )
302
+ res , err := c .armClient .WaitForAsyncOperationResult (ctx , future , "VMSSWaitForStartInstancesResult" )
303
+ mc .Observe (err )
304
+ return res , err
305
+ }
306
+
275
307
// WaitForAsyncOperationResult waits for the response of the request
276
308
func (c * Client ) WaitForAsyncOperationResult (ctx context.Context , future * azure.Future ) (* http.Response , error ) {
277
309
return c .armClient .WaitForAsyncOperationResult (ctx , future , "VMSSWaitForAsyncOperationResult" )
@@ -473,6 +505,7 @@ func (c *Client) DeleteInstancesAsync(ctx context.Context, resourceGroupName str
473
505
}
474
506
475
507
future , err := azure .NewFutureFromResponse (response )
508
+ mc .Observe (err )
476
509
if err != nil {
477
510
klog .V (5 ).Infof ("Received error in %s: resourceID: %s, error: %s" , "vmss.deletevms.future" , resourceID , rerr .Error ())
478
511
return nil , retry .NewError (false , err )
@@ -481,6 +514,102 @@ func (c *Client) DeleteInstancesAsync(ctx context.Context, resourceGroupName str
481
514
return & future , nil
482
515
}
483
516
517
+ // DeallocateInstancesAsync sends the deallocate request to ARM client and DOEST NOT wait on the future
518
+ func (c * Client ) DeallocateInstancesAsync (ctx context.Context , resourceGroupName string , vmScaleSetName string , vmInstanceIDs compute.VirtualMachineScaleSetVMInstanceRequiredIDs ) (* azure.Future , * retry.Error ) {
519
+ mc := metrics .NewMetricContext ("vmss" , "deallocate_instances_async" , resourceGroupName , c .subscriptionID , "" )
520
+
521
+ // Report errors if the client is rate limited.
522
+ if ! c .rateLimiterWriter .TryAccept () {
523
+ mc .RateLimitedCount ()
524
+ return nil , retry .GetRateLimitError (true , "VMSSDeallocateInstancesAsync" )
525
+ }
526
+
527
+ // Report errors if the client is throttled.
528
+ if c .RetryAfterWriter .After (time .Now ()) {
529
+ mc .ThrottledCount ()
530
+ rerr := retry .GetThrottlingError ("VMSSDeallocateInstancesAsync" , "client throttled" , c .RetryAfterWriter )
531
+ return nil , rerr
532
+ }
533
+
534
+ resourceID := armclient .GetResourceID (
535
+ c .subscriptionID ,
536
+ resourceGroupName ,
537
+ "Microsoft.Compute/virtualMachineScaleSets" ,
538
+ vmScaleSetName ,
539
+ )
540
+
541
+ response , rerr := c .armClient .PostResource (ctx , resourceID , "deallocate" , vmInstanceIDs )
542
+ defer c .armClient .CloseResponse (ctx , response )
543
+
544
+ if rerr != nil {
545
+ klog .V (5 ).Infof ("Received error in %s: resourceID: %s, error: %s" , "vmss.deallocatevms.request" , resourceID , rerr .Error ())
546
+ return nil , rerr
547
+ }
548
+
549
+ err := autorest .Respond (response , azure .WithErrorUnlessStatusCode (http .StatusOK , http .StatusAccepted ))
550
+ if err != nil {
551
+ klog .V (5 ).Infof ("Received error in %s: resourceID: %s, error: %s" , "vmss.deallocatevms.respond" , resourceID , rerr .Error ())
552
+ return nil , retry .GetError (response , err )
553
+ }
554
+
555
+ future , err := azure .NewFutureFromResponse (response )
556
+ mc .Observe (err )
557
+ if err != nil {
558
+ klog .V (5 ).Infof ("Received error in %s: resourceID: %s, error: %s" , "vmss.deallocatevms.future" , resourceID , rerr .Error ())
559
+ return nil , retry .NewError (false , err )
560
+ }
561
+
562
+ return & future , nil
563
+ }
564
+
565
+ // StartInstancesAsync sends the start request to ARM client and DOEST NOT wait on the future
566
+ func (c * Client ) StartInstancesAsync (ctx context.Context , resourceGroupName string , vmScaleSetName string , vmInstanceIDs compute.VirtualMachineScaleSetVMInstanceRequiredIDs ) (* azure.Future , * retry.Error ) {
567
+ mc := metrics .NewMetricContext ("vmss" , "start_instances_async" , resourceGroupName , c .subscriptionID , "" )
568
+
569
+ // Report errors if the client is rate limited.
570
+ if ! c .rateLimiterWriter .TryAccept () {
571
+ mc .RateLimitedCount ()
572
+ return nil , retry .GetRateLimitError (true , "VMSSStartInstancesAsync" )
573
+ }
574
+
575
+ // Report errors if the client is throttled.
576
+ if c .RetryAfterWriter .After (time .Now ()) {
577
+ mc .ThrottledCount ()
578
+ rerr := retry .GetThrottlingError ("VMSSStartInstancesAsync" , "client throttled" , c .RetryAfterWriter )
579
+ return nil , rerr
580
+ }
581
+
582
+ resourceID := armclient .GetResourceID (
583
+ c .subscriptionID ,
584
+ resourceGroupName ,
585
+ "Microsoft.Compute/virtualMachineScaleSets" ,
586
+ vmScaleSetName ,
587
+ )
588
+
589
+ response , rerr := c .armClient .PostResource (ctx , resourceID , "start" , vmInstanceIDs )
590
+ defer c .armClient .CloseResponse (ctx , response )
591
+
592
+ if rerr != nil {
593
+ klog .V (5 ).Infof ("Received error in %s: resourceID: %s, error: %s" , "vmss.startvms.request" , resourceID , rerr .Error ())
594
+ return nil , rerr
595
+ }
596
+
597
+ err := autorest .Respond (response , azure .WithErrorUnlessStatusCode (http .StatusOK , http .StatusAccepted ))
598
+ if err != nil {
599
+ klog .V (5 ).Infof ("Received error in %s: resourceID: %s, error: %s" , "vmss.startvms.respond" , resourceID , rerr .Error ())
600
+ return nil , retry .GetError (response , err )
601
+ }
602
+
603
+ future , err := azure .NewFutureFromResponse (response )
604
+ mc .Observe (err )
605
+ if err != nil {
606
+ klog .V (5 ).Infof ("Received error in %s: resourceID: %s, error: %s" , "vmss.startvms.future" , resourceID , rerr .Error ())
607
+ return nil , retry .NewError (false , err )
608
+ }
609
+
610
+ return & future , nil
611
+ }
612
+
484
613
// deleteVMSSInstances deletes the instances for a VirtualMachineScaleSet.
485
614
func (c * Client ) deleteVMSSInstances (ctx context.Context , resourceGroupName string , vmScaleSetName string , vmInstanceIDs compute.VirtualMachineScaleSetVMInstanceRequiredIDs ) * retry.Error {
486
615
resourceID := armclient .GetResourceID (
0 commit comments