Skip to content

Commit d78ced8

Browse files
committed
added unit test for loglevel
Signed-off-by: Abdul Hameed <[email protected]>
1 parent 1f292da commit d78ced8

File tree

2 files changed

+197
-1
lines changed

2 files changed

+197
-1
lines changed

infra/feast-operator/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ ENVTEST ?= $(LOCALBIN)/setup-envtest-$(ENVTEST_VERSION)
215215
GOLANGCI_LINT = $(LOCALBIN)/golangci-lint-$(GOLANGCI_LINT_VERSION)
216216

217217
## Tool Versions
218-
KUSTOMIZE_VERSION ?= v5.5.0
218+
KUSTOMIZE_VERSION ?= v5.3.0
219219
CONTROLLER_TOOLS_VERSION ?= v0.14.0
220220
ENVTEST_VERSION ?= release-0.17
221221
GOLANGCI_LINT_VERSION ?= v1.57.2
Lines changed: 196 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,196 @@
1+
/*
2+
Copyright 2024 Feast Community.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package controller
18+
19+
import (
20+
"context"
21+
22+
. "github.com/onsi/ginkgo/v2"
23+
. "github.com/onsi/gomega"
24+
appsv1 "k8s.io/api/apps/v1"
25+
"k8s.io/apimachinery/pkg/api/errors"
26+
apimeta "k8s.io/apimachinery/pkg/api/meta"
27+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
28+
"k8s.io/apimachinery/pkg/types"
29+
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
30+
"sigs.k8s.io/controller-runtime/pkg/reconcile"
31+
32+
"github.com/feast-dev/feast/infra/feast-operator/api/feastversion"
33+
feastdevv1alpha1 "github.com/feast-dev/feast/infra/feast-operator/api/v1alpha1"
34+
"github.com/feast-dev/feast/infra/feast-operator/internal/controller/handler"
35+
"github.com/feast-dev/feast/infra/feast-operator/internal/controller/services"
36+
)
37+
38+
var _ = Describe("FeatureStore Controller - Feast service LogLevel", func() {
39+
Context("When reconciling a FeatureStore resource", func() {
40+
const resourceName = "test-loglevel"
41+
42+
ctx := context.Background()
43+
44+
typeNamespacedName := types.NamespacedName{
45+
Name: resourceName,
46+
Namespace: "default",
47+
}
48+
featurestore := &feastdevv1alpha1.FeatureStore{}
49+
50+
BeforeEach(func() {
51+
By("creating the custom resource for the Kind FeatureStore")
52+
err := k8sClient.Get(ctx, typeNamespacedName, featurestore)
53+
if err != nil && errors.IsNotFound(err) {
54+
resource := &feastdevv1alpha1.FeatureStore{
55+
ObjectMeta: metav1.ObjectMeta{
56+
Name: resourceName,
57+
Namespace: "default",
58+
},
59+
Spec: feastdevv1alpha1.FeatureStoreSpec{
60+
FeastProject: feastProject,
61+
Services: &feastdevv1alpha1.FeatureStoreServices{
62+
Registry: &feastdevv1alpha1.Registry{
63+
Local: &feastdevv1alpha1.LocalRegistryConfig{},
64+
},
65+
OnlineStore: &feastdevv1alpha1.OnlineStore{
66+
LogLevel: "debug",
67+
},
68+
OfflineStore: &feastdevv1alpha1.OfflineStore{
69+
LogLevel: "info",
70+
},
71+
},
72+
},
73+
}
74+
Expect(k8sClient.Create(ctx, resource)).To(Succeed())
75+
}
76+
})
77+
AfterEach(func() {
78+
resource := &feastdevv1alpha1.FeatureStore{}
79+
err := k8sClient.Get(ctx, typeNamespacedName, resource)
80+
Expect(err).NotTo(HaveOccurred())
81+
82+
By("Cleanup the specific resource instance FeatureStore")
83+
Expect(k8sClient.Delete(ctx, resource)).To(Succeed())
84+
})
85+
86+
It("should successfully reconcile the resource", func() {
87+
By("Reconciling the created resource")
88+
controllerReconciler := &FeatureStoreReconciler{
89+
Client: k8sClient,
90+
Scheme: k8sClient.Scheme(),
91+
}
92+
93+
_, err := controllerReconciler.Reconcile(ctx, reconcile.Request{
94+
NamespacedName: typeNamespacedName,
95+
})
96+
Expect(err).NotTo(HaveOccurred())
97+
98+
resource := &feastdevv1alpha1.FeatureStore{}
99+
err = k8sClient.Get(ctx, typeNamespacedName, resource)
100+
Expect(err).NotTo(HaveOccurred())
101+
feast := services.FeastServices{
102+
Handler: handler.FeastHandler{
103+
Client: controllerReconciler.Client,
104+
Context: ctx,
105+
Scheme: controllerReconciler.Scheme,
106+
FeatureStore: resource,
107+
},
108+
}
109+
110+
Expect(resource.Status).NotTo(BeNil())
111+
Expect(resource.Status.FeastVersion).To(Equal(feastversion.FeastVersion))
112+
Expect(resource.Status.Applied.FeastProject).To(Equal(resource.Spec.FeastProject))
113+
Expect(resource.Status.Applied.Services).NotTo(BeNil())
114+
Expect(resource.Status.Applied.Services.OfflineStore).NotTo(BeNil())
115+
Expect(resource.Status.Applied.Services.OnlineStore).NotTo(BeNil())
116+
Expect(resource.Status.Applied.Services.Registry).NotTo(BeNil())
117+
118+
Expect(resource.Status.Conditions).NotTo(BeEmpty())
119+
cond := apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.ReadyType)
120+
Expect(cond).ToNot(BeNil())
121+
Expect(cond.Status).To(Equal(metav1.ConditionTrue))
122+
Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason))
123+
Expect(cond.Type).To(Equal(feastdevv1alpha1.ReadyType))
124+
Expect(cond.Message).To(Equal(feastdevv1alpha1.ReadyMessage))
125+
126+
cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.RegistryReadyType)
127+
Expect(cond).ToNot(BeNil())
128+
Expect(cond.Status).To(Equal(metav1.ConditionTrue))
129+
Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason))
130+
Expect(cond.Type).To(Equal(feastdevv1alpha1.RegistryReadyType))
131+
Expect(cond.Message).To(Equal(feastdevv1alpha1.RegistryReadyMessage))
132+
133+
cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.ClientReadyType)
134+
Expect(cond).ToNot(BeNil())
135+
Expect(cond.Status).To(Equal(metav1.ConditionTrue))
136+
Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason))
137+
Expect(cond.Type).To(Equal(feastdevv1alpha1.ClientReadyType))
138+
Expect(cond.Message).To(Equal(feastdevv1alpha1.ClientReadyMessage))
139+
140+
cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.OfflineStoreReadyType)
141+
Expect(cond).ToNot(BeNil())
142+
Expect(cond.Status).To(Equal(metav1.ConditionTrue))
143+
Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason))
144+
Expect(cond.Type).To(Equal(feastdevv1alpha1.OfflineStoreReadyType))
145+
Expect(cond.Message).To(Equal(feastdevv1alpha1.OfflineStoreReadyMessage))
146+
147+
cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.OnlineStoreReadyType)
148+
Expect(cond).ToNot(BeNil())
149+
Expect(cond.Status).To(Equal(metav1.ConditionTrue))
150+
Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason))
151+
Expect(cond.Type).To(Equal(feastdevv1alpha1.OnlineStoreReadyType))
152+
Expect(cond.Message).To(Equal(feastdevv1alpha1.OnlineStoreReadyMessage))
153+
Expect(resource.Status.Phase).To(Equal(feastdevv1alpha1.ReadyPhase))
154+
155+
deploy := &appsv1.Deployment{}
156+
err = k8sClient.Get(ctx, types.NamespacedName{
157+
Name: feast.GetFeastServiceName(services.RegistryFeastType),
158+
Namespace: resource.Namespace,
159+
},
160+
deploy)
161+
Expect(err).NotTo(HaveOccurred())
162+
Expect(deploy.Spec.Replicas).To(Equal(&services.DefaultReplicas))
163+
Expect(controllerutil.HasControllerReference(deploy)).To(BeTrue())
164+
Expect(deploy.Spec.Template.Spec.Containers).To(HaveLen(1))
165+
command := deploy.Spec.Template.Spec.Containers[0].Command
166+
Expect(command).NotTo(ContainElement("--log-level"))
167+
168+
err = k8sClient.Get(ctx, types.NamespacedName{
169+
Name: feast.GetFeastServiceName(services.OfflineFeastType),
170+
Namespace: resource.Namespace,
171+
},
172+
deploy)
173+
Expect(err).NotTo(HaveOccurred())
174+
Expect(deploy.Spec.Replicas).To(Equal(&services.DefaultReplicas))
175+
Expect(controllerutil.HasControllerReference(deploy)).To(BeTrue())
176+
Expect(deploy.Spec.Template.Spec.Containers).To(HaveLen(1))
177+
command = deploy.Spec.Template.Spec.Containers[0].Command
178+
Expect(command).To(ContainElement("--log-level"))
179+
Expect(command).To(ContainElement("INFO"))
180+
181+
err = k8sClient.Get(ctx, types.NamespacedName{
182+
Name: feast.GetFeastServiceName(services.OnlineFeastType),
183+
Namespace: resource.Namespace,
184+
},
185+
deploy)
186+
Expect(err).NotTo(HaveOccurred())
187+
Expect(deploy.Spec.Replicas).To(Equal(&services.DefaultReplicas))
188+
Expect(controllerutil.HasControllerReference(deploy)).To(BeTrue())
189+
Expect(deploy.Spec.Template.Spec.Containers).To(HaveLen(1))
190+
command = deploy.Spec.Template.Spec.Containers[0].Command
191+
Expect(command).To(ContainElement("--log-level"))
192+
Expect(command).To(ContainElement("DEBUG"))
193+
})
194+
195+
})
196+
})

0 commit comments

Comments
 (0)