Skip to content

Commit 3cfaecb

Browse files
committed
Add listener based on the machine label and listener label
1 parent 55d0e32 commit 3cfaecb

12 files changed

+715
-8
lines changed

api/v1beta2/ibmvpccluster_types.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,8 @@ type AdditionalListenerSpec struct {
127127
// Will default to TCP protocol if not specified.
128128
// +optional
129129
Protocol *VPCLoadBalancerListenerProtocol `json:"protocol,omitempty"`
130+
131+
Selector metav1.LabelSelector `json:"selector"`
130132
}
131133

132134
// VPCLoadBalancerBackendPoolSpec defines the desired configuration of a VPC Load Balancer Backend Pool.

api/v1beta2/zz_generated.deepcopy.go

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cloud/scope/powervs_machine.go

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ import (
4444
"github.com/IBM/vpc-go-sdk/vpcv1"
4545

4646
corev1 "k8s.io/api/core/v1"
47+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
48+
"k8s.io/apimachinery/pkg/labels"
4749
"k8s.io/apimachinery/pkg/types"
4850
"k8s.io/apimachinery/pkg/util/intstr"
4951
"k8s.io/client-go/tools/cache"
@@ -56,6 +58,7 @@ import (
5658
"sigs.k8s.io/cluster-api/util"
5759
"sigs.k8s.io/cluster-api/util/patch"
5860

61+
"sigs.k8s.io/cluster-api-provider-ibmcloud/api/v1beta2"
5962
infrav1beta2 "sigs.k8s.io/cluster-api-provider-ibmcloud/api/v1beta2"
6063
"sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/cloud/services/authenticator"
6164
"sigs.k8s.io/cluster-api-provider-ibmcloud/pkg/cloud/services/cos"
@@ -1020,7 +1023,35 @@ func (m *PowerVSMachineScope) CreateVPCLoadBalancerPoolMember() (*vpcv1.LoadBala
10201023

10211024
internalIP := m.GetMachineInternalIP()
10221025

1026+
// TODO:SHILPA- handle multiple lbs as well
10231027
// 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)
10241055
for _, pool := range loadBalancer.Pools {
10251056
m.V(3).Info("Updating LoadBalancer pool member", "pool", *pool.Name, "loadbalancer", *loadBalancer.Name, "ip", internalIP)
10261057
listOptions := &vpcv1.ListLoadBalancerPoolMembersOptions{}
@@ -1031,7 +1062,27 @@ func (m *PowerVSMachineScope) CreateVPCLoadBalancerPoolMember() (*vpcv1.LoadBala
10311062
return nil, fmt.Errorf("failed to list %s VPC load balancer pool error: %v", *pool.Name, err)
10321063
}
10331064
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+
}
10351086

10361087
if len(listLoadBalancerPoolMembers.Members) == 0 {
10371088
// 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
10591110
}
10601111
}
10611112
}
1113+
10621114
if alreadyRegistered {
10631115
m.V(3).Info("PoolMember already exist", "pool", *pool.Name, "targetip", internalIP, "port", targetPort)
10641116
continue

0 commit comments

Comments
 (0)