From 7d9b134246ba166a407dfdba7bbf3e0f2b5d48b1 Mon Sep 17 00:00:00 2001 From: Pengfei Ni Date: Fri, 4 May 2018 14:09:07 +0800 Subject: [PATCH 1/3] cleanup unnecessary channels in azure clients --- .../providers/azure/azure_client.go | 368 ++++++------------ 1 file changed, 119 insertions(+), 249 deletions(-) diff --git a/pkg/cloudprovider/providers/azure/azure_client.go b/pkg/cloudprovider/providers/azure/azure_client.go index 14e1bcdf556..335a0ffafa9 100644 --- a/pkg/cloudprovider/providers/azure/azure_client.go +++ b/pkg/cloudprovider/providers/azure/azure_client.go @@ -41,45 +41,6 @@ func createARMRateLimitErr(isWrite bool, opName string) error { return fmt.Errorf("azure - ARM rate limited(%s) for operation:%s", opType, opName) } -func createARMRateLimitErrChannel(isWrite bool, opName string) chan error { - err := createARMRateLimitErr(isWrite, opName) - errChan := make(chan error, 1) - errChan <- err - return errChan -} - -// LoadBalancerListResultPage is for faking. -type LoadBalancerListResultPage interface { - Next() error - NotDone() bool - Response() network.LoadBalancerListResult - Values() []network.LoadBalancer -} - -// PublicIPAddressListResultPage is for faking. -type PublicIPAddressListResultPage interface { - Next() error - NotDone() bool - Response() network.PublicIPAddressListResult - Values() []network.PublicIPAddress -} - -// SecurityGroupListResultPage is for faking. -type SecurityGroupListResultPage interface { - Next() error - NotDone() bool - Response() network.SecurityGroupListResult - Values() []network.SecurityGroup -} - -// SubnetListResultPage is for faking. -type SubnetListResultPage interface { - Next() error - NotDone() bool - Response() network.SubnetListResult - Values() []network.Subnet -} - // VirtualMachinesClient defines needed functions for azure compute.VirtualMachinesClient type VirtualMachinesClient interface { CreateOrUpdate(ctx context.Context, resourceGroupName string, VMName string, parameters compute.VirtualMachine) (resp *http.Response, err error) @@ -89,9 +50,9 @@ type VirtualMachinesClient interface { // InterfacesClient defines needed functions for azure network.InterfacesClient type InterfacesClient interface { - CreateOrUpdate(resourceGroupName string, networkInterfaceName string, parameters network.Interface, cancel <-chan struct{}) (<-chan network.Interface, <-chan error) - Get(resourceGroupName string, networkInterfaceName string, expand string) (result network.Interface, err error) - GetVirtualMachineScaleSetNetworkInterface(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) (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) } // LoadBalancersClient defines needed functions for azure network.LoadBalancersClient @@ -112,18 +73,18 @@ type PublicIPAddressesClient interface { // SubnetsClient defines needed functions for azure network.SubnetsClient type SubnetsClient interface { - CreateOrUpdate(resourceGroupName string, virtualNetworkName string, subnetName string, subnetParameters network.Subnet, cancel <-chan struct{}) (<-chan network.Subnet, <-chan error) - Delete(resourceGroupName string, virtualNetworkName string, subnetName string, cancel <-chan struct{}) (<-chan autorest.Response, <-chan error) - Get(resourceGroupName string, virtualNetworkName string, subnetName string, expand string) (result network.Subnet, err error) - List(resourceGroupName string, virtualNetworkName string) (result SubnetListResultPage, err error) + 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) } // SecurityGroupsClient defines needed functions for azure network.SecurityGroupsClient type SecurityGroupsClient interface { - CreateOrUpdate(resourceGroupName string, networkSecurityGroupName string, parameters network.SecurityGroup, cancel <-chan struct{}) (<-chan network.SecurityGroup, <-chan error) - Delete(resourceGroupName string, networkSecurityGroupName string, cancel <-chan struct{}) (<-chan autorest.Response, <-chan error) - Get(resourceGroupName string, networkSecurityGroupName string, expand string) (result network.SecurityGroup, err error) - List(resourceGroupName string) (result SecurityGroupListResultPage, err error) + CreateOrUpdate(ctx context.Context, resourceGroupName string, networkSecurityGroupName string, parameters network.SecurityGroup) (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) } // VirtualMachineScaleSetsClient defines needed functions for azure compute.VirtualMachineScaleSetsClient @@ -144,14 +105,14 @@ type VirtualMachineScaleSetVMsClient interface { // RoutesClient defines needed functions for azure network.RoutesClient type RoutesClient interface { - CreateOrUpdate(resourceGroupName string, routeTableName string, routeName string, routeParameters network.Route, cancel <-chan struct{}) (<-chan network.Route, <-chan error) - Delete(resourceGroupName string, routeTableName string, routeName string, cancel <-chan struct{}) (<-chan autorest.Response, <-chan error) + CreateOrUpdate(ctx context.Context, resourceGroupName string, routeTableName string, routeName string, routeParameters network.Route) (resp *http.Response, err error) + Delete(ctx context.Context, resourceGroupName string, routeTableName string, routeName string) (resp *http.Response, err error) } // RouteTablesClient defines needed functions for azure network.RouteTablesClient type RouteTablesClient interface { - CreateOrUpdate(resourceGroupName string, routeTableName string, parameters network.RouteTable, cancel <-chan struct{}) (<-chan network.RouteTable, <-chan error) - Get(resourceGroupName string, routeTableName string, expand string) (result network.RouteTable, err error) + CreateOrUpdate(ctx context.Context, resourceGroupName string, routeTableName string, parameters network.RouteTable) (resp *http.Response, err error) + Get(ctx context.Context, resourceGroupName string, routeTableName string, expand string) (result network.RouteTable, err error) } // StorageAccountClient defines needed functions for azure storage.AccountsClient @@ -297,13 +258,11 @@ func newAzInterfacesClient(config *azClientConfig) *azInterfacesClient { } } -func (az *azInterfacesClient) CreateOrUpdate(resourceGroupName string, networkInterfaceName string, parameters network.Interface, cancel <-chan struct{}) (<-chan network.Interface, <-chan error) { +func (az *azInterfacesClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, networkInterfaceName string, parameters network.Interface) (resp *http.Response, err error) { /* Write rate limiting */ if !az.rateLimiterWriter.TryAccept() { - errChan := createARMRateLimitErrChannel(true, "NiCreateOrUpdate") - resultChan := make(chan network.Interface, 1) - resultChan <- network.Interface{} - return resultChan, errChan + err = createARMRateLimitErr(true, "NiCreateOrUpdate") + return } glog.V(10).Infof("azInterfacesClient.CreateOrUpdate(%q,%q): start", resourceGroupName, networkInterfaceName) @@ -311,31 +270,19 @@ func (az *azInterfacesClient) CreateOrUpdate(resourceGroupName string, networkIn glog.V(10).Infof("azInterfacesClient.CreateOrUpdate(%q,%q): end", resourceGroupName, networkInterfaceName) }() - ctx := context.TODO() - errChan := make(chan error, 1) - resultChan := make(chan network.Interface, 1) mc := newMetricContext("interfaces", "create_or_update", resourceGroupName, az.client.SubscriptionID) future, err := az.client.CreateOrUpdate(ctx, resourceGroupName, networkInterfaceName, parameters) if err != nil { mc.Observe(err) - errChan <- err - return resultChan, errChan + return future.Response(), err } - go func() { - if err := future.WaitForCompletion(ctx, az.client.Client); err != nil { - mc.Observe(err) - errChan <- err - return - } - result, err := future.Result(az.client) - errChan <- err - resultChan <- result - }() - return resultChan, errChan + err = future.WaitForCompletion(ctx, az.client.Client) + mc.Observe(err) + return future.Response(), err } -func (az *azInterfacesClient) Get(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, err error) { if !az.rateLimiterReader.TryAccept() { err = createARMRateLimitErr(false, "NicGet") return @@ -347,12 +294,12 @@ func (az *azInterfacesClient) Get(resourceGroupName string, networkInterfaceName }() mc := newMetricContext("interfaces", "get", resourceGroupName, az.client.SubscriptionID) - result, err = az.client.Get(context.TODO(), resourceGroupName, networkInterfaceName, expand) + result, err = az.client.Get(ctx, resourceGroupName, networkInterfaceName, expand) mc.Observe(err) return } -func (az *azInterfacesClient) GetVirtualMachineScaleSetNetworkInterface(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, err error) { if !az.rateLimiterReader.TryAccept() { err = createARMRateLimitErr(false, "NicGetVirtualMachineScaleSetNetworkInterface") return @@ -364,7 +311,7 @@ func (az *azInterfacesClient) GetVirtualMachineScaleSetNetworkInterface(resource }() mc := newMetricContext("interfaces", "get_vmss_ni", resourceGroupName, az.client.SubscriptionID) - result, err = az.client.GetVirtualMachineScaleSetNetworkInterface(context.TODO(), resourceGroupName, virtualMachineScaleSetName, virtualmachineIndex, networkInterfaceName, expand) + result, err = az.client.GetVirtualMachineScaleSetNetworkInterface(ctx, resourceGroupName, virtualMachineScaleSetName, virtualmachineIndex, networkInterfaceName, expand) mc.Observe(err) return } @@ -621,13 +568,11 @@ func newAzSubnetsClient(config *azClientConfig) *azSubnetsClient { } } -func (az *azSubnetsClient) CreateOrUpdate(resourceGroupName string, virtualNetworkName string, subnetName string, subnetParameters network.Subnet, cancel <-chan struct{}) (<-chan network.Subnet, <-chan error) { +func (az *azSubnetsClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, virtualNetworkName string, subnetName string, subnetParameters network.Subnet) (resp *http.Response, err error) { /* Write rate limiting */ if !az.rateLimiterWriter.TryAccept() { - errChan := createARMRateLimitErrChannel(true, "SubnetCreateOrUpdate") - resultChan := make(chan network.Subnet, 1) - resultChan <- network.Subnet{} - return resultChan, errChan + err = createARMRateLimitErr(true, "SubnetCreateOrUpdate") + return } glog.V(10).Infof("azSubnetsClient.CreateOrUpdate(%q,%q,%q): start", resourceGroupName, virtualNetworkName, subnetName) @@ -635,37 +580,23 @@ func (az *azSubnetsClient) CreateOrUpdate(resourceGroupName string, virtualNetwo glog.V(10).Infof("azSubnetsClient.CreateOrUpdate(%q,%q,%q): end", resourceGroupName, virtualNetworkName, subnetName) }() - ctx := context.TODO() - resultChan := make(chan network.Subnet, 1) - errChan := make(chan error, 1) mc := newMetricContext("subnets", "create_or_update", resourceGroupName, az.client.SubscriptionID) future, err := az.client.CreateOrUpdate(ctx, resourceGroupName, virtualNetworkName, subnetName, subnetParameters) if err != nil { mc.Observe(err) - errChan <- err - return resultChan, errChan + return future.Response(), err } - go func() { - if err := future.WaitForCompletion(ctx, az.client.Client); err != nil { - mc.Observe(err) - errChan <- err - return - } - result, err := future.Result(az.client) - mc.Observe(err) - errChan <- err - resultChan <- result - }() - return resultChan, errChan + + err = future.WaitForCompletion(ctx, az.client.Client) + mc.Observe(err) + return future.Response(), err } -func (az *azSubnetsClient) Delete(resourceGroupName string, virtualNetworkName string, subnetName string, cancel <-chan struct{}) (<-chan autorest.Response, <-chan error) { +func (az *azSubnetsClient) Delete(ctx context.Context, resourceGroupName string, virtualNetworkName string, subnetName string) (resp *http.Response, err error) { /* Write rate limiting */ if !az.rateLimiterWriter.TryAccept() { - errChan := createARMRateLimitErrChannel(true, "SubnetDelete") - resultChan := make(chan autorest.Response, 1) - resultChan <- autorest.Response{} - return resultChan, errChan + err = createARMRateLimitErr(true, "SubnetDelete") + return } glog.V(10).Infof("azSubnetsClient.Delete(%q,%q,%q): start", resourceGroupName, virtualNetworkName, subnetName) @@ -673,31 +604,19 @@ func (az *azSubnetsClient) Delete(resourceGroupName string, virtualNetworkName s glog.V(10).Infof("azSubnetsClient.Delete(%q,%q,%q): end", resourceGroupName, virtualNetworkName, subnetName) }() - ctx := context.TODO() - resultChan := make(chan autorest.Response, 1) - errChan := make(chan error, 1) mc := newMetricContext("subnets", "delete", resourceGroupName, az.client.SubscriptionID) future, err := az.client.Delete(ctx, resourceGroupName, virtualNetworkName, subnetName) if err != nil { mc.Observe(err) - errChan <- err - return resultChan, errChan + return future.Response(), err } - go func() { - if err := future.WaitForCompletion(ctx, az.client.Client); err != nil { - mc.Observe(err) - errChan <- err - return - } - result, err := future.Result(az.client) - mc.Observe(err) - errChan <- err - resultChan <- result - }() - return resultChan, errChan + + err = future.WaitForCompletion(ctx, az.client.Client) + mc.Observe(err) + return future.Response(), err } -func (az *azSubnetsClient) Get(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, err error) { if !az.rateLimiterReader.TryAccept() { err = createARMRateLimitErr(false, "SubnetGet") return @@ -709,13 +628,12 @@ func (az *azSubnetsClient) Get(resourceGroupName string, virtualNetworkName stri }() mc := newMetricContext("subnets", "get", resourceGroupName, az.client.SubscriptionID) - ctx := context.TODO() result, err = az.client.Get(ctx, resourceGroupName, virtualNetworkName, subnetName, expand) mc.Observe(err) return } -func (az *azSubnetsClient) List(resourceGroupName string, virtualNetworkName string) (SubnetListResultPage, error) { +func (az *azSubnetsClient) List(ctx context.Context, resourceGroupName string, virtualNetworkName string) ([]network.Subnet, error) { if !az.rateLimiterReader.TryAccept() { return nil, createARMRateLimitErr(false, "SubnetList") } @@ -726,10 +644,22 @@ func (az *azSubnetsClient) List(resourceGroupName string, virtualNetworkName str }() mc := newMetricContext("subnets", "list", resourceGroupName, az.client.SubscriptionID) - ctx := context.TODO() - result, err := az.client.List(ctx, resourceGroupName, virtualNetworkName) - mc.Observe(err) - return &result, err + iterator, err := az.client.ListComplete(ctx, resourceGroupName, virtualNetworkName) + if err != nil { + mc.Observe(err) + return nil, err + } + + result := make([]network.Subnet, 0) + for ; iterator.NotDone(); err = iterator.Next() { + if err != nil { + return nil, err + } + + result = append(result, iterator.Value()) + } + + return result, nil } // azSecurityGroupsClient implements SecurityGroupsClient. @@ -753,13 +683,11 @@ func newAzSecurityGroupsClient(config *azClientConfig) *azSecurityGroupsClient { } } -func (az *azSecurityGroupsClient) CreateOrUpdate(resourceGroupName string, networkSecurityGroupName string, parameters network.SecurityGroup, cancel <-chan struct{}) (<-chan network.SecurityGroup, <-chan error) { +func (az *azSecurityGroupsClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, networkSecurityGroupName string, parameters network.SecurityGroup) (resp *http.Response, err error) { /* Write rate limiting */ if !az.rateLimiterWriter.TryAccept() { - errChan := createARMRateLimitErrChannel(true, "NSGCreateOrUpdate") - resultChan := make(chan network.SecurityGroup, 1) - resultChan <- network.SecurityGroup{} - return resultChan, errChan + err = createARMRateLimitErr(true, "NSGCreateOrUpdate") + return } glog.V(10).Infof("azSecurityGroupsClient.CreateOrUpdate(%q,%q): start", resourceGroupName, networkSecurityGroupName) @@ -767,37 +695,23 @@ func (az *azSecurityGroupsClient) CreateOrUpdate(resourceGroupName string, netwo glog.V(10).Infof("azSecurityGroupsClient.CreateOrUpdate(%q,%q): end", resourceGroupName, networkSecurityGroupName) }() - ctx := context.TODO() - resultChan := make(chan network.SecurityGroup, 1) - errChan := make(chan error, 1) mc := newMetricContext("security_groups", "create_or_update", resourceGroupName, az.client.SubscriptionID) future, err := az.client.CreateOrUpdate(ctx, resourceGroupName, networkSecurityGroupName, parameters) if err != nil { mc.Observe(err) - errChan <- err - return resultChan, errChan + return future.Response(), err } - go func() { - if err := future.WaitForCompletion(ctx, az.client.Client); err != nil { - mc.Observe(err) - errChan <- err - return - } - result, err := future.Result(az.client) - mc.Observe(err) - errChan <- err - resultChan <- result - }() - return resultChan, errChan + + err = future.WaitForCompletion(ctx, az.client.Client) + mc.Observe(err) + return future.Response(), err } -func (az *azSecurityGroupsClient) Delete(resourceGroupName string, networkSecurityGroupName string, cancel <-chan struct{}) (<-chan autorest.Response, <-chan error) { +func (az *azSecurityGroupsClient) Delete(ctx context.Context, resourceGroupName string, networkSecurityGroupName string) (resp *http.Response, err error) { /* Write rate limiting */ if !az.rateLimiterWriter.TryAccept() { - errChan := createARMRateLimitErrChannel(true, "NSGDelete") - resultChan := make(chan autorest.Response, 1) - resultChan <- autorest.Response{} - return resultChan, errChan + err = createARMRateLimitErr(true, "NSGDelete") + return } glog.V(10).Infof("azSecurityGroupsClient.Delete(%q,%q): start", resourceGroupName, networkSecurityGroupName) @@ -805,31 +719,19 @@ func (az *azSecurityGroupsClient) Delete(resourceGroupName string, networkSecuri glog.V(10).Infof("azSecurityGroupsClient.Delete(%q,%q): end", resourceGroupName, networkSecurityGroupName) }() - ctx := context.TODO() - resultChan := make(chan autorest.Response, 1) - errChan := make(chan error, 1) mc := newMetricContext("security_groups", "delete", resourceGroupName, az.client.SubscriptionID) future, err := az.client.Delete(ctx, resourceGroupName, networkSecurityGroupName) if err != nil { mc.Observe(err) - errChan <- err - return resultChan, errChan + return future.Response(), err } - go func() { - if err := future.WaitForCompletion(ctx, az.client.Client); err != nil { - mc.Observe(err) - errChan <- err - return - } - result, err := future.Result(az.client) - mc.Observe(err) - errChan <- err - resultChan <- result - }() - return resultChan, errChan + + err = future.WaitForCompletion(ctx, az.client.Client) + mc.Observe(err) + return future.Response(), err } -func (az *azSecurityGroupsClient) Get(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, err error) { if !az.rateLimiterReader.TryAccept() { err = createARMRateLimitErr(false, "NSGGet") return @@ -841,13 +743,12 @@ func (az *azSecurityGroupsClient) Get(resourceGroupName string, networkSecurityG }() mc := newMetricContext("security_groups", "get", resourceGroupName, az.client.SubscriptionID) - ctx := context.TODO() result, err = az.client.Get(ctx, resourceGroupName, networkSecurityGroupName, expand) mc.Observe(err) return } -func (az *azSecurityGroupsClient) List(resourceGroupName string) (SecurityGroupListResultPage, error) { +func (az *azSecurityGroupsClient) List(ctx context.Context, resourceGroupName string) ([]network.SecurityGroup, error) { if !az.rateLimiterReader.TryAccept() { return nil, createARMRateLimitErr(false, "NSGList") } @@ -858,10 +759,22 @@ func (az *azSecurityGroupsClient) List(resourceGroupName string) (SecurityGroupL }() mc := newMetricContext("security_groups", "list", resourceGroupName, az.client.SubscriptionID) - ctx := context.TODO() - result, err := az.client.List(ctx, resourceGroupName) + iterator, err := az.client.ListComplete(ctx, resourceGroupName) mc.Observe(err) - return &result, err + if err != nil { + return nil, err + } + + result := make([]network.SecurityGroup, 0) + for ; iterator.NotDone(); err = iterator.Next() { + if err != nil { + return nil, err + } + + result = append(result, iterator.Value()) + } + + return result, nil } // azVirtualMachineScaleSetsClient implements VirtualMachineScaleSetsClient. @@ -1109,13 +1022,11 @@ func newAzRoutesClient(config *azClientConfig) *azRoutesClient { } } -func (az *azRoutesClient) CreateOrUpdate(resourceGroupName string, routeTableName string, routeName string, routeParameters network.Route, cancel <-chan struct{}) (<-chan network.Route, <-chan error) { +func (az *azRoutesClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, routeTableName string, routeName string, routeParameters network.Route) (resp *http.Response, err error) { /* Write rate limiting */ if !az.rateLimiterWriter.TryAccept() { - errChan := createARMRateLimitErrChannel(true, "RouteCreateOrUpdate") - resultChan := make(chan network.Route, 1) - resultChan <- network.Route{} - return resultChan, errChan + err = createARMRateLimitErr(true, "RouteCreateOrUpdate") + return } glog.V(10).Infof("azRoutesClient.CreateOrUpdate(%q,%q,%q): start", resourceGroupName, routeTableName, routeName) @@ -1123,37 +1034,23 @@ func (az *azRoutesClient) CreateOrUpdate(resourceGroupName string, routeTableNam glog.V(10).Infof("azRoutesClient.CreateOrUpdate(%q,%q,%q): end", resourceGroupName, routeTableName, routeName) }() - ctx := context.TODO() - resultChan := make(chan network.Route, 1) - errChan := make(chan error, 1) mc := newMetricContext("routes", "create_or_update", resourceGroupName, az.client.SubscriptionID) future, err := az.client.CreateOrUpdate(ctx, resourceGroupName, routeTableName, routeName, routeParameters) if err != nil { mc.Observe(err) - errChan <- err - return resultChan, errChan + return future.Response(), err } - go func() { - if err := future.WaitForCompletion(ctx, az.client.Client); err != nil { - mc.Observe(err) - errChan <- err - return - } - result, err := future.Result(az.client) - mc.Observe(err) - errChan <- err - resultChan <- result - }() - return resultChan, errChan + + err = future.WaitForCompletion(ctx, az.client.Client) + mc.Observe(err) + return future.Response(), err } -func (az *azRoutesClient) Delete(resourceGroupName string, routeTableName string, routeName string, cancel <-chan struct{}) (<-chan autorest.Response, <-chan error) { +func (az *azRoutesClient) Delete(ctx context.Context, resourceGroupName string, routeTableName string, routeName string) (resp *http.Response, err error) { /* Write rate limiting */ if !az.rateLimiterWriter.TryAccept() { - errChan := createARMRateLimitErrChannel(true, "RouteDelete") - resultChan := make(chan autorest.Response, 1) - resultChan <- autorest.Response{} - return resultChan, errChan + err = createARMRateLimitErr(true, "RouteDelete") + return } glog.V(10).Infof("azRoutesClient.Delete(%q,%q,%q): start", resourceGroupName, routeTableName, routeName) @@ -1161,28 +1058,16 @@ func (az *azRoutesClient) Delete(resourceGroupName string, routeTableName string glog.V(10).Infof("azRoutesClient.Delete(%q,%q,%q): end", resourceGroupName, routeTableName, routeName) }() - ctx := context.TODO() - resultChan := make(chan autorest.Response, 1) - errChan := make(chan error, 1) mc := newMetricContext("routes", "delete", resourceGroupName, az.client.SubscriptionID) future, err := az.client.Delete(ctx, resourceGroupName, routeTableName, routeName) if err != nil { mc.Observe(err) - errChan <- err - return resultChan, errChan + return future.Response(), err } - go func() { - if err := future.WaitForCompletion(ctx, az.client.Client); err != nil { - mc.Observe(err) - errChan <- err - return - } - result, err := future.Result(az.client) - mc.Observe(err) - errChan <- err - resultChan <- result - }() - return resultChan, errChan + + err = future.WaitForCompletion(ctx, az.client.Client) + mc.Observe(err) + return future.Response(), err } // azRouteTablesClient implements RouteTablesClient. @@ -1206,13 +1091,11 @@ func newAzRouteTablesClient(config *azClientConfig) *azRouteTablesClient { } } -func (az *azRouteTablesClient) CreateOrUpdate(resourceGroupName string, routeTableName string, parameters network.RouteTable, cancel <-chan struct{}) (<-chan network.RouteTable, <-chan error) { +func (az *azRouteTablesClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, routeTableName string, parameters network.RouteTable) (resp *http.Response, err error) { /* Write rate limiting */ if !az.rateLimiterWriter.TryAccept() { - errChan := createARMRateLimitErrChannel(true, "RouteTableCreateOrUpdate") - resultChan := make(chan network.RouteTable, 1) - resultChan <- network.RouteTable{} - return resultChan, errChan + err = createARMRateLimitErr(true, "RouteTableCreateOrUpdate") + return } glog.V(10).Infof("azRouteTablesClient.CreateOrUpdate(%q,%q): start", resourceGroupName, routeTableName) @@ -1220,31 +1103,19 @@ func (az *azRouteTablesClient) CreateOrUpdate(resourceGroupName string, routeTab glog.V(10).Infof("azRouteTablesClient.CreateOrUpdate(%q,%q): end", resourceGroupName, routeTableName) }() - ctx := context.TODO() - resultChan := make(chan network.RouteTable, 1) - errChan := make(chan error, 1) mc := newMetricContext("route_tables", "create_or_update", resourceGroupName, az.client.SubscriptionID) future, err := az.client.CreateOrUpdate(ctx, resourceGroupName, routeTableName, parameters) + mc.Observe(err) if err != nil { - mc.Observe(err) - errChan <- err - return resultChan, errChan + return future.Response(), err } - go func() { - if err := future.WaitForCompletion(ctx, az.client.Client); err != nil { - mc.Observe(err) - errChan <- err - return - } - result, err := future.Result(az.client) - mc.Observe(err) - errChan <- err - resultChan <- result - }() - return resultChan, errChan + + err = future.WaitForCompletion(ctx, az.client.Client) + mc.Observe(err) + return future.Response(), err } -func (az *azRouteTablesClient) Get(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, err error) { if !az.rateLimiterReader.TryAccept() { err = createARMRateLimitErr(false, "GetRouteTable") return @@ -1256,7 +1127,6 @@ func (az *azRouteTablesClient) Get(resourceGroupName string, routeTableName stri }() mc := newMetricContext("route_tables", "get", resourceGroupName, az.client.SubscriptionID) - ctx := context.TODO() result, err = az.client.Get(ctx, resourceGroupName, routeTableName, expand) mc.Observe(err) return From 12c9d2736a0f09c21e405f7d280a33f2f420ff83 Mon Sep 17 00:00:00 2001 From: Pengfei Ni Date: Fri, 4 May 2018 14:09:33 +0800 Subject: [PATCH 2/3] use new azure clients --- .../providers/azure/azure_backoff.go | 45 ++++++++++--------- .../providers/azure/azure_routes.go | 24 +++++----- .../providers/azure/azure_standard.go | 12 ++--- .../providers/azure/azure_vmss.go | 4 +- .../providers/azure/azure_wrap.go | 12 +++-- 5 files changed, 56 insertions(+), 41 deletions(-) diff --git a/pkg/cloudprovider/providers/azure/azure_backoff.go b/pkg/cloudprovider/providers/azure/azure_backoff.go index 0d19ec349d5..8bf55f63fd2 100644 --- a/pkg/cloudprovider/providers/azure/azure_backoff.go +++ b/pkg/cloudprovider/providers/azure/azure_backoff.go @@ -111,11 +111,12 @@ func (az *Cloud) GetIPForMachineWithRetry(name types.NodeName) (string, string, // CreateOrUpdateSGWithRetry invokes az.SecurityGroupsClient.CreateOrUpdate with exponential backoff retry func (az *Cloud) CreateOrUpdateSGWithRetry(sg network.SecurityGroup) error { return wait.ExponentialBackoff(az.requestBackoff(), func() (bool, error) { - respChan, errChan := az.SecurityGroupsClient.CreateOrUpdate(az.ResourceGroup, *sg.Name, sg, nil) - resp := <-respChan - err := <-errChan + ctx, cancel := getContextWithCancel() + defer cancel() + + resp, err := az.SecurityGroupsClient.CreateOrUpdate(ctx, az.ResourceGroup, *sg.Name, sg) glog.V(10).Infof("SecurityGroupsClient.CreateOrUpdate(%s): end", *sg.Name) - done, err := processRetryResponse(resp.Response, err) + done, err := processHTTPRetryResponse(resp, err) if done && err == nil { // Invalidate the cache right after updating az.nsgCache.Delete(*sg.Name) @@ -208,11 +209,12 @@ func (az *Cloud) CreateOrUpdatePIPWithRetry(pipResourceGroup string, pip network // CreateOrUpdateInterfaceWithRetry invokes az.PublicIPAddressesClient.CreateOrUpdate with exponential backoff retry func (az *Cloud) CreateOrUpdateInterfaceWithRetry(nic network.Interface) error { return wait.ExponentialBackoff(az.requestBackoff(), func() (bool, error) { - respChan, errChan := az.InterfacesClient.CreateOrUpdate(az.ResourceGroup, *nic.Name, nic, nil) - resp := <-respChan - err := <-errChan + ctx, cancel := getContextWithCancel() + defer cancel() + + resp, err := az.InterfacesClient.CreateOrUpdate(ctx, az.ResourceGroup, *nic.Name, nic) glog.V(10).Infof("InterfacesClient.CreateOrUpdate(%s): end", *nic.Name) - return processRetryResponse(resp.Response, err) + return processHTTPRetryResponse(resp, err) }) } @@ -246,32 +248,35 @@ func (az *Cloud) DeleteLBWithRetry(lbName string) error { // CreateOrUpdateRouteTableWithRetry invokes az.RouteTablesClient.CreateOrUpdate with exponential backoff retry func (az *Cloud) CreateOrUpdateRouteTableWithRetry(routeTable network.RouteTable) error { return wait.ExponentialBackoff(az.requestBackoff(), func() (bool, error) { - respChan, errChan := az.RouteTablesClient.CreateOrUpdate(az.ResourceGroup, az.RouteTableName, routeTable, nil) - resp := <-respChan - err := <-errChan - return processRetryResponse(resp.Response, err) + ctx, cancel := getContextWithCancel() + defer cancel() + + resp, err := az.RouteTablesClient.CreateOrUpdate(ctx, az.ResourceGroup, az.RouteTableName, routeTable) + return processHTTPRetryResponse(resp, err) }) } // CreateOrUpdateRouteWithRetry invokes az.RoutesClient.CreateOrUpdate with exponential backoff retry func (az *Cloud) CreateOrUpdateRouteWithRetry(route network.Route) error { return wait.ExponentialBackoff(az.requestBackoff(), func() (bool, error) { - respChan, errChan := az.RoutesClient.CreateOrUpdate(az.ResourceGroup, az.RouteTableName, *route.Name, route, nil) - resp := <-respChan - err := <-errChan + ctx, cancel := getContextWithCancel() + defer cancel() + + resp, err := az.RoutesClient.CreateOrUpdate(ctx, az.ResourceGroup, az.RouteTableName, *route.Name, route) glog.V(10).Infof("RoutesClient.CreateOrUpdate(%s): end", *route.Name) - return processRetryResponse(resp.Response, err) + return processHTTPRetryResponse(resp, err) }) } // DeleteRouteWithRetry invokes az.RoutesClient.Delete with exponential backoff retry func (az *Cloud) DeleteRouteWithRetry(routeName string) error { return wait.ExponentialBackoff(az.requestBackoff(), func() (bool, error) { - respChan, errChan := az.RoutesClient.Delete(az.ResourceGroup, az.RouteTableName, routeName, nil) - resp := <-respChan - err := <-errChan + ctx, cancel := getContextWithCancel() + defer cancel() + + resp, err := az.RoutesClient.Delete(ctx, az.ResourceGroup, az.RouteTableName, routeName) glog.V(10).Infof("RoutesClient.Delete(%s): end", az.RouteTableName) - return processRetryResponse(resp, err) + return processHTTPRetryResponse(resp, err) }) } diff --git a/pkg/cloudprovider/providers/azure/azure_routes.go b/pkg/cloudprovider/providers/azure/azure_routes.go index 96e5c824934..0230ed6f5dd 100644 --- a/pkg/cloudprovider/providers/azure/azure_routes.go +++ b/pkg/cloudprovider/providers/azure/azure_routes.go @@ -82,11 +82,11 @@ func (az *Cloud) createRouteTable() error { } glog.V(3).Infof("create: creating routetable. routeTableName=%q", az.RouteTableName) - respChan, errChan := az.RouteTablesClient.CreateOrUpdate(az.ResourceGroup, az.RouteTableName, routeTable, nil) - resp := <-respChan - err := <-errChan + ctx, cancel := getContextWithCancel() + defer cancel() + resp, err := az.RouteTablesClient.CreateOrUpdate(ctx, az.ResourceGroup, az.RouteTableName, routeTable) glog.V(10).Infof("RouteTablesClient.CreateOrUpdate(%q): end", az.RouteTableName) - if az.CloudProviderBackoff && shouldRetryAPIRequest(resp.Response, err) { + if az.CloudProviderBackoff && shouldRetryHTTPRequest(resp, err) { glog.V(2).Infof("create backing off: creating routetable. routeTableName=%q", az.RouteTableName) retryErr := az.CreateOrUpdateRouteTableWithRetry(routeTable) if retryErr != nil { @@ -127,11 +127,11 @@ func (az *Cloud) CreateRoute(ctx context.Context, clusterName string, nameHint s } glog.V(3).Infof("create: creating route: instance=%q cidr=%q", kubeRoute.TargetNode, kubeRoute.DestinationCIDR) - respChan, errChan := az.RoutesClient.CreateOrUpdate(az.ResourceGroup, az.RouteTableName, *route.Name, route, nil) - resp := <-respChan - err = <-errChan + ctx, cancel := getContextWithCancel() + defer cancel() + resp, err := az.RoutesClient.CreateOrUpdate(ctx, az.ResourceGroup, az.RouteTableName, *route.Name, route) glog.V(10).Infof("RoutesClient.CreateOrUpdate(%q): end", az.RouteTableName) - if az.CloudProviderBackoff && shouldRetryAPIRequest(resp.Response, err) { + if az.CloudProviderBackoff && shouldRetryHTTPRequest(resp, err) { glog.V(2).Infof("create backing off: creating route: instance=%q cidr=%q", kubeRoute.TargetNode, kubeRoute.DestinationCIDR) retryErr := az.CreateOrUpdateRouteWithRetry(route) if retryErr != nil { @@ -152,13 +152,13 @@ func (az *Cloud) CreateRoute(ctx context.Context, clusterName string, nameHint s func (az *Cloud) DeleteRoute(ctx context.Context, clusterName string, kubeRoute *cloudprovider.Route) error { glog.V(2).Infof("delete: deleting route. clusterName=%q instance=%q cidr=%q", clusterName, kubeRoute.TargetNode, kubeRoute.DestinationCIDR) + ctx, cancel := getContextWithCancel() + defer cancel() routeName := mapNodeNameToRouteName(kubeRoute.TargetNode) - respChan, errChan := az.RoutesClient.Delete(az.ResourceGroup, az.RouteTableName, routeName, nil) - resp := <-respChan - err := <-errChan + resp, err := az.RoutesClient.Delete(ctx, az.ResourceGroup, az.RouteTableName, routeName) glog.V(10).Infof("RoutesClient.Delete(%q): end", az.RouteTableName) - if az.CloudProviderBackoff && shouldRetryAPIRequest(resp, err) { + if az.CloudProviderBackoff && shouldRetryHTTPRequest(resp, err) { glog.V(2).Infof("delete backing off: deleting route. clusterName=%q instance=%q cidr=%q", clusterName, kubeRoute.TargetNode, kubeRoute.DestinationCIDR) retryErr := az.DeleteRouteWithRetry(routeName) if retryErr != nil { diff --git a/pkg/cloudprovider/providers/azure/azure_standard.go b/pkg/cloudprovider/providers/azure/azure_standard.go index a7f3b3efa25..2dab8d443f5 100644 --- a/pkg/cloudprovider/providers/azure/azure_standard.go +++ b/pkg/cloudprovider/providers/azure/azure_standard.go @@ -584,7 +584,9 @@ func (as *availabilitySet) GetPrimaryInterface(nodeName, vmSetName string) (netw } } - nic, err := as.InterfacesClient.Get(as.ResourceGroup, nicName, "") + ctx, cancel := getContextWithCancel() + defer cancel() + nic, err := as.InterfacesClient.Get(ctx, as.ResourceGroup, nicName, "") if err != nil { return network.Interface{}, err } @@ -652,11 +654,11 @@ func (as *availabilitySet) ensureHostInPool(serviceName string, nodeName types.N nicName := *nic.Name glog.V(3).Infof("nicupdate(%s): nic(%s) - updating", serviceName, nicName) - respChan, errChan := as.InterfacesClient.CreateOrUpdate(as.ResourceGroup, *nic.Name, nic, nil) - resp := <-respChan - err := <-errChan + ctx, cancel := getContextWithCancel() + defer cancel() + resp, err := as.InterfacesClient.CreateOrUpdate(ctx, as.ResourceGroup, *nic.Name, nic) glog.V(10).Infof("InterfacesClient.CreateOrUpdate(%q): end", *nic.Name) - if as.CloudProviderBackoff && shouldRetryAPIRequest(resp.Response, err) { + if as.CloudProviderBackoff && shouldRetryHTTPRequest(resp, err) { glog.V(2).Infof("nicupdate(%s) backing off: nic(%s) - updating, err=%v", serviceName, nicName, err) retryErr := as.CreateOrUpdateInterfaceWithRetry(nic) if retryErr != nil { diff --git a/pkg/cloudprovider/providers/azure/azure_vmss.go b/pkg/cloudprovider/providers/azure/azure_vmss.go index 4a46996d38f..19ba8946987 100644 --- a/pkg/cloudprovider/providers/azure/azure_vmss.go +++ b/pkg/cloudprovider/providers/azure/azure_vmss.go @@ -453,7 +453,9 @@ func (ss *scaleSet) GetPrimaryInterface(nodeName, vmSetName string) (network.Int return network.Interface{}, err } - nic, err := ss.InterfacesClient.GetVirtualMachineScaleSetNetworkInterface(ss.ResourceGroup, ssName, instanceID, nicName, "") + ctx, cancel := getContextWithCancel() + defer cancel() + nic, err := ss.InterfacesClient.GetVirtualMachineScaleSetNetworkInterface(ctx, ss.ResourceGroup, ssName, instanceID, nicName, "") if err != nil { glog.Errorf("error: ss.GetPrimaryInterface(%s), ss.GetVirtualMachineScaleSetNetworkInterface.Get(%s, %s, %s), err=%v", nodeName, ss.ResourceGroup, ssName, nicName, err) return network.Interface{}, err diff --git a/pkg/cloudprovider/providers/azure/azure_wrap.go b/pkg/cloudprovider/providers/azure/azure_wrap.go index 5e359c295ee..2c30e287220 100644 --- a/pkg/cloudprovider/providers/azure/azure_wrap.go +++ b/pkg/cloudprovider/providers/azure/azure_wrap.go @@ -129,7 +129,9 @@ func (az *Cloud) getSubnet(virtualNetworkName string, subnetName string) (subnet rg = az.ResourceGroup } - subnet, err = az.SubnetsClient.Get(rg, virtualNetworkName, subnetName, "") + ctx, cancel := getContextWithCancel() + defer cancel() + subnet, err = az.SubnetsClient.Get(ctx, rg, virtualNetworkName, subnetName, "") exists, realErr = checkResourceExistsFromError(err) if realErr != nil { return subnet, false, realErr @@ -217,7 +219,9 @@ func (az *Cloud) newLBCache() (*timedCache, error) { func (az *Cloud) newNSGCache() (*timedCache, error) { getter := func(key string) (interface{}, error) { - nsg, err := az.SecurityGroupsClient.Get(az.ResourceGroup, key, "") + ctx, cancel := getContextWithCancel() + defer cancel() + nsg, err := az.SecurityGroupsClient.Get(ctx, az.ResourceGroup, key, "") exists, realErr := checkResourceExistsFromError(err) if realErr != nil { return nil, realErr @@ -235,7 +239,9 @@ func (az *Cloud) newNSGCache() (*timedCache, error) { func (az *Cloud) newRouteTableCache() (*timedCache, error) { getter := func(key string) (interface{}, error) { - rt, err := az.RouteTablesClient.Get(az.ResourceGroup, key, "") + ctx, cancel := getContextWithCancel() + defer cancel() + rt, err := az.RouteTablesClient.Get(ctx, az.ResourceGroup, key, "") exists, realErr := checkResourceExistsFromError(err) if realErr != nil { return nil, realErr From 05d0d35d328073caaf8116dcb580ee42435ce386 Mon Sep 17 00:00:00 2001 From: Pengfei Ni Date: Fri, 4 May 2018 14:09:48 +0800 Subject: [PATCH 3/3] fix fake clients and unit tests --- .../providers/azure/azure_fakes.go | 266 ++++-------------- .../providers/azure/azure_test.go | 24 +- 2 files changed, 62 insertions(+), 228 deletions(-) diff --git a/pkg/cloudprovider/providers/azure/azure_fakes.go b/pkg/cloudprovider/providers/azure/azure_fakes.go index 40d613fd084..154b7b40ff9 100644 --- a/pkg/cloudprovider/providers/azure/azure_fakes.go +++ b/pkg/cloudprovider/providers/azure/azure_fakes.go @@ -220,33 +220,19 @@ func newFakeAzureInterfacesClient() *fakeAzureInterfacesClient { return fIC } -func (fIC *fakeAzureInterfacesClient) CreateOrUpdate(resourceGroupName string, networkInterfaceName string, parameters network.Interface, cancel <-chan struct{}) (<-chan network.Interface, <-chan error) { +func (fIC *fakeAzureInterfacesClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, networkInterfaceName string, parameters network.Interface) (resp *http.Response, err error) { fIC.mutex.Lock() defer fIC.mutex.Unlock() - resultChan := make(chan network.Interface, 1) - errChan := make(chan error, 1) - var result network.Interface - var err error - defer func() { - resultChan <- result - errChan <- err - close(resultChan) - close(errChan) - }() + if _, ok := fIC.FakeStore[resourceGroupName]; !ok { fIC.FakeStore[resourceGroupName] = make(map[string]network.Interface) } fIC.FakeStore[resourceGroupName][networkInterfaceName] = parameters - result = fIC.FakeStore[resourceGroupName][networkInterfaceName] - result.Response.Response = &http.Response{ - StatusCode: http.StatusOK, - } - err = nil - return resultChan, errChan + return nil, nil } -func (fIC *fakeAzureInterfacesClient) Get(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 error) { fIC.mutex.Lock() defer fIC.mutex.Unlock() if _, ok := fIC.FakeStore[resourceGroupName]; ok { @@ -260,7 +246,7 @@ func (fIC *fakeAzureInterfacesClient) Get(resourceGroupName string, networkInter } } -func (fIC *fakeAzureInterfacesClient) GetVirtualMachineScaleSetNetworkInterface(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 error) { return result, nil } @@ -328,67 +314,37 @@ func newFakeAzureSubnetsClient() *fakeAzureSubnetsClient { return fASC } -func (fASC *fakeAzureSubnetsClient) CreateOrUpdate(resourceGroupName string, virtualNetworkName string, subnetName string, subnetParameters network.Subnet, cancel <-chan struct{}) (<-chan network.Subnet, <-chan error) { +func (fASC *fakeAzureSubnetsClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, virtualNetworkName string, subnetName string, subnetParameters network.Subnet) (resp *http.Response, err error) { fASC.mutex.Lock() defer fASC.mutex.Unlock() - resultChan := make(chan network.Subnet, 1) - errChan := make(chan error, 1) - var result network.Subnet - var err error - defer func() { - resultChan <- result - errChan <- err - close(resultChan) - close(errChan) - }() + rgVnet := strings.Join([]string{resourceGroupName, virtualNetworkName}, "AND") if _, ok := fASC.FakeStore[rgVnet]; !ok { fASC.FakeStore[rgVnet] = make(map[string]network.Subnet) } fASC.FakeStore[rgVnet][subnetName] = subnetParameters - result = fASC.FakeStore[rgVnet][subnetName] - result.Response.Response = &http.Response{ - StatusCode: http.StatusOK, - } - err = nil - return resultChan, errChan + + return nil, nil } -func (fASC *fakeAzureSubnetsClient) Delete(resourceGroupName string, virtualNetworkName string, subnetName string, cancel <-chan struct{}) (<-chan autorest.Response, <-chan error) { +func (fASC *fakeAzureSubnetsClient) Delete(ctx context.Context, resourceGroupName string, virtualNetworkName string, subnetName string) (resp *http.Response, err error) { fASC.mutex.Lock() defer fASC.mutex.Unlock() - respChan := make(chan autorest.Response, 1) - errChan := make(chan error, 1) - var resp autorest.Response - var err error - defer func() { - respChan <- resp - errChan <- err - close(respChan) - close(errChan) - }() rgVnet := strings.Join([]string{resourceGroupName, virtualNetworkName}, "AND") if rgSubnets, ok := fASC.FakeStore[rgVnet]; ok { if _, ok := rgSubnets[subnetName]; ok { delete(rgSubnets, subnetName) - resp.Response = &http.Response{ - StatusCode: http.StatusAccepted, - } - err = nil - return respChan, errChan + return nil, nil } } - resp.Response = &http.Response{ + + return &http.Response{ StatusCode: http.StatusNotFound, - } - err = autorest.DetailedError{ - StatusCode: http.StatusNotFound, - Message: "Not such Subnet", - } - return respChan, errChan + }, nil } -func (fASC *fakeAzureSubnetsClient) Get(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 error) { fASC.mutex.Lock() defer fASC.mutex.Unlock() rgVnet := strings.Join([]string{resourceGroupName, virtualNetworkName}, "AND") @@ -403,30 +359,10 @@ func (fASC *fakeAzureSubnetsClient) Get(resourceGroupName string, virtualNetwork } } -type fakeSubnetListResultPage struct { - next SubnetListResultPage - value network.SubnetListResult - values []network.Subnet - err error -} - -func (pg *fakeSubnetListResultPage) Next() error { - return nil -} -func (pg *fakeSubnetListResultPage) NotDone() bool { - return pg.next != nil -} - -func (pg *fakeSubnetListResultPage) Response() network.SubnetListResult { - return pg.value -} -func (pg *fakeSubnetListResultPage) Values() []network.Subnet { - return pg.values -} - -func (fASC *fakeAzureSubnetsClient) List(resourceGroupName string, virtualNetworkName string) (result SubnetListResultPage, err error) { +func (fASC *fakeAzureSubnetsClient) List(ctx context.Context, resourceGroupName string, virtualNetworkName string) (result []network.Subnet, err error) { fASC.mutex.Lock() defer fASC.mutex.Unlock() + rgVnet := strings.Join([]string{resourceGroupName, virtualNetworkName}, "AND") var value []network.Subnet if _, ok := fASC.FakeStore[rgVnet]; ok { @@ -434,12 +370,8 @@ func (fASC *fakeAzureSubnetsClient) List(resourceGroupName string, virtualNetwor value = append(value, v) } } - return &fakeSubnetListResultPage{ - value: network.SubnetListResult{ - Value: &value, - }, - values: value, - }, nil + + return value, nil } type fakeAzureNSGClient struct { @@ -454,65 +386,35 @@ func newFakeAzureNSGClient() *fakeAzureNSGClient { return fNSG } -func (fNSG *fakeAzureNSGClient) CreateOrUpdate(resourceGroupName string, networkSecurityGroupName string, parameters network.SecurityGroup, cancel <-chan struct{}) (<-chan network.SecurityGroup, <-chan error) { +func (fNSG *fakeAzureNSGClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, networkSecurityGroupName string, parameters network.SecurityGroup) (resp *http.Response, err error) { fNSG.mutex.Lock() defer fNSG.mutex.Unlock() - resultChan := make(chan network.SecurityGroup, 1) - errChan := make(chan error, 1) - var result network.SecurityGroup - var err error - defer func() { - resultChan <- result - errChan <- err - close(resultChan) - close(errChan) - }() + if _, ok := fNSG.FakeStore[resourceGroupName]; !ok { fNSG.FakeStore[resourceGroupName] = make(map[string]network.SecurityGroup) } fNSG.FakeStore[resourceGroupName][networkSecurityGroupName] = parameters - result = fNSG.FakeStore[resourceGroupName][networkSecurityGroupName] - result.Response.Response = &http.Response{ - StatusCode: http.StatusOK, - } - err = nil - return resultChan, errChan + + return nil, nil } -func (fNSG *fakeAzureNSGClient) Delete(resourceGroupName string, networkSecurityGroupName string, cancel <-chan struct{}) (<-chan autorest.Response, <-chan error) { +func (fNSG *fakeAzureNSGClient) Delete(ctx context.Context, resourceGroupName string, networkSecurityGroupName string) (resp *http.Response, err error) { fNSG.mutex.Lock() defer fNSG.mutex.Unlock() - respChan := make(chan autorest.Response, 1) - errChan := make(chan error, 1) - var resp autorest.Response - var err error - defer func() { - respChan <- resp - errChan <- err - close(respChan) - close(errChan) - }() + if rgSGs, ok := fNSG.FakeStore[resourceGroupName]; ok { if _, ok := rgSGs[networkSecurityGroupName]; ok { delete(rgSGs, networkSecurityGroupName) - resp.Response = &http.Response{ - StatusCode: http.StatusAccepted, - } - err = nil - return respChan, errChan + return nil, nil } } - resp.Response = &http.Response{ + + return &http.Response{ StatusCode: http.StatusNotFound, - } - err = autorest.DetailedError{ - StatusCode: http.StatusNotFound, - Message: "Not such NSG", - } - return respChan, errChan + }, nil } -func (fNSG *fakeAzureNSGClient) Get(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 error) { fNSG.mutex.Lock() defer fNSG.mutex.Unlock() if _, ok := fNSG.FakeStore[resourceGroupName]; ok { @@ -526,43 +428,18 @@ func (fNSG *fakeAzureNSGClient) Get(resourceGroupName string, networkSecurityGro } } -type fakeSecurityGroupListResultPage struct { - next SecurityGroupListResultPage - value network.SecurityGroupListResult - values []network.SecurityGroup - err error -} - -func (pg *fakeSecurityGroupListResultPage) Next() error { - return nil -} -func (pg *fakeSecurityGroupListResultPage) NotDone() bool { - return pg.next != nil -} - -func (pg *fakeSecurityGroupListResultPage) Response() network.SecurityGroupListResult { - return pg.value -} -func (pg *fakeSecurityGroupListResultPage) Values() []network.SecurityGroup { - return pg.values -} - -func (fNSG *fakeAzureNSGClient) List(resourceGroupName string) (result SecurityGroupListResultPage, err error) { +func (fNSG *fakeAzureNSGClient) List(ctx context.Context, resourceGroupName string) (result []network.SecurityGroup, err error) { fNSG.mutex.Lock() defer fNSG.mutex.Unlock() + var value []network.SecurityGroup if _, ok := fNSG.FakeStore[resourceGroupName]; ok { for _, v := range fNSG.FakeStore[resourceGroupName] { value = append(value, v) } } - result = &fakeSecurityGroupListResultPage{ - value: network.SecurityGroupListResult{ - Value: &value, - }, - values: value, - } - return result, nil + + return value, nil } func getRandomIPPtr() *string { @@ -722,66 +599,32 @@ func newFakeRoutesClient() *fakeRoutesClient { return fRC } -func (fRC *fakeRoutesClient) CreateOrUpdate(resourceGroupName string, routeTableName string, routeName string, routeParameters network.Route, cancel <-chan struct{}) (<-chan network.Route, <-chan error) { +func (fRC *fakeRoutesClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, routeTableName string, routeName string, routeParameters network.Route) (resp *http.Response, err error) { fRC.mutex.Lock() defer fRC.mutex.Unlock() - resultChan := make(chan network.Route, 1) - errChan := make(chan error, 1) - var result network.Route - var err error - defer func() { - resultChan <- result - errChan <- err - close(resultChan) - close(errChan) - }() - if _, ok := fRC.FakeStore[routeTableName]; !ok { fRC.FakeStore[routeTableName] = make(map[string]network.Route) } fRC.FakeStore[routeTableName][routeName] = routeParameters - result = fRC.FakeStore[routeTableName][routeName] - result.Response.Response = &http.Response{ - StatusCode: http.StatusOK, - } - err = nil - return resultChan, errChan + + return nil, nil } -func (fRC *fakeRoutesClient) Delete(resourceGroupName string, routeTableName string, routeName string, cancel <-chan struct{}) (<-chan autorest.Response, <-chan error) { +func (fRC *fakeRoutesClient) Delete(ctx context.Context, resourceGroupName string, routeTableName string, routeName string) (resp *http.Response, err error) { fRC.mutex.Lock() defer fRC.mutex.Unlock() - respChan := make(chan autorest.Response, 1) - errChan := make(chan error, 1) - var resp autorest.Response - var err error - defer func() { - respChan <- resp - errChan <- err - close(respChan) - close(errChan) - }() if routes, ok := fRC.FakeStore[routeTableName]; ok { if _, ok := routes[routeName]; ok { delete(routes, routeName) - resp.Response = &http.Response{ - StatusCode: http.StatusAccepted, - } - - err = nil - return respChan, errChan + return nil, nil } } - resp.Response = &http.Response{ + + return &http.Response{ StatusCode: http.StatusNotFound, - } - err = autorest.DetailedError{ - StatusCode: http.StatusNotFound, - Message: "Not such Route", - } - return respChan, errChan + }, nil } type fakeRouteTablesClient struct { @@ -797,36 +640,21 @@ func newFakeRouteTablesClient() *fakeRouteTablesClient { return fRTC } -func (fRTC *fakeRouteTablesClient) CreateOrUpdate(resourceGroupName string, routeTableName string, parameters network.RouteTable, cancel <-chan struct{}) (<-chan network.RouteTable, <-chan error) { +func (fRTC *fakeRouteTablesClient) CreateOrUpdate(ctx context.Context, resourceGroupName string, routeTableName string, parameters network.RouteTable) (resp *http.Response, err error) { fRTC.mutex.Lock() defer fRTC.mutex.Unlock() fRTC.Calls = append(fRTC.Calls, "CreateOrUpdate") - resultChan := make(chan network.RouteTable, 1) - errChan := make(chan error, 1) - var result network.RouteTable - var err error - defer func() { - resultChan <- result - errChan <- err - close(resultChan) - close(errChan) - }() - if _, ok := fRTC.FakeStore[resourceGroupName]; !ok { fRTC.FakeStore[resourceGroupName] = make(map[string]network.RouteTable) } fRTC.FakeStore[resourceGroupName][routeTableName] = parameters - result = fRTC.FakeStore[resourceGroupName][routeTableName] - result.Response.Response = &http.Response{ - StatusCode: http.StatusOK, - } - err = nil - return resultChan, errChan + + return nil, nil } -func (fRTC *fakeRouteTablesClient) Get(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 error) { fRTC.mutex.Lock() defer fRTC.mutex.Unlock() diff --git a/pkg/cloudprovider/providers/azure/azure_test.go b/pkg/cloudprovider/providers/azure/azure_test.go index 043187ecd12..dfcf2ec92a7 100644 --- a/pkg/cloudprovider/providers/azure/azure_test.go +++ b/pkg/cloudprovider/providers/azure/azure_test.go @@ -1056,7 +1056,9 @@ func getClusterResources(az *Cloud, vmCount int, availabilitySetCount int) (clus }, }, } - az.InterfacesClient.CreateOrUpdate(az.Config.ResourceGroup, nicName, newNIC, nil) + ctx, cancel := getContextWithCancel() + defer cancel() + az.InterfacesClient.CreateOrUpdate(ctx, az.Config.ResourceGroup, nicName, newNIC) // create vm asID := az.getAvailabilitySetID(asName) @@ -1077,9 +1079,9 @@ func getClusterResources(az *Cloud, vmCount int, availabilitySetCount int) (clus }, } - ctx, cancel := getContextWithCancel() - defer cancel() - _, err := az.VirtualMachinesClient.CreateOrUpdate(ctx, az.Config.ResourceGroup, vmName, newVM) + vmCtx, vmCancel := getContextWithCancel() + defer vmCancel() + _, err := az.VirtualMachinesClient.CreateOrUpdate(vmCtx, az.Config.ResourceGroup, vmName, newVM) if err != nil { } // add to kubernetes @@ -1176,11 +1178,13 @@ func getTestSecurityGroup(az *Cloud, services ...v1.Service) *network.SecurityGr }, } + ctx, cancel := getContextWithCancel() + defer cancel() az.SecurityGroupsClient.CreateOrUpdate( + ctx, az.ResourceGroup, az.SecurityGroupName, - sg, - nil) + sg) return &sg } @@ -1854,13 +1858,15 @@ func addTestSubnet(t *testing.T, az *Cloud, svc *v1.Service) { az.VnetName, subName) - _, errChan := az.SubnetsClient.CreateOrUpdate(az.VnetResourceGroup, az.VnetName, subName, + ctx, cancel := getContextWithCancel() + defer cancel() + _, err := az.SubnetsClient.CreateOrUpdate(ctx, az.VnetResourceGroup, az.VnetName, subName, network.Subnet{ ID: &subnetID, Name: &subName, - }, nil) + }) - if err := <-errChan; err != nil { + if err != nil { t.Errorf("Subnet cannot be created or update, %v", err) } svc.Annotations[ServiceAnnotationLoadBalancerInternalSubnet] = subName