diff --git a/pkg/ccm/loadbalancer.go b/pkg/ccm/loadbalancer.go index e57f6c8bc..8078e250f 100644 --- a/pkg/ccm/loadbalancer.go +++ b/pkg/ccm/loadbalancer.go @@ -11,6 +11,9 @@ package ccm import ( "context" "fmt" + "strconv" + "strings" + "github.com/vmware/cloud-provider-for-cloud-director/pkg/cpisdk" "github.com/vmware/cloud-provider-for-cloud-director/pkg/util" "github.com/vmware/cloud-provider-for-cloud-director/pkg/vcdsdk" @@ -22,13 +25,12 @@ import ( "k8s.io/client-go/kubernetes" cloudProvider "k8s.io/cloud-provider" "k8s.io/klog" - "strconv" - "strings" ) const ( sslPortsAnnotation = `service.beta.kubernetes.io/vcloud-avi-ssl-ports` sslCertAliasAnnotation = `service.beta.kubernetes.io/vcloud-avi-ssl-cert-alias` + applicationProfileAnnotation = `service.beta.kubernetes.io/vcloud-avi-application-profile` skipAviSSLTerminationAnnotation = `service.beta.kubernetes.io/vcloud-avi-ssl-no-termination` // TODO: Update controlPlaneLabel to use default K8s constants if available controlPlaneLabel = `node-role.kubernetes.io/control-plane` @@ -228,8 +230,9 @@ func (lb *LBManager) UpdateLoadBalancer(ctx context.Context, clusterName string, klog.Infof("Updating pool [%s] with port [%s:%d]", lbPoolName, portName, internalPort) protocol, _ := nameToProtocol[portName] resourcesAllocated := &util.AllocatedResourcesMap{} + applicationProfile := getApplicationProfile(service) vip, err := gm.UpdateLoadBalancer(ctx, lbPoolName, virtualServiceName, nodeIps, userSpecifiedLBIP, internalPort, - externalPort, lb.OneArm, lb.EnableVirtualServiceSharedIP, protocol, resourcesAllocated) + externalPort, lb.OneArm, lb.EnableVirtualServiceSharedIP, protocol, resourcesAllocated, applicationProfile) // TODO: Should we record this error as well? if rdeErr := lb.addLBResourcesToRDE(ctx, resourcesAllocated, vip); rdeErr != nil { return fmt.Errorf("failed to add load balancer resources to RDE [%s]: [%v]", lb.clusterID, err) @@ -504,6 +507,15 @@ func getSSLCertAlias(service *v1.Service) string { return sslCertAlias } +func getApplicationProfile(service *v1.Service) string { + applicationProfile, ok := service.Annotations[applicationProfileAnnotation] + if !ok { + return "" + } + + return applicationProfile +} + func shouldSkipAviSSLTermination(service *v1.Service) bool { shouldSkipAviSSLTerminationStr, ok := service.Annotations[skipAviSSLTerminationAnnotation] if !ok { @@ -559,6 +571,8 @@ func (lb *LBManager) createLoadBalancer(ctx context.Context, service *v1.Service userSpecifiedLBIP := getUserSpecifiedLoadBalancerIP(service) klog.Infof("createLoadBalancer called with loadBalancerIP [%s] for service [%s]", userSpecifiedLBIP, service.Name) + applicationProfile := getApplicationProfile(service) + if lbExists { // Update load balancer if there are changes in service properties typeToInternalPortMap, typeToExternalPortMap, nameToProtocol := lb.getServicePortMap(service) @@ -570,7 +584,7 @@ func (lb *LBManager) createLoadBalancer(ctx context.Context, service *v1.Service klog.Infof("Updating pool [%s] with port [%s:%d:%d]", lbPoolName, portName, internalPort, externalPort) resourcesAllocated := &util.AllocatedResourcesMap{} vip, err := gm.UpdateLoadBalancer(ctx, lbPoolName, virtualServiceName, nodeIPs, userSpecifiedLBIP, internalPort, - externalPort, lb.OneArm, lb.EnableVirtualServiceSharedIP, protocol, resourcesAllocated) + externalPort, lb.OneArm, lb.EnableVirtualServiceSharedIP, protocol, resourcesAllocated, applicationProfile) if rdeErr := lb.addLBResourcesToRDE(ctx, resourcesAllocated, vip); rdeErr != nil { return nil, fmt.Errorf("failed to update RDE [%s] with load balancer resources: [%v]", lb.clusterID, err) } @@ -676,7 +690,7 @@ func (lb *LBManager) createLoadBalancer(ctx context.Context, service *v1.Service // Create using VCD API resourcesAllocated := &util.AllocatedResourcesMap{} lbIP, err := gm.CreateLoadBalancer(ctx, virtualServiceNamePrefix, lbPoolNamePrefix, nodeIPs, portDetailsList, - lb.OneArm, lb.EnableVirtualServiceSharedIP, portNameToIPMap, userSpecifiedLBIP, resourcesAllocated) + lb.OneArm, lb.EnableVirtualServiceSharedIP, portNameToIPMap, userSpecifiedLBIP, resourcesAllocated, applicationProfile) if rdeErr := lb.addLBResourcesToRDE(ctx, resourcesAllocated, lbIP); rdeErr != nil { return nil, fmt.Errorf("unable to add load balancer pool resources to RDE [%s]: [%v]", lb.clusterID, err) } diff --git a/pkg/vcdsdk/gateway.go b/pkg/vcdsdk/gateway.go index b3aa7f609..01140eba4 100644 --- a/pkg/vcdsdk/gateway.go +++ b/pkg/vcdsdk/gateway.go @@ -10,6 +10,11 @@ package vcdsdk import ( "context" "fmt" + "net/http" + "net/url" + "strconv" + "strings" + "github.com/antihax/optional" "github.com/peterhellberg/link" "github.com/vmware/cloud-provider-for-cloud-director/pkg/util" @@ -17,10 +22,6 @@ import ( "github.com/vmware/go-vcloud-director/v2/govcd" "github.com/vmware/go-vcloud-director/v2/types/v56" "k8s.io/klog" - "net/http" - "net/url" - "strconv" - "strings" ) type OneArm struct { @@ -1104,7 +1105,7 @@ func (gatewayManager *GatewayManager) checkIfGatewayIsReady(ctx context.Context) } func (gatewayManager *GatewayManager) UpdateVirtualService(ctx context.Context, virtualServiceName string, - virtualServiceIP string, externalPort int32, oneArmEnabled bool) (*swaggerClient.EntityReference, error) { + virtualServiceIP string, externalPort int32, oneArmEnabled bool, applicationProfile string) (*swaggerClient.EntityReference, error) { client := gatewayManager.Client vsSummary, err := gatewayManager.GetVirtualService(ctx, virtualServiceName) if err != nil { @@ -1147,6 +1148,11 @@ func (gatewayManager *GatewayManager) UpdateVirtualService(ctx context.Context, // update the virtual IP address of the virtual service when one arm is nil vs.VirtualIpAddress = virtualServiceIP } + + if applicationProfile != "" && vs.ApplicationProfile.Name != applicationProfile { + vs.ApplicationProfile.Name = applicationProfile + } + resp, err := client.APIClient.EdgeGatewayLoadBalancerVirtualServiceApi.UpdateVirtualService(ctx, vs, vsSummary.Id, org.Org.ID) if resp != nil && resp.StatusCode != http.StatusAccepted { var responseMessageBytes []byte @@ -1187,7 +1193,7 @@ func (gatewayManager *GatewayManager) UpdateVirtualService(ctx context.Context, func (gatewayManager *GatewayManager) CreateVirtualService(ctx context.Context, virtualServiceName string, lbPoolRef *swaggerClient.EntityReference, segRef *swaggerClient.EntityReference, freeIP string, vsType string, externalPort int32, - useSSL bool, certificateAlias string) (*swaggerClient.EntityReference, error) { + useSSL bool, certificateAlias, applicationProfile string) (*swaggerClient.EntityReference, error) { client := gatewayManager.Client if gatewayManager.GatewayRef == nil { @@ -1231,9 +1237,7 @@ func (gatewayManager *GatewayManager) CreateVirtualService(ctx context.Context, SslEnabled: useSSL, }, }, - ApplicationProfile: &swaggerClient.EdgeLoadBalancerApplicationProfile{ - SystemDefined: true, - }, + ApplicationProfile: &swaggerClient.EdgeLoadBalancerApplicationProfile{}, } switch vsType { case "TCP": @@ -1259,6 +1263,10 @@ func (gatewayManager *GatewayManager) CreateVirtualService(ctx context.Context, return nil, fmt.Errorf("unhandled virtual service type [%s]", vsType) } + if applicationProfile != "" { + virtualServiceConfig.ApplicationProfile.Name = applicationProfile + } + clusterOrg, err := client.VCDClient.GetOrgByName(client.ClusterOrgName) if err != nil { return nil, fmt.Errorf("unable to get org for org [%s]: [%v]", client.ClusterOrgName, err) @@ -1502,7 +1510,7 @@ func (gatewayManager *GatewayManager) GetLoadBalancerPoolMemberIPs(ctx context.C func (gm *GatewayManager) CreateLoadBalancer(ctx context.Context, virtualServiceNamePrefix string, lbPoolNamePrefix string, ips []string, portDetailsList []PortDetails, oneArm *OneArm, enableVirtualServiceSharedIP bool, - portNameToIP map[string]string, providedIP string, resourcesAllocated *util.AllocatedResourcesMap) (string, error) { + portNameToIP map[string]string, providedIP string, resourcesAllocated *util.AllocatedResourcesMap, applicationProfile string) (string, error) { if len(portDetailsList) == 0 { // nothing to do here klog.Infof("There is no port specified. Hence nothing to do.") @@ -1707,7 +1715,7 @@ func (gm *GatewayManager) CreateLoadBalancer(ctx context.Context, virtualService virtualServiceRef, err := gm.CreateVirtualService(ctx, virtualServiceName, lbPoolRef, segRef, virtualServiceIP, portDetails.Protocol, portDetails.ExternalPort, - portDetails.UseSSL, portDetails.CertAlias) + portDetails.UseSSL, portDetails.CertAlias, applicationProfile) if err != nil { // return plain error if vcdsdk.VirtualServicePendingError is returned. Helps the caller recognize that the // error is because VirtualService is still in Pending state. @@ -1833,7 +1841,7 @@ func (gm *GatewayManager) DeleteLoadBalancer(ctx context.Context, virtualService func (gm *GatewayManager) UpdateLoadBalancer(ctx context.Context, lbPoolName string, virtualServiceName string, ips []string, externalIP string, internalPort int32, externalPort int32, oneArm *OneArm, enableVirtualServiceSharedIP bool, protocol string, - resourcesAllocated *util.AllocatedResourcesMap) (string, error) { + resourcesAllocated *util.AllocatedResourcesMap, applicationProfile string) (string, error) { if gm == nil { return "", fmt.Errorf("GatewayManager cannot be nil") @@ -1852,7 +1860,7 @@ func (gm *GatewayManager) UpdateLoadBalancer(ctx context.Context, lbPoolName str return "", fmt.Errorf("unable to update load balancer pool [%s]: [%v]", lbPoolName, err) } resourcesAllocated.Insert(VcdResourceLoadBalancerPool, lbPoolRef) - vsRef, err := gm.UpdateVirtualService(ctx, virtualServiceName, externalIP, externalPort, oneArm != nil) + vsRef, err := gm.UpdateVirtualService(ctx, virtualServiceName, externalIP, externalPort, oneArm != nil, applicationProfile) if vsRef != nil { resourcesAllocated.Insert(VcdResourceVirtualService, vsRef) } diff --git a/pkg/vcdsdk/gateway_system_test.go b/pkg/vcdsdk/gateway_system_test.go index c6cc5a860..22623b47e 100644 --- a/pkg/vcdsdk/gateway_system_test.go +++ b/pkg/vcdsdk/gateway_system_test.go @@ -8,16 +8,17 @@ package vcdsdk import ( "context" "fmt" + "io/ioutil" + "path/filepath" + "testing" + "time" + "github.com/google/uuid" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/vmware/cloud-provider-for-cloud-director/pkg/util" swaggerClient "github.com/vmware/cloud-provider-for-cloud-director/pkg/vcdswaggerclient_36_0" "gopkg.in/yaml.v2" - "io/ioutil" - "path/filepath" - "testing" - "time" ) const BusyRetries = 5 @@ -332,7 +333,7 @@ func TestVirtualServiceHttpCRUDE(t *testing.T) { var vsRef *swaggerClient.EntityReference for i := 0; i < BusyRetries; i++ { vsRef, err = gm.CreateVirtualService(ctx, virtualServiceName, lbPoolRef, segRef, - internalIP, "HTTP", 80, false, "") + internalIP, "HTTP", 80, false, "", "") if err != nil { if _, ok := err.(*VirtualServicePendingError); !ok { break @@ -353,7 +354,7 @@ func TestVirtualServiceHttpCRUDE(t *testing.T) { // repeated creation should not fail for i := 0; i < BusyRetries; i++ { vsRef, err = gm.CreateVirtualService(ctx, virtualServiceName, lbPoolRef, segRef, - internalIP, "HTTP", 80, false, "") + internalIP, "HTTP", 80, false, "", "") if err != nil { if _, ok := err.(*VirtualServicePendingError); !ok { break @@ -364,14 +365,14 @@ func TestVirtualServiceHttpCRUDE(t *testing.T) { require.NotNil(t, vsRef, "VirtualServiceRef should not be nil") assert.Equal(t, virtualServiceName, vsRef.Name, "Virtual Service name should match") - _, err = gm.UpdateVirtualService(ctx, virtualServiceName, "", 8080, true) + _, err = gm.UpdateVirtualService(ctx, virtualServiceName, "", 8080, true, "") assert.NoError(t, err, "Unable to update external port") // repeated update should not fail - _, err = gm.UpdateVirtualService(ctx, virtualServiceName, "", 8080, true) + _, err = gm.UpdateVirtualService(ctx, virtualServiceName, "", 8080, true, "") assert.NoError(t, err, "Repeated update to external port should not fail") - _, err = gm.UpdateVirtualService(ctx, virtualServiceName+"-invalid", "", 8080, true) + _, err = gm.UpdateVirtualService(ctx, virtualServiceName+"-invalid", "", 8080, true, "") assert.Error(t, err, "Update virtual service on a non-existent virtual service should fail") err = gm.DeleteVirtualService(ctx, virtualServiceName, true) @@ -436,7 +437,7 @@ func TestVirtualServiceHttpsCRUDE(t *testing.T) { var vsRef *swaggerClient.EntityReference for i := 0; i < BusyRetries; i++ { vsRef, err = gm.CreateVirtualService(ctx, virtualServiceName, lbPoolRef, segRef, - internalIP, "HTTP", 80, false, "") + internalIP, "HTTP", 80, false, "", "") if err != nil { if _, ok := err.(*VirtualServicePendingError); !ok { break @@ -455,21 +456,21 @@ func TestVirtualServiceHttpsCRUDE(t *testing.T) { // repeated creation should not fail vsRef, err = gm.CreateVirtualService(ctx, virtualServiceName, lbPoolRef, segRef, - internalIP, "HTTPS", 443, true, certName) + internalIP, "HTTPS", 443, true, certName, "") assert.NoError(t, err, "Unable to create virtual service for the second time") require.NotNil(t, vsRef, "VirtualServiceRef should not be nil") assert.Equal(t, virtualServiceName, vsRef.Name, "Virtual Service name should match") // update and delete calls might error out if virtual services are busy. Retry if the error is caused by the busy virtual services - _, err = gm.UpdateVirtualService(ctx, virtualServiceName, "", 8443, true) + _, err = gm.UpdateVirtualService(ctx, virtualServiceName, "", 8443, true, "") assert.NoError(t, err, "Unable to update external port") // repeated update should not fail - _, err = gm.UpdateVirtualService(ctx, virtualServiceName, "", 8443, true) + _, err = gm.UpdateVirtualService(ctx, virtualServiceName, "", 8443, true, "") assert.NoError(t, err, "Repeated update to external port should not fail") // update of invalid virtual service - _, err = gm.UpdateVirtualService(ctx, virtualServiceName+"-invalid\n", "", 8443, true) + _, err = gm.UpdateVirtualService(ctx, virtualServiceName+"-invalid\n", "", 8443, true, "") assert.Error(t, err, "Update virtual service on a non-existent virtual service should fail") err = gm.DeleteVirtualService(ctx, virtualServiceName, true) @@ -548,7 +549,7 @@ func TestLoadBalancerCRUDE(t *testing.T) { EndIP: "192.168.8.100", } freeIP, err = gm.CreateLoadBalancer(ctx, virtualServiceNamePrefix, - lbPoolNamePrefix, []string{"1.2.3.4", "1.2.3.5"}, portDetailsList, oneArm, false, nil, "", &util.AllocatedResourcesMap{}) + lbPoolNamePrefix, []string{"1.2.3.4", "1.2.3.5"}, portDetailsList, oneArm, false, nil, "", &util.AllocatedResourcesMap{}, "") assert.NoError(t, err, "Load Balancer should be created") assert.NotEmpty(t, freeIP, "There should be a non-empty IP returned") @@ -567,34 +568,34 @@ func TestLoadBalancerCRUDE(t *testing.T) { assert.Equal(t, freeIP, freeIPObtained, "The IPs should match") freeIP, err = gm.CreateLoadBalancer(ctx, virtualServiceNamePrefix, - lbPoolNamePrefix, []string{"1.2.3.4", "1.2.3.5"}, portDetailsList, oneArm, false, nil, "", &util.AllocatedResourcesMap{}) + lbPoolNamePrefix, []string{"1.2.3.4", "1.2.3.5"}, portDetailsList, oneArm, false, nil, "", &util.AllocatedResourcesMap{}, "") assert.NoError(t, err, "Load Balancer should be created even on second attempt") assert.NotEmpty(t, freeIP, "There should be a non-empty IP returned") updatedIps := []string{"5.5.5.5"} updatedInternalPort := int32(55555) // update IPs and internal port - _, err = gm.UpdateLoadBalancer(ctx, lbPoolNamePrefix+"-http", virtualServiceNamePrefix+"-http", updatedIps, "", updatedInternalPort, 80, nil, false, "HTTP", &util.AllocatedResourcesMap{}) + _, err = gm.UpdateLoadBalancer(ctx, lbPoolNamePrefix+"-http", virtualServiceNamePrefix+"-http", updatedIps, "", updatedInternalPort, 80, nil, false, "HTTP", &util.AllocatedResourcesMap{}, "") assert.NoError(t, err, "HTTP Load Balancer should be updated") - _, err = gm.UpdateLoadBalancer(ctx, lbPoolNamePrefix+"-https", virtualServiceNamePrefix+"-https", updatedIps, "", updatedInternalPort, 443, nil, false, "HTTPS", &util.AllocatedResourcesMap{}) + _, err = gm.UpdateLoadBalancer(ctx, lbPoolNamePrefix+"-https", virtualServiceNamePrefix+"-https", updatedIps, "", updatedInternalPort, 443, nil, false, "HTTPS", &util.AllocatedResourcesMap{}, "") assert.NoError(t, err, "HTTPS Load Balancer should be updated") // update external port only updatedExternalPortHttp := int32(8080) updatedExternalPortHttps := int32(8443) - _, err = gm.UpdateLoadBalancer(ctx, lbPoolNamePrefix+"-http", virtualServiceNamePrefix+"-http", updatedIps, "", updatedInternalPort, updatedExternalPortHttp, nil, false, "HTTP", &util.AllocatedResourcesMap{}) + _, err = gm.UpdateLoadBalancer(ctx, lbPoolNamePrefix+"-http", virtualServiceNamePrefix+"-http", updatedIps, "", updatedInternalPort, updatedExternalPortHttp, nil, false, "HTTP", &util.AllocatedResourcesMap{}, "") assert.NoError(t, err, "HTTP Load Balancer should be updated") - _, err = gm.UpdateLoadBalancer(ctx, lbPoolNamePrefix+"-https", virtualServiceNamePrefix+"-https", updatedIps, "", updatedInternalPort, updatedExternalPortHttps, nil, false, "HTTPS", &util.AllocatedResourcesMap{}) + _, err = gm.UpdateLoadBalancer(ctx, lbPoolNamePrefix+"-https", virtualServiceNamePrefix+"-https", updatedIps, "", updatedInternalPort, updatedExternalPortHttps, nil, false, "HTTPS", &util.AllocatedResourcesMap{}, "") assert.NoError(t, err, "HTTPS Load Balancer should be updated") // No error on repeated update - _, err = gm.UpdateLoadBalancer(ctx, lbPoolNamePrefix+"-http", virtualServiceNamePrefix+"-http", updatedIps, "", updatedInternalPort, updatedExternalPortHttp, nil, false, "HTTP", &util.AllocatedResourcesMap{}) + _, err = gm.UpdateLoadBalancer(ctx, lbPoolNamePrefix+"-http", virtualServiceNamePrefix+"-http", updatedIps, "", updatedInternalPort, updatedExternalPortHttp, nil, false, "HTTP", &util.AllocatedResourcesMap{}, "") assert.NoError(t, err, "HTTP Load Balancer should be updated") - _, err = gm.UpdateLoadBalancer(ctx, lbPoolNamePrefix+"-https", virtualServiceNamePrefix+"-https", updatedIps, "", updatedInternalPort, updatedExternalPortHttps, nil, false, "HTTPS", &util.AllocatedResourcesMap{}) + _, err = gm.UpdateLoadBalancer(ctx, lbPoolNamePrefix+"-https", virtualServiceNamePrefix+"-https", updatedIps, "", updatedInternalPort, updatedExternalPortHttps, nil, false, "HTTPS", &util.AllocatedResourcesMap{}, "") assert.NoError(t, err, "HTTPS Load Balancer should be updated") _, err = gm.DeleteLoadBalancer(ctx, virtualServiceNamePrefix, lbPoolNamePrefix, portDetailsList, oneArm, &util.AllocatedResourcesMap{}) @@ -611,9 +612,9 @@ func TestLoadBalancerCRUDE(t *testing.T) { _, err = gm.DeleteLoadBalancer(ctx, virtualServiceNamePrefix, lbPoolNamePrefix, portDetailsList, oneArm, &util.AllocatedResourcesMap{}) assert.NoError(t, err, "Repeated deletion of Load Balancer should not fail") - _, err = gm.UpdateLoadBalancer(ctx, lbPoolNamePrefix+"-http", virtualServiceNamePrefix+"-http", updatedIps, "", updatedInternalPort, 80, nil, false, "HTTP", &util.AllocatedResourcesMap{}) + _, err = gm.UpdateLoadBalancer(ctx, lbPoolNamePrefix+"-http", virtualServiceNamePrefix+"-http", updatedIps, "", updatedInternalPort, 80, nil, false, "HTTP", &util.AllocatedResourcesMap{}, "") assert.Error(t, err, "updating deleted HTTP Load Balancer should be an error") - _, err = gm.UpdateLoadBalancer(ctx, lbPoolNamePrefix+"-https", virtualServiceNamePrefix+"https", updatedIps, "", updatedInternalPort, 43, nil, false, "HTTPS", &util.AllocatedResourcesMap{}) + _, err = gm.UpdateLoadBalancer(ctx, lbPoolNamePrefix+"-https", virtualServiceNamePrefix+"https", updatedIps, "", updatedInternalPort, 43, nil, false, "HTTPS", &util.AllocatedResourcesMap{}, "") assert.Error(t, err, "updating deleted HTTPS Load Balancer should be an error") return @@ -675,7 +676,7 @@ func TestLoadBalancer_ExplicitLBIP_OneArmDisabled_CRUDE(t *testing.T) { var oneArm *OneArm freeIP, err = gm.CreateLoadBalancer(ctx, virtualServiceNamePrefix, - lbPoolNamePrefix, []string{"1.2.3.4", "1.2.3.5"}, portDetailsList, oneArm, true, nil, testConfig.FreeLoadBalancerIP, &util.AllocatedResourcesMap{}) + lbPoolNamePrefix, []string{"1.2.3.4", "1.2.3.5"}, portDetailsList, oneArm, true, nil, testConfig.FreeLoadBalancerIP, &util.AllocatedResourcesMap{}, "") assert.NoError(t, err, "Load Balancer should be created") assert.NotEmpty(t, freeIP, "There should be a non-empty IP returned") assert.Equal(t, freeIP, testConfig.FreeLoadBalancerIP, "the provided external IP address should be the same as the load balancer IP address.") @@ -695,7 +696,7 @@ func TestLoadBalancer_ExplicitLBIP_OneArmDisabled_CRUDE(t *testing.T) { assert.Equal(t, freeIP, freeIPObtained, "The IPs should match") freeIP, err = gm.CreateLoadBalancer(ctx, virtualServiceNamePrefix, - lbPoolNamePrefix, []string{"1.2.3.4", "1.2.3.5"}, portDetailsList, oneArm, true, nil, testConfig.FreeLoadBalancerIP, &util.AllocatedResourcesMap{}) + lbPoolNamePrefix, []string{"1.2.3.4", "1.2.3.5"}, portDetailsList, oneArm, true, nil, testConfig.FreeLoadBalancerIP, &util.AllocatedResourcesMap{}, "") assert.NoError(t, err, "Load Balancer should be created even on second attempt") assert.NotEmpty(t, freeIP, "There should be a non-empty IP returned") assert.Equal(t, freeIP, testConfig.FreeLoadBalancerIP, "the provided external IP address should be the same as the load balancer IP address.") @@ -703,11 +704,11 @@ func TestLoadBalancer_ExplicitLBIP_OneArmDisabled_CRUDE(t *testing.T) { updatedIps := []string{"5.5.5.5"} updatedInternalPort := int32(55555) // update IPs and internal port - freeIP, err = gm.UpdateLoadBalancer(ctx, lbPoolNamePrefix+"-http", virtualServiceNamePrefix+"-http", updatedIps, testConfig.FreeLoadBalancerIP, updatedInternalPort, 80, nil, true, "HTTP", &util.AllocatedResourcesMap{}) + freeIP, err = gm.UpdateLoadBalancer(ctx, lbPoolNamePrefix+"-http", virtualServiceNamePrefix+"-http", updatedIps, testConfig.FreeLoadBalancerIP, updatedInternalPort, 80, nil, true, "HTTP", &util.AllocatedResourcesMap{}, "") assert.NoError(t, err, "HTTP Load Balancer should be updated") assert.Equal(t, freeIP, testConfig.FreeLoadBalancerIP, "IPs should match") - freeIP, err = gm.UpdateLoadBalancer(ctx, lbPoolNamePrefix+"-https", virtualServiceNamePrefix+"-https", updatedIps, testConfig.FreeLoadBalancerIP, updatedInternalPort, 443, nil, true, "HTTPS", &util.AllocatedResourcesMap{}) + freeIP, err = gm.UpdateLoadBalancer(ctx, lbPoolNamePrefix+"-https", virtualServiceNamePrefix+"-https", updatedIps, testConfig.FreeLoadBalancerIP, updatedInternalPort, 443, nil, true, "HTTPS", &util.AllocatedResourcesMap{}, "") assert.NoError(t, err, "HTTPS Load Balancer should be updated") assert.Equal(t, freeIP, testConfig.FreeLoadBalancerIP, "IPs should match") @@ -715,22 +716,22 @@ func TestLoadBalancer_ExplicitLBIP_OneArmDisabled_CRUDE(t *testing.T) { updatedExternalPortHttp := int32(8080) updatedExternalPortHttps := int32(8443) - _, err = gm.UpdateLoadBalancer(ctx, lbPoolNamePrefix+"-http", virtualServiceNamePrefix+"-http", updatedIps, testConfig.FreeLoadBalancerIP, updatedInternalPort, updatedExternalPortHttp, nil, true, "HTTP", &util.AllocatedResourcesMap{}) + _, err = gm.UpdateLoadBalancer(ctx, lbPoolNamePrefix+"-http", virtualServiceNamePrefix+"-http", updatedIps, testConfig.FreeLoadBalancerIP, updatedInternalPort, updatedExternalPortHttp, nil, true, "HTTP", &util.AllocatedResourcesMap{}, "") assert.NoError(t, err, "HTTP Load Balancer should be updated") - _, err = gm.UpdateLoadBalancer(ctx, lbPoolNamePrefix+"-https", virtualServiceNamePrefix+"-https", updatedIps, testConfig.FreeLoadBalancerIP, updatedInternalPort, updatedExternalPortHttps, nil, true, "HTTPS", &util.AllocatedResourcesMap{}) + _, err = gm.UpdateLoadBalancer(ctx, lbPoolNamePrefix+"-https", virtualServiceNamePrefix+"-https", updatedIps, testConfig.FreeLoadBalancerIP, updatedInternalPort, updatedExternalPortHttps, nil, true, "HTTPS", &util.AllocatedResourcesMap{}, "") assert.NoError(t, err, "HTTPS Load Balancer should be updated") // No error on repeated update - _, err = gm.UpdateLoadBalancer(ctx, lbPoolNamePrefix+"-http", virtualServiceNamePrefix+"-http", updatedIps, testConfig.FreeLoadBalancerIP, updatedInternalPort, updatedExternalPortHttp, nil, true, "HTTP", &util.AllocatedResourcesMap{}) + _, err = gm.UpdateLoadBalancer(ctx, lbPoolNamePrefix+"-http", virtualServiceNamePrefix+"-http", updatedIps, testConfig.FreeLoadBalancerIP, updatedInternalPort, updatedExternalPortHttp, nil, true, "HTTP", &util.AllocatedResourcesMap{}, "") assert.NoError(t, err, "HTTP Load Balancer should be updated") - _, err = gm.UpdateLoadBalancer(ctx, lbPoolNamePrefix+"-https", virtualServiceNamePrefix+"-https", updatedIps, testConfig.FreeLoadBalancerIP, updatedInternalPort, updatedExternalPortHttps, nil, true, "HTTPS", &util.AllocatedResourcesMap{}) + _, err = gm.UpdateLoadBalancer(ctx, lbPoolNamePrefix+"-https", virtualServiceNamePrefix+"-https", updatedIps, testConfig.FreeLoadBalancerIP, updatedInternalPort, updatedExternalPortHttps, nil, true, "HTTPS", &util.AllocatedResourcesMap{}, "") assert.NoError(t, err, "HTTPS Load Balancer should be updated") // Update LB IP address of the Load Balancer newLBIP := "192.168.100.20" - lbIP, err := gm.UpdateLoadBalancer(ctx, lbPoolNamePrefix+"-http", virtualServiceNamePrefix+"-http", updatedIps, newLBIP, updatedInternalPort, updatedExternalPortHttp, nil, true, "HTTP", &util.AllocatedResourcesMap{}) + lbIP, err := gm.UpdateLoadBalancer(ctx, lbPoolNamePrefix+"-http", virtualServiceNamePrefix+"-http", updatedIps, newLBIP, updatedInternalPort, updatedExternalPortHttp, nil, true, "HTTP", &util.AllocatedResourcesMap{}, "") assert.NoError(t, err, "HTTP Load Balancer should be updated") assert.Equal(t, lbIP, newLBIP, "updated external IP address should match the value specified") @@ -748,9 +749,9 @@ func TestLoadBalancer_ExplicitLBIP_OneArmDisabled_CRUDE(t *testing.T) { _, err = gm.DeleteLoadBalancer(ctx, virtualServiceNamePrefix, lbPoolNamePrefix, portDetailsList, oneArm, &util.AllocatedResourcesMap{}) assert.NoError(t, err, "Repeated deletion of Load Balancer should not fail") - _, err = gm.UpdateLoadBalancer(ctx, lbPoolNamePrefix+"-http", virtualServiceNamePrefix+"-http", updatedIps, testConfig.FreeLoadBalancerIP, updatedInternalPort, 80, nil, true, "HTTP", &util.AllocatedResourcesMap{}) + _, err = gm.UpdateLoadBalancer(ctx, lbPoolNamePrefix+"-http", virtualServiceNamePrefix+"-http", updatedIps, testConfig.FreeLoadBalancerIP, updatedInternalPort, 80, nil, true, "HTTP", &util.AllocatedResourcesMap{}, "") assert.Error(t, err, "updating deleted HTTP Load Balancer should be an error") - _, err = gm.UpdateLoadBalancer(ctx, lbPoolNamePrefix+"-https", virtualServiceNamePrefix+"https", updatedIps, testConfig.FreeLoadBalancerIP, updatedInternalPort, 43, nil, true, "HTTPS", &util.AllocatedResourcesMap{}) + _, err = gm.UpdateLoadBalancer(ctx, lbPoolNamePrefix+"-https", virtualServiceNamePrefix+"https", updatedIps, testConfig.FreeLoadBalancerIP, updatedInternalPort, 43, nil, true, "HTTPS", &util.AllocatedResourcesMap{}, "") assert.Error(t, err, "updating deleted HTTPS Load Balancer should be an error") return @@ -816,7 +817,7 @@ func TestLoadBalancer_ExplicitLBIP_OneArmEnabled_CRUDE(t *testing.T) { } freeIP, err = gm.CreateLoadBalancer(ctx, virtualServiceNamePrefix, - lbPoolNamePrefix, []string{"1.2.3.4", "1.2.3.5"}, portDetailsList, oneArm, true, nil, testConfig.FreeLoadBalancerIP, &util.AllocatedResourcesMap{}) + lbPoolNamePrefix, []string{"1.2.3.4", "1.2.3.5"}, portDetailsList, oneArm, true, nil, testConfig.FreeLoadBalancerIP, &util.AllocatedResourcesMap{}, "") assert.NoError(t, err, "Load Balancer should be created") assert.NotEmpty(t, freeIP, "There should be a non-empty IP returned") assert.Equal(t, freeIP, testConfig.FreeLoadBalancerIP, "the provided external IP address should be the same as the load balancer IP address.") @@ -836,39 +837,39 @@ func TestLoadBalancer_ExplicitLBIP_OneArmEnabled_CRUDE(t *testing.T) { assert.Equal(t, freeIP, freeIPObtained, "The IPs should match") freeIP, err = gm.CreateLoadBalancer(ctx, virtualServiceNamePrefix, - lbPoolNamePrefix, []string{"1.2.3.4", "1.2.3.5"}, portDetailsList, oneArm, true, nil, testConfig.FreeLoadBalancerIP, &util.AllocatedResourcesMap{}) + lbPoolNamePrefix, []string{"1.2.3.4", "1.2.3.5"}, portDetailsList, oneArm, true, nil, testConfig.FreeLoadBalancerIP, &util.AllocatedResourcesMap{}, "") assert.NoError(t, err, "Load Balancer should be created even on second attempt") assert.NotEmpty(t, freeIP, "There should be a non-empty IP returned") updatedIps := []string{"5.5.5.5"} updatedInternalPort := int32(55555) // update IPs and internal port - _, err = gm.UpdateLoadBalancer(ctx, lbPoolNamePrefix+"-http", virtualServiceNamePrefix+"-http", updatedIps, testConfig.FreeLoadBalancerIP, updatedInternalPort, 80, oneArm, true, "HTTP", &util.AllocatedResourcesMap{}) + _, err = gm.UpdateLoadBalancer(ctx, lbPoolNamePrefix+"-http", virtualServiceNamePrefix+"-http", updatedIps, testConfig.FreeLoadBalancerIP, updatedInternalPort, 80, oneArm, true, "HTTP", &util.AllocatedResourcesMap{}, "") assert.NoError(t, err, "HTTP Load Balancer should be updated") - _, err = gm.UpdateLoadBalancer(ctx, lbPoolNamePrefix+"-https", virtualServiceNamePrefix+"-https", updatedIps, testConfig.FreeLoadBalancerIP, updatedInternalPort, 443, oneArm, true, "HTTPS", &util.AllocatedResourcesMap{}) + _, err = gm.UpdateLoadBalancer(ctx, lbPoolNamePrefix+"-https", virtualServiceNamePrefix+"-https", updatedIps, testConfig.FreeLoadBalancerIP, updatedInternalPort, 443, oneArm, true, "HTTPS", &util.AllocatedResourcesMap{}, "") assert.NoError(t, err, "HTTPS Load Balancer should be updated") // update external port only updatedExternalPortHttp := int32(8080) updatedExternalPortHttps := int32(8443) - _, err = gm.UpdateLoadBalancer(ctx, lbPoolNamePrefix+"-http", virtualServiceNamePrefix+"-http", updatedIps, testConfig.FreeLoadBalancerIP, updatedInternalPort, updatedExternalPortHttp, oneArm, true, "HTTP", &util.AllocatedResourcesMap{}) + _, err = gm.UpdateLoadBalancer(ctx, lbPoolNamePrefix+"-http", virtualServiceNamePrefix+"-http", updatedIps, testConfig.FreeLoadBalancerIP, updatedInternalPort, updatedExternalPortHttp, oneArm, true, "HTTP", &util.AllocatedResourcesMap{}, "") assert.NoError(t, err, "HTTP Load Balancer should be updated") - _, err = gm.UpdateLoadBalancer(ctx, lbPoolNamePrefix+"-https", virtualServiceNamePrefix+"-https", updatedIps, testConfig.FreeLoadBalancerIP, updatedInternalPort, updatedExternalPortHttps, oneArm, true, "HTTPS", &util.AllocatedResourcesMap{}) + _, err = gm.UpdateLoadBalancer(ctx, lbPoolNamePrefix+"-https", virtualServiceNamePrefix+"-https", updatedIps, testConfig.FreeLoadBalancerIP, updatedInternalPort, updatedExternalPortHttps, oneArm, true, "HTTPS", &util.AllocatedResourcesMap{}, "") assert.NoError(t, err, "HTTPS Load Balancer should be updated") // No error on repeated update - _, err = gm.UpdateLoadBalancer(ctx, lbPoolNamePrefix+"-http", virtualServiceNamePrefix+"-http", updatedIps, testConfig.FreeLoadBalancerIP, updatedInternalPort, updatedExternalPortHttp, oneArm, true, "HTTP", &util.AllocatedResourcesMap{}) + _, err = gm.UpdateLoadBalancer(ctx, lbPoolNamePrefix+"-http", virtualServiceNamePrefix+"-http", updatedIps, testConfig.FreeLoadBalancerIP, updatedInternalPort, updatedExternalPortHttp, oneArm, true, "HTTP", &util.AllocatedResourcesMap{}, "") assert.NoError(t, err, "HTTP Load Balancer should be updated") - _, err = gm.UpdateLoadBalancer(ctx, lbPoolNamePrefix+"-https", virtualServiceNamePrefix+"-https", updatedIps, testConfig.FreeLoadBalancerIP, updatedInternalPort, updatedExternalPortHttps, oneArm, true, "HTTPS", &util.AllocatedResourcesMap{}) + _, err = gm.UpdateLoadBalancer(ctx, lbPoolNamePrefix+"-https", virtualServiceNamePrefix+"-https", updatedIps, testConfig.FreeLoadBalancerIP, updatedInternalPort, updatedExternalPortHttps, oneArm, true, "HTTPS", &util.AllocatedResourcesMap{}, "") assert.NoError(t, err, "HTTPS Load Balancer should be updated") // No error on updating the loadbalancer IP newLBIP := "192.168.100.20" - lbIP, err := gm.UpdateLoadBalancer(ctx, lbPoolNamePrefix+"-http", virtualServiceNamePrefix+"-http", updatedIps, newLBIP, updatedInternalPort, updatedExternalPortHttp, oneArm, true, "HTTP", &util.AllocatedResourcesMap{}) + lbIP, err := gm.UpdateLoadBalancer(ctx, lbPoolNamePrefix+"-http", virtualServiceNamePrefix+"-http", updatedIps, newLBIP, updatedInternalPort, updatedExternalPortHttp, oneArm, true, "HTTP", &util.AllocatedResourcesMap{}, "") assert.NoError(t, err, "HTTP Load Balancer should be updated") assert.Equal(t, newLBIP, lbIP, "The external IP for the load balancer should be updated") @@ -886,9 +887,9 @@ func TestLoadBalancer_ExplicitLBIP_OneArmEnabled_CRUDE(t *testing.T) { _, err = gm.DeleteLoadBalancer(ctx, virtualServiceNamePrefix, lbPoolNamePrefix, portDetailsList, oneArm, &util.AllocatedResourcesMap{}) assert.NoError(t, err, "Repeated deletion of Load Balancer should not fail") - _, err = gm.UpdateLoadBalancer(ctx, lbPoolNamePrefix+"-http", virtualServiceNamePrefix+"-http", updatedIps, testConfig.FreeLoadBalancerIP, updatedInternalPort, 80, oneArm, true, "HTTP", &util.AllocatedResourcesMap{}) + _, err = gm.UpdateLoadBalancer(ctx, lbPoolNamePrefix+"-http", virtualServiceNamePrefix+"-http", updatedIps, testConfig.FreeLoadBalancerIP, updatedInternalPort, 80, oneArm, true, "HTTP", &util.AllocatedResourcesMap{}, "") assert.Error(t, err, "updating deleted HTTP Load Balancer should be an error") - _, err = gm.UpdateLoadBalancer(ctx, lbPoolNamePrefix+"-https", virtualServiceNamePrefix+"https", updatedIps, testConfig.FreeLoadBalancerIP, updatedInternalPort, 43, oneArm, true, "HTTPS", &util.AllocatedResourcesMap{}) + _, err = gm.UpdateLoadBalancer(ctx, lbPoolNamePrefix+"-https", virtualServiceNamePrefix+"https", updatedIps, testConfig.FreeLoadBalancerIP, updatedInternalPort, 43, oneArm, true, "HTTPS", &util.AllocatedResourcesMap{}, "") assert.Error(t, err, "updating deleted HTTPS Load Balancer should be an error") return