Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
Adding EnvFrom support for the OptionalConfigs type to the feast go o…
…perator

Signed-off-by: lrangine <19699092+lokeshrangineni@users.noreply.github.com>
  • Loading branch information
lokeshrangineni committed Jan 9, 2025
commit c06067dad941318eda167d3ad3c21d8c6a3897e3
1 change: 1 addition & 0 deletions infra/feast-operator/api/v1alpha1/featurestore_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -296,6 +296,7 @@ type DefaultConfigs struct {
// OptionalConfigs k8s container settings that are optional
type OptionalConfigs struct {
Env *[]corev1.EnvVar `json:"env,omitempty"`
EnvFrom *[]corev1.EnvFromSource `json:"envFrom,omitempty"`
ImagePullPolicy *corev1.PullPolicy `json:"imagePullPolicy,omitempty"`
Resources *corev1.ResourceRequirements `json:"resources,omitempty"`
}
Expand Down
11 changes: 11 additions & 0 deletions infra/feast-operator/api/v1alpha1/zz_generated.deepcopy.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

246 changes: 246 additions & 0 deletions infra/feast-operator/config/crd/bases/feast.dev_featurestores.yaml

Large diffs are not rendered by default.

246 changes: 246 additions & 0 deletions infra/feast-operator/dist/install.yaml

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -202,10 +202,31 @@ var _ = Describe("FeatureStore Controller - db storage services", func() {
Expect(k8sClient.Create(ctx, secret)).To(Succeed())
}

By("creating the config map and secret for envFrom")
envFromConfigMap := &corev1.ConfigMap{
ObjectMeta: metav1.ObjectMeta{
Name: "example-configmap",
Namespace: "default",
},
Data: map[string]string{"example-key": "example-value"},
}
err = k8sClient.Create(context.TODO(), envFromConfigMap)
Expect(err).ToNot(HaveOccurred())

envFromSecret := &corev1.Secret{
ObjectMeta: metav1.ObjectMeta{
Name: "example-secret",
Namespace: "default",
},
StringData: map[string]string{"secret-key": "secret-value"},
}
err = k8sClient.Create(context.TODO(), envFromSecret)
Expect(err).ToNot(HaveOccurred())

By("creating the custom resource for the Kind FeatureStore")
err = k8sClient.Get(ctx, typeNamespacedName, featurestore)
if err != nil && errors.IsNotFound(err) {
resource := createFeatureStoreResource(resourceName, image, pullPolicy, &[]corev1.EnvVar{})
resource := createFeatureStoreResource(resourceName, image, pullPolicy, &[]corev1.EnvVar{}, withEnvFrom())
resource.Spec.Services.OfflineStore.Persistence = &feastdevv1alpha1.OfflineStorePersistence{
DBPersistence: &feastdevv1alpha1.OfflineStoreDBStorePersistence{
Type: string(offlineType),
Expand Down Expand Up @@ -256,6 +277,26 @@ var _ = Describe("FeatureStore Controller - db storage services", func() {
err = k8sClient.Get(ctx, typeNamespacedName, resource)
Expect(err).NotTo(HaveOccurred())

By("Deleting the configmap and secret for envFrom")
configMap := &corev1.ConfigMap{
ObjectMeta: metav1.ObjectMeta{
Name: "example-configmap",
Namespace: "default",
},
}
err = k8sClient.Delete(context.TODO(), configMap)
Expect(err).ToNot(HaveOccurred())

// Delete Secret
secret := &corev1.Secret{
ObjectMeta: metav1.ObjectMeta{
Name: "example-secret",
Namespace: "default",
},
}
err = k8sClient.Delete(context.TODO(), secret)
Expect(err).ToNot(HaveOccurred())

By("Cleanup the secrets")
Expect(k8sClient.Delete(ctx, onlineSecret)).To(Succeed())
Expect(k8sClient.Delete(ctx, offlineSecret)).To(Succeed())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,11 +62,32 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() {
registryPath := "/data/registry.db"

BeforeEach(func() {
By("creating the config map and secret for envFrom")
envFromConfigMap := &corev1.ConfigMap{
ObjectMeta: metav1.ObjectMeta{
Name: "example-configmap",
Namespace: "default",
},
Data: map[string]string{"example-key": "example-value"},
}
err := k8sClient.Create(context.TODO(), envFromConfigMap)
Expect(err).ToNot(HaveOccurred())

envFromSecret := &corev1.Secret{
ObjectMeta: metav1.ObjectMeta{
Name: "example-secret",
Namespace: "default",
},
StringData: map[string]string{"secret-key": "secret-value"},
}
err = k8sClient.Create(context.TODO(), envFromSecret)
Expect(err).ToNot(HaveOccurred())

By("creating the custom resource for the Kind FeatureStore")
err := k8sClient.Get(ctx, typeNamespacedName, featurestore)
err = k8sClient.Get(ctx, typeNamespacedName, featurestore)
if err != nil && errors.IsNotFound(err) {
resource := createFeatureStoreResource(resourceName, image, pullPolicy, &[]corev1.EnvVar{{Name: testEnvVarName, Value: testEnvVarValue},
{Name: "fieldRefName", ValueFrom: &corev1.EnvVarSource{FieldRef: &corev1.ObjectFieldSelector{APIVersion: "v1", FieldPath: "metadata.namespace"}}}})
{Name: "fieldRefName", ValueFrom: &corev1.EnvVarSource{FieldRef: &corev1.ObjectFieldSelector{APIVersion: "v1", FieldPath: "metadata.namespace"}}}}, withEnvFrom())
resource.Spec.Services.OfflineStore.Persistence = &feastdevv1alpha1.OfflineStorePersistence{
FilePersistence: &feastdevv1alpha1.OfflineStoreFilePersistence{
Type: offlineType,
Expand Down Expand Up @@ -97,6 +118,27 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() {

By("Cleanup the specific resource instance FeatureStore")
Expect(k8sClient.Delete(ctx, resource)).To(Succeed())

// Delete ConfigMap
By("Deleting the configmap and secret for envFrom")
configMap := &corev1.ConfigMap{
ObjectMeta: metav1.ObjectMeta{
Name: "example-configmap",
Namespace: "default",
},
}
err = k8sClient.Delete(context.TODO(), configMap)
Expect(err).ToNot(HaveOccurred())

// Delete Secret
secret := &corev1.Secret{
ObjectMeta: metav1.ObjectMeta{
Name: "example-secret",
Namespace: "default",
},
}
err = k8sClient.Delete(context.TODO(), secret)
Expect(err).ToNot(HaveOccurred())
})

It("should successfully reconcile the resource", func() {
Expand Down Expand Up @@ -141,6 +183,18 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() {
Expect(resource.Status.Applied.Services.OnlineStore.Persistence.FilePersistence).NotTo(BeNil())
Expect(resource.Status.Applied.Services.OnlineStore.Persistence.FilePersistence.Path).To(Equal(onlineStorePath))
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"}}}}))
Expect(resource.Status.Applied.Services.OnlineStore.EnvFrom).To(Equal(&[]corev1.EnvFromSource{
{
ConfigMapRef: &corev1.ConfigMapEnvSource{
LocalObjectReference: corev1.LocalObjectReference{Name: "example-configmap"},
},
},
{
SecretRef: &corev1.SecretEnvSource{
LocalObjectReference: corev1.LocalObjectReference{Name: "example-secret"},
},
},
}))
Expect(resource.Status.Applied.Services.OnlineStore.ImagePullPolicy).To(Equal(&pullPolicy))
Expect(resource.Status.Applied.Services.OnlineStore.Resources).NotTo(BeNil())
Expect(resource.Status.Applied.Services.OnlineStore.Image).To(Equal(&image))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,10 +59,31 @@ var _ = Describe("FeatureStore Controller-Kubernetes authorization", func() {
roles := []string{"reader", "writer"}

BeforeEach(func() {
By("creating the config map and secret for envFrom")
configMap := &corev1.ConfigMap{
ObjectMeta: metav1.ObjectMeta{
Name: "example-configmap",
Namespace: "default",
},
Data: map[string]string{"example-key": "example-value"},
}
err := k8sClient.Create(context.TODO(), configMap)
Expect(err).ToNot(HaveOccurred())

secret := &corev1.Secret{
ObjectMeta: metav1.ObjectMeta{
Name: "example-secret",
Namespace: "default",
},
StringData: map[string]string{"secret-key": "secret-value"},
}
err = k8sClient.Create(context.TODO(), secret)
Expect(err).ToNot(HaveOccurred())

By("creating the custom resource for the Kind FeatureStore")
err := k8sClient.Get(ctx, typeNamespacedName, featurestore)
err = k8sClient.Get(ctx, typeNamespacedName, featurestore)
if err != nil && errors.IsNotFound(err) {
resource := createFeatureStoreResource(resourceName, image, pullPolicy, &[]corev1.EnvVar{})
resource := createFeatureStoreResource(resourceName, image, pullPolicy, &[]corev1.EnvVar{}, withEnvFrom())
resource.Spec.AuthzConfig = &feastdevv1alpha1.AuthzConfig{KubernetesAuthz: &feastdevv1alpha1.KubernetesAuthz{
Roles: roles,
}}
Expand All @@ -75,6 +96,27 @@ var _ = Describe("FeatureStore Controller-Kubernetes authorization", func() {
err := k8sClient.Get(ctx, typeNamespacedName, resource)
Expect(err).NotTo(HaveOccurred())

// Delete ConfigMap
By("Deleting the configmap and secret for envFrom")
configMap := &corev1.ConfigMap{
ObjectMeta: metav1.ObjectMeta{
Name: "example-configmap",
Namespace: "default",
},
}
err = k8sClient.Delete(context.TODO(), configMap)
Expect(err).ToNot(HaveOccurred())

// Delete Secret
secret := &corev1.Secret{
ObjectMeta: metav1.ObjectMeta{
Name: "example-secret",
Namespace: "default",
},
}
err = k8sClient.Delete(context.TODO(), secret)
Expect(err).ToNot(HaveOccurred())

By("Cleanup the specific resource instance FeatureStore")
Expect(k8sClient.Delete(ctx, resource)).To(Succeed())
})
Expand Down Expand Up @@ -126,6 +168,18 @@ var _ = Describe("FeatureStore Controller-Kubernetes authorization", func() {
Expect(resource.Status.Applied.Services.OnlineStore.Persistence.FilePersistence).NotTo(BeNil())
Expect(resource.Status.Applied.Services.OnlineStore.Persistence.FilePersistence.Path).To(Equal(services.EphemeralPath + "/" + services.DefaultOnlineStorePath))
Expect(resource.Status.Applied.Services.OnlineStore.Env).To(Equal(&[]corev1.EnvVar{}))
Expect(resource.Status.Applied.Services.OnlineStore.EnvFrom).To(Equal(&[]corev1.EnvFromSource{
{
ConfigMapRef: &corev1.ConfigMapEnvSource{
LocalObjectReference: corev1.LocalObjectReference{Name: "example-configmap"},
},
},
{
SecretRef: &corev1.SecretEnvSource{
LocalObjectReference: corev1.LocalObjectReference{Name: "example-secret"},
},
},
}))
Expect(resource.Status.Applied.Services.OnlineStore.ImagePullPolicy).To(Equal(&pullPolicy))
Expect(resource.Status.Applied.Services.OnlineStore.Resources).NotTo(BeNil())
Expect(resource.Status.Applied.Services.OnlineStore.Image).To(Equal(&image))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,11 +64,32 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() {
}

BeforeEach(func() {
By("creating the config map and secret for envFrom")
envFromConfigMap := &corev1.ConfigMap{
ObjectMeta: metav1.ObjectMeta{
Name: "example-configmap",
Namespace: "default",
},
Data: map[string]string{"example-key": "example-value"},
}
err := k8sClient.Create(context.TODO(), envFromConfigMap)
Expect(err).ToNot(HaveOccurred())

envFromSecret := &corev1.Secret{
ObjectMeta: metav1.ObjectMeta{
Name: "example-secret",
Namespace: "default",
},
StringData: map[string]string{"secret-key": "secret-value"},
}
err = k8sClient.Create(context.TODO(), envFromSecret)
Expect(err).ToNot(HaveOccurred())

By("creating the custom resource for the Kind FeatureStore")
err := k8sClient.Get(ctx, typeNamespacedName, featurestore)
err = k8sClient.Get(ctx, typeNamespacedName, featurestore)
if err != nil && errors.IsNotFound(err) {
resource := createFeatureStoreResource(resourceName, image, pullPolicy, &[]corev1.EnvVar{{Name: testEnvVarName, Value: testEnvVarValue},
{Name: "fieldRefName", ValueFrom: &corev1.EnvVarSource{FieldRef: &corev1.ObjectFieldSelector{APIVersion: "v1", FieldPath: "metadata.namespace"}}}})
{Name: "fieldRefName", ValueFrom: &corev1.EnvVarSource{FieldRef: &corev1.ObjectFieldSelector{APIVersion: "v1", FieldPath: "metadata.namespace"}}}}, withEnvFrom())
resource.Spec.Services.OnlineStore = nil
resource.Spec.Services.OfflineStore = nil
resource.Spec.Services.Registry = &feastdevv1alpha1.Registry{
Expand All @@ -81,7 +102,6 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() {
},
},
}

Expect(k8sClient.Create(ctx, resource)).To(Succeed())
}
})
Expand All @@ -90,6 +110,26 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() {
err := k8sClient.Get(ctx, typeNamespacedName, resource)
Expect(err).NotTo(HaveOccurred())

By("Deleting the configmap and secret for envFrom")
configMap := &corev1.ConfigMap{
ObjectMeta: metav1.ObjectMeta{
Name: "example-configmap",
Namespace: "default",
},
}
err = k8sClient.Delete(context.TODO(), configMap)
Expect(err).ToNot(HaveOccurred())

// Delete Secret
secret := &corev1.Secret{
ObjectMeta: metav1.ObjectMeta{
Name: "example-secret",
Namespace: "default",
},
}
err = k8sClient.Delete(context.TODO(), secret)
Expect(err).ToNot(HaveOccurred())

By("Cleanup the specific resource instance FeatureStore")
Expect(k8sClient.Delete(ctx, resource)).To(Succeed())
})
Expand Down
Loading