Skip to content

Commit e01e510

Browse files
feat: Adding EnvFrom support for the OptionalConfigs type to the Go Operator (feast-dev#4909)
* Adding EnvFrom support for the OptionalConfigs type to the feast go operator Signed-off-by: lrangine <19699092+lokeshrangineni@users.noreply.github.com> * * Refactored the code to avoid the redundent code. moved common code to util.go * Incorporated code review comments. Added assertion for environment variables at the container level. Signed-off-by: lrangine <19699092+lokeshrangineni@users.noreply.github.com> --------- Signed-off-by: lrangine <19699092+lokeshrangineni@users.noreply.github.com>
1 parent e5527ad commit e01e510

13 files changed

+724
-37
lines changed

infra/feast-operator/api/v1alpha1/featurestore_types.go

+1
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,7 @@ type DefaultConfigs struct {
296296
// OptionalConfigs k8s container settings that are optional
297297
type OptionalConfigs struct {
298298
Env *[]corev1.EnvVar `json:"env,omitempty"`
299+
EnvFrom *[]corev1.EnvFromSource `json:"envFrom,omitempty"`
299300
ImagePullPolicy *corev1.PullPolicy `json:"imagePullPolicy,omitempty"`
300301
Resources *corev1.ResourceRequirements `json:"resources,omitempty"`
301302
}

infra/feast-operator/api/v1alpha1/zz_generated.deepcopy.go

+11
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

infra/feast-operator/config/crd/bases/feast.dev_featurestores.yaml

+246
Large diffs are not rendered by default.

infra/feast-operator/dist/install.yaml

+246
Large diffs are not rendered by default.

infra/feast-operator/internal/controller/featurestore_controller_db_store_test.go

+7-1
Original file line numberDiff line numberDiff line change
@@ -202,10 +202,12 @@ var _ = Describe("FeatureStore Controller - db storage services", func() {
202202
Expect(k8sClient.Create(ctx, secret)).To(Succeed())
203203
}
204204

205+
createEnvFromSecretAndConfigMap()
206+
205207
By("creating the custom resource for the Kind FeatureStore")
206208
err = k8sClient.Get(ctx, typeNamespacedName, featurestore)
207209
if err != nil && errors.IsNotFound(err) {
208-
resource := createFeatureStoreResource(resourceName, image, pullPolicy, &[]corev1.EnvVar{})
210+
resource := createFeatureStoreResource(resourceName, image, pullPolicy, &[]corev1.EnvVar{}, withEnvFrom())
209211
resource.Spec.Services.OfflineStore.Persistence = &feastdevv1alpha1.OfflineStorePersistence{
210212
DBPersistence: &feastdevv1alpha1.OfflineStoreDBStorePersistence{
211213
Type: string(offlineType),
@@ -256,6 +258,8 @@ var _ = Describe("FeatureStore Controller - db storage services", func() {
256258
err = k8sClient.Get(ctx, typeNamespacedName, resource)
257259
Expect(err).NotTo(HaveOccurred())
258260

261+
deleteEnvFromSecretAndConfigMap()
262+
259263
By("Cleanup the secrets")
260264
Expect(k8sClient.Delete(ctx, onlineSecret)).To(Succeed())
261265
Expect(k8sClient.Delete(ctx, offlineSecret)).To(Succeed())
@@ -598,6 +602,7 @@ var _ = Describe("FeatureStore Controller - db storage services", func() {
598602

599603
offlineContainer := services.GetOfflineContainer(deploy.Spec.Template.Spec.Containers)
600604
Expect(offlineContainer.Env).To(HaveLen(1))
605+
assertEnvFrom(*offlineContainer)
601606
env = getFeatureStoreYamlEnvVar(offlineContainer.Env)
602607
Expect(env).NotTo(BeNil())
603608

@@ -615,6 +620,7 @@ var _ = Describe("FeatureStore Controller - db storage services", func() {
615620
onlineContainer := services.GetOnlineContainer(deploy.Spec.Template.Spec.Containers)
616621
Expect(onlineContainer.VolumeMounts).To(HaveLen(1))
617622
Expect(onlineContainer.Env).To(HaveLen(1))
623+
assertEnvFrom(*onlineContainer)
618624
Expect(onlineContainer.ImagePullPolicy).To(Equal(corev1.PullAlways))
619625
env = getFeatureStoreYamlEnvVar(onlineContainer.Env)
620626
Expect(env).NotTo(BeNil())

infra/feast-operator/internal/controller/featurestore_controller_ephemeral_test.go

+13-1
Original file line numberDiff line numberDiff line change
@@ -62,11 +62,12 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() {
6262
registryPath := "/data/registry.db"
6363

6464
BeforeEach(func() {
65+
createEnvFromSecretAndConfigMap()
6566
By("creating the custom resource for the Kind FeatureStore")
6667
err := k8sClient.Get(ctx, typeNamespacedName, featurestore)
6768
if err != nil && errors.IsNotFound(err) {
6869
resource := createFeatureStoreResource(resourceName, image, pullPolicy, &[]corev1.EnvVar{{Name: testEnvVarName, Value: testEnvVarValue},
69-
{Name: "fieldRefName", ValueFrom: &corev1.EnvVarSource{FieldRef: &corev1.ObjectFieldSelector{APIVersion: "v1", FieldPath: "metadata.namespace"}}}})
70+
{Name: "fieldRefName", ValueFrom: &corev1.EnvVarSource{FieldRef: &corev1.ObjectFieldSelector{APIVersion: "v1", FieldPath: "metadata.namespace"}}}}, withEnvFrom())
7071
resource.Spec.Services.OfflineStore.Persistence = &feastdevv1alpha1.OfflineStorePersistence{
7172
FilePersistence: &feastdevv1alpha1.OfflineStoreFilePersistence{
7273
Type: offlineType,
@@ -97,6 +98,8 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() {
9798

9899
By("Cleanup the specific resource instance FeatureStore")
99100
Expect(k8sClient.Delete(ctx, resource)).To(Succeed())
101+
102+
deleteEnvFromSecretAndConfigMap()
100103
})
101104

102105
It("should successfully reconcile the resource", func() {
@@ -141,6 +144,7 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() {
141144
Expect(resource.Status.Applied.Services.OnlineStore.Persistence.FilePersistence).NotTo(BeNil())
142145
Expect(resource.Status.Applied.Services.OnlineStore.Persistence.FilePersistence.Path).To(Equal(onlineStorePath))
143146
Expect(resource.Status.Applied.Services.OnlineStore.Env).To(Equal(&[]corev1.EnvVar{{Name: testEnvVarName, Value: testEnvVarValue}, {Name: "fieldRefName", ValueFrom: &corev1.EnvVarSource{FieldRef: &corev1.ObjectFieldSelector{APIVersion: "v1", FieldPath: "metadata.namespace"}}}}))
147+
Expect(resource.Status.Applied.Services.OnlineStore.EnvFrom).To(Equal(withEnvFrom()))
144148
Expect(resource.Status.Applied.Services.OnlineStore.ImagePullPolicy).To(Equal(&pullPolicy))
145149
Expect(resource.Status.Applied.Services.OnlineStore.Resources).NotTo(BeNil())
146150
Expect(resource.Status.Applied.Services.OnlineStore.Image).To(Equal(&image))
@@ -309,9 +313,13 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() {
309313

310314
offlineContainer := services.GetOfflineContainer(deploy.Spec.Template.Spec.Containers)
311315
Expect(offlineContainer.Env).To(HaveLen(1))
316+
assertEnvFrom(*offlineContainer)
312317
env = getFeatureStoreYamlEnvVar(offlineContainer.Env)
313318
Expect(env).NotTo(BeNil())
314319

320+
//check envFrom for offlineContainer
321+
assertEnvFrom(*offlineContainer)
322+
315323
fsYamlStr, err = feast.GetServiceFeatureStoreYamlBase64()
316324
Expect(err).NotTo(HaveOccurred())
317325
Expect(fsYamlStr).To(Equal(env.Value))
@@ -434,6 +442,10 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() {
434442
env = getFeatureStoreYamlEnvVar(onlineContainer.Env)
435443
Expect(env).NotTo(BeNil())
436444

445+
//check envFrom
446+
// Validate `envFrom` for ConfigMap and Secret
447+
assertEnvFrom(*onlineContainer)
448+
437449
fsYamlStr, err = feast.GetServiceFeatureStoreYamlBase64()
438450
Expect(err).NotTo(HaveOccurred())
439451
Expect(fsYamlStr).To(Equal(env.Value))

infra/feast-operator/internal/controller/featurestore_controller_kubernetes_auth_test.go

+14-3
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,12 @@ var _ = Describe("FeatureStore Controller-Kubernetes authorization", func() {
5959
roles := []string{"reader", "writer"}
6060

6161
BeforeEach(func() {
62+
createEnvFromSecretAndConfigMap()
63+
6264
By("creating the custom resource for the Kind FeatureStore")
6365
err := k8sClient.Get(ctx, typeNamespacedName, featurestore)
6466
if err != nil && errors.IsNotFound(err) {
65-
resource := createFeatureStoreResource(resourceName, image, pullPolicy, &[]corev1.EnvVar{})
67+
resource := createFeatureStoreResource(resourceName, image, pullPolicy, &[]corev1.EnvVar{}, withEnvFrom())
6668
resource.Spec.AuthzConfig = &feastdevv1alpha1.AuthzConfig{KubernetesAuthz: &feastdevv1alpha1.KubernetesAuthz{
6769
Roles: roles,
6870
}}
@@ -75,6 +77,8 @@ var _ = Describe("FeatureStore Controller-Kubernetes authorization", func() {
7577
err := k8sClient.Get(ctx, typeNamespacedName, resource)
7678
Expect(err).NotTo(HaveOccurred())
7779

80+
deleteEnvFromSecretAndConfigMap()
81+
7882
By("Cleanup the specific resource instance FeatureStore")
7983
Expect(k8sClient.Delete(ctx, resource)).To(Succeed())
8084
})
@@ -126,6 +130,7 @@ var _ = Describe("FeatureStore Controller-Kubernetes authorization", func() {
126130
Expect(resource.Status.Applied.Services.OnlineStore.Persistence.FilePersistence).NotTo(BeNil())
127131
Expect(resource.Status.Applied.Services.OnlineStore.Persistence.FilePersistence.Path).To(Equal(services.EphemeralPath + "/" + services.DefaultOnlineStorePath))
128132
Expect(resource.Status.Applied.Services.OnlineStore.Env).To(Equal(&[]corev1.EnvVar{}))
133+
Expect(resource.Status.Applied.Services.OnlineStore.EnvFrom).To(Equal(withEnvFrom()))
129134
Expect(resource.Status.Applied.Services.OnlineStore.ImagePullPolicy).To(Equal(&pullPolicy))
130135
Expect(resource.Status.Applied.Services.OnlineStore.Resources).NotTo(BeNil())
131136
Expect(resource.Status.Applied.Services.OnlineStore.Image).To(Equal(&image))
@@ -416,9 +421,12 @@ var _ = Describe("FeatureStore Controller-Kubernetes authorization", func() {
416421
Expect(repoConfig).To(Equal(&testConfig))
417422

418423
// check offline
419-
env = getFeatureStoreYamlEnvVar(services.GetOfflineContainer(deploy.Spec.Template.Spec.Containers).Env)
424+
offlineContainer := services.GetOfflineContainer(deploy.Spec.Template.Spec.Containers)
425+
env = getFeatureStoreYamlEnvVar(offlineContainer.Env)
420426
Expect(env).NotTo(BeNil())
421427

428+
assertEnvFrom(*offlineContainer)
429+
422430
// check offline config
423431
fsYamlStr, err = feast.GetServiceFeatureStoreYamlBase64()
424432
Expect(err).NotTo(HaveOccurred())
@@ -432,9 +440,12 @@ var _ = Describe("FeatureStore Controller-Kubernetes authorization", func() {
432440
Expect(repoConfig).To(Equal(&testConfig))
433441

434442
// check online
435-
env = getFeatureStoreYamlEnvVar(services.GetOnlineContainer(deploy.Spec.Template.Spec.Containers).Env)
443+
onlineContainer := services.GetOnlineContainer(deploy.Spec.Template.Spec.Containers)
444+
env = getFeatureStoreYamlEnvVar(onlineContainer.Env)
436445
Expect(env).NotTo(BeNil())
437446

447+
assertEnvFrom(*onlineContainer)
448+
438449
// check online config
439450
fsYamlStr, err = feast.GetServiceFeatureStoreYamlBase64()
440451
Expect(err).NotTo(HaveOccurred())

infra/feast-operator/internal/controller/featurestore_controller_objectstore_test.go

+5-2
Original file line numberDiff line numberDiff line change
@@ -64,11 +64,13 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() {
6464
}
6565

6666
BeforeEach(func() {
67+
createEnvFromSecretAndConfigMap()
68+
6769
By("creating the custom resource for the Kind FeatureStore")
6870
err := k8sClient.Get(ctx, typeNamespacedName, featurestore)
6971
if err != nil && errors.IsNotFound(err) {
7072
resource := createFeatureStoreResource(resourceName, image, pullPolicy, &[]corev1.EnvVar{{Name: testEnvVarName, Value: testEnvVarValue},
71-
{Name: "fieldRefName", ValueFrom: &corev1.EnvVarSource{FieldRef: &corev1.ObjectFieldSelector{APIVersion: "v1", FieldPath: "metadata.namespace"}}}})
73+
{Name: "fieldRefName", ValueFrom: &corev1.EnvVarSource{FieldRef: &corev1.ObjectFieldSelector{APIVersion: "v1", FieldPath: "metadata.namespace"}}}}, withEnvFrom())
7274
resource.Spec.Services.OnlineStore = nil
7375
resource.Spec.Services.OfflineStore = nil
7476
resource.Spec.Services.Registry = &feastdevv1alpha1.Registry{
@@ -81,7 +83,6 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() {
8183
},
8284
},
8385
}
84-
8586
Expect(k8sClient.Create(ctx, resource)).To(Succeed())
8687
}
8788
})
@@ -90,6 +91,8 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() {
9091
err := k8sClient.Get(ctx, typeNamespacedName, resource)
9192
Expect(err).NotTo(HaveOccurred())
9293

94+
deleteEnvFromSecretAndConfigMap()
95+
9396
By("Cleanup the specific resource instance FeatureStore")
9497
Expect(k8sClient.Delete(ctx, resource)).To(Succeed())
9598
})

infra/feast-operator/internal/controller/featurestore_controller_oidc_auth_test.go

+10-1
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,12 @@ var _ = Describe("FeatureStore Controller-OIDC authorization", func() {
7070
Expect(k8sClient.Create(ctx, oidcSecret)).To(Succeed())
7171
}
7272

73+
createEnvFromSecretAndConfigMap()
74+
7375
By("creating the custom resource for the Kind FeatureStore")
7476
err = k8sClient.Get(ctx, typeNamespacedName, featurestore)
7577
if err != nil && errors.IsNotFound(err) {
76-
resource := createFeatureStoreResource(resourceName, image, pullPolicy, &[]corev1.EnvVar{})
78+
resource := createFeatureStoreResource(resourceName, image, pullPolicy, &[]corev1.EnvVar{}, withEnvFrom())
7779
resource.Spec.AuthzConfig = &feastdevv1alpha1.AuthzConfig{OidcAuthz: &feastdevv1alpha1.OidcAuthz{
7880
SecretRef: corev1.LocalObjectReference{
7981
Name: oidcSecretName,
@@ -82,6 +84,7 @@ var _ = Describe("FeatureStore Controller-OIDC authorization", func() {
8284

8385
Expect(k8sClient.Create(ctx, resource)).To(Succeed())
8486
}
87+
8588
})
8689
AfterEach(func() {
8790
resource := &feastdevv1alpha1.FeatureStore{}
@@ -97,6 +100,8 @@ var _ = Describe("FeatureStore Controller-OIDC authorization", func() {
97100

98101
By("Cleanup the specific resource instance FeatureStore")
99102
Expect(k8sClient.Delete(ctx, resource)).To(Succeed())
103+
104+
deleteEnvFromSecretAndConfigMap()
100105
})
101106

102107
It("should successfully reconcile the resource", func() {
@@ -148,6 +153,7 @@ var _ = Describe("FeatureStore Controller-OIDC authorization", func() {
148153
Expect(resource.Status.Applied.Services.OnlineStore.Persistence.FilePersistence).NotTo(BeNil())
149154
Expect(resource.Status.Applied.Services.OnlineStore.Persistence.FilePersistence.Path).To(Equal(services.EphemeralPath + "/" + services.DefaultOnlineStorePath))
150155
Expect(resource.Status.Applied.Services.OnlineStore.Env).To(Equal(&[]corev1.EnvVar{}))
156+
Expect(resource.Status.Applied.Services.OnlineStore.EnvFrom).To(Equal(withEnvFrom()))
151157
Expect(resource.Status.Applied.Services.OnlineStore.ImagePullPolicy).To(Equal(&pullPolicy))
152158
Expect(resource.Status.Applied.Services.OnlineStore.Resources).NotTo(BeNil())
153159
Expect(resource.Status.Applied.Services.OnlineStore.Image).To(Equal(&image))
@@ -222,6 +228,9 @@ var _ = Describe("FeatureStore Controller-OIDC authorization", func() {
222228
Expect(services.GetOnlineContainer(deploy.Spec.Template.Spec.Containers).VolumeMounts).To(HaveLen(1))
223229
Expect(services.GetRegistryContainer(deploy.Spec.Template.Spec.Containers).VolumeMounts).To(HaveLen(1))
224230

231+
assertEnvFrom(*services.GetOnlineContainer(deploy.Spec.Template.Spec.Containers))
232+
assertEnvFrom(*services.GetOfflineContainer(deploy.Spec.Template.Spec.Containers))
233+
225234
// check Feast Role
226235
feastRole := &rbacv1.Role{}
227236
err = k8sClient.Get(ctx, types.NamespacedName{

infra/feast-operator/internal/controller/featurestore_controller_pvc_test.go

+10-1
Original file line numberDiff line numberDiff line change
@@ -75,11 +75,13 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() {
7575
registryMountedPath := path.Join(registryMountPath, registryPath)
7676

7777
BeforeEach(func() {
78+
createEnvFromSecretAndConfigMap()
79+
7880
By("creating the custom resource for the Kind FeatureStore")
7981
err := k8sClient.Get(ctx, typeNamespacedName, featurestore)
8082
if err != nil && errors.IsNotFound(err) {
8183
resource := createFeatureStoreResource(resourceName, image, pullPolicy, &[]corev1.EnvVar{{Name: testEnvVarName, Value: testEnvVarValue},
82-
{Name: "fieldRefName", ValueFrom: &corev1.EnvVarSource{FieldRef: &corev1.ObjectFieldSelector{APIVersion: "v1", FieldPath: "metadata.namespace"}}}})
84+
{Name: "fieldRefName", ValueFrom: &corev1.EnvVarSource{FieldRef: &corev1.ObjectFieldSelector{APIVersion: "v1", FieldPath: "metadata.namespace"}}}}, withEnvFrom())
8385
resource.Spec.Services.OfflineStore.Persistence = &feastdevv1alpha1.OfflineStorePersistence{
8486
FilePersistence: &feastdevv1alpha1.OfflineStoreFilePersistence{
8587
Type: offlineType,
@@ -125,6 +127,8 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() {
125127

126128
By("Cleanup the specific resource instance FeatureStore")
127129
Expect(k8sClient.Delete(ctx, resource)).To(Succeed())
130+
131+
deleteEnvFromSecretAndConfigMap()
128132
})
129133

130134
It("should successfully reconcile the resource", func() {
@@ -191,6 +195,7 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() {
191195
Expect(resource.Status.Applied.Services.OnlineStore.Persistence.FilePersistence.PvcConfig.Create.Resources).NotTo(BeNil())
192196
Expect(resource.Status.Applied.Services.OnlineStore.Persistence.FilePersistence.PvcConfig.Create.Resources).To(Equal(expectedResources))
193197
Expect(resource.Status.Applied.Services.OnlineStore.Env).To(Equal(&[]corev1.EnvVar{{Name: testEnvVarName, Value: testEnvVarValue}, {Name: "fieldRefName", ValueFrom: &corev1.EnvVarSource{FieldRef: &corev1.ObjectFieldSelector{APIVersion: "v1", FieldPath: "metadata.namespace"}}}}))
198+
Expect(resource.Status.Applied.Services.OnlineStore.EnvFrom).To(Equal(withEnvFrom()))
194199
Expect(resource.Status.Applied.Services.OnlineStore.ImagePullPolicy).To(Equal(&pullPolicy))
195200
Expect(resource.Status.Applied.Services.OnlineStore.Resources).NotTo(BeNil())
196201
Expect(resource.Status.Applied.Services.OnlineStore.Image).To(Equal(&image))
@@ -283,6 +288,8 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() {
283288
offlinePvcName := feast.GetFeastServiceName(services.OfflineFeastType)
284289
Expect(offlineVolMount.Name).To(Equal(offlinePvcName))
285290

291+
assertEnvFrom(*offlineContainer)
292+
286293
// check offline pvc
287294
pvc := &corev1.PersistentVolumeClaim{}
288295
err = k8sClient.Get(ctx, types.NamespacedName{
@@ -307,6 +314,8 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() {
307314
Expect(onlineVolMount.MountPath).To(Equal(onlineStoreMountPath))
308315
Expect(onlineVolMount.Name).To(Equal(onlinePvcName))
309316

317+
assertEnvFrom(*onlineContainer)
318+
310319
// check online pvc
311320
pvc = &corev1.PersistentVolumeClaim{}
312321
err = k8sClient.Get(ctx, types.NamespacedName{

0 commit comments

Comments
 (0)