Skip to content

Commit 1d6ad8c

Browse files
committed
Add listener based on the machine label and listener label
1 parent 982d67e commit 1d6ad8c

11 files changed

+713
-1
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
capiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1"
5759
"sigs.k8s.io/cluster-api/util"
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"
@@ -996,7 +999,35 @@ func (m *PowerVSMachineScope) CreateVPCLoadBalancerPoolMember(ctx context.Contex
996999

9971000
internalIP := m.GetMachineInternalIP()
9981001

1002+
// TODO:SHILPA- handle multiple lbs as well
9991003
// 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)
10001031
for _, pool := range loadBalancer.Pools {
10011032
log.V(3).Info("Updating LoadBalancer pool member", "pool", *pool.Name, "loadBalancerName", *loadBalancer.Name, "IP", internalIP)
10021033
listOptions := &vpcv1.ListLoadBalancerPoolMembersOptions{}
@@ -1007,7 +1038,27 @@ func (m *PowerVSMachineScope) CreateVPCLoadBalancerPoolMember(ctx context.Contex
10071038
return nil, fmt.Errorf("failed to list %s VPC load balancer pool: %w", *pool.Name, err)
10081039
}
10091040
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+
}
10111062

10121063
if len(listLoadBalancerPoolMembers.Members) == 0 {
10131064
// 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
10351086
}
10361087
}
10371088
}
1089+
10381090
if alreadyRegistered {
10391091
log.V(3).Info("PoolMember already exist", "poolName", *pool.Name, "IP", internalIP, "targetPort", targetPort)
10401092
continue

0 commit comments

Comments
 (0)