From 885a03eef786da4b933e324c6d773cd51cf9955e Mon Sep 17 00:00:00 2001 From: Pengfei Ni Date: Mon, 13 Jan 2020 03:42:25 +0000 Subject: [PATCH] Use new clients in Azure cloud provider --- .../k8s.io/legacy-cloud-providers/azure/BUILD | 8 + .../legacy-cloud-providers/azure/azure.go | 37 +- .../azure/azure_backoff.go | 612 +++------- .../azure/azure_client.go | 1020 ----------------- .../azure/clients/BUILD | 8 + .../clients/armclient/azure_armclient.go | 15 + .../azure/clients/armclient/interface.go | 3 + .../armclient/mockarmclient/interface.go | 15 + .../azure/clients/routeclient/BUILD | 1 - .../azure/clients/vmssvmclient/BUILD | 2 +- vendor/modules.txt | 8 + 11 files changed, 227 insertions(+), 1502 deletions(-) diff --git a/staging/src/k8s.io/legacy-cloud-providers/azure/BUILD b/staging/src/k8s.io/legacy-cloud-providers/azure/BUILD index 3a04df8febf..d65a4af2a1f 100644 --- a/staging/src/k8s.io/legacy-cloud-providers/azure/BUILD +++ b/staging/src/k8s.io/legacy-cloud-providers/azure/BUILD @@ -66,6 +66,14 @@ go_library( "//staging/src/k8s.io/component-base/featuregate:go_default_library", "//staging/src/k8s.io/legacy-cloud-providers/azure/auth:go_default_library", "//staging/src/k8s.io/legacy-cloud-providers/azure/clients:go_default_library", + "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/interfaceclient:go_default_library", + "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/loadbalancerclient:go_default_library", + "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/publicipclient:go_default_library", + "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/routeclient:go_default_library", + "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/routetableclient:go_default_library", + "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/securitygroupclient:go_default_library", + "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/subnetclient:go_default_library", + "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/vmclient:go_default_library", "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/vmssclient:go_default_library", "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/vmssvmclient:go_default_library", "//staging/src/k8s.io/legacy-cloud-providers/azure/metrics:go_default_library", diff --git a/staging/src/k8s.io/legacy-cloud-providers/azure/azure.go b/staging/src/k8s.io/legacy-cloud-providers/azure/azure.go index 736e1d38d1a..9caece8c230 100644 --- a/staging/src/k8s.io/legacy-cloud-providers/azure/azure.go +++ b/staging/src/k8s.io/legacy-cloud-providers/azure/azure.go @@ -46,6 +46,14 @@ import ( "k8s.io/klog" "k8s.io/legacy-cloud-providers/azure/auth" azclients "k8s.io/legacy-cloud-providers/azure/clients" + "k8s.io/legacy-cloud-providers/azure/clients/interfaceclient" + "k8s.io/legacy-cloud-providers/azure/clients/loadbalancerclient" + "k8s.io/legacy-cloud-providers/azure/clients/publicipclient" + "k8s.io/legacy-cloud-providers/azure/clients/routeclient" + "k8s.io/legacy-cloud-providers/azure/clients/routetableclient" + "k8s.io/legacy-cloud-providers/azure/clients/securitygroupclient" + "k8s.io/legacy-cloud-providers/azure/clients/subnetclient" + "k8s.io/legacy-cloud-providers/azure/clients/vmclient" "k8s.io/legacy-cloud-providers/azure/clients/vmssclient" "k8s.io/legacy-cloud-providers/azure/clients/vmssvmclient" "k8s.io/legacy-cloud-providers/azure/retry" @@ -476,24 +484,27 @@ func (az *Cloud) InitializeCloudFromConfig(config *Config, fromSecret bool) erro Jitter: config.CloudProviderBackoffJitter, } } - az.DisksClient = newAzDisksClient(azClientConfig.WithRateLimiter(config.DiskRateLimit)) - az.SnapshotsClient = newSnapshotsClient(azClientConfig.WithRateLimiter(config.SnapshotRateLimit)) - az.RoutesClient = newAzRoutesClient(azClientConfig.WithRateLimiter(config.RouteRateLimit)) - az.SubnetsClient = newAzSubnetsClient(azClientConfig.WithRateLimiter(config.SubnetsRateLimit)) - az.InterfacesClient = newAzInterfacesClient(azClientConfig.WithRateLimiter(config.InterfaceRateLimit)) - az.RouteTablesClient = newAzRouteTablesClient(azClientConfig.WithRateLimiter(config.RouteTableRateLimit)) - az.LoadBalancerClient = newAzLoadBalancersClient(azClientConfig.WithRateLimiter(config.LoadBalancerRateLimit)) - az.SecurityGroupsClient = newAzSecurityGroupsClient(azClientConfig.WithRateLimiter(config.SecurityGroupRateLimit)) - az.StorageAccountClient = newAzStorageAccountClient(azClientConfig.WithRateLimiter(config.StorageAccountRateLimit)) - az.VirtualMachinesClient = newAzVirtualMachinesClient(azClientConfig.WithRateLimiter(config.VirtualMachineRateLimit)) - az.PublicIPAddressesClient = newAzPublicIPAddressesClient(azClientConfig.WithRateLimiter(config.PublicIPAddressRateLimit)) - az.VirtualMachineSizesClient = newAzVirtualMachineSizesClient(azClientConfig.WithRateLimiter(config.VirtualMachineSizeRateLimit)) - + az.RoutesClient = routeclient.New(azClientConfig.WithRateLimiter(config.RouteRateLimit)) + az.SubnetsClient = subnetclient.New(azClientConfig.WithRateLimiter(config.SubnetsRateLimit)) + az.InterfacesClient = interfaceclient.New(azClientConfig.WithRateLimiter(config.InterfaceRateLimit)) + az.RouteTablesClient = routetableclient.New(azClientConfig.WithRateLimiter(config.RouteTableRateLimit)) + az.LoadBalancerClient = loadbalancerclient.New(azClientConfig.WithRateLimiter(config.LoadBalancerRateLimit)) + az.SecurityGroupsClient = securitygroupclient.New(azClientConfig.WithRateLimiter(config.SecurityGroupRateLimit)) + az.VirtualMachinesClient = vmclient.New(azClientConfig.WithRateLimiter(config.VirtualMachineRateLimit)) + az.PublicIPAddressesClient = publicipclient.New(azClientConfig.WithRateLimiter(config.PublicIPAddressRateLimit)) az.VirtualMachineScaleSetsClient = vmssclient.New(azClientConfig.WithRateLimiter(config.VirtualMachineScaleSetRateLimit)) + + // Error "not an active Virtual Machine Scale Set VM" is not retriable for VMSS VM. vmssVMClientConfig := azClientConfig.WithRateLimiter(config.VirtualMachineScaleSetRateLimit) vmssVMClientConfig.Backoff = vmssVMClientConfig.Backoff.WithNonRetriableErrors([]string{vmssVMNotActiveErrorMessage}) az.VirtualMachineScaleSetVMsClient = vmssvmclient.New(vmssVMClientConfig) + // TODO(feiskyer): refactor the following clients to use armclient + az.DisksClient = newAzDisksClient(azClientConfig.WithRateLimiter(config.DiskRateLimit)) + az.SnapshotsClient = newSnapshotsClient(azClientConfig.WithRateLimiter(config.SnapshotRateLimit)) + az.StorageAccountClient = newAzStorageAccountClient(azClientConfig.WithRateLimiter(config.StorageAccountRateLimit)) + az.VirtualMachineSizesClient = newAzVirtualMachineSizesClient(azClientConfig.WithRateLimiter(config.VirtualMachineSizeRateLimit)) + // TODO(feiskyer): refactor azureFileClient to Interface. az.FileClient = &azureFileClient{env: *env} diff --git a/staging/src/k8s.io/legacy-cloud-providers/azure/azure_backoff.go b/staging/src/k8s.io/legacy-cloud-providers/azure/azure_backoff.go index bcb85d5a3fc..56d89b79bae 100644 --- a/staging/src/k8s.io/legacy-cloud-providers/azure/azure_backoff.go +++ b/staging/src/k8s.io/legacy-cloud-providers/azure/azure_backoff.go @@ -86,46 +86,18 @@ func (az *Cloud) GetVirtualMachineWithRetry(name types.NodeName, crt cacheReadTy return machine, err } -// ListVirtualMachinesWithRetry invokes az.VirtualMachinesClient.List with exponential backoff retry -func (az *Cloud) ListVirtualMachinesWithRetry(resourceGroup string) ([]compute.VirtualMachine, error) { - allNodes := []compute.VirtualMachine{} - err := wait.ExponentialBackoff(az.RequestBackoff(), func() (bool, error) { - var retryErr *retry.Error - ctx, cancel := getContextWithCancel() - defer cancel() - allNodes, retryErr = az.VirtualMachinesClient.List(ctx, resourceGroup) - if retryErr != nil { - klog.Errorf("VirtualMachinesClient.List(%v) - backoff: failure, will retry,err=%v", - resourceGroup, - retryErr) - return false, retryErr.Error() - } - klog.V(2).Infof("VirtualMachinesClient.List(%v) - backoff: success", resourceGroup) - return true, nil - }) - if err != nil { - return nil, err - } - - return allNodes, nil -} - // ListVirtualMachines invokes az.VirtualMachinesClient.List with exponential backoff retry func (az *Cloud) ListVirtualMachines(resourceGroup string) ([]compute.VirtualMachine, error) { - if az.Config.shouldOmitCloudProviderBackoff() { - ctx, cancel := getContextWithCancel() - defer cancel() + ctx, cancel := getContextWithCancel() + defer cancel() - allNodes, rerr := az.VirtualMachinesClient.List(ctx, resourceGroup) - if rerr != nil { - klog.Errorf("VirtualMachinesClient.List(%v) failure with err=%v", resourceGroup, rerr) - return nil, rerr.Error() - } - klog.V(2).Infof("VirtualMachinesClient.List(%v) success", resourceGroup) - return allNodes, nil + allNodes, rerr := az.VirtualMachinesClient.List(ctx, resourceGroup) + if rerr != nil { + klog.Errorf("VirtualMachinesClient.List(%v) failure with err=%v", resourceGroup, rerr) + return nil, rerr.Error() } - - return az.ListVirtualMachinesWithRetry(resourceGroup) + klog.V(2).Infof("VirtualMachinesClient.List(%v) success", resourceGroup) + return allNodes, nil } // getPrivateIPsForMachine is wrapper for optional backoff getting private ips @@ -183,514 +155,220 @@ func (az *Cloud) GetIPForMachineWithRetry(name types.NodeName) (string, string, // CreateOrUpdateSecurityGroup invokes az.SecurityGroupsClient.CreateOrUpdate with exponential backoff retry func (az *Cloud) CreateOrUpdateSecurityGroup(service *v1.Service, sg network.SecurityGroup) error { - if az.Config.shouldOmitCloudProviderBackoff() { - ctx, cancel := getContextWithCancel() - defer cancel() + ctx, cancel := getContextWithCancel() + defer cancel() - rerr := az.SecurityGroupsClient.CreateOrUpdate(ctx, az.SecurityGroupResourceGroup, *sg.Name, sg, to.String(sg.Etag)) - klog.V(10).Infof("SecurityGroupsClient.CreateOrUpdate(%s): end", *sg.Name) - if rerr == nil { - // Invalidate the cache right after updating - az.nsgCache.Delete(*sg.Name) - return nil - } - - // Invalidate the cache because ETAG precondition mismatch. - if rerr.HTTPStatusCode == http.StatusPreconditionFailed { - az.nsgCache.Delete(*sg.Name) - } - - // Invalidate the cache because another new operation has canceled the current request. - if strings.Contains(strings.ToLower(rerr.Error().Error()), operationCancledErrorMessage) { - az.nsgCache.Delete(*sg.Name) - } - - return rerr.Error() + rerr := az.SecurityGroupsClient.CreateOrUpdate(ctx, az.SecurityGroupResourceGroup, *sg.Name, sg, to.String(sg.Etag)) + klog.V(10).Infof("SecurityGroupsClient.CreateOrUpdate(%s): end", *sg.Name) + if rerr == nil { + // Invalidate the cache right after updating + az.nsgCache.Delete(*sg.Name) + return nil } - return az.CreateOrUpdateSGWithRetry(service, sg) -} + // Invalidate the cache because ETAG precondition mismatch. + if rerr.HTTPStatusCode == http.StatusPreconditionFailed { + klog.V(3).Infof("SecurityGroup cache for %s is cleanup because of http.StatusPreconditionFailed", *sg.Name) + az.nsgCache.Delete(*sg.Name) + } -// CreateOrUpdateSGWithRetry invokes az.SecurityGroupsClient.CreateOrUpdate with exponential backoff retry -func (az *Cloud) CreateOrUpdateSGWithRetry(service *v1.Service, sg network.SecurityGroup) error { - return wait.ExponentialBackoff(az.RequestBackoff(), func() (bool, error) { - ctx, cancel := getContextWithCancel() - defer cancel() + // Invalidate the cache because another new operation has canceled the current request. + if strings.Contains(strings.ToLower(rerr.Error().Error()), operationCancledErrorMessage) { + klog.V(3).Infof("SecurityGroup cache for %s is cleanup because CreateOrUpdateSecurityGroup is canceld by another operation", *sg.Name) + az.nsgCache.Delete(*sg.Name) + } - rerr := az.SecurityGroupsClient.CreateOrUpdate(ctx, az.SecurityGroupResourceGroup, *sg.Name, sg, to.String(sg.Etag)) - klog.V(10).Infof("SecurityGroupsClient.CreateOrUpdate(%s): end", *sg.Name) - if rerr == nil { - // Invalidate the cache right after updating - az.nsgCache.Delete(*sg.Name) - return true, nil - } - - // Invalidate the cache and abort backoff because ETAG precondition mismatch. - if rerr.HTTPStatusCode == http.StatusPreconditionFailed { - az.nsgCache.Delete(*sg.Name) - return true, rerr.Error() - } - - // Invalidate the cache and abort backoff because another new operation has canceled the current request. - if strings.Contains(strings.ToLower(rerr.Error().Error()), operationCancledErrorMessage) { - az.nsgCache.Delete(*sg.Name) - return true, rerr.Error() - } - - return !rerr.Retriable, rerr.Error() - }) + return rerr.Error() } // CreateOrUpdateLB invokes az.LoadBalancerClient.CreateOrUpdate with exponential backoff retry func (az *Cloud) CreateOrUpdateLB(service *v1.Service, lb network.LoadBalancer) error { - if az.Config.shouldOmitCloudProviderBackoff() { - ctx, cancel := getContextWithCancel() - defer cancel() + ctx, cancel := getContextWithCancel() + defer cancel() - rgName := az.getLoadBalancerResourceGroup() - rerr := az.LoadBalancerClient.CreateOrUpdate(ctx, rgName, *lb.Name, lb, to.String(lb.Etag)) - klog.V(10).Infof("LoadBalancerClient.CreateOrUpdate(%s): end", *lb.Name) - if rerr == nil { - // Invalidate the cache right after updating - az.lbCache.Delete(*lb.Name) - return nil - } - - // Invalidate the cache because ETAG precondition mismatch. - if rerr.HTTPStatusCode == http.StatusPreconditionFailed { - az.lbCache.Delete(*lb.Name) - } - // Invalidate the cache because another new operation has canceled the current request. - if strings.Contains(strings.ToLower(rerr.Error().Error()), operationCancledErrorMessage) { - az.lbCache.Delete(*lb.Name) - } - return rerr.Error() + rgName := az.getLoadBalancerResourceGroup() + rerr := az.LoadBalancerClient.CreateOrUpdate(ctx, rgName, *lb.Name, lb, to.String(lb.Etag)) + klog.V(10).Infof("LoadBalancerClient.CreateOrUpdate(%s): end", *lb.Name) + if rerr == nil { + // Invalidate the cache right after updating + az.lbCache.Delete(*lb.Name) + return nil } - return az.createOrUpdateLBWithRetry(service, lb) -} + // Invalidate the cache because ETAG precondition mismatch. + if rerr.HTTPStatusCode == http.StatusPreconditionFailed { + klog.V(3).Infof("LoadBalancer cache for %s is cleanup because of http.StatusPreconditionFailed", *lb.Name) + az.lbCache.Delete(*lb.Name) + } + // Invalidate the cache because another new operation has canceled the current request. + if strings.Contains(strings.ToLower(rerr.Error().Error()), operationCancledErrorMessage) { + klog.V(3).Infof("LoadBalancer cache for %s is cleanup because CreateOrUpdate is canceled by another operation", *lb.Name) + az.lbCache.Delete(*lb.Name) + } -// createOrUpdateLBWithRetry invokes az.LoadBalancerClient.CreateOrUpdate with exponential backoff retry -func (az *Cloud) createOrUpdateLBWithRetry(service *v1.Service, lb network.LoadBalancer) error { - return wait.ExponentialBackoff(az.RequestBackoff(), func() (bool, error) { - ctx, cancel := getContextWithCancel() - defer cancel() - - rgName := az.getLoadBalancerResourceGroup() - rerr := az.LoadBalancerClient.CreateOrUpdate(ctx, rgName, *lb.Name, lb, to.String(lb.Etag)) - klog.V(10).Infof("LoadBalancerClient.CreateOrUpdate(%s): end", *lb.Name) - if rerr == nil { - // Invalidate the cache right after updating - az.lbCache.Delete(*lb.Name) - return true, nil - } - - // Invalidate the cache and abort backoff because ETAG precondition mismatch. - if rerr.HTTPStatusCode == http.StatusPreconditionFailed { - az.lbCache.Delete(*lb.Name) - return true, rerr.Error() - } - // Invalidate the cache and abort backoff because another new operation has canceled the current request. - if strings.Contains(strings.ToLower(rerr.Error().Error()), operationCancledErrorMessage) { - az.lbCache.Delete(*lb.Name) - return true, rerr.Error() - } - return !rerr.Retriable, rerr.Error() - }) + return rerr.Error() } // ListLB invokes az.LoadBalancerClient.List with exponential backoff retry func (az *Cloud) ListLB(service *v1.Service) ([]network.LoadBalancer, error) { - if az.Config.shouldOmitCloudProviderBackoff() { - ctx, cancel := getContextWithCancel() - defer cancel() + ctx, cancel := getContextWithCancel() + defer cancel() - rgName := az.getLoadBalancerResourceGroup() - allLBs, rerr := az.LoadBalancerClient.List(ctx, rgName) - if rerr != nil { - az.Event(service, v1.EventTypeWarning, "ListLoadBalancers", rerr.Error().Error()) - klog.Errorf("LoadBalancerClient.List(%v) failure with err=%v", rgName, rerr) - return nil, rerr.Error() - } - klog.V(2).Infof("LoadBalancerClient.List(%v) success", rgName) - return allLBs, nil + rgName := az.getLoadBalancerResourceGroup() + allLBs, rerr := az.LoadBalancerClient.List(ctx, rgName) + if rerr != nil { + az.Event(service, v1.EventTypeWarning, "ListLoadBalancers", rerr.Error().Error()) + klog.Errorf("LoadBalancerClient.List(%v) failure with err=%v", rgName, rerr) + return nil, rerr.Error() } - - return az.listLBWithRetry(service) -} - -// listLBWithRetry invokes az.LoadBalancerClient.List with exponential backoff retry -func (az *Cloud) listLBWithRetry(service *v1.Service) ([]network.LoadBalancer, error) { - var retryErr *retry.Error - var allLBs []network.LoadBalancer - - err := wait.ExponentialBackoff(az.RequestBackoff(), func() (bool, error) { - ctx, cancel := getContextWithCancel() - defer cancel() - - rgName := az.getLoadBalancerResourceGroup() - allLBs, retryErr = az.LoadBalancerClient.List(ctx, rgName) - if retryErr != nil { - az.Event(service, v1.EventTypeWarning, "ListLoadBalancers", retryErr.Error().Error()) - klog.Errorf("LoadBalancerClient.List(%v) - backoff: failure, will retry,err=%v", - rgName, - retryErr) - return false, retryErr.Error() - } - klog.V(2).Infof("LoadBalancerClient.List(%v) - backoff: success", az.ResourceGroup) - return true, nil - }) - if err != nil { - return nil, err - } - + klog.V(2).Infof("LoadBalancerClient.List(%v) success", rgName) return allLBs, nil } // ListPIP list the PIP resources in the given resource group func (az *Cloud) ListPIP(service *v1.Service, pipResourceGroup string) ([]network.PublicIPAddress, error) { - if az.Config.shouldOmitCloudProviderBackoff() { - ctx, cancel := getContextWithCancel() - defer cancel() + ctx, cancel := getContextWithCancel() + defer cancel() - allPIPs, rerr := az.PublicIPAddressesClient.List(ctx, pipResourceGroup) - if rerr != nil { - az.Event(service, v1.EventTypeWarning, "ListPublicIPs", rerr.Error().Error()) - klog.Errorf("PublicIPAddressesClient.List(%v) failure with err=%v", pipResourceGroup, rerr) - return nil, rerr.Error() - } - klog.V(2).Infof("PublicIPAddressesClient.List(%v) success", pipResourceGroup) - return allPIPs, nil - } - - return az.listPIPWithRetry(service, pipResourceGroup) -} - -// listPIPWithRetry list the PIP resources in the given resource group -func (az *Cloud) listPIPWithRetry(service *v1.Service, pipResourceGroup string) ([]network.PublicIPAddress, error) { - var allPIPs []network.PublicIPAddress - - err := wait.ExponentialBackoff(az.RequestBackoff(), func() (bool, error) { - ctx, cancel := getContextWithCancel() - defer cancel() - - var retryErr *retry.Error - allPIPs, retryErr = az.PublicIPAddressesClient.List(ctx, pipResourceGroup) - if retryErr != nil { - az.Event(service, v1.EventTypeWarning, "ListPublicIPs", retryErr.Error().Error()) - klog.Errorf("PublicIPAddressesClient.List(%v) - backoff: failure, will retry,err=%v", - pipResourceGroup, - retryErr) - return false, retryErr.Error() - } - klog.V(2).Infof("PublicIPAddressesClient.List(%v) - backoff: success", pipResourceGroup) - return true, nil - }) - if err != nil { - return nil, err + allPIPs, rerr := az.PublicIPAddressesClient.List(ctx, pipResourceGroup) + if rerr != nil { + az.Event(service, v1.EventTypeWarning, "ListPublicIPs", rerr.Error().Error()) + klog.Errorf("PublicIPAddressesClient.List(%v) failure with err=%v", pipResourceGroup, rerr) + return nil, rerr.Error() } + klog.V(2).Infof("PublicIPAddressesClient.List(%v) success", pipResourceGroup) return allPIPs, nil } // CreateOrUpdatePIP invokes az.PublicIPAddressesClient.CreateOrUpdate with exponential backoff retry func (az *Cloud) CreateOrUpdatePIP(service *v1.Service, pipResourceGroup string, pip network.PublicIPAddress) error { - if az.Config.shouldOmitCloudProviderBackoff() { - ctx, cancel := getContextWithCancel() - defer cancel() + ctx, cancel := getContextWithCancel() + defer cancel() - rerr := az.PublicIPAddressesClient.CreateOrUpdate(ctx, pipResourceGroup, *pip.Name, pip) - klog.V(10).Infof("PublicIPAddressesClient.CreateOrUpdate(%s, %s): end", pipResourceGroup, *pip.Name) - if rerr != nil { - klog.Errorf("PublicIPAddressesClient.CreateOrUpdate(%s, %s) failed: %s", pipResourceGroup, *pip.Name, rerr.Error().Error()) - az.Event(service, v1.EventTypeWarning, "CreateOrUpdatePublicIPAddress", rerr.Error().Error()) - return rerr.Error() - } - - return nil + rerr := az.PublicIPAddressesClient.CreateOrUpdate(ctx, pipResourceGroup, *pip.Name, pip) + klog.V(10).Infof("PublicIPAddressesClient.CreateOrUpdate(%s, %s): end", pipResourceGroup, *pip.Name) + if rerr != nil { + klog.Errorf("PublicIPAddressesClient.CreateOrUpdate(%s, %s) failed: %s", pipResourceGroup, *pip.Name, rerr.Error().Error()) + az.Event(service, v1.EventTypeWarning, "CreateOrUpdatePublicIPAddress", rerr.Error().Error()) + return rerr.Error() } - return az.createOrUpdatePIPWithRetry(service, pipResourceGroup, pip) -} - -// createOrUpdatePIPWithRetry invokes az.PublicIPAddressesClient.CreateOrUpdate with exponential backoff retry -func (az *Cloud) createOrUpdatePIPWithRetry(service *v1.Service, pipResourceGroup string, pip network.PublicIPAddress) error { - return wait.ExponentialBackoff(az.RequestBackoff(), func() (bool, error) { - ctx, cancel := getContextWithCancel() - defer cancel() - - rerr := az.PublicIPAddressesClient.CreateOrUpdate(ctx, pipResourceGroup, *pip.Name, pip) - klog.V(10).Infof("PublicIPAddressesClient.CreateOrUpdate(%s, %s): end", pipResourceGroup, *pip.Name) - if rerr != nil { - klog.Errorf("PublicIPAddressesClient.CreateOrUpdate(%s, %s) failed: %s", pipResourceGroup, *pip.Name, rerr.Error().Error()) - az.Event(service, v1.EventTypeWarning, "CreateOrUpdatePublicIPAddress", rerr.Error().Error()) - return !rerr.Retriable, rerr.Error() - } - - return true, nil - }) + return nil } // CreateOrUpdateInterface invokes az.PublicIPAddressesClient.CreateOrUpdate with exponential backoff retry func (az *Cloud) CreateOrUpdateInterface(service *v1.Service, nic network.Interface) error { - if az.Config.shouldOmitCloudProviderBackoff() { - ctx, cancel := getContextWithCancel() - defer cancel() + ctx, cancel := getContextWithCancel() + defer cancel() - rerr := az.InterfacesClient.CreateOrUpdate(ctx, az.ResourceGroup, *nic.Name, nic) - klog.V(10).Infof("InterfacesClient.CreateOrUpdate(%s): end", *nic.Name) - if rerr != nil { - klog.Errorf("InterfacesClient.CreateOrUpdate(%s) failed: %s", *nic.Name, rerr.Error().Error()) - az.Event(service, v1.EventTypeWarning, "CreateOrUpdateInterface", rerr.Error().Error()) - return rerr.Error() - } - - return nil + rerr := az.InterfacesClient.CreateOrUpdate(ctx, az.ResourceGroup, *nic.Name, nic) + klog.V(10).Infof("InterfacesClient.CreateOrUpdate(%s): end", *nic.Name) + if rerr != nil { + klog.Errorf("InterfacesClient.CreateOrUpdate(%s) failed: %s", *nic.Name, rerr.Error().Error()) + az.Event(service, v1.EventTypeWarning, "CreateOrUpdateInterface", rerr.Error().Error()) + return rerr.Error() } - return az.createOrUpdateInterfaceWithRetry(service, nic) -} - -// createOrUpdateInterfaceWithRetry invokes az.PublicIPAddressesClient.CreateOrUpdate with exponential backoff retry -func (az *Cloud) createOrUpdateInterfaceWithRetry(service *v1.Service, nic network.Interface) error { - return wait.ExponentialBackoff(az.RequestBackoff(), func() (bool, error) { - ctx, cancel := getContextWithCancel() - defer cancel() - - rerr := az.InterfacesClient.CreateOrUpdate(ctx, az.ResourceGroup, *nic.Name, nic) - klog.V(10).Infof("InterfacesClient.CreateOrUpdate(%s): end", *nic.Name) - if rerr != nil { - klog.Errorf("InterfacesClient.CreateOrUpdate(%s) faild: %s", *nic.Name, rerr.Error().Error()) - az.Event(service, v1.EventTypeWarning, "CreateOrUpdateInterface", rerr.Error().Error()) - return !rerr.Retriable, rerr.Error() - } - - return true, nil - }) + return nil } // DeletePublicIP invokes az.PublicIPAddressesClient.Delete with exponential backoff retry func (az *Cloud) DeletePublicIP(service *v1.Service, pipResourceGroup string, pipName string) error { - if az.Config.shouldOmitCloudProviderBackoff() { - ctx, cancel := getContextWithCancel() - defer cancel() + ctx, cancel := getContextWithCancel() + defer cancel() - rerr := az.PublicIPAddressesClient.Delete(ctx, pipResourceGroup, pipName) - if rerr != nil { - klog.Errorf("PublicIPAddressesClient.Delete(%s) failed: %s", pipName, rerr.Error().Error()) - az.Event(service, v1.EventTypeWarning, "DeletePublicIPAddress", rerr.Error().Error()) - return rerr.Error() - } - - return nil + rerr := az.PublicIPAddressesClient.Delete(ctx, pipResourceGroup, pipName) + if rerr != nil { + klog.Errorf("PublicIPAddressesClient.Delete(%s) failed: %s", pipName, rerr.Error().Error()) + az.Event(service, v1.EventTypeWarning, "DeletePublicIPAddress", rerr.Error().Error()) + return rerr.Error() } - return az.deletePublicIPWithRetry(service, pipResourceGroup, pipName) -} - -// deletePublicIPWithRetry invokes az.PublicIPAddressesClient.Delete with exponential backoff retry -func (az *Cloud) deletePublicIPWithRetry(service *v1.Service, pipResourceGroup string, pipName string) error { - return wait.ExponentialBackoff(az.RequestBackoff(), func() (bool, error) { - ctx, cancel := getContextWithCancel() - defer cancel() - - rerr := az.PublicIPAddressesClient.Delete(ctx, pipResourceGroup, pipName) - if rerr != nil { - klog.Errorf("PublicIPAddressesClient.Delete(%s) failed: %s", pipName, rerr.Error().Error()) - az.Event(service, v1.EventTypeWarning, "DeletePublicIPAddress", rerr.Error().Error()) - return !rerr.Retriable, rerr.Error() - } - - return true, nil - }) + return nil } // DeleteLB invokes az.LoadBalancerClient.Delete with exponential backoff retry func (az *Cloud) DeleteLB(service *v1.Service, lbName string) error { - if az.Config.shouldOmitCloudProviderBackoff() { - ctx, cancel := getContextWithCancel() - defer cancel() + ctx, cancel := getContextWithCancel() + defer cancel() - rgName := az.getLoadBalancerResourceGroup() - rerr := az.LoadBalancerClient.Delete(ctx, rgName, lbName) - if rerr == nil { - // Invalidate the cache right after updating - az.lbCache.Delete(lbName) - return nil - } - - klog.Errorf("LoadBalancerClient.Delete(%s) failed: %s", lbName, rerr.Error().Error()) - az.Event(service, v1.EventTypeWarning, "DeleteLoadBalancer", rerr.Error().Error()) - return rerr.Error() + rgName := az.getLoadBalancerResourceGroup() + rerr := az.LoadBalancerClient.Delete(ctx, rgName, lbName) + if rerr == nil { + // Invalidate the cache right after updating + az.lbCache.Delete(lbName) + return nil } - return az.deleteLBWithRetry(service, lbName) -} - -// deleteLBWithRetry invokes az.LoadBalancerClient.Delete with exponential backoff retry -func (az *Cloud) deleteLBWithRetry(service *v1.Service, lbName string) error { - return wait.ExponentialBackoff(az.RequestBackoff(), func() (bool, error) { - ctx, cancel := getContextWithCancel() - defer cancel() - - rgName := az.getLoadBalancerResourceGroup() - rerr := az.LoadBalancerClient.Delete(ctx, rgName, lbName) - if rerr == nil { - // Invalidate the cache right after deleting - az.lbCache.Delete(lbName) - return true, nil - } - - klog.Errorf("LoadBalancerClient.Delete(%s) failed: %s", lbName, rerr.Error().Error()) - az.Event(service, v1.EventTypeWarning, "CreateOrUpdateInterface", rerr.Error().Error()) - return !rerr.Retriable, rerr.Error() - }) + klog.Errorf("LoadBalancerClient.Delete(%s) failed: %s", lbName, rerr.Error().Error()) + az.Event(service, v1.EventTypeWarning, "DeleteLoadBalancer", rerr.Error().Error()) + return rerr.Error() } // CreateOrUpdateRouteTable invokes az.RouteTablesClient.CreateOrUpdate with exponential backoff retry func (az *Cloud) CreateOrUpdateRouteTable(routeTable network.RouteTable) error { - if az.Config.shouldOmitCloudProviderBackoff() { - ctx, cancel := getContextWithCancel() - defer cancel() + ctx, cancel := getContextWithCancel() + defer cancel() - rerr := az.RouteTablesClient.CreateOrUpdate(ctx, az.RouteTableResourceGroup, az.RouteTableName, routeTable, to.String(routeTable.Etag)) - if rerr == nil { - // Invalidate the cache right after updating - az.rtCache.Delete(*routeTable.Name) - return nil - } - - // Invalidate the cache because etag mismatch. - if rerr.HTTPStatusCode == http.StatusPreconditionFailed { - az.rtCache.Delete(*routeTable.Name) - } - // Invalidate the cache because another new operation has canceled the current request. - if strings.Contains(strings.ToLower(rerr.Error().Error()), operationCancledErrorMessage) { - az.rtCache.Delete(*routeTable.Name) - } - klog.Errorf("RouteTablesClient.CreateOrUpdate(%s) failed: %v", az.RouteTableName, rerr.Error()) - return rerr.Error() + rerr := az.RouteTablesClient.CreateOrUpdate(ctx, az.RouteTableResourceGroup, az.RouteTableName, routeTable, to.String(routeTable.Etag)) + if rerr == nil { + // Invalidate the cache right after updating + az.rtCache.Delete(*routeTable.Name) + return nil } - return az.createOrUpdateRouteTableWithRetry(routeTable) -} - -// createOrUpdateRouteTableWithRetry invokes az.RouteTablesClient.CreateOrUpdate with exponential backoff retry -func (az *Cloud) createOrUpdateRouteTableWithRetry(routeTable network.RouteTable) error { - return wait.ExponentialBackoff(az.RequestBackoff(), func() (bool, error) { - ctx, cancel := getContextWithCancel() - defer cancel() - - rerr := az.RouteTablesClient.CreateOrUpdate(ctx, az.RouteTableResourceGroup, az.RouteTableName, routeTable, to.String(routeTable.Etag)) - if rerr == nil { - az.rtCache.Delete(*routeTable.Name) - return true, nil - } - - // Invalidate the cache and abort backoff because ETAG precondition mismatch. - if rerr.HTTPStatusCode == http.StatusPreconditionFailed { - az.rtCache.Delete(*routeTable.Name) - return true, rerr.Error() - } - // Invalidate the cache and abort backoff because another new operation has canceled the current request. - if strings.Contains(strings.ToLower(rerr.Error().Error()), operationCancledErrorMessage) { - az.rtCache.Delete(*routeTable.Name) - return true, rerr.Error() - } - klog.Errorf("RouteTablesClient.CreateOrUpdate(%s) failed: %v", az.RouteTableName, rerr.Error()) - return !rerr.Retriable, rerr.Error() - }) + // Invalidate the cache because etag mismatch. + if rerr.HTTPStatusCode == http.StatusPreconditionFailed { + klog.V(3).Infof("Route table cache for %s is cleanup because of http.StatusPreconditionFailed", *routeTable.Name) + az.rtCache.Delete(*routeTable.Name) + } + // Invalidate the cache because another new operation has canceled the current request. + if strings.Contains(strings.ToLower(rerr.Error().Error()), operationCancledErrorMessage) { + klog.V(3).Infof("Route table cache for %s is cleanup because CreateOrUpdateRouteTable is canceld by another operation", *routeTable.Name) + az.rtCache.Delete(*routeTable.Name) + } + klog.Errorf("RouteTablesClient.CreateOrUpdate(%s) failed: %v", az.RouteTableName, rerr.Error()) + return rerr.Error() } // CreateOrUpdateRoute invokes az.RoutesClient.CreateOrUpdate with exponential backoff retry func (az *Cloud) CreateOrUpdateRoute(route network.Route) error { - if az.Config.shouldOmitCloudProviderBackoff() { - ctx, cancel := getContextWithCancel() - defer cancel() + ctx, cancel := getContextWithCancel() + defer cancel() - rerr := az.RoutesClient.CreateOrUpdate(ctx, az.RouteTableResourceGroup, az.RouteTableName, *route.Name, route, to.String(route.Etag)) - klog.V(10).Infof("RoutesClient.CreateOrUpdate(%s): end", *route.Name) - if rerr == nil { - az.rtCache.Delete(az.RouteTableName) - return nil - } - - if rerr.HTTPStatusCode == http.StatusPreconditionFailed { - az.rtCache.Delete(az.RouteTableName) - } - // Invalidate the cache because another new operation has canceled the current request. - if strings.Contains(strings.ToLower(rerr.Error().Error()), operationCancledErrorMessage) { - az.rtCache.Delete(az.RouteTableName) - } - return rerr.Error() + rerr := az.RoutesClient.CreateOrUpdate(ctx, az.RouteTableResourceGroup, az.RouteTableName, *route.Name, route, to.String(route.Etag)) + klog.V(10).Infof("RoutesClient.CreateOrUpdate(%s): end", *route.Name) + if rerr == nil { + az.rtCache.Delete(az.RouteTableName) + return nil } - return az.createOrUpdateRouteWithRetry(route) -} - -// createOrUpdateRouteWithRetry invokes az.RoutesClient.CreateOrUpdate with exponential backoff retry -func (az *Cloud) createOrUpdateRouteWithRetry(route network.Route) error { - return wait.ExponentialBackoff(az.RequestBackoff(), func() (bool, error) { - ctx, cancel := getContextWithCancel() - defer cancel() - - rerr := az.RoutesClient.CreateOrUpdate(ctx, az.RouteTableResourceGroup, az.RouteTableName, *route.Name, route, to.String(route.Etag)) - klog.V(10).Infof("RoutesClient.CreateOrUpdate(%s): end", *route.Name) - if rerr == nil { - az.rtCache.Delete(az.RouteTableName) - return true, nil - } - - // Invalidate the cache and abort backoff because ETAG precondition mismatch. - if rerr.HTTPStatusCode == http.StatusPreconditionFailed { - az.rtCache.Delete(az.RouteTableName) - return true, rerr.Error() - } - - // Invalidate the cache and abort backoff because another new operation has canceled the current request. - if strings.Contains(strings.ToLower(rerr.Error().Error()), operationCancledErrorMessage) { - az.rtCache.Delete(az.RouteTableName) - return true, rerr.Error() - } - - return !rerr.Retriable, rerr.Error() - }) + if rerr.HTTPStatusCode == http.StatusPreconditionFailed { + klog.V(3).Infof("Route cache for %s is cleanup because of http.StatusPreconditionFailed", *route.Name) + az.rtCache.Delete(az.RouteTableName) + } + // Invalidate the cache because another new operation has canceled the current request. + if strings.Contains(strings.ToLower(rerr.Error().Error()), operationCancledErrorMessage) { + klog.V(3).Infof("Route cache for %s is cleanup because CreateOrUpdateRouteTable is canceld by another operation", *route.Name) + az.rtCache.Delete(az.RouteTableName) + } + return rerr.Error() } // DeleteRouteWithName invokes az.RoutesClient.CreateOrUpdate with exponential backoff retry func (az *Cloud) DeleteRouteWithName(routeName string) error { - if az.Config.shouldOmitCloudProviderBackoff() { - ctx, cancel := getContextWithCancel() - defer cancel() + ctx, cancel := getContextWithCancel() + defer cancel() - rerr := az.RoutesClient.Delete(ctx, az.RouteTableResourceGroup, az.RouteTableName, routeName) - klog.V(10).Infof("RoutesClient.Delete(%s,%s): end", az.RouteTableName, routeName) - if rerr == nil { - return nil - } - - klog.Errorf("RoutesClient.Delete(%s, %s) failed: %v", az.RouteTableName, routeName, rerr.Error()) - return rerr.Error() + rerr := az.RoutesClient.Delete(ctx, az.RouteTableResourceGroup, az.RouteTableName, routeName) + klog.V(10).Infof("RoutesClient.Delete(%s,%s): end", az.RouteTableName, routeName) + if rerr == nil { + return nil } - return az.deleteRouteWithRetry(routeName) -} - -// deleteRouteWithRetry invokes az.RoutesClient.Delete with exponential backoff retry -func (az *Cloud) deleteRouteWithRetry(routeName string) error { - return wait.ExponentialBackoff(az.RequestBackoff(), func() (bool, error) { - ctx, cancel := getContextWithCancel() - defer cancel() - - rerr := az.RoutesClient.Delete(ctx, az.RouteTableResourceGroup, az.RouteTableName, routeName) - klog.V(10).Infof("RoutesClient.Delete(%s,%s): end", az.RouteTableName, routeName) - if rerr == nil { - return true, nil - } - - klog.Errorf("RoutesClient.Delete(%s, %s) failed: %v", az.RouteTableName, routeName, rerr.Error()) - return !rerr.Retriable, rerr.Error() - }) + klog.Errorf("RoutesClient.Delete(%s, %s) failed: %v", az.RouteTableName, routeName, rerr.Error()) + return rerr.Error() } // CreateOrUpdateVMSS invokes az.VirtualMachineScaleSetsClient.Update(). diff --git a/staging/src/k8s.io/legacy-cloud-providers/azure/azure_client.go b/staging/src/k8s.io/legacy-cloud-providers/azure/azure_client.go index ca196afde6f..87323dbc5be 100644 --- a/staging/src/k8s.io/legacy-cloud-providers/azure/azure_client.go +++ b/staging/src/k8s.io/legacy-cloud-providers/azure/azure_client.go @@ -21,7 +21,6 @@ package azure import ( "context" "fmt" - "net/http" "time" "github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-07-01/compute" @@ -146,1029 +145,10 @@ type VirtualMachineSizesClient interface { List(ctx context.Context, location string) (result compute.VirtualMachineSizeListResult, rerr *retry.Error) } -// azVirtualMachinesClient implements VirtualMachinesClient. -type azVirtualMachinesClient struct { - client compute.VirtualMachinesClient - rateLimiterReader flowcontrol.RateLimiter - rateLimiterWriter flowcontrol.RateLimiter -} - func getContextWithCancel() (context.Context, context.CancelFunc) { return context.WithCancel(context.Background()) } -func newAzVirtualMachinesClient(config *azclients.ClientConfig) *azVirtualMachinesClient { - virtualMachinesClient := compute.NewVirtualMachinesClient(config.SubscriptionID) - virtualMachinesClient.BaseURI = config.ResourceManagerEndpoint - virtualMachinesClient.Authorizer = autorest.NewBearerAuthorizer(config.ServicePrincipalToken) - virtualMachinesClient.PollingDelay = 5 * time.Second - if config.ShouldOmitCloudProviderBackoff { - virtualMachinesClient.RetryAttempts = config.CloudProviderBackoffRetries - virtualMachinesClient.RetryDuration = time.Duration(config.CloudProviderBackoffDuration) * time.Second - } - configureUserAgent(&virtualMachinesClient.Client) - - klog.V(2).Infof("Azure VirtualMachinesClient (read ops) using rate limit config: QPS=%g, bucket=%d", - config.RateLimitConfig.CloudProviderRateLimitQPS, - config.RateLimitConfig.CloudProviderRateLimitBucket) - klog.V(2).Infof("Azure VirtualMachinesClient (write ops) using rate limit config: QPS=%g, bucket=%d", - config.RateLimitConfig.CloudProviderRateLimitQPSWrite, - config.RateLimitConfig.CloudProviderRateLimitBucketWrite) - rateLimiterReader, rateLimiterWriter := azclients.NewRateLimiter(config.RateLimitConfig) - return &azVirtualMachinesClient{ - rateLimiterReader: rateLimiterReader, - rateLimiterWriter: rateLimiterWriter, - client: virtualMachinesClient, - } -} - -func (az *azVirtualMachinesClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, VMName string, parameters compute.VirtualMachine, source string) *retry.Error { - // /* Write rate limiting */ - mc := metrics.NewMetricContext("vm", "create_or_update", resourceGroupName, az.client.SubscriptionID, source) - if !az.rateLimiterWriter.TryAccept() { - mc.RateLimitedCount() - return createRateLimitErr(true, "VMCreateOrUpdate") - } - - klog.V(10).Infof("azVirtualMachinesClient.CreateOrUpdate(%q, %q): start", resourceGroupName, VMName) - defer func() { - klog.V(10).Infof("azVirtualMachinesClient.CreateOrUpdate(%q, %q): end", resourceGroupName, VMName) - }() - - future, err := az.client.CreateOrUpdate(ctx, resourceGroupName, VMName, parameters) - if err != nil { - return retry.GetError(future.Response(), err) - } - - err = future.WaitForCompletionRef(ctx, az.client.Client) - mc.Observe(err) - return retry.GetError(future.Response(), err) -} - -func (az *azVirtualMachinesClient) Update(ctx context.Context, resourceGroupName string, VMName string, parameters compute.VirtualMachineUpdate, source string) *retry.Error { - mc := metrics.NewMetricContext("vm", "update", resourceGroupName, az.client.SubscriptionID, source) - // /* Write rate limiting */ - if !az.rateLimiterWriter.TryAccept() { - mc.RateLimitedCount() - return createRateLimitErr(true, "VMUpdate") - } - - klog.V(10).Infof("azVirtualMachinesClient.Update(%q, %q): start", resourceGroupName, VMName) - defer func() { - klog.V(10).Infof("azVirtualMachinesClient.Update(%q, %q): end", resourceGroupName, VMName) - }() - - future, err := az.client.Update(ctx, resourceGroupName, VMName, parameters) - if err != nil { - return retry.GetError(future.Response(), err) - } - - err = future.WaitForCompletionRef(ctx, az.client.Client) - mc.Observe(err) - return retry.GetError(future.Response(), err) -} - -func (az *azVirtualMachinesClient) Get(ctx context.Context, resourceGroupName string, VMName string, expand compute.InstanceViewTypes) (result compute.VirtualMachine, rerr *retry.Error) { - mc := metrics.NewMetricContext("vm", "get", resourceGroupName, az.client.SubscriptionID, "") - if !az.rateLimiterReader.TryAccept() { - mc.RateLimitedCount() - rerr = createRateLimitErr(false, "VMGet") - return - } - - klog.V(10).Infof("azVirtualMachinesClient.Get(%q, %q): start", resourceGroupName, VMName) - defer func() { - klog.V(10).Infof("azVirtualMachinesClient.Get(%q, %q): end", resourceGroupName, VMName) - }() - - var err error - result, err = az.client.Get(ctx, resourceGroupName, VMName, expand) - mc.Observe(err) - return result, retry.GetError(result.Response.Response, err) -} - -func (az *azVirtualMachinesClient) List(ctx context.Context, resourceGroupName string) (result []compute.VirtualMachine, rerr *retry.Error) { - mc := metrics.NewMetricContext("vm", "list", resourceGroupName, az.client.SubscriptionID, "") - if !az.rateLimiterReader.TryAccept() { - mc.RateLimitedCount() - rerr = createRateLimitErr(false, "VMList") - return - } - - klog.V(10).Infof("azVirtualMachinesClient.List(%q): start", resourceGroupName) - defer func() { - klog.V(10).Infof("azVirtualMachinesClient.List(%q): end", resourceGroupName) - }() - - iterator, err := az.client.ListComplete(ctx, resourceGroupName) - mc.Observe(err) - if err != nil { - return nil, retry.GetRetriableError(err) - } - - result = make([]compute.VirtualMachine, 0) - for ; iterator.NotDone(); err = iterator.Next() { - if err != nil { - return nil, retry.GetRetriableError(err) - } - - result = append(result, iterator.Value()) - } - - return result, nil -} - -// azInterfacesClient implements InterfacesClient. -type azInterfacesClient struct { - client network.InterfacesClient - rateLimiterReader flowcontrol.RateLimiter - rateLimiterWriter flowcontrol.RateLimiter -} - -func newAzInterfacesClient(config *azclients.ClientConfig) *azInterfacesClient { - interfacesClient := network.NewInterfacesClient(config.SubscriptionID) - interfacesClient.BaseURI = config.ResourceManagerEndpoint - interfacesClient.Authorizer = autorest.NewBearerAuthorizer(config.ServicePrincipalToken) - interfacesClient.PollingDelay = 5 * time.Second - if config.ShouldOmitCloudProviderBackoff { - interfacesClient.RetryAttempts = config.CloudProviderBackoffRetries - interfacesClient.RetryDuration = time.Duration(config.CloudProviderBackoffDuration) * time.Second - } - configureUserAgent(&interfacesClient.Client) - - klog.V(2).Infof("Azure InterfacesClient (read ops) using rate limit config: QPS=%g, bucket=%d", - config.RateLimitConfig.CloudProviderRateLimitQPS, - config.RateLimitConfig.CloudProviderRateLimitBucket) - klog.V(2).Infof("Azure InterfacesClient (write ops) using rate limit config: QPS=%g, bucket=%d", - config.RateLimitConfig.CloudProviderRateLimitQPSWrite, - config.RateLimitConfig.CloudProviderRateLimitBucketWrite) - rateLimiterReader, rateLimiterWriter := azclients.NewRateLimiter(config.RateLimitConfig) - return &azInterfacesClient{ - rateLimiterReader: rateLimiterReader, - rateLimiterWriter: rateLimiterWriter, - client: interfacesClient, - } -} - -func (az *azInterfacesClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, networkInterfaceName string, parameters network.Interface) *retry.Error { - mc := metrics.NewMetricContext("interfaces", "create_or_update", resourceGroupName, az.client.SubscriptionID, "") - /* Write rate limiting */ - if !az.rateLimiterWriter.TryAccept() { - mc.RateLimitedCount() - return createRateLimitErr(true, "NiCreateOrUpdate") - } - - klog.V(10).Infof("azInterfacesClient.CreateOrUpdate(%q,%q): start", resourceGroupName, networkInterfaceName) - defer func() { - klog.V(10).Infof("azInterfacesClient.CreateOrUpdate(%q,%q): end", resourceGroupName, networkInterfaceName) - }() - - future, err := az.client.CreateOrUpdate(ctx, resourceGroupName, networkInterfaceName, parameters) - if err != nil { - return retry.GetError(future.Response(), mc.Observe(err)) - } - - err = future.WaitForCompletionRef(ctx, az.client.Client) - return retry.GetError(future.Response(), mc.Observe(err)) -} - -func (az *azInterfacesClient) Get(ctx context.Context, resourceGroupName string, networkInterfaceName string, expand string) (result network.Interface, rerr *retry.Error) { - mc := metrics.NewMetricContext("interfaces", "get", resourceGroupName, az.client.SubscriptionID, "") - if !az.rateLimiterReader.TryAccept() { - mc.RateLimitedCount() - rerr = createRateLimitErr(false, "NicGet") - return - } - - klog.V(10).Infof("azInterfacesClient.Get(%q,%q): start", resourceGroupName, networkInterfaceName) - defer func() { - klog.V(10).Infof("azInterfacesClient.Get(%q,%q): end", resourceGroupName, networkInterfaceName) - }() - - var err error - result, err = az.client.Get(ctx, resourceGroupName, networkInterfaceName, expand) - mc.Observe(err) - return result, retry.GetError(result.Response.Response, err) -} - -func (az *azInterfacesClient) GetVirtualMachineScaleSetNetworkInterface(ctx context.Context, resourceGroupName string, virtualMachineScaleSetName string, virtualmachineIndex string, networkInterfaceName string, expand string) (result network.Interface, rerr *retry.Error) { - mc := metrics.NewMetricContext("interfaces", "get_vmss_ni", resourceGroupName, az.client.SubscriptionID, "") - if !az.rateLimiterReader.TryAccept() { - mc.RateLimitedCount() - rerr = createRateLimitErr(false, "NicGetVirtualMachineScaleSetNetworkInterface") - return - } - - klog.V(10).Infof("azInterfacesClient.GetVirtualMachineScaleSetNetworkInterface(%q,%q,%q,%q): start", resourceGroupName, virtualMachineScaleSetName, virtualmachineIndex, networkInterfaceName) - defer func() { - klog.V(10).Infof("azInterfacesClient.GetVirtualMachineScaleSetNetworkInterface(%q,%q,%q,%q): end", resourceGroupName, virtualMachineScaleSetName, virtualmachineIndex, networkInterfaceName) - }() - - var err error - result, err = az.client.GetVirtualMachineScaleSetNetworkInterface(ctx, resourceGroupName, virtualMachineScaleSetName, virtualmachineIndex, networkInterfaceName, expand) - mc.Observe(err) - return result, retry.GetError(result.Response.Response, err) -} - -// azLoadBalancersClient implements LoadBalancersClient. -type azLoadBalancersClient struct { - client network.LoadBalancersClient - rateLimiterReader flowcontrol.RateLimiter - rateLimiterWriter flowcontrol.RateLimiter -} - -func newAzLoadBalancersClient(config *azclients.ClientConfig) *azLoadBalancersClient { - loadBalancerClient := network.NewLoadBalancersClient(config.SubscriptionID) - loadBalancerClient.BaseURI = config.ResourceManagerEndpoint - loadBalancerClient.Authorizer = autorest.NewBearerAuthorizer(config.ServicePrincipalToken) - loadBalancerClient.PollingDelay = 5 * time.Second - if config.ShouldOmitCloudProviderBackoff { - loadBalancerClient.RetryAttempts = config.CloudProviderBackoffRetries - loadBalancerClient.RetryDuration = time.Duration(config.CloudProviderBackoffDuration) * time.Second - } - configureUserAgent(&loadBalancerClient.Client) - - klog.V(2).Infof("Azure LoadBalancersClient (read ops) using rate limit config: QPS=%g, bucket=%d", - config.RateLimitConfig.CloudProviderRateLimitQPS, - config.RateLimitConfig.CloudProviderRateLimitBucket) - klog.V(2).Infof("Azure LoadBalancersClient (write ops) using rate limit config: QPS=%g, bucket=%d", - config.RateLimitConfig.CloudProviderRateLimitQPSWrite, - config.RateLimitConfig.CloudProviderRateLimitBucketWrite) - rateLimiterReader, rateLimiterWriter := azclients.NewRateLimiter(config.RateLimitConfig) - return &azLoadBalancersClient{ - rateLimiterReader: rateLimiterReader, - rateLimiterWriter: rateLimiterWriter, - client: loadBalancerClient, - } -} - -func (az *azLoadBalancersClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, loadBalancerName string, parameters network.LoadBalancer, etag string) *retry.Error { - mc := metrics.NewMetricContext("load_balancers", "create_or_update", resourceGroupName, az.client.SubscriptionID, "") - /* Write rate limiting */ - if !az.rateLimiterWriter.TryAccept() { - mc.RateLimitedCount() - return createRateLimitErr(true, "LBCreateOrUpdate") - } - - klog.V(10).Infof("azLoadBalancersClient.CreateOrUpdate(%q,%q): start", resourceGroupName, loadBalancerName) - defer func() { - klog.V(10).Infof("azLoadBalancersClient.CreateOrUpdate(%q,%q): end", resourceGroupName, loadBalancerName) - }() - - req, err := az.createOrUpdatePreparer(ctx, resourceGroupName, loadBalancerName, parameters, etag) - if err != nil { - return retry.NewError(false, mc.Observe(err)) - } - - future, err := az.client.CreateOrUpdateSender(req) - if err != nil { - return retry.GetError(future.Response(), mc.Observe(err)) - } - - err = future.WaitForCompletionRef(ctx, az.client.Client) - return retry.GetError(future.Response(), mc.Observe(err)) -} - -// createOrUpdatePreparer prepares the CreateOrUpdate request. -func (az *azLoadBalancersClient) createOrUpdatePreparer(ctx context.Context, resourceGroupName string, loadBalancerName string, parameters network.LoadBalancer, etag string) (*http.Request, error) { - pathParameters := map[string]interface{}{ - "loadBalancerName": autorest.Encode("path", loadBalancerName), - "resourceGroupName": autorest.Encode("path", resourceGroupName), - "subscriptionId": autorest.Encode("path", az.client.SubscriptionID), - } - - queryParameters := map[string]interface{}{ - "api-version": azureNetworkAPIVersion, - } - - preparerDecorators := []autorest.PrepareDecorator{ - autorest.AsContentType("application/json; charset=utf-8"), - autorest.AsPut(), - autorest.WithBaseURL(az.client.BaseURI), - autorest.WithPathParameters("/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Network/loadBalancers/{loadBalancerName}", pathParameters), - autorest.WithJSON(parameters), - autorest.WithQueryParameters(queryParameters), - } - if etag != "" { - preparerDecorators = append(preparerDecorators, autorest.WithHeader("If-Match", autorest.String(etag))) - } - preparer := autorest.CreatePreparer(preparerDecorators...) - return preparer.Prepare((&http.Request{}).WithContext(ctx)) -} - -func (az *azLoadBalancersClient) Delete(ctx context.Context, resourceGroupName string, loadBalancerName string) *retry.Error { - mc := metrics.NewMetricContext("load_balancers", "delete", resourceGroupName, az.client.SubscriptionID, "") - /* Write rate limiting */ - if !az.rateLimiterWriter.TryAccept() { - mc.RateLimitedCount() - return createRateLimitErr(true, "LBDelete") - } - - klog.V(10).Infof("azLoadBalancersClient.Delete(%q,%q): start", resourceGroupName, loadBalancerName) - defer func() { - klog.V(10).Infof("azLoadBalancersClient.Delete(%q,%q): end", resourceGroupName, loadBalancerName) - }() - - future, err := az.client.Delete(ctx, resourceGroupName, loadBalancerName) - if err != nil { - return retry.GetStatusNotFoundAndForbiddenIgnoredError(future.Response(), mc.Observe(err)) - } - - err = future.WaitForCompletionRef(ctx, az.client.Client) - return retry.GetStatusNotFoundAndForbiddenIgnoredError(future.Response(), mc.Observe(err)) -} - -func (az *azLoadBalancersClient) Get(ctx context.Context, resourceGroupName string, loadBalancerName string, expand string) (result network.LoadBalancer, rerr *retry.Error) { - mc := metrics.NewMetricContext("load_balancers", "get", resourceGroupName, az.client.SubscriptionID, "") - if !az.rateLimiterReader.TryAccept() { - mc.RateLimitedCount() - rerr = createRateLimitErr(false, "LBGet") - return - } - - klog.V(10).Infof("azLoadBalancersClient.Get(%q,%q): start", resourceGroupName, loadBalancerName) - defer func() { - klog.V(10).Infof("azLoadBalancersClient.Get(%q,%q): end", resourceGroupName, loadBalancerName) - }() - - var err error - result, err = az.client.Get(ctx, resourceGroupName, loadBalancerName, expand) - mc.Observe(err) - return result, retry.GetError(result.Response.Response, err) -} - -func (az *azLoadBalancersClient) List(ctx context.Context, resourceGroupName string) ([]network.LoadBalancer, *retry.Error) { - mc := metrics.NewMetricContext("load_balancers", "list", resourceGroupName, az.client.SubscriptionID, "") - if !az.rateLimiterReader.TryAccept() { - mc.RateLimitedCount() - rerr := createRateLimitErr(false, "LBList") - return nil, rerr - } - - klog.V(10).Infof("azLoadBalancersClient.List(%q): start", resourceGroupName) - defer func() { - klog.V(10).Infof("azLoadBalancersClient.List(%q): end", resourceGroupName) - }() - - iterator, err := az.client.ListComplete(ctx, resourceGroupName) - mc.Observe(err) - if err != nil { - return nil, retry.GetRetriableError(err) - } - - result := make([]network.LoadBalancer, 0) - for ; iterator.NotDone(); err = iterator.Next() { - if err != nil { - return nil, retry.GetRetriableError(err) - } - - result = append(result, iterator.Value()) - } - - return result, nil -} - -// azPublicIPAddressesClient implements PublicIPAddressesClient. -type azPublicIPAddressesClient struct { - client network.PublicIPAddressesClient - rateLimiterReader flowcontrol.RateLimiter - rateLimiterWriter flowcontrol.RateLimiter -} - -func newAzPublicIPAddressesClient(config *azclients.ClientConfig) *azPublicIPAddressesClient { - publicIPAddressClient := network.NewPublicIPAddressesClient(config.SubscriptionID) - publicIPAddressClient.BaseURI = config.ResourceManagerEndpoint - publicIPAddressClient.Authorizer = autorest.NewBearerAuthorizer(config.ServicePrincipalToken) - publicIPAddressClient.PollingDelay = 5 * time.Second - if config.ShouldOmitCloudProviderBackoff { - publicIPAddressClient.RetryAttempts = config.CloudProviderBackoffRetries - publicIPAddressClient.RetryDuration = time.Duration(config.CloudProviderBackoffDuration) * time.Second - } - configureUserAgent(&publicIPAddressClient.Client) - - klog.V(2).Infof("Azure PublicIPAddressesClient (read ops) using rate limit config: QPS=%g, bucket=%d", - config.RateLimitConfig.CloudProviderRateLimitQPS, - config.RateLimitConfig.CloudProviderRateLimitBucket) - klog.V(2).Infof("Azure PublicIPAddressesClient (write ops) using rate limit config: QPS=%g, bucket=%d", - config.RateLimitConfig.CloudProviderRateLimitQPSWrite, - config.RateLimitConfig.CloudProviderRateLimitBucketWrite) - rateLimiterReader, rateLimiterWriter := azclients.NewRateLimiter(config.RateLimitConfig) - return &azPublicIPAddressesClient{ - rateLimiterReader: rateLimiterReader, - rateLimiterWriter: rateLimiterWriter, - client: publicIPAddressClient, - } -} - -func (az *azPublicIPAddressesClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, publicIPAddressName string, parameters network.PublicIPAddress) *retry.Error { - mc := metrics.NewMetricContext("public_ip_addresses", "create_or_update", resourceGroupName, az.client.SubscriptionID, "") - /* Write rate limiting */ - if !az.rateLimiterWriter.TryAccept() { - mc.RateLimitedCount() - return createRateLimitErr(true, "PublicIPCreateOrUpdate") - } - - klog.V(10).Infof("azPublicIPAddressesClient.CreateOrUpdate(%q,%q): start", resourceGroupName, publicIPAddressName) - defer func() { - klog.V(10).Infof("azPublicIPAddressesClient.CreateOrUpdate(%q,%q): end", resourceGroupName, publicIPAddressName) - }() - - future, err := az.client.CreateOrUpdate(ctx, resourceGroupName, publicIPAddressName, parameters) - if err != nil { - return retry.GetError(future.Response(), mc.Observe(err)) - } - - err = future.WaitForCompletionRef(ctx, az.client.Client) - return retry.GetError(future.Response(), mc.Observe(err)) -} - -func (az *azPublicIPAddressesClient) Delete(ctx context.Context, resourceGroupName string, publicIPAddressName string) *retry.Error { - mc := metrics.NewMetricContext("public_ip_addresses", "delete", resourceGroupName, az.client.SubscriptionID, "") - /* Write rate limiting */ - if !az.rateLimiterWriter.TryAccept() { - mc.RateLimitedCount() - return createRateLimitErr(true, "PublicIPDelete") - } - - klog.V(10).Infof("azPublicIPAddressesClient.Delete(%q,%q): start", resourceGroupName, publicIPAddressName) - defer func() { - klog.V(10).Infof("azPublicIPAddressesClient.Delete(%q,%q): end", resourceGroupName, publicIPAddressName) - }() - - future, err := az.client.Delete(ctx, resourceGroupName, publicIPAddressName) - if err != nil { - return retry.GetStatusNotFoundAndForbiddenIgnoredError(future.Response(), mc.Observe(err)) - } - - err = future.WaitForCompletionRef(ctx, az.client.Client) - return retry.GetStatusNotFoundAndForbiddenIgnoredError(future.Response(), mc.Observe(err)) -} - -func (az *azPublicIPAddressesClient) Get(ctx context.Context, resourceGroupName string, publicIPAddressName string, expand string) (result network.PublicIPAddress, rerr *retry.Error) { - mc := metrics.NewMetricContext("public_ip_addresses", "get", resourceGroupName, az.client.SubscriptionID, "") - if !az.rateLimiterReader.TryAccept() { - mc.RateLimitedCount() - rerr = createRateLimitErr(false, "PublicIPGet") - return - } - - klog.V(10).Infof("azPublicIPAddressesClient.Get(%q,%q): start", resourceGroupName, publicIPAddressName) - defer func() { - klog.V(10).Infof("azPublicIPAddressesClient.Get(%q,%q): end", resourceGroupName, publicIPAddressName) - }() - - var err error - result, err = az.client.Get(ctx, resourceGroupName, publicIPAddressName, expand) - mc.Observe(err) - return result, retry.GetError(result.Response.Response, err) -} - -func (az *azPublicIPAddressesClient) GetVirtualMachineScaleSetPublicIPAddress(ctx context.Context, resourceGroupName string, virtualMachineScaleSetName string, virtualmachineIndex string, networkInterfaceName string, IPConfigurationName string, publicIPAddressName string, expand string) (result network.PublicIPAddress, rerr *retry.Error) { - mc := metrics.NewMetricContext("vmss_public_ip_addresses", "get", resourceGroupName, az.client.SubscriptionID, "") - if !az.rateLimiterReader.TryAccept() { - mc.RateLimitedCount() - rerr = createRateLimitErr(false, "VMSSPublicIPGet") - return - } - - klog.V(10).Infof("azPublicIPAddressesClient.GetVirtualMachineScaleSetPublicIPAddress(%q,%q): start", resourceGroupName, publicIPAddressName) - defer func() { - klog.V(10).Infof("azPublicIPAddressesClient.GetVirtualMachineScaleSetPublicIPAddress(%q,%q): end", resourceGroupName, publicIPAddressName) - }() - - var err error - result, err = az.client.GetVirtualMachineScaleSetPublicIPAddress(ctx, resourceGroupName, virtualMachineScaleSetName, virtualmachineIndex, networkInterfaceName, IPConfigurationName, publicIPAddressName, expand) - mc.Observe(err) - return result, retry.GetError(result.Response.Response, err) -} - -func (az *azPublicIPAddressesClient) List(ctx context.Context, resourceGroupName string) ([]network.PublicIPAddress, *retry.Error) { - mc := metrics.NewMetricContext("public_ip_addresses", "list", resourceGroupName, az.client.SubscriptionID, "") - if !az.rateLimiterReader.TryAccept() { - mc.RateLimitedCount() - return nil, createRateLimitErr(false, "PublicIPList") - } - - klog.V(10).Infof("azPublicIPAddressesClient.List(%q): start", resourceGroupName) - defer func() { - klog.V(10).Infof("azPublicIPAddressesClient.List(%q): end", resourceGroupName) - }() - - iterator, err := az.client.ListComplete(ctx, resourceGroupName) - mc.Observe(err) - if err != nil { - return nil, retry.GetRetriableError(err) - } - - result := make([]network.PublicIPAddress, 0) - for ; iterator.NotDone(); err = iterator.Next() { - if err != nil { - return nil, retry.GetRetriableError(err) - } - - result = append(result, iterator.Value()) - } - - return result, nil -} - -// azSubnetsClient implements SubnetsClient. -type azSubnetsClient struct { - client network.SubnetsClient - rateLimiterReader flowcontrol.RateLimiter - rateLimiterWriter flowcontrol.RateLimiter -} - -func newAzSubnetsClient(config *azclients.ClientConfig) *azSubnetsClient { - subnetsClient := network.NewSubnetsClient(config.SubscriptionID) - subnetsClient.BaseURI = config.ResourceManagerEndpoint - subnetsClient.Authorizer = autorest.NewBearerAuthorizer(config.ServicePrincipalToken) - subnetsClient.PollingDelay = 5 * time.Second - if config.ShouldOmitCloudProviderBackoff { - subnetsClient.RetryAttempts = config.CloudProviderBackoffRetries - subnetsClient.RetryDuration = time.Duration(config.CloudProviderBackoffDuration) * time.Second - } - configureUserAgent(&subnetsClient.Client) - - klog.V(2).Infof("Azure SubnetsClient (read ops) using rate limit config: QPS=%g, bucket=%d", - config.RateLimitConfig.CloudProviderRateLimitQPS, - config.RateLimitConfig.CloudProviderRateLimitBucket) - klog.V(2).Infof("Azure SubnetsClient (write ops) using rate limit config: QPS=%g, bucket=%d", - config.RateLimitConfig.CloudProviderRateLimitQPSWrite, - config.RateLimitConfig.CloudProviderRateLimitBucketWrite) - rateLimiterReader, rateLimiterWriter := azclients.NewRateLimiter(config.RateLimitConfig) - return &azSubnetsClient{ - client: subnetsClient, - rateLimiterReader: rateLimiterReader, - rateLimiterWriter: rateLimiterWriter, - } -} - -func (az *azSubnetsClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, virtualNetworkName string, subnetName string, subnetParameters network.Subnet) *retry.Error { - mc := metrics.NewMetricContext("subnets", "create_or_update", resourceGroupName, az.client.SubscriptionID, "") - /* Write rate limiting */ - if !az.rateLimiterWriter.TryAccept() { - mc.RateLimitedCount() - return createRateLimitErr(true, "SubnetCreateOrUpdate") - } - - klog.V(10).Infof("azSubnetsClient.CreateOrUpdate(%q,%q,%q): start", resourceGroupName, virtualNetworkName, subnetName) - defer func() { - klog.V(10).Infof("azSubnetsClient.CreateOrUpdate(%q,%q,%q): end", resourceGroupName, virtualNetworkName, subnetName) - }() - - future, err := az.client.CreateOrUpdate(ctx, resourceGroupName, virtualNetworkName, subnetName, subnetParameters) - if err != nil { - return retry.GetError(future.Response(), mc.Observe(err)) - } - - err = future.WaitForCompletionRef(ctx, az.client.Client) - return retry.GetError(future.Response(), mc.Observe(err)) -} - -func (az *azSubnetsClient) Delete(ctx context.Context, resourceGroupName string, virtualNetworkName string, subnetName string) *retry.Error { - mc := metrics.NewMetricContext("subnets", "delete", resourceGroupName, az.client.SubscriptionID, "") - /* Write rate limiting */ - if !az.rateLimiterWriter.TryAccept() { - mc.RateLimitedCount() - return createRateLimitErr(true, "SubnetDelete") - } - - klog.V(10).Infof("azSubnetsClient.Delete(%q,%q,%q): start", resourceGroupName, virtualNetworkName, subnetName) - defer func() { - klog.V(10).Infof("azSubnetsClient.Delete(%q,%q,%q): end", resourceGroupName, virtualNetworkName, subnetName) - }() - - future, err := az.client.Delete(ctx, resourceGroupName, virtualNetworkName, subnetName) - if err != nil { - return retry.GetStatusNotFoundAndForbiddenIgnoredError(future.Response(), mc.Observe(err)) - } - - err = future.WaitForCompletionRef(ctx, az.client.Client) - return retry.GetStatusNotFoundAndForbiddenIgnoredError(future.Response(), mc.Observe(err)) -} - -func (az *azSubnetsClient) Get(ctx context.Context, resourceGroupName string, virtualNetworkName string, subnetName string, expand string) (result network.Subnet, rerr *retry.Error) { - mc := metrics.NewMetricContext("subnets", "get", resourceGroupName, az.client.SubscriptionID, "") - if !az.rateLimiterReader.TryAccept() { - mc.RateLimitedCount() - rerr = createRateLimitErr(false, "SubnetGet") - return - } - - klog.V(10).Infof("azSubnetsClient.Get(%q,%q,%q): start", resourceGroupName, virtualNetworkName, subnetName) - defer func() { - klog.V(10).Infof("azSubnetsClient.Get(%q,%q,%q): end", resourceGroupName, virtualNetworkName, subnetName) - }() - - var err error - result, err = az.client.Get(ctx, resourceGroupName, virtualNetworkName, subnetName, expand) - mc.Observe(err) - return result, retry.GetError(result.Response.Response, err) -} - -func (az *azSubnetsClient) List(ctx context.Context, resourceGroupName string, virtualNetworkName string) ([]network.Subnet, *retry.Error) { - mc := metrics.NewMetricContext("subnets", "list", resourceGroupName, az.client.SubscriptionID, "") - if !az.rateLimiterReader.TryAccept() { - mc.RateLimitedCount() - return nil, createRateLimitErr(false, "SubnetList") - } - - klog.V(10).Infof("azSubnetsClient.List(%q,%q): start", resourceGroupName, virtualNetworkName) - defer func() { - klog.V(10).Infof("azSubnetsClient.List(%q,%q): end", resourceGroupName, virtualNetworkName) - }() - - iterator, err := az.client.ListComplete(ctx, resourceGroupName, virtualNetworkName) - mc.Observe(err) - if err != nil { - return nil, retry.GetRetriableError(err) - } - - result := make([]network.Subnet, 0) - for ; iterator.NotDone(); err = iterator.Next() { - if err != nil { - return nil, retry.GetRetriableError(err) - } - - result = append(result, iterator.Value()) - } - - return result, nil -} - -// azSecurityGroupsClient implements SecurityGroupsClient. -type azSecurityGroupsClient struct { - client network.SecurityGroupsClient - rateLimiterReader flowcontrol.RateLimiter - rateLimiterWriter flowcontrol.RateLimiter -} - -func newAzSecurityGroupsClient(config *azclients.ClientConfig) *azSecurityGroupsClient { - securityGroupsClient := network.NewSecurityGroupsClient(config.SubscriptionID) - securityGroupsClient.BaseURI = config.ResourceManagerEndpoint - securityGroupsClient.Authorizer = autorest.NewBearerAuthorizer(config.ServicePrincipalToken) - securityGroupsClient.PollingDelay = 5 * time.Second - if config.ShouldOmitCloudProviderBackoff { - securityGroupsClient.RetryAttempts = config.CloudProviderBackoffRetries - securityGroupsClient.RetryDuration = time.Duration(config.CloudProviderBackoffDuration) * time.Second - } - configureUserAgent(&securityGroupsClient.Client) - - klog.V(2).Infof("Azure SecurityGroupsClient (read ops) using rate limit config: QPS=%g, bucket=%d", - config.RateLimitConfig.CloudProviderRateLimitQPS, - config.RateLimitConfig.CloudProviderRateLimitBucket) - klog.V(2).Infof("Azure SecurityGroupsClient (write ops) using rate limit config: QPS=%g, bucket=%d", - config.RateLimitConfig.CloudProviderRateLimitQPSWrite, - config.RateLimitConfig.CloudProviderRateLimitBucketWrite) - rateLimiterReader, rateLimiterWriter := azclients.NewRateLimiter(config.RateLimitConfig) - return &azSecurityGroupsClient{ - client: securityGroupsClient, - rateLimiterReader: rateLimiterReader, - rateLimiterWriter: rateLimiterWriter, - } -} - -func (az *azSecurityGroupsClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, networkSecurityGroupName string, parameters network.SecurityGroup, etag string) *retry.Error { - mc := metrics.NewMetricContext("security_groups", "create_or_update", resourceGroupName, az.client.SubscriptionID, "") - /* Write rate limiting */ - if !az.rateLimiterWriter.TryAccept() { - mc.RateLimitedCount() - return createRateLimitErr(true, "NSGCreateOrUpdate") - } - - klog.V(10).Infof("azSecurityGroupsClient.CreateOrUpdate(%q,%q): start", resourceGroupName, networkSecurityGroupName) - defer func() { - klog.V(10).Infof("azSecurityGroupsClient.CreateOrUpdate(%q,%q): end", resourceGroupName, networkSecurityGroupName) - }() - - req, err := az.createOrUpdatePreparer(ctx, resourceGroupName, networkSecurityGroupName, parameters, etag) - if err != nil { - return retry.NewError(false, mc.Observe(err)) - } - - future, err := az.client.CreateOrUpdateSender(req) - if err != nil { - return retry.GetError(future.Response(), mc.Observe(err)) - } - - err = future.WaitForCompletionRef(ctx, az.client.Client) - return retry.GetError(future.Response(), mc.Observe(err)) -} - -// createOrUpdatePreparer prepares the CreateOrUpdate request. -func (az *azSecurityGroupsClient) createOrUpdatePreparer(ctx context.Context, resourceGroupName string, networkSecurityGroupName string, parameters network.SecurityGroup, etag string) (*http.Request, error) { - pathParameters := map[string]interface{}{ - "networkSecurityGroupName": autorest.Encode("path", networkSecurityGroupName), - "resourceGroupName": autorest.Encode("path", resourceGroupName), - "subscriptionId": autorest.Encode("path", az.client.SubscriptionID), - } - - queryParameters := map[string]interface{}{ - "api-version": azureNetworkAPIVersion, - } - - preparerDecorators := []autorest.PrepareDecorator{ - autorest.AsContentType("application/json; charset=utf-8"), - autorest.AsPut(), - autorest.WithBaseURL(az.client.BaseURI), - autorest.WithPathParameters("/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Network/networkSecurityGroups/{networkSecurityGroupName}", pathParameters), - autorest.WithJSON(parameters), - autorest.WithQueryParameters(queryParameters), - } - if etag != "" { - preparerDecorators = append(preparerDecorators, autorest.WithHeader("If-Match", autorest.String(etag))) - } - preparer := autorest.CreatePreparer(preparerDecorators...) - return preparer.Prepare((&http.Request{}).WithContext(ctx)) -} - -func (az *azSecurityGroupsClient) Delete(ctx context.Context, resourceGroupName string, networkSecurityGroupName string) *retry.Error { - mc := metrics.NewMetricContext("security_groups", "delete", resourceGroupName, az.client.SubscriptionID, "") - /* Write rate limiting */ - if !az.rateLimiterWriter.TryAccept() { - mc.RateLimitedCount() - return createRateLimitErr(true, "NSGDelete") - } - - klog.V(10).Infof("azSecurityGroupsClient.Delete(%q,%q): start", resourceGroupName, networkSecurityGroupName) - defer func() { - klog.V(10).Infof("azSecurityGroupsClient.Delete(%q,%q): end", resourceGroupName, networkSecurityGroupName) - }() - - future, err := az.client.Delete(ctx, resourceGroupName, networkSecurityGroupName) - if err != nil { - return retry.GetStatusNotFoundAndForbiddenIgnoredError(future.Response(), mc.Observe(err)) - } - - err = future.WaitForCompletionRef(ctx, az.client.Client) - return retry.GetStatusNotFoundAndForbiddenIgnoredError(future.Response(), mc.Observe(err)) -} - -func (az *azSecurityGroupsClient) Get(ctx context.Context, resourceGroupName string, networkSecurityGroupName string, expand string) (result network.SecurityGroup, rerr *retry.Error) { - mc := metrics.NewMetricContext("security_groups", "get", resourceGroupName, az.client.SubscriptionID, "") - if !az.rateLimiterReader.TryAccept() { - mc.RateLimitedCount() - rerr = createRateLimitErr(false, "NSGGet") - return - } - - klog.V(10).Infof("azSecurityGroupsClient.Get(%q,%q): start", resourceGroupName, networkSecurityGroupName) - defer func() { - klog.V(10).Infof("azSecurityGroupsClient.Get(%q,%q): end", resourceGroupName, networkSecurityGroupName) - }() - - var err error - result, err = az.client.Get(ctx, resourceGroupName, networkSecurityGroupName, expand) - mc.Observe(err) - return result, retry.GetError(result.Response.Response, err) -} - -func (az *azSecurityGroupsClient) List(ctx context.Context, resourceGroupName string) ([]network.SecurityGroup, *retry.Error) { - mc := metrics.NewMetricContext("security_groups", "list", resourceGroupName, az.client.SubscriptionID, "") - if !az.rateLimiterReader.TryAccept() { - mc.RateLimitedCount() - return nil, createRateLimitErr(false, "NSGList") - } - - klog.V(10).Infof("azSecurityGroupsClient.List(%q): start", resourceGroupName) - defer func() { - klog.V(10).Infof("azSecurityGroupsClient.List(%q): end", resourceGroupName) - }() - - iterator, err := az.client.ListComplete(ctx, resourceGroupName) - mc.Observe(err) - if err != nil { - return nil, retry.GetRetriableError(err) - } - - result := make([]network.SecurityGroup, 0) - for ; iterator.NotDone(); err = iterator.Next() { - if err != nil { - return nil, retry.GetRetriableError(err) - } - - result = append(result, iterator.Value()) - } - - return result, nil -} - -// azRoutesClient implements RoutesClient. -type azRoutesClient struct { - client network.RoutesClient - rateLimiterReader flowcontrol.RateLimiter - rateLimiterWriter flowcontrol.RateLimiter -} - -func newAzRoutesClient(config *azclients.ClientConfig) *azRoutesClient { - routesClient := network.NewRoutesClient(config.SubscriptionID) - routesClient.BaseURI = config.ResourceManagerEndpoint - routesClient.Authorizer = autorest.NewBearerAuthorizer(config.ServicePrincipalToken) - routesClient.PollingDelay = 5 * time.Second - if config.ShouldOmitCloudProviderBackoff { - routesClient.RetryAttempts = config.CloudProviderBackoffRetries - routesClient.RetryDuration = time.Duration(config.CloudProviderBackoffDuration) * time.Second - } - configureUserAgent(&routesClient.Client) - - klog.V(2).Infof("Azure RoutesClient (read ops) using rate limit config: QPS=%g, bucket=%d", - config.RateLimitConfig.CloudProviderRateLimitQPS, - config.RateLimitConfig.CloudProviderRateLimitBucket) - klog.V(2).Infof("Azure RoutesClient (write ops) using rate limit config: QPS=%g, bucket=%d", - config.RateLimitConfig.CloudProviderRateLimitQPSWrite, - config.RateLimitConfig.CloudProviderRateLimitBucketWrite) - rateLimiterReader, rateLimiterWriter := azclients.NewRateLimiter(config.RateLimitConfig) - return &azRoutesClient{ - client: routesClient, - rateLimiterReader: rateLimiterReader, - rateLimiterWriter: rateLimiterWriter, - } -} - -func (az *azRoutesClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, routeTableName string, routeName string, routeParameters network.Route, etag string) *retry.Error { - mc := metrics.NewMetricContext("routes", "create_or_update", resourceGroupName, az.client.SubscriptionID, "") - /* Write rate limiting */ - if !az.rateLimiterWriter.TryAccept() { - mc.RateLimitedCount() - return createRateLimitErr(true, "RouteCreateOrUpdate") - } - - klog.V(10).Infof("azRoutesClient.CreateOrUpdate(%q,%q,%q): start", resourceGroupName, routeTableName, routeName) - defer func() { - klog.V(10).Infof("azRoutesClient.CreateOrUpdate(%q,%q,%q): end", resourceGroupName, routeTableName, routeName) - }() - - req, err := az.createOrUpdatePreparer(ctx, resourceGroupName, routeTableName, routeName, routeParameters, etag) - if err != nil { - return retry.NewError(false, mc.Observe(err)) - } - - future, err := az.client.CreateOrUpdateSender(req) - if err != nil { - return retry.GetError(future.Response(), mc.Observe(err)) - } - - err = future.WaitForCompletionRef(ctx, az.client.Client) - return retry.GetError(future.Response(), mc.Observe(err)) -} - -// createOrUpdatePreparer prepares the CreateOrUpdate request. -func (az *azRoutesClient) createOrUpdatePreparer(ctx context.Context, resourceGroupName string, routeTableName string, routeName string, routeParameters network.Route, etag string) (*http.Request, error) { - pathParameters := map[string]interface{}{ - "resourceGroupName": autorest.Encode("path", resourceGroupName), - "routeName": autorest.Encode("path", routeName), - "routeTableName": autorest.Encode("path", routeTableName), - "subscriptionId": autorest.Encode("path", az.client.SubscriptionID), - } - - queryParameters := map[string]interface{}{ - "api-version": azureNetworkAPIVersion, - } - - preparerDecorators := []autorest.PrepareDecorator{ - autorest.AsContentType("application/json; charset=utf-8"), - autorest.AsPut(), - autorest.WithBaseURL(az.client.BaseURI), - autorest.WithPathParameters("/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Network/routeTables/{routeTableName}/routes/{routeName}", pathParameters), - autorest.WithJSON(routeParameters), - autorest.WithQueryParameters(queryParameters), - } - if etag != "" { - preparerDecorators = append(preparerDecorators, autorest.WithHeader("If-Match", autorest.String(etag))) - } - preparer := autorest.CreatePreparer(preparerDecorators...) - - return preparer.Prepare((&http.Request{}).WithContext(ctx)) -} - -func (az *azRoutesClient) Delete(ctx context.Context, resourceGroupName string, routeTableName string, routeName string) *retry.Error { - mc := metrics.NewMetricContext("routes", "delete", resourceGroupName, az.client.SubscriptionID, "") - /* Write rate limiting */ - if !az.rateLimiterWriter.TryAccept() { - mc.RateLimitedCount() - return createRateLimitErr(true, "RouteDelete") - } - - klog.V(10).Infof("azRoutesClient.Delete(%q,%q,%q): start", resourceGroupName, routeTableName, routeName) - defer func() { - klog.V(10).Infof("azRoutesClient.Delete(%q,%q,%q): end", resourceGroupName, routeTableName, routeName) - }() - - future, err := az.client.Delete(ctx, resourceGroupName, routeTableName, routeName) - if err != nil { - return retry.GetStatusNotFoundAndForbiddenIgnoredError(future.Response(), mc.Observe(err)) - } - - err = future.WaitForCompletionRef(ctx, az.client.Client) - return retry.GetStatusNotFoundAndForbiddenIgnoredError(future.Response(), mc.Observe(err)) -} - -// azRouteTablesClient implements RouteTablesClient. -type azRouteTablesClient struct { - client network.RouteTablesClient - rateLimiterReader flowcontrol.RateLimiter - rateLimiterWriter flowcontrol.RateLimiter -} - -func newAzRouteTablesClient(config *azclients.ClientConfig) *azRouteTablesClient { - routeTablesClient := network.NewRouteTablesClient(config.SubscriptionID) - routeTablesClient.BaseURI = config.ResourceManagerEndpoint - routeTablesClient.Authorizer = autorest.NewBearerAuthorizer(config.ServicePrincipalToken) - routeTablesClient.PollingDelay = 5 * time.Second - if config.ShouldOmitCloudProviderBackoff { - routeTablesClient.RetryAttempts = config.CloudProviderBackoffRetries - routeTablesClient.RetryDuration = time.Duration(config.CloudProviderBackoffDuration) * time.Second - } - configureUserAgent(&routeTablesClient.Client) - - klog.V(2).Infof("Azure RouteTablesClient (read ops) using rate limit config: QPS=%g, bucket=%d", - config.RateLimitConfig.CloudProviderRateLimitQPS, - config.RateLimitConfig.CloudProviderRateLimitBucket) - klog.V(2).Infof("Azure RouteTablesClient (write ops) using rate limit config: QPS=%g, bucket=%d", - config.RateLimitConfig.CloudProviderRateLimitQPSWrite, - config.RateLimitConfig.CloudProviderRateLimitBucketWrite) - rateLimiterReader, rateLimiterWriter := azclients.NewRateLimiter(config.RateLimitConfig) - return &azRouteTablesClient{ - client: routeTablesClient, - rateLimiterReader: rateLimiterReader, - rateLimiterWriter: rateLimiterWriter, - } -} - -func (az *azRouteTablesClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, routeTableName string, parameters network.RouteTable, etag string) *retry.Error { - mc := metrics.NewMetricContext("route_tables", "create_or_update", resourceGroupName, az.client.SubscriptionID, "") - /* Write rate limiting */ - if !az.rateLimiterWriter.TryAccept() { - mc.RateLimitedCount() - return createRateLimitErr(true, "RouteTableCreateOrUpdate") - } - - klog.V(10).Infof("azRouteTablesClient.CreateOrUpdate(%q,%q): start", resourceGroupName, routeTableName) - defer func() { - klog.V(10).Infof("azRouteTablesClient.CreateOrUpdate(%q,%q): end", resourceGroupName, routeTableName) - }() - - req, err := az.createOrUpdatePreparer(ctx, resourceGroupName, routeTableName, parameters, etag) - if err != nil { - return retry.NewError(false, mc.Observe(err)) - } - - future, err := az.client.CreateOrUpdateSender(req) - if err != nil { - return retry.GetError(future.Response(), mc.Observe(err)) - } - - err = future.WaitForCompletionRef(ctx, az.client.Client) - return retry.GetError(future.Response(), mc.Observe(err)) -} - -// createOrUpdatePreparer prepares the CreateOrUpdate request. -func (az *azRouteTablesClient) createOrUpdatePreparer(ctx context.Context, resourceGroupName string, routeTableName string, parameters network.RouteTable, etag string) (*http.Request, error) { - pathParameters := map[string]interface{}{ - "resourceGroupName": autorest.Encode("path", resourceGroupName), - "routeTableName": autorest.Encode("path", routeTableName), - "subscriptionId": autorest.Encode("path", az.client.SubscriptionID), - } - - queryParameters := map[string]interface{}{ - "api-version": azureNetworkAPIVersion, - } - preparerDecorators := []autorest.PrepareDecorator{ - autorest.AsContentType("application/json; charset=utf-8"), - autorest.AsPut(), - autorest.WithBaseURL(az.client.BaseURI), - autorest.WithPathParameters("/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Network/routeTables/{routeTableName}", pathParameters), - autorest.WithJSON(parameters), - autorest.WithQueryParameters(queryParameters), - } - if etag != "" { - preparerDecorators = append(preparerDecorators, autorest.WithHeader("If-Match", autorest.String(etag))) - } - preparer := autorest.CreatePreparer(preparerDecorators...) - - return preparer.Prepare((&http.Request{}).WithContext(ctx)) -} - -func (az *azRouteTablesClient) Get(ctx context.Context, resourceGroupName string, routeTableName string, expand string) (result network.RouteTable, rerr *retry.Error) { - mc := metrics.NewMetricContext("route_tables", "get", resourceGroupName, az.client.SubscriptionID, "") - if !az.rateLimiterReader.TryAccept() { - mc.RateLimitedCount() - rerr = createRateLimitErr(false, "GetRouteTable") - return - } - - klog.V(10).Infof("azRouteTablesClient.Get(%q,%q): start", resourceGroupName, routeTableName) - defer func() { - klog.V(10).Infof("azRouteTablesClient.Get(%q,%q): end", resourceGroupName, routeTableName) - }() - - var err error - result, err = az.client.Get(ctx, resourceGroupName, routeTableName, expand) - mc.Observe(err) - return result, retry.GetError(result.Response.Response, err) -} - // azStorageAccountClient implements StorageAccountClient. type azStorageAccountClient struct { client storage.AccountsClient diff --git a/staging/src/k8s.io/legacy-cloud-providers/azure/clients/BUILD b/staging/src/k8s.io/legacy-cloud-providers/azure/clients/BUILD index 18aa96c0fac..64ce9fa06f2 100644 --- a/staging/src/k8s.io/legacy-cloud-providers/azure/clients/BUILD +++ b/staging/src/k8s.io/legacy-cloud-providers/azure/clients/BUILD @@ -28,6 +28,14 @@ filegroup( srcs = [ ":package-srcs", "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient:all-srcs", + "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/interfaceclient:all-srcs", + "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/loadbalancerclient:all-srcs", + "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/publicipclient:all-srcs", + "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/routeclient:all-srcs", + "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/routetableclient:all-srcs", + "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/securitygroupclient:all-srcs", + "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/subnetclient:all-srcs", + "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/vmclient:all-srcs", "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/vmssclient:all-srcs", "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/vmssvmclient:all-srcs", ], diff --git a/staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient/azure_armclient.go b/staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient/azure_armclient.go index 079b0ba7be3..90a78299ef2 100644 --- a/staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient/azure_armclient.go +++ b/staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient/azure_armclient.go @@ -311,6 +311,21 @@ func (c *Client) GetResource(ctx context.Context, resourceID, expand string) (*h return c.Send(ctx, request) } +// GetResourceWithDecorators get a resource with decorators by resource ID +func (c *Client) GetResourceWithDecorators(ctx context.Context, resourceID string, decorators []autorest.PrepareDecorator) (*http.Response, *retry.Error) { + getDecorators := []autorest.PrepareDecorator{ + autorest.WithPathParameters("{resourceID}", map[string]interface{}{"resourceID": resourceID}), + } + getDecorators = append(getDecorators, decorators...) + request, err := c.PrepareGetRequest(ctx, getDecorators...) + if err != nil { + klog.V(5).Infof("Received error in %s: resourceID: %s, error: %s", "get.prepare", resourceID, err) + return nil, retry.NewError(false, err) + } + + return c.Send(ctx, request) +} + // PutResource puts a resource by resource ID func (c *Client) PutResource(ctx context.Context, resourceID string, parameters interface{}) (*http.Response, *retry.Error) { putDecorators := []autorest.PrepareDecorator{ diff --git a/staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient/interface.go b/staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient/interface.go index 356cacd10fc..f2af8922c44 100644 --- a/staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient/interface.go +++ b/staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient/interface.go @@ -76,6 +76,9 @@ type Interface interface { // GetResource get a resource by resource ID GetResource(ctx context.Context, resourceID, expand string) (*http.Response, *retry.Error) + //GetResourceWithDecorators get a resource with decorators by resource ID + GetResourceWithDecorators(ctx context.Context, resourceID string, decorators []autorest.PrepareDecorator) (*http.Response, *retry.Error) + // PostResource posts a resource by resource ID PostResource(ctx context.Context, resourceID, action string, parameters interface{}) (*http.Response, *retry.Error) diff --git a/staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient/mockarmclient/interface.go b/staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient/mockarmclient/interface.go index 4e13649b14a..8f2e7daac6d 100644 --- a/staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient/mockarmclient/interface.go +++ b/staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient/mockarmclient/interface.go @@ -302,6 +302,21 @@ func (mr *MockInterfaceMockRecorder) GetResource(ctx, resourceID, expand interfa return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetResource", reflect.TypeOf((*MockInterface)(nil).GetResource), ctx, resourceID, expand) } +// GetResourceWithDecorators mocks base method +func (m *MockInterface) GetResourceWithDecorators(ctx context.Context, resourceID string, decorators []autorest.PrepareDecorator) (*http.Response, *retry.Error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetResourceWithDecorators", ctx, resourceID, decorators) + ret0, _ := ret[0].(*http.Response) + ret1, _ := ret[1].(*retry.Error) + return ret0, ret1 +} + +// GetResourceWithDecorators indicates an expected call of GetResourceWithDecorators +func (mr *MockInterfaceMockRecorder) GetResourceWithDecorators(ctx, resourceID, decorators interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetResourceWithDecorators", reflect.TypeOf((*MockInterface)(nil).GetResourceWithDecorators), ctx, resourceID, decorators) +} + // PostResource mocks base method func (m *MockInterface) PostResource(ctx context.Context, resourceID, action string, parameters interface{}) (*http.Response, *retry.Error) { m.ctrl.T.Helper() diff --git a/staging/src/k8s.io/legacy-cloud-providers/azure/clients/routeclient/BUILD b/staging/src/k8s.io/legacy-cloud-providers/azure/clients/routeclient/BUILD index 9e4649f63b2..2d2ee97c014 100644 --- a/staging/src/k8s.io/legacy-cloud-providers/azure/clients/routeclient/BUILD +++ b/staging/src/k8s.io/legacy-cloud-providers/azure/clients/routeclient/BUILD @@ -32,7 +32,6 @@ go_test( "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient:go_default_library", "//staging/src/k8s.io/legacy-cloud-providers/azure/clients/armclient/mockarmclient:go_default_library", "//vendor/github.com/Azure/azure-sdk-for-go/services/network/mgmt/2019-06-01/network:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest:go_default_library", "//vendor/github.com/Azure/go-autorest/autorest/to:go_default_library", "//vendor/github.com/golang/mock/gomock:go_default_library", "//vendor/github.com/stretchr/testify/assert:go_default_library", diff --git a/staging/src/k8s.io/legacy-cloud-providers/azure/clients/vmssvmclient/BUILD b/staging/src/k8s.io/legacy-cloud-providers/azure/clients/vmssvmclient/BUILD index 4fd46f2c9ad..b9879fe8e0c 100644 --- a/staging/src/k8s.io/legacy-cloud-providers/azure/clients/vmssvmclient/BUILD +++ b/staging/src/k8s.io/legacy-cloud-providers/azure/clients/vmssvmclient/BUILD @@ -3,7 +3,7 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "go_default_library", srcs = [ - "azure_vmssclientvm.go", + "azure_vmssvmclient.go", "doc.go", "interface.go", ], diff --git a/vendor/modules.txt b/vendor/modules.txt index 0884e8cbf56..69015155506 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1841,6 +1841,14 @@ k8s.io/legacy-cloud-providers/azure k8s.io/legacy-cloud-providers/azure/auth k8s.io/legacy-cloud-providers/azure/clients k8s.io/legacy-cloud-providers/azure/clients/armclient +k8s.io/legacy-cloud-providers/azure/clients/interfaceclient +k8s.io/legacy-cloud-providers/azure/clients/loadbalancerclient +k8s.io/legacy-cloud-providers/azure/clients/publicipclient +k8s.io/legacy-cloud-providers/azure/clients/routeclient +k8s.io/legacy-cloud-providers/azure/clients/routetableclient +k8s.io/legacy-cloud-providers/azure/clients/securitygroupclient +k8s.io/legacy-cloud-providers/azure/clients/subnetclient +k8s.io/legacy-cloud-providers/azure/clients/vmclient k8s.io/legacy-cloud-providers/azure/clients/vmssclient k8s.io/legacy-cloud-providers/azure/clients/vmssvmclient k8s.io/legacy-cloud-providers/azure/metrics