Skip to content

Commit cc708bb

Browse files
committed
Add tests for exposing WatcherAPI service
1 parent 4fb050f commit cc708bb

File tree

6 files changed

+132
-46
lines changed

6 files changed

+132
-46
lines changed

tests/functional/suite_test.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import (
2828

2929
metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server"
3030

31+
routev1 "github.com/openshift/api/route/v1"
3132
memcachedv1 "github.com/openstack-k8s-operators/infra-operator/apis/memcached/v1beta1"
3233
rabbitmqv1 "github.com/openstack-k8s-operators/infra-operator/apis/rabbitmq/v1beta1"
3334
keystonev1 "github.com/openstack-k8s-operators/keystone-operator/api/v1beta1"
@@ -97,6 +98,8 @@ var _ = BeforeSuite(func() {
9798
keystoneCRDs, err := test.GetCRDDirFromModule(
9899
"github.com/openstack-k8s-operators/keystone-operator/api", "../../go.mod", "bases")
99100
Expect(err).ShouldNot(HaveOccurred())
101+
routev1CRDs, err := test.GetOpenShiftCRDDir("route/v1", "../../go.mod")
102+
Expect(err).ShouldNot(HaveOccurred())
100103

101104
By("bootstrapping test environment")
102105
testEnv = &envtest.Environment{
@@ -105,6 +108,7 @@ var _ = BeforeSuite(func() {
105108
mariaDBCRDs,
106109
rabbitmqCRDs,
107110
keystoneCRDs,
111+
routev1CRDs,
108112
},
109113

110114
ErrorIfCRDPathMissing: true,
@@ -136,6 +140,8 @@ var _ = BeforeSuite(func() {
136140
Expect(err).NotTo(HaveOccurred())
137141
err = memcachedv1.AddToScheme(scheme.Scheme)
138142
Expect(err).NotTo(HaveOccurred())
143+
err = routev1.AddToScheme(scheme.Scheme)
144+
Expect(err).NotTo(HaveOccurred())
139145

140146
logger = ctrl.Log.WithName("---Test---")
141147
//+kubebuilder:scaffold:scheme

tests/functional/watcher_test_data.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ type WatcherTestData struct {
4949
WatcherAPIDeployment types.NamespacedName
5050
WatcherPublicServiceName types.NamespacedName
5151
WatcherInternalServiceName types.NamespacedName
52+
WatcherRouteName types.NamespacedName
53+
WatcherInternalRouteName types.NamespacedName
5254
}
5355

5456
// GetWatcherTestData is a function that initialize the WatcherTestData
@@ -125,5 +127,13 @@ func GetWatcherTestData(watcherName types.NamespacedName) WatcherTestData {
125127
Namespace: watcherName.Namespace,
126128
Name: "watcher-internal",
127129
},
130+
WatcherRouteName: types.NamespacedName{
131+
Namespace: watcherName.Namespace,
132+
Name: "watcher-public",
133+
},
134+
WatcherInternalRouteName: types.NamespacedName{
135+
Namespace: watcherName.Namespace,
136+
Name: "watcher-internal",
137+
},
128138
}
129139
}

tests/functional/watcherapi_controller_test.go

Lines changed: 66 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import (
1010
memcachedv1 "github.com/openstack-k8s-operators/infra-operator/apis/memcached/v1beta1"
1111
condition "github.com/openstack-k8s-operators/lib-common/modules/common/condition"
1212
. "github.com/openstack-k8s-operators/lib-common/modules/common/test/helpers"
13-
mariadbv1 "github.com/openstack-k8s-operators/mariadb-operator/api/v1beta1"
1413
watcherv1beta1 "github.com/openstack-k8s-operators/watcher-operator/api/v1beta1"
1514
corev1 "k8s.io/api/core/v1"
1615
"k8s.io/utils/ptr"
@@ -114,14 +113,6 @@ var _ = Describe("WatcherAPI controller", func() {
114113
},
115114
)
116115
DeferCleanup(k8sClient.Delete, ctx, secret)
117-
mariadb.CreateMariaDBDatabase(watcherTest.WatcherDatabaseName.Namespace, watcherTest.WatcherDatabaseName.Name, mariadbv1.MariaDBDatabaseSpec{})
118-
DeferCleanup(k8sClient.Delete, ctx, mariadb.GetMariaDBDatabase(watcherTest.WatcherDatabaseName))
119-
120-
mariadb.SimulateMariaDBTLSDatabaseCompleted(watcherTest.WatcherDatabaseName)
121-
apiMariaDBAccount, apiMariaDBSecret := mariadb.CreateMariaDBAccountAndSecret(
122-
watcherTest.WatcherDatabaseAccount, mariadbv1.MariaDBAccountSpec{})
123-
DeferCleanup(k8sClient.Delete, ctx, apiMariaDBAccount)
124-
DeferCleanup(k8sClient.Delete, ctx, apiMariaDBSecret)
125116
DeferCleanup(th.DeleteInstance, CreateWatcherAPI(watcherTest.WatcherAPI, GetDefaultWatcherAPISpec()))
126117
DeferCleanup(keystone.DeleteKeystoneAPI, keystone.CreateKeystoneAPI(watcherTest.WatcherAPI.Namespace))
127118
memcachedSpec := memcachedv1.MemcachedSpec{
@@ -183,18 +174,18 @@ var _ = Describe("WatcherAPI controller", func() {
183174
Expect(container.LivenessProbe.HTTPGet.Port.IntVal).To(Equal(int32(9322)))
184175
Expect(container.ReadinessProbe.HTTPGet.Port.IntVal).To(Equal(int32(9322)))
185176
})
186-
It("creates the public and internal services for the watcher-api service", func() {
177+
It("exposes the watcher-api service", func() {
187178
th.ExpectCondition(
188179
watcherTest.WatcherAPI,
189180
ConditionGetterFunc(WatcherAPIConditionGetter),
190-
condition.CreateServiceReadyCondition,
181+
condition.ExposeServiceReadyCondition,
191182
corev1.ConditionTrue,
192183
)
193184
public := th.GetService(watcherTest.WatcherPublicServiceName)
194185
Expect(public.Labels["service"]).To(Equal("watcher-api"))
195186
internal := th.GetService(watcherTest.WatcherInternalServiceName)
196187
Expect(internal.Labels["service"]).To(Equal("watcher-api"))
197-
188+
th.AssertRouteExists(watcherTest.WatcherRouteName)
198189
})
199190
})
200191
When("the secret is created but missing fields", func() {
@@ -204,14 +195,6 @@ var _ = Describe("WatcherAPI controller", func() {
204195
map[string][]byte{},
205196
)
206197
DeferCleanup(k8sClient.Delete, ctx, secret)
207-
mariadb.CreateMariaDBDatabase(watcherTest.WatcherDatabaseName.Namespace, watcherTest.WatcherDatabaseName.Name, mariadbv1.MariaDBDatabaseSpec{})
208-
DeferCleanup(k8sClient.Delete, ctx, mariadb.GetMariaDBDatabase(watcherTest.WatcherDatabaseName))
209-
210-
mariadb.SimulateMariaDBTLSDatabaseCompleted(watcherTest.WatcherDatabaseName)
211-
apiMariaDBAccount, apiMariaDBSecret := mariadb.CreateMariaDBAccountAndSecret(
212-
watcherTest.WatcherDatabaseAccount, mariadbv1.MariaDBAccountSpec{})
213-
DeferCleanup(k8sClient.Delete, ctx, apiMariaDBAccount)
214-
DeferCleanup(k8sClient.Delete, ctx, apiMariaDBSecret)
215198
DeferCleanup(th.DeleteInstance, CreateWatcherAPI(watcherTest.WatcherAPI, GetDefaultWatcherAPISpec()))
216199
})
217200
It("should have input false", func() {
@@ -265,14 +248,7 @@ var _ = Describe("WatcherAPI controller", func() {
265248
},
266249
)
267250
DeferCleanup(k8sClient.Delete, ctx, secret)
268-
mariadb.CreateMariaDBDatabase(watcherTest.WatcherDatabaseName.Namespace, watcherTest.WatcherDatabaseName.Name, mariadbv1.MariaDBDatabaseSpec{})
269-
DeferCleanup(k8sClient.Delete, ctx, mariadb.GetMariaDBDatabase(watcherTest.WatcherDatabaseName))
270251

271-
mariadb.SimulateMariaDBTLSDatabaseCompleted(watcherTest.WatcherDatabaseName)
272-
apiMariaDBAccount, apiMariaDBSecret := mariadb.CreateMariaDBAccountAndSecret(
273-
watcherTest.WatcherDatabaseAccount, mariadbv1.MariaDBAccountSpec{})
274-
DeferCleanup(k8sClient.Delete, ctx, apiMariaDBAccount)
275-
DeferCleanup(k8sClient.Delete, ctx, apiMariaDBSecret)
276252
DeferCleanup(th.DeleteInstance, CreateWatcherAPI(watcherTest.WatcherAPI, GetDefaultWatcherAPISpec()))
277253
})
278254
It("should have input ready true", func() {
@@ -307,14 +283,6 @@ var _ = Describe("WatcherAPI controller", func() {
307283
},
308284
)
309285
DeferCleanup(k8sClient.Delete, ctx, secret)
310-
mariadb.CreateMariaDBDatabase(watcherTest.WatcherDatabaseName.Namespace, watcherTest.WatcherDatabaseName.Name, mariadbv1.MariaDBDatabaseSpec{})
311-
DeferCleanup(k8sClient.Delete, ctx, mariadb.GetMariaDBDatabase(watcherTest.WatcherDatabaseName))
312-
313-
mariadb.SimulateMariaDBTLSDatabaseCompleted(watcherTest.WatcherDatabaseName)
314-
apiMariaDBAccount, apiMariaDBSecret := mariadb.CreateMariaDBAccountAndSecret(
315-
watcherTest.WatcherDatabaseAccount, mariadbv1.MariaDBAccountSpec{})
316-
DeferCleanup(k8sClient.Delete, ctx, apiMariaDBAccount)
317-
DeferCleanup(k8sClient.Delete, ctx, apiMariaDBSecret)
318286
memcachedSpec := memcachedv1.MemcachedSpec{
319287
MemcachedSpecCore: memcachedv1.MemcachedSpecCore{
320288
Replicas: ptr.To(int32(1)),
@@ -356,4 +324,67 @@ var _ = Describe("WatcherAPI controller", func() {
356324
)
357325
})
358326
})
327+
When("WatcherAPI is created with extrenalEndpoints", func() {
328+
BeforeEach(func() {
329+
secret := th.CreateSecret(
330+
watcherTest.InternalTopLevelSecretName,
331+
map[string][]byte{
332+
"WatcherPassword": []byte("service-password"),
333+
"transport_url": []byte("url"),
334+
},
335+
)
336+
DeferCleanup(k8sClient.Delete, ctx, secret)
337+
spec := GetDefaultWatcherAPISpec()
338+
var externalEndpoints []interface{}
339+
externalEndpoints = append(
340+
externalEndpoints, map[string]interface{}{
341+
"endpoint": "internal",
342+
"ipAddressPool": "osp-internalapi",
343+
"loadBalancerIPs": []string{"internal-lb-ip-1", "internal-lb-ip-2"},
344+
},
345+
)
346+
spec["externalEndpoints"] = externalEndpoints
347+
DeferCleanup(th.DeleteInstance, CreateWatcherAPI(watcherTest.WatcherAPI, spec))
348+
DeferCleanup(keystone.DeleteKeystoneAPI, keystone.CreateKeystoneAPI(watcherTest.WatcherAPI.Namespace))
349+
memcachedSpec := memcachedv1.MemcachedSpec{
350+
MemcachedSpecCore: memcachedv1.MemcachedSpecCore{
351+
Replicas: ptr.To(int32(1)),
352+
},
353+
}
354+
DeferCleanup(infra.DeleteMemcached, infra.CreateMemcached(watcherTest.WatcherAPI.Namespace, MemcachedInstance, memcachedSpec))
355+
infra.SimulateMemcachedReady(watcherTest.MemcachedNamespace)
356+
357+
})
358+
It("creates MetalLB service", func() {
359+
th.SimulateDeploymentReplicaReady(watcherTest.WatcherAPIDeployment)
360+
361+
// As the public endpoint is not mentioned in the ExternalEndpoints
362+
// a generic Service and a Route is created
363+
public := th.GetService(watcherTest.WatcherPublicServiceName)
364+
Expect(public.Annotations).NotTo(HaveKey("metallb.universe.tf/address-pool"))
365+
Expect(public.Annotations).NotTo(HaveKey("metallb.universe.tf/allow-shared-ip"))
366+
Expect(public.Annotations).NotTo(HaveKey("metallb.universe.tf/loadBalancerIPs"))
367+
th.AssertRouteExists(watcherTest.WatcherRouteName)
368+
369+
// As the internal endpoint is configure in ExternalEndpoints it
370+
// does not get a Route but a Service with MetalLB annotations
371+
// instead
372+
internal := th.GetService(watcherTest.WatcherInternalServiceName)
373+
Expect(internal.Annotations).To(HaveKeyWithValue("metallb.universe.tf/address-pool", "osp-internalapi"))
374+
Expect(internal.Annotations).To(HaveKeyWithValue("metallb.universe.tf/allow-shared-ip", "osp-internalapi"))
375+
Expect(internal.Annotations).To(HaveKeyWithValue("metallb.universe.tf/loadBalancerIPs", "internal-lb-ip-1,internal-lb-ip-2"))
376+
th.AssertRouteNotExists(watcherTest.WatcherInternalRouteName)
377+
378+
// simulate that the internal service got a LoadBalancerIP
379+
// assigned
380+
th.SimulateLoadBalancerServiceIP(watcherTest.WatcherInternalServiceName)
381+
382+
th.ExpectCondition(
383+
watcherTest.WatcherAPI,
384+
ConditionGetterFunc(WatcherAPIConditionGetter),
385+
condition.ReadyCondition,
386+
corev1.ConditionTrue,
387+
)
388+
})
389+
})
359390
})

tests/kuttl/test-suites/default/watcher/01-assert.yaml

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -204,14 +204,14 @@ status:
204204
reason: Ready
205205
status: "True"
206206
type: Ready
207-
- message: Create service completed
208-
reason: Ready
209-
status: "True"
210-
type: CreateServiceReady
211207
- message: Deployment completed
212208
reason: Ready
213209
status: "True"
214210
type: DeploymentReady
211+
- message: Exposing service completed
212+
reason: Ready
213+
status: "True"
214+
type: ExposeServiceReady
215215
- message: Input data complete
216216
reason: Ready
217217
status: "True"
@@ -258,7 +258,24 @@ apiVersion: v1
258258
kind: Service
259259
metadata:
260260
labels:
261-
endpoint: internal
261+
public: "true"
262+
service: watcher-api
263+
name: watcher-public
264+
spec:
265+
ports:
266+
- name: watcher-public
267+
port: 9322
268+
protocol: TCP
269+
targetPort: 9322
270+
selector:
271+
service: watcher-api
272+
type: ClusterIP
273+
---
274+
apiVersion: v1
275+
kind: Service
276+
metadata:
277+
labels:
278+
internal: "true"
262279
service: watcher-api
263280
name: watcher-internal
264281
spec:
@@ -271,6 +288,20 @@ spec:
271288
service: watcher-api
272289
type: ClusterIP
273290
---
291+
apiVersion: route.openshift.io/v1
292+
kind: Route
293+
metadata:
294+
labels:
295+
public: "true"
296+
service: watcher-api
297+
name: watcher-public
298+
spec:
299+
port:
300+
targetPort: watcher-public
301+
to:
302+
kind: Service
303+
name: watcher-public
304+
---
274305
apiVersion: kuttl.dev/v1beta1
275306
kind: TestAssert
276307
namespaced: true

tests/kuttl/test-suites/default/watcher/04-assert.yaml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -185,14 +185,14 @@ status:
185185
reason: Ready
186186
status: "True"
187187
type: Ready
188-
- message: Create service completed
189-
reason: Ready
190-
status: "True"
191-
type: CreateServiceReady
192188
- message: Deployment completed
193189
reason: Ready
194190
status: "True"
195191
type: DeploymentReady
192+
- message: Exposing service completed
193+
reason: Ready
194+
status: "True"
195+
type: ExposeServiceReady
196196
- message: Input data complete
197197
reason: Ready
198198
status: "True"

tests/kuttl/test-suites/default/watcher/05-errors.yaml

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,14 +72,22 @@ apiVersion: v1
7272
kind: Service
7373
metadata:
7474
labels:
75-
endpoint: internal
75+
internal: "true"
7676
service: watcher-api
7777
name: watcher-internal
7878
---
7979
apiVersion: v1
8080
kind: Service
8181
metadata:
8282
labels:
83-
endpoint: public
83+
public: "true"
84+
service: watcher-api
85+
name: watcher-public
86+
---
87+
apiVersion: route.openshift.io/v1
88+
kind: Route
89+
metadata:
90+
labels:
91+
public: "true"
8492
service: watcher-api
8593
name: watcher-public

0 commit comments

Comments
 (0)