Skip to content

Commit e555fd9

Browse files
committed
add application profile annotation support
1 parent cc91a95 commit e555fd9

File tree

3 files changed

+88
-61
lines changed

3 files changed

+88
-61
lines changed

Diff for: pkg/ccm/loadbalancer.go

+19-5
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ package ccm
1111
import (
1212
"context"
1313
"fmt"
14+
"strconv"
15+
"strings"
16+
1417
"github.com/vmware/cloud-provider-for-cloud-director/pkg/cpisdk"
1518
"github.com/vmware/cloud-provider-for-cloud-director/pkg/util"
1619
"github.com/vmware/cloud-provider-for-cloud-director/pkg/vcdsdk"
@@ -22,13 +25,12 @@ import (
2225
"k8s.io/client-go/kubernetes"
2326
cloudProvider "k8s.io/cloud-provider"
2427
"k8s.io/klog"
25-
"strconv"
26-
"strings"
2728
)
2829

2930
const (
3031
sslPortsAnnotation = `service.beta.kubernetes.io/vcloud-avi-ssl-ports`
3132
sslCertAliasAnnotation = `service.beta.kubernetes.io/vcloud-avi-ssl-cert-alias`
33+
applicationProfileAnnotation = `service.beta.kubernetes.io/vcloud-avi-application-profile`
3234
skipAviSSLTerminationAnnotation = `service.beta.kubernetes.io/vcloud-avi-ssl-no-termination`
3335
// TODO: Update controlPlaneLabel to use default K8s constants if available
3436
controlPlaneLabel = `node-role.kubernetes.io/control-plane`
@@ -228,8 +230,9 @@ func (lb *LBManager) UpdateLoadBalancer(ctx context.Context, clusterName string,
228230
klog.Infof("Updating pool [%s] with port [%s:%d]", lbPoolName, portName, internalPort)
229231
protocol, _ := nameToProtocol[portName]
230232
resourcesAllocated := &util.AllocatedResourcesMap{}
233+
applicationProfile := getApplicationProfile(service)
231234
vip, err := gm.UpdateLoadBalancer(ctx, lbPoolName, virtualServiceName, nodeIps, userSpecifiedLBIP, internalPort,
232-
externalPort, lb.OneArm, lb.EnableVirtualServiceSharedIP, protocol, resourcesAllocated)
235+
externalPort, lb.OneArm, lb.EnableVirtualServiceSharedIP, protocol, resourcesAllocated, applicationProfile)
233236
// TODO: Should we record this error as well?
234237
if rdeErr := lb.addLBResourcesToRDE(ctx, resourcesAllocated, vip); rdeErr != nil {
235238
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 {
504507
return sslCertAlias
505508
}
506509

510+
func getApplicationProfile(service *v1.Service) string {
511+
applicationProfile, ok := service.Annotations[applicationProfileAnnotation]
512+
if !ok {
513+
return ""
514+
}
515+
516+
return applicationProfile
517+
}
518+
507519
func shouldSkipAviSSLTermination(service *v1.Service) bool {
508520
shouldSkipAviSSLTerminationStr, ok := service.Annotations[skipAviSSLTerminationAnnotation]
509521
if !ok {
@@ -559,6 +571,8 @@ func (lb *LBManager) createLoadBalancer(ctx context.Context, service *v1.Service
559571
userSpecifiedLBIP := getUserSpecifiedLoadBalancerIP(service)
560572
klog.Infof("createLoadBalancer called with loadBalancerIP [%s] for service [%s]", userSpecifiedLBIP, service.Name)
561573

574+
applicationProfile := getApplicationProfile(service)
575+
562576
if lbExists {
563577
// Update load balancer if there are changes in service properties
564578
typeToInternalPortMap, typeToExternalPortMap, nameToProtocol := lb.getServicePortMap(service)
@@ -570,7 +584,7 @@ func (lb *LBManager) createLoadBalancer(ctx context.Context, service *v1.Service
570584
klog.Infof("Updating pool [%s] with port [%s:%d:%d]", lbPoolName, portName, internalPort, externalPort)
571585
resourcesAllocated := &util.AllocatedResourcesMap{}
572586
vip, err := gm.UpdateLoadBalancer(ctx, lbPoolName, virtualServiceName, nodeIPs, userSpecifiedLBIP, internalPort,
573-
externalPort, lb.OneArm, lb.EnableVirtualServiceSharedIP, protocol, resourcesAllocated)
587+
externalPort, lb.OneArm, lb.EnableVirtualServiceSharedIP, protocol, resourcesAllocated, applicationProfile)
574588
if rdeErr := lb.addLBResourcesToRDE(ctx, resourcesAllocated, vip); rdeErr != nil {
575589
return nil, fmt.Errorf("failed to update RDE [%s] with load balancer resources: [%v]", lb.clusterID, err)
576590
}
@@ -676,7 +690,7 @@ func (lb *LBManager) createLoadBalancer(ctx context.Context, service *v1.Service
676690
// Create using VCD API
677691
resourcesAllocated := &util.AllocatedResourcesMap{}
678692
lbIP, err := gm.CreateLoadBalancer(ctx, virtualServiceNamePrefix, lbPoolNamePrefix, nodeIPs, portDetailsList,
679-
lb.OneArm, lb.EnableVirtualServiceSharedIP, portNameToIPMap, userSpecifiedLBIP, resourcesAllocated)
693+
lb.OneArm, lb.EnableVirtualServiceSharedIP, portNameToIPMap, userSpecifiedLBIP, resourcesAllocated, applicationProfile)
680694
if rdeErr := lb.addLBResourcesToRDE(ctx, resourcesAllocated, lbIP); rdeErr != nil {
681695
return nil, fmt.Errorf("unable to add load balancer pool resources to RDE [%s]: [%v]", lb.clusterID, err)
682696
}

Diff for: pkg/vcdsdk/gateway.go

+22-10
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,18 @@ package vcdsdk
1010
import (
1111
"context"
1212
"fmt"
13+
"net/http"
14+
"net/url"
15+
"strconv"
16+
"strings"
17+
1318
"github.com/antihax/optional"
1419
"github.com/peterhellberg/link"
1520
"github.com/vmware/cloud-provider-for-cloud-director/pkg/util"
1621
swaggerClient "github.com/vmware/cloud-provider-for-cloud-director/pkg/vcdswaggerclient_36_0"
1722
"github.com/vmware/go-vcloud-director/v2/govcd"
1823
"github.com/vmware/go-vcloud-director/v2/types/v56"
1924
"k8s.io/klog"
20-
"net/http"
21-
"net/url"
22-
"strconv"
23-
"strings"
2425
)
2526

2627
type OneArm struct {
@@ -1104,7 +1105,7 @@ func (gatewayManager *GatewayManager) checkIfGatewayIsReady(ctx context.Context)
11041105
}
11051106

11061107
func (gatewayManager *GatewayManager) UpdateVirtualService(ctx context.Context, virtualServiceName string,
1107-
virtualServiceIP string, externalPort int32, oneArmEnabled bool) (*swaggerClient.EntityReference, error) {
1108+
virtualServiceIP string, externalPort int32, oneArmEnabled bool, applicationProfile string) (*swaggerClient.EntityReference, error) {
11081109
client := gatewayManager.Client
11091110
vsSummary, err := gatewayManager.GetVirtualService(ctx, virtualServiceName)
11101111
if err != nil {
@@ -1147,6 +1148,12 @@ func (gatewayManager *GatewayManager) UpdateVirtualService(ctx context.Context,
11471148
// update the virtual IP address of the virtual service when one arm is nil
11481149
vs.VirtualIpAddress = virtualServiceIP
11491150
}
1151+
1152+
if applicationProfile != "" && vs.ApplicationProfile.Name != applicationProfile {
1153+
vs.ApplicationProfile.Name = applicationProfile
1154+
vs.ApplicationProfile.SystemDefined = false
1155+
}
1156+
11501157
resp, err := client.APIClient.EdgeGatewayLoadBalancerVirtualServiceApi.UpdateVirtualService(ctx, vs, vsSummary.Id, org.Org.ID)
11511158
if resp != nil && resp.StatusCode != http.StatusAccepted {
11521159
var responseMessageBytes []byte
@@ -1187,7 +1194,7 @@ func (gatewayManager *GatewayManager) UpdateVirtualService(ctx context.Context,
11871194
func (gatewayManager *GatewayManager) CreateVirtualService(ctx context.Context, virtualServiceName string,
11881195
lbPoolRef *swaggerClient.EntityReference, segRef *swaggerClient.EntityReference,
11891196
freeIP string, vsType string, externalPort int32,
1190-
useSSL bool, certificateAlias string) (*swaggerClient.EntityReference, error) {
1197+
useSSL bool, certificateAlias, applicationProfile string) (*swaggerClient.EntityReference, error) {
11911198

11921199
client := gatewayManager.Client
11931200
if gatewayManager.GatewayRef == nil {
@@ -1259,6 +1266,11 @@ func (gatewayManager *GatewayManager) CreateVirtualService(ctx context.Context,
12591266
return nil, fmt.Errorf("unhandled virtual service type [%s]", vsType)
12601267
}
12611268

1269+
if applicationProfile != "" {
1270+
virtualServiceConfig.ApplicationProfile.Name = applicationProfile
1271+
virtualServiceConfig.ApplicationProfile.SystemDefined = false
1272+
}
1273+
12621274
clusterOrg, err := client.VCDClient.GetOrgByName(client.ClusterOrgName)
12631275
if err != nil {
12641276
return nil, fmt.Errorf("unable to get org for org [%s]: [%v]", client.ClusterOrgName, err)
@@ -1502,7 +1514,7 @@ func (gatewayManager *GatewayManager) GetLoadBalancerPoolMemberIPs(ctx context.C
15021514

15031515
func (gm *GatewayManager) CreateLoadBalancer(ctx context.Context, virtualServiceNamePrefix string, lbPoolNamePrefix string,
15041516
ips []string, portDetailsList []PortDetails, oneArm *OneArm, enableVirtualServiceSharedIP bool,
1505-
portNameToIP map[string]string, providedIP string, resourcesAllocated *util.AllocatedResourcesMap) (string, error) {
1517+
portNameToIP map[string]string, providedIP string, resourcesAllocated *util.AllocatedResourcesMap, applicationProfile string) (string, error) {
15061518
if len(portDetailsList) == 0 {
15071519
// nothing to do here
15081520
klog.Infof("There is no port specified. Hence nothing to do.")
@@ -1707,7 +1719,7 @@ func (gm *GatewayManager) CreateLoadBalancer(ctx context.Context, virtualService
17071719

17081720
virtualServiceRef, err := gm.CreateVirtualService(ctx, virtualServiceName, lbPoolRef, segRef,
17091721
virtualServiceIP, portDetails.Protocol, portDetails.ExternalPort,
1710-
portDetails.UseSSL, portDetails.CertAlias)
1722+
portDetails.UseSSL, portDetails.CertAlias, applicationProfile)
17111723
if err != nil {
17121724
// return plain error if vcdsdk.VirtualServicePendingError is returned. Helps the caller recognize that the
17131725
// error is because VirtualService is still in Pending state.
@@ -1833,7 +1845,7 @@ func (gm *GatewayManager) DeleteLoadBalancer(ctx context.Context, virtualService
18331845

18341846
func (gm *GatewayManager) UpdateLoadBalancer(ctx context.Context, lbPoolName string, virtualServiceName string,
18351847
ips []string, externalIP string, internalPort int32, externalPort int32, oneArm *OneArm, enableVirtualServiceSharedIP bool, protocol string,
1836-
resourcesAllocated *util.AllocatedResourcesMap) (string, error) {
1848+
resourcesAllocated *util.AllocatedResourcesMap, applicationProfile string) (string, error) {
18371849

18381850
if gm == nil {
18391851
return "", fmt.Errorf("GatewayManager cannot be nil")
@@ -1852,7 +1864,7 @@ func (gm *GatewayManager) UpdateLoadBalancer(ctx context.Context, lbPoolName str
18521864
return "", fmt.Errorf("unable to update load balancer pool [%s]: [%v]", lbPoolName, err)
18531865
}
18541866
resourcesAllocated.Insert(VcdResourceLoadBalancerPool, lbPoolRef)
1855-
vsRef, err := gm.UpdateVirtualService(ctx, virtualServiceName, externalIP, externalPort, oneArm != nil)
1867+
vsRef, err := gm.UpdateVirtualService(ctx, virtualServiceName, externalIP, externalPort, oneArm != nil, applicationProfile)
18561868
if vsRef != nil {
18571869
resourcesAllocated.Insert(VcdResourceVirtualService, vsRef)
18581870
}

0 commit comments

Comments
 (0)