@@ -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
"sigs.k8s.io/cluster-api/util"
57
59
"sigs.k8s.io/cluster-api/util/patch"
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"
@@ -1020,7 +1023,35 @@ func (m *PowerVSMachineScope) CreateVPCLoadBalancerPoolMember() (*vpcv1.LoadBala
1020
1023
1021
1024
internalIP := m .GetMachineInternalIP ()
1022
1025
1026
+ // TODO:SHILPA- handle multiple lbs as well
1023
1027
// Update each LoadBalancer pool
1028
+ loadBalancerListeners := map [string ]v1beta2.AdditionalListenerSpec {}
1029
+ for _ , additionalListener := range lb .AdditionalListeners {
1030
+ // if additionalListener.Selector.MatchLabels == nil {
1031
+ // continue
1032
+ // }
1033
+ // TODO:SHILPA- protocol is added irrespective of whats provided in the additionalListener protocol, need to handle this
1034
+ if additionalListener .Protocol == nil {
1035
+ additionalListener .Protocol = & v1beta2 .VPCLoadBalancerListenerProtocolTCP
1036
+ }
1037
+ loadBalancerListeners [fmt .Sprintf ("%d-%s" , additionalListener .Port , * additionalListener .Protocol )] = additionalListener
1038
+ }
1039
+ for _ , listener := range loadBalancer .Listeners {
1040
+ listenerOptions := & vpcv1.GetLoadBalancerListenerOptions {}
1041
+ listenerOptions .SetLoadBalancerID (* loadBalancer .ID )
1042
+ listenerOptions .SetID (* listener .ID )
1043
+ loadBalancerListener , _ , err := m .IBMVPCClient .GetLoadBalancerListener (listenerOptions )
1044
+ if err != nil {
1045
+ return nil , fmt .Errorf ("failed to list %s load balancer listener: %v" , * listener .ID , err )
1046
+ }
1047
+ fmt .Println (* loadBalancerListener .Port , * loadBalancerListener .Protocol )
1048
+ if additionalListener , ok := loadBalancerListeners [fmt .Sprintf ("%d-%s" , * loadBalancerListener .Port , * loadBalancerListener .Protocol )]; ok {
1049
+ if loadBalancerListener .DefaultPool != nil {
1050
+ loadBalancerListeners [* loadBalancerListener .DefaultPool .Name ] = additionalListener
1051
+ }
1052
+ }
1053
+ }
1054
+ fmt .Println (loadBalancerListeners )
1024
1055
for _ , pool := range loadBalancer .Pools {
1025
1056
m .V (3 ).Info ("Updating LoadBalancer pool member" , "pool" , * pool .Name , "loadbalancer" , * loadBalancer .Name , "ip" , internalIP )
1026
1057
listOptions := & vpcv1.ListLoadBalancerPoolMembersOptions {}
@@ -1031,7 +1062,27 @@ func (m *PowerVSMachineScope) CreateVPCLoadBalancerPoolMember() (*vpcv1.LoadBala
1031
1062
return nil , fmt .Errorf ("failed to list %s VPC load balancer pool error: %v" , * pool .Name , err )
1032
1063
}
1033
1064
var targetPort int64
1034
- var alreadyRegistered bool
1065
+ var alreadyRegistered , skipListener bool
1066
+
1067
+ if loadBalancerListener , ok := loadBalancerListeners [* pool .Name ]; ok {
1068
+ selector , err := metav1 .LabelSelectorAsSelector (& loadBalancerListener .Selector )
1069
+ if err != nil {
1070
+ m .V (5 ).Info ("Skipping listener addition, failed to get label selector from spec selector" )
1071
+ continue
1072
+ }
1073
+
1074
+ if selector .Empty () && ! util .IsControlPlaneMachine (m .Machine ) {
1075
+ continue
1076
+ }
1077
+ // Skip adding the listener if the selector does not match
1078
+ if ! selector .Empty () && ! selector .Matches (labels .Set (m .IBMPowerVSMachine .Labels )) {
1079
+ skipListener = true
1080
+ }
1081
+ }
1082
+ if skipListener {
1083
+ 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 )
1084
+ continue
1085
+ }
1035
1086
1036
1087
if len (listLoadBalancerPoolMembers .Members ) == 0 {
1037
1088
// For adding the first member to the pool we depend on the pool name to get the target port
@@ -1059,6 +1110,7 @@ func (m *PowerVSMachineScope) CreateVPCLoadBalancerPoolMember() (*vpcv1.LoadBala
1059
1110
}
1060
1111
}
1061
1112
}
1113
+
1062
1114
if alreadyRegistered {
1063
1115
m .V (3 ).Info ("PoolMember already exist" , "pool" , * pool .Name , "targetip" , internalIP , "port" , targetPort )
1064
1116
continue
0 commit comments