Skip to content

Commit 5f06b18

Browse files
committed
Make changes as mentioned in the proposal for configuring additional listeners
1 parent 3f66194 commit 5f06b18

7 files changed

+95
-96
lines changed

api/v1beta2/ibmvpccluster_types.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,10 @@ type AdditionalListenerSpec struct {
128128
// +optional
129129
Protocol *VPCLoadBalancerListenerProtocol `json:"protocol,omitempty"`
130130

131-
Selector metav1.LabelSelector `json:"selector"`
131+
// Selector is used to select the machines with same label to assign the listener
132+
// +kubebuilder:validation:Optional
133+
// +kubebuilder:validation:XValidation:rule="self == oldSelf",message="Selector is immutable"
134+
Selector metav1.LabelSelector `json:"selector,omitempty"`
132135
}
133136

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

cloud/scope/powervs_machine.go

Lines changed: 6 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1027,9 +1027,6 @@ func (m *PowerVSMachineScope) CreateVPCLoadBalancerPoolMember() (*vpcv1.LoadBala
10271027
// Update each LoadBalancer pool
10281028
loadBalancerListeners := map[string]v1beta2.AdditionalListenerSpec{}
10291029
for _, additionalListener := range lb.AdditionalListeners {
1030-
// if additionalListener.Selector.MatchLabels == nil {
1031-
// continue
1032-
// }
10331030
// TODO:SHILPA- protocol is added irrespective of whats provided in the additionalListener protocol, need to handle this
10341031
if additionalListener.Protocol == nil {
10351032
additionalListener.Protocol = &v1beta2.VPCLoadBalancerListenerProtocolTCP
@@ -1044,14 +1041,12 @@ func (m *PowerVSMachineScope) CreateVPCLoadBalancerPoolMember() (*vpcv1.LoadBala
10441041
if err != nil {
10451042
return nil, fmt.Errorf("failed to list %s load balancer listener: %v", *listener.ID, err)
10461043
}
1047-
fmt.Println(*loadBalancerListener.Port, *loadBalancerListener.Protocol)
10481044
if additionalListener, ok := loadBalancerListeners[fmt.Sprintf("%d-%s", *loadBalancerListener.Port, *loadBalancerListener.Protocol)]; ok {
10491045
if loadBalancerListener.DefaultPool != nil {
10501046
loadBalancerListeners[*loadBalancerListener.DefaultPool.Name] = additionalListener
10511047
}
10521048
}
10531049
}
1054-
fmt.Println(loadBalancerListeners)
10551050
for _, pool := range loadBalancer.Pools {
10561051
m.V(3).Info("Updating LoadBalancer pool member", "pool", *pool.Name, "loadbalancer", *loadBalancer.Name, "ip", internalIP)
10571052
listOptions := &vpcv1.ListLoadBalancerPoolMembersOptions{}
@@ -1065,6 +1060,7 @@ func (m *PowerVSMachineScope) CreateVPCLoadBalancerPoolMember() (*vpcv1.LoadBala
10651060
var alreadyRegistered, skipListener bool
10661061

10671062
if loadBalancerListener, ok := loadBalancerListeners[*pool.Name]; ok {
1063+
targetPort = loadBalancerListener.Port
10681064
selector, err := metav1.LabelSelectorAsSelector(&loadBalancerListener.Selector)
10691065
if err != nil {
10701066
m.V(5).Info("Skipping listener addition, failed to get label selector from spec selector")
@@ -1084,29 +1080,11 @@ func (m *PowerVSMachineScope) CreateVPCLoadBalancerPoolMember() (*vpcv1.LoadBala
10841080
continue
10851081
}
10861082

1087-
if len(listLoadBalancerPoolMembers.Members) == 0 {
1088-
// For adding the first member to the pool we depend on the pool name to get the target port
1089-
// pool name will have port number appended at the end
1090-
lbNameSplit := strings.Split(*pool.Name, "-")
1091-
if len(lbNameSplit) == 0 {
1092-
// user might have created additional pool
1093-
m.V(3).Info("Not updating pool as it might be created externally", "pool", *pool.Name)
1094-
continue
1095-
}
1096-
targetPort, err = strconv.ParseInt(lbNameSplit[len(lbNameSplit)-1], 10, 64)
1097-
if err != nil {
1098-
// user might have created additional pool
1099-
m.Error(err, "Unable to fetch target port from pool name", "pool", *pool.Name)
1100-
continue
1101-
}
1102-
} else {
1103-
for _, member := range listLoadBalancerPoolMembers.Members {
1104-
if target, ok := member.Target.(*vpcv1.LoadBalancerPoolMemberTarget); ok {
1105-
targetPort = *member.Port
1106-
if *target.Address == internalIP {
1107-
alreadyRegistered = true
1108-
m.V(3).Info("Target IP already configured for pool", "IP", internalIP, "pool", *pool.Name)
1109-
}
1083+
for _, member := range listLoadBalancerPoolMembers.Members {
1084+
if target, ok := member.Target.(*vpcv1.LoadBalancerPoolMemberTarget); ok {
1085+
if *target.Address == internalIP {
1086+
alreadyRegistered = true
1087+
m.V(3).Info("Target IP already configured for pool", "IP", internalIP, "pool", *pool.Name)
11101088
}
11111089
}
11121090
}

cloud/scope/powervs_machine_test.go

Lines changed: 55 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1545,22 +1545,22 @@ func TestCreateVPCLoadBalancerPoolMemberPowerVSMachine(t *testing.T) {
15451545
ProvisioningStatus: (*string)(&infrav1beta2.VPCLoadBalancerStateActive),
15461546
Pools: []vpcv1.LoadBalancerPoolReference{
15471547
{
1548-
ID: ptr.To("pool-id-0"),
1549-
Name: ptr.To("pool-22"),
1548+
ID: ptr.To("pool-id-23"),
1549+
Name: ptr.To("pool-23"),
15501550
},
15511551
},
15521552
Listeners: []vpcv1.LoadBalancerListenerReference{
15531553
{
1554-
ID: ptr.To("pool-id-0"),
1554+
ID: ptr.To("pool-id-23"),
15551555
},
15561556
},
15571557
}
15581558
loadBalancerListener := &vpcv1.LoadBalancerListener{
15591559
DefaultPool: &vpcv1.LoadBalancerPoolReference{
1560-
Name: ptr.To("pool-22"),
1560+
Name: ptr.To("pool-23"),
15611561
},
1562-
ID: ptr.To("pool-id-0"),
1563-
Port: ptr.To(int64(22)),
1562+
ID: ptr.To("pool-id-23"),
1563+
Port: ptr.To(int64(23)),
15641564
Protocol: ptr.To("tcp"),
15651565
}
15661566
mockClient := vpcmock.NewMockVpc(mockCtrl)
@@ -1573,7 +1573,7 @@ func TestCreateVPCLoadBalancerPoolMemberPowerVSMachine(t *testing.T) {
15731573
IBMPowerVSMachine: &infrav1beta2.IBMPowerVSMachine{
15741574
ObjectMeta: metav1.ObjectMeta{
15751575
Labels: map[string]string{
1576-
"name": "bootstrap",
1576+
"listener-selector": "port-22",
15771577
},
15781578
},
15791579
},
@@ -1585,10 +1585,10 @@ func TestCreateVPCLoadBalancerPoolMemberPowerVSMachine(t *testing.T) {
15851585
ID: ptr.To(loadBalancerID),
15861586
AdditionalListeners: []infrav1beta2.AdditionalListenerSpec{
15871587
{
1588-
Port: 22,
1588+
Port: 23,
15891589
Selector: metav1.LabelSelector{
15901590
MatchLabels: map[string]string{
1591-
"name": "master",
1591+
"listener-selector": "port-23",
15921592
},
15931593
},
15941594
},
@@ -1626,24 +1626,24 @@ func TestCreateVPCLoadBalancerPoolMemberPowerVSMachine(t *testing.T) {
16261626
ProvisioningStatus: (*string)(&infrav1beta2.VPCLoadBalancerStateActive),
16271627
Pools: []vpcv1.LoadBalancerPoolReference{
16281628
{
1629-
ID: ptr.To("pool-id-0"),
1629+
ID: ptr.To("pool-id-22"),
16301630
Name: ptr.To("pool-22"),
16311631
},
16321632
},
16331633
Listeners: []vpcv1.LoadBalancerListenerReference{
16341634
{
1635-
ID: ptr.To("pool-id-0"),
1635+
ID: ptr.To("pool-id-22"),
16361636
},
16371637
{
1638-
ID: ptr.To("pool-id-1"),
1638+
ID: ptr.To("pool-id-23"),
16391639
},
16401640
},
16411641
}
16421642
loadBalancerListener := &vpcv1.LoadBalancerListener{
16431643
DefaultPool: &vpcv1.LoadBalancerPoolReference{
16441644
Name: ptr.To("pool-22"),
16451645
},
1646-
ID: ptr.To("pool-id-0"),
1646+
ID: ptr.To("pool-id-22"),
16471647
Port: ptr.To(int64(22)),
16481648
Protocol: ptr.To("tcp"),
16491649
}
@@ -1657,7 +1657,7 @@ func TestCreateVPCLoadBalancerPoolMemberPowerVSMachine(t *testing.T) {
16571657
IBMPowerVSMachine: &infrav1beta2.IBMPowerVSMachine{
16581658
ObjectMeta: metav1.ObjectMeta{
16591659
Labels: map[string]string{
1660-
"name": "bootstrap",
1660+
"listener-selector": "port-22",
16611661
},
16621662
},
16631663
},
@@ -1672,7 +1672,7 @@ func TestCreateVPCLoadBalancerPoolMemberPowerVSMachine(t *testing.T) {
16721672
Port: 22,
16731673
Selector: metav1.LabelSelector{
16741674
MatchLabels: map[string]string{
1675-
"name": "bootstrap",
1675+
"listener-selector": "port-22",
16761676
},
16771677
},
16781678
},
@@ -1713,13 +1713,13 @@ func TestCreateVPCLoadBalancerPoolMemberPowerVSMachine(t *testing.T) {
17131713
ProvisioningStatus: (*string)(&infrav1beta2.VPCLoadBalancerStateActive),
17141714
Pools: []vpcv1.LoadBalancerPoolReference{
17151715
{
1716-
ID: ptr.To("pool-id-0"),
1716+
ID: ptr.To("pool-id-6443"),
17171717
Name: ptr.To("pool-6443"),
17181718
},
17191719
},
17201720
Listeners: []vpcv1.LoadBalancerListenerReference{
17211721
{
1722-
ID: ptr.To("pool-id-0"),
1722+
ID: ptr.To("pool-id-6443"),
17231723
},
17241724
{
17251725
ID: ptr.To("pool-id-1"),
@@ -1730,7 +1730,7 @@ func TestCreateVPCLoadBalancerPoolMemberPowerVSMachine(t *testing.T) {
17301730
DefaultPool: &vpcv1.LoadBalancerPoolReference{
17311731
Name: ptr.To("pool-6443"),
17321732
},
1733-
ID: ptr.To("pool-id-0"),
1733+
ID: ptr.To("pool-id-6443"),
17341734
Port: ptr.To(int64(6443)),
17351735
Protocol: ptr.To("tcp"),
17361736
}
@@ -1744,7 +1744,7 @@ func TestCreateVPCLoadBalancerPoolMemberPowerVSMachine(t *testing.T) {
17441744
IBMPowerVSMachine: &infrav1beta2.IBMPowerVSMachine{
17451745
ObjectMeta: metav1.ObjectMeta{
17461746
Labels: map[string]string{
1747-
"name": "bootstrap",
1747+
"listener-selector": "port-6443",
17481748
},
17491749
},
17501750
},
@@ -1791,27 +1791,39 @@ func TestCreateVPCLoadBalancerPoolMemberPowerVSMachine(t *testing.T) {
17911791
ProvisioningStatus: (*string)(&infrav1beta2.VPCLoadBalancerStateActive),
17921792
Pools: []vpcv1.LoadBalancerPoolReference{
17931793
{
1794-
ID: ptr.To("pool-id-0"),
1794+
ID: ptr.To("pool-id-6443"),
17951795
Name: ptr.To("pool-6443"),
17961796
},
1797+
{
1798+
ID: ptr.To("pool-id-24"),
1799+
Name: ptr.To("pool-24"),
1800+
},
17971801
},
17981802
Listeners: []vpcv1.LoadBalancerListenerReference{
17991803
{
1800-
ID: ptr.To("pool-id-0"),
1804+
ID: ptr.To("pool-id-6443"),
18011805
},
18021806
{
1803-
ID: ptr.To("pool-id-1"),
1807+
ID: ptr.To("pool-id-24"),
18041808
},
18051809
},
18061810
}
1807-
loadBalancerListener := &vpcv1.LoadBalancerListener{
1811+
loadBalancerListener_6443 := &vpcv1.LoadBalancerListener{
18081812
DefaultPool: &vpcv1.LoadBalancerPoolReference{
18091813
Name: ptr.To("pool-6443"),
18101814
},
1811-
ID: ptr.To("pool-id-0"),
1815+
ID: ptr.To("pool-id-6443"),
18121816
Port: ptr.To(int64(6443)),
18131817
Protocol: ptr.To("tcp"),
18141818
}
1819+
loadBalancerListener_24 := &vpcv1.LoadBalancerListener{
1820+
DefaultPool: &vpcv1.LoadBalancerPoolReference{
1821+
Name: ptr.To("pool-24"),
1822+
},
1823+
ID: ptr.To("pool-id-24"),
1824+
Port: ptr.To(int64(24)),
1825+
Protocol: ptr.To("tcp"),
1826+
}
18151827
mockClient := vpcmock.NewMockVpc(mockCtrl)
18161828

18171829
scope := PowerVSMachineScope{
@@ -1822,14 +1834,8 @@ func TestCreateVPCLoadBalancerPoolMemberPowerVSMachine(t *testing.T) {
18221834
},
18231835
},
18241836
},
1825-
IBMVPCClient: mockClient,
1826-
IBMPowerVSMachine: &infrav1beta2.IBMPowerVSMachine{
1827-
ObjectMeta: metav1.ObjectMeta{
1828-
Labels: map[string]string{
1829-
"name": "bootstrap",
1830-
},
1831-
},
1832-
},
1837+
IBMVPCClient: mockClient,
1838+
IBMPowerVSMachine: &infrav1beta2.IBMPowerVSMachine{},
18331839
IBMPowerVSCluster: &infrav1beta2.IBMPowerVSCluster{
18341840
Spec: infrav1beta2.IBMPowerVSClusterSpec{
18351841
LoadBalancers: []infrav1beta2.VPCLoadBalancerSpec{
@@ -1840,6 +1846,9 @@ func TestCreateVPCLoadBalancerPoolMemberPowerVSMachine(t *testing.T) {
18401846
{
18411847
Port: 6443,
18421848
},
1849+
{
1850+
Port: 24,
1851+
},
18431852
},
18441853
},
18451854
},
@@ -1855,15 +1864,24 @@ func TestCreateVPCLoadBalancerPoolMemberPowerVSMachine(t *testing.T) {
18551864
}
18561865

18571866
mockClient.EXPECT().GetLoadBalancer(gomock.AssignableToTypeOf(&vpcv1.GetLoadBalancerOptions{})).Return(loadBalancers, nil, nil).AnyTimes()
1858-
mockClient.EXPECT().GetLoadBalancerListener(gomock.AssignableToTypeOf(&vpcv1.GetLoadBalancerListenerOptions{})).Return(loadBalancerListener, nil, nil).AnyTimes()
1867+
mockClient.EXPECT().GetLoadBalancerListener(gomock.AssignableToTypeOf(&vpcv1.GetLoadBalancerListenerOptions{LoadBalancerID: ptr.To(loadBalancerID), ID: ptr.To("pool-id-6443")})).Return(loadBalancerListener_6443, nil, nil).AnyTimes()
1868+
mockClient.EXPECT().GetLoadBalancerListener(gomock.AssignableToTypeOf(&vpcv1.GetLoadBalancerListenerOptions{LoadBalancerID: ptr.To(loadBalancerID), ID: ptr.To("pool-id-24")})).Return(loadBalancerListener_24, nil, nil).AnyTimes()
18591869
mockClient.EXPECT().ListLoadBalancerPoolMembers(gomock.AssignableToTypeOf(&vpcv1.ListLoadBalancerPoolMembersOptions{})).Return(&vpcv1.LoadBalancerPoolMemberCollection{}, nil, nil).AnyTimes()
1860-
expectedLoadBalancerPoolMemberID := "pool-member-2"
1861-
expectedLoadBalancerPoolMember := &vpcv1.LoadBalancerPoolMember{ID: ptr.To(expectedLoadBalancerPoolMemberID)}
1862-
mockClient.EXPECT().CreateLoadBalancerPoolMember(gomock.AssignableToTypeOf(&vpcv1.CreateLoadBalancerPoolMemberOptions{})).Return(expectedLoadBalancerPoolMember, nil, nil).Times(1)
1870+
expectedLoadBalancerPoolMemberID_6443 := "pool-member-6443"
1871+
expectedLoadBalancerPoolMember_6443 := &vpcv1.LoadBalancerPoolMember{ID: ptr.To(expectedLoadBalancerPoolMemberID_6443)}
1872+
mockClient.EXPECT().CreateLoadBalancerPoolMember(gomock.AssignableToTypeOf(&vpcv1.CreateLoadBalancerPoolMemberOptions{})).Return(expectedLoadBalancerPoolMember_6443, nil, nil).Times(1)
18631873
result, err := scope.CreateVPCLoadBalancerPoolMember()
18641874

18651875
g.Expect(err).To(BeNil())
1866-
g.Expect(*result.ID).To(Equal(expectedLoadBalancerPoolMemberID))
1876+
g.Expect(*result.ID).To(Equal(expectedLoadBalancerPoolMemberID_6443))
1877+
1878+
expectedLoadBalancerPoolMemberID_24 := "pool-member-24"
1879+
expectedLoadBalancerPoolMember_24 := &vpcv1.LoadBalancerPoolMember{ID: ptr.To(expectedLoadBalancerPoolMemberID_24)}
1880+
mockClient.EXPECT().CreateLoadBalancerPoolMember(gomock.AssignableToTypeOf(&vpcv1.CreateLoadBalancerPoolMemberOptions{})).Return(expectedLoadBalancerPoolMember_24, nil, nil).Times(1)
1881+
result1, err1 := scope.CreateVPCLoadBalancerPoolMember()
1882+
1883+
g.Expect(err1).To(BeNil())
1884+
g.Expect(*result1.ID).To(Equal(expectedLoadBalancerPoolMemberID_24))
18671885
})
18681886
t.Run("Create VPC Load Balancer Pool Member", func(t *testing.T) {
18691887
t.Run("No load balancers present in status", func(t *testing.T) {

config/crd/bases/infrastructure.cluster.x-k8s.io_ibmpowervsclusters.yaml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -300,10 +300,8 @@ spec:
300300
- udp
301301
type: string
302302
selector:
303-
description: |-
304-
A label selector is a label query over a set of resources. The result of matchLabels and
305-
matchExpressions are ANDed. An empty label selector matches all objects. A null
306-
label selector matches no objects.
303+
description: Selector is used to select the machines with
304+
same label to assign the listener
307305
properties:
308306
matchExpressions:
309307
description: matchExpressions is a list of label selector
@@ -348,9 +346,11 @@ spec:
348346
type: object
349347
type: object
350348
x-kubernetes-map-type: atomic
349+
x-kubernetes-validations:
350+
- message: Selector is immutable
351+
rule: self == oldSelf
351352
required:
352353
- port
353-
- selector
354354
type: object
355355
type: array
356356
x-kubernetes-list-map-keys:

config/crd/bases/infrastructure.cluster.x-k8s.io_ibmpowervsclustertemplates.yaml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -331,10 +331,8 @@ spec:
331331
- udp
332332
type: string
333333
selector:
334-
description: |-
335-
A label selector is a label query over a set of resources. The result of matchLabels and
336-
matchExpressions are ANDed. An empty label selector matches all objects. A null
337-
label selector matches no objects.
334+
description: Selector is used to select the machines
335+
with same label to assign the listener
338336
properties:
339337
matchExpressions:
340338
description: matchExpressions is a list of
@@ -380,9 +378,11 @@ spec:
380378
type: object
381379
type: object
382380
x-kubernetes-map-type: atomic
381+
x-kubernetes-validations:
382+
- message: Selector is immutable
383+
rule: self == oldSelf
383384
required:
384385
- port
385-
- selector
386386
type: object
387387
type: array
388388
x-kubernetes-list-map-keys:

0 commit comments

Comments
 (0)