From 7159e6f6a4deb868943a092cc249a4aa4177390b Mon Sep 17 00:00:00 2001 From: Aniket Paluskar Date: Tue, 3 Feb 2026 16:52:03 +0530 Subject: [PATCH 1/3] feat: batch_engine config injection in feature_store.yaml through operator Signed-off-by: Aniket Paluskar --- go/internal/feast/onlineserving/serving.go | 2 +- go/internal/feast/server/grpc_server.go | 1 - go/internal/feast/server/server_commons.go | 2 +- .../api/v1/featurestore_types.go | 10 ++++ .../api/v1/zz_generated.deepcopy.go | 25 ++++++++ .../feast-operator.clusterserviceversion.yaml | 2 +- .../manifests/feast.dev_featurestores.yaml | 43 +++++++++++++ .../crd/bases/feast.dev_featurestores.yaml | 43 +++++++++++++ .../config/manager/kustomization.yaml | 4 +- infra/feast-operator/dist/install.yaml | 43 +++++++++++++ infra/feast-operator/docs/api/markdown/ref.md | 17 ++++++ .../controller/services/repo_config.go | 60 ++++++++++++++++++- .../controller/services/services_types.go | 21 ++++--- .../internal/controller/services/util.go | 13 ++++ 14 files changed, 271 insertions(+), 15 deletions(-) diff --git a/go/internal/feast/onlineserving/serving.go b/go/internal/feast/onlineserving/serving.go index f042939ec0f..ff70443015a 100644 --- a/go/internal/feast/onlineserving/serving.go +++ b/go/internal/feast/onlineserving/serving.go @@ -652,7 +652,7 @@ func getQualifiedFeatureName(viewName string, featureName string, fullFeatureNam func validateJoinKeys( joinKeyValues map[string]*prototypes.RepeatedValue, expectedJoinKeysSet map[string]interface{}) error { - for joinKey, _ := range joinKeyValues { + for joinKey := range joinKeyValues { if _, ok := expectedJoinKeysSet[joinKey]; !ok { return fmt.Errorf("Invalid entity join key. key=%s", joinKey) } diff --git a/go/internal/feast/server/grpc_server.go b/go/internal/feast/server/grpc_server.go index ab76aa554ca..27aded75b04 100644 --- a/go/internal/feast/server/grpc_server.go +++ b/go/internal/feast/server/grpc_server.go @@ -9,7 +9,6 @@ import ( prototypes "github.com/feast-dev/feast/go/protos/feast/types" "github.com/feast-dev/feast/go/types" "github.com/google/uuid" - ) const feastServerVersion = "0.0.1" diff --git a/go/internal/feast/server/server_commons.go b/go/internal/feast/server/server_commons.go index a6959076c4a..b433e7f4a85 100644 --- a/go/internal/feast/server/server_commons.go +++ b/go/internal/feast/server/server_commons.go @@ -4,8 +4,8 @@ import ( "os" "github.com/rs/zerolog" - "go.opentelemetry.io/otel/trace" "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/trace" ) var tracer = otel.Tracer("github.com/feast-dev/feast/go/server") diff --git a/infra/feast-operator/api/v1/featurestore_types.go b/infra/feast-operator/api/v1/featurestore_types.go index c64c26ce020..977fc586110 100644 --- a/infra/feast-operator/api/v1/featurestore_types.go +++ b/infra/feast-operator/api/v1/featurestore_types.go @@ -75,6 +75,7 @@ type FeatureStoreSpec struct { Services *FeatureStoreServices `json:"services,omitempty"` AuthzConfig *AuthzConfig `json:"authz,omitempty"` CronJob *FeastCronJob `json:"cronJob,omitempty"` + BatchEngine *BatchEngineConfig `json:"batchEngine,omitempty"` } // FeastProjectDir defines how to create the feast project directory. @@ -155,6 +156,15 @@ type FeastCronJob struct { FailedJobsHistoryLimit *int32 `json:"failedJobsHistoryLimit,omitempty"` } +// BatchEngineConfig defines the batch compute engine configuration. +type BatchEngineConfig struct { + // Reference to a ConfigMap containing the batch engine configuration. + // The ConfigMap should contain YAML-formatted config with 'type' and engine-specific fields. + ConfigMapRef *corev1.LocalObjectReference `json:"configMapRef,omitempty"` + // Key name in the ConfigMap. Defaults to "config" if not specified. + ConfigMapKey string `json:"configMapKey,omitempty"` +} + // JobSpec describes how the job execution will look like. type JobSpec struct { // PodTemplateAnnotations are annotations to be applied to the CronJob's PodTemplate diff --git a/infra/feast-operator/api/v1/zz_generated.deepcopy.go b/infra/feast-operator/api/v1/zz_generated.deepcopy.go index 9e328bf5b6c..870f4489a4b 100644 --- a/infra/feast-operator/api/v1/zz_generated.deepcopy.go +++ b/infra/feast-operator/api/v1/zz_generated.deepcopy.go @@ -53,6 +53,26 @@ func (in *AuthzConfig) DeepCopy() *AuthzConfig { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *BatchEngineConfig) DeepCopyInto(out *BatchEngineConfig) { + *out = *in + if in.ConfigMapRef != nil { + in, out := &in.ConfigMapRef, &out.ConfigMapRef + *out = new(corev1.LocalObjectReference) + **out = **in + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BatchEngineConfig. +func (in *BatchEngineConfig) DeepCopy() *BatchEngineConfig { + if in == nil { + return nil + } + out := new(BatchEngineConfig) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ContainerConfigs) DeepCopyInto(out *ContainerConfigs) { *out = *in @@ -357,6 +377,11 @@ func (in *FeatureStoreSpec) DeepCopyInto(out *FeatureStoreSpec) { *out = new(FeastCronJob) (*in).DeepCopyInto(*out) } + if in.BatchEngine != nil { + in, out := &in.BatchEngine, &out.BatchEngine + *out = new(BatchEngineConfig) + (*in).DeepCopyInto(*out) + } } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FeatureStoreSpec. diff --git a/infra/feast-operator/bundle/manifests/feast-operator.clusterserviceversion.yaml b/infra/feast-operator/bundle/manifests/feast-operator.clusterserviceversion.yaml index 06faefe4f49..84e6a60eff5 100644 --- a/infra/feast-operator/bundle/manifests/feast-operator.clusterserviceversion.yaml +++ b/infra/feast-operator/bundle/manifests/feast-operator.clusterserviceversion.yaml @@ -50,7 +50,7 @@ metadata: } ] capabilities: Basic Install - createdAt: "2026-01-31T05:08:59Z" + createdAt: "2026-02-03T08:12:50Z" operators.operatorframework.io/builder: operator-sdk-v1.38.0 operators.operatorframework.io/project_layout: go.kubebuilder.io/v4 name: feast-operator.v0.59.0 diff --git a/infra/feast-operator/bundle/manifests/feast.dev_featurestores.yaml b/infra/feast-operator/bundle/manifests/feast.dev_featurestores.yaml index 5caf443a763..f69971c1c4c 100644 --- a/infra/feast-operator/bundle/manifests/feast.dev_featurestores.yaml +++ b/infra/feast-operator/bundle/manifests/feast.dev_featurestores.yaml @@ -83,6 +83,27 @@ spec: x-kubernetes-validations: - message: One selection required between kubernetes or oidc. rule: '[has(self.kubernetes), has(self.oidc)].exists_one(c, c)' + batchEngine: + description: BatchEngineConfig defines the batch compute engine configuration. + properties: + configMapKey: + description: Key name in the ConfigMap. Defaults to "config" if + not specified. + type: string + configMapRef: + description: Reference to a ConfigMap containing the batch engine + configuration. + properties: + name: + default: "" + description: |- + Name of the referent. + This field is effectively required, but due to backwards compatibility is + allowed to be empty. + type: string + type: object + x-kubernetes-map-type: atomic + type: object cronJob: description: FeastCronJob defines a CronJob to execute against a Feature Store deployment. @@ -4287,6 +4308,28 @@ spec: - message: One selection required between kubernetes or oidc. rule: '[has(self.kubernetes), has(self.oidc)].exists_one(c, c)' + batchEngine: + description: BatchEngineConfig defines the batch compute engine + configuration. + properties: + configMapKey: + description: Key name in the ConfigMap. Defaults to "config" + if not specified. + type: string + configMapRef: + description: Reference to a ConfigMap containing the batch + engine configuration. + properties: + name: + default: "" + description: |- + Name of the referent. + This field is effectively required, but due to backwards compatibility is + allowed to be empty. + type: string + type: object + x-kubernetes-map-type: atomic + type: object cronJob: description: FeastCronJob defines a CronJob to execute against a Feature Store deployment. diff --git a/infra/feast-operator/config/crd/bases/feast.dev_featurestores.yaml b/infra/feast-operator/config/crd/bases/feast.dev_featurestores.yaml index 9ef46ebbb32..a3acc201a1c 100644 --- a/infra/feast-operator/config/crd/bases/feast.dev_featurestores.yaml +++ b/infra/feast-operator/config/crd/bases/feast.dev_featurestores.yaml @@ -83,6 +83,27 @@ spec: x-kubernetes-validations: - message: One selection required between kubernetes or oidc. rule: '[has(self.kubernetes), has(self.oidc)].exists_one(c, c)' + batchEngine: + description: BatchEngineConfig defines the batch compute engine configuration. + properties: + configMapKey: + description: Key name in the ConfigMap. Defaults to "config" if + not specified. + type: string + configMapRef: + description: Reference to a ConfigMap containing the batch engine + configuration. + properties: + name: + default: "" + description: |- + Name of the referent. + This field is effectively required, but due to backwards compatibility is + allowed to be empty. + type: string + type: object + x-kubernetes-map-type: atomic + type: object cronJob: description: FeastCronJob defines a CronJob to execute against a Feature Store deployment. @@ -4287,6 +4308,28 @@ spec: - message: One selection required between kubernetes or oidc. rule: '[has(self.kubernetes), has(self.oidc)].exists_one(c, c)' + batchEngine: + description: BatchEngineConfig defines the batch compute engine + configuration. + properties: + configMapKey: + description: Key name in the ConfigMap. Defaults to "config" + if not specified. + type: string + configMapRef: + description: Reference to a ConfigMap containing the batch + engine configuration. + properties: + name: + default: "" + description: |- + Name of the referent. + This field is effectively required, but due to backwards compatibility is + allowed to be empty. + type: string + type: object + x-kubernetes-map-type: atomic + type: object cronJob: description: FeastCronJob defines a CronJob to execute against a Feature Store deployment. diff --git a/infra/feast-operator/config/manager/kustomization.yaml b/infra/feast-operator/config/manager/kustomization.yaml index efdd8ddde97..75e802aa7fc 100644 --- a/infra/feast-operator/config/manager/kustomization.yaml +++ b/infra/feast-operator/config/manager/kustomization.yaml @@ -4,5 +4,5 @@ apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization images: - name: controller - newName: quay.io/feastdev/feast-operator - newTag: 0.59.0 + newName: quay.io/aniket-redhat/feast-operator + newTag: dev0.8 diff --git a/infra/feast-operator/dist/install.yaml b/infra/feast-operator/dist/install.yaml index b34092d8b42..55e691b4c50 100644 --- a/infra/feast-operator/dist/install.yaml +++ b/infra/feast-operator/dist/install.yaml @@ -91,6 +91,27 @@ spec: x-kubernetes-validations: - message: One selection required between kubernetes or oidc. rule: '[has(self.kubernetes), has(self.oidc)].exists_one(c, c)' + batchEngine: + description: BatchEngineConfig defines the batch compute engine configuration. + properties: + configMapKey: + description: Key name in the ConfigMap. Defaults to "config" if + not specified. + type: string + configMapRef: + description: Reference to a ConfigMap containing the batch engine + configuration. + properties: + name: + default: "" + description: |- + Name of the referent. + This field is effectively required, but due to backwards compatibility is + allowed to be empty. + type: string + type: object + x-kubernetes-map-type: atomic + type: object cronJob: description: FeastCronJob defines a CronJob to execute against a Feature Store deployment. @@ -4295,6 +4316,28 @@ spec: - message: One selection required between kubernetes or oidc. rule: '[has(self.kubernetes), has(self.oidc)].exists_one(c, c)' + batchEngine: + description: BatchEngineConfig defines the batch compute engine + configuration. + properties: + configMapKey: + description: Key name in the ConfigMap. Defaults to "config" + if not specified. + type: string + configMapRef: + description: Reference to a ConfigMap containing the batch + engine configuration. + properties: + name: + default: "" + description: |- + Name of the referent. + This field is effectively required, but due to backwards compatibility is + allowed to be empty. + type: string + type: object + x-kubernetes-map-type: atomic + type: object cronJob: description: FeastCronJob defines a CronJob to execute against a Feature Store deployment. diff --git a/infra/feast-operator/docs/api/markdown/ref.md b/infra/feast-operator/docs/api/markdown/ref.md index 64998542d2f..ce64e4dd3ec 100644 --- a/infra/feast-operator/docs/api/markdown/ref.md +++ b/infra/feast-operator/docs/api/markdown/ref.md @@ -28,6 +28,22 @@ _Appears in:_ | `oidc` _[OidcAuthz](#oidcauthz)_ | | +#### BatchEngineConfig + + + +BatchEngineConfig defines the batch compute engine configuration. + +_Appears in:_ +- [FeatureStoreSpec](#featurestorespec) + +| Field | Description | +| --- | --- | +| `configMapRef` _[LocalObjectReference](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.30/#localobjectreference-v1-core)_ | Reference to a ConfigMap containing the batch engine configuration. +The ConfigMap should contain YAML-formatted config with 'type' and engine-specific fields. | +| `configMapKey` _string_ | Key name in the ConfigMap. Defaults to "config" if not specified. | + + #### ContainerConfigs @@ -226,6 +242,7 @@ _Appears in:_ | `services` _[FeatureStoreServices](#featurestoreservices)_ | | | `authz` _[AuthzConfig](#authzconfig)_ | | | `cronJob` _[FeastCronJob](#feastcronjob)_ | | +| `batchEngine` _[BatchEngineConfig](#batchengineconfig)_ | | #### FeatureStoreStatus diff --git a/infra/feast-operator/internal/controller/services/repo_config.go b/infra/feast-operator/internal/controller/services/repo_config.go index 00c09563fd9..9b20955f324 100644 --- a/infra/feast-operator/internal/controller/services/repo_config.go +++ b/infra/feast-operator/internal/controller/services/repo_config.go @@ -44,12 +44,13 @@ func (feast *FeastServices) getServiceFeatureStoreYaml() ([]byte, error) { } func (feast *FeastServices) getServiceRepoConfig() (RepoConfig, error) { - return getServiceRepoConfig(feast.Handler.FeatureStore, feast.extractConfigFromSecret) + return getServiceRepoConfig(feast.Handler.FeatureStore, feast.extractConfigFromSecret, feast.extractConfigFromConfigMap) } func getServiceRepoConfig( featureStore *feastdevv1.FeatureStore, - secretExtractionFunc func(storeType string, secretRef string, secretKeyName string) (map[string]interface{}, error)) (RepoConfig, error) { + secretExtractionFunc func(storeType string, secretRef string, secretKeyName string) (map[string]interface{}, error), + configMapExtractionFunc func(configMapRef string, configMapKey string) (map[string]interface{}, error)) (RepoConfig, error) { repoConfig, err := getBaseServiceRepoConfig(featureStore, secretExtractionFunc) if err != nil { return repoConfig, err @@ -78,6 +79,13 @@ func getServiceRepoConfig( } } + if appliedSpec.BatchEngine != nil { + err := setRepoConfigBatchEngine(appliedSpec.BatchEngine, configMapExtractionFunc, &repoConfig) + if err != nil { + return repoConfig, err + } + } + return repoConfig, nil } @@ -248,6 +256,34 @@ func setRepoConfigOffline(services *feastdevv1.FeatureStoreServices, secretExtra return nil } +func setRepoConfigBatchEngine( + batchEngineConfig *feastdevv1.BatchEngineConfig, + configMapExtractionFunc func(configMapRef string, configMapKey string) (map[string]interface{}, error), + repoConfig *RepoConfig) error { + if batchEngineConfig.ConfigMapRef == nil { + return nil + } + configMapKey := batchEngineConfig.ConfigMapKey + if configMapKey == "" { + configMapKey = "config" + } + config, err := configMapExtractionFunc(batchEngineConfig.ConfigMapRef.Name, configMapKey) + if err != nil { + return err + } + // Extract type from config + engineType, ok := config["type"].(string) + if !ok { + return fmt.Errorf("batch engine config must contain 'type' field") + } + delete(config, "type") + repoConfig.BatchEngine = &ComputeEngineConfig{ + Type: engineType, + Parameters: config, + } + return nil +} + func (feast *FeastServices) getClientFeatureStoreYaml(secretExtractionFunc func(storeType string, secretRef string, secretKeyName string) (map[string]interface{}, error)) ([]byte, error) { clientRepo, err := getClientRepoConfig(feast.Handler.FeatureStore, secretExtractionFunc, feast) if err != nil { @@ -388,6 +424,26 @@ func (feast *FeastServices) extractConfigFromSecret(storeType string, secretRef return parameters, nil } +func (feast *FeastServices) extractConfigFromConfigMap(configMapRef string, configMapKey string) (map[string]interface{}, error) { + configMap, err := feast.getConfigMap(configMapRef) + if err != nil { + return nil, err + } + if configMapKey == "" { + configMapKey = "config" + } + val, exists := configMap.Data[configMapKey] + if !exists { + return nil, fmt.Errorf("configmap key %s doesn't exist in configmap %s", configMapKey, configMapRef) + } + var config map[string]interface{} + err = yaml.Unmarshal([]byte(val), &config) + if err != nil { + return nil, fmt.Errorf("configmap %s contains invalid YAML in key %s", configMapRef, configMapKey) + } + return config, nil +} + func mergeStructWithDBParametersMap(parametersMap *map[string]interface{}, s interface{}) error { for key, val := range *parametersMap { hasAttribute, err := hasAttrib(s, key, val) diff --git a/infra/feast-operator/internal/controller/services/services_types.go b/infra/feast-operator/internal/controller/services/services_types.go index d437c703a6a..10ac3538a99 100644 --- a/infra/feast-operator/internal/controller/services/services_types.go +++ b/infra/feast-operator/internal/controller/services/services_types.go @@ -249,13 +249,14 @@ type FeastServices struct { // RepoConfig is the Repo config. Typically loaded from feature_store.yaml. // https://rtd.feast.dev/en/stable/#feast.repo_config.RepoConfig type RepoConfig struct { - Project string `yaml:"project,omitempty"` - Provider FeastProviderType `yaml:"provider,omitempty"` - OfflineStore OfflineStoreConfig `yaml:"offline_store,omitempty"` - OnlineStore OnlineStoreConfig `yaml:"online_store,omitempty"` - Registry RegistryConfig `yaml:"registry,omitempty"` - AuthzConfig AuthzConfig `yaml:"auth,omitempty"` - EntityKeySerializationVersion int `yaml:"entity_key_serialization_version,omitempty"` + Project string `yaml:"project,omitempty"` + Provider FeastProviderType `yaml:"provider,omitempty"` + OfflineStore OfflineStoreConfig `yaml:"offline_store,omitempty"` + OnlineStore OnlineStoreConfig `yaml:"online_store,omitempty"` + Registry RegistryConfig `yaml:"registry,omitempty"` + AuthzConfig AuthzConfig `yaml:"auth,omitempty"` + EntityKeySerializationVersion int `yaml:"entity_key_serialization_version,omitempty"` + BatchEngine *ComputeEngineConfig `yaml:"batch_engine,omitempty"` } // OfflineStoreConfig is the configuration that relates to reading from and writing to the Feast offline store. @@ -293,6 +294,12 @@ type AuthzConfig struct { OidcParameters map[string]interface{} `yaml:",inline,omitempty"` } +// ComputeEngineConfig is the configuration for batch compute engine. +type ComputeEngineConfig struct { + Type string `yaml:"type,omitempty"` + Parameters map[string]interface{} `yaml:",inline,omitempty"` +} + type deploymentSettings struct { Args []string TargetHttpPort int32 diff --git a/infra/feast-operator/internal/controller/services/util.go b/infra/feast-operator/internal/controller/services/util.go index 8e8a717aecf..33d750251e9 100644 --- a/infra/feast-operator/internal/controller/services/util.go +++ b/infra/feast-operator/internal/controller/services/util.go @@ -295,6 +295,19 @@ func (feast *FeastServices) getSecret(secretRef string) (*corev1.Secret, error) return secret, nil } +func (feast *FeastServices) getConfigMap(configMapRef string) (*corev1.ConfigMap, error) { + logger := log.FromContext(feast.Handler.Context) + configMap := &corev1.ConfigMap{ObjectMeta: metav1.ObjectMeta{Name: configMapRef, Namespace: feast.Handler.FeatureStore.Namespace}} + objectKey := client.ObjectKeyFromObject(configMap) + if err := feast.Handler.Client.Get(feast.Handler.Context, objectKey, configMap); err != nil { + if apierrors.IsNotFound(err) { + logger.Error(err, "invalid configmap "+configMapRef+" for batch engine") + } + return nil, err + } + return configMap, nil +} + // Function to check if a struct has a specific field or field tag and sets the value in the field if empty func hasAttrib(s interface{}, fieldName string, value interface{}) (bool, error) { val := reflect.ValueOf(s) From 185617c9fe0bb49cc39cb6ededcb70d858126e09 Mon Sep 17 00:00:00 2001 From: Aniket Paluskar Date: Thu, 5 Feb 2026 09:52:45 +0530 Subject: [PATCH 2/3] Updated repo_config test with added parameter for getServiceRepoConfig func Signed-off-by: Aniket Paluskar --- .../controller/services/repo_config_test.go | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/infra/feast-operator/internal/controller/services/repo_config_test.go b/infra/feast-operator/internal/controller/services/repo_config_test.go index efde05df335..70869568dea 100644 --- a/infra/feast-operator/internal/controller/services/repo_config_test.go +++ b/infra/feast-operator/internal/controller/services/repo_config_test.go @@ -46,7 +46,7 @@ var _ = Describe("Repo Config", func() { Path: EphemeralPath + "/" + DefaultOnlineStorePath, } - repoConfig, err := getServiceRepoConfig(featureStore, emptyMockExtractConfigFromSecret) + repoConfig, err := getServiceRepoConfig(featureStore, emptyMockExtractConfigFromSecret, emptyMockExtractConfigFromConfigMap) Expect(err).NotTo(HaveOccurred()) Expect(repoConfig.AuthzConfig.Type).To(Equal(NoAuthAuthType)) Expect(repoConfig.OfflineStore).To(Equal(emptyOfflineStoreConfig)) @@ -74,7 +74,7 @@ var _ = Describe("Repo Config", func() { Path: testPath, } - repoConfig, err = getServiceRepoConfig(featureStore, emptyMockExtractConfigFromSecret) + repoConfig, err = getServiceRepoConfig(featureStore, emptyMockExtractConfigFromSecret, emptyMockExtractConfigFromConfigMap) Expect(err).NotTo(HaveOccurred()) Expect(repoConfig.AuthzConfig.Type).To(Equal(NoAuthAuthType)) Expect(repoConfig.OfflineStore).To(Equal(emptyOfflineStoreConfig)) @@ -96,7 +96,7 @@ var _ = Describe("Repo Config", func() { Expect(appliedServices.OnlineStore).NotTo(BeNil()) Expect(appliedServices.Registry.Local).NotTo(BeNil()) - repoConfig, err = getServiceRepoConfig(featureStore, emptyMockExtractConfigFromSecret) + repoConfig, err = getServiceRepoConfig(featureStore, emptyMockExtractConfigFromSecret, emptyMockExtractConfigFromConfigMap) Expect(err).NotTo(HaveOccurred()) Expect(repoConfig.OfflineStore).To(Equal(defaultOfflineStoreConfig)) Expect(repoConfig.AuthzConfig.Type).To(Equal(NoAuthAuthType)) @@ -115,7 +115,7 @@ var _ = Describe("Repo Config", func() { }, } ApplyDefaultsToStatus(featureStore) - repoConfig, err = getServiceRepoConfig(featureStore, emptyMockExtractConfigFromSecret) + repoConfig, err = getServiceRepoConfig(featureStore, emptyMockExtractConfigFromSecret, emptyMockExtractConfigFromConfigMap) Expect(err).NotTo(HaveOccurred()) Expect(repoConfig.AuthzConfig.Type).To(Equal(NoAuthAuthType)) Expect(repoConfig.OfflineStore).To(Equal(emptyOfflineStoreConfig)) @@ -163,7 +163,7 @@ var _ = Describe("Repo Config", func() { Path: "/data/online.db", } - repoConfig, err = getServiceRepoConfig(featureStore, emptyMockExtractConfigFromSecret) + repoConfig, err = getServiceRepoConfig(featureStore, emptyMockExtractConfigFromSecret, emptyMockExtractConfigFromConfigMap) Expect(err).NotTo(HaveOccurred()) Expect(repoConfig.AuthzConfig.Type).To(Equal(NoAuthAuthType)) Expect(repoConfig.OfflineStore).To(Equal(expectedOfflineConfig)) @@ -188,7 +188,7 @@ var _ = Describe("Repo Config", func() { Type: "dask", } - repoConfig, err = getServiceRepoConfig(featureStore, mockExtractConfigFromSecret) + repoConfig, err = getServiceRepoConfig(featureStore, mockExtractConfigFromSecret, emptyMockExtractConfigFromConfigMap) Expect(err).NotTo(HaveOccurred()) Expect(repoConfig.AuthzConfig.Type).To(Equal(KubernetesAuthType)) Expect(repoConfig.OfflineStore).To(Equal(expectedOfflineConfig)) @@ -211,7 +211,7 @@ var _ = Describe("Repo Config", func() { string(OidcClientSecret): "client-secret", string(OidcUsername): "username", string(OidcPassword): "password"}) - repoConfig, err = getServiceRepoConfig(featureStore, secretExtractionFunc) + repoConfig, err = getServiceRepoConfig(featureStore, secretExtractionFunc, emptyMockExtractConfigFromConfigMap) Expect(err).NotTo(HaveOccurred()) Expect(repoConfig.AuthzConfig.Type).To(Equal(OidcAuthType)) Expect(repoConfig.AuthzConfig.OidcParameters).To(HaveLen(5)) @@ -275,7 +275,7 @@ var _ = Describe("Repo Config", func() { featureStore.Spec.Services.OfflineStore.Persistence.FilePersistence = nil featureStore.Spec.Services.OnlineStore.Persistence.FilePersistence = nil featureStore.Spec.Services.Registry.Local.Persistence.FilePersistence = nil - repoConfig, err = getServiceRepoConfig(featureStore, mockExtractConfigFromSecret) + repoConfig, err = getServiceRepoConfig(featureStore, mockExtractConfigFromSecret, emptyMockExtractConfigFromConfigMap) Expect(err).NotTo(HaveOccurred()) newMap := CopyMap(parameterMap) port := parameterMap["port"].(int) @@ -316,7 +316,7 @@ var _ = Describe("Repo Config", func() { string(OidcClientSecret): "client-secret", string(OidcUsername): "username", string(OidcPassword): "password"}) - _, err := getServiceRepoConfig(featureStore, secretExtractionFunc) + _, err := getServiceRepoConfig(featureStore, secretExtractionFunc, emptyMockExtractConfigFromConfigMap) Expect(err).To(HaveOccurred()) Expect(err.Error()).To(ContainSubstring("missing OIDC secret")) _, err = getClientRepoConfig(featureStore, secretExtractionFunc, nil) @@ -338,7 +338,7 @@ var _ = Describe("Repo Config", func() { string(OidcClientId): "client-id", string(OidcUsername): "username", string(OidcPassword): "password"}) - _, err = getServiceRepoConfig(featureStore, secretExtractionFunc) + _, err = getServiceRepoConfig(featureStore, secretExtractionFunc, emptyMockExtractConfigFromConfigMap) Expect(err).To(HaveOccurred()) Expect(err.Error()).To(ContainSubstring("missing OIDC secret")) _, err = getClientRepoConfig(featureStore, secretExtractionFunc, nil) @@ -380,6 +380,10 @@ func emptyMockExtractConfigFromSecret(storeType string, secretRef string, secret return map[string]interface{}{}, nil } +func emptyMockExtractConfigFromConfigMap(configMapRef string, configMapKey string) (map[string]interface{}, error) { + return map[string]interface{}{}, nil +} + func mockExtractConfigFromSecret(storeType string, secretRef string, secretKeyName string) (map[string]interface{}, error) { return createParameterMap(), nil } From f70f0af4f34cf8536d866c838079158ed7e2d002 Mon Sep 17 00:00:00 2001 From: Aniket Paluskar Date: Mon, 9 Feb 2026 14:46:01 +0530 Subject: [PATCH 3/3] Removed image tag change from ustomization.yaml Signed-off-by: Aniket Paluskar --- infra/feast-operator/config/manager/kustomization.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/infra/feast-operator/config/manager/kustomization.yaml b/infra/feast-operator/config/manager/kustomization.yaml index 75e802aa7fc..efdd8ddde97 100644 --- a/infra/feast-operator/config/manager/kustomization.yaml +++ b/infra/feast-operator/config/manager/kustomization.yaml @@ -4,5 +4,5 @@ apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization images: - name: controller - newName: quay.io/aniket-redhat/feast-operator - newTag: dev0.8 + newName: quay.io/feastdev/feast-operator + newTag: 0.59.0