@@ -44,6 +44,8 @@ import (
44
44
"github.com/IBM/vpc-go-sdk/vpcv1"
45
45
46
46
corev1 "k8s.io/api/core/v1"
47
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
48
+ "k8s.io/apimachinery/pkg/labels"
47
49
"k8s.io/apimachinery/pkg/types"
48
50
"k8s.io/apimachinery/pkg/util/intstr"
49
51
"k8s.io/client-go/tools/cache"
@@ -56,6 +58,7 @@ import (
56
58
capiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1"
57
59
"sigs.k8s.io/cluster-api/util"
58
60
61
+ "sigs.k8s.io/cluster-api-provider-ibmcloud/api/v1beta2"
59
62
infrav1beta2 "sigs.k8s.io/cluster-api-provider-ibmcloud/api/v1beta2"
60
63
"sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/cloud/services/authenticator"
61
64
"sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/cloud/services/cos"
@@ -996,7 +999,35 @@ func (m *PowerVSMachineScope) CreateVPCLoadBalancerPoolMember(ctx context.Contex
996
999
997
1000
internalIP := m .GetMachineInternalIP ()
998
1001
1002
+ // TODO:SHILPA- handle multiple lbs as well
999
1003
// Update each LoadBalancer pool
1004
+ loadBalancerListeners := map [string ]v1beta2.AdditionalListenerSpec {}
1005
+ for _ , additionalListener := range lb .AdditionalListeners {
1006
+ // if additionalListener.Selector.MatchLabels == nil {
1007
+ // continue
1008
+ // }
1009
+ // TODO:SHILPA- protocol is added irrespective of whats provided in the additionalListener protocol, need to handle this
1010
+ if additionalListener .Protocol == nil {
1011
+ additionalListener .Protocol = & v1beta2 .VPCLoadBalancerListenerProtocolTCP
1012
+ }
1013
+ loadBalancerListeners [fmt .Sprintf ("%d-%s" , additionalListener .Port , * additionalListener .Protocol )] = additionalListener
1014
+ }
1015
+ for _ , listener := range loadBalancer .Listeners {
1016
+ listenerOptions := & vpcv1.GetLoadBalancerListenerOptions {}
1017
+ listenerOptions .SetLoadBalancerID (* loadBalancer .ID )
1018
+ listenerOptions .SetID (* listener .ID )
1019
+ loadBalancerListener , _ , err := m .IBMVPCClient .GetLoadBalancerListener (listenerOptions )
1020
+ if err != nil {
1021
+ return nil , fmt .Errorf ("failed to list %s load balancer listener: %v" , * listener .ID , err )
1022
+ }
1023
+ fmt .Println (* loadBalancerListener .Port , * loadBalancerListener .Protocol )
1024
+ if additionalListener , ok := loadBalancerListeners [fmt .Sprintf ("%d-%s" , * loadBalancerListener .Port , * loadBalancerListener .Protocol )]; ok {
1025
+ if loadBalancerListener .DefaultPool != nil {
1026
+ loadBalancerListeners [* loadBalancerListener .DefaultPool .Name ] = additionalListener
1027
+ }
1028
+ }
1029
+ }
1030
+ fmt .Println (loadBalancerListeners )
1000
1031
for _ , pool := range loadBalancer .Pools {
1001
1032
log .V (3 ).Info ("Updating LoadBalancer pool member" , "pool" , * pool .Name , "loadBalancerName" , * loadBalancer .Name , "IP" , internalIP )
1002
1033
listOptions := & vpcv1.ListLoadBalancerPoolMembersOptions {}
@@ -1007,7 +1038,27 @@ func (m *PowerVSMachineScope) CreateVPCLoadBalancerPoolMember(ctx context.Contex
1007
1038
return nil , fmt .Errorf ("failed to list %s VPC load balancer pool: %w" , * pool .Name , err )
1008
1039
}
1009
1040
var targetPort int64
1010
- var alreadyRegistered bool
1041
+ var alreadyRegistered , skipListener bool
1042
+
1043
+ if loadBalancerListener , ok := loadBalancerListeners [* pool .Name ]; ok {
1044
+ selector , err := metav1 .LabelSelectorAsSelector (& loadBalancerListener .Selector )
1045
+ if err != nil {
1046
+ m .V (5 ).Info ("Skipping listener addition, failed to get label selector from spec selector" )
1047
+ continue
1048
+ }
1049
+
1050
+ if selector .Empty () && ! util .IsControlPlaneMachine (m .Machine ) {
1051
+ continue
1052
+ }
1053
+ // Skip adding the listener if the selector does not match
1054
+ if ! selector .Empty () && ! selector .Matches (labels .Set (m .IBMPowerVSMachine .Labels )) {
1055
+ skipListener = true
1056
+ }
1057
+ }
1058
+ if skipListener {
1059
+ m .V (3 ).Info ("Skip adding listener, machine label doesn't match with the listener label selector" , "pool" , * pool .Name , "targetip" , internalIP , "machine" , m .IBMPowerVSMachine .Name , "clusterName" , m .IBMPowerVSCluster .Name )
1060
+ continue
1061
+ }
1011
1062
1012
1063
if len (listLoadBalancerPoolMembers .Members ) == 0 {
1013
1064
// For adding the first member to the pool we depend on the pool name to get the target port
@@ -1035,6 +1086,7 @@ func (m *PowerVSMachineScope) CreateVPCLoadBalancerPoolMember(ctx context.Contex
1035
1086
}
1036
1087
}
1037
1088
}
1089
+
1038
1090
if alreadyRegistered {
1039
1091
log .V (3 ).Info ("PoolMember already exist" , "poolName" , * pool .Name , "IP" , internalIP , "targetPort" , targetPort )
1040
1092
continue
0 commit comments