@@ -24,11 +24,11 @@ import (
2424 "sync"
2525 "time"
2626
27- "github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2022-08-01/compute"
28- "github.com/Azure/azure-sdk-for-go/services/resources/mgmt/2017-05-10/resources"
29- azStorage "github.com/Azure/azure-sdk-for-go/storage"
27+ "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v6"
28+ "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources"
3029 "k8s.io/utils/ptr"
3130
31+ azerrors "github.com/Azure/azure-sdk-for-go-extensions/pkg/errors"
3232 apiv1 "k8s.io/api/core/v1"
3333 utilerrors "k8s.io/apimachinery/pkg/util/errors"
3434 "k8s.io/autoscaler/cluster-autoscaler/cloudprovider"
@@ -85,7 +85,7 @@ func (as *AgentPool) initialize() error {
8585 template , err := as .manager .azClient .deploymentClient .ExportTemplate (ctx , as .manager .config .ResourceGroup , as .manager .config .Deployment )
8686 if err != nil {
8787 klog .Errorf ("deploymentClient.ExportTemplate(%s, %s) failed: %v" , as .manager .config .ResourceGroup , as .manager .config .Deployment , err )
88- return err . Error ()
88+ return err
8989 }
9090
9191 as .template = template .Template .(map [string ]interface {})
@@ -136,10 +136,10 @@ func (as *AgentPool) Id() string {
136136 return as .Name
137137}
138138
139- func (as * AgentPool ) getVMsFromCache () ([]compute .VirtualMachine , error ) {
139+ func (as * AgentPool ) getVMsFromCache () ([]* armcompute .VirtualMachine , error ) {
140140 allVMs := as .manager .azureCache .getVirtualMachines ()
141141 if _ , exists := allVMs [as .Name ]; ! exists {
142- return []compute. VirtualMachine {} , fmt .Errorf ("could not find VMs with poolName: %s" , as .Name )
142+ return nil , fmt .Errorf ("could not find VMs with poolName: %s" , as .Name )
143143 }
144144 return allVMs [as .Name ], nil
145145}
@@ -157,7 +157,14 @@ func (as *AgentPool) GetVMIndexes() ([]int, map[int]string, error) {
157157 indexes := make ([]int , 0 )
158158 indexToVM := make (map [int ]string )
159159 for _ , instance := range instances {
160- index , err := GetVMNameIndex (instance .StorageProfile .OsDisk .OsType , * instance .Name )
160+ if instance .Properties == nil || instance .Properties .StorageProfile == nil || instance .Properties .StorageProfile .OSDisk == nil {
161+ continue
162+ }
163+ var osType armcompute.OperatingSystemTypes
164+ if instance .Properties .StorageProfile .OSDisk .OSType != nil {
165+ osType = * instance .Properties .StorageProfile .OSDisk .OSType
166+ }
167+ index , err := GetVMNameIndex (osType , * instance .Name )
161168 if err != nil {
162169 return nil , nil , err
163170 }
@@ -211,27 +218,28 @@ func (as *AgentPool) TargetSize() (int, error) {
211218 return int (size ), nil
212219}
213220
214- func (as * AgentPool ) getAllSucceededAndFailedDeployments () ([]resources .DeploymentExtended , error ) {
221+ func (as * AgentPool ) getAllSucceededAndFailedDeployments () ([]* armresources .DeploymentExtended , error ) {
215222 ctx , cancel := getContextWithCancel ()
216223 defer cancel ()
217224
218225 allDeployments , rerr := as .manager .azClient .deploymentClient .List (ctx , as .manager .config .ResourceGroup )
219226 if rerr != nil {
220- klog .Errorf ("getAllSucceededAndFailedDeployments: failed to list deployments with error: %v" , rerr . Error () )
221- return nil , rerr . Error ()
227+ klog .Errorf ("getAllSucceededAndFailedDeployments: failed to list deployments with error: %v" , rerr )
228+ return nil , rerr
222229 }
223230
224- result := make ([]resources .DeploymentExtended , 0 )
231+ result := make ([]* armresources .DeploymentExtended , 0 )
225232 for _ , deployment := range allDeployments {
226233 if deployment .Properties == nil || deployment .Properties .ProvisioningState == nil {
227234 continue
228235 }
229- if * deployment .Properties .ProvisioningState == "Succeeded" || * deployment .Properties .ProvisioningState == "Failed" {
236+ provState := string (* deployment .Properties .ProvisioningState )
237+ if provState == "Succeeded" || provState == "Failed" {
230238 result = append (result , deployment )
231239 }
232240 }
233241
234- return result , rerr . Error ()
242+ return result , nil
235243}
236244
237245// deleteOutdatedDeployments keeps the newest deployments in the resource group and delete others,
@@ -256,7 +264,12 @@ func (as *AgentPool) deleteOutdatedDeployments() (err error) {
256264 }
257265
258266 sort .Slice (deployments , func (i , j int ) bool {
259- return deployments [i ].Properties .Timestamp .Time .After (deployments [j ].Properties .Timestamp .Time )
267+ iTime := deployments [i ].Properties .Timestamp
268+ jTime := deployments [j ].Properties .Timestamp
269+ if iTime == nil || jTime == nil {
270+ return false
271+ }
272+ return iTime .After (* jTime )
260273 })
261274
262275 toBeDeleted := deployments [as .manager .config .MaxDeploymentsCount :]
@@ -269,7 +282,7 @@ func (as *AgentPool) deleteOutdatedDeployments() (err error) {
269282 klog .V (4 ).Infof ("deleteOutdatedDeployments: starts deleting outdated deployment (%s)" , * deployment .Name )
270283 rerr := as .manager .azClient .deploymentClient .Delete (ctx , as .manager .config .ResourceGroup , * deployment .Name )
271284 if rerr != nil {
272- errList = append (errList , rerr . Error () )
285+ errList = append (errList , rerr )
273286 }
274287 }
275288
@@ -317,20 +330,20 @@ func (as *AgentPool) IncreaseSize(delta int) error {
317330 as .parameters [as .Name + "Offset" ] = map [string ]int {"value" : highestUsedIndex + 1 }
318331
319332 newDeploymentName := fmt .Sprintf ("cluster-autoscaler-%d" , rand .New (rand .NewSource (time .Now ().UnixNano ())).Int31 ())
320- newDeployment := resources .Deployment {
321- Properties : & resources .DeploymentProperties {
333+ newDeployment := armresources .Deployment {
334+ Properties : & armresources .DeploymentProperties {
322335 Template : & as .template ,
323336 Parameters : & as .parameters ,
324- Mode : resources . Incremental ,
337+ Mode : ptr . To ( armresources . DeploymentModeIncremental ) ,
325338 },
326339 }
327340 ctx , cancel := getContextWithCancel ()
328341 defer cancel ()
329342 klog .V (3 ).Infof ("Waiting for deploymentClient.CreateOrUpdate(%s, %s, %v)" , as .manager .config .ResourceGroup , newDeploymentName , newDeployment )
330- rerr := as .manager .azClient .deploymentClient .CreateOrUpdate (ctx , as .manager .config .ResourceGroup , newDeploymentName , newDeployment , "" )
343+ _ , rerr := as .manager .azClient .deploymentClient .CreateOrUpdate (ctx , as .manager .config .ResourceGroup , newDeploymentName , newDeployment )
331344 if rerr != nil {
332- klog .Errorf ("deploymentClient.CreateOrUpdate for deployment %q failed: %v" , newDeploymentName , rerr . Error () )
333- return rerr . Error ()
345+ klog .Errorf ("deploymentClient.CreateOrUpdate for deployment %q failed: %v" , newDeploymentName , rerr )
346+ return rerr
334347 }
335348 klog .V (3 ).Infof ("deploymentClient.CreateOrUpdate(%s, %s, %v) success" , as .manager .config .ResourceGroup , newDeploymentName , newDeployment )
336349
@@ -512,61 +525,52 @@ func (as *AgentPool) Nodes() ([]cloudprovider.Instance, error) {
512525}
513526
514527func (as * AgentPool ) deleteBlob (accountName , vhdContainer , vhdBlob string ) error {
515- ctx , cancel := getContextWithCancel ()
516- defer cancel ()
517-
518- storageKeysResult , rerr := as .manager .azClient .storageAccountsClient .ListKeys (ctx , as .manager .config .SubscriptionID , as .manager .config .ResourceGroup , accountName )
519- if rerr != nil {
520- return rerr .Error ()
521- }
522-
523- keys := * storageKeysResult .Keys
524- client , err := azStorage .NewBasicClientOnSovereignCloud (accountName , ptr .Deref (keys [0 ].Value , "" ), as .manager .env )
525- if err != nil {
526- return err
527- }
528-
529- bs := client .GetBlobService ()
530- containerRef := bs .GetContainerReference (vhdContainer )
531- blobRef := containerRef .GetBlobReference (vhdBlob )
532-
533- return blobRef .Delete (& azStorage.DeleteBlobOptions {})
528+ util := & AzUtil {manager : as .manager }
529+ return util .DeleteBlob (accountName , vhdContainer , vhdBlob )
534530}
535531
536532// deleteVirtualMachine deletes a VM and any associated OS disk
537533func (as * AgentPool ) deleteVirtualMachine (name string ) error {
538534 ctx , cancel := getContextWithCancel ()
539535 defer cancel ()
540536
541- vm , rerr := as .manager .azClient .virtualMachinesClient .Get (ctx , as .manager .config .ResourceGroup , name , "" )
537+ vm , rerr := as .manager .azClient .virtualMachinesClient .Get (ctx , as .manager .config .ResourceGroup , name , nil )
542538 if rerr != nil {
543- if exists , _ := checkResourceExistsFromRetryError (rerr ); ! exists {
539+ if azerrors . IsNotFoundErr (rerr ) {
544540 klog .V (2 ).Infof ("VirtualMachine %s/%s has already been removed" , as .manager .config .ResourceGroup , name )
545541 return nil
546542 }
547543
548- klog .Errorf ("failed to get VM: %s/%s: %s " , as .manager .config .ResourceGroup , name , rerr . Error () )
549- return rerr . Error ()
544+ klog .Errorf ("failed to get VM: %s/%s: %v " , as .manager .config .ResourceGroup , name , rerr )
545+ return rerr
550546 }
551547
552- vhd := vm .VirtualMachineProperties .StorageProfile .OsDisk .Vhd
553- managedDisk := vm .VirtualMachineProperties .StorageProfile .OsDisk .ManagedDisk
548+ if vm .Properties == nil || vm .Properties .StorageProfile == nil || vm .Properties .StorageProfile .OSDisk == nil {
549+ klog .Errorf ("failed to get a valid os disk for VM: %s/%s" , as .manager .config .ResourceGroup , name )
550+ return fmt .Errorf ("os disk information not available" )
551+ }
552+
553+ vhd := vm .Properties .StorageProfile .OSDisk .Vhd
554+ managedDisk := vm .Properties .StorageProfile .OSDisk .ManagedDisk
554555 if vhd == nil && managedDisk == nil {
555556 klog .Errorf ("failed to get a valid os disk URI for VM: %s/%s" , as .manager .config .ResourceGroup , name )
556557 return fmt .Errorf ("os disk does not have a VHD URI" )
557558 }
558559
559- osDiskName := vm .VirtualMachineProperties .StorageProfile .OsDisk .Name
560+ osDiskName := vm .Properties .StorageProfile .OSDisk .Name
560561 var nicName string
561- nicID := (* vm .VirtualMachineProperties .NetworkProfile .NetworkInterfaces )[0 ].ID
562- if nicID == nil {
563- klog .Warningf ("NIC ID is not set for VM (%s/%s)" , as .manager .config .ResourceGroup , name )
564- } else {
565- nicName , err := resourceName (* nicID )
566- if err != nil {
567- return err
562+ if vm .Properties .NetworkProfile != nil && vm .Properties .NetworkProfile .NetworkInterfaces != nil && len (vm .Properties .NetworkProfile .NetworkInterfaces ) > 0 {
563+ nicID := vm .Properties .NetworkProfile .NetworkInterfaces [0 ].ID
564+ if nicID == nil {
565+ klog .Warningf ("NIC ID is not set for VM (%s/%s)" , as .manager .config .ResourceGroup , name )
566+ } else {
567+ var err error
568+ nicName , err = resourceName (* nicID )
569+ if err != nil {
570+ return err
571+ }
572+ klog .Infof ("found nic name for VM (%s/%s): %s" , as .manager .config .ResourceGroup , name , nicName )
568573 }
569- klog .Infof ("found nic name for VM (%s/%s): %s" , as .manager .config .ResourceGroup , name , nicName )
570574 }
571575
572576 klog .Infof ("deleting VM: %s/%s" , as .manager .config .ResourceGroup , name )
@@ -575,9 +579,8 @@ func (as *AgentPool) deleteVirtualMachine(name string) error {
575579
576580 klog .Infof ("waiting for VirtualMachine deletion: %s/%s" , as .manager .config .ResourceGroup , name )
577581 rerr = as .manager .azClient .virtualMachinesClient .Delete (deleteCtx , as .manager .config .ResourceGroup , name )
578- _ , realErr := checkResourceExistsFromRetryError (rerr )
579- if realErr != nil {
580- return realErr
582+ if rerr != nil && ! azerrors .IsNotFoundErr (rerr ) {
583+ return rerr
581584 }
582585 klog .V (2 ).Infof ("VirtualMachine %s/%s removed" , as .manager .config .ResourceGroup , name )
583586
@@ -587,9 +590,8 @@ func (as *AgentPool) deleteVirtualMachine(name string) error {
587590 defer interfaceCancel ()
588591 rerr := as .manager .azClient .interfacesClient .Delete (interfaceCtx , as .manager .config .ResourceGroup , nicName )
589592 klog .Infof ("waiting for nic deletion: %s/%s" , as .manager .config .ResourceGroup , nicName )
590- _ , realErr := checkResourceExistsFromRetryError (rerr )
591- if realErr != nil {
592- return realErr
593+ if rerr != nil && ! azerrors .IsNotFoundErr (rerr ) {
594+ return rerr
593595 }
594596 klog .V (2 ).Infof ("interface %s/%s removed" , as .manager .config .ResourceGroup , nicName )
595597 }
@@ -604,23 +606,21 @@ func (as *AgentPool) deleteVirtualMachine(name string) error {
604606
605607 klog .Infof ("deleting blob: %s/%s" , vhdContainer , vhdBlob )
606608 if err = as .deleteBlob (accountName , vhdContainer , vhdBlob ); err != nil {
607- _ , realErr := checkResourceExistsFromError (err )
608- if realErr != nil {
609- return realErr
609+ if ! azerrors .IsNotFoundErr (err ) {
610+ return err
610611 }
611- klog .V (2 ).Infof ("Blob %s/%s removed" , as .manager .config .ResourceGroup , vhdBlob )
612612 }
613+ klog .V (2 ).Infof ("Blob %s/%s removed" , as .manager .config .ResourceGroup , vhdBlob )
613614 } else if managedDisk != nil {
614615 if osDiskName == nil {
615616 klog .Warningf ("osDisk is not set for VM %s/%s" , as .manager .config .ResourceGroup , name )
616617 } else {
617618 klog .Infof ("deleting managed disk: %s/%s" , as .manager .config .ResourceGroup , * osDiskName )
618619 disksCtx , disksCancel := getContextWithCancel ()
619620 defer disksCancel ()
620- rerr := as .manager .azClient .disksClient .Delete (disksCtx , as .manager .config .SubscriptionID , as .manager .config .ResourceGroup , * osDiskName )
621- _ , realErr := checkResourceExistsFromRetryError (rerr )
622- if realErr != nil {
623- return realErr
621+ rerr := as .manager .azClient .disksClient .Delete (disksCtx , as .manager .config .ResourceGroup , * osDiskName )
622+ if rerr != nil && ! azerrors .IsNotFoundErr (rerr ) {
623+ return rerr
624624 }
625625 klog .V (2 ).Infof ("disk %s/%s removed" , as .manager .config .ResourceGroup , * osDiskName )
626626 }
0 commit comments