From 113c5e34751bf394eb5a2b8fb398cec851f4daa1 Mon Sep 17 00:00:00 2001 From: Cole Mickens Date: Thu, 6 Oct 2016 23:59:14 -0700 Subject: [PATCH] azure: filter load balancer backend nodes to PrimaryAvailabilitySet if set --- pkg/cloudprovider/providers/azure/azure.go | 19 ++++++++++--------- .../providers/azure/azure_loadbalancer.go | 11 +++++++++++ .../providers/azure/azure_test.go | 7 ++++++- .../providers/azure/azure_util.go | 14 ++++++++++++-- 4 files changed, 39 insertions(+), 12 deletions(-) diff --git a/pkg/cloudprovider/providers/azure/azure.go b/pkg/cloudprovider/providers/azure/azure.go index 8fefc76a652..7e7d1fd80ad 100644 --- a/pkg/cloudprovider/providers/azure/azure.go +++ b/pkg/cloudprovider/providers/azure/azure.go @@ -33,15 +33,16 @@ const CloudProviderName = "azure" // Config holds the configuration parsed from the --cloud-config flag type Config struct { - Cloud string `json:"cloud" yaml:"cloud"` - TenantID string `json:"tenantId" yaml:"tenantId"` - SubscriptionID string `json:"subscriptionId" yaml:"subscriptionId"` - ResourceGroup string `json:"resourceGroup" yaml:"resourceGroup"` - Location string `json:"location" yaml:"location"` - VnetName string `json:"vnetName" yaml:"vnetName"` - SubnetName string `json:"subnetName" yaml:"subnetName"` - SecurityGroupName string `json:"securityGroupName" yaml:"securityGroupName"` - RouteTableName string `json:"routeTableName" yaml:"routeTableName"` + Cloud string `json:"cloud" yaml:"cloud"` + TenantID string `json:"tenantId" yaml:"tenantId"` + SubscriptionID string `json:"subscriptionId" yaml:"subscriptionId"` + ResourceGroup string `json:"resourceGroup" yaml:"resourceGroup"` + Location string `json:"location" yaml:"location"` + VnetName string `json:"vnetName" yaml:"vnetName"` + SubnetName string `json:"subnetName" yaml:"subnetName"` + SecurityGroupName string `json:"securityGroupName" yaml:"securityGroupName"` + RouteTableName string `json:"routeTableName" yaml:"routeTableName"` + PrimaryAvailabilitySetName string `json:"primaryAvailabilitySetName" yaml:"primaryAvailabilitySetName"` AADClientID string `json:"aadClientId" yaml:"aadClientId"` AADClientSecret string `json:"aadClientSecret" yaml:"aadClientSecret"` diff --git a/pkg/cloudprovider/providers/azure/azure_loadbalancer.go b/pkg/cloudprovider/providers/azure/azure_loadbalancer.go index feb731a9a2d..be635cd7557 100644 --- a/pkg/cloudprovider/providers/azure/azure_loadbalancer.go +++ b/pkg/cloudprovider/providers/azure/azure_loadbalancer.go @@ -573,6 +573,17 @@ func (az *Cloud) ensureHostInPool(serviceName string, nodeName types.NodeName, b return err } + // Check availability set + if az.PrimaryAvailabilitySetName != "" { + expectedAvailabilitySetName := az.getAvailabilitySetID(az.PrimaryAvailabilitySetName) + if !strings.EqualFold(*machine.Properties.AvailabilitySet.ID, expectedAvailabilitySetName) { + glog.V(1).Infof( + "nicupdate(%s): skipping nic (%s) since it is not in the primaryAvailabilitSet(%s)", + serviceName, nicName, az.PrimaryAvailabilitySetName) + return nil + } + } + nic, err := az.InterfacesClient.Get(az.ResourceGroup, nicName, "") if err != nil { return err diff --git a/pkg/cloudprovider/providers/azure/azure_test.go b/pkg/cloudprovider/providers/azure/azure_test.go index 65164ed510c..c6890d1e9ca 100644 --- a/pkg/cloudprovider/providers/azure/azure_test.go +++ b/pkg/cloudprovider/providers/azure/azure_test.go @@ -412,7 +412,8 @@ func TestNewCloudFromJSON(t *testing.T) { "subnetName": "--subnet-name--", "securityGroupName": "--security-group-name--", "vnetName": "--vnet-name--", - "routeTableName": "--route-table-name--" + "routeTableName": "--route-table-name--", + "primaryAvailabilitySetName": "--primary-availability-set-name--" }` validateConfig(t, config) } @@ -430,6 +431,7 @@ subnetName: --subnet-name-- securityGroupName: --security-group-name-- vnetName: --vnet-name-- routeTableName: --route-table-name-- +primaryAvailabilitySetName: --primary-availability-set-name-- ` validateConfig(t, config) } @@ -476,6 +478,9 @@ func validateConfig(t *testing.T, config string) { if azureCloud.RouteTableName != "--route-table-name--" { t.Errorf("got incorrect value for RouteTableName") } + if azureCloud.PrimaryAvailabilitySetName != "--primary-availability-set-name--" { + t.Errorf("got incorrect value for PrimaryAvailabilitySetName") + } } func TestDecodeInstanceInfo(t *testing.T) { diff --git a/pkg/cloudprovider/providers/azure/azure_util.go b/pkg/cloudprovider/providers/azure/azure_util.go index 9b06d6529ea..2f31cab9ac2 100644 --- a/pkg/cloudprovider/providers/azure/azure_util.go +++ b/pkg/cloudprovider/providers/azure/azure_util.go @@ -32,7 +32,8 @@ const ( loadBalancerMinimumPriority = 500 loadBalancerMaximumPriority = 4096 - machineResourceIDTemplate = "/subscriptions/%s/resourceGroups/%s/providers/Microsoft.Compute/virtualMachines/%s" + machineIDTemplate = "/subscriptions/%s/resourceGroups/%s/providers/Microsoft.Compute/virtualMachines/%s" + availabilitySetIDTemplate = "/subscriptions/%s/resourceGroups/%s/providers/Microsoft.Compute/availabilitySets/%s" frontendIPConfigIDTemplate = "/subscriptions/%s/resourceGroups/%s/providers/Microsoft.Network/loadBalancers/%s/frontendIPConfigurations/%s" backendPoolIDTemplate = "/subscriptions/%s/resourceGroups/%s/providers/Microsoft.Network/loadBalancers/%s/backendAddressPools/%s" loadBalancerRuleIDTemplate = "/subscriptions/%s/resourceGroups/%s/providers/Microsoft.Network/loadBalancers/%s/loadBalancingRules/%s" @@ -43,12 +44,21 @@ const ( // returns the full identifier of a machine func (az *Cloud) getMachineID(machineName string) string { return fmt.Sprintf( - machineResourceIDTemplate, + machineIDTemplate, az.SubscriptionID, az.ResourceGroup, machineName) } +// returns the full identifier of an availabilitySet +func (az *Cloud) getAvailabilitySetID(availabilitySetName string) string { + return fmt.Sprintf( + availabilitySetIDTemplate, + az.SubscriptionID, + az.ResourceGroup, + availabilitySetName) +} + // returns the full identifier of a loadbalancer frontendipconfiguration. func (az *Cloud) getFrontendIPConfigID(lbName, backendPoolName string) string { return fmt.Sprintf(