WARNING: THIS SITE IS A MIRROR OF GITHUB.COM / IT CANNOT LOGIN OR REGISTER ACCOUNTS / THE CONTENTS ARE PROVIDED AS-IS / THIS SITE ASSUMES NO RESPONSIBILITY FOR ANY DISPLAYED CONTENT OR LINKS / IF YOU FOUND SOMETHING MAY NOT GOOD FOR EVERYONE, CONTACT ADMIN AT ilovescratch@foxmail.com
Skip to content

Commit 5626c80

Browse files
committed
test for port manager
1 parent dedf53f commit 5626c80

File tree

2 files changed

+315
-4
lines changed

2 files changed

+315
-4
lines changed

pkg/controllerutil/host_port_manager.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -328,7 +328,7 @@ func (m *portManager) AllocatePort(key string) (int32, error) {
328328
}
329329

330330
if len(m.used) >= int(m.to-m.from)+1 {
331-
return 0, fmt.Errorf("no available port")
331+
return 0, fmt.Errorf("no available port: %s", key)
332332
}
333333

334334
for {
@@ -399,7 +399,7 @@ func (m *definedPortManager) AllocatePort(key string) (int32, error) {
399399
if m.isKBAgentPortNNotDefinedInKey(key) {
400400
return m.defaultPortManager.AllocatePort(key)
401401
}
402-
return 0, fmt.Errorf("no available port")
402+
return 0, fmt.Errorf("no available port: %s", key)
403403

404404
}
405405

@@ -427,10 +427,10 @@ func (m *definedPortManager) isKBAgentPortNNotDefined(containerName, portName st
427427

428428
func (m *definedPortManager) isKBAgentPortNNotDefinedInKey(key string) bool {
429429
subs := strings.Split(key, "-")
430-
if len(subs) != 4 {
430+
if len(subs) < 4 {
431431
return false
432432
}
433-
return m.isKBAgentPortNNotDefined(subs[2], subs[3])
433+
return m.isKBAgentPortNNotDefined(subs[len(subs)-2], subs[len(subs)-1])
434434
}
435435

436436
func newDefinedPortManager(defaultPortManager *portManager, hostPorts []appsv1.HostPort) *definedPortManager {
Lines changed: 311 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,311 @@
1+
/*
2+
Copyright (C) 2022-2025 ApeCloud Co., Ltd
3+
4+
This file is part of KubeBlocks project
5+
6+
This program is free software: you can redistribute it and/or modify
7+
it under the terms of the GNU Affero General Public License as published by
8+
the Free Software Foundation, either version 3 of the License, or
9+
(at your option) any later version.
10+
11+
This program is distributed in the hope that it will be useful
12+
but WITHOUT ANY WARRANTY; without even the implied warranty of
13+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+
GNU Affero General Public License for more details.
15+
16+
You should have received a copy of the GNU Affero General Public License
17+
along with this program. If not, see <http://www.gnu.org/licenses/>.
18+
*/
19+
20+
package controllerutil
21+
22+
import (
23+
"fmt"
24+
25+
. "github.com/onsi/ginkgo/v2"
26+
. "github.com/onsi/gomega"
27+
28+
corev1 "k8s.io/api/core/v1"
29+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
30+
"sigs.k8s.io/controller-runtime/pkg/client"
31+
32+
appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
33+
"github.com/apecloud/kubeblocks/pkg/constant"
34+
"github.com/apecloud/kubeblocks/pkg/kbagent"
35+
testutil "github.com/apecloud/kubeblocks/pkg/testutil/k8s"
36+
viper "github.com/apecloud/kubeblocks/pkg/viperx"
37+
)
38+
39+
var _ = Describe("host port manager test", func() {
40+
var (
41+
clusterName = "test-cluster"
42+
compName = "comp"
43+
containerName = "container"
44+
portName = "app"
45+
portNumber = int32(1234)
46+
manager PortManager
47+
)
48+
49+
Context("defined host-port manager", func() {
50+
var (
51+
network = &appsv1.ComponentNetwork{
52+
HostNetwork: true,
53+
HostPorts: []appsv1.HostPort{
54+
{
55+
Name: portName,
56+
Port: portNumber,
57+
},
58+
{
59+
Name: kbagent.DefaultHTTPPortName,
60+
Port: kbagent.DefaultHTTPPort,
61+
},
62+
{
63+
Name: kbagent.DefaultStreamingPortName,
64+
Port: kbagent.DefaultStreamingPort,
65+
},
66+
},
67+
}
68+
)
69+
70+
BeforeEach(func() {
71+
defaultPortManager = nil
72+
manager = GetPortManager(network)
73+
})
74+
75+
AfterEach(func() {
76+
})
77+
78+
It("port key", func() {
79+
key := manager.PortKey(clusterName, compName, containerName, portName)
80+
Expect(key).To(Equal(portName))
81+
})
82+
83+
It("port key - kbagent", func() {
84+
key := manager.PortKey(clusterName, compName, kbagent.ContainerName, kbagent.DefaultHTTPPortName)
85+
Expect(key).To(Equal(kbagent.DefaultHTTPPortName))
86+
})
87+
88+
It("allocate port", func() {
89+
key := manager.PortKey(clusterName, compName, containerName, portName)
90+
port, err := manager.AllocatePort(key)
91+
Expect(err).Should(BeNil())
92+
Expect(port).Should(Equal(portNumber))
93+
})
94+
95+
It("allocate port - kbagent", func() {
96+
key := manager.PortKey(clusterName, compName, kbagent.ContainerName, kbagent.DefaultHTTPPortName)
97+
port, err := manager.AllocatePort(key)
98+
Expect(err).Should(BeNil())
99+
Expect(port).Should(Equal(int32(kbagent.DefaultHTTPPort)))
100+
})
101+
102+
It("allocate port - not defined", func() {
103+
errPortName := fmt.Sprintf("%s-not-defined", portName)
104+
key := manager.PortKey(clusterName, compName, containerName, errPortName)
105+
_, err := manager.AllocatePort(key)
106+
Expect(err).ShouldNot(BeNil())
107+
Expect(err.Error()).Should(ContainSubstring("no available port"))
108+
})
109+
110+
It("get port", func() {
111+
key := manager.PortKey(clusterName, compName, containerName, portName)
112+
port, err := manager.GetPort(key)
113+
Expect(err).Should(BeNil())
114+
Expect(port).Should(Equal(portNumber))
115+
})
116+
117+
It("get port - kbagent", func() {
118+
key := manager.PortKey(clusterName, compName, kbagent.ContainerName, kbagent.DefaultHTTPPortName)
119+
port, err := manager.GetPort(key)
120+
Expect(err).Should(BeNil())
121+
Expect(port).Should(Equal(int32(kbagent.DefaultHTTPPort)))
122+
})
123+
124+
It("get port - not defined", func() {
125+
errPortName := fmt.Sprintf("%s-not-defined", portName)
126+
key := manager.PortKey(clusterName, compName, containerName, errPortName)
127+
port, err := manager.GetPort(key)
128+
Expect(err).Should(BeNil())
129+
Expect(port).Should(Equal(int32(0)))
130+
})
131+
132+
It("use port", func() {
133+
key := manager.PortKey(clusterName, compName, containerName, portName)
134+
err := manager.UsePort(key, portNumber)
135+
Expect(err).Should(BeNil())
136+
})
137+
138+
It("use port - kbagent", func() {
139+
key := manager.PortKey(clusterName, compName, kbagent.ContainerName, kbagent.DefaultHTTPPortName)
140+
err := manager.UsePort(key, kbagent.DefaultHTTPPort)
141+
Expect(err).Should(BeNil())
142+
})
143+
144+
It("use port - not defined", func() {
145+
errPortName := fmt.Sprintf("%s-not-defined", portName)
146+
key := manager.PortKey(clusterName, compName, containerName, errPortName)
147+
err := manager.UsePort(key, portNumber)
148+
Expect(err).Should(BeNil())
149+
})
150+
151+
It("release port", func() {
152+
key := manager.PortKey(clusterName, compName, containerName, portName)
153+
err := manager.ReleaseByPrefix(key)
154+
Expect(err).Should(BeNil())
155+
})
156+
})
157+
158+
Context("defined host-port manager - w/o kbagent", func() {
159+
var (
160+
mockClient *testutil.K8sClientMockHelper
161+
network = &appsv1.ComponentNetwork{
162+
HostNetwork: true,
163+
HostPorts: []appsv1.HostPort{
164+
{
165+
Name: portName,
166+
Port: portNumber,
167+
},
168+
},
169+
}
170+
minPort, maxPort = int32(1024), int32(65536)
171+
dataCM = map[string]string{}
172+
definedPortManagerInst *definedPortManager
173+
)
174+
175+
BeforeEach(func() {
176+
mockClient = testutil.NewK8sMockClient()
177+
mockClient.MockCreateMethod(testutil.WithCreateReturned(func(obj client.Object) error {
178+
dataCM = obj.(*corev1.ConfigMap).Data
179+
return nil
180+
}, testutil.WithAnyTimes()))
181+
mockClient.MockGetMethod(testutil.WithGetReturned(testutil.WithConstructSimpleGetResult([]client.Object{
182+
&corev1.ConfigMap{
183+
ObjectMeta: metav1.ObjectMeta{
184+
Namespace: viper.GetString(constant.CfgKeyCtrlrMgrNS),
185+
Name: viper.GetString(constant.CfgHostPortConfigMapName),
186+
},
187+
Data: dataCM,
188+
},
189+
}), testutil.WithAnyTimes()))
190+
mockClient.MockUpdateMethod(testutil.WithCreateReturned(func(obj client.Object) error {
191+
dataCM = obj.(*corev1.ConfigMap).Data
192+
return nil
193+
}, testutil.WithAnyTimes()))
194+
195+
viper.Set(constant.CfgHostPortIncludeRanges, fmt.Sprintf("%d-%d", minPort, maxPort))
196+
197+
err := InitDefaultHostPortManager(mockClient.Client())
198+
Expect(err).ShouldNot(HaveOccurred())
199+
200+
manager = GetPortManager(network)
201+
Expect(manager).ShouldNot(BeNil())
202+
definedPortManagerInst = manager.(*definedPortManager)
203+
})
204+
205+
AfterEach(func() {
206+
mockClient.Finish()
207+
})
208+
209+
It("port key", func() {
210+
key := manager.PortKey(clusterName, compName, containerName, portName)
211+
Expect(key).To(Equal(portName))
212+
})
213+
214+
It("port key - kbagent", func() {
215+
key := manager.PortKey(clusterName, compName, kbagent.ContainerName, kbagent.DefaultHTTPPortName)
216+
Expect(key).To(Equal(fmt.Sprintf("%s-%s-%s-%s", clusterName, compName, kbagent.ContainerName, kbagent.DefaultHTTPPortName)))
217+
})
218+
219+
It("allocate port", func() {
220+
key := manager.PortKey(clusterName, compName, containerName, portName)
221+
port, err := manager.AllocatePort(key)
222+
Expect(err).Should(BeNil())
223+
Expect(port).Should(Equal(portNumber))
224+
})
225+
226+
It("allocate port - kbagent", func() {
227+
key := manager.PortKey(clusterName, compName, kbagent.ContainerName, kbagent.DefaultHTTPPortName)
228+
port, err := manager.AllocatePort(key)
229+
Expect(err).Should(BeNil())
230+
Expect(port).Should(Equal(minPort))
231+
})
232+
233+
It("allocate port - not defined", func() {
234+
errPortName := fmt.Sprintf("%s-not-defined", portName)
235+
key := manager.PortKey(clusterName, compName, containerName, errPortName)
236+
_, err := manager.AllocatePort(key)
237+
Expect(err).ShouldNot(BeNil())
238+
Expect(err.Error()).Should(ContainSubstring("no available port"))
239+
})
240+
241+
It("get port", func() {
242+
key := manager.PortKey(clusterName, compName, containerName, portName)
243+
port, err := manager.GetPort(key)
244+
Expect(err).Should(BeNil())
245+
Expect(port).Should(Equal(portNumber))
246+
})
247+
248+
It("get port - kbagent, not allocated", func() {
249+
key := manager.PortKey(clusterName, compName, kbagent.ContainerName, kbagent.DefaultHTTPPortName)
250+
port, err := manager.GetPort(key)
251+
Expect(err).Should(BeNil())
252+
Expect(port).Should(Equal(int32(0)))
253+
})
254+
255+
It("get port - kbagent", func() {
256+
key := manager.PortKey(clusterName, compName, kbagent.ContainerName, kbagent.DefaultHTTPPortName)
257+
allocated, err1 := manager.AllocatePort(key)
258+
Expect(err1).Should(BeNil())
259+
port, err2 := manager.GetPort(key)
260+
Expect(err2).Should(BeNil())
261+
Expect(port).Should(Equal(allocated))
262+
})
263+
264+
It("get port - not defined", func() {
265+
errPortName := fmt.Sprintf("%s-not-defined", portName)
266+
key := manager.PortKey(clusterName, compName, containerName, errPortName)
267+
port, err := manager.GetPort(key)
268+
Expect(err).Should(BeNil())
269+
Expect(port).Should(Equal(int32(0)))
270+
})
271+
272+
It("use port", func() {
273+
key := manager.PortKey(clusterName, compName, containerName, portName)
274+
err := manager.UsePort(key, portNumber)
275+
Expect(err).Should(BeNil())
276+
Expect(definedPortManagerInst.hostPorts).Should(HaveKeyWithValue(key, portNumber))
277+
})
278+
279+
It("use port - kbagent", func() {
280+
key := manager.PortKey(clusterName, compName, kbagent.ContainerName, kbagent.DefaultHTTPPortName)
281+
err := manager.UsePort(key, int32(kbagent.DefaultHTTPPort))
282+
Expect(err).Should(BeNil())
283+
Expect(definedPortManagerInst.hostPorts).ShouldNot(HaveKey(key))
284+
Expect(dataCM).Should(HaveKeyWithValue(key, fmt.Sprintf("%d", kbagent.DefaultHTTPPort)))
285+
})
286+
287+
It("use port - not defined", func() {
288+
errPortName := fmt.Sprintf("%s-not-defined", portName)
289+
key := manager.PortKey(clusterName, compName, containerName, errPortName)
290+
err := manager.UsePort(key, portNumber)
291+
Expect(err).Should(BeNil())
292+
Expect(definedPortManagerInst.hostPorts).ShouldNot(HaveKey(key))
293+
})
294+
295+
It("release port", func() {
296+
key := manager.PortKey(clusterName, compName, containerName, portName)
297+
err := manager.ReleaseByPrefix(key)
298+
Expect(err).Should(BeNil())
299+
})
300+
301+
It("release port - kbagent", func() {
302+
key := manager.PortKey(clusterName, compName, kbagent.ContainerName, kbagent.DefaultHTTPPortName)
303+
err := manager.UsePort(key, int32(kbagent.DefaultHTTPPort))
304+
Expect(err).Should(BeNil())
305+
Expect(dataCM).Should(HaveKeyWithValue(key, fmt.Sprintf("%d", kbagent.DefaultHTTPPort)))
306+
err = manager.ReleaseByPrefix(key)
307+
Expect(err).Should(BeNil())
308+
Expect(dataCM).Should(BeEmpty())
309+
})
310+
})
311+
})

0 commit comments

Comments
 (0)