From 3e10dbd6686f1e58dd575fd4cd7937acc02316c0 Mon Sep 17 00:00:00 2001 From: Pengfei Ni Date: Sun, 22 Dec 2019 20:12:36 +0800 Subject: [PATCH] Use retry.Error for all Azure clients --- .../azure/azure_client.go | 444 +++++++++--------- .../azure/azure_fakes.go | 320 +++++++------ 2 files changed, 388 insertions(+), 376 deletions(-) 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 77e250b1b4e..0e53ced4f56 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 @@ -32,6 +32,7 @@ import ( "k8s.io/client-go/util/flowcontrol" "k8s.io/klog" + "k8s.io/legacy-cloud-providers/azure/retry" ) const ( @@ -41,107 +42,107 @@ const ( ) // Helpers for rate limiting error/error channel creation -func createRateLimitErr(isWrite bool, opName string) error { +func createRateLimitErr(isWrite bool, opName string) *retry.Error { opType := "read" if isWrite { opType = "write" } - return fmt.Errorf("azure - cloud provider rate limited(%s) for operation:%s", opType, opName) + return retry.GetRetriableError(fmt.Errorf("azure - cloud provider rate limited(%s) for operation:%s", opType, opName)) } // VirtualMachinesClient defines needed functions for azure compute.VirtualMachinesClient type VirtualMachinesClient interface { - CreateOrUpdate(ctx context.Context, resourceGroupName string, VMName string, parameters compute.VirtualMachine, source string) (resp *http.Response, err error) - Update(ctx context.Context, resourceGroupName string, VMName string, parameters compute.VirtualMachineUpdate, source string) (resp *http.Response, err error) - Get(ctx context.Context, resourceGroupName string, VMName string, expand compute.InstanceViewTypes) (result compute.VirtualMachine, err error) - List(ctx context.Context, resourceGroupName string) (result []compute.VirtualMachine, err error) + CreateOrUpdate(ctx context.Context, resourceGroupName string, VMName string, parameters compute.VirtualMachine, source string) *retry.Error + Update(ctx context.Context, resourceGroupName string, VMName string, parameters compute.VirtualMachineUpdate, source string) *retry.Error + Get(ctx context.Context, resourceGroupName string, VMName string, expand compute.InstanceViewTypes) (result compute.VirtualMachine, rerr *retry.Error) + List(ctx context.Context, resourceGroupName string) (result []compute.VirtualMachine, rerr *retry.Error) } // InterfacesClient defines needed functions for azure network.InterfacesClient type InterfacesClient interface { - CreateOrUpdate(ctx context.Context, resourceGroupName string, networkInterfaceName string, parameters network.Interface) (resp *http.Response, err error) - Get(ctx context.Context, resourceGroupName string, networkInterfaceName string, expand string) (result network.Interface, err error) - GetVirtualMachineScaleSetNetworkInterface(ctx context.Context, resourceGroupName string, virtualMachineScaleSetName string, virtualmachineIndex string, networkInterfaceName string, expand string) (result network.Interface, err error) + CreateOrUpdate(ctx context.Context, resourceGroupName string, networkInterfaceName string, parameters network.Interface) *retry.Error + Get(ctx context.Context, resourceGroupName string, networkInterfaceName string, expand string) (result network.Interface, rerr *retry.Error) + GetVirtualMachineScaleSetNetworkInterface(ctx context.Context, resourceGroupName string, virtualMachineScaleSetName string, virtualmachineIndex string, networkInterfaceName string, expand string) (result network.Interface, rerr *retry.Error) } // LoadBalancersClient defines needed functions for azure network.LoadBalancersClient type LoadBalancersClient interface { - CreateOrUpdate(ctx context.Context, resourceGroupName string, loadBalancerName string, parameters network.LoadBalancer, etag string) (resp *http.Response, err error) - Delete(ctx context.Context, resourceGroupName string, loadBalancerName string) (resp *http.Response, err error) - Get(ctx context.Context, resourceGroupName string, loadBalancerName string, expand string) (result network.LoadBalancer, err error) - List(ctx context.Context, resourceGroupName string) (result []network.LoadBalancer, err error) + CreateOrUpdate(ctx context.Context, resourceGroupName string, loadBalancerName string, parameters network.LoadBalancer, etag string) *retry.Error + Delete(ctx context.Context, resourceGroupName string, loadBalancerName string) *retry.Error + Get(ctx context.Context, resourceGroupName string, loadBalancerName string, expand string) (result network.LoadBalancer, rerr *retry.Error) + List(ctx context.Context, resourceGroupName string) (result []network.LoadBalancer, rerr *retry.Error) } // PublicIPAddressesClient defines needed functions for azure network.PublicIPAddressesClient type PublicIPAddressesClient interface { - CreateOrUpdate(ctx context.Context, resourceGroupName string, publicIPAddressName string, parameters network.PublicIPAddress) (resp *http.Response, err error) - Delete(ctx context.Context, resourceGroupName string, publicIPAddressName string) (resp *http.Response, err error) - Get(ctx context.Context, resourceGroupName string, publicIPAddressName string, expand string) (result network.PublicIPAddress, err error) - GetVirtualMachineScaleSetPublicIPAddress(ctx context.Context, resourceGroupName string, virtualMachineScaleSetName string, virtualmachineIndex string, networkInterfaceName string, IPConfigurationName string, publicIPAddressName string, expand string) (result network.PublicIPAddress, err error) - List(ctx context.Context, resourceGroupName string) (result []network.PublicIPAddress, err error) + CreateOrUpdate(ctx context.Context, resourceGroupName string, publicIPAddressName string, parameters network.PublicIPAddress) *retry.Error + Delete(ctx context.Context, resourceGroupName string, publicIPAddressName string) *retry.Error + Get(ctx context.Context, resourceGroupName string, publicIPAddressName string, expand string) (result network.PublicIPAddress, rerr *retry.Error) + GetVirtualMachineScaleSetPublicIPAddress(ctx context.Context, resourceGroupName string, virtualMachineScaleSetName string, virtualmachineIndex string, networkInterfaceName string, IPConfigurationName string, publicIPAddressName string, expand string) (result network.PublicIPAddress, rerr *retry.Error) + List(ctx context.Context, resourceGroupName string) (result []network.PublicIPAddress, rerr *retry.Error) } // SubnetsClient defines needed functions for azure network.SubnetsClient type SubnetsClient interface { - CreateOrUpdate(ctx context.Context, resourceGroupName string, virtualNetworkName string, subnetName string, subnetParameters network.Subnet) (resp *http.Response, err error) - Delete(ctx context.Context, resourceGroupName string, virtualNetworkName string, subnetName string) (resp *http.Response, err error) - Get(ctx context.Context, resourceGroupName string, virtualNetworkName string, subnetName string, expand string) (result network.Subnet, err error) - List(ctx context.Context, resourceGroupName string, virtualNetworkName string) (result []network.Subnet, err error) + CreateOrUpdate(ctx context.Context, resourceGroupName string, virtualNetworkName string, subnetName string, subnetParameters network.Subnet) *retry.Error + Delete(ctx context.Context, resourceGroupName string, virtualNetworkName string, subnetName string) *retry.Error + Get(ctx context.Context, resourceGroupName string, virtualNetworkName string, subnetName string, expand string) (result network.Subnet, rerr *retry.Error) + List(ctx context.Context, resourceGroupName string, virtualNetworkName string) (result []network.Subnet, rerr *retry.Error) } // SecurityGroupsClient defines needed functions for azure network.SecurityGroupsClient type SecurityGroupsClient interface { - CreateOrUpdate(ctx context.Context, resourceGroupName string, networkSecurityGroupName string, parameters network.SecurityGroup, etag string) (resp *http.Response, err error) - Delete(ctx context.Context, resourceGroupName string, networkSecurityGroupName string) (resp *http.Response, err error) - Get(ctx context.Context, resourceGroupName string, networkSecurityGroupName string, expand string) (result network.SecurityGroup, err error) - List(ctx context.Context, resourceGroupName string) (result []network.SecurityGroup, err error) + CreateOrUpdate(ctx context.Context, resourceGroupName string, networkSecurityGroupName string, parameters network.SecurityGroup, etag string) *retry.Error + Delete(ctx context.Context, resourceGroupName string, networkSecurityGroupName string) *retry.Error + Get(ctx context.Context, resourceGroupName string, networkSecurityGroupName string, expand string) (result network.SecurityGroup, rerr *retry.Error) + List(ctx context.Context, resourceGroupName string) (result []network.SecurityGroup, rerr *retry.Error) } // VirtualMachineScaleSetsClient defines needed functions for azure compute.VirtualMachineScaleSetsClient type VirtualMachineScaleSetsClient interface { - Get(ctx context.Context, resourceGroupName string, VMScaleSetName string) (result compute.VirtualMachineScaleSet, err error) - List(ctx context.Context, resourceGroupName string) (result []compute.VirtualMachineScaleSet, err error) - CreateOrUpdate(ctx context.Context, resourceGroupName string, VMScaleSetName string, parameters compute.VirtualMachineScaleSet) (resp *http.Response, err error) + Get(ctx context.Context, resourceGroupName string, VMScaleSetName string) (result compute.VirtualMachineScaleSet, rerr *retry.Error) + List(ctx context.Context, resourceGroupName string) (result []compute.VirtualMachineScaleSet, rerr *retry.Error) + CreateOrUpdate(ctx context.Context, resourceGroupName string, VMScaleSetName string, parameters compute.VirtualMachineScaleSet) *retry.Error } // VirtualMachineScaleSetVMsClient defines needed functions for azure compute.VirtualMachineScaleSetVMsClient type VirtualMachineScaleSetVMsClient interface { - Get(ctx context.Context, resourceGroupName string, VMScaleSetName string, instanceID string, expand compute.InstanceViewTypes) (result compute.VirtualMachineScaleSetVM, err error) - List(ctx context.Context, resourceGroupName string, virtualMachineScaleSetName string, filter string, selectParameter string, expand string) (result []compute.VirtualMachineScaleSetVM, err error) - Update(ctx context.Context, resourceGroupName string, VMScaleSetName string, instanceID string, parameters compute.VirtualMachineScaleSetVM, source string) (resp *http.Response, err error) + Get(ctx context.Context, resourceGroupName string, VMScaleSetName string, instanceID string, expand compute.InstanceViewTypes) (result compute.VirtualMachineScaleSetVM, rerr *retry.Error) + List(ctx context.Context, resourceGroupName string, virtualMachineScaleSetName string, filter string, selectParameter string, expand string) (result []compute.VirtualMachineScaleSetVM, rerr *retry.Error) + Update(ctx context.Context, resourceGroupName string, VMScaleSetName string, instanceID string, parameters compute.VirtualMachineScaleSetVM, source string) *retry.Error } // RoutesClient defines needed functions for azure network.RoutesClient type RoutesClient interface { - CreateOrUpdate(ctx context.Context, resourceGroupName string, routeTableName string, routeName string, routeParameters network.Route, etag string) (resp *http.Response, err error) - Delete(ctx context.Context, resourceGroupName string, routeTableName string, routeName string) (resp *http.Response, err error) + CreateOrUpdate(ctx context.Context, resourceGroupName string, routeTableName string, routeName string, routeParameters network.Route, etag string) *retry.Error + Delete(ctx context.Context, resourceGroupName string, routeTableName string, routeName string) *retry.Error } // RouteTablesClient defines needed functions for azure network.RouteTablesClient type RouteTablesClient interface { - CreateOrUpdate(ctx context.Context, resourceGroupName string, routeTableName string, parameters network.RouteTable, etag string) (resp *http.Response, err error) - Get(ctx context.Context, resourceGroupName string, routeTableName string, expand string) (result network.RouteTable, err error) + CreateOrUpdate(ctx context.Context, resourceGroupName string, routeTableName string, parameters network.RouteTable, etag string) *retry.Error + Get(ctx context.Context, resourceGroupName string, routeTableName string, expand string) (result network.RouteTable, rerr *retry.Error) } // StorageAccountClient defines needed functions for azure storage.AccountsClient type StorageAccountClient interface { - Create(ctx context.Context, resourceGroupName string, accountName string, parameters storage.AccountCreateParameters) (result *http.Response, err error) - Delete(ctx context.Context, resourceGroupName string, accountName string) (result autorest.Response, err error) - ListKeys(ctx context.Context, resourceGroupName string, accountName string) (result storage.AccountListKeysResult, err error) - ListByResourceGroup(ctx context.Context, resourceGroupName string) (result storage.AccountListResult, err error) - GetProperties(ctx context.Context, resourceGroupName string, accountName string) (result storage.Account, err error) + Create(ctx context.Context, resourceGroupName string, accountName string, parameters storage.AccountCreateParameters) *retry.Error + Delete(ctx context.Context, resourceGroupName string, accountName string) *retry.Error + ListKeys(ctx context.Context, resourceGroupName string, accountName string) (result storage.AccountListKeysResult, rerr *retry.Error) + ListByResourceGroup(ctx context.Context, resourceGroupName string) (result storage.AccountListResult, rerr *retry.Error) + GetProperties(ctx context.Context, resourceGroupName string, accountName string) (result storage.Account, rerr *retry.Error) } // DisksClient defines needed functions for azure compute.DisksClient type DisksClient interface { - CreateOrUpdate(ctx context.Context, resourceGroupName string, diskName string, diskParameter compute.Disk) (resp *http.Response, err error) - Delete(ctx context.Context, resourceGroupName string, diskName string) (resp *http.Response, err error) - Get(ctx context.Context, resourceGroupName string, diskName string) (result compute.Disk, err error) + CreateOrUpdate(ctx context.Context, resourceGroupName string, diskName string, diskParameter compute.Disk) *retry.Error + Delete(ctx context.Context, resourceGroupName string, diskName string) *retry.Error + Get(ctx context.Context, resourceGroupName string, diskName string) (result compute.Disk, rerr *retry.Error) } // VirtualMachineSizesClient defines needed functions for azure compute.VirtualMachineSizesClient type VirtualMachineSizesClient interface { - List(ctx context.Context, location string) (result compute.VirtualMachineSizeListResult, err error) + List(ctx context.Context, location string) (result compute.VirtualMachineSizeListResult, rerr *retry.Error) } // azClientConfig contains all essential information to create an Azure client. @@ -198,13 +199,12 @@ func newAzVirtualMachinesClient(config *azClientConfig) *azVirtualMachinesClient } } -func (az *azVirtualMachinesClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, VMName string, parameters compute.VirtualMachine, source string) (resp *http.Response, err error) { +func (az *azVirtualMachinesClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, VMName string, parameters compute.VirtualMachine, source string) *retry.Error { // /* Write rate limiting */ mc := newMetricContext("vm", "create_or_update", resourceGroupName, az.client.SubscriptionID, source) if !az.rateLimiterWriter.TryAccept() { mc.RateLimitedCount() - err = createRateLimitErr(true, "VMCreateOrUpdate") - return + return createRateLimitErr(true, "VMCreateOrUpdate") } klog.V(10).Infof("azVirtualMachinesClient.CreateOrUpdate(%q, %q): start", resourceGroupName, VMName) @@ -214,21 +214,20 @@ func (az *azVirtualMachinesClient) CreateOrUpdate(ctx context.Context, resourceG future, err := az.client.CreateOrUpdate(ctx, resourceGroupName, VMName, parameters) if err != nil { - return future.Response(), err + return retry.GetError(future.Response(), err) } err = future.WaitForCompletionRef(ctx, az.client.Client) mc.Observe(err) - return future.Response(), err + return retry.GetError(future.Response(), err) } -func (az *azVirtualMachinesClient) Update(ctx context.Context, resourceGroupName string, VMName string, parameters compute.VirtualMachineUpdate, source string) (resp *http.Response, err error) { +func (az *azVirtualMachinesClient) Update(ctx context.Context, resourceGroupName string, VMName string, parameters compute.VirtualMachineUpdate, source string) *retry.Error { mc := newMetricContext("vm", "update", resourceGroupName, az.client.SubscriptionID, source) // /* Write rate limiting */ if !az.rateLimiterWriter.TryAccept() { mc.RateLimitedCount() - err = createRateLimitErr(true, "VMUpdate") - return + return createRateLimitErr(true, "VMUpdate") } klog.V(10).Infof("azVirtualMachinesClient.Update(%q, %q): start", resourceGroupName, VMName) @@ -238,19 +237,19 @@ func (az *azVirtualMachinesClient) Update(ctx context.Context, resourceGroupName future, err := az.client.Update(ctx, resourceGroupName, VMName, parameters) if err != nil { - return future.Response(), err + return retry.GetError(future.Response(), err) } err = future.WaitForCompletionRef(ctx, az.client.Client) mc.Observe(err) - return future.Response(), err + return retry.GetError(future.Response(), err) } -func (az *azVirtualMachinesClient) Get(ctx context.Context, resourceGroupName string, VMName string, expand compute.InstanceViewTypes) (result compute.VirtualMachine, err error) { +func (az *azVirtualMachinesClient) Get(ctx context.Context, resourceGroupName string, VMName string, expand compute.InstanceViewTypes) (result compute.VirtualMachine, rerr *retry.Error) { mc := newMetricContext("vm", "get", resourceGroupName, az.client.SubscriptionID, "") if !az.rateLimiterReader.TryAccept() { mc.RateLimitedCount() - err = createRateLimitErr(false, "VMGet") + rerr = createRateLimitErr(false, "VMGet") return } @@ -259,16 +258,17 @@ func (az *azVirtualMachinesClient) Get(ctx context.Context, resourceGroupName st 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 + return result, retry.GetError(result.Response.Response, err) } -func (az *azVirtualMachinesClient) List(ctx context.Context, resourceGroupName string) (result []compute.VirtualMachine, err error) { +func (az *azVirtualMachinesClient) List(ctx context.Context, resourceGroupName string) (result []compute.VirtualMachine, rerr *retry.Error) { mc := newMetricContext("vm", "list", resourceGroupName, az.client.SubscriptionID, "") if !az.rateLimiterReader.TryAccept() { mc.RateLimitedCount() - err = createRateLimitErr(false, "VMList") + rerr = createRateLimitErr(false, "VMList") return } @@ -280,13 +280,13 @@ func (az *azVirtualMachinesClient) List(ctx context.Context, resourceGroupName s iterator, err := az.client.ListComplete(ctx, resourceGroupName) mc.Observe(err) if err != nil { - return nil, err + return nil, retry.GetRetriableError(err) } result = make([]compute.VirtualMachine, 0) for ; iterator.NotDone(); err = iterator.Next() { if err != nil { - return nil, err + return nil, retry.GetRetriableError(err) } result = append(result, iterator.Value()) @@ -327,13 +327,12 @@ func newAzInterfacesClient(config *azClientConfig) *azInterfacesClient { } } -func (az *azInterfacesClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, networkInterfaceName string, parameters network.Interface) (resp *http.Response, err error) { +func (az *azInterfacesClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, networkInterfaceName string, parameters network.Interface) *retry.Error { mc := newMetricContext("interfaces", "create_or_update", resourceGroupName, az.client.SubscriptionID, "") /* Write rate limiting */ if !az.rateLimiterWriter.TryAccept() { mc.RateLimitedCount() - err = createRateLimitErr(true, "NiCreateOrUpdate") - return + return createRateLimitErr(true, "NiCreateOrUpdate") } klog.V(10).Infof("azInterfacesClient.CreateOrUpdate(%q,%q): start", resourceGroupName, networkInterfaceName) @@ -343,18 +342,18 @@ func (az *azInterfacesClient) CreateOrUpdate(ctx context.Context, resourceGroupN future, err := az.client.CreateOrUpdate(ctx, resourceGroupName, networkInterfaceName, parameters) if err != nil { - return future.Response(), mc.Observe(err) + return retry.GetError(future.Response(), mc.Observe(err)) } err = future.WaitForCompletionRef(ctx, az.client.Client) - return future.Response(), mc.Observe(err) + return retry.GetError(future.Response(), mc.Observe(err)) } -func (az *azInterfacesClient) Get(ctx context.Context, resourceGroupName string, networkInterfaceName string, expand string) (result network.Interface, err error) { +func (az *azInterfacesClient) Get(ctx context.Context, resourceGroupName string, networkInterfaceName string, expand string) (result network.Interface, rerr *retry.Error) { mc := newMetricContext("interfaces", "get", resourceGroupName, az.client.SubscriptionID, "") if !az.rateLimiterReader.TryAccept() { mc.RateLimitedCount() - err = createRateLimitErr(false, "NicGet") + rerr = createRateLimitErr(false, "NicGet") return } @@ -363,16 +362,17 @@ func (az *azInterfacesClient) Get(ctx context.Context, resourceGroupName string, 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 + 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, err error) { +func (az *azInterfacesClient) GetVirtualMachineScaleSetNetworkInterface(ctx context.Context, resourceGroupName string, virtualMachineScaleSetName string, virtualmachineIndex string, networkInterfaceName string, expand string) (result network.Interface, rerr *retry.Error) { mc := newMetricContext("interfaces", "get_vmss_ni", resourceGroupName, az.client.SubscriptionID, "") if !az.rateLimiterReader.TryAccept() { mc.RateLimitedCount() - err = createRateLimitErr(false, "NicGetVirtualMachineScaleSetNetworkInterface") + rerr = createRateLimitErr(false, "NicGetVirtualMachineScaleSetNetworkInterface") return } @@ -381,9 +381,10 @@ func (az *azInterfacesClient) GetVirtualMachineScaleSetNetworkInterface(ctx cont 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 + return result, retry.GetError(result.Response.Response, err) } // azLoadBalancersClient implements LoadBalancersClient. @@ -418,13 +419,12 @@ func newAzLoadBalancersClient(config *azClientConfig) *azLoadBalancersClient { } } -func (az *azLoadBalancersClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, loadBalancerName string, parameters network.LoadBalancer, etag string) (resp *http.Response, err error) { +func (az *azLoadBalancersClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, loadBalancerName string, parameters network.LoadBalancer, etag string) *retry.Error { mc := newMetricContext("load_balancers", "create_or_update", resourceGroupName, az.client.SubscriptionID, "") /* Write rate limiting */ if !az.rateLimiterWriter.TryAccept() { mc.RateLimitedCount() - err = createRateLimitErr(true, "LBCreateOrUpdate") - return nil, err + return createRateLimitErr(true, "LBCreateOrUpdate") } klog.V(10).Infof("azLoadBalancersClient.CreateOrUpdate(%q,%q): start", resourceGroupName, loadBalancerName) @@ -434,16 +434,16 @@ func (az *azLoadBalancersClient) CreateOrUpdate(ctx context.Context, resourceGro req, err := az.createOrUpdatePreparer(ctx, resourceGroupName, loadBalancerName, parameters, etag) if err != nil { - return nil, mc.Observe(err) + return retry.NewError(false, mc.Observe(err)) } future, err := az.client.CreateOrUpdateSender(req) if err != nil { - return future.Response(), mc.Observe(err) + return retry.GetError(future.Response(), mc.Observe(err)) } err = future.WaitForCompletionRef(ctx, az.client.Client) - return future.Response(), mc.Observe(err) + return retry.GetError(future.Response(), mc.Observe(err)) } // createOrUpdatePreparer prepares the CreateOrUpdate request. @@ -473,13 +473,12 @@ func (az *azLoadBalancersClient) createOrUpdatePreparer(ctx context.Context, res return preparer.Prepare((&http.Request{}).WithContext(ctx)) } -func (az *azLoadBalancersClient) Delete(ctx context.Context, resourceGroupName string, loadBalancerName string) (resp *http.Response, err error) { +func (az *azLoadBalancersClient) Delete(ctx context.Context, resourceGroupName string, loadBalancerName string) *retry.Error { mc := newMetricContext("load_balancers", "delete", resourceGroupName, az.client.SubscriptionID, "") /* Write rate limiting */ if !az.rateLimiterWriter.TryAccept() { mc.RateLimitedCount() - err = createRateLimitErr(true, "LBDelete") - return nil, err + return createRateLimitErr(true, "LBDelete") } klog.V(10).Infof("azLoadBalancersClient.Delete(%q,%q): start", resourceGroupName, loadBalancerName) @@ -489,18 +488,18 @@ func (az *azLoadBalancersClient) Delete(ctx context.Context, resourceGroupName s future, err := az.client.Delete(ctx, resourceGroupName, loadBalancerName) if err != nil { - return future.Response(), mc.Observe(err) + return retry.GetStatusNotFoundAndIgnoredForbiddenError(future.Response(), mc.Observe(err)) } err = future.WaitForCompletionRef(ctx, az.client.Client) - return future.Response(), mc.Observe(err) + return retry.GetStatusNotFoundAndIgnoredForbiddenError(future.Response(), mc.Observe(err)) } -func (az *azLoadBalancersClient) Get(ctx context.Context, resourceGroupName string, loadBalancerName string, expand string) (result network.LoadBalancer, err error) { +func (az *azLoadBalancersClient) Get(ctx context.Context, resourceGroupName string, loadBalancerName string, expand string) (result network.LoadBalancer, rerr *retry.Error) { mc := newMetricContext("load_balancers", "get", resourceGroupName, az.client.SubscriptionID, "") if !az.rateLimiterReader.TryAccept() { mc.RateLimitedCount() - err = createRateLimitErr(false, "LBGet") + rerr = createRateLimitErr(false, "LBGet") return } @@ -509,17 +508,18 @@ func (az *azLoadBalancersClient) Get(ctx context.Context, resourceGroupName stri 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 + return result, retry.GetError(result.Response.Response, err) } -func (az *azLoadBalancersClient) List(ctx context.Context, resourceGroupName string) ([]network.LoadBalancer, error) { +func (az *azLoadBalancersClient) List(ctx context.Context, resourceGroupName string) ([]network.LoadBalancer, *retry.Error) { mc := newMetricContext("load_balancers", "list", resourceGroupName, az.client.SubscriptionID, "") if !az.rateLimiterReader.TryAccept() { mc.RateLimitedCount() - err := createRateLimitErr(false, "LBList") - return nil, err + rerr := createRateLimitErr(false, "LBList") + return nil, rerr } klog.V(10).Infof("azLoadBalancersClient.List(%q): start", resourceGroupName) @@ -530,13 +530,13 @@ func (az *azLoadBalancersClient) List(ctx context.Context, resourceGroupName str iterator, err := az.client.ListComplete(ctx, resourceGroupName) mc.Observe(err) if err != nil { - return nil, err + return nil, retry.GetRetriableError(err) } result := make([]network.LoadBalancer, 0) for ; iterator.NotDone(); err = iterator.Next() { if err != nil { - return nil, err + return nil, retry.GetRetriableError(err) } result = append(result, iterator.Value()) @@ -577,13 +577,12 @@ func newAzPublicIPAddressesClient(config *azClientConfig) *azPublicIPAddressesCl } } -func (az *azPublicIPAddressesClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, publicIPAddressName string, parameters network.PublicIPAddress) (resp *http.Response, err error) { +func (az *azPublicIPAddressesClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, publicIPAddressName string, parameters network.PublicIPAddress) *retry.Error { mc := newMetricContext("public_ip_addresses", "create_or_update", resourceGroupName, az.client.SubscriptionID, "") /* Write rate limiting */ if !az.rateLimiterWriter.TryAccept() { mc.RateLimitedCount() - err = createRateLimitErr(true, "PublicIPCreateOrUpdate") - return nil, err + return createRateLimitErr(true, "PublicIPCreateOrUpdate") } klog.V(10).Infof("azPublicIPAddressesClient.CreateOrUpdate(%q,%q): start", resourceGroupName, publicIPAddressName) @@ -593,20 +592,19 @@ func (az *azPublicIPAddressesClient) CreateOrUpdate(ctx context.Context, resourc future, err := az.client.CreateOrUpdate(ctx, resourceGroupName, publicIPAddressName, parameters) if err != nil { - return future.Response(), mc.Observe(err) + return retry.GetError(future.Response(), mc.Observe(err)) } err = future.WaitForCompletionRef(ctx, az.client.Client) - return future.Response(), mc.Observe(err) + return retry.GetError(future.Response(), mc.Observe(err)) } -func (az *azPublicIPAddressesClient) Delete(ctx context.Context, resourceGroupName string, publicIPAddressName string) (resp *http.Response, err error) { +func (az *azPublicIPAddressesClient) Delete(ctx context.Context, resourceGroupName string, publicIPAddressName string) *retry.Error { mc := newMetricContext("public_ip_addresses", "delete", resourceGroupName, az.client.SubscriptionID, "") /* Write rate limiting */ if !az.rateLimiterWriter.TryAccept() { mc.RateLimitedCount() - err = createRateLimitErr(true, "PublicIPDelete") - return nil, err + return createRateLimitErr(true, "PublicIPDelete") } klog.V(10).Infof("azPublicIPAddressesClient.Delete(%q,%q): start", resourceGroupName, publicIPAddressName) @@ -616,18 +614,18 @@ func (az *azPublicIPAddressesClient) Delete(ctx context.Context, resourceGroupNa future, err := az.client.Delete(ctx, resourceGroupName, publicIPAddressName) if err != nil { - return future.Response(), mc.Observe(err) + return retry.GetStatusNotFoundAndIgnoredForbiddenError(future.Response(), mc.Observe(err)) } err = future.WaitForCompletionRef(ctx, az.client.Client) - return future.Response(), mc.Observe(err) + return retry.GetStatusNotFoundAndIgnoredForbiddenError(future.Response(), mc.Observe(err)) } -func (az *azPublicIPAddressesClient) Get(ctx context.Context, resourceGroupName string, publicIPAddressName string, expand string) (result network.PublicIPAddress, err error) { +func (az *azPublicIPAddressesClient) Get(ctx context.Context, resourceGroupName string, publicIPAddressName string, expand string) (result network.PublicIPAddress, rerr *retry.Error) { mc := newMetricContext("public_ip_addresses", "get", resourceGroupName, az.client.SubscriptionID, "") if !az.rateLimiterReader.TryAccept() { mc.RateLimitedCount() - err = createRateLimitErr(false, "PublicIPGet") + rerr = createRateLimitErr(false, "PublicIPGet") return } @@ -636,16 +634,17 @@ func (az *azPublicIPAddressesClient) Get(ctx context.Context, resourceGroupName 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 + 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, err error) { +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 := newMetricContext("vmss_public_ip_addresses", "get", resourceGroupName, az.client.SubscriptionID, "") if !az.rateLimiterReader.TryAccept() { mc.RateLimitedCount() - err = createRateLimitErr(false, "VMSSPublicIPGet") + rerr = createRateLimitErr(false, "VMSSPublicIPGet") return } @@ -654,12 +653,13 @@ func (az *azPublicIPAddressesClient) GetVirtualMachineScaleSetPublicIPAddress(ct 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 + return result, retry.GetError(result.Response.Response, err) } -func (az *azPublicIPAddressesClient) List(ctx context.Context, resourceGroupName string) ([]network.PublicIPAddress, error) { +func (az *azPublicIPAddressesClient) List(ctx context.Context, resourceGroupName string) ([]network.PublicIPAddress, *retry.Error) { mc := newMetricContext("public_ip_addresses", "list", resourceGroupName, az.client.SubscriptionID, "") if !az.rateLimiterReader.TryAccept() { mc.RateLimitedCount() @@ -674,13 +674,13 @@ func (az *azPublicIPAddressesClient) List(ctx context.Context, resourceGroupName iterator, err := az.client.ListComplete(ctx, resourceGroupName) mc.Observe(err) if err != nil { - return nil, err + return nil, retry.GetRetriableError(err) } result := make([]network.PublicIPAddress, 0) for ; iterator.NotDone(); err = iterator.Next() { if err != nil { - return nil, err + return nil, retry.GetRetriableError(err) } result = append(result, iterator.Value()) @@ -721,13 +721,12 @@ func newAzSubnetsClient(config *azClientConfig) *azSubnetsClient { } } -func (az *azSubnetsClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, virtualNetworkName string, subnetName string, subnetParameters network.Subnet) (resp *http.Response, err error) { +func (az *azSubnetsClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, virtualNetworkName string, subnetName string, subnetParameters network.Subnet) *retry.Error { mc := newMetricContext("subnets", "create_or_update", resourceGroupName, az.client.SubscriptionID, "") /* Write rate limiting */ if !az.rateLimiterWriter.TryAccept() { mc.RateLimitedCount() - err = createRateLimitErr(true, "SubnetCreateOrUpdate") - return + return createRateLimitErr(true, "SubnetCreateOrUpdate") } klog.V(10).Infof("azSubnetsClient.CreateOrUpdate(%q,%q,%q): start", resourceGroupName, virtualNetworkName, subnetName) @@ -737,20 +736,19 @@ func (az *azSubnetsClient) CreateOrUpdate(ctx context.Context, resourceGroupName future, err := az.client.CreateOrUpdate(ctx, resourceGroupName, virtualNetworkName, subnetName, subnetParameters) if err != nil { - return future.Response(), mc.Observe(err) + return retry.GetError(future.Response(), mc.Observe(err)) } err = future.WaitForCompletionRef(ctx, az.client.Client) - return future.Response(), mc.Observe(err) + return retry.GetError(future.Response(), mc.Observe(err)) } -func (az *azSubnetsClient) Delete(ctx context.Context, resourceGroupName string, virtualNetworkName string, subnetName string) (resp *http.Response, err error) { +func (az *azSubnetsClient) Delete(ctx context.Context, resourceGroupName string, virtualNetworkName string, subnetName string) *retry.Error { mc := newMetricContext("subnets", "delete", resourceGroupName, az.client.SubscriptionID, "") /* Write rate limiting */ if !az.rateLimiterWriter.TryAccept() { mc.RateLimitedCount() - err = createRateLimitErr(true, "SubnetDelete") - return + return createRateLimitErr(true, "SubnetDelete") } klog.V(10).Infof("azSubnetsClient.Delete(%q,%q,%q): start", resourceGroupName, virtualNetworkName, subnetName) @@ -760,18 +758,18 @@ func (az *azSubnetsClient) Delete(ctx context.Context, resourceGroupName string, future, err := az.client.Delete(ctx, resourceGroupName, virtualNetworkName, subnetName) if err != nil { - return future.Response(), mc.Observe(err) + return retry.GetStatusNotFoundAndIgnoredForbiddenError(future.Response(), mc.Observe(err)) } err = future.WaitForCompletionRef(ctx, az.client.Client) - return future.Response(), mc.Observe(err) + return retry.GetStatusNotFoundAndIgnoredForbiddenError(future.Response(), mc.Observe(err)) } -func (az *azSubnetsClient) Get(ctx context.Context, resourceGroupName string, virtualNetworkName string, subnetName string, expand string) (result network.Subnet, err error) { +func (az *azSubnetsClient) Get(ctx context.Context, resourceGroupName string, virtualNetworkName string, subnetName string, expand string) (result network.Subnet, rerr *retry.Error) { mc := newMetricContext("subnets", "get", resourceGroupName, az.client.SubscriptionID, "") if !az.rateLimiterReader.TryAccept() { mc.RateLimitedCount() - err = createRateLimitErr(false, "SubnetGet") + rerr = createRateLimitErr(false, "SubnetGet") return } @@ -780,12 +778,13 @@ func (az *azSubnetsClient) Get(ctx context.Context, resourceGroupName string, vi 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 + return result, retry.GetError(result.Response.Response, err) } -func (az *azSubnetsClient) List(ctx context.Context, resourceGroupName string, virtualNetworkName string) ([]network.Subnet, error) { +func (az *azSubnetsClient) List(ctx context.Context, resourceGroupName string, virtualNetworkName string) ([]network.Subnet, *retry.Error) { mc := newMetricContext("subnets", "list", resourceGroupName, az.client.SubscriptionID, "") if !az.rateLimiterReader.TryAccept() { mc.RateLimitedCount() @@ -800,13 +799,13 @@ func (az *azSubnetsClient) List(ctx context.Context, resourceGroupName string, v iterator, err := az.client.ListComplete(ctx, resourceGroupName, virtualNetworkName) mc.Observe(err) if err != nil { - return nil, err + return nil, retry.GetRetriableError(err) } result := make([]network.Subnet, 0) for ; iterator.NotDone(); err = iterator.Next() { if err != nil { - return nil, err + return nil, retry.GetRetriableError(err) } result = append(result, iterator.Value()) @@ -847,13 +846,12 @@ func newAzSecurityGroupsClient(config *azClientConfig) *azSecurityGroupsClient { } } -func (az *azSecurityGroupsClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, networkSecurityGroupName string, parameters network.SecurityGroup, etag string) (resp *http.Response, err error) { +func (az *azSecurityGroupsClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, networkSecurityGroupName string, parameters network.SecurityGroup, etag string) *retry.Error { mc := newMetricContext("security_groups", "create_or_update", resourceGroupName, az.client.SubscriptionID, "") /* Write rate limiting */ if !az.rateLimiterWriter.TryAccept() { mc.RateLimitedCount() - err = createRateLimitErr(true, "NSGCreateOrUpdate") - return + return createRateLimitErr(true, "NSGCreateOrUpdate") } klog.V(10).Infof("azSecurityGroupsClient.CreateOrUpdate(%q,%q): start", resourceGroupName, networkSecurityGroupName) @@ -863,16 +861,16 @@ func (az *azSecurityGroupsClient) CreateOrUpdate(ctx context.Context, resourceGr req, err := az.createOrUpdatePreparer(ctx, resourceGroupName, networkSecurityGroupName, parameters, etag) if err != nil { - return nil, mc.Observe(err) + return retry.NewError(false, mc.Observe(err)) } future, err := az.client.CreateOrUpdateSender(req) if err != nil { - return future.Response(), mc.Observe(err) + return retry.GetError(future.Response(), mc.Observe(err)) } err = future.WaitForCompletionRef(ctx, az.client.Client) - return future.Response(), mc.Observe(err) + return retry.GetError(future.Response(), mc.Observe(err)) } // createOrUpdatePreparer prepares the CreateOrUpdate request. @@ -902,13 +900,12 @@ func (az *azSecurityGroupsClient) createOrUpdatePreparer(ctx context.Context, re return preparer.Prepare((&http.Request{}).WithContext(ctx)) } -func (az *azSecurityGroupsClient) Delete(ctx context.Context, resourceGroupName string, networkSecurityGroupName string) (resp *http.Response, err error) { +func (az *azSecurityGroupsClient) Delete(ctx context.Context, resourceGroupName string, networkSecurityGroupName string) *retry.Error { mc := newMetricContext("security_groups", "delete", resourceGroupName, az.client.SubscriptionID, "") /* Write rate limiting */ if !az.rateLimiterWriter.TryAccept() { mc.RateLimitedCount() - err = createRateLimitErr(true, "NSGDelete") - return + return createRateLimitErr(true, "NSGDelete") } klog.V(10).Infof("azSecurityGroupsClient.Delete(%q,%q): start", resourceGroupName, networkSecurityGroupName) @@ -918,18 +915,18 @@ func (az *azSecurityGroupsClient) Delete(ctx context.Context, resourceGroupName future, err := az.client.Delete(ctx, resourceGroupName, networkSecurityGroupName) if err != nil { - return future.Response(), mc.Observe(err) + return retry.GetStatusNotFoundAndIgnoredForbiddenError(future.Response(), mc.Observe(err)) } err = future.WaitForCompletionRef(ctx, az.client.Client) - return future.Response(), mc.Observe(err) + return retry.GetStatusNotFoundAndIgnoredForbiddenError(future.Response(), mc.Observe(err)) } -func (az *azSecurityGroupsClient) Get(ctx context.Context, resourceGroupName string, networkSecurityGroupName string, expand string) (result network.SecurityGroup, err error) { +func (az *azSecurityGroupsClient) Get(ctx context.Context, resourceGroupName string, networkSecurityGroupName string, expand string) (result network.SecurityGroup, rerr *retry.Error) { mc := newMetricContext("security_groups", "get", resourceGroupName, az.client.SubscriptionID, "") if !az.rateLimiterReader.TryAccept() { mc.RateLimitedCount() - err = createRateLimitErr(false, "NSGGet") + rerr = createRateLimitErr(false, "NSGGet") return } @@ -938,12 +935,13 @@ func (az *azSecurityGroupsClient) Get(ctx context.Context, resourceGroupName str 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 + return result, retry.GetError(result.Response.Response, err) } -func (az *azSecurityGroupsClient) List(ctx context.Context, resourceGroupName string) ([]network.SecurityGroup, error) { +func (az *azSecurityGroupsClient) List(ctx context.Context, resourceGroupName string) ([]network.SecurityGroup, *retry.Error) { mc := newMetricContext("security_groups", "list", resourceGroupName, az.client.SubscriptionID, "") if !az.rateLimiterReader.TryAccept() { mc.RateLimitedCount() @@ -958,13 +956,13 @@ func (az *azSecurityGroupsClient) List(ctx context.Context, resourceGroupName st iterator, err := az.client.ListComplete(ctx, resourceGroupName) mc.Observe(err) if err != nil { - return nil, err + return nil, retry.GetRetriableError(err) } result := make([]network.SecurityGroup, 0) for ; iterator.NotDone(); err = iterator.Next() { if err != nil { - return nil, err + return nil, retry.GetRetriableError(err) } result = append(result, iterator.Value()) @@ -1005,11 +1003,11 @@ func newAzVirtualMachineScaleSetsClient(config *azClientConfig) *azVirtualMachin } } -func (az *azVirtualMachineScaleSetsClient) Get(ctx context.Context, resourceGroupName string, VMScaleSetName string) (result compute.VirtualMachineScaleSet, err error) { +func (az *azVirtualMachineScaleSetsClient) Get(ctx context.Context, resourceGroupName string, VMScaleSetName string) (result compute.VirtualMachineScaleSet, rerr *retry.Error) { mc := newMetricContext("vmss", "get", resourceGroupName, az.client.SubscriptionID, "") if !az.rateLimiterReader.TryAccept() { mc.RateLimitedCount() - err = createRateLimitErr(false, "VMSSGet") + rerr = createRateLimitErr(false, "VMSSGet") return } @@ -1018,16 +1016,17 @@ func (az *azVirtualMachineScaleSetsClient) Get(ctx context.Context, resourceGrou klog.V(10).Infof("azVirtualMachineScaleSetsClient.Get(%q,%q): end", resourceGroupName, VMScaleSetName) }() + var err error result, err = az.client.Get(ctx, resourceGroupName, VMScaleSetName) mc.Observe(err) - return + return result, retry.GetError(result.Response.Response, err) } -func (az *azVirtualMachineScaleSetsClient) List(ctx context.Context, resourceGroupName string) (result []compute.VirtualMachineScaleSet, err error) { +func (az *azVirtualMachineScaleSetsClient) List(ctx context.Context, resourceGroupName string) (result []compute.VirtualMachineScaleSet, rerr *retry.Error) { mc := newMetricContext("vmss", "list", resourceGroupName, az.client.SubscriptionID, "") if !az.rateLimiterReader.TryAccept() { mc.RateLimitedCount() - err = createRateLimitErr(false, "VMSSList") + rerr = createRateLimitErr(false, "VMSSList") return } @@ -1039,13 +1038,13 @@ func (az *azVirtualMachineScaleSetsClient) List(ctx context.Context, resourceGro iterator, err := az.client.ListComplete(ctx, resourceGroupName) mc.Observe(err) if err != nil { - return nil, err + return nil, retry.GetRetriableError(err) } result = make([]compute.VirtualMachineScaleSet, 0) for ; iterator.NotDone(); err = iterator.Next() { if err != nil { - return nil, err + return nil, retry.GetRetriableError(err) } result = append(result, iterator.Value()) @@ -1054,13 +1053,12 @@ func (az *azVirtualMachineScaleSetsClient) List(ctx context.Context, resourceGro return result, nil } -func (az *azVirtualMachineScaleSetsClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, vmScaleSetName string, parameters compute.VirtualMachineScaleSet) (resp *http.Response, err error) { +func (az *azVirtualMachineScaleSetsClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, vmScaleSetName string, parameters compute.VirtualMachineScaleSet) *retry.Error { mc := newMetricContext("vmss", "create_or_update", resourceGroupName, az.client.SubscriptionID, "") /* Write rate limiting */ if !az.rateLimiterWriter.TryAccept() { mc.RateLimitedCount() - err = createRateLimitErr(true, "NiCreateOrUpdate") - return + return createRateLimitErr(true, "NiCreateOrUpdate") } klog.V(10).Infof("azVirtualMachineScaleSetsClient.CreateOrUpdate(%q,%q): start", resourceGroupName, vmScaleSetName) @@ -1070,11 +1068,11 @@ func (az *azVirtualMachineScaleSetsClient) CreateOrUpdate(ctx context.Context, r future, err := az.client.CreateOrUpdate(ctx, resourceGroupName, vmScaleSetName, parameters) if err != nil { - return future.Response(), mc.Observe(err) + return retry.GetError(future.Response(), mc.Observe(err)) } err = future.WaitForCompletionRef(ctx, az.client.Client) - return future.Response(), mc.Observe(err) + return retry.GetError(future.Response(), mc.Observe(err)) } // azVirtualMachineScaleSetVMsClient implements VirtualMachineScaleSetVMsClient. @@ -1109,11 +1107,11 @@ func newAzVirtualMachineScaleSetVMsClient(config *azClientConfig) *azVirtualMach } } -func (az *azVirtualMachineScaleSetVMsClient) Get(ctx context.Context, resourceGroupName string, VMScaleSetName string, instanceID string, expand compute.InstanceViewTypes) (result compute.VirtualMachineScaleSetVM, err error) { +func (az *azVirtualMachineScaleSetVMsClient) Get(ctx context.Context, resourceGroupName string, VMScaleSetName string, instanceID string, expand compute.InstanceViewTypes) (result compute.VirtualMachineScaleSetVM, rerr *retry.Error) { mc := newMetricContext("vmssvm", "get", resourceGroupName, az.client.SubscriptionID, "") if !az.rateLimiterReader.TryAccept() { mc.RateLimitedCount() - err = createRateLimitErr(false, "VMSSGet") + rerr = createRateLimitErr(false, "VMSSGet") return } @@ -1122,16 +1120,17 @@ func (az *azVirtualMachineScaleSetVMsClient) Get(ctx context.Context, resourceGr klog.V(10).Infof("azVirtualMachineScaleSetVMsClient.Get(%q,%q,%q): end", resourceGroupName, VMScaleSetName, instanceID) }() + var err error result, err = az.client.Get(ctx, resourceGroupName, VMScaleSetName, instanceID, expand) mc.Observe(err) - return + return result, retry.GetError(result.Response.Response, err) } -func (az *azVirtualMachineScaleSetVMsClient) List(ctx context.Context, resourceGroupName string, virtualMachineScaleSetName string, filter string, selectParameter string, expand string) (result []compute.VirtualMachineScaleSetVM, err error) { +func (az *azVirtualMachineScaleSetVMsClient) List(ctx context.Context, resourceGroupName string, virtualMachineScaleSetName string, filter string, selectParameter string, expand string) (result []compute.VirtualMachineScaleSetVM, rerr *retry.Error) { mc := newMetricContext("vmssvm", "list", resourceGroupName, az.client.SubscriptionID, "") if !az.rateLimiterReader.TryAccept() { mc.RateLimitedCount() - err = createRateLimitErr(false, "VMSSList") + rerr = createRateLimitErr(false, "VMSSList") return } @@ -1143,13 +1142,13 @@ func (az *azVirtualMachineScaleSetVMsClient) List(ctx context.Context, resourceG iterator, err := az.client.ListComplete(ctx, resourceGroupName, virtualMachineScaleSetName, filter, selectParameter, expand) mc.Observe(err) if err != nil { - return nil, err + return nil, retry.GetRetriableError(err) } result = make([]compute.VirtualMachineScaleSetVM, 0) for ; iterator.NotDone(); err = iterator.Next() { if err != nil { - return nil, err + return nil, retry.GetRetriableError(err) } result = append(result, iterator.Value()) @@ -1158,12 +1157,11 @@ func (az *azVirtualMachineScaleSetVMsClient) List(ctx context.Context, resourceG return result, nil } -func (az *azVirtualMachineScaleSetVMsClient) Update(ctx context.Context, resourceGroupName string, VMScaleSetName string, instanceID string, parameters compute.VirtualMachineScaleSetVM, source string) (resp *http.Response, err error) { +func (az *azVirtualMachineScaleSetVMsClient) Update(ctx context.Context, resourceGroupName string, VMScaleSetName string, instanceID string, parameters compute.VirtualMachineScaleSetVM, source string) *retry.Error { mc := newMetricContext("vmssvm", "create_or_update", resourceGroupName, az.client.SubscriptionID, source) if !az.rateLimiterWriter.TryAccept() { mc.RateLimitedCount() - err = createRateLimitErr(true, "VMSSVMUpdate") - return + return createRateLimitErr(true, "VMSSVMUpdate") } klog.V(10).Infof("azVirtualMachineScaleSetVMsClient.Update(%q,%q,%q): start", resourceGroupName, VMScaleSetName, instanceID) @@ -1173,11 +1171,11 @@ func (az *azVirtualMachineScaleSetVMsClient) Update(ctx context.Context, resourc future, err := az.client.Update(ctx, resourceGroupName, VMScaleSetName, instanceID, parameters) if err != nil { - return future.Response(), mc.Observe(err) + return retry.GetError(future.Response(), mc.Observe(err)) } err = future.WaitForCompletionRef(ctx, az.client.Client) - return future.Response(), mc.Observe(err) + return retry.GetError(future.Response(), mc.Observe(err)) } // azRoutesClient implements RoutesClient. @@ -1212,13 +1210,12 @@ func newAzRoutesClient(config *azClientConfig) *azRoutesClient { } } -func (az *azRoutesClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, routeTableName string, routeName string, routeParameters network.Route, etag string) (resp *http.Response, err error) { +func (az *azRoutesClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, routeTableName string, routeName string, routeParameters network.Route, etag string) *retry.Error { mc := newMetricContext("routes", "create_or_update", resourceGroupName, az.client.SubscriptionID, "") /* Write rate limiting */ if !az.rateLimiterWriter.TryAccept() { mc.RateLimitedCount() - err = createRateLimitErr(true, "RouteCreateOrUpdate") - return + return createRateLimitErr(true, "RouteCreateOrUpdate") } klog.V(10).Infof("azRoutesClient.CreateOrUpdate(%q,%q,%q): start", resourceGroupName, routeTableName, routeName) @@ -1228,17 +1225,16 @@ func (az *azRoutesClient) CreateOrUpdate(ctx context.Context, resourceGroupName req, err := az.createOrUpdatePreparer(ctx, resourceGroupName, routeTableName, routeName, routeParameters, etag) if err != nil { - mc.Observe(err) - return nil, err + return retry.NewError(false, mc.Observe(err)) } future, err := az.client.CreateOrUpdateSender(req) if err != nil { - return future.Response(), mc.Observe(err) + return retry.GetError(future.Response(), mc.Observe(err)) } err = future.WaitForCompletionRef(ctx, az.client.Client) - return future.Response(), mc.Observe(err) + return retry.GetError(future.Response(), mc.Observe(err)) } // createOrUpdatePreparer prepares the CreateOrUpdate request. @@ -1270,13 +1266,12 @@ func (az *azRoutesClient) createOrUpdatePreparer(ctx context.Context, resourceGr return preparer.Prepare((&http.Request{}).WithContext(ctx)) } -func (az *azRoutesClient) Delete(ctx context.Context, resourceGroupName string, routeTableName string, routeName string) (resp *http.Response, err error) { +func (az *azRoutesClient) Delete(ctx context.Context, resourceGroupName string, routeTableName string, routeName string) *retry.Error { mc := newMetricContext("routes", "delete", resourceGroupName, az.client.SubscriptionID, "") /* Write rate limiting */ if !az.rateLimiterWriter.TryAccept() { mc.RateLimitedCount() - err = createRateLimitErr(true, "RouteDelete") - return + return createRateLimitErr(true, "RouteDelete") } klog.V(10).Infof("azRoutesClient.Delete(%q,%q,%q): start", resourceGroupName, routeTableName, routeName) @@ -1286,11 +1281,11 @@ func (az *azRoutesClient) Delete(ctx context.Context, resourceGroupName string, future, err := az.client.Delete(ctx, resourceGroupName, routeTableName, routeName) if err != nil { - return future.Response(), mc.Observe(err) + return retry.GetStatusNotFoundAndIgnoredForbiddenError(future.Response(), mc.Observe(err)) } err = future.WaitForCompletionRef(ctx, az.client.Client) - return future.Response(), mc.Observe(err) + return retry.GetStatusNotFoundAndIgnoredForbiddenError(future.Response(), mc.Observe(err)) } // azRouteTablesClient implements RouteTablesClient. @@ -1325,13 +1320,12 @@ func newAzRouteTablesClient(config *azClientConfig) *azRouteTablesClient { } } -func (az *azRouteTablesClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, routeTableName string, parameters network.RouteTable, etag string) (resp *http.Response, err error) { +func (az *azRouteTablesClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, routeTableName string, parameters network.RouteTable, etag string) *retry.Error { mc := newMetricContext("route_tables", "create_or_update", resourceGroupName, az.client.SubscriptionID, "") /* Write rate limiting */ if !az.rateLimiterWriter.TryAccept() { mc.RateLimitedCount() - err = createRateLimitErr(true, "RouteTableCreateOrUpdate") - return + return createRateLimitErr(true, "RouteTableCreateOrUpdate") } klog.V(10).Infof("azRouteTablesClient.CreateOrUpdate(%q,%q): start", resourceGroupName, routeTableName) @@ -1341,16 +1335,16 @@ func (az *azRouteTablesClient) CreateOrUpdate(ctx context.Context, resourceGroup req, err := az.createOrUpdatePreparer(ctx, resourceGroupName, routeTableName, parameters, etag) if err != nil { - return nil, mc.Observe(err) + return retry.NewError(false, mc.Observe(err)) } future, err := az.client.CreateOrUpdateSender(req) if err != nil { - return future.Response(), mc.Observe(err) + return retry.GetError(future.Response(), mc.Observe(err)) } err = future.WaitForCompletionRef(ctx, az.client.Client) - return future.Response(), mc.Observe(err) + return retry.GetError(future.Response(), mc.Observe(err)) } // createOrUpdatePreparer prepares the CreateOrUpdate request. @@ -1380,11 +1374,11 @@ func (az *azRouteTablesClient) createOrUpdatePreparer(ctx context.Context, resou return preparer.Prepare((&http.Request{}).WithContext(ctx)) } -func (az *azRouteTablesClient) Get(ctx context.Context, resourceGroupName string, routeTableName string, expand string) (result network.RouteTable, err error) { +func (az *azRouteTablesClient) Get(ctx context.Context, resourceGroupName string, routeTableName string, expand string) (result network.RouteTable, rerr *retry.Error) { mc := newMetricContext("route_tables", "get", resourceGroupName, az.client.SubscriptionID, "") if !az.rateLimiterReader.TryAccept() { mc.RateLimitedCount() - err = createRateLimitErr(false, "GetRouteTable") + rerr = createRateLimitErr(false, "GetRouteTable") return } @@ -1393,9 +1387,10 @@ func (az *azRouteTablesClient) Get(ctx context.Context, resourceGroupName string 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 + return result, retry.GetError(result.Response.Response, err) } // azStorageAccountClient implements StorageAccountClient. @@ -1429,13 +1424,12 @@ func newAzStorageAccountClient(config *azClientConfig) *azStorageAccountClient { } } -func (az *azStorageAccountClient) Create(ctx context.Context, resourceGroupName string, accountName string, parameters storage.AccountCreateParameters) (result *http.Response, err error) { +func (az *azStorageAccountClient) Create(ctx context.Context, resourceGroupName string, accountName string, parameters storage.AccountCreateParameters) *retry.Error { mc := newMetricContext("storage_account", "create", resourceGroupName, az.client.SubscriptionID, "") /* Write rate limiting */ if !az.rateLimiterWriter.TryAccept() { mc.RateLimitedCount() - err = createRateLimitErr(true, "StorageAccountCreate") - return + return createRateLimitErr(true, "StorageAccountCreate") } klog.V(10).Infof("azStorageAccountClient.Create(%q,%q): start", resourceGroupName, accountName) @@ -1445,20 +1439,19 @@ func (az *azStorageAccountClient) Create(ctx context.Context, resourceGroupName future, err := az.client.Create(ctx, resourceGroupName, accountName, parameters) if err != nil { - return future.Response(), err + return retry.GetError(future.Response(), err) } err = future.WaitForCompletionRef(ctx, az.client.Client) mc.Observe(err) - return future.Response(), err + return retry.GetError(future.Response(), err) } -func (az *azStorageAccountClient) Delete(ctx context.Context, resourceGroupName string, accountName string) (result autorest.Response, err error) { +func (az *azStorageAccountClient) Delete(ctx context.Context, resourceGroupName string, accountName string) *retry.Error { mc := newMetricContext("storage_account", "delete", resourceGroupName, az.client.SubscriptionID, "") if !az.rateLimiterReader.TryAccept() { mc.RateLimitedCount() - err = createRateLimitErr(false, "DeleteStorageAccount") - return + return createRateLimitErr(false, "DeleteStorageAccount") } klog.V(10).Infof("azStorageAccountClient.Delete(%q,%q): start", resourceGroupName, accountName) @@ -1466,16 +1459,16 @@ func (az *azStorageAccountClient) Delete(ctx context.Context, resourceGroupName klog.V(10).Infof("azStorageAccountClient.Delete(%q,%q): end", resourceGroupName, accountName) }() - result, err = az.client.Delete(ctx, resourceGroupName, accountName) + result, err := az.client.Delete(ctx, resourceGroupName, accountName) mc.Observe(err) - return + return retry.GetStatusNotFoundAndIgnoredForbiddenError(result.Response, err) } -func (az *azStorageAccountClient) ListKeys(ctx context.Context, resourceGroupName string, accountName string) (result storage.AccountListKeysResult, err error) { +func (az *azStorageAccountClient) ListKeys(ctx context.Context, resourceGroupName string, accountName string) (result storage.AccountListKeysResult, rerr *retry.Error) { mc := newMetricContext("storage_account", "list_keys", resourceGroupName, az.client.SubscriptionID, "") if !az.rateLimiterReader.TryAccept() { mc.RateLimitedCount() - err = createRateLimitErr(false, "ListStorageAccountKeys") + rerr = createRateLimitErr(false, "ListStorageAccountKeys") return } @@ -1484,16 +1477,17 @@ func (az *azStorageAccountClient) ListKeys(ctx context.Context, resourceGroupNam klog.V(10).Infof("azStorageAccountClient.ListKeys(%q,%q): end", resourceGroupName, accountName) }() + var err error result, err = az.client.ListKeys(ctx, resourceGroupName, accountName, storage.Kerb) mc.Observe(err) - return + return result, retry.GetError(result.Response.Response, err) } -func (az *azStorageAccountClient) ListByResourceGroup(ctx context.Context, resourceGroupName string) (result storage.AccountListResult, err error) { +func (az *azStorageAccountClient) ListByResourceGroup(ctx context.Context, resourceGroupName string) (result storage.AccountListResult, rerr *retry.Error) { mc := newMetricContext("storage_account", "list_by_resource_group", resourceGroupName, az.client.SubscriptionID, "") if !az.rateLimiterReader.TryAccept() { mc.RateLimitedCount() - err = createRateLimitErr(false, "ListStorageAccountsByResourceGroup") + rerr = createRateLimitErr(false, "ListStorageAccountsByResourceGroup") return } @@ -1502,16 +1496,17 @@ func (az *azStorageAccountClient) ListByResourceGroup(ctx context.Context, resou klog.V(10).Infof("azStorageAccountClient.ListByResourceGroup(%q): end", resourceGroupName) }() + var err error result, err = az.client.ListByResourceGroup(ctx, resourceGroupName) mc.Observe(err) - return + return result, retry.GetError(result.Response.Response, err) } -func (az *azStorageAccountClient) GetProperties(ctx context.Context, resourceGroupName string, accountName string) (result storage.Account, err error) { +func (az *azStorageAccountClient) GetProperties(ctx context.Context, resourceGroupName string, accountName string) (result storage.Account, rerr *retry.Error) { mc := newMetricContext("storage_account", "get_properties", resourceGroupName, az.client.SubscriptionID, "") if !az.rateLimiterReader.TryAccept() { mc.RateLimitedCount() - err = createRateLimitErr(false, "GetStorageAccount/Properties") + rerr = createRateLimitErr(false, "GetStorageAccount/Properties") return } @@ -1520,9 +1515,10 @@ func (az *azStorageAccountClient) GetProperties(ctx context.Context, resourceGro klog.V(10).Infof("azStorageAccountClient.GetProperties(%q,%q): end", resourceGroupName, accountName) }() + var err error result, err = az.client.GetProperties(ctx, resourceGroupName, accountName, "") mc.Observe(err) - return + return result, retry.GetError(result.Response.Response, err) } // azDisksClient implements DisksClient. @@ -1556,13 +1552,12 @@ func newAzDisksClient(config *azClientConfig) *azDisksClient { } } -func (az *azDisksClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, diskName string, diskParameter compute.Disk) (resp *http.Response, err error) { +func (az *azDisksClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, diskName string, diskParameter compute.Disk) *retry.Error { mc := newMetricContext("disks", "create_or_update", resourceGroupName, az.client.SubscriptionID, "") /* Write rate limiting */ if !az.rateLimiterWriter.TryAccept() { mc.RateLimitedCount() - err = createRateLimitErr(true, "DiskCreateOrUpdate") - return + return createRateLimitErr(true, "DiskCreateOrUpdate") } klog.V(10).Infof("azDisksClient.CreateOrUpdate(%q,%q): start", resourceGroupName, diskName) @@ -1572,20 +1567,19 @@ func (az *azDisksClient) CreateOrUpdate(ctx context.Context, resourceGroupName s future, err := az.client.CreateOrUpdate(ctx, resourceGroupName, diskName, diskParameter) if err != nil { - return future.Response(), mc.Observe(err) + return retry.GetError(future.Response(), mc.Observe(err)) } err = future.WaitForCompletionRef(ctx, az.client.Client) - return future.Response(), mc.Observe(err) + return retry.GetError(future.Response(), mc.Observe(err)) } -func (az *azDisksClient) Delete(ctx context.Context, resourceGroupName string, diskName string) (resp *http.Response, err error) { +func (az *azDisksClient) Delete(ctx context.Context, resourceGroupName string, diskName string) *retry.Error { mc := newMetricContext("disks", "delete", resourceGroupName, az.client.SubscriptionID, "") /* Write rate limiting */ if !az.rateLimiterWriter.TryAccept() { mc.RateLimitedCount() - err = createRateLimitErr(true, "DiskDelete") - return + return createRateLimitErr(true, "DiskDelete") } klog.V(10).Infof("azDisksClient.Delete(%q,%q): start", resourceGroupName, diskName) @@ -1595,17 +1589,17 @@ func (az *azDisksClient) Delete(ctx context.Context, resourceGroupName string, d future, err := az.client.Delete(ctx, resourceGroupName, diskName) if err != nil { - return future.Response(), mc.Observe(err) + return retry.GetStatusNotFoundAndIgnoredForbiddenError(future.Response(), mc.Observe(err)) } err = future.WaitForCompletionRef(ctx, az.client.Client) - return future.Response(), mc.Observe(err) + return retry.GetStatusNotFoundAndIgnoredForbiddenError(future.Response(), mc.Observe(err)) } -func (az *azDisksClient) Get(ctx context.Context, resourceGroupName string, diskName string) (result compute.Disk, err error) { +func (az *azDisksClient) Get(ctx context.Context, resourceGroupName string, diskName string) (result compute.Disk, rerr *retry.Error) { mc := newMetricContext("disks", "get", resourceGroupName, az.client.SubscriptionID, "") if !az.rateLimiterReader.TryAccept() { mc.RateLimitedCount() - err = createRateLimitErr(false, "GetDisk") + rerr = createRateLimitErr(false, "GetDisk") return } @@ -1614,9 +1608,10 @@ func (az *azDisksClient) Get(ctx context.Context, resourceGroupName string, disk klog.V(10).Infof("azDisksClient.Get(%q,%q): end", resourceGroupName, diskName) }() + var err error result, err = az.client.Get(ctx, resourceGroupName, diskName) mc.Observe(err) - return + return result, retry.GetError(result.Response.Response, err) } // TODO(feiskyer): refactor compute.SnapshotsClient to Interface. @@ -1664,11 +1659,11 @@ func newAzVirtualMachineSizesClient(config *azClientConfig) *azVirtualMachineSiz } } -func (az *azVirtualMachineSizesClient) List(ctx context.Context, location string) (result compute.VirtualMachineSizeListResult, err error) { +func (az *azVirtualMachineSizesClient) List(ctx context.Context, location string) (result compute.VirtualMachineSizeListResult, rerr *retry.Error) { mc := newMetricContext("vmsizes", "list", "", az.client.SubscriptionID, "") if !az.rateLimiterReader.TryAccept() { mc.RateLimitedCount() - err = createRateLimitErr(false, "VMSizesList") + rerr = createRateLimitErr(false, "VMSizesList") return } @@ -1677,7 +1672,8 @@ func (az *azVirtualMachineSizesClient) List(ctx context.Context, location string klog.V(10).Infof("azVirtualMachineSizesClient.List(%q): end", location) }() + var err error result, err = az.client.List(ctx, location) mc.Observe(err) - return + return result, retry.GetError(result.Response.Response, err) } diff --git a/staging/src/k8s.io/legacy-cloud-providers/azure/azure_fakes.go b/staging/src/k8s.io/legacy-cloud-providers/azure/azure_fakes.go index eb563fa2224..71f82cebc49 100644 --- a/staging/src/k8s.io/legacy-cloud-providers/azure/azure_fakes.go +++ b/staging/src/k8s.io/legacy-cloud-providers/azure/azure_fakes.go @@ -20,6 +20,7 @@ package azure import ( "context" + "errors" "fmt" "math/rand" "net/http" @@ -29,12 +30,12 @@ import ( "github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-07-01/compute" "github.com/Azure/azure-sdk-for-go/services/network/mgmt/2019-06-01/network" "github.com/Azure/azure-sdk-for-go/services/storage/mgmt/2019-06-01/storage" - "github.com/Azure/go-autorest/autorest" "github.com/Azure/go-autorest/autorest/to" v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/types" cloudprovider "k8s.io/cloud-provider" + "k8s.io/legacy-cloud-providers/azure/retry" ) var ( @@ -53,7 +54,7 @@ func newFakeAzureLBClient() *fakeAzureLBClient { return fLBC } -func (fLBC *fakeAzureLBClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, loadBalancerName string, parameters network.LoadBalancer, etag string) (resp *http.Response, err error) { +func (fLBC *fakeAzureLBClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, loadBalancerName string, parameters network.LoadBalancer, etag string) *retry.Error { fLBC.mutex.Lock() defer fLBC.mutex.Unlock() @@ -73,26 +74,24 @@ func (fLBC *fakeAzureLBClient) CreateOrUpdate(ctx context.Context, resourceGroup } fLBC.FakeStore[resourceGroupName][loadBalancerName] = parameters - return nil, nil + return nil } -func (fLBC *fakeAzureLBClient) Delete(ctx context.Context, resourceGroupName string, loadBalancerName string) (resp *http.Response, err error) { +func (fLBC *fakeAzureLBClient) Delete(ctx context.Context, resourceGroupName string, loadBalancerName string) *retry.Error { fLBC.mutex.Lock() defer fLBC.mutex.Unlock() if rgLBs, ok := fLBC.FakeStore[resourceGroupName]; ok { if _, ok := rgLBs[loadBalancerName]; ok { delete(rgLBs, loadBalancerName) - return nil, nil + return nil } } - return &http.Response{ - StatusCode: http.StatusNotFound, - }, nil + return nil } -func (fLBC *fakeAzureLBClient) Get(ctx context.Context, resourceGroupName string, loadBalancerName string, expand string) (result network.LoadBalancer, err error) { +func (fLBC *fakeAzureLBClient) Get(ctx context.Context, resourceGroupName string, loadBalancerName string, expand string) (result network.LoadBalancer, err *retry.Error) { fLBC.mutex.Lock() defer fLBC.mutex.Unlock() if _, ok := fLBC.FakeStore[resourceGroupName]; ok { @@ -100,13 +99,14 @@ func (fLBC *fakeAzureLBClient) Get(ctx context.Context, resourceGroupName string return entity, nil } } - return result, autorest.DetailedError{ - StatusCode: http.StatusNotFound, - Message: "Not such LB", - } + return result, retry.GetError( + &http.Response{ + StatusCode: http.StatusNotFound, + }, + errors.New("Not such LB")) } -func (fLBC *fakeAzureLBClient) List(ctx context.Context, resourceGroupName string) (result []network.LoadBalancer, err error) { +func (fLBC *fakeAzureLBClient) List(ctx context.Context, resourceGroupName string) (result []network.LoadBalancer, err *retry.Error) { fLBC.mutex.Lock() defer fLBC.mutex.Unlock() @@ -144,7 +144,7 @@ func newFakeAzurePIPClient(subscriptionID string) *fakeAzurePIPClient { return fAPC } -func (fAPC *fakeAzurePIPClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, publicIPAddressName string, parameters network.PublicIPAddress) (resp *http.Response, err error) { +func (fAPC *fakeAzurePIPClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, publicIPAddressName string, parameters network.PublicIPAddress) *retry.Error { fAPC.mutex.Lock() defer fAPC.mutex.Unlock() @@ -165,26 +165,28 @@ func (fAPC *fakeAzurePIPClient) CreateOrUpdate(ctx context.Context, resourceGrou fAPC.FakeStore[resourceGroupName][publicIPAddressName] = parameters - return nil, nil + return nil } -func (fAPC *fakeAzurePIPClient) Delete(ctx context.Context, resourceGroupName string, publicIPAddressName string) (resp *http.Response, err error) { +func (fAPC *fakeAzurePIPClient) Delete(ctx context.Context, resourceGroupName string, publicIPAddressName string) *retry.Error { fAPC.mutex.Lock() defer fAPC.mutex.Unlock() if rgPIPs, ok := fAPC.FakeStore[resourceGroupName]; ok { if _, ok := rgPIPs[publicIPAddressName]; ok { delete(rgPIPs, publicIPAddressName) - return nil, nil + return nil } } - return &http.Response{ - StatusCode: http.StatusNotFound, - }, nil + return retry.GetError( + &http.Response{ + StatusCode: http.StatusNotFound, + }, + errors.New("Not such PIP")) } -func (fAPC *fakeAzurePIPClient) Get(ctx context.Context, resourceGroupName string, publicIPAddressName string, expand string) (result network.PublicIPAddress, err error) { +func (fAPC *fakeAzurePIPClient) Get(ctx context.Context, resourceGroupName string, publicIPAddressName string, expand string) (result network.PublicIPAddress, err *retry.Error) { fAPC.mutex.Lock() defer fAPC.mutex.Unlock() if _, ok := fAPC.FakeStore[resourceGroupName]; ok { @@ -192,13 +194,14 @@ func (fAPC *fakeAzurePIPClient) Get(ctx context.Context, resourceGroupName strin return entity, nil } } - return result, autorest.DetailedError{ - StatusCode: http.StatusNotFound, - Message: "No such PIP", - } + return result, retry.GetError( + &http.Response{ + StatusCode: http.StatusNotFound, + }, + errors.New("Not such PIP")) } -func (fAPC *fakeAzurePIPClient) GetVirtualMachineScaleSetPublicIPAddress(ctx context.Context, resourceGroupName string, virtualMachineScaleSetName string, virtualmachineIndex string, networkInterfaceName string, IPConfigurationName string, publicIPAddressName string, expand string) (result network.PublicIPAddress, err error) { +func (fAPC *fakeAzurePIPClient) GetVirtualMachineScaleSetPublicIPAddress(ctx context.Context, resourceGroupName string, virtualMachineScaleSetName string, virtualmachineIndex string, networkInterfaceName string, IPConfigurationName string, publicIPAddressName string, expand string) (result network.PublicIPAddress, err *retry.Error) { fAPC.mutex.Lock() defer fAPC.mutex.Unlock() if _, ok := fAPC.FakeStore[resourceGroupName]; ok { @@ -206,13 +209,14 @@ func (fAPC *fakeAzurePIPClient) GetVirtualMachineScaleSetPublicIPAddress(ctx con return entity, nil } } - return result, autorest.DetailedError{ - StatusCode: http.StatusNotFound, - Message: "No such PIP", - } + return result, retry.GetError( + &http.Response{ + StatusCode: http.StatusNotFound, + }, + errors.New("Not such PIP")) } -func (fAPC *fakeAzurePIPClient) List(ctx context.Context, resourceGroupName string) (result []network.PublicIPAddress, err error) { +func (fAPC *fakeAzurePIPClient) List(ctx context.Context, resourceGroupName string) (result []network.PublicIPAddress, err *retry.Error) { fAPC.mutex.Lock() defer fAPC.mutex.Unlock() @@ -246,7 +250,7 @@ func newFakeAzureInterfacesClient() *fakeAzureInterfacesClient { return fIC } -func (fIC *fakeAzureInterfacesClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, networkInterfaceName string, parameters network.Interface) (resp *http.Response, err error) { +func (fIC *fakeAzureInterfacesClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, networkInterfaceName string, parameters network.Interface) *retry.Error { fIC.mutex.Lock() defer fIC.mutex.Unlock() @@ -255,10 +259,10 @@ func (fIC *fakeAzureInterfacesClient) CreateOrUpdate(ctx context.Context, resour } fIC.FakeStore[resourceGroupName][networkInterfaceName] = parameters - return nil, nil + return nil } -func (fIC *fakeAzureInterfacesClient) Get(ctx context.Context, resourceGroupName string, networkInterfaceName string, expand string) (result network.Interface, err error) { +func (fIC *fakeAzureInterfacesClient) Get(ctx context.Context, resourceGroupName string, networkInterfaceName string, expand string) (result network.Interface, err *retry.Error) { fIC.mutex.Lock() defer fIC.mutex.Unlock() if _, ok := fIC.FakeStore[resourceGroupName]; ok { @@ -266,13 +270,14 @@ func (fIC *fakeAzureInterfacesClient) Get(ctx context.Context, resourceGroupName return entity, nil } } - return result, autorest.DetailedError{ - StatusCode: http.StatusNotFound, - Message: "Not such Interface", - } + return result, retry.GetError( + &http.Response{ + StatusCode: http.StatusNotFound, + }, + errors.New("Not such Interface")) } -func (fIC *fakeAzureInterfacesClient) GetVirtualMachineScaleSetNetworkInterface(ctx context.Context, resourceGroupName string, virtualMachineScaleSetName string, virtualmachineIndex string, networkInterfaceName string, expand string) (result network.Interface, err error) { +func (fIC *fakeAzureInterfacesClient) GetVirtualMachineScaleSetNetworkInterface(ctx context.Context, resourceGroupName string, virtualMachineScaleSetName string, virtualmachineIndex string, networkInterfaceName string, expand string) (result network.Interface, err *retry.Error) { fIC.mutex.Lock() defer fIC.mutex.Unlock() if _, ok := fIC.FakeStore[resourceGroupName]; ok { @@ -280,10 +285,11 @@ func (fIC *fakeAzureInterfacesClient) GetVirtualMachineScaleSetNetworkInterface( return entity, nil } } - return result, autorest.DetailedError{ - StatusCode: http.StatusNotFound, - Message: "Not such Interface", - } + return result, retry.GetError( + &http.Response{ + StatusCode: http.StatusNotFound, + }, + errors.New("Not such Interface")) } func (fIC *fakeAzureInterfacesClient) setFakeStore(store map[string]map[string]network.Interface) { @@ -305,7 +311,7 @@ func newFakeAzureVirtualMachinesClient() *fakeAzureVirtualMachinesClient { return fVMC } -func (fVMC *fakeAzureVirtualMachinesClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, VMName string, parameters compute.VirtualMachine, source string) (resp *http.Response, err error) { +func (fVMC *fakeAzureVirtualMachinesClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, VMName string, parameters compute.VirtualMachine, source string) *retry.Error { fVMC.mutex.Lock() defer fVMC.mutex.Unlock() @@ -314,10 +320,10 @@ func (fVMC *fakeAzureVirtualMachinesClient) CreateOrUpdate(ctx context.Context, } fVMC.FakeStore[resourceGroupName][VMName] = parameters - return nil, nil + return nil } -func (fVMC *fakeAzureVirtualMachinesClient) Update(ctx context.Context, resourceGroupName string, VMName string, parameters compute.VirtualMachineUpdate, source string) (resp *http.Response, err error) { +func (fVMC *fakeAzureVirtualMachinesClient) Update(ctx context.Context, resourceGroupName string, VMName string, parameters compute.VirtualMachineUpdate, source string) *retry.Error { fVMC.mutex.Lock() defer fVMC.mutex.Unlock() @@ -325,10 +331,10 @@ func (fVMC *fakeAzureVirtualMachinesClient) Update(ctx context.Context, resource fVMC.FakeStore[resourceGroupName] = make(map[string]compute.VirtualMachine) } - return nil, nil + return nil } -func (fVMC *fakeAzureVirtualMachinesClient) Get(ctx context.Context, resourceGroupName string, VMName string, expand compute.InstanceViewTypes) (result compute.VirtualMachine, err error) { +func (fVMC *fakeAzureVirtualMachinesClient) Get(ctx context.Context, resourceGroupName string, VMName string, expand compute.InstanceViewTypes) (result compute.VirtualMachine, err *retry.Error) { fVMC.mutex.Lock() defer fVMC.mutex.Unlock() if _, ok := fVMC.FakeStore[resourceGroupName]; ok { @@ -336,13 +342,14 @@ func (fVMC *fakeAzureVirtualMachinesClient) Get(ctx context.Context, resourceGro return entity, nil } } - return result, autorest.DetailedError{ - StatusCode: http.StatusNotFound, - Message: "Not such VM", - } + return result, retry.GetError( + &http.Response{ + StatusCode: http.StatusNotFound, + }, + errors.New("Not such VM")) } -func (fVMC *fakeAzureVirtualMachinesClient) List(ctx context.Context, resourceGroupName string) (result []compute.VirtualMachine, err error) { +func (fVMC *fakeAzureVirtualMachinesClient) List(ctx context.Context, resourceGroupName string) (result []compute.VirtualMachine, err *retry.Error) { fVMC.mutex.Lock() defer fVMC.mutex.Unlock() @@ -375,7 +382,7 @@ func newFakeAzureSubnetsClient() *fakeAzureSubnetsClient { return fASC } -func (fASC *fakeAzureSubnetsClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, virtualNetworkName string, subnetName string, subnetParameters network.Subnet) (resp *http.Response, err error) { +func (fASC *fakeAzureSubnetsClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, virtualNetworkName string, subnetName string, subnetParameters network.Subnet) *retry.Error { fASC.mutex.Lock() defer fASC.mutex.Unlock() @@ -385,10 +392,10 @@ func (fASC *fakeAzureSubnetsClient) CreateOrUpdate(ctx context.Context, resource } fASC.FakeStore[rgVnet][subnetName] = subnetParameters - return nil, nil + return nil } -func (fASC *fakeAzureSubnetsClient) Delete(ctx context.Context, resourceGroupName string, virtualNetworkName string, subnetName string) (resp *http.Response, err error) { +func (fASC *fakeAzureSubnetsClient) Delete(ctx context.Context, resourceGroupName string, virtualNetworkName string, subnetName string) *retry.Error { fASC.mutex.Lock() defer fASC.mutex.Unlock() @@ -396,16 +403,18 @@ func (fASC *fakeAzureSubnetsClient) Delete(ctx context.Context, resourceGroupNam if rgSubnets, ok := fASC.FakeStore[rgVnet]; ok { if _, ok := rgSubnets[subnetName]; ok { delete(rgSubnets, subnetName) - return nil, nil + return nil } } - return &http.Response{ - StatusCode: http.StatusNotFound, - }, nil + return retry.GetError( + &http.Response{ + StatusCode: http.StatusNotFound, + }, + errors.New("Not such Subnet")) } -func (fASC *fakeAzureSubnetsClient) Get(ctx context.Context, resourceGroupName string, virtualNetworkName string, subnetName string, expand string) (result network.Subnet, err error) { +func (fASC *fakeAzureSubnetsClient) Get(ctx context.Context, resourceGroupName string, virtualNetworkName string, subnetName string, expand string) (result network.Subnet, err *retry.Error) { fASC.mutex.Lock() defer fASC.mutex.Unlock() rgVnet := strings.Join([]string{resourceGroupName, virtualNetworkName}, "AND") @@ -414,13 +423,14 @@ func (fASC *fakeAzureSubnetsClient) Get(ctx context.Context, resourceGroupName s return entity, nil } } - return result, autorest.DetailedError{ - StatusCode: http.StatusNotFound, - Message: "Not such Subnet", - } + return result, retry.GetError( + &http.Response{ + StatusCode: http.StatusNotFound, + }, + errors.New("Not such Subnet")) } -func (fASC *fakeAzureSubnetsClient) List(ctx context.Context, resourceGroupName string, virtualNetworkName string) (result []network.Subnet, err error) { +func (fASC *fakeAzureSubnetsClient) List(ctx context.Context, resourceGroupName string, virtualNetworkName string) (result []network.Subnet, err *retry.Error) { fASC.mutex.Lock() defer fASC.mutex.Unlock() @@ -447,7 +457,7 @@ func newFakeAzureNSGClient() *fakeAzureNSGClient { return fNSG } -func (fNSG *fakeAzureNSGClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, networkSecurityGroupName string, parameters network.SecurityGroup, etag string) (resp *http.Response, err error) { +func (fNSG *fakeAzureNSGClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, networkSecurityGroupName string, parameters network.SecurityGroup, etag string) *retry.Error { fNSG.mutex.Lock() defer fNSG.mutex.Unlock() @@ -457,33 +467,35 @@ func (fNSG *fakeAzureNSGClient) CreateOrUpdate(ctx context.Context, resourceGrou if nsg, ok := fNSG.FakeStore[resourceGroupName][networkSecurityGroupName]; ok { if etag != "" && to.String(nsg.Etag) != "" && etag != to.String(nsg.Etag) { - return &http.Response{ + return retry.GetError(&http.Response{ StatusCode: http.StatusPreconditionFailed, - }, errPreconditionFailedEtagMismatch + }, errPreconditionFailedEtagMismatch) } } fNSG.FakeStore[resourceGroupName][networkSecurityGroupName] = parameters - return nil, nil + return nil } -func (fNSG *fakeAzureNSGClient) Delete(ctx context.Context, resourceGroupName string, networkSecurityGroupName string) (resp *http.Response, err error) { +func (fNSG *fakeAzureNSGClient) Delete(ctx context.Context, resourceGroupName string, networkSecurityGroupName string) *retry.Error { fNSG.mutex.Lock() defer fNSG.mutex.Unlock() if rgSGs, ok := fNSG.FakeStore[resourceGroupName]; ok { if _, ok := rgSGs[networkSecurityGroupName]; ok { delete(rgSGs, networkSecurityGroupName) - return nil, nil + return nil } } - return &http.Response{ - StatusCode: http.StatusNotFound, - }, nil + return retry.GetError( + &http.Response{ + StatusCode: http.StatusNotFound, + }, + errors.New("Not such NSG")) } -func (fNSG *fakeAzureNSGClient) Get(ctx context.Context, resourceGroupName string, networkSecurityGroupName string, expand string) (result network.SecurityGroup, err error) { +func (fNSG *fakeAzureNSGClient) Get(ctx context.Context, resourceGroupName string, networkSecurityGroupName string, expand string) (result network.SecurityGroup, err *retry.Error) { fNSG.mutex.Lock() defer fNSG.mutex.Unlock() if _, ok := fNSG.FakeStore[resourceGroupName]; ok { @@ -491,13 +503,14 @@ func (fNSG *fakeAzureNSGClient) Get(ctx context.Context, resourceGroupName strin return entity, nil } } - return result, autorest.DetailedError{ - StatusCode: http.StatusNotFound, - Message: "Not such NSG", - } + return result, retry.GetError( + &http.Response{ + StatusCode: http.StatusNotFound, + }, + errors.New("Not such NSG")) } -func (fNSG *fakeAzureNSGClient) List(ctx context.Context, resourceGroupName string) (result []network.SecurityGroup, err error) { +func (fNSG *fakeAzureNSGClient) List(ctx context.Context, resourceGroupName string) (result []network.SecurityGroup, err *retry.Error) { fNSG.mutex.Lock() defer fNSG.mutex.Unlock() @@ -535,7 +548,7 @@ func (fVMC *fakeVirtualMachineScaleSetVMsClient) setFakeStore(store map[string]m fVMC.FakeStore = store } -func (fVMC *fakeVirtualMachineScaleSetVMsClient) List(ctx context.Context, resourceGroupName string, virtualMachineScaleSetName string, filter string, selectParameter string, expand string) (result []compute.VirtualMachineScaleSetVM, err error) { +func (fVMC *fakeVirtualMachineScaleSetVMsClient) List(ctx context.Context, resourceGroupName string, virtualMachineScaleSetName string, filter string, selectParameter string, expand string) (result []compute.VirtualMachineScaleSetVM, err *retry.Error) { fVMC.mutex.Lock() defer fVMC.mutex.Unlock() @@ -549,7 +562,7 @@ func (fVMC *fakeVirtualMachineScaleSetVMsClient) List(ctx context.Context, resou return result, nil } -func (fVMC *fakeVirtualMachineScaleSetVMsClient) Get(ctx context.Context, resourceGroupName string, VMScaleSetName string, instanceID string, expand compute.InstanceViewTypes) (result compute.VirtualMachineScaleSetVM, err error) { +func (fVMC *fakeVirtualMachineScaleSetVMsClient) Get(ctx context.Context, resourceGroupName string, VMScaleSetName string, instanceID string, expand compute.InstanceViewTypes) (result compute.VirtualMachineScaleSetVM, err *retry.Error) { fVMC.mutex.Lock() defer fVMC.mutex.Unlock() @@ -560,13 +573,14 @@ func (fVMC *fakeVirtualMachineScaleSetVMsClient) Get(ctx context.Context, resour } } - return result, autorest.DetailedError{ - StatusCode: http.StatusNotFound, - Message: "No such VirtualMachineScaleSetVM", - } + return result, retry.GetError( + &http.Response{ + StatusCode: http.StatusNotFound, + }, + errors.New("Not such VirtualMachineScaleSetVM")) } -func (fVMC *fakeVirtualMachineScaleSetVMsClient) Update(ctx context.Context, resourceGroupName string, VMScaleSetName string, instanceID string, parameters compute.VirtualMachineScaleSetVM, source string) (resp *http.Response, err error) { +func (fVMC *fakeVirtualMachineScaleSetVMsClient) Update(ctx context.Context, resourceGroupName string, VMScaleSetName string, instanceID string, parameters compute.VirtualMachineScaleSetVM, source string) *retry.Error { fVMC.mutex.Lock() defer fVMC.mutex.Unlock() @@ -577,7 +591,7 @@ func (fVMC *fakeVirtualMachineScaleSetVMsClient) Update(ctx context.Context, res } } - return nil, nil + return nil } type fakeVirtualMachineScaleSetsClient struct { @@ -600,7 +614,7 @@ func (fVMSSC *fakeVirtualMachineScaleSetsClient) setFakeStore(store map[string]m fVMSSC.FakeStore = store } -func (fVMSSC *fakeVirtualMachineScaleSetsClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, VMScaleSetName string, parameters compute.VirtualMachineScaleSet) (resp *http.Response, err error) { +func (fVMSSC *fakeVirtualMachineScaleSetsClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, VMScaleSetName string, parameters compute.VirtualMachineScaleSet) *retry.Error { fVMSSC.mutex.Lock() defer fVMSSC.mutex.Unlock() @@ -609,10 +623,10 @@ func (fVMSSC *fakeVirtualMachineScaleSetsClient) CreateOrUpdate(ctx context.Cont } fVMSSC.FakeStore[resourceGroupName][VMScaleSetName] = parameters - return nil, nil + return nil } -func (fVMSSC *fakeVirtualMachineScaleSetsClient) Get(ctx context.Context, resourceGroupName string, VMScaleSetName string) (result compute.VirtualMachineScaleSet, err error) { +func (fVMSSC *fakeVirtualMachineScaleSetsClient) Get(ctx context.Context, resourceGroupName string, VMScaleSetName string) (result compute.VirtualMachineScaleSet, err *retry.Error) { fVMSSC.mutex.Lock() defer fVMSSC.mutex.Unlock() @@ -622,13 +636,14 @@ func (fVMSSC *fakeVirtualMachineScaleSetsClient) Get(ctx context.Context, resour } } - return result, autorest.DetailedError{ - StatusCode: http.StatusNotFound, - Message: "No such ScaleSet", - } + return result, retry.GetError( + &http.Response{ + StatusCode: http.StatusNotFound, + }, + errors.New("Not such ScaleSet")) } -func (fVMSSC *fakeVirtualMachineScaleSetsClient) List(ctx context.Context, resourceGroupName string) (result []compute.VirtualMachineScaleSet, err error) { +func (fVMSSC *fakeVirtualMachineScaleSetsClient) List(ctx context.Context, resourceGroupName string) (result []compute.VirtualMachineScaleSet, err *retry.Error) { fVMSSC.mutex.Lock() defer fVMSSC.mutex.Unlock() @@ -642,8 +657,8 @@ func (fVMSSC *fakeVirtualMachineScaleSetsClient) List(ctx context.Context, resou return result, nil } -func (fVMSSC *fakeVirtualMachineScaleSetsClient) UpdateInstances(ctx context.Context, resourceGroupName string, VMScaleSetName string, VMInstanceIDs compute.VirtualMachineScaleSetVMInstanceRequiredIDs) (resp *http.Response, err error) { - return nil, nil +func (fVMSSC *fakeVirtualMachineScaleSetsClient) UpdateInstances(ctx context.Context, resourceGroupName string, VMScaleSetName string, VMInstanceIDs compute.VirtualMachineScaleSetVMInstanceRequiredIDs) *retry.Error { + return nil } type fakeRoutesClient struct { @@ -658,7 +673,7 @@ func newFakeRoutesClient() *fakeRoutesClient { return fRC } -func (fRC *fakeRoutesClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, routeTableName string, routeName string, routeParameters network.Route, etag string) (resp *http.Response, err error) { +func (fRC *fakeRoutesClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, routeTableName string, routeName string, routeParameters network.Route, etag string) *retry.Error { fRC.mutex.Lock() defer fRC.mutex.Unlock() @@ -667,23 +682,25 @@ func (fRC *fakeRoutesClient) CreateOrUpdate(ctx context.Context, resourceGroupNa } fRC.FakeStore[routeTableName][routeName] = routeParameters - return nil, nil + return nil } -func (fRC *fakeRoutesClient) Delete(ctx context.Context, resourceGroupName string, routeTableName string, routeName string) (resp *http.Response, err error) { +func (fRC *fakeRoutesClient) Delete(ctx context.Context, resourceGroupName string, routeTableName string, routeName string) *retry.Error { fRC.mutex.Lock() defer fRC.mutex.Unlock() if routes, ok := fRC.FakeStore[routeTableName]; ok { if _, ok := routes[routeName]; ok { delete(routes, routeName) - return nil, nil + return nil } } - return &http.Response{ - StatusCode: http.StatusNotFound, - }, nil + return retry.GetError( + &http.Response{ + StatusCode: http.StatusNotFound, + }, + errors.New("Not such Route")) } type fakeRouteTablesClient struct { @@ -699,7 +716,7 @@ func newFakeRouteTablesClient() *fakeRouteTablesClient { return fRTC } -func (fRTC *fakeRouteTablesClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, routeTableName string, parameters network.RouteTable, etag string) (resp *http.Response, err error) { +func (fRTC *fakeRouteTablesClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, routeTableName string, parameters network.RouteTable, etag string) *retry.Error { fRTC.mutex.Lock() defer fRTC.mutex.Unlock() @@ -710,10 +727,10 @@ func (fRTC *fakeRouteTablesClient) CreateOrUpdate(ctx context.Context, resourceG } fRTC.FakeStore[resourceGroupName][routeTableName] = parameters - return nil, nil + return nil } -func (fRTC *fakeRouteTablesClient) Get(ctx context.Context, resourceGroupName string, routeTableName string, expand string) (result network.RouteTable, err error) { +func (fRTC *fakeRouteTablesClient) Get(ctx context.Context, resourceGroupName string, routeTableName string, expand string) (result network.RouteTable, err *retry.Error) { fRTC.mutex.Lock() defer fRTC.mutex.Unlock() @@ -724,10 +741,11 @@ func (fRTC *fakeRouteTablesClient) Get(ctx context.Context, resourceGroupName st return entity, nil } } - return result, autorest.DetailedError{ - StatusCode: http.StatusNotFound, - Message: "Not such RouteTable", - } + return result, retry.GetError( + &http.Response{ + StatusCode: http.StatusNotFound, + }, + errors.New("Not such RouteTable")) } type fakeFileClient struct { @@ -760,7 +778,7 @@ func newFakeStorageAccountClient() *fakeStorageAccountClient { return fSAC } -func (fSAC *fakeStorageAccountClient) Create(ctx context.Context, resourceGroupName string, accountName string, parameters storage.AccountCreateParameters) (resp *http.Response, err error) { +func (fSAC *fakeStorageAccountClient) Create(ctx context.Context, resourceGroupName string, accountName string, parameters storage.AccountCreateParameters) *retry.Error { fSAC.mutex.Lock() defer fSAC.mutex.Unlock() @@ -777,42 +795,36 @@ func (fSAC *fakeStorageAccountClient) Create(ctx context.Context, resourceGroupN AccountProperties: &storage.AccountProperties{}, } - return nil, nil + return nil } -func (fSAC *fakeStorageAccountClient) Delete(ctx context.Context, resourceGroupName string, accountName string) (result autorest.Response, err error) { +func (fSAC *fakeStorageAccountClient) Delete(ctx context.Context, resourceGroupName string, accountName string) *retry.Error { fSAC.mutex.Lock() defer fSAC.mutex.Unlock() if rgAccounts, ok := fSAC.FakeStore[resourceGroupName]; ok { if _, ok := rgAccounts[accountName]; ok { delete(rgAccounts, accountName) - result.Response = &http.Response{ - StatusCode: http.StatusAccepted, - } - return result, nil + return nil } } - result.Response = &http.Response{ - StatusCode: http.StatusNotFound, - } - err = autorest.DetailedError{ - StatusCode: http.StatusNotFound, - Message: "Not such StorageAccount", - } - return result, err + return retry.GetError( + &http.Response{ + StatusCode: http.StatusNotFound, + }, + errors.New("Not such StorageAccount")) } -func (fSAC *fakeStorageAccountClient) ListKeys(ctx context.Context, resourceGroupName string, accountName string) (result storage.AccountListKeysResult, err error) { - return fSAC.Keys, fSAC.Err +func (fSAC *fakeStorageAccountClient) ListKeys(ctx context.Context, resourceGroupName string, accountName string) (result storage.AccountListKeysResult, err *retry.Error) { + return fSAC.Keys, nil } -func (fSAC *fakeStorageAccountClient) ListByResourceGroup(ctx context.Context, resourceGroupName string) (result storage.AccountListResult, err error) { - return fSAC.Accounts, fSAC.Err +func (fSAC *fakeStorageAccountClient) ListByResourceGroup(ctx context.Context, resourceGroupName string) (result storage.AccountListResult, err *retry.Error) { + return fSAC.Accounts, nil } -func (fSAC *fakeStorageAccountClient) GetProperties(ctx context.Context, resourceGroupName string, accountName string) (result storage.Account, err error) { +func (fSAC *fakeStorageAccountClient) GetProperties(ctx context.Context, resourceGroupName string, accountName string) (result storage.Account, err *retry.Error) { fSAC.mutex.Lock() defer fSAC.mutex.Unlock() @@ -822,10 +834,11 @@ func (fSAC *fakeStorageAccountClient) GetProperties(ctx context.Context, resourc } } - return result, autorest.DetailedError{ - StatusCode: http.StatusNotFound, - Message: "Not such StorageAccount", - } + return result, retry.GetError( + &http.Response{ + StatusCode: http.StatusNotFound, + }, + errors.New("Not such StorageAccount")) } type fakeDisksClient struct { @@ -840,7 +853,7 @@ func newFakeDisksClient() *fakeDisksClient { return fDC } -func (fDC *fakeDisksClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, diskName string, diskParameter compute.Disk) (resp *http.Response, err error) { +func (fDC *fakeDisksClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, diskName string, diskParameter compute.Disk) *retry.Error { fDC.mutex.Lock() defer fDC.mutex.Unlock() @@ -849,26 +862,28 @@ func (fDC *fakeDisksClient) CreateOrUpdate(ctx context.Context, resourceGroupNam } fDC.FakeStore[resourceGroupName][diskName] = diskParameter - return nil, nil + return nil } -func (fDC *fakeDisksClient) Delete(ctx context.Context, resourceGroupName string, diskName string) (resp *http.Response, err error) { +func (fDC *fakeDisksClient) Delete(ctx context.Context, resourceGroupName string, diskName string) *retry.Error { fDC.mutex.Lock() defer fDC.mutex.Unlock() if rgDisks, ok := fDC.FakeStore[resourceGroupName]; ok { if _, ok := rgDisks[diskName]; ok { delete(rgDisks, diskName) - return nil, nil + return nil } } - return &http.Response{ - StatusCode: http.StatusAccepted, - }, nil + return retry.GetError( + &http.Response{ + StatusCode: http.StatusNotFound, + }, + errors.New("Not such Disk")) } -func (fDC *fakeDisksClient) Get(ctx context.Context, resourceGroupName string, diskName string) (result compute.Disk, err error) { +func (fDC *fakeDisksClient) Get(ctx context.Context, resourceGroupName string, diskName string) (result compute.Disk, err *retry.Error) { fDC.mutex.Lock() defer fDC.mutex.Unlock() @@ -878,10 +893,11 @@ func (fDC *fakeDisksClient) Get(ctx context.Context, resourceGroupName string, d } } - return result, autorest.DetailedError{ - StatusCode: http.StatusNotFound, - Message: "Not such Disk", - } + return result, retry.GetError( + &http.Response{ + StatusCode: http.StatusNotFound, + }, + errors.New("Not such Disk")) } type fakeVMSet struct { @@ -946,8 +962,8 @@ func (f *fakeVMSet) AttachDisk(isManagedDisk bool, diskName, diskURI string, nod return fmt.Errorf("unimplemented") } -func (f *fakeVMSet) DetachDisk(diskName, diskURI string, nodeName types.NodeName) (*http.Response, error) { - return nil, fmt.Errorf("unimplemented") +func (f *fakeVMSet) DetachDisk(diskName, diskURI string, nodeName types.NodeName) error { + return fmt.Errorf("unimplemented") } func (f *fakeVMSet) GetDataDisks(nodeName types.NodeName, crt cacheReadType) ([]compute.DataDisk, error) {