From 2213990158ebb9c6b430ac2f7c43598475dab7f4 Mon Sep 17 00:00:00 2001 From: yassinnouh21 Date: Sun, 4 Jan 2026 03:25:49 +0200 Subject: [PATCH 1/2] fix: Add hybrid online store to ONLINE_STORE_CLASS_FOR_TYPE mapping This fixes the import error when using HybridOnlineStore with the shorthand type configuration in feature_store.yaml. Changes: - Add missing __init__.py to hybrid_online_store package - Add "hybrid" entry to ONLINE_STORE_CLASS_FOR_TYPE in repo_config.py - Update HybridOnlineStoreConfig type Literal to use standard "hybrid" shorthand - Update documentation to use type: hybrid Signed-off-by: yassinnouh21 --- docs/reference/online-stores/hybrid.md | 2 +- .../infra/online_stores/hybrid_online_store/__init__.py | 0 .../hybrid_online_store/hybrid_online_store.py | 6 ++---- sdk/python/feast/repo_config.py | 1 + 4 files changed, 4 insertions(+), 5 deletions(-) create mode 100644 sdk/python/feast/infra/online_stores/hybrid_online_store/__init__.py diff --git a/docs/reference/online-stores/hybrid.md b/docs/reference/online-stores/hybrid.md index 38527d9a66e..a03cc4ae853 100644 --- a/docs/reference/online-stores/hybrid.md +++ b/docs/reference/online-stores/hybrid.md @@ -20,7 +20,7 @@ project: my_feature_repo registry: data/registry.db provider: local online_store: - type: hybrid_online_store.HybridOnlineStore + type: hybrid routing_tag: team # or any tag name you want to use in FeatureView's for routing online_stores: - type: bigtable diff --git a/sdk/python/feast/infra/online_stores/hybrid_online_store/__init__.py b/sdk/python/feast/infra/online_stores/hybrid_online_store/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/sdk/python/feast/infra/online_stores/hybrid_online_store/hybrid_online_store.py b/sdk/python/feast/infra/online_stores/hybrid_online_store/hybrid_online_store.py index e929e039411..8faefdbd344 100644 --- a/sdk/python/feast/infra/online_stores/hybrid_online_store/hybrid_online_store.py +++ b/sdk/python/feast/infra/online_stores/hybrid_online_store/hybrid_online_store.py @@ -21,7 +21,7 @@ Example configuration (feature_store.yaml): online_store: - type: hybrid_online_store.HybridOnlineStore + type: hybrid routing_tag: team # or any tag name you want to use for routing online_stores: - type: feast.infra.online_stores.bigtable.BigtableOnlineStore @@ -64,9 +64,7 @@ class HybridOnlineStoreConfig(FeastConfigBaseModel): online_stores: A list of OnlineStoresWithConfig, each specifying the type and config for an online store backend. """ - type: Literal["HybridOnlineStore", "hybrid_online_store.HybridOnlineStore"] = ( - "hybrid_online_store.HybridOnlineStore" - ) + type: Literal["hybrid"] = "hybrid" class OnlineStoresWithConfig(FeastConfigBaseModel): """ diff --git a/sdk/python/feast/repo_config.py b/sdk/python/feast/repo_config.py index 2cd148edb66..318ca324cd6 100644 --- a/sdk/python/feast/repo_config.py +++ b/sdk/python/feast/repo_config.py @@ -84,6 +84,7 @@ "qdrant": "feast.infra.online_stores.qdrant_online_store.qdrant.QdrantOnlineStore", "couchbase.online": "feast.infra.online_stores.couchbase_online_store.couchbase.CouchbaseOnlineStore", "milvus": "feast.infra.online_stores.milvus_online_store.milvus.MilvusOnlineStore", + "hybrid": "feast.infra.online_stores.hybrid_online_store.hybrid_online_store.HybridOnlineStore", **LEGACY_ONLINE_STORE_CLASS_FOR_TYPE, } From c6a858cad14e176c130f811dfe0e9bad99549749 Mon Sep 17 00:00:00 2001 From: yassinnouh21 Date: Sun, 4 Jan 2026 21:00:02 +0200 Subject: [PATCH 2/2] fix: Add hybrid to Go operator ValidOnlineStoreDBStorePersistenceTypes The data source types test validates that Python ONLINE_STORE_CLASS_FOR_TYPE matches the Go operator's ValidOnlineStoreDBStorePersistenceTypes. This adds the hybrid type to both v1 and v1alpha1 API versions. Signed-off-by: yassinnouh21 --- infra/feast-operator/api/v1/featurestore_types.go | 3 ++- infra/feast-operator/api/v1alpha1/featurestore_types.go | 3 ++- .../config/crd/bases/feast.dev_featurestores.yaml | 4 ++++ infra/feast-operator/dist/install.yaml | 4 ++++ 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/infra/feast-operator/api/v1/featurestore_types.go b/infra/feast-operator/api/v1/featurestore_types.go index 462447d23c6..cb79578a1ff 100644 --- a/infra/feast-operator/api/v1/featurestore_types.go +++ b/infra/feast-operator/api/v1/featurestore_types.go @@ -371,7 +371,7 @@ type OnlineStoreFilePersistence struct { // OnlineStoreDBStorePersistence configures the DB store persistence for the online store service type OnlineStoreDBStorePersistence struct { // Type of the persistence type you want to use. - // +kubebuilder:validation:Enum=snowflake.online;redis;ikv;datastore;dynamodb;bigtable;postgres;cassandra;mysql;hazelcast;singlestore;hbase;elasticsearch;qdrant;couchbase.online;milvus + // +kubebuilder:validation:Enum=snowflake.online;redis;ikv;datastore;dynamodb;bigtable;postgres;cassandra;mysql;hazelcast;singlestore;hbase;elasticsearch;qdrant;couchbase.online;milvus;hybrid Type string `json:"type"` // Data store parameters should be placed as-is from the "feature_store.yaml" under the secret key. "registry_type" & "type" fields should be removed. SecretRef corev1.LocalObjectReference `json:"secretRef"` @@ -396,6 +396,7 @@ var ValidOnlineStoreDBStorePersistenceTypes = []string{ "qdrant", "couchbase.online", "milvus", + "hybrid", } // LocalRegistryConfig configures the registry service diff --git a/infra/feast-operator/api/v1alpha1/featurestore_types.go b/infra/feast-operator/api/v1alpha1/featurestore_types.go index 45dff27f816..c246877ea7c 100644 --- a/infra/feast-operator/api/v1alpha1/featurestore_types.go +++ b/infra/feast-operator/api/v1alpha1/featurestore_types.go @@ -371,7 +371,7 @@ type OnlineStoreFilePersistence struct { // OnlineStoreDBStorePersistence configures the DB store persistence for the online store service type OnlineStoreDBStorePersistence struct { // Type of the persistence type you want to use. - // +kubebuilder:validation:Enum=snowflake.online;redis;ikv;datastore;dynamodb;bigtable;postgres;cassandra;mysql;hazelcast;singlestore;hbase;elasticsearch;qdrant;couchbase.online;milvus + // +kubebuilder:validation:Enum=snowflake.online;redis;ikv;datastore;dynamodb;bigtable;postgres;cassandra;mysql;hazelcast;singlestore;hbase;elasticsearch;qdrant;couchbase.online;milvus;hybrid Type string `json:"type"` // Data store parameters should be placed as-is from the "feature_store.yaml" under the secret key. "registry_type" & "type" fields should be removed. SecretRef corev1.LocalObjectReference `json:"secretRef"` @@ -396,6 +396,7 @@ var ValidOnlineStoreDBStorePersistenceTypes = []string{ "qdrant", "couchbase.online", "milvus", + "hybrid", } // LocalRegistryConfig configures the registry service 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 d47acf74135..04456c5a929 100644 --- a/infra/feast-operator/config/crd/bases/feast.dev_featurestores.yaml +++ b/infra/feast-operator/config/crd/bases/feast.dev_featurestores.yaml @@ -1322,6 +1322,7 @@ spec: - qdrant - couchbase.online - milvus + - hybrid type: string required: - secretRef @@ -5358,6 +5359,7 @@ spec: - qdrant - couchbase.online - milvus + - hybrid type: string required: - secretRef @@ -9521,6 +9523,7 @@ spec: - qdrant - couchbase.online - milvus + - hybrid type: string required: - secretRef @@ -13557,6 +13560,7 @@ spec: - qdrant - couchbase.online - milvus + - hybrid type: string required: - secretRef diff --git a/infra/feast-operator/dist/install.yaml b/infra/feast-operator/dist/install.yaml index 57e32090b19..0bfc0da14d8 100644 --- a/infra/feast-operator/dist/install.yaml +++ b/infra/feast-operator/dist/install.yaml @@ -1330,6 +1330,7 @@ spec: - qdrant - couchbase.online - milvus + - hybrid type: string required: - secretRef @@ -5366,6 +5367,7 @@ spec: - qdrant - couchbase.online - milvus + - hybrid type: string required: - secretRef @@ -9529,6 +9531,7 @@ spec: - qdrant - couchbase.online - milvus + - hybrid type: string required: - secretRef @@ -13565,6 +13568,7 @@ spec: - qdrant - couchbase.online - milvus + - hybrid type: string required: - secretRef