From 31eb097b8284cd08572697deeb87e46907a473b8 Mon Sep 17 00:00:00 2001 From: jyejare Date: Tue, 25 Nov 2025 19:28:03 +0530 Subject: [PATCH] Production ready feast operator with v1 apiversion Signed-off-by: jyejare --- .../running-feast-in-production.md | 4 +- .../feature-servers/offline-feature-server.md | 2 +- .../02-Install-feast.ipynb | 16 +- .../03-Uninstall.ipynb | 12 +- examples/operator-quickstart/feast.yaml | 2 +- .../1-setup-operator-rbac.ipynb | 10 +- .../3-uninstall.ipynb | 4 +- examples/operator-rbac/04-uninstall.ipynb | 4 +- .../operator-rbac/1-setup-operator-rbac.ipynb | 10 +- infra/feast-operator/Makefile | 2 +- infra/feast-operator/PROJECT | 4 +- .../{v1alpha1 => v1}/featurestore_types.go | 2 +- .../api/{v1alpha1 => v1}/groupversion_info.go | 6 +- .../{v1alpha1 => v1}/zz_generated.deepcopy.go | 36 +- infra/feast-operator/bundle.Dockerfile | 2 +- .../feast-operator.clusterserviceversion.yaml | 14 +- .../manifests/feast.dev_featurestores.yaml | 75 +- .../bundle/metadata/annotations.yaml | 2 +- infra/feast-operator/cmd/main.go | 4 +- .../crd/bases/feast.dev_featurestores.yaml | 2 +- .../config/crd/kustomization.yaml | 6 + .../crd/patches/v1alpha1_deprecated.yaml | 45 + .../feast-operator.clusterserviceversion.yaml | 4 +- .../config/samples/kustomization.yaml | 6 +- ...featurestore.yaml => v1_featurestore.yaml} | 2 +- ...1_featurestore_all_openshift_non_tls.yaml} | 2 +- ...> v1_featurestore_all_remote_servers.yaml} | 2 +- ...ml => v1_featurestore_db_persistence.yaml} | 2 +- ...tore_gcs.yaml => v1_featurestore_gcs.yaml} | 2 +- ...tore_git.yaml => v1_featurestore_git.yaml} | 2 +- ...yaml => v1_featurestore_git_repopath.yaml} | 2 +- ...en.yaml => v1_featurestore_git_token.yaml} | 2 +- ...re_init.yaml => v1_featurestore_init.yaml} | 2 +- ...l => v1_featurestore_kubernetes_auth.yaml} | 2 +- ...featurestore_objectstore_persistence.yaml} | 2 +- ...th.yaml => v1_featurestore_oidc_auth.yaml} | 2 +- ...featurestore_postgres_db_volumes_tls.yaml} | 2 +- ...urestore_postgres_tls_volumes_ca_env.yaml} | 2 +- ...l => v1_featurestore_pvc_persistence.yaml} | 2 +- ...=> v1_featurestore_services_loglevel.yaml} | 2 +- ...h_ui.yaml => v1_featurestore_with_ui.yaml} | 2 +- infra/feast-operator/dist/install.yaml | 8179 +---------------- infra/feast-operator/docs/api/markdown/ref.md | 8 +- .../internal/controller/authz/authz.go | 8 +- .../internal/controller/authz/authz_types.go | 12 +- .../controller/featurestore_controller.go | 50 +- .../featurestore_controller_cronjob_test.go | 48 +- .../featurestore_controller_db_store_test.go | 88 +- .../featurestore_controller_ephemeral_test.go | 72 +- ...restore_controller_kubernetes_auth_test.go | 72 +- .../featurestore_controller_loglevel_test.go | 90 +- ...tore_controller_namespace_registry_test.go | 4 +- ...eaturestore_controller_objectstore_test.go | 54 +- .../featurestore_controller_oidc_auth_test.go | 76 +- .../featurestore_controller_pvc_test.go | 86 +- .../featurestore_controller_test.go | 340 +- ...featurestore_controller_test_utils_test.go | 44 +- .../featurestore_controller_tls_test.go | 122 +- ...tore_controller_volume_volumemount_test.go | 56 +- .../controller/handler/handler_types.go | 4 +- .../internal/controller/services/cronjob.go | 6 +- .../controller/services/repo_config.go | 26 +- .../controller/services/repo_config_test.go | 208 +- .../internal/controller/services/services.go | 36 +- .../controller/services/services_test.go | 66 +- .../controller/services/services_types.go | 66 +- .../controller/services/suite_test.go | 4 +- .../internal/controller/services/tls.go | 28 +- .../internal/controller/services/tls_test.go | 78 +- .../internal/controller/services/util.go | 78 +- .../internal/controller/suite_test.go | 4 +- .../test/api/featurestore_types_test.go | 328 +- infra/feast-operator/test/api/suite_test.go | 4 +- .../data_source_types_test.go | 8 +- infra/feast-operator/test/e2e/e2e_test.go | 6 +- .../e2e_rhoai/resources/feast_kube_auth.yaml | 2 +- .../feast_integration_test_crs/feast.yaml | 2 +- ...tore.yaml => v1_default_featurestore.yaml} | 2 +- ...l => v1_remote_registry_featurestore.yaml} | 2 +- infra/feast-operator/test/utils/test_util.go | 20 +- .../resource/feast_config_credit_scoring.yaml | 2 +- .../resource/feast_config_driver_ranking.yaml | 2 +- .../resource/feast_config_rhoai.yaml | 2 +- 83 files changed, 1335 insertions(+), 9366 deletions(-) rename infra/feast-operator/api/{v1alpha1 => v1}/featurestore_types.go (99%) rename infra/feast-operator/api/{v1alpha1 => v1}/groupversion_info.go (91%) rename infra/feast-operator/api/{v1alpha1 => v1}/zz_generated.deepcopy.go (97%) create mode 100644 infra/feast-operator/config/crd/patches/v1alpha1_deprecated.yaml rename infra/feast-operator/config/samples/{v1alpha1_featurestore.yaml => v1_featurestore.yaml} (71%) rename infra/feast-operator/config/samples/{v1alpha1_featurestore_all_openshift_non_tls.yaml => v1_featurestore_all_openshift_non_tls.yaml} (91%) rename infra/feast-operator/config/samples/{v1alpha1_featurestore_all_remote_servers.yaml => v1_featurestore_all_remote_servers.yaml} (90%) rename infra/feast-operator/config/samples/{v1alpha1_featurestore_db_persistence.yaml => v1_featurestore_db_persistence.yaml} (97%) rename infra/feast-operator/config/samples/{v1alpha1_featurestore_gcs.yaml => v1_featurestore_gcs.yaml} (97%) rename infra/feast-operator/config/samples/{v1alpha1_featurestore_git.yaml => v1_featurestore_git.yaml} (87%) rename infra/feast-operator/config/samples/{v1alpha1_featurestore_git_repopath.yaml => v1_featurestore_git_repopath.yaml} (88%) rename infra/feast-operator/config/samples/{v1alpha1_featurestore_git_token.yaml => v1_featurestore_git_token.yaml} (92%) rename infra/feast-operator/config/samples/{v1alpha1_featurestore_init.yaml => v1_featurestore_init.yaml} (81%) rename infra/feast-operator/config/samples/{v1alpha1_featurestore_kubernetes_auth.yaml => v1_featurestore_kubernetes_auth.yaml} (91%) rename infra/feast-operator/config/samples/{v1alpha1_featurestore_objectstore_persistence.yaml => v1_featurestore_objectstore_persistence.yaml} (93%) rename infra/feast-operator/config/samples/{v1alpha1_featurestore_oidc_auth.yaml => v1_featurestore_oidc_auth.yaml} (92%) rename infra/feast-operator/config/samples/{v1alpha1_featurestore_postgres_db_volumes_tls.yaml => v1_featurestore_postgres_db_volumes_tls.yaml} (98%) rename infra/feast-operator/config/samples/{v1alpha1_featurestore_postgres_tls_volumes_ca_env.yaml => v1_featurestore_postgres_tls_volumes_ca_env.yaml} (98%) rename infra/feast-operator/config/samples/{v1alpha1_featurestore_pvc_persistence.yaml => v1_featurestore_pvc_persistence.yaml} (97%) rename infra/feast-operator/config/samples/{v1alpha1_featurestore_services_loglevel.yaml => v1_featurestore_services_loglevel.yaml} (91%) rename infra/feast-operator/config/samples/{v1alpha1_featurestore_with_ui.yaml => v1_featurestore_with_ui.yaml} (76%) rename infra/feast-operator/test/testdata/feast_integration_test_crs/{v1alpha1_default_featurestore.yaml => v1_default_featurestore.yaml} (86%) rename infra/feast-operator/test/testdata/feast_integration_test_crs/{v1alpha1_remote_registry_featurestore.yaml => v1_remote_registry_featurestore.yaml} (89%) diff --git a/docs/how-to-guides/running-feast-in-production.md b/docs/how-to-guides/running-feast-in-production.md index 06887499739..8e256995108 100644 --- a/docs/how-to-guides/running-feast-in-production.md +++ b/docs/how-to-guides/running-feast-in-production.md @@ -227,7 +227,7 @@ kubectl apply -f https://raw.githubusercontent.com/feast-dev/feast/refs/tags/\n" @@ -162,7 +162,7 @@ } ], "source": [ - "!kubectl apply -f ../../infra/feast-operator/config/samples/v1alpha1_featurestore_postgres_tls_volumes_ca_env.yaml --namespace=feast" + "!kubectl apply -f ../../infra/feast-operator/config/samples/v1_featurestore_postgres_tls_volumes_ca_env.yaml --namespace=feast" ] }, { @@ -455,4 +455,4 @@ }, "nbformat": 4, "nbformat_minor": 4 -} +} \ No newline at end of file diff --git a/examples/operator-postgres-tls-demo/03-Uninstall.ipynb b/examples/operator-postgres-tls-demo/03-Uninstall.ipynb index 007b8d7bc1a..8e378b17264 100644 --- a/examples/operator-postgres-tls-demo/03-Uninstall.ipynb +++ b/examples/operator-postgres-tls-demo/03-Uninstall.ipynb @@ -19,18 +19,18 @@ "secret \"postgres-secret\" deleted\n", "secret \"feast-data-stores\" deleted\n", "featurestore.feast.dev \"sample-db-ssl\" deleted\n", - "Error from server (NotFound): error when deleting \"../../infra/feast-operator/config/samples/v1alpha1_featurestore_postgres_tls_volumes_ca_env.yaml\": secrets \"postgres-secret\" not found\n", - "Error from server (NotFound): error when deleting \"../../infra/feast-operator/config/samples/v1alpha1_featurestore_postgres_tls_volumes_ca_env.yaml\": secrets \"feast-data-stores\" not found\n", - "Error from server (NotFound): error when deleting \"../../infra/feast-operator/config/samples/v1alpha1_featurestore_postgres_tls_volumes_ca_env.yaml\": featurestores.feast.dev \"sample-db-ssl\" not found\n" + "Error from server (NotFound): error when deleting \"../../infra/feast-operator/config/samples/v1_featurestore_postgres_tls_volumes_ca_env.yaml\": secrets \"postgres-secret\" not found\n", + "Error from server (NotFound): error when deleting \"../../infra/feast-operator/config/samples/v1_featurestore_postgres_tls_volumes_ca_env.yaml\": secrets \"feast-data-stores\" not found\n", + "Error from server (NotFound): error when deleting \"../../infra/feast-operator/config/samples/v1_featurestore_postgres_tls_volumes_ca_env.yaml\": featurestores.feast.dev \"sample-db-ssl\" not found\n" ] } ], "source": [ "# If you have choosen the option 1 example earlier.\n", - "!kubectl delete -f ../../infra/feast-operator/config/samples/v1alpha1_featurestore_postgres_db_volumes_tls.yaml\n", + "!kubectl delete -f ../../infra/feast-operator/config/samples/v1_featurestore_postgres_db_volumes_tls.yaml\n", "\n", "# If you have choosen the option 2 example earlier.\n", - "!kubectl delete -f ../../infra/feast-operator/config/samples/v1alpha1_featurestore_postgres_tls_volumes_ca_env.yaml\n", + "!kubectl delete -f ../../infra/feast-operator/config/samples/v1_featurestore_postgres_tls_volumes_ca_env.yaml\n", "\n", "#!kubectl delete -f ../../infra/feast-operator/dist/install.yaml" ] @@ -131,4 +131,4 @@ }, "nbformat": 4, "nbformat_minor": 4 -} +} \ No newline at end of file diff --git a/examples/operator-quickstart/feast.yaml b/examples/operator-quickstart/feast.yaml index b665ec5a8bf..a2002c3a70e 100644 --- a/examples/operator-quickstart/feast.yaml +++ b/examples/operator-quickstart/feast.yaml @@ -13,7 +13,7 @@ stringData: echo: false pool_pre_ping: true --- -apiVersion: feast.dev/v1alpha1 +apiVersion: feast.dev/v1 kind: FeatureStore metadata: name: example diff --git a/examples/operator-rbac-openshift-tls/1-setup-operator-rbac.ipynb b/examples/operator-rbac-openshift-tls/1-setup-operator-rbac.ipynb index edfc9f263cf..5348424fa4b 100644 --- a/examples/operator-rbac-openshift-tls/1-setup-operator-rbac.ipynb +++ b/examples/operator-rbac-openshift-tls/1-setup-operator-rbac.ipynb @@ -160,7 +160,7 @@ "metadata": {}, "source": [ "## Install the Feast services via FeatureStore CR\n", - "Next, we'll use the running Feast Operator to install the feast services with Server components online, offline, registry with kubernetes Authorization set. Apply the included [reference deployment](../../infra/feast-operator/config/samples/v1alpha1_featurestore_kubernetes_auth.yaml) to install and configure Feast with kubernetes Authorization ." + "Next, we'll use the running Feast Operator to install the feast services with Server components online, offline, registry with kubernetes Authorization set. Apply the included [reference deployment](../../infra/feast-operator/config/samples/v1_featurestore_kubernetes_auth.yaml) to install and configure Feast with kubernetes Authorization ." ] }, { @@ -177,7 +177,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "apiVersion: feast.dev/v1alpha1\n", + "apiVersion: feast.dev/v1\n", "kind: FeatureStore\n", "metadata:\n", " name: sample-kubernetes-auth\n", @@ -202,8 +202,8 @@ } ], "source": [ - "!cat ../../infra/feast-operator/config/samples/v1alpha1_featurestore_kubernetes_auth.yaml\n", - "!kubectl apply -f ../../infra/feast-operator/config/samples/v1alpha1_featurestore_kubernetes_auth.yaml -n feast" + "!cat ../../infra/feast-operator/config/samples/v1_featurestore_kubernetes_auth.yaml\n", + "!kubectl apply -f ../../infra/feast-operator/config/samples/v1_featurestore_kubernetes_auth.yaml -n feast" ] }, { @@ -738,4 +738,4 @@ }, "nbformat": 4, "nbformat_minor": 4 -} +} \ No newline at end of file diff --git a/examples/operator-rbac-openshift-tls/3-uninstall.ipynb b/examples/operator-rbac-openshift-tls/3-uninstall.ipynb index 5bfd13d2ef1..f831773af14 100644 --- a/examples/operator-rbac-openshift-tls/3-uninstall.ipynb +++ b/examples/operator-rbac-openshift-tls/3-uninstall.ipynb @@ -52,7 +52,7 @@ } ], "source": [ - "!kubectl delete -f ../../infra/feast-operator/config/samples/v1alpha1_featurestore_kubernetes_auth.yaml\n", + "!kubectl delete -f ../../infra/feast-operator/config/samples/v1_featurestore_kubernetes_auth.yaml\n", "!kubectl delete -f ../../infra/feast-operator/dist/install.yaml" ] }, @@ -218,4 +218,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} +} \ No newline at end of file diff --git a/examples/operator-rbac/04-uninstall.ipynb b/examples/operator-rbac/04-uninstall.ipynb index 871e86fe3fd..2f5b362e56f 100644 --- a/examples/operator-rbac/04-uninstall.ipynb +++ b/examples/operator-rbac/04-uninstall.ipynb @@ -52,7 +52,7 @@ } ], "source": [ - "!kubectl delete -f ../../infra/feast-operator/config/samples/v1alpha1_featurestore_kubernetes_auth.yaml\n", + "!kubectl delete -f ../../infra/feast-operator/config/samples/v1_featurestore_kubernetes_auth.yaml\n", "!kubectl delete -f ../../infra/feast-operator/dist/install.yaml" ] }, @@ -216,4 +216,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} +} \ No newline at end of file diff --git a/examples/operator-rbac/1-setup-operator-rbac.ipynb b/examples/operator-rbac/1-setup-operator-rbac.ipynb index 0a4615a0ce6..9dc84d325c4 100644 --- a/examples/operator-rbac/1-setup-operator-rbac.ipynb +++ b/examples/operator-rbac/1-setup-operator-rbac.ipynb @@ -177,7 +177,7 @@ "metadata": {}, "source": [ "## Install the Feast services via FeatureStore CR\n", - "Next, we'll use the running Feast Operator to install the feast services with Server components online, offline, registry with kubernetes Authorization set. Apply the included [reference deployment](../../infra/feast-operator/config/samples/v1alpha1_featurestore_kubernetes_auth.yaml) to install and configure Feast with kubernetes Authorization ." + "Next, we'll use the running Feast Operator to install the feast services with Server components online, offline, registry with kubernetes Authorization set. Apply the included [reference deployment](../../infra/feast-operator/config/samples/v1_featurestore_kubernetes_auth.yaml) to install and configure Feast with kubernetes Authorization ." ] }, { @@ -194,7 +194,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "apiVersion: feast.dev/v1alpha1\n", + "apiVersion: feast.dev/v1\n", "kind: FeatureStore\n", "metadata:\n", " name: sample-kubernetes-auth\n", @@ -219,8 +219,8 @@ } ], "source": [ - "!cat ../../infra/feast-operator/config/samples/v1alpha1_featurestore_kubernetes_auth.yaml\n", - "!kubectl apply -f ../../infra/feast-operator/config/samples/v1alpha1_featurestore_kubernetes_auth.yaml -n feast" + "!cat ../../infra/feast-operator/config/samples/v1_featurestore_kubernetes_auth.yaml\n", + "!kubectl apply -f ../../infra/feast-operator/config/samples/v1_featurestore_kubernetes_auth.yaml -n feast" ] }, { @@ -761,4 +761,4 @@ }, "nbformat": 4, "nbformat_minor": 4 -} +} \ No newline at end of file diff --git a/infra/feast-operator/Makefile b/infra/feast-operator/Makefile index 809b8d12c63..0fac65fafe7 100644 --- a/infra/feast-operator/Makefile +++ b/infra/feast-operator/Makefile @@ -312,7 +312,7 @@ $(CRD_REF_DOCS): $(LOCALBIN) .PHONY: generate-ref generate-ref: generate fmt crd-ref-docs - $(CRD_REF_DOCS) --log-level=WARN --max-depth=30 --config=$(LOCALDIR)/docs/crd-ref-templates/config.yaml --source-path=$(LOCALDIR)/api/v1alpha1 --renderer=markdown --templates-dir=$(LOCALDIR)/docs/crd-ref-templates/markdown --output-path=$(LOCALDIR)/docs/api/markdown/ref.md + $(CRD_REF_DOCS) --log-level=WARN --max-depth=30 --config=$(LOCALDIR)/docs/crd-ref-templates/config.yaml --source-path=$(LOCALDIR)/api/v1 --renderer=markdown --templates-dir=$(LOCALDIR)/docs/crd-ref-templates/markdown --output-path=$(LOCALDIR)/docs/api/markdown/ref.md .PHONY: bundle bundle: manifests kustomize related-image-fs operator-sdk ## Generate bundle manifests and metadata, then validate generated files. diff --git a/infra/feast-operator/PROJECT b/infra/feast-operator/PROJECT index 7716e6a3ac1..0906ca80115 100644 --- a/infra/feast-operator/PROJECT +++ b/infra/feast-operator/PROJECT @@ -17,6 +17,6 @@ resources: controller: true domain: feast.dev kind: FeatureStore - path: github.com/feast-dev/feast/infra/feast-operator/api/v1alpha1 - version: v1alpha1 + path: github.com/feast-dev/feast/infra/feast-operator/api/v1 + version: v1 version: "3" diff --git a/infra/feast-operator/api/v1alpha1/featurestore_types.go b/infra/feast-operator/api/v1/featurestore_types.go similarity index 99% rename from infra/feast-operator/api/v1alpha1/featurestore_types.go rename to infra/feast-operator/api/v1/featurestore_types.go index 3c86fe833a0..7959cb96acf 100644 --- a/infra/feast-operator/api/v1alpha1/featurestore_types.go +++ b/infra/feast-operator/api/v1/featurestore_types.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package v1alpha1 +package v1 import ( appsv1 "k8s.io/api/apps/v1" diff --git a/infra/feast-operator/api/v1alpha1/groupversion_info.go b/infra/feast-operator/api/v1/groupversion_info.go similarity index 91% rename from infra/feast-operator/api/v1alpha1/groupversion_info.go rename to infra/feast-operator/api/v1/groupversion_info.go index 21f8720ed4c..91add6e1e55 100644 --- a/infra/feast-operator/api/v1alpha1/groupversion_info.go +++ b/infra/feast-operator/api/v1/groupversion_info.go @@ -14,10 +14,10 @@ See the License for the specific language governing permissions and limitations under the License. */ -// Package v1alpha1 contains API Schema definitions for the v1alpha1 API group +// Package v1 contains API Schema definitions for the v1 API group // +kubebuilder:object:generate=true // +groupName=feast.dev -package v1alpha1 +package v1 import ( "k8s.io/apimachinery/pkg/runtime/schema" @@ -26,7 +26,7 @@ import ( var ( // GroupVersion is group version used to register these objects - GroupVersion = schema.GroupVersion{Group: "feast.dev", Version: "v1alpha1"} + GroupVersion = schema.GroupVersion{Group: "feast.dev", Version: "v1"} // SchemeBuilder is used to add go types to the GroupVersionKind scheme SchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion} diff --git a/infra/feast-operator/api/v1alpha1/zz_generated.deepcopy.go b/infra/feast-operator/api/v1/zz_generated.deepcopy.go similarity index 97% rename from infra/feast-operator/api/v1alpha1/zz_generated.deepcopy.go rename to infra/feast-operator/api/v1/zz_generated.deepcopy.go index 75692ec244a..7956f7015e5 100644 --- a/infra/feast-operator/api/v1alpha1/zz_generated.deepcopy.go +++ b/infra/feast-operator/api/v1/zz_generated.deepcopy.go @@ -18,12 +18,12 @@ limitations under the License. // Code generated by controller-gen. DO NOT EDIT. -package v1alpha1 +package v1 import ( appsv1 "k8s.io/api/apps/v1" batchv1 "k8s.io/api/batch/v1" - "k8s.io/api/core/v1" + corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" ) @@ -312,12 +312,12 @@ func (in *FeatureStoreServices) DeepCopyInto(out *FeatureStoreServices) { } if in.SecurityContext != nil { in, out := &in.SecurityContext, &out.SecurityContext - *out = new(v1.PodSecurityContext) + *out = new(corev1.PodSecurityContext) (*in).DeepCopyInto(*out) } if in.Volumes != nil { in, out := &in.Volumes, &out.Volumes - *out = make([]v1.Volume, len(*in)) + *out = make([]corev1.Volume, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -405,10 +405,10 @@ func (in *GitCloneOptions) DeepCopyInto(out *GitCloneOptions) { } if in.Env != nil { in, out := &in.Env, &out.Env - *out = new([]v1.EnvVar) + *out = new([]corev1.EnvVar) if **in != nil { in, out := *in, *out - *out = make([]v1.EnvVar, len(*in)) + *out = make([]corev1.EnvVar, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -416,10 +416,10 @@ func (in *GitCloneOptions) DeepCopyInto(out *GitCloneOptions) { } if in.EnvFrom != nil { in, out := &in.EnvFrom, &out.EnvFrom - *out = new([]v1.EnvFromSource) + *out = new([]corev1.EnvFromSource) if **in != nil { in, out := *in, *out - *out = make([]v1.EnvFromSource, len(*in)) + *out = make([]corev1.EnvFromSource, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -752,10 +752,10 @@ func (in *OptionalCtrConfigs) DeepCopyInto(out *OptionalCtrConfigs) { *out = *in if in.Env != nil { in, out := &in.Env, &out.Env - *out = new([]v1.EnvVar) + *out = new([]corev1.EnvVar) if **in != nil { in, out := *in, *out - *out = make([]v1.EnvVar, len(*in)) + *out = make([]corev1.EnvVar, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -763,10 +763,10 @@ func (in *OptionalCtrConfigs) DeepCopyInto(out *OptionalCtrConfigs) { } if in.EnvFrom != nil { in, out := &in.EnvFrom, &out.EnvFrom - *out = new([]v1.EnvFromSource) + *out = new([]corev1.EnvFromSource) if **in != nil { in, out := *in, *out - *out = make([]v1.EnvFromSource, len(*in)) + *out = make([]corev1.EnvFromSource, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -774,12 +774,12 @@ func (in *OptionalCtrConfigs) DeepCopyInto(out *OptionalCtrConfigs) { } if in.ImagePullPolicy != nil { in, out := &in.ImagePullPolicy, &out.ImagePullPolicy - *out = new(v1.PullPolicy) + *out = new(corev1.PullPolicy) **out = **in } if in.Resources != nil { in, out := &in.Resources, &out.Resources - *out = new(v1.ResourceRequirements) + *out = new(corev1.ResourceRequirements) (*in).DeepCopyInto(*out) } if in.NodeSelector != nil { @@ -810,7 +810,7 @@ func (in *PvcConfig) DeepCopyInto(out *PvcConfig) { *out = *in if in.Ref != nil { in, out := &in.Ref, &out.Ref - *out = new(v1.LocalObjectReference) + *out = new(corev1.LocalObjectReference) **out = **in } if in.Create != nil { @@ -835,7 +835,7 @@ func (in *PvcCreate) DeepCopyInto(out *PvcCreate) { *out = *in if in.AccessModes != nil { in, out := &in.AccessModes, &out.AccessModes - *out = make([]v1.PersistentVolumeAccessMode, len(*in)) + *out = make([]corev1.PersistentVolumeAccessMode, len(*in)) copy(*out, *in) } if in.StorageClassName != nil { @@ -1055,7 +1055,7 @@ func (in *ServerConfigs) DeepCopyInto(out *ServerConfigs) { } if in.VolumeMounts != nil { in, out := &in.VolumeMounts, &out.VolumeMounts - *out = make([]v1.VolumeMount, len(*in)) + *out = make([]corev1.VolumeMount, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -1092,7 +1092,7 @@ func (in *TlsConfigs) DeepCopyInto(out *TlsConfigs) { *out = *in if in.SecretRef != nil { in, out := &in.SecretRef, &out.SecretRef - *out = new(v1.LocalObjectReference) + *out = new(corev1.LocalObjectReference) **out = **in } out.SecretKeyNames = in.SecretKeyNames diff --git a/infra/feast-operator/bundle.Dockerfile b/infra/feast-operator/bundle.Dockerfile index 685b137b92a..e74b66d0189 100644 --- a/infra/feast-operator/bundle.Dockerfile +++ b/infra/feast-operator/bundle.Dockerfile @@ -6,7 +6,7 @@ LABEL operators.operatorframework.io.bundle.manifests.v1=manifests/ LABEL operators.operatorframework.io.bundle.metadata.v1=metadata/ LABEL operators.operatorframework.io.bundle.package.v1=feast-operator LABEL operators.operatorframework.io.bundle.channels.v1=alpha -LABEL operators.operatorframework.io.metrics.builder=operator-sdk-v1.38.0 +LABEL operators.operatorframework.io.metrics.builder=operator-sdk-v1.39.1 LABEL operators.operatorframework.io.metrics.mediatype.v1=metrics+v1 LABEL operators.operatorframework.io.metrics.project_layout=go.kubebuilder.io/v4 diff --git a/infra/feast-operator/bundle/manifests/feast-operator.clusterserviceversion.yaml b/infra/feast-operator/bundle/manifests/feast-operator.clusterserviceversion.yaml index 244f9565905..eeda78a3786 100644 --- a/infra/feast-operator/bundle/manifests/feast-operator.clusterserviceversion.yaml +++ b/infra/feast-operator/bundle/manifests/feast-operator.clusterserviceversion.yaml @@ -1,11 +1,11 @@ -apiVersion: operators.coreos.com/v1alpha1 +apiVersion: operators.coreos.com/v1 kind: ClusterServiceVersion metadata: annotations: alm-examples: |- [ { - "apiVersion": "feast.dev/v1alpha1", + "apiVersion": "feast.dev/v1", "kind": "FeatureStore", "metadata": { "name": "sample" @@ -15,7 +15,7 @@ metadata: } }, { - "apiVersion": "feast.dev/v1alpha1", + "apiVersion": "feast.dev/v1", "kind": "FeatureStore", "metadata": { "name": "sample-remote-servers" @@ -36,7 +36,7 @@ metadata: } }, { - "apiVersion": "feast.dev/v1alpha1", + "apiVersion": "feast.dev/v1", "kind": "FeatureStore", "metadata": { "name": "sample-ui" @@ -50,8 +50,8 @@ metadata: } ] capabilities: Basic Install - createdAt: "2025-11-13T20:26:23Z" - operators.operatorframework.io/builder: operator-sdk-v1.38.0 + createdAt: "2025-12-09T13:20:27Z" + operators.operatorframework.io/builder: operator-sdk-v1.39.1 operators.operatorframework.io/project_layout: go.kubebuilder.io/v4 name: feast-operator.v0.57.0 namespace: placeholder @@ -63,7 +63,7 @@ spec: displayName: Feature Store kind: FeatureStore name: featurestores.feast.dev - version: v1alpha1 + version: v1 description: Feast (Feature Store) is an open source feature store for machine learning. displayName: Feast Operator icon: diff --git a/infra/feast-operator/bundle/manifests/feast.dev_featurestores.yaml b/infra/feast-operator/bundle/manifests/feast.dev_featurestores.yaml index 3a99b2e7a70..87547e2cbe1 100644 --- a/infra/feast-operator/bundle/manifests/feast.dev_featurestores.yaml +++ b/infra/feast-operator/bundle/manifests/feast.dev_featurestores.yaml @@ -23,7 +23,7 @@ spec: - jsonPath: .metadata.creationTimestamp name: Age type: date - name: v1alpha1 + name: v1 schema: openAPIV3Schema: description: FeatureStore is the Schema for the featurestores API @@ -436,6 +436,13 @@ spec: description: podReplacementPolicy specifies when to create replacement Pods. type: string + podTemplateAnnotations: + additionalProperties: + type: string + description: |- + PodTemplateAnnotations are annotations to be applied to the CronJob's PodTemplate + metadata. + type: object suspend: description: suspend specifies whether the Job controller should create Pods or not. @@ -1642,6 +1649,21 @@ spec: description: RegistryFilePersistence configures the file-based persistence for the registry service properties: + cache_mode: + description: |- + CacheMode defines the registry cache update strategy. + Allowed values are "sync" and "thread". + enum: + - none + - sync + - thread + type: string + cache_ttl_seconds: + description: CacheTTLSeconds defines the TTL (in + seconds) for the registry cache. + format: int32 + minimum: 0 + type: integer path: type: string pvc: @@ -4420,6 +4442,13 @@ spec: description: podReplacementPolicy specifies when to create replacement Pods. type: string + podTemplateAnnotations: + additionalProperties: + type: string + description: |- + PodTemplateAnnotations are annotations to be applied to the CronJob's PodTemplate + metadata. + type: object suspend: description: suspend specifies whether the Job controller should create Pods or not. @@ -5647,6 +5676,21 @@ spec: the file-based persistence for the registry service properties: + cache_mode: + description: |- + CacheMode defines the registry cache update strategy. + Allowed values are "sync" and "thread". + enum: + - none + - sync + - thread + type: string + cache_ttl_seconds: + description: CacheTTLSeconds defines the TTL + (in seconds) for the registry cache. + format: int32 + minimum: 0 + type: integer path: type: string pvc: @@ -8136,6 +8180,35 @@ spec: storage: true subresources: status: {} + - name: v1alpha1 + schema: + openAPIV3Schema: + description: FeatureStore is the Schema for the featurestores API (deprecated, + use v1 instead) + properties: + apiVersion: + description: APIVersion defines the versioned schema of this representation + of an object. + type: string + kind: + description: Kind is a string value representing the REST resource this + object represents. + type: string + metadata: + type: object + spec: + description: FeatureStoreSpec defines the desired state of FeatureStore + type: object + x-kubernetes-preserve-unknown-fields: true + status: + description: FeatureStoreStatus defines the observed state of FeatureStore + type: object + x-kubernetes-preserve-unknown-fields: true + type: object + served: false + storage: false + subresources: + status: {} status: acceptedNames: kind: "" diff --git a/infra/feast-operator/bundle/metadata/annotations.yaml b/infra/feast-operator/bundle/metadata/annotations.yaml index 5e280a43e24..5844f36a4dd 100644 --- a/infra/feast-operator/bundle/metadata/annotations.yaml +++ b/infra/feast-operator/bundle/metadata/annotations.yaml @@ -5,7 +5,7 @@ annotations: operators.operatorframework.io.bundle.metadata.v1: metadata/ operators.operatorframework.io.bundle.package.v1: feast-operator operators.operatorframework.io.bundle.channels.v1: alpha - operators.operatorframework.io.metrics.builder: operator-sdk-v1.38.0 + operators.operatorframework.io.metrics.builder: operator-sdk-v1.39.1 operators.operatorframework.io.metrics.mediatype.v1: metrics+v1 operators.operatorframework.io.metrics.project_layout: go.kubebuilder.io/v4 diff --git a/infra/feast-operator/cmd/main.go b/infra/feast-operator/cmd/main.go index 82f0fd2eeca..57d465347da 100644 --- a/infra/feast-operator/cmd/main.go +++ b/infra/feast-operator/cmd/main.go @@ -37,7 +37,7 @@ import ( metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server" "sigs.k8s.io/controller-runtime/pkg/webhook" - feastdevv1alpha1 "github.com/feast-dev/feast/infra/feast-operator/api/v1alpha1" + feastdevv1 "github.com/feast-dev/feast/infra/feast-operator/api/v1" routev1 "github.com/openshift/api/route/v1" "github.com/feast-dev/feast/infra/feast-operator/internal/controller" @@ -53,7 +53,7 @@ var ( func init() { utilruntime.Must(clientgoscheme.AddToScheme(scheme)) utilruntime.Must(routev1.AddToScheme(scheme)) - utilruntime.Must(feastdevv1alpha1.AddToScheme(scheme)) + utilruntime.Must(feastdevv1.AddToScheme(scheme)) // +kubebuilder:scaffold:scheme } 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 fb27732d7d6..6ccaf3a5499 100644 --- a/infra/feast-operator/config/crd/bases/feast.dev_featurestores.yaml +++ b/infra/feast-operator/config/crd/bases/feast.dev_featurestores.yaml @@ -23,7 +23,7 @@ spec: - jsonPath: .metadata.creationTimestamp name: Age type: date - name: v1alpha1 + name: v1 schema: openAPIV3Schema: description: FeatureStore is the Schema for the featurestores API diff --git a/infra/feast-operator/config/crd/kustomization.yaml b/infra/feast-operator/config/crd/kustomization.yaml index fcdd0c61d94..33656019191 100644 --- a/infra/feast-operator/config/crd/kustomization.yaml +++ b/infra/feast-operator/config/crd/kustomization.yaml @@ -6,6 +6,12 @@ resources: #+kubebuilder:scaffold:crdkustomizeresource patches: +- path: patches/v1alpha1_deprecated.yaml + target: + group: apiextensions.k8s.io + version: v1 + kind: CustomResourceDefinition + name: featurestores.feast.dev # [WEBHOOK] To enable webhook, uncomment all the sections with [WEBHOOK] prefix. # patches here are for enabling the conversion webhook for each CRD #+kubebuilder:scaffold:crdkustomizewebhookpatch diff --git a/infra/feast-operator/config/crd/patches/v1alpha1_deprecated.yaml b/infra/feast-operator/config/crd/patches/v1alpha1_deprecated.yaml new file mode 100644 index 00000000000..1afb2cadba7 --- /dev/null +++ b/infra/feast-operator/config/crd/patches/v1alpha1_deprecated.yaml @@ -0,0 +1,45 @@ +# This patch adds v1alpha1 as a deprecated version to support migration from previous versions +# v1alpha1 is marked as served: true and storage: false to allow v1alpha1 resources to be created +# and served, but they are stored as v1 internally. This supports upgrade testing and migration. +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + name: featurestores.feast.dev +spec: + group: feast.dev + names: + kind: FeatureStore + listKind: FeatureStoreList + plural: featurestores + shortNames: + - feast + singular: featurestore + scope: Namespaced + versions: + - name: v1alpha1 + served: true + storage: false + schema: + openAPIV3Schema: + description: FeatureStore is the Schema for the featurestores API (deprecated, use v1 instead) + properties: + apiVersion: + description: APIVersion defines the versioned schema of this representation of an object. + type: string + kind: + description: Kind is a string value representing the REST resource this object represents. + type: string + metadata: + type: object + spec: + description: FeatureStoreSpec defines the desired state of FeatureStore + type: object + x-kubernetes-preserve-unknown-fields: true + status: + description: FeatureStoreStatus defines the observed state of FeatureStore + type: object + x-kubernetes-preserve-unknown-fields: true + type: object + subresources: + status: {} + diff --git a/infra/feast-operator/config/manifests/bases/feast-operator.clusterserviceversion.yaml b/infra/feast-operator/config/manifests/bases/feast-operator.clusterserviceversion.yaml index b9915a296a4..66b89c22e3e 100644 --- a/infra/feast-operator/config/manifests/bases/feast-operator.clusterserviceversion.yaml +++ b/infra/feast-operator/config/manifests/bases/feast-operator.clusterserviceversion.yaml @@ -1,4 +1,4 @@ -apiVersion: operators.coreos.com/v1alpha1 +apiVersion: operators.coreos.com/v1 kind: ClusterServiceVersion metadata: annotations: @@ -14,7 +14,7 @@ spec: displayName: Feature Store kind: FeatureStore name: featurestores.feast.dev - version: v1alpha1 + version: v1 description: Feast (Feature Store) is an open source feature store for machine learning. displayName: Feast Operator icon: diff --git a/infra/feast-operator/config/samples/kustomization.yaml b/infra/feast-operator/config/samples/kustomization.yaml index 12cfa7dad65..127bd5894b4 100644 --- a/infra/feast-operator/config/samples/kustomization.yaml +++ b/infra/feast-operator/config/samples/kustomization.yaml @@ -1,6 +1,6 @@ ## Append samples of your project ## resources: -- v1alpha1_featurestore.yaml -- v1alpha1_featurestore_with_ui.yaml -- v1alpha1_featurestore_all_remote_servers.yaml +- v1_featurestore.yaml +- v1_featurestore_with_ui.yaml +- v1_featurestore_all_remote_servers.yaml #+kubebuilder:scaffold:manifestskustomizesamples diff --git a/infra/feast-operator/config/samples/v1alpha1_featurestore.yaml b/infra/feast-operator/config/samples/v1_featurestore.yaml similarity index 71% rename from infra/feast-operator/config/samples/v1alpha1_featurestore.yaml rename to infra/feast-operator/config/samples/v1_featurestore.yaml index 3eb62850435..10c2a179e04 100644 --- a/infra/feast-operator/config/samples/v1alpha1_featurestore.yaml +++ b/infra/feast-operator/config/samples/v1_featurestore.yaml @@ -1,4 +1,4 @@ -apiVersion: feast.dev/v1alpha1 +apiVersion: feast.dev/v1 kind: FeatureStore metadata: name: sample diff --git a/infra/feast-operator/config/samples/v1alpha1_featurestore_all_openshift_non_tls.yaml b/infra/feast-operator/config/samples/v1_featurestore_all_openshift_non_tls.yaml similarity index 91% rename from infra/feast-operator/config/samples/v1alpha1_featurestore_all_openshift_non_tls.yaml rename to infra/feast-operator/config/samples/v1_featurestore_all_openshift_non_tls.yaml index 4e0ef943634..379671b4708 100644 --- a/infra/feast-operator/config/samples/v1alpha1_featurestore_all_openshift_non_tls.yaml +++ b/infra/feast-operator/config/samples/v1_featurestore_all_openshift_non_tls.yaml @@ -1,4 +1,4 @@ -apiVersion: feast.dev/v1alpha1 +apiVersion: feast.dev/v1 kind: FeatureStore metadata: name: sample-openshift-non-tls diff --git a/infra/feast-operator/config/samples/v1alpha1_featurestore_all_remote_servers.yaml b/infra/feast-operator/config/samples/v1_featurestore_all_remote_servers.yaml similarity index 90% rename from infra/feast-operator/config/samples/v1alpha1_featurestore_all_remote_servers.yaml rename to infra/feast-operator/config/samples/v1_featurestore_all_remote_servers.yaml index b30e93383cd..b7fc3a5cd7a 100644 --- a/infra/feast-operator/config/samples/v1alpha1_featurestore_all_remote_servers.yaml +++ b/infra/feast-operator/config/samples/v1_featurestore_all_remote_servers.yaml @@ -1,5 +1,5 @@ # runs an optional remote server container & creates a k8s service for each supported feast component -apiVersion: feast.dev/v1alpha1 +apiVersion: feast.dev/v1 kind: FeatureStore metadata: name: sample-remote-servers diff --git a/infra/feast-operator/config/samples/v1alpha1_featurestore_db_persistence.yaml b/infra/feast-operator/config/samples/v1_featurestore_db_persistence.yaml similarity index 97% rename from infra/feast-operator/config/samples/v1alpha1_featurestore_db_persistence.yaml rename to infra/feast-operator/config/samples/v1_featurestore_db_persistence.yaml index e66b7fc3283..3cbc374add0 100644 --- a/infra/feast-operator/config/samples/v1alpha1_featurestore_db_persistence.yaml +++ b/infra/feast-operator/config/samples/v1_featurestore_db_persistence.yaml @@ -30,7 +30,7 @@ stringData: user: ${POSTGRES_USER} password: ${POSTGRES_PASSWORD} --- -apiVersion: feast.dev/v1alpha1 +apiVersion: feast.dev/v1 kind: FeatureStore metadata: name: sample-db-persistence diff --git a/infra/feast-operator/config/samples/v1alpha1_featurestore_gcs.yaml b/infra/feast-operator/config/samples/v1_featurestore_gcs.yaml similarity index 97% rename from infra/feast-operator/config/samples/v1alpha1_featurestore_gcs.yaml rename to infra/feast-operator/config/samples/v1_featurestore_gcs.yaml index 7f2bf982657..7c15216a99a 100644 --- a/infra/feast-operator/config/samples/v1alpha1_featurestore_gcs.yaml +++ b/infra/feast-operator/config/samples/v1_featurestore_gcs.yaml @@ -19,7 +19,7 @@ stringData: xxxx xxxxx --- -apiVersion: feast.dev/v1alpha1 +apiVersion: feast.dev/v1 kind: FeatureStore metadata: name: gcs diff --git a/infra/feast-operator/config/samples/v1alpha1_featurestore_git.yaml b/infra/feast-operator/config/samples/v1_featurestore_git.yaml similarity index 87% rename from infra/feast-operator/config/samples/v1alpha1_featurestore_git.yaml rename to infra/feast-operator/config/samples/v1_featurestore_git.yaml index 7730ef88518..1ea5bcabb1b 100644 --- a/infra/feast-operator/config/samples/v1alpha1_featurestore_git.yaml +++ b/infra/feast-operator/config/samples/v1_featurestore_git.yaml @@ -1,4 +1,4 @@ -apiVersion: feast.dev/v1alpha1 +apiVersion: feast.dev/v1 kind: FeatureStore metadata: name: sample-git diff --git a/infra/feast-operator/config/samples/v1alpha1_featurestore_git_repopath.yaml b/infra/feast-operator/config/samples/v1_featurestore_git_repopath.yaml similarity index 88% rename from infra/feast-operator/config/samples/v1alpha1_featurestore_git_repopath.yaml rename to infra/feast-operator/config/samples/v1_featurestore_git_repopath.yaml index 6519e1bf429..61c2ee2efd6 100644 --- a/infra/feast-operator/config/samples/v1alpha1_featurestore_git_repopath.yaml +++ b/infra/feast-operator/config/samples/v1_featurestore_git_repopath.yaml @@ -1,4 +1,4 @@ -apiVersion: feast.dev/v1alpha1 +apiVersion: feast.dev/v1 kind: FeatureStore metadata: name: sample-git-repopath diff --git a/infra/feast-operator/config/samples/v1alpha1_featurestore_git_token.yaml b/infra/feast-operator/config/samples/v1_featurestore_git_token.yaml similarity index 92% rename from infra/feast-operator/config/samples/v1alpha1_featurestore_git_token.yaml rename to infra/feast-operator/config/samples/v1_featurestore_git_token.yaml index f16f503c8fb..44339bca56c 100644 --- a/infra/feast-operator/config/samples/v1alpha1_featurestore_git_token.yaml +++ b/infra/feast-operator/config/samples/v1_featurestore_git_token.yaml @@ -5,7 +5,7 @@ metadata: stringData: TOKEN: xxxxxxxxxxx --- -apiVersion: feast.dev/v1alpha1 +apiVersion: feast.dev/v1 kind: FeatureStore metadata: name: sample-git-token diff --git a/infra/feast-operator/config/samples/v1alpha1_featurestore_init.yaml b/infra/feast-operator/config/samples/v1_featurestore_init.yaml similarity index 81% rename from infra/feast-operator/config/samples/v1alpha1_featurestore_init.yaml rename to infra/feast-operator/config/samples/v1_featurestore_init.yaml index f2324eeab2d..a5ab73de981 100644 --- a/infra/feast-operator/config/samples/v1alpha1_featurestore_init.yaml +++ b/infra/feast-operator/config/samples/v1_featurestore_init.yaml @@ -1,4 +1,4 @@ -apiVersion: feast.dev/v1alpha1 +apiVersion: feast.dev/v1 kind: FeatureStore metadata: name: sample-init diff --git a/infra/feast-operator/config/samples/v1alpha1_featurestore_kubernetes_auth.yaml b/infra/feast-operator/config/samples/v1_featurestore_kubernetes_auth.yaml similarity index 91% rename from infra/feast-operator/config/samples/v1alpha1_featurestore_kubernetes_auth.yaml rename to infra/feast-operator/config/samples/v1_featurestore_kubernetes_auth.yaml index 33225b2edfb..a14b55d873d 100644 --- a/infra/feast-operator/config/samples/v1alpha1_featurestore_kubernetes_auth.yaml +++ b/infra/feast-operator/config/samples/v1_featurestore_kubernetes_auth.yaml @@ -1,4 +1,4 @@ -apiVersion: feast.dev/v1alpha1 +apiVersion: feast.dev/v1 kind: FeatureStore metadata: name: sample-kubernetes-auth diff --git a/infra/feast-operator/config/samples/v1alpha1_featurestore_objectstore_persistence.yaml b/infra/feast-operator/config/samples/v1_featurestore_objectstore_persistence.yaml similarity index 93% rename from infra/feast-operator/config/samples/v1alpha1_featurestore_objectstore_persistence.yaml rename to infra/feast-operator/config/samples/v1_featurestore_objectstore_persistence.yaml index 7be95578aed..b445598c9ac 100644 --- a/infra/feast-operator/config/samples/v1alpha1_featurestore_objectstore_persistence.yaml +++ b/infra/feast-operator/config/samples/v1_featurestore_objectstore_persistence.yaml @@ -1,4 +1,4 @@ -apiVersion: feast.dev/v1alpha1 +apiVersion: feast.dev/v1 kind: FeatureStore metadata: name: sample-s3-registry diff --git a/infra/feast-operator/config/samples/v1alpha1_featurestore_oidc_auth.yaml b/infra/feast-operator/config/samples/v1_featurestore_oidc_auth.yaml similarity index 92% rename from infra/feast-operator/config/samples/v1alpha1_featurestore_oidc_auth.yaml rename to infra/feast-operator/config/samples/v1_featurestore_oidc_auth.yaml index 54660a5c232..7ef676d0297 100644 --- a/infra/feast-operator/config/samples/v1alpha1_featurestore_oidc_auth.yaml +++ b/infra/feast-operator/config/samples/v1_featurestore_oidc_auth.yaml @@ -1,4 +1,4 @@ -apiVersion: feast.dev/v1alpha1 +apiVersion: feast.dev/v1 kind: FeatureStore metadata: name: sample-oidc-auth diff --git a/infra/feast-operator/config/samples/v1alpha1_featurestore_postgres_db_volumes_tls.yaml b/infra/feast-operator/config/samples/v1_featurestore_postgres_db_volumes_tls.yaml similarity index 98% rename from infra/feast-operator/config/samples/v1alpha1_featurestore_postgres_db_volumes_tls.yaml rename to infra/feast-operator/config/samples/v1_featurestore_postgres_db_volumes_tls.yaml index 61add153716..307a4a1e3aa 100644 --- a/infra/feast-operator/config/samples/v1alpha1_featurestore_postgres_db_volumes_tls.yaml +++ b/infra/feast-operator/config/samples/v1_featurestore_postgres_db_volumes_tls.yaml @@ -33,7 +33,7 @@ stringData: sslcert_path: /var/lib/postgresql/certs/tls.crt sslrootcert_path: /var/lib/postgresql/certs/ca.crt --- -apiVersion: feast.dev/v1alpha1 +apiVersion: feast.dev/v1 kind: FeatureStore metadata: name: sample-db-ssl diff --git a/infra/feast-operator/config/samples/v1alpha1_featurestore_postgres_tls_volumes_ca_env.yaml b/infra/feast-operator/config/samples/v1_featurestore_postgres_tls_volumes_ca_env.yaml similarity index 98% rename from infra/feast-operator/config/samples/v1alpha1_featurestore_postgres_tls_volumes_ca_env.yaml rename to infra/feast-operator/config/samples/v1_featurestore_postgres_tls_volumes_ca_env.yaml index 42e1ae4b4a6..07bd98f2662 100644 --- a/infra/feast-operator/config/samples/v1alpha1_featurestore_postgres_tls_volumes_ca_env.yaml +++ b/infra/feast-operator/config/samples/v1_featurestore_postgres_tls_volumes_ca_env.yaml @@ -34,7 +34,7 @@ stringData: sslcert_path: /var/lib/postgresql/certs/tls.crt sslrootcert_path: system --- -apiVersion: feast.dev/v1alpha1 +apiVersion: feast.dev/v1 kind: FeatureStore metadata: name: sample-db-ssl diff --git a/infra/feast-operator/config/samples/v1alpha1_featurestore_pvc_persistence.yaml b/infra/feast-operator/config/samples/v1_featurestore_pvc_persistence.yaml similarity index 97% rename from infra/feast-operator/config/samples/v1alpha1_featurestore_pvc_persistence.yaml rename to infra/feast-operator/config/samples/v1_featurestore_pvc_persistence.yaml index 15aa46c456c..679eadacde7 100644 --- a/infra/feast-operator/config/samples/v1alpha1_featurestore_pvc_persistence.yaml +++ b/infra/feast-operator/config/samples/v1_featurestore_pvc_persistence.yaml @@ -1,4 +1,4 @@ -apiVersion: feast.dev/v1alpha1 +apiVersion: feast.dev/v1 kind: FeatureStore metadata: name: sample-pvc-persistence diff --git a/infra/feast-operator/config/samples/v1alpha1_featurestore_services_loglevel.yaml b/infra/feast-operator/config/samples/v1_featurestore_services_loglevel.yaml similarity index 91% rename from infra/feast-operator/config/samples/v1alpha1_featurestore_services_loglevel.yaml rename to infra/feast-operator/config/samples/v1_featurestore_services_loglevel.yaml index e738e6352be..473beea200b 100644 --- a/infra/feast-operator/config/samples/v1alpha1_featurestore_services_loglevel.yaml +++ b/infra/feast-operator/config/samples/v1_featurestore_services_loglevel.yaml @@ -1,4 +1,4 @@ -apiVersion: feast.dev/v1alpha1 +apiVersion: feast.dev/v1 kind: FeatureStore metadata: name: sample-services-loglevel diff --git a/infra/feast-operator/config/samples/v1alpha1_featurestore_with_ui.yaml b/infra/feast-operator/config/samples/v1_featurestore_with_ui.yaml similarity index 76% rename from infra/feast-operator/config/samples/v1alpha1_featurestore_with_ui.yaml rename to infra/feast-operator/config/samples/v1_featurestore_with_ui.yaml index 78c25e677ff..65a88508629 100644 --- a/infra/feast-operator/config/samples/v1alpha1_featurestore_with_ui.yaml +++ b/infra/feast-operator/config/samples/v1_featurestore_with_ui.yaml @@ -1,4 +1,4 @@ -apiVersion: feast.dev/v1alpha1 +apiVersion: feast.dev/v1 kind: FeatureStore metadata: name: sample-ui diff --git a/infra/feast-operator/dist/install.yaml b/infra/feast-operator/dist/install.yaml index 5b2c0e002c9..be58aea29e5 100644 --- a/infra/feast-operator/dist/install.yaml +++ b/infra/feast-operator/dist/install.yaml @@ -24,17 +24,11 @@ spec: singular: featurestore scope: Namespaced versions: - - additionalPrinterColumns: - - jsonPath: .status.phase - name: Status - type: string - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha1 + - name: v1alpha1 schema: openAPIV3Schema: - description: FeatureStore is the Schema for the featurestores API + description: FeatureStore is the Schema for the featurestores API (deprecated, + use v1 instead) properties: apiVersion: description: APIVersion defines the versioned schema of this representation @@ -48,8176 +42,15 @@ spec: type: object spec: description: FeatureStoreSpec defines the desired state of FeatureStore - properties: - authz: - description: AuthzConfig defines the authorization settings for the - deployed Feast services. - properties: - kubernetes: - description: |- - KubernetesAuthz provides a way to define the authorization settings using Kubernetes RBAC resources. - https://kubernetes. - properties: - roles: - description: The Kubernetes RBAC roles to be deployed in the - same namespace of the FeatureStore. - items: - type: string - type: array - type: object - oidc: - description: |- - OidcAuthz defines the authorization settings for deployments using an Open ID Connect identity provider. - https://auth0. - properties: - secretRef: - description: |- - LocalObjectReference contains enough information to let you locate the - referenced object inside the same namespace. - 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 - required: - - secretRef - type: object - type: object - x-kubernetes-validations: - - message: One selection required between kubernetes or oidc. - rule: '[has(self.kubernetes), has(self.oidc)].exists_one(c, c)' - cronJob: - description: FeastCronJob defines a CronJob to execute against a Feature - Store deployment. - properties: - annotations: - additionalProperties: - type: string - description: Annotations to be added to the CronJob metadata. - type: object - concurrencyPolicy: - description: Specifies how to treat concurrent executions of a - Job. - type: string - containerConfigs: - description: CronJobContainerConfigs k8s container settings for - the CronJob - properties: - commands: - description: Array of commands to be executed (in order) against - a Feature Store deployment. - items: - type: string - type: array - env: - items: - description: EnvVar represents an environment variable present - in a Container. - properties: - name: - description: Name of the environment variable. Must - be a C_IDENTIFIER. - type: string - value: - description: |- - Variable references $(VAR_NAME) are expanded - using the previously defined environment variables in the container and - any - type: string - valueFrom: - description: Source for the environment variable's value. - Cannot be used if value is not empty. - properties: - configMapKeyRef: - description: Selects a key of a ConfigMap. - properties: - key: - description: The key to select. - type: string - name: - default: "" - description: |- - Name of the referent. - This field is effectively required, but due to backwards compatibility is - allowed to be empty. - type: string - optional: - description: Specify whether the ConfigMap or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - fieldRef: - description: 'Selects a field of the pod: supports - metadata.name, metadata.namespace, `metadata.labels['''']`, - `metadata.' - properties: - apiVersion: - description: Version of the schema the FieldPath - is written in terms of, defaults to "v1". - type: string - fieldPath: - description: Path of the field to select in - the specified API version. - type: string - required: - - fieldPath - type: object - x-kubernetes-map-type: atomic - resourceFieldRef: - description: |- - Selects a resource of the container: only resources limits and requests - (limits.cpu, limits.memory, limits. - properties: - containerName: - description: 'Container name: required for volumes, - optional for env vars' - type: string - divisor: - anyOf: - - type: integer - - type: string - description: Specifies the output format of - the exposed resources, defaults to "1" - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - resource: - description: 'Required: resource to select' - type: string - required: - - resource - type: object - x-kubernetes-map-type: atomic - secretKeyRef: - description: Selects a key of a secret in the pod's - namespace - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - default: "" - description: |- - Name of the referent. - This field is effectively required, but due to backwards compatibility is - allowed to be empty. - type: string - optional: - description: Specify whether the Secret or its - key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - required: - - name - type: object - type: array - envFrom: - items: - description: EnvFromSource represents the source of a set - of ConfigMaps - properties: - configMapRef: - description: The ConfigMap to select from - 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 - optional: - description: Specify whether the ConfigMap must - be defined - type: boolean - type: object - x-kubernetes-map-type: atomic - prefix: - description: An optional identifier to prepend to each - key in the ConfigMap. Must be a C_IDENTIFIER. - type: string - secretRef: - description: The Secret to select from - 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 - optional: - description: Specify whether the Secret must be - defined - type: boolean - type: object - x-kubernetes-map-type: atomic - type: object - type: array - image: - type: string - imagePullPolicy: - description: PullPolicy describes a policy for if/when to - pull a container image - type: string - nodeSelector: - additionalProperties: - type: string - type: object - resources: - description: ResourceRequirements describes the compute resource - requirements. - properties: - claims: - description: |- - Claims lists the names of resources, defined in spec.resourceClaims, - that are used by this container. - items: - description: ResourceClaim references one entry in PodSpec.ResourceClaims. - properties: - name: - description: |- - Name must match the name of one entry in pod.spec.resourceClaims of - the Pod where this field is used. - type: string - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - limits: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: |- - Limits describes the maximum amount of compute resources allowed. - More info: https://kubernetes. - type: object - requests: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: Requests describes the minimum amount of - compute resources required. - type: object - type: object - type: object - failedJobsHistoryLimit: - description: The number of failed finished jobs to retain. Value - must be non-negative integer. - format: int32 - type: integer - jobSpec: - description: Specification of the desired behavior of a job. - properties: - activeDeadlineSeconds: - description: |- - Specifies the duration in seconds relative to the startTime that the job - may be continuously active before the system tr - format: int64 - type: integer - backoffLimit: - description: Specifies the number of retries before marking - this job failed. - format: int32 - type: integer - backoffLimitPerIndex: - description: |- - Specifies the limit for the number of retries within an - index before marking this index as failed. - format: int32 - type: integer - completionMode: - description: |- - completionMode specifies how Pod completions are tracked. It can be - `NonIndexed` (default) or `Indexed`. - type: string - completions: - description: |- - Specifies the desired number of successfully finished pods the - job should be run with. - format: int32 - type: integer - maxFailedIndexes: - description: |- - Specifies the maximal number of failed indexes before marking the Job as - failed, when backoffLimitPerIndex is set. - format: int32 - type: integer - parallelism: - description: |- - Specifies the maximum desired number of pods the job should - run at any given time. - format: int32 - type: integer - podFailurePolicy: - description: Specifies the policy of handling failed pods. - properties: - rules: - description: A list of pod failure policy rules. The rules - are evaluated in order. - items: - description: PodFailurePolicyRule describes how a pod - failure is handled when the requirements are met. - properties: - action: - description: Specifies the action taken on a pod - failure when the requirements are satisfied. - type: string - onExitCodes: - description: Represents the requirement on the container - exit codes. - properties: - containerName: - description: |- - Restricts the check for exit codes to the container with the - specified name. - type: string - operator: - description: |- - Represents the relationship between the container exit code(s) and the - specified values. - type: string - values: - description: Specifies the set of values. - items: - format: int32 - type: integer - type: array - x-kubernetes-list-type: set - required: - - operator - - values - type: object - onPodConditions: - description: |- - Represents the requirement on the pod conditions. The requirement is represented - as a list of pod condition patterns. - items: - description: |- - PodFailurePolicyOnPodConditionsPattern describes a pattern for matching - an actual pod condition type. - properties: - status: - description: Specifies the required Pod condition - status. - type: string - type: - description: Specifies the required Pod condition - type. - type: string - required: - - status - - type - type: object - type: array - x-kubernetes-list-type: atomic - required: - - action - type: object - type: array - x-kubernetes-list-type: atomic - required: - - rules - type: object - podReplacementPolicy: - description: podReplacementPolicy specifies when to create - replacement Pods. - type: string - podTemplateAnnotations: - additionalProperties: - type: string - description: |- - PodTemplateAnnotations are annotations to be applied to the CronJob's PodTemplate - metadata. - type: object - suspend: - description: suspend specifies whether the Job controller - should create Pods or not. - type: boolean - ttlSecondsAfterFinished: - description: |- - ttlSecondsAfterFinished limits the lifetime of a Job that has finished - execution (either Complete or Failed). - format: int32 - type: integer - type: object - schedule: - description: The schedule in Cron format, see https://en.wikipedia.org/wiki/Cron. - type: string - startingDeadlineSeconds: - description: |- - Optional deadline in seconds for starting the job if it misses scheduled - time for any reason. - format: int64 - type: integer - successfulJobsHistoryLimit: - description: The number of successful finished jobs to retain. - Value must be non-negative integer. - format: int32 - type: integer - suspend: - description: |- - This flag tells the controller to suspend subsequent executions, it does - not apply to already started executions. - type: boolean - timeZone: - description: The time zone name for the given schedule, see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones. - type: string - type: object - feastProject: - description: FeastProject is the Feast project id. - pattern: ^[A-Za-z0-9][A-Za-z0-9_-]*$ - type: string - feastProjectDir: - description: FeastProjectDir defines how to create the feast project - directory. - properties: - git: - description: GitCloneOptions describes how a clone should be performed. - properties: - configs: - additionalProperties: - type: string - description: |- - Configs passed to git via `-c` - e.g. http.sslVerify: 'false' - OR 'url."https://api:\${TOKEN}@github.com/". - type: object - env: - items: - description: EnvVar represents an environment variable present - in a Container. - properties: - name: - description: Name of the environment variable. Must - be a C_IDENTIFIER. - type: string - value: - description: |- - Variable references $(VAR_NAME) are expanded - using the previously defined environment variables in the container and - any - type: string - valueFrom: - description: Source for the environment variable's value. - Cannot be used if value is not empty. - properties: - configMapKeyRef: - description: Selects a key of a ConfigMap. - properties: - key: - description: The key to select. - type: string - name: - default: "" - description: |- - Name of the referent. - This field is effectively required, but due to backwards compatibility is - allowed to be empty. - type: string - optional: - description: Specify whether the ConfigMap or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - fieldRef: - description: 'Selects a field of the pod: supports - metadata.name, metadata.namespace, `metadata.labels['''']`, - `metadata.' - properties: - apiVersion: - description: Version of the schema the FieldPath - is written in terms of, defaults to "v1". - type: string - fieldPath: - description: Path of the field to select in - the specified API version. - type: string - required: - - fieldPath - type: object - x-kubernetes-map-type: atomic - resourceFieldRef: - description: |- - Selects a resource of the container: only resources limits and requests - (limits.cpu, limits.memory, limits. - properties: - containerName: - description: 'Container name: required for volumes, - optional for env vars' - type: string - divisor: - anyOf: - - type: integer - - type: string - description: Specifies the output format of - the exposed resources, defaults to "1" - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - resource: - description: 'Required: resource to select' - type: string - required: - - resource - type: object - x-kubernetes-map-type: atomic - secretKeyRef: - description: Selects a key of a secret in the pod's - namespace - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - default: "" - description: |- - Name of the referent. - This field is effectively required, but due to backwards compatibility is - allowed to be empty. - type: string - optional: - description: Specify whether the Secret or its - key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - required: - - name - type: object - type: array - envFrom: - items: - description: EnvFromSource represents the source of a set - of ConfigMaps - properties: - configMapRef: - description: The ConfigMap to select from - 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 - optional: - description: Specify whether the ConfigMap must - be defined - type: boolean - type: object - x-kubernetes-map-type: atomic - prefix: - description: An optional identifier to prepend to each - key in the ConfigMap. Must be a C_IDENTIFIER. - type: string - secretRef: - description: The Secret to select from - 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 - optional: - description: Specify whether the Secret must be - defined - type: boolean - type: object - x-kubernetes-map-type: atomic - type: object - type: array - featureRepoPath: - description: FeatureRepoPath is the relative path to the feature - repo subdirectory. Default is 'feature_repo'. - type: string - ref: - description: Reference to a branch / tag / commit - type: string - url: - description: The repository URL to clone from. - type: string - required: - - url - type: object - x-kubernetes-validations: - - message: RepoPath must be a file name only, with no slashes. - rule: 'has(self.featureRepoPath) ? !self.featureRepoPath.startsWith(''/'') - : true' - init: - description: FeastInitOptions defines how to run a `feast init`. - properties: - minimal: - type: boolean - template: - description: Template for the created project - enum: - - local - - gcp - - aws - - snowflake - - spark - - postgres - - hbase - - cassandra - - hazelcast - - ikv - - couchbase - - clickhouse - type: string - type: object - type: object - x-kubernetes-validations: - - message: One selection required between init or git. - rule: '[has(self.git), has(self.init)].exists_one(c, c)' - services: - description: FeatureStoreServices defines the desired feast services. - An ephemeral onlineStore feature server is deployed by default. - properties: - deploymentStrategy: - description: DeploymentStrategy describes how to replace existing - pods with new ones. - properties: - rollingUpdate: - description: |- - Rolling update config params. Present only if DeploymentStrategyType = - RollingUpdate. - properties: - maxSurge: - anyOf: - - type: integer - - type: string - description: |- - The maximum number of pods that can be scheduled above the desired number of - pods. - x-kubernetes-int-or-string: true - maxUnavailable: - anyOf: - - type: integer - - type: string - description: The maximum number of pods that can be unavailable - during the update. - x-kubernetes-int-or-string: true - type: object - type: - description: Type of deployment. Can be "Recreate" or "RollingUpdate". - Default is RollingUpdate. - type: string - type: object - disableInitContainers: - description: Disable the 'feast repo initialization' initContainer - type: boolean - offlineStore: - description: OfflineStore configures the offline store service - properties: - persistence: - description: OfflineStorePersistence configures the persistence - settings for the offline store service - properties: - file: - description: OfflineStoreFilePersistence configures the - file-based persistence for the offline store service - properties: - pvc: - description: PvcConfig defines the settings for a - persistent file store based on PVCs. - properties: - create: - description: Settings for creating a new PVC - properties: - accessModes: - description: AccessModes k8s persistent volume - access modes. Defaults to ["ReadWriteOnce"]. - items: - type: string - type: array - resources: - description: Resources describes the storage - resource requirements for a volume. - properties: - limits: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: |- - Limits describes the maximum amount of compute resources allowed. - More info: https://kubernetes. - type: object - requests: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: Requests describes the minimum - amount of compute resources required. - type: object - type: object - storageClassName: - description: StorageClassName is the name - of an existing StorageClass to which this - persistent volume belongs. - type: string - type: object - x-kubernetes-validations: - - message: PvcCreate is immutable - rule: self == oldSelf - mountPath: - description: |- - MountPath within the container at which the volume should be mounted. - Must start by "/" and cannot contain ':'. - type: string - ref: - description: Reference to an existing field - 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 - required: - - mountPath - type: object - x-kubernetes-validations: - - message: One selection is required between ref and - create. - rule: '[has(self.ref), has(self.create)].exists_one(c, - c)' - - message: Mount path must start with '/' and must - not contain ':' - rule: self.mountPath.matches('^/[^:]*$') - type: - enum: - - file - - dask - - duckdb - type: string - type: object - store: - description: OfflineStoreDBStorePersistence configures - the DB store persistence for the offline store service - properties: - secretKeyName: - description: By default, the selected store "type" - is used as the SecretKeyName - type: string - secretRef: - description: Data store parameters should be placed - as-is from the "feature_store.yaml" under the secret - key. - 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: - description: Type of the persistence type you want - to use. - enum: - - snowflake.offline - - bigquery - - redshift - - spark - - postgres - - trino - - athena - - mssql - - couchbase.offline - - clickhouse - - ray - type: string - required: - - secretRef - - type - type: object - type: object - x-kubernetes-validations: - - message: One selection required between file or store. - rule: '[has(self.file), has(self.store)].exists_one(c, c)' - server: - description: Creates a remote offline server container - properties: - env: - items: - description: EnvVar represents an environment variable - present in a Container. - properties: - name: - description: Name of the environment variable. Must - be a C_IDENTIFIER. - type: string - value: - description: |- - Variable references $(VAR_NAME) are expanded - using the previously defined environment variables in the container and - any - type: string - valueFrom: - description: Source for the environment variable's - value. Cannot be used if value is not empty. - properties: - configMapKeyRef: - description: Selects a key of a ConfigMap. - properties: - key: - description: The key to select. - type: string - name: - default: "" - description: |- - Name of the referent. - This field is effectively required, but due to backwards compatibility is - allowed to be empty. - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - fieldRef: - description: 'Selects a field of the pod: supports - metadata.name, metadata.namespace, `metadata.labels['''']`, - `metadata.' - properties: - apiVersion: - description: Version of the schema the FieldPath - is written in terms of, defaults to "v1". - type: string - fieldPath: - description: Path of the field to select - in the specified API version. - type: string - required: - - fieldPath - type: object - x-kubernetes-map-type: atomic - resourceFieldRef: - description: |- - Selects a resource of the container: only resources limits and requests - (limits.cpu, limits.memory, limits. - properties: - containerName: - description: 'Container name: required for - volumes, optional for env vars' - type: string - divisor: - anyOf: - - type: integer - - type: string - description: Specifies the output format - of the exposed resources, defaults to - "1" - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - resource: - description: 'Required: resource to select' - type: string - required: - - resource - type: object - x-kubernetes-map-type: atomic - secretKeyRef: - description: Selects a key of a secret in the - pod's namespace - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - default: "" - description: |- - Name of the referent. - This field is effectively required, but due to backwards compatibility is - allowed to be empty. - type: string - optional: - description: Specify whether the Secret - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - required: - - name - type: object - type: array - envFrom: - items: - description: EnvFromSource represents the source of - a set of ConfigMaps - properties: - configMapRef: - description: The ConfigMap to select from - 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 - optional: - description: Specify whether the ConfigMap must - be defined - type: boolean - type: object - x-kubernetes-map-type: atomic - prefix: - description: An optional identifier to prepend to - each key in the ConfigMap. Must be a C_IDENTIFIER. - type: string - secretRef: - description: The Secret to select from - 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 - optional: - description: Specify whether the Secret must - be defined - type: boolean - type: object - x-kubernetes-map-type: atomic - type: object - type: array - image: - type: string - imagePullPolicy: - description: PullPolicy describes a policy for if/when - to pull a container image - type: string - logLevel: - description: |- - LogLevel sets the logging level for the server - Allowed values: "debug", "info", "warning", "error", "critical". - enum: - - debug - - info - - warning - - error - - critical - type: string - metrics: - description: Metrics exposes Prometheus-compatible metrics - for the Feast server when enabled. - type: boolean - nodeSelector: - additionalProperties: - type: string - type: object - resources: - description: ResourceRequirements describes the compute - resource requirements. - properties: - claims: - description: |- - Claims lists the names of resources, defined in spec.resourceClaims, - that are used by this container. - items: - description: ResourceClaim references one entry - in PodSpec.ResourceClaims. - properties: - name: - description: |- - Name must match the name of one entry in pod.spec.resourceClaims of - the Pod where this field is used. - type: string - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - limits: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: |- - Limits describes the maximum amount of compute resources allowed. - More info: https://kubernetes. - type: object - requests: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: Requests describes the minimum amount - of compute resources required. - type: object - type: object - tls: - description: TlsConfigs configures server TLS for a feast - service. - properties: - disable: - description: will disable TLS for the feast service. - useful in an openshift cluster, for example, where - TLS is configured by default - type: boolean - secretKeyNames: - description: SecretKeyNames defines the secret key - names for the TLS key and cert. - properties: - tlsCrt: - description: defaults to "tls.crt" - type: string - tlsKey: - description: defaults to "tls.key" - type: string - type: object - secretRef: - description: references the local k8s secret where - the TLS key and cert reside - 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 - x-kubernetes-validations: - - message: '`secretRef` required if `disable` is false.' - rule: '(!has(self.disable) || !self.disable) ? has(self.secretRef) - : true' - volumeMounts: - description: VolumeMounts defines the list of volumes - that should be mounted into the feast container. - items: - description: VolumeMount describes a mounting of a Volume - within a container. - properties: - mountPath: - description: |- - Path within the container at which the volume should be mounted. Must - not contain ':'. - type: string - mountPropagation: - description: |- - mountPropagation determines how mounts are propagated from the host - to container and the other way around. - type: string - name: - description: This must match the Name of a Volume. - type: string - readOnly: - description: |- - Mounted read-only if true, read-write otherwise (false or unspecified). - Defaults to false. - type: boolean - recursiveReadOnly: - description: |- - RecursiveReadOnly specifies whether read-only mounts should be handled - recursively. - type: string - subPath: - description: |- - Path within the volume from which the container's volume should be mounted. - Defaults to "" (volume's root). - type: string - subPathExpr: - description: Expanded path within the volume from - which the container's volume should be mounted. - type: string - required: - - mountPath - - name - type: object - type: array - type: object - type: object - onlineStore: - description: OnlineStore configures the online store service - properties: - persistence: - description: OnlineStorePersistence configures the persistence - settings for the online store service - properties: - file: - description: OnlineStoreFilePersistence configures the - file-based persistence for the online store service - properties: - path: - type: string - pvc: - description: PvcConfig defines the settings for a - persistent file store based on PVCs. - properties: - create: - description: Settings for creating a new PVC - properties: - accessModes: - description: AccessModes k8s persistent volume - access modes. Defaults to ["ReadWriteOnce"]. - items: - type: string - type: array - resources: - description: Resources describes the storage - resource requirements for a volume. - properties: - limits: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: |- - Limits describes the maximum amount of compute resources allowed. - More info: https://kubernetes. - type: object - requests: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: Requests describes the minimum - amount of compute resources required. - type: object - type: object - storageClassName: - description: StorageClassName is the name - of an existing StorageClass to which this - persistent volume belongs. - type: string - type: object - x-kubernetes-validations: - - message: PvcCreate is immutable - rule: self == oldSelf - mountPath: - description: |- - MountPath within the container at which the volume should be mounted. - Must start by "/" and cannot contain ':'. - type: string - ref: - description: Reference to an existing field - 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 - required: - - mountPath - type: object - x-kubernetes-validations: - - message: One selection is required between ref and - create. - rule: '[has(self.ref), has(self.create)].exists_one(c, - c)' - - message: Mount path must start with '/' and must - not contain ':' - rule: self.mountPath.matches('^/[^:]*$') - type: object - x-kubernetes-validations: - - message: Ephemeral stores must have absolute paths. - rule: '(!has(self.pvc) && has(self.path)) ? self.path.startsWith(''/'') - : true' - - message: PVC path must be a file name only, with no - slashes. - rule: '(has(self.pvc) && has(self.path)) ? !self.path.startsWith(''/'') - : true' - - message: Online store does not support S3 or GS buckets. - rule: 'has(self.path) ? !(self.path.startsWith(''s3://'') - || self.path.startsWith(''gs://'')) : true' - store: - description: OnlineStoreDBStorePersistence configures - the DB store persistence for the online store service - properties: - secretKeyName: - description: By default, the selected store "type" - is used as the SecretKeyName - type: string - secretRef: - description: Data store parameters should be placed - as-is from the "feature_store.yaml" under the secret - key. - 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: - description: Type of the persistence type you want - to use. - enum: - - snowflake.online - - redis - - ikv - - datastore - - dynamodb - - bigtable - - postgres - - cassandra - - mysql - - hazelcast - - singlestore - - hbase - - elasticsearch - - qdrant - - couchbase.online - - milvus - type: string - required: - - secretRef - - type - type: object - type: object - x-kubernetes-validations: - - message: One selection required between file or store. - rule: '[has(self.file), has(self.store)].exists_one(c, c)' - server: - description: Creates a feature server container - properties: - env: - items: - description: EnvVar represents an environment variable - present in a Container. - properties: - name: - description: Name of the environment variable. Must - be a C_IDENTIFIER. - type: string - value: - description: |- - Variable references $(VAR_NAME) are expanded - using the previously defined environment variables in the container and - any - type: string - valueFrom: - description: Source for the environment variable's - value. Cannot be used if value is not empty. - properties: - configMapKeyRef: - description: Selects a key of a ConfigMap. - properties: - key: - description: The key to select. - type: string - name: - default: "" - description: |- - Name of the referent. - This field is effectively required, but due to backwards compatibility is - allowed to be empty. - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - fieldRef: - description: 'Selects a field of the pod: supports - metadata.name, metadata.namespace, `metadata.labels['''']`, - `metadata.' - properties: - apiVersion: - description: Version of the schema the FieldPath - is written in terms of, defaults to "v1". - type: string - fieldPath: - description: Path of the field to select - in the specified API version. - type: string - required: - - fieldPath - type: object - x-kubernetes-map-type: atomic - resourceFieldRef: - description: |- - Selects a resource of the container: only resources limits and requests - (limits.cpu, limits.memory, limits. - properties: - containerName: - description: 'Container name: required for - volumes, optional for env vars' - type: string - divisor: - anyOf: - - type: integer - - type: string - description: Specifies the output format - of the exposed resources, defaults to - "1" - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - resource: - description: 'Required: resource to select' - type: string - required: - - resource - type: object - x-kubernetes-map-type: atomic - secretKeyRef: - description: Selects a key of a secret in the - pod's namespace - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - default: "" - description: |- - Name of the referent. - This field is effectively required, but due to backwards compatibility is - allowed to be empty. - type: string - optional: - description: Specify whether the Secret - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - required: - - name - type: object - type: array - envFrom: - items: - description: EnvFromSource represents the source of - a set of ConfigMaps - properties: - configMapRef: - description: The ConfigMap to select from - 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 - optional: - description: Specify whether the ConfigMap must - be defined - type: boolean - type: object - x-kubernetes-map-type: atomic - prefix: - description: An optional identifier to prepend to - each key in the ConfigMap. Must be a C_IDENTIFIER. - type: string - secretRef: - description: The Secret to select from - 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 - optional: - description: Specify whether the Secret must - be defined - type: boolean - type: object - x-kubernetes-map-type: atomic - type: object - type: array - image: - type: string - imagePullPolicy: - description: PullPolicy describes a policy for if/when - to pull a container image - type: string - logLevel: - description: |- - LogLevel sets the logging level for the server - Allowed values: "debug", "info", "warning", "error", "critical". - enum: - - debug - - info - - warning - - error - - critical - type: string - metrics: - description: Metrics exposes Prometheus-compatible metrics - for the Feast server when enabled. - type: boolean - nodeSelector: - additionalProperties: - type: string - type: object - resources: - description: ResourceRequirements describes the compute - resource requirements. - properties: - claims: - description: |- - Claims lists the names of resources, defined in spec.resourceClaims, - that are used by this container. - items: - description: ResourceClaim references one entry - in PodSpec.ResourceClaims. - properties: - name: - description: |- - Name must match the name of one entry in pod.spec.resourceClaims of - the Pod where this field is used. - type: string - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - limits: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: |- - Limits describes the maximum amount of compute resources allowed. - More info: https://kubernetes. - type: object - requests: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: Requests describes the minimum amount - of compute resources required. - type: object - type: object - tls: - description: TlsConfigs configures server TLS for a feast - service. - properties: - disable: - description: will disable TLS for the feast service. - useful in an openshift cluster, for example, where - TLS is configured by default - type: boolean - secretKeyNames: - description: SecretKeyNames defines the secret key - names for the TLS key and cert. - properties: - tlsCrt: - description: defaults to "tls.crt" - type: string - tlsKey: - description: defaults to "tls.key" - type: string - type: object - secretRef: - description: references the local k8s secret where - the TLS key and cert reside - 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 - x-kubernetes-validations: - - message: '`secretRef` required if `disable` is false.' - rule: '(!has(self.disable) || !self.disable) ? has(self.secretRef) - : true' - volumeMounts: - description: VolumeMounts defines the list of volumes - that should be mounted into the feast container. - items: - description: VolumeMount describes a mounting of a Volume - within a container. - properties: - mountPath: - description: |- - Path within the container at which the volume should be mounted. Must - not contain ':'. - type: string - mountPropagation: - description: |- - mountPropagation determines how mounts are propagated from the host - to container and the other way around. - type: string - name: - description: This must match the Name of a Volume. - type: string - readOnly: - description: |- - Mounted read-only if true, read-write otherwise (false or unspecified). - Defaults to false. - type: boolean - recursiveReadOnly: - description: |- - RecursiveReadOnly specifies whether read-only mounts should be handled - recursively. - type: string - subPath: - description: |- - Path within the volume from which the container's volume should be mounted. - Defaults to "" (volume's root). - type: string - subPathExpr: - description: Expanded path within the volume from - which the container's volume should be mounted. - type: string - required: - - mountPath - - name - type: object - type: array - type: object - type: object - registry: - description: Registry configures the registry service. One selection - is required. Local is the default setting. - properties: - local: - description: LocalRegistryConfig configures the registry service - properties: - persistence: - description: RegistryPersistence configures the persistence - settings for the registry service - properties: - file: - description: RegistryFilePersistence configures the - file-based persistence for the registry service - properties: - cache_mode: - description: |- - CacheMode defines the registry cache update strategy. - Allowed values are "sync" and "thread". - enum: - - none - - sync - - thread - type: string - cache_ttl_seconds: - description: CacheTTLSeconds defines the TTL (in - seconds) for the registry cache. - format: int32 - minimum: 0 - type: integer - path: - type: string - pvc: - description: PvcConfig defines the settings for - a persistent file store based on PVCs. - properties: - create: - description: Settings for creating a new PVC - properties: - accessModes: - description: AccessModes k8s persistent - volume access modes. Defaults to ["ReadWriteOnce"]. - items: - type: string - type: array - resources: - description: Resources describes the storage - resource requirements for a volume. - properties: - limits: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: |- - Limits describes the maximum amount of compute resources allowed. - More info: https://kubernetes. - type: object - requests: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: Requests describes the - minimum amount of compute resources - required. - type: object - type: object - storageClassName: - description: StorageClassName is the name - of an existing StorageClass to which - this persistent volume belongs. - type: string - type: object - x-kubernetes-validations: - - message: PvcCreate is immutable - rule: self == oldSelf - mountPath: - description: |- - MountPath within the container at which the volume should be mounted. - Must start by "/" and cannot contain ':'. - type: string - ref: - description: Reference to an existing field - 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 - required: - - mountPath - type: object - x-kubernetes-validations: - - message: One selection is required between ref - and create. - rule: '[has(self.ref), has(self.create)].exists_one(c, - c)' - - message: Mount path must start with '/' and - must not contain ':' - rule: self.mountPath.matches('^/[^:]*$') - s3_additional_kwargs: - additionalProperties: - type: string - type: object - type: object - x-kubernetes-validations: - - message: Registry files must use absolute paths - or be S3 ('s3://') or GS ('gs://') object store - URIs. - rule: '(!has(self.pvc) && has(self.path)) ? (self.path.startsWith(''/'') - || self.path.startsWith(''s3://'') || self.path.startsWith(''gs://'')) - : true' - - message: PVC path must be a file name only, with - no slashes. - rule: '(has(self.pvc) && has(self.path)) ? !self.path.startsWith(''/'') - : true' - - message: PVC persistence does not support S3 or - GS object store URIs. - rule: '(has(self.pvc) && has(self.path)) ? !(self.path.startsWith(''s3://'') - || self.path.startsWith(''gs://'')) : true' - - message: Additional S3 settings are available only - for S3 object store URIs. - rule: '(has(self.s3_additional_kwargs) && has(self.path)) - ? self.path.startsWith(''s3://'') : true' - store: - description: RegistryDBStorePersistence configures - the DB store persistence for the registry service - properties: - secretKeyName: - description: By default, the selected store "type" - is used as the SecretKeyName - type: string - secretRef: - description: Data store parameters should be placed - as-is from the "feature_store.yaml" under the - secret key. - 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: - description: Type of the persistence type you - want to use. - enum: - - sql - - snowflake.registry - type: string - required: - - secretRef - - type - type: object - type: object - x-kubernetes-validations: - - message: One selection required between file or store. - rule: '[has(self.file), has(self.store)].exists_one(c, - c)' - server: - description: Creates a registry server container - properties: - env: - items: - description: EnvVar represents an environment variable - present in a Container. - properties: - name: - description: Name of the environment variable. - Must be a C_IDENTIFIER. - type: string - value: - description: |- - Variable references $(VAR_NAME) are expanded - using the previously defined environment variables in the container and - any - type: string - valueFrom: - description: Source for the environment variable's - value. Cannot be used if value is not empty. - properties: - configMapKeyRef: - description: Selects a key of a ConfigMap. - properties: - key: - description: The key to select. - type: string - name: - default: "" - description: |- - Name of the referent. - This field is effectively required, but due to backwards compatibility is - allowed to be empty. - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - fieldRef: - description: 'Selects a field of the pod: - supports metadata.name, metadata.namespace, - `metadata.labels['''']`, `metadata.' - properties: - apiVersion: - description: Version of the schema the - FieldPath is written in terms of, - defaults to "v1". - type: string - fieldPath: - description: Path of the field to select - in the specified API version. - type: string - required: - - fieldPath - type: object - x-kubernetes-map-type: atomic - resourceFieldRef: - description: |- - Selects a resource of the container: only resources limits and requests - (limits.cpu, limits.memory, limits. - properties: - containerName: - description: 'Container name: required - for volumes, optional for env vars' - type: string - divisor: - anyOf: - - type: integer - - type: string - description: Specifies the output format - of the exposed resources, defaults - to "1" - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - resource: - description: 'Required: resource to - select' - type: string - required: - - resource - type: object - x-kubernetes-map-type: atomic - secretKeyRef: - description: Selects a key of a secret in - the pod's namespace - properties: - key: - description: The key of the secret to - select from. Must be a valid secret - key. - type: string - name: - default: "" - description: |- - Name of the referent. - This field is effectively required, but due to backwards compatibility is - allowed to be empty. - type: string - optional: - description: Specify whether the Secret - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - required: - - name - type: object - type: array - envFrom: - items: - description: EnvFromSource represents the source - of a set of ConfigMaps - properties: - configMapRef: - description: The ConfigMap to select from - 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 - optional: - description: Specify whether the ConfigMap - must be defined - type: boolean - type: object - x-kubernetes-map-type: atomic - prefix: - description: An optional identifier to prepend - to each key in the ConfigMap. Must be a C_IDENTIFIER. - type: string - secretRef: - description: The Secret to select from - 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 - optional: - description: Specify whether the Secret - must be defined - type: boolean - type: object - x-kubernetes-map-type: atomic - type: object - type: array - grpc: - description: Enable gRPC registry server. Defaults - to true if unset. - type: boolean - image: - type: string - imagePullPolicy: - description: PullPolicy describes a policy for if/when - to pull a container image - type: string - logLevel: - description: |- - LogLevel sets the logging level for the server - Allowed values: "debug", "info", "warning", "error", "critical". - enum: - - debug - - info - - warning - - error - - critical - type: string - metrics: - description: Metrics exposes Prometheus-compatible - metrics for the Feast server when enabled. - type: boolean - nodeSelector: - additionalProperties: - type: string - type: object - resources: - description: ResourceRequirements describes the compute - resource requirements. - properties: - claims: - description: |- - Claims lists the names of resources, defined in spec.resourceClaims, - that are used by this container. - items: - description: ResourceClaim references one entry - in PodSpec.ResourceClaims. - properties: - name: - description: |- - Name must match the name of one entry in pod.spec.resourceClaims of - the Pod where this field is used. - type: string - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - limits: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: |- - Limits describes the maximum amount of compute resources allowed. - More info: https://kubernetes. - type: object - requests: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: Requests describes the minimum amount - of compute resources required. - type: object - type: object - restAPI: - description: Enable REST API registry server. - type: boolean - tls: - description: TlsConfigs configures server TLS for - a feast service. - properties: - disable: - description: will disable TLS for the feast service. - useful in an openshift cluster, for example, - where TLS is configured by default - type: boolean - secretKeyNames: - description: SecretKeyNames defines the secret - key names for the TLS key and cert. - properties: - tlsCrt: - description: defaults to "tls.crt" - type: string - tlsKey: - description: defaults to "tls.key" - type: string - type: object - secretRef: - description: references the local k8s secret where - the TLS key and cert reside - 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 - x-kubernetes-validations: - - message: '`secretRef` required if `disable` is false.' - rule: '(!has(self.disable) || !self.disable) ? has(self.secretRef) - : true' - volumeMounts: - description: VolumeMounts defines the list of volumes - that should be mounted into the feast container. - items: - description: VolumeMount describes a mounting of - a Volume within a container. - properties: - mountPath: - description: |- - Path within the container at which the volume should be mounted. Must - not contain ':'. - type: string - mountPropagation: - description: |- - mountPropagation determines how mounts are propagated from the host - to container and the other way around. - type: string - name: - description: This must match the Name of a Volume. - type: string - readOnly: - description: |- - Mounted read-only if true, read-write otherwise (false or unspecified). - Defaults to false. - type: boolean - recursiveReadOnly: - description: |- - RecursiveReadOnly specifies whether read-only mounts should be handled - recursively. - type: string - subPath: - description: |- - Path within the volume from which the container's volume should be mounted. - Defaults to "" (volume's root). - type: string - subPathExpr: - description: Expanded path within the volume - from which the container's volume should be - mounted. - type: string - required: - - mountPath - - name - type: object - type: array - type: object - x-kubernetes-validations: - - message: At least one of restAPI or grpc must be true - rule: self.restAPI == true || self.grpc == true || !has(self.grpc) - type: object - remote: - description: RemoteRegistryConfig points to a remote feast - registry server. - properties: - feastRef: - description: Reference to an existing `FeatureStore` CR - in the same k8s cluster. - properties: - name: - description: Name of the FeatureStore - type: string - namespace: - description: Namespace of the FeatureStore - type: string - required: - - name - type: object - hostname: - description: Host address of the remote registry service - - :, e.g. `registry..svc.cluster.local:80` - type: string - tls: - description: TlsRemoteRegistryConfigs configures client - TLS for a remote feast registry. - properties: - certName: - description: defines the configmap key name for the - client TLS cert. - type: string - configMapRef: - description: references the local k8s configmap where - the TLS cert resides - 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 - required: - - certName - - configMapRef - type: object - type: object - x-kubernetes-validations: - - message: One selection required. - rule: '[has(self.hostname), has(self.feastRef)].exists_one(c, - c)' - type: object - x-kubernetes-validations: - - message: One selection required. - rule: '[has(self.local), has(self.remote)].exists_one(c, c)' - securityContext: - description: PodSecurityContext holds pod-level security attributes - and common container settings. - properties: - appArmorProfile: - description: appArmorProfile is the AppArmor options to use - by the containers in this pod. - properties: - localhostProfile: - description: localhostProfile indicates a profile loaded - on the node that should be used. - type: string - type: - description: type indicates which kind of AppArmor profile - will be applied. - type: string - required: - - type - type: object - fsGroup: - description: A special supplemental group that applies to - all containers in a pod. - format: int64 - type: integer - fsGroupChangePolicy: - description: |- - fsGroupChangePolicy defines behavior of changing ownership and permission of the volume - before being exposed inside Pod. - type: string - runAsGroup: - description: |- - The GID to run the entrypoint of the container process. - Uses runtime default if unset. - format: int64 - type: integer - runAsNonRoot: - description: Indicates that the container must run as a non-root - user. - type: boolean - runAsUser: - description: |- - The UID to run the entrypoint of the container process. - Defaults to user specified in image metadata if unspecified. - format: int64 - type: integer - seLinuxOptions: - description: The SELinux context to be applied to all containers. - properties: - level: - description: Level is SELinux level label that applies - to the container. - type: string - role: - description: Role is a SELinux role label that applies - to the container. - type: string - type: - description: Type is a SELinux type label that applies - to the container. - type: string - user: - description: User is a SELinux user label that applies - to the container. - type: string - type: object - seccompProfile: - description: |- - The seccomp options to use by the containers in this pod. - Note that this field cannot be set when spec.os. - properties: - localhostProfile: - description: localhostProfile indicates a profile defined - in a file on the node should be used. - type: string - type: - description: type indicates which kind of seccomp profile - will be applied. - type: string - required: - - type - type: object - supplementalGroups: - description: |- - A list of groups applied to the first process run in each container, in addition - to the container's primary GID, the fsG - items: - format: int64 - type: integer - type: array - x-kubernetes-list-type: atomic - sysctls: - description: Sysctls hold a list of namespaced sysctls used - for the pod. - items: - description: Sysctl defines a kernel parameter to be set - properties: - name: - description: Name of a property to set - type: string - value: - description: Value of a property to set - type: string - required: - - name - - value - type: object - type: array - x-kubernetes-list-type: atomic - windowsOptions: - description: The Windows specific settings applied to all - containers. - properties: - gmsaCredentialSpec: - description: |- - GMSACredentialSpec is where the GMSA admission webhook - (https://github. - type: string - gmsaCredentialSpecName: - description: GMSACredentialSpecName is the name of the - GMSA credential spec to use. - type: string - hostProcess: - description: HostProcess determines if a container should - be run as a 'Host Process' container. - type: boolean - runAsUserName: - description: The UserName in Windows to run the entrypoint - of the container process. - type: string - type: object - type: object - ui: - description: Creates a UI server container - properties: - env: - items: - description: EnvVar represents an environment variable present - in a Container. - properties: - name: - description: Name of the environment variable. Must - be a C_IDENTIFIER. - type: string - value: - description: |- - Variable references $(VAR_NAME) are expanded - using the previously defined environment variables in the container and - any - type: string - valueFrom: - description: Source for the environment variable's value. - Cannot be used if value is not empty. - properties: - configMapKeyRef: - description: Selects a key of a ConfigMap. - properties: - key: - description: The key to select. - type: string - name: - default: "" - description: |- - Name of the referent. - This field is effectively required, but due to backwards compatibility is - allowed to be empty. - type: string - optional: - description: Specify whether the ConfigMap or - its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - fieldRef: - description: 'Selects a field of the pod: supports - metadata.name, metadata.namespace, `metadata.labels['''']`, - `metadata.' - properties: - apiVersion: - description: Version of the schema the FieldPath - is written in terms of, defaults to "v1". - type: string - fieldPath: - description: Path of the field to select in - the specified API version. - type: string - required: - - fieldPath - type: object - x-kubernetes-map-type: atomic - resourceFieldRef: - description: |- - Selects a resource of the container: only resources limits and requests - (limits.cpu, limits.memory, limits. - properties: - containerName: - description: 'Container name: required for volumes, - optional for env vars' - type: string - divisor: - anyOf: - - type: integer - - type: string - description: Specifies the output format of - the exposed resources, defaults to "1" - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - resource: - description: 'Required: resource to select' - type: string - required: - - resource - type: object - x-kubernetes-map-type: atomic - secretKeyRef: - description: Selects a key of a secret in the pod's - namespace - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - default: "" - description: |- - Name of the referent. - This field is effectively required, but due to backwards compatibility is - allowed to be empty. - type: string - optional: - description: Specify whether the Secret or its - key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - required: - - name - type: object - type: array - envFrom: - items: - description: EnvFromSource represents the source of a set - of ConfigMaps - properties: - configMapRef: - description: The ConfigMap to select from - 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 - optional: - description: Specify whether the ConfigMap must - be defined - type: boolean - type: object - x-kubernetes-map-type: atomic - prefix: - description: An optional identifier to prepend to each - key in the ConfigMap. Must be a C_IDENTIFIER. - type: string - secretRef: - description: The Secret to select from - 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 - optional: - description: Specify whether the Secret must be - defined - type: boolean - type: object - x-kubernetes-map-type: atomic - type: object - type: array - image: - type: string - imagePullPolicy: - description: PullPolicy describes a policy for if/when to - pull a container image - type: string - logLevel: - description: |- - LogLevel sets the logging level for the server - Allowed values: "debug", "info", "warning", "error", "critical". - enum: - - debug - - info - - warning - - error - - critical - type: string - metrics: - description: Metrics exposes Prometheus-compatible metrics - for the Feast server when enabled. - type: boolean - nodeSelector: - additionalProperties: - type: string - type: object - resources: - description: ResourceRequirements describes the compute resource - requirements. - properties: - claims: - description: |- - Claims lists the names of resources, defined in spec.resourceClaims, - that are used by this container. - items: - description: ResourceClaim references one entry in PodSpec.ResourceClaims. - properties: - name: - description: |- - Name must match the name of one entry in pod.spec.resourceClaims of - the Pod where this field is used. - type: string - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - limits: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: |- - Limits describes the maximum amount of compute resources allowed. - More info: https://kubernetes. - type: object - requests: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: Requests describes the minimum amount of - compute resources required. - type: object - type: object - tls: - description: TlsConfigs configures server TLS for a feast - service. - properties: - disable: - description: will disable TLS for the feast service. useful - in an openshift cluster, for example, where TLS is configured - by default - type: boolean - secretKeyNames: - description: SecretKeyNames defines the secret key names - for the TLS key and cert. - properties: - tlsCrt: - description: defaults to "tls.crt" - type: string - tlsKey: - description: defaults to "tls.key" - type: string - type: object - secretRef: - description: references the local k8s secret where the - TLS key and cert reside - 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 - x-kubernetes-validations: - - message: '`secretRef` required if `disable` is false.' - rule: '(!has(self.disable) || !self.disable) ? has(self.secretRef) - : true' - volumeMounts: - description: VolumeMounts defines the list of volumes that - should be mounted into the feast container. - items: - description: VolumeMount describes a mounting of a Volume - within a container. - properties: - mountPath: - description: |- - Path within the container at which the volume should be mounted. Must - not contain ':'. - type: string - mountPropagation: - description: |- - mountPropagation determines how mounts are propagated from the host - to container and the other way around. - type: string - name: - description: This must match the Name of a Volume. - type: string - readOnly: - description: |- - Mounted read-only if true, read-write otherwise (false or unspecified). - Defaults to false. - type: boolean - recursiveReadOnly: - description: |- - RecursiveReadOnly specifies whether read-only mounts should be handled - recursively. - type: string - subPath: - description: |- - Path within the volume from which the container's volume should be mounted. - Defaults to "" (volume's root). - type: string - subPathExpr: - description: Expanded path within the volume from which - the container's volume should be mounted. - type: string - required: - - mountPath - - name - type: object - type: array - type: object - volumes: - description: Volumes specifies the volumes to mount in the FeatureStore - deployment. - items: - description: Volume represents a named volume in a pod that - may be accessed by any container in the pod. - properties: - awsElasticBlockStore: - description: |- - awsElasticBlockStore represents an AWS Disk resource that is attached to a - kubelet's host machine and then exposed to th - properties: - fsType: - description: fsType is the filesystem type of the volume - that you want to mount. - type: string - partition: - description: |- - partition is the partition in the volume that you want to mount. - If omitted, the default is to mount by volume name. - format: int32 - type: integer - readOnly: - description: |- - readOnly value true will force the readOnly setting in VolumeMounts. - More info: https://kubernetes. - type: boolean - volumeID: - description: |- - volumeID is unique ID of the persistent disk resource in AWS (Amazon EBS volume). - More info: https://kubernetes. - type: string - required: - - volumeID - type: object - azureDisk: - description: azureDisk represents an Azure Data Disk mount - on the host and bind mount to the pod. - properties: - cachingMode: - description: 'cachingMode is the Host Caching mode: - None, Read Only, Read Write.' - type: string - diskName: - description: diskName is the Name of the data disk in - the blob storage - type: string - diskURI: - description: diskURI is the URI of data disk in the - blob storage - type: string - fsType: - description: |- - fsType is Filesystem type to mount. - Must be a filesystem type supported by the host operating system. - Ex. - type: string - kind: - description: 'kind expected values are Shared: multiple - blob disks per storage account Dedicated: single - blob disk per storage accoun' - type: string - readOnly: - description: |- - readOnly Defaults to false (read/write). ReadOnly here will force - the ReadOnly setting in VolumeMounts. - type: boolean - required: - - diskName - - diskURI - type: object - azureFile: - description: azureFile represents an Azure File Service - mount on the host and bind mount to the pod. - properties: - readOnly: - description: |- - readOnly defaults to false (read/write). ReadOnly here will force - the ReadOnly setting in VolumeMounts. - type: boolean - secretName: - description: secretName is the name of secret that - contains Azure Storage Account Name and Key - type: string - shareName: - description: shareName is the azure share Name - type: string - required: - - secretName - - shareName - type: object - cephfs: - description: cephFS represents a Ceph FS mount on the host - that shares a pod's lifetime - properties: - monitors: - description: |- - monitors is Required: Monitors is a collection of Ceph monitors - More info: https://examples.k8s. - items: - type: string - type: array - x-kubernetes-list-type: atomic - path: - description: 'path is Optional: Used as the mounted - root, rather than the full Ceph tree, default is /' - type: string - readOnly: - description: |- - readOnly is Optional: Defaults to false (read/write). ReadOnly here will force - the ReadOnly setting in VolumeMounts. - type: boolean - secretFile: - description: 'secretFile is Optional: SecretFile is - the path to key ring for User, default is /etc/ceph/user.' - type: string - secretRef: - description: 'secretRef is Optional: SecretRef is reference - to the authentication secret for User, default is - empty.' - 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 - user: - description: |- - user is optional: User is the rados user name, default is admin - More info: https://examples.k8s. - type: string - required: - - monitors - type: object - cinder: - description: |- - cinder represents a cinder volume attached and mounted on kubelets host machine. - More info: https://examples.k8s. - properties: - fsType: - description: |- - fsType is the filesystem type to mount. - Must be a filesystem type supported by the host operating system. - type: string - readOnly: - description: |- - readOnly defaults to false (read/write). ReadOnly here will force - the ReadOnly setting in VolumeMounts. - type: boolean - secretRef: - description: |- - secretRef is optional: points to a secret object containing parameters used to connect - to OpenStack. - 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 - volumeID: - description: |- - volumeID used to identify the volume in cinder. - More info: https://examples.k8s.io/mysql-cinder-pd/README.md - type: string - required: - - volumeID - type: object - configMap: - description: configMap represents a configMap that should - populate this volume - properties: - defaultMode: - description: 'defaultMode is optional: mode bits used - to set permissions on created files by default.' - format: int32 - type: integer - items: - description: |- - items if unspecified, each key-value pair in the Data field of the referenced - ConfigMap will be projected into the volum - items: - description: Maps a string key to a path within a - volume. - properties: - key: - description: key is the key to project. - type: string - mode: - description: 'mode is Optional: mode bits used - to set permissions on this file.' - format: int32 - type: integer - path: - description: |- - path is the relative path of the file to map the key to. - May not be an absolute path. - type: string - required: - - key - - path - type: object - type: array - x-kubernetes-list-type: atomic - name: - default: "" - description: |- - Name of the referent. - This field is effectively required, but due to backwards compatibility is - allowed to be empty. - type: string - optional: - description: optional specify whether the ConfigMap - or its keys must be defined - type: boolean - type: object - x-kubernetes-map-type: atomic - csi: - description: csi (Container Storage Interface) represents - ephemeral storage that is handled by certain external - CSI drivers (Beta fea - properties: - driver: - description: driver is the name of the CSI driver that - handles this volume. - type: string - fsType: - description: fsType to mount. Ex. "ext4", "xfs", "ntfs". - type: string - nodePublishSecretRef: - description: |- - nodePublishSecretRef is a reference to the secret object containing - sensitive information to pass to the CSI driver to c - 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 - readOnly: - description: |- - readOnly specifies a read-only configuration for the volume. - Defaults to false (read/write). - type: boolean - volumeAttributes: - additionalProperties: - type: string - description: |- - volumeAttributes stores driver-specific properties that are passed to the CSI - driver. - type: object - required: - - driver - type: object - downwardAPI: - description: downwardAPI represents downward API about the - pod that should populate this volume - properties: - defaultMode: - description: 'Optional: mode bits to use on created - files by default.' - format: int32 - type: integer - items: - description: Items is a list of downward API volume - file - items: - description: DownwardAPIVolumeFile represents information - to create the file containing the pod field - properties: - fieldRef: - description: 'Required: Selects a field of the - pod: only annotations, labels, name, namespace - and uid are supported.' - properties: - apiVersion: - description: Version of the schema the FieldPath - is written in terms of, defaults to "v1". - type: string - fieldPath: - description: Path of the field to select in - the specified API version. - type: string - required: - - fieldPath - type: object - x-kubernetes-map-type: atomic - mode: - description: |- - Optional: mode bits used to set permissions on this file, must be an octal value - between 0000 and 0777 or a decimal valu - format: int32 - type: integer - path: - description: 'Required: Path is the relative - path name of the file to be created. Must not - be absolute or contain the ''..'' path.' - type: string - resourceFieldRef: - description: |- - Selects a resource of the container: only resources limits and requests - (limits.cpu, limits.memory, requests. - properties: - containerName: - description: 'Container name: required for - volumes, optional for env vars' - type: string - divisor: - anyOf: - - type: integer - - type: string - description: Specifies the output format of - the exposed resources, defaults to "1" - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - resource: - description: 'Required: resource to select' - type: string - required: - - resource - type: object - x-kubernetes-map-type: atomic - required: - - path - type: object - type: array - x-kubernetes-list-type: atomic - type: object - emptyDir: - description: |- - emptyDir represents a temporary directory that shares a pod's lifetime. - More info: https://kubernetes. - properties: - medium: - description: medium represents what type of storage - medium should back this directory. - type: string - sizeLimit: - anyOf: - - type: integer - - type: string - description: sizeLimit is the total amount of local - storage required for this EmptyDir volume. - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - type: object - ephemeral: - description: ephemeral represents a volume that is handled - by a cluster storage driver. - properties: - volumeClaimTemplate: - description: Will be used to create a stand-alone PVC - to provision the volume. - properties: - metadata: - description: |- - May contain labels and annotations that will be copied into the PVC - when creating it. - type: object - spec: - description: The specification for the PersistentVolumeClaim. - properties: - accessModes: - description: |- - accessModes contains the desired access modes the volume should have. - More info: https://kubernetes. - items: - type: string - type: array - x-kubernetes-list-type: atomic - dataSource: - description: |- - dataSource field can be used to specify either: - * An existing VolumeSnapshot object (snapshot.storage.k8s. - properties: - apiGroup: - description: APIGroup is the group for the - resource being referenced. - type: string - kind: - description: Kind is the type of resource - being referenced - type: string - name: - description: Name is the name of resource - being referenced - type: string - required: - - kind - - name - type: object - x-kubernetes-map-type: atomic - dataSourceRef: - description: |- - dataSourceRef specifies the object from which to populate the volume with data, if a non-empty - volume is desired. - properties: - apiGroup: - description: APIGroup is the group for the - resource being referenced. - type: string - kind: - description: Kind is the type of resource - being referenced - type: string - name: - description: Name is the name of resource - being referenced - type: string - namespace: - description: |- - Namespace is the namespace of resource being referenced - Note that when a namespace is specified, a gateway.networking. - type: string - required: - - kind - - name - type: object - resources: - description: resources represents the minimum - resources the volume should have. - properties: - limits: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: |- - Limits describes the maximum amount of compute resources allowed. - More info: https://kubernetes. - type: object - requests: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: Requests describes the minimum - amount of compute resources required. - type: object - type: object - selector: - description: selector is a label query over - volumes to consider for binding. - properties: - matchExpressions: - description: matchExpressions is a list - of label selector requirements. The requirements - are ANDed. - items: - description: |- - A label selector requirement is a selector that contains values, a key, and an operator that - relates the key and values. - properties: - key: - description: key is the label key - that the selector applies to. - type: string - operator: - description: |- - operator represents a key's relationship to a set of values. - Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: |- - values is an array of string values. If the operator is In or NotIn, - the values array must be non-empty. - items: - type: string - type: array - x-kubernetes-list-type: atomic - required: - - key - - operator - type: object - type: array - x-kubernetes-list-type: atomic - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} - pairs. - type: object - type: object - x-kubernetes-map-type: atomic - storageClassName: - description: |- - storageClassName is the name of the StorageClass required by the claim. - More info: https://kubernetes. - type: string - volumeAttributesClassName: - description: volumeAttributesClassName may be - used to set the VolumeAttributesClass used - by this claim. - type: string - volumeMode: - description: volumeMode defines what type of - volume is required by the claim. - type: string - volumeName: - description: volumeName is the binding reference - to the PersistentVolume backing this claim. - type: string - type: object - required: - - spec - type: object - type: object - fc: - description: fc represents a Fibre Channel resource that - is attached to a kubelet's host machine and then exposed - to the pod. - properties: - fsType: - description: |- - fsType is the filesystem type to mount. - Must be a filesystem type supported by the host operating system. - Ex. - type: string - lun: - description: 'lun is Optional: FC target lun number' - format: int32 - type: integer - readOnly: - description: |- - readOnly is Optional: Defaults to false (read/write). ReadOnly here will force - the ReadOnly setting in VolumeMounts. - type: boolean - targetWWNs: - description: 'targetWWNs is Optional: FC target worldwide - names (WWNs)' - items: - type: string - type: array - x-kubernetes-list-type: atomic - wwids: - description: "wwids Optional: FC volume world wide identifiers - (wwids)\nEither wwids or combination of targetWWNs - and lun must be set, " - items: - type: string - type: array - x-kubernetes-list-type: atomic - type: object - flexVolume: - description: |- - flexVolume represents a generic volume resource that is - provisioned/attached using an exec based plugin. - properties: - driver: - description: driver is the name of the driver to use - for this volume. - type: string - fsType: - description: |- - fsType is the filesystem type to mount. - Must be a filesystem type supported by the host operating system. - Ex. - type: string - options: - additionalProperties: - type: string - description: 'options is Optional: this field holds - extra command options if any.' - type: object - readOnly: - description: |- - readOnly is Optional: defaults to false (read/write). ReadOnly here will force - the ReadOnly setting in VolumeMounts. - type: boolean - secretRef: - description: |- - secretRef is Optional: secretRef is reference to the secret object containing - sensitive information to pass to the plugi - 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 - required: - - driver - type: object - flocker: - description: flocker represents a Flocker volume attached - to a kubelet's host machine. - properties: - datasetName: - description: |- - datasetName is Name of the dataset stored as metadata -> name on the dataset for Flocker - should be considered as depreca - type: string - datasetUUID: - description: datasetUUID is the UUID of the dataset. - This is unique identifier of a Flocker dataset - type: string - type: object - gcePersistentDisk: - description: |- - gcePersistentDisk represents a GCE Disk resource that is attached to a - kubelet's host machine and then exposed to the po - properties: - fsType: - description: fsType is filesystem type of the volume - that you want to mount. - type: string - partition: - description: |- - partition is the partition in the volume that you want to mount. - If omitted, the default is to mount by volume name. - format: int32 - type: integer - pdName: - description: |- - pdName is unique name of the PD resource in GCE. Used to identify the disk in GCE. - More info: https://kubernetes. - type: string - readOnly: - description: |- - readOnly here will force the ReadOnly setting in VolumeMounts. - Defaults to false. - More info: https://kubernetes. - type: boolean - required: - - pdName - type: object - gitRepo: - description: |- - gitRepo represents a git repository at a particular revision. - DEPRECATED: GitRepo is deprecated. - properties: - directory: - description: |- - directory is the target directory name. - Must not contain or start with '..'. If '. - type: string - repository: - description: repository is the URL - type: string - revision: - description: revision is the commit hash for the specified - revision. - type: string - required: - - repository - type: object - glusterfs: - description: |- - glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime. - More info: https://examples.k8s. - properties: - endpoints: - description: |- - endpoints is the endpoint name that details Glusterfs topology. - More info: https://examples.k8s. - type: string - path: - description: |- - path is the Glusterfs volume path. - More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod - type: string - readOnly: - description: |- - readOnly here will force the Glusterfs volume to be mounted with read-only permissions. - Defaults to false. - type: boolean - required: - - endpoints - - path - type: object - hostPath: - description: |- - hostPath represents a pre-existing file or directory on the host - machine that is directly exposed to the container. - properties: - path: - description: |- - path of the directory on the host. - If the path is a symlink, it will follow the link to the real path. - type: string - type: - description: |- - type for HostPath Volume - Defaults to "" - More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath - type: string - required: - - path - type: object - iscsi: - description: |- - iscsi represents an ISCSI Disk resource that is attached to a - kubelet's host machine and then exposed to the pod. - properties: - chapAuthDiscovery: - description: chapAuthDiscovery defines whether support - iSCSI Discovery CHAP authentication - type: boolean - chapAuthSession: - description: chapAuthSession defines whether support - iSCSI Session CHAP authentication - type: boolean - fsType: - description: fsType is the filesystem type of the volume - that you want to mount. - type: string - initiatorName: - description: initiatorName is the custom iSCSI Initiator - Name. - type: string - iqn: - description: iqn is the target iSCSI Qualified Name. - type: string - iscsiInterface: - description: |- - iscsiInterface is the interface Name that uses an iSCSI transport. - Defaults to 'default' (tcp). - type: string - lun: - description: lun represents iSCSI Target Lun number. - format: int32 - type: integer - portals: - description: portals is the iSCSI Target Portal List. - items: - type: string - type: array - x-kubernetes-list-type: atomic - readOnly: - description: |- - readOnly here will force the ReadOnly setting in VolumeMounts. - Defaults to false. - type: boolean - secretRef: - description: secretRef is the CHAP Secret for iSCSI - target and initiator authentication - 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 - targetPortal: - description: targetPortal is iSCSI Target Portal. - type: string - required: - - iqn - - lun - - targetPortal - type: object - name: - description: |- - name of the volume. - Must be a DNS_LABEL and unique within the pod. - More info: https://kubernetes. - type: string - nfs: - description: |- - nfs represents an NFS mount on the host that shares a pod's lifetime - More info: https://kubernetes. - properties: - path: - description: |- - path that is exported by the NFS server. - More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs - type: string - readOnly: - description: |- - readOnly here will force the NFS export to be mounted with read-only permissions. - Defaults to false. - type: boolean - server: - description: |- - server is the hostname or IP address of the NFS server. - More info: https://kubernetes. - type: string - required: - - path - - server - type: object - persistentVolumeClaim: - description: |- - persistentVolumeClaimVolumeSource represents a reference to a - PersistentVolumeClaim in the same namespace. - properties: - claimName: - description: claimName is the name of a PersistentVolumeClaim - in the same namespace as the pod using this volume. - type: string - readOnly: - description: |- - readOnly Will force the ReadOnly setting in VolumeMounts. - Default false. - type: boolean - required: - - claimName - type: object - photonPersistentDisk: - description: photonPersistentDisk represents a PhotonController - persistent disk attached and mounted on kubelets host - machine - properties: - fsType: - description: |- - fsType is the filesystem type to mount. - Must be a filesystem type supported by the host operating system. - Ex. - type: string - pdID: - description: pdID is the ID that identifies Photon Controller - persistent disk - type: string - required: - - pdID - type: object - portworxVolume: - description: portworxVolume represents a portworx volume - attached and mounted on kubelets host machine - properties: - fsType: - description: |- - fSType represents the filesystem type to mount - Must be a filesystem type supported by the host operating system. - Ex. - type: string - readOnly: - description: |- - readOnly defaults to false (read/write). ReadOnly here will force - the ReadOnly setting in VolumeMounts. - type: boolean - volumeID: - description: volumeID uniquely identifies a Portworx - volume - type: string - required: - - volumeID - type: object - projected: - description: projected items for all in one resources secrets, - configmaps, and downward API - properties: - defaultMode: - description: defaultMode are the mode bits used to set - permissions on created files by default. - format: int32 - type: integer - sources: - description: sources is the list of volume projections - items: - description: Projection that may be projected along - with other supported volume types - properties: - clusterTrustBundle: - description: ClusterTrustBundle allows a pod to - access the `.spec. - properties: - labelSelector: - description: |- - Select all ClusterTrustBundles that match this label selector. Only has - effect if signerName is set. - properties: - matchExpressions: - description: matchExpressions is a list - of label selector requirements. The - requirements are ANDed. - items: - description: |- - A label selector requirement is a selector that contains values, a key, and an operator that - relates the key and values. - properties: - key: - description: key is the label key - that the selector applies to. - type: string - operator: - description: |- - operator represents a key's relationship to a set of values. - Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: |- - values is an array of string values. If the operator is In or NotIn, - the values array must be non-empty. - items: - type: string - type: array - x-kubernetes-list-type: atomic - required: - - key - - operator - type: object - type: array - x-kubernetes-list-type: atomic - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} - pairs. - type: object - type: object - x-kubernetes-map-type: atomic - name: - description: |- - Select a single ClusterTrustBundle by object name. Mutually-exclusive - with signerName and labelSelector. - type: string - optional: - description: |- - If true, don't block pod startup if the referenced ClusterTrustBundle(s) - aren't available. - type: boolean - path: - description: Relative path from the volume - root to write the bundle. - type: string - signerName: - description: |- - Select all ClusterTrustBundles that match this signer name. - Mutually-exclusive with name. - type: string - required: - - path - type: object - configMap: - description: configMap information about the configMap - data to project - properties: - items: - description: |- - items if unspecified, each key-value pair in the Data field of the referenced - ConfigMap will be projected into the volum - items: - description: Maps a string key to a path - within a volume. - properties: - key: - description: key is the key to project. - type: string - mode: - description: 'mode is Optional: mode - bits used to set permissions on this - file.' - format: int32 - type: integer - path: - description: |- - path is the relative path of the file to map the key to. - May not be an absolute path. - type: string - required: - - key - - path - type: object - type: array - x-kubernetes-list-type: atomic - name: - default: "" - description: |- - Name of the referent. - This field is effectively required, but due to backwards compatibility is - allowed to be empty. - type: string - optional: - description: optional specify whether the - ConfigMap or its keys must be defined - type: boolean - type: object - x-kubernetes-map-type: atomic - downwardAPI: - description: downwardAPI information about the - downwardAPI data to project - properties: - items: - description: Items is a list of DownwardAPIVolume - file - items: - description: DownwardAPIVolumeFile represents - information to create the file containing - the pod field - properties: - fieldRef: - description: 'Required: Selects a field - of the pod: only annotations, labels, - name, namespace and uid are supported.' - properties: - apiVersion: - description: Version of the schema - the FieldPath is written in terms - of, defaults to "v1". - type: string - fieldPath: - description: Path of the field to - select in the specified API version. - type: string - required: - - fieldPath - type: object - x-kubernetes-map-type: atomic - mode: - description: |- - Optional: mode bits used to set permissions on this file, must be an octal value - between 0000 and 0777 or a decimal valu - format: int32 - type: integer - path: - description: 'Required: Path is the - relative path name of the file to - be created. Must not be absolute or - contain the ''..'' path.' - type: string - resourceFieldRef: - description: |- - Selects a resource of the container: only resources limits and requests - (limits.cpu, limits.memory, requests. - properties: - containerName: - description: 'Container name: required - for volumes, optional for env - vars' - type: string - divisor: - anyOf: - - type: integer - - type: string - description: Specifies the output - format of the exposed resources, - defaults to "1" - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - resource: - description: 'Required: resource - to select' - type: string - required: - - resource - type: object - x-kubernetes-map-type: atomic - required: - - path - type: object - type: array - x-kubernetes-list-type: atomic - type: object - secret: - description: secret information about the secret - data to project - properties: - items: - description: |- - items if unspecified, each key-value pair in the Data field of the referenced - Secret will be projected into the volume a - items: - description: Maps a string key to a path - within a volume. - properties: - key: - description: key is the key to project. - type: string - mode: - description: 'mode is Optional: mode - bits used to set permissions on this - file.' - format: int32 - type: integer - path: - description: |- - path is the relative path of the file to map the key to. - May not be an absolute path. - type: string - required: - - key - - path - type: object - type: array - x-kubernetes-list-type: atomic - name: - default: "" - description: |- - Name of the referent. - This field is effectively required, but due to backwards compatibility is - allowed to be empty. - type: string - optional: - description: optional field specify whether - the Secret or its key must be defined - type: boolean - type: object - x-kubernetes-map-type: atomic - serviceAccountToken: - description: serviceAccountToken is information - about the serviceAccountToken data to project - properties: - audience: - description: audience is the intended audience - of the token. - type: string - expirationSeconds: - description: |- - expirationSeconds is the requested duration of validity of the service - account token. - format: int64 - type: integer - path: - description: |- - path is the path relative to the mount point of the file to project the - token into. - type: string - required: - - path - type: object - type: object - type: array - x-kubernetes-list-type: atomic - type: object - quobyte: - description: quobyte represents a Quobyte mount on the host - that shares a pod's lifetime - properties: - group: - description: |- - group to map volume access to - Default is no group - type: string - readOnly: - description: |- - readOnly here will force the Quobyte volume to be mounted with read-only permissions. - Defaults to false. - type: boolean - registry: - description: |- - registry represents a single or multiple Quobyte Registry services - specified as a string as host:port pair (multiple ent - type: string - tenant: - description: |- - tenant owning the given Quobyte volume in the Backend - Used with dynamically provisioned Quobyte volumes, value is set by - type: string - user: - description: |- - user to map volume access to - Defaults to serivceaccount user - type: string - volume: - description: volume is a string that references an already - created Quobyte volume by name. - type: string - required: - - registry - - volume - type: object - rbd: - description: |- - rbd represents a Rados Block Device mount on the host that shares a pod's lifetime. - More info: https://examples.k8s. - properties: - fsType: - description: fsType is the filesystem type of the volume - that you want to mount. - type: string - image: - description: |- - image is the rados image name. - More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it - type: string - keyring: - description: |- - keyring is the path to key ring for RBDUser. - Default is /etc/ceph/keyring. - More info: https://examples.k8s. - type: string - monitors: - description: |- - monitors is a collection of Ceph monitors. - More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it - items: - type: string - type: array - x-kubernetes-list-type: atomic - pool: - description: |- - pool is the rados pool name. - Default is rbd. - More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it - type: string - readOnly: - description: |- - readOnly here will force the ReadOnly setting in VolumeMounts. - Defaults to false. - More info: https://examples.k8s. - type: boolean - secretRef: - description: |- - secretRef is name of the authentication secret for RBDUser. If provided - overrides keyring. - Default is nil. - 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 - user: - description: |- - user is the rados user name. - Default is admin. - More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it - type: string - required: - - image - - monitors - type: object - scaleIO: - description: scaleIO represents a ScaleIO persistent volume - attached and mounted on Kubernetes nodes. - properties: - fsType: - description: |- - fsType is the filesystem type to mount. - Must be a filesystem type supported by the host operating system. - Ex. - type: string - gateway: - description: gateway is the host address of the ScaleIO - API Gateway. - type: string - protectionDomain: - description: protectionDomain is the name of the ScaleIO - Protection Domain for the configured storage. - type: string - readOnly: - description: |- - readOnly Defaults to false (read/write). ReadOnly here will force - the ReadOnly setting in VolumeMounts. - type: boolean - secretRef: - description: |- - secretRef references to the secret for ScaleIO user and other - sensitive information. - 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 - sslEnabled: - description: sslEnabled Flag enable/disable SSL communication - with Gateway, default false - type: boolean - storageMode: - description: storageMode indicates whether the storage - for a volume should be ThickProvisioned or ThinProvisioned. - type: string - storagePool: - description: storagePool is the ScaleIO Storage Pool - associated with the protection domain. - type: string - system: - description: system is the name of the storage system - as configured in ScaleIO. - type: string - volumeName: - description: |- - volumeName is the name of a volume already created in the ScaleIO system - that is associated with this volume source. - type: string - required: - - gateway - - secretRef - - system - type: object - secret: - description: |- - secret represents a secret that should populate this volume. - More info: https://kubernetes. - properties: - defaultMode: - description: 'defaultMode is Optional: mode bits used - to set permissions on created files by default.' - format: int32 - type: integer - items: - description: |- - items If unspecified, each key-value pair in the Data field of the referenced - Secret will be projected into the volume a - items: - description: Maps a string key to a path within a - volume. - properties: - key: - description: key is the key to project. - type: string - mode: - description: 'mode is Optional: mode bits used - to set permissions on this file.' - format: int32 - type: integer - path: - description: |- - path is the relative path of the file to map the key to. - May not be an absolute path. - type: string - required: - - key - - path - type: object - type: array - x-kubernetes-list-type: atomic - optional: - description: optional field specify whether the Secret - or its keys must be defined - type: boolean - secretName: - description: |- - secretName is the name of the secret in the pod's namespace to use. - More info: https://kubernetes. - type: string - type: object - storageos: - description: storageOS represents a StorageOS volume attached - and mounted on Kubernetes nodes. - properties: - fsType: - description: |- - fsType is the filesystem type to mount. - Must be a filesystem type supported by the host operating system. - Ex. - type: string - readOnly: - description: |- - readOnly defaults to false (read/write). ReadOnly here will force - the ReadOnly setting in VolumeMounts. - type: boolean - secretRef: - description: |- - secretRef specifies the secret to use for obtaining the StorageOS API - credentials. - 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 - volumeName: - description: |- - volumeName is the human-readable name of the StorageOS volume. Volume - names are only unique within a namespace. - type: string - volumeNamespace: - description: volumeNamespace specifies the scope of - the volume within StorageOS. - type: string - type: object - vsphereVolume: - description: vsphereVolume represents a vSphere volume attached - and mounted on kubelets host machine - properties: - fsType: - description: |- - fsType is filesystem type to mount. - Must be a filesystem type supported by the host operating system. - Ex. - type: string - storagePolicyID: - description: storagePolicyID is the storage Policy Based - Management (SPBM) profile ID associated with the StoragePolicyName. - type: string - storagePolicyName: - description: storagePolicyName is the storage Policy - Based Management (SPBM) profile name. - type: string - volumePath: - description: volumePath is the path that identifies - vSphere volume vmdk - type: string - required: - - volumePath - type: object - required: - - name - type: object - type: array - type: object - required: - - feastProject type: object + x-kubernetes-preserve-unknown-fields: true status: description: FeatureStoreStatus defines the observed state of FeatureStore - properties: - applied: - description: Shows the currently applied feast configuration, including - any pertinent defaults - properties: - authz: - description: AuthzConfig defines the authorization settings for - the deployed Feast services. - properties: - kubernetes: - description: |- - KubernetesAuthz provides a way to define the authorization settings using Kubernetes RBAC resources. - https://kubernetes. - properties: - roles: - description: The Kubernetes RBAC roles to be deployed - in the same namespace of the FeatureStore. - items: - type: string - type: array - type: object - oidc: - description: |- - OidcAuthz defines the authorization settings for deployments using an Open ID Connect identity provider. - https://auth0. - properties: - secretRef: - description: |- - LocalObjectReference contains enough information to let you locate the - referenced object inside the same namespace. - 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 - required: - - secretRef - type: object - type: object - x-kubernetes-validations: - - message: One selection required between kubernetes or oidc. - rule: '[has(self.kubernetes), has(self.oidc)].exists_one(c, - c)' - cronJob: - description: FeastCronJob defines a CronJob to execute against - a Feature Store deployment. - properties: - annotations: - additionalProperties: - type: string - description: Annotations to be added to the CronJob metadata. - type: object - concurrencyPolicy: - description: Specifies how to treat concurrent executions - of a Job. - type: string - containerConfigs: - description: CronJobContainerConfigs k8s container settings - for the CronJob - properties: - commands: - description: Array of commands to be executed (in order) - against a Feature Store deployment. - items: - type: string - type: array - env: - items: - description: EnvVar represents an environment variable - present in a Container. - properties: - name: - description: Name of the environment variable. Must - be a C_IDENTIFIER. - type: string - value: - description: |- - Variable references $(VAR_NAME) are expanded - using the previously defined environment variables in the container and - any - type: string - valueFrom: - description: Source for the environment variable's - value. Cannot be used if value is not empty. - properties: - configMapKeyRef: - description: Selects a key of a ConfigMap. - properties: - key: - description: The key to select. - type: string - name: - default: "" - description: |- - Name of the referent. - This field is effectively required, but due to backwards compatibility is - allowed to be empty. - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - fieldRef: - description: 'Selects a field of the pod: supports - metadata.name, metadata.namespace, `metadata.labels['''']`, - `metadata.' - properties: - apiVersion: - description: Version of the schema the FieldPath - is written in terms of, defaults to "v1". - type: string - fieldPath: - description: Path of the field to select - in the specified API version. - type: string - required: - - fieldPath - type: object - x-kubernetes-map-type: atomic - resourceFieldRef: - description: |- - Selects a resource of the container: only resources limits and requests - (limits.cpu, limits.memory, limits. - properties: - containerName: - description: 'Container name: required for - volumes, optional for env vars' - type: string - divisor: - anyOf: - - type: integer - - type: string - description: Specifies the output format - of the exposed resources, defaults to - "1" - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - resource: - description: 'Required: resource to select' - type: string - required: - - resource - type: object - x-kubernetes-map-type: atomic - secretKeyRef: - description: Selects a key of a secret in the - pod's namespace - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - default: "" - description: |- - Name of the referent. - This field is effectively required, but due to backwards compatibility is - allowed to be empty. - type: string - optional: - description: Specify whether the Secret - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - required: - - name - type: object - type: array - envFrom: - items: - description: EnvFromSource represents the source of - a set of ConfigMaps - properties: - configMapRef: - description: The ConfigMap to select from - 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 - optional: - description: Specify whether the ConfigMap must - be defined - type: boolean - type: object - x-kubernetes-map-type: atomic - prefix: - description: An optional identifier to prepend to - each key in the ConfigMap. Must be a C_IDENTIFIER. - type: string - secretRef: - description: The Secret to select from - 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 - optional: - description: Specify whether the Secret must - be defined - type: boolean - type: object - x-kubernetes-map-type: atomic - type: object - type: array - image: - type: string - imagePullPolicy: - description: PullPolicy describes a policy for if/when - to pull a container image - type: string - nodeSelector: - additionalProperties: - type: string - type: object - resources: - description: ResourceRequirements describes the compute - resource requirements. - properties: - claims: - description: |- - Claims lists the names of resources, defined in spec.resourceClaims, - that are used by this container. - items: - description: ResourceClaim references one entry - in PodSpec.ResourceClaims. - properties: - name: - description: |- - Name must match the name of one entry in pod.spec.resourceClaims of - the Pod where this field is used. - type: string - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - limits: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: |- - Limits describes the maximum amount of compute resources allowed. - More info: https://kubernetes. - type: object - requests: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: Requests describes the minimum amount - of compute resources required. - type: object - type: object - type: object - failedJobsHistoryLimit: - description: The number of failed finished jobs to retain. - Value must be non-negative integer. - format: int32 - type: integer - jobSpec: - description: Specification of the desired behavior of a job. - properties: - activeDeadlineSeconds: - description: |- - Specifies the duration in seconds relative to the startTime that the job - may be continuously active before the system tr - format: int64 - type: integer - backoffLimit: - description: Specifies the number of retries before marking - this job failed. - format: int32 - type: integer - backoffLimitPerIndex: - description: |- - Specifies the limit for the number of retries within an - index before marking this index as failed. - format: int32 - type: integer - completionMode: - description: |- - completionMode specifies how Pod completions are tracked. It can be - `NonIndexed` (default) or `Indexed`. - type: string - completions: - description: |- - Specifies the desired number of successfully finished pods the - job should be run with. - format: int32 - type: integer - maxFailedIndexes: - description: |- - Specifies the maximal number of failed indexes before marking the Job as - failed, when backoffLimitPerIndex is set. - format: int32 - type: integer - parallelism: - description: |- - Specifies the maximum desired number of pods the job should - run at any given time. - format: int32 - type: integer - podFailurePolicy: - description: Specifies the policy of handling failed pods. - properties: - rules: - description: A list of pod failure policy rules. The - rules are evaluated in order. - items: - description: PodFailurePolicyRule describes how - a pod failure is handled when the requirements - are met. - properties: - action: - description: Specifies the action taken on a - pod failure when the requirements are satisfied. - type: string - onExitCodes: - description: Represents the requirement on the - container exit codes. - properties: - containerName: - description: |- - Restricts the check for exit codes to the container with the - specified name. - type: string - operator: - description: |- - Represents the relationship between the container exit code(s) and the - specified values. - type: string - values: - description: Specifies the set of values. - items: - format: int32 - type: integer - type: array - x-kubernetes-list-type: set - required: - - operator - - values - type: object - onPodConditions: - description: |- - Represents the requirement on the pod conditions. The requirement is represented - as a list of pod condition patterns. - items: - description: |- - PodFailurePolicyOnPodConditionsPattern describes a pattern for matching - an actual pod condition type. - properties: - status: - description: Specifies the required Pod - condition status. - type: string - type: - description: Specifies the required Pod - condition type. - type: string - required: - - status - - type - type: object - type: array - x-kubernetes-list-type: atomic - required: - - action - type: object - type: array - x-kubernetes-list-type: atomic - required: - - rules - type: object - podReplacementPolicy: - description: podReplacementPolicy specifies when to create - replacement Pods. - type: string - podTemplateAnnotations: - additionalProperties: - type: string - description: |- - PodTemplateAnnotations are annotations to be applied to the CronJob's PodTemplate - metadata. - type: object - suspend: - description: suspend specifies whether the Job controller - should create Pods or not. - type: boolean - ttlSecondsAfterFinished: - description: |- - ttlSecondsAfterFinished limits the lifetime of a Job that has finished - execution (either Complete or Failed). - format: int32 - type: integer - type: object - schedule: - description: The schedule in Cron format, see https://en.wikipedia.org/wiki/Cron. - type: string - startingDeadlineSeconds: - description: |- - Optional deadline in seconds for starting the job if it misses scheduled - time for any reason. - format: int64 - type: integer - successfulJobsHistoryLimit: - description: The number of successful finished jobs to retain. - Value must be non-negative integer. - format: int32 - type: integer - suspend: - description: |- - This flag tells the controller to suspend subsequent executions, it does - not apply to already started executions. - type: boolean - timeZone: - description: The time zone name for the given schedule, see - https://en.wikipedia.org/wiki/List_of_tz_database_time_zones. - type: string - type: object - feastProject: - description: FeastProject is the Feast project id. - pattern: ^[A-Za-z0-9][A-Za-z0-9_-]*$ - type: string - feastProjectDir: - description: FeastProjectDir defines how to create the feast project - directory. - properties: - git: - description: GitCloneOptions describes how a clone should - be performed. - properties: - configs: - additionalProperties: - type: string - description: |- - Configs passed to git via `-c` - e.g. http.sslVerify: 'false' - OR 'url."https://api:\${TOKEN}@github.com/". - type: object - env: - items: - description: EnvVar represents an environment variable - present in a Container. - properties: - name: - description: Name of the environment variable. Must - be a C_IDENTIFIER. - type: string - value: - description: |- - Variable references $(VAR_NAME) are expanded - using the previously defined environment variables in the container and - any - type: string - valueFrom: - description: Source for the environment variable's - value. Cannot be used if value is not empty. - properties: - configMapKeyRef: - description: Selects a key of a ConfigMap. - properties: - key: - description: The key to select. - type: string - name: - default: "" - description: |- - Name of the referent. - This field is effectively required, but due to backwards compatibility is - allowed to be empty. - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - fieldRef: - description: 'Selects a field of the pod: supports - metadata.name, metadata.namespace, `metadata.labels['''']`, - `metadata.' - properties: - apiVersion: - description: Version of the schema the FieldPath - is written in terms of, defaults to "v1". - type: string - fieldPath: - description: Path of the field to select - in the specified API version. - type: string - required: - - fieldPath - type: object - x-kubernetes-map-type: atomic - resourceFieldRef: - description: |- - Selects a resource of the container: only resources limits and requests - (limits.cpu, limits.memory, limits. - properties: - containerName: - description: 'Container name: required for - volumes, optional for env vars' - type: string - divisor: - anyOf: - - type: integer - - type: string - description: Specifies the output format - of the exposed resources, defaults to - "1" - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - resource: - description: 'Required: resource to select' - type: string - required: - - resource - type: object - x-kubernetes-map-type: atomic - secretKeyRef: - description: Selects a key of a secret in the - pod's namespace - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - default: "" - description: |- - Name of the referent. - This field is effectively required, but due to backwards compatibility is - allowed to be empty. - type: string - optional: - description: Specify whether the Secret - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - required: - - name - type: object - type: array - envFrom: - items: - description: EnvFromSource represents the source of - a set of ConfigMaps - properties: - configMapRef: - description: The ConfigMap to select from - 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 - optional: - description: Specify whether the ConfigMap must - be defined - type: boolean - type: object - x-kubernetes-map-type: atomic - prefix: - description: An optional identifier to prepend to - each key in the ConfigMap. Must be a C_IDENTIFIER. - type: string - secretRef: - description: The Secret to select from - 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 - optional: - description: Specify whether the Secret must - be defined - type: boolean - type: object - x-kubernetes-map-type: atomic - type: object - type: array - featureRepoPath: - description: FeatureRepoPath is the relative path to the - feature repo subdirectory. Default is 'feature_repo'. - type: string - ref: - description: Reference to a branch / tag / commit - type: string - url: - description: The repository URL to clone from. - type: string - required: - - url - type: object - x-kubernetes-validations: - - message: RepoPath must be a file name only, with no slashes. - rule: 'has(self.featureRepoPath) ? !self.featureRepoPath.startsWith(''/'') - : true' - init: - description: FeastInitOptions defines how to run a `feast - init`. - properties: - minimal: - type: boolean - template: - description: Template for the created project - enum: - - local - - gcp - - aws - - snowflake - - spark - - postgres - - hbase - - cassandra - - hazelcast - - ikv - - couchbase - - clickhouse - type: string - type: object - type: object - x-kubernetes-validations: - - message: One selection required between init or git. - rule: '[has(self.git), has(self.init)].exists_one(c, c)' - services: - description: FeatureStoreServices defines the desired feast services. - An ephemeral onlineStore feature server is deployed by default. - properties: - deploymentStrategy: - description: DeploymentStrategy describes how to replace existing - pods with new ones. - properties: - rollingUpdate: - description: |- - Rolling update config params. Present only if DeploymentStrategyType = - RollingUpdate. - properties: - maxSurge: - anyOf: - - type: integer - - type: string - description: |- - The maximum number of pods that can be scheduled above the desired number of - pods. - x-kubernetes-int-or-string: true - maxUnavailable: - anyOf: - - type: integer - - type: string - description: The maximum number of pods that can be - unavailable during the update. - x-kubernetes-int-or-string: true - type: object - type: - description: Type of deployment. Can be "Recreate" or - "RollingUpdate". Default is RollingUpdate. - type: string - type: object - disableInitContainers: - description: Disable the 'feast repo initialization' initContainer - type: boolean - offlineStore: - description: OfflineStore configures the offline store service - properties: - persistence: - description: OfflineStorePersistence configures the persistence - settings for the offline store service - properties: - file: - description: OfflineStoreFilePersistence configures - the file-based persistence for the offline store - service - properties: - pvc: - description: PvcConfig defines the settings for - a persistent file store based on PVCs. - properties: - create: - description: Settings for creating a new PVC - properties: - accessModes: - description: AccessModes k8s persistent - volume access modes. Defaults to ["ReadWriteOnce"]. - items: - type: string - type: array - resources: - description: Resources describes the storage - resource requirements for a volume. - properties: - limits: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: |- - Limits describes the maximum amount of compute resources allowed. - More info: https://kubernetes. - type: object - requests: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: Requests describes the - minimum amount of compute resources - required. - type: object - type: object - storageClassName: - description: StorageClassName is the name - of an existing StorageClass to which - this persistent volume belongs. - type: string - type: object - x-kubernetes-validations: - - message: PvcCreate is immutable - rule: self == oldSelf - mountPath: - description: |- - MountPath within the container at which the volume should be mounted. - Must start by "/" and cannot contain ':'. - type: string - ref: - description: Reference to an existing field - 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 - required: - - mountPath - type: object - x-kubernetes-validations: - - message: One selection is required between ref - and create. - rule: '[has(self.ref), has(self.create)].exists_one(c, - c)' - - message: Mount path must start with '/' and - must not contain ':' - rule: self.mountPath.matches('^/[^:]*$') - type: - enum: - - file - - dask - - duckdb - type: string - type: object - store: - description: OfflineStoreDBStorePersistence configures - the DB store persistence for the offline store service - properties: - secretKeyName: - description: By default, the selected store "type" - is used as the SecretKeyName - type: string - secretRef: - description: Data store parameters should be placed - as-is from the "feature_store.yaml" under the - secret key. - 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: - description: Type of the persistence type you - want to use. - enum: - - snowflake.offline - - bigquery - - redshift - - spark - - postgres - - trino - - athena - - mssql - - couchbase.offline - - clickhouse - - ray - type: string - required: - - secretRef - - type - type: object - type: object - x-kubernetes-validations: - - message: One selection required between file or store. - rule: '[has(self.file), has(self.store)].exists_one(c, - c)' - server: - description: Creates a remote offline server container - properties: - env: - items: - description: EnvVar represents an environment variable - present in a Container. - properties: - name: - description: Name of the environment variable. - Must be a C_IDENTIFIER. - type: string - value: - description: |- - Variable references $(VAR_NAME) are expanded - using the previously defined environment variables in the container and - any - type: string - valueFrom: - description: Source for the environment variable's - value. Cannot be used if value is not empty. - properties: - configMapKeyRef: - description: Selects a key of a ConfigMap. - properties: - key: - description: The key to select. - type: string - name: - default: "" - description: |- - Name of the referent. - This field is effectively required, but due to backwards compatibility is - allowed to be empty. - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - fieldRef: - description: 'Selects a field of the pod: - supports metadata.name, metadata.namespace, - `metadata.labels['''']`, `metadata.' - properties: - apiVersion: - description: Version of the schema the - FieldPath is written in terms of, - defaults to "v1". - type: string - fieldPath: - description: Path of the field to select - in the specified API version. - type: string - required: - - fieldPath - type: object - x-kubernetes-map-type: atomic - resourceFieldRef: - description: |- - Selects a resource of the container: only resources limits and requests - (limits.cpu, limits.memory, limits. - properties: - containerName: - description: 'Container name: required - for volumes, optional for env vars' - type: string - divisor: - anyOf: - - type: integer - - type: string - description: Specifies the output format - of the exposed resources, defaults - to "1" - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - resource: - description: 'Required: resource to - select' - type: string - required: - - resource - type: object - x-kubernetes-map-type: atomic - secretKeyRef: - description: Selects a key of a secret in - the pod's namespace - properties: - key: - description: The key of the secret to - select from. Must be a valid secret - key. - type: string - name: - default: "" - description: |- - Name of the referent. - This field is effectively required, but due to backwards compatibility is - allowed to be empty. - type: string - optional: - description: Specify whether the Secret - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - required: - - name - type: object - type: array - envFrom: - items: - description: EnvFromSource represents the source - of a set of ConfigMaps - properties: - configMapRef: - description: The ConfigMap to select from - 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 - optional: - description: Specify whether the ConfigMap - must be defined - type: boolean - type: object - x-kubernetes-map-type: atomic - prefix: - description: An optional identifier to prepend - to each key in the ConfigMap. Must be a C_IDENTIFIER. - type: string - secretRef: - description: The Secret to select from - 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 - optional: - description: Specify whether the Secret - must be defined - type: boolean - type: object - x-kubernetes-map-type: atomic - type: object - type: array - image: - type: string - imagePullPolicy: - description: PullPolicy describes a policy for if/when - to pull a container image - type: string - logLevel: - description: |- - LogLevel sets the logging level for the server - Allowed values: "debug", "info", "warning", "error", "critical". - enum: - - debug - - info - - warning - - error - - critical - type: string - metrics: - description: Metrics exposes Prometheus-compatible - metrics for the Feast server when enabled. - type: boolean - nodeSelector: - additionalProperties: - type: string - type: object - resources: - description: ResourceRequirements describes the compute - resource requirements. - properties: - claims: - description: |- - Claims lists the names of resources, defined in spec.resourceClaims, - that are used by this container. - items: - description: ResourceClaim references one entry - in PodSpec.ResourceClaims. - properties: - name: - description: |- - Name must match the name of one entry in pod.spec.resourceClaims of - the Pod where this field is used. - type: string - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - limits: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: |- - Limits describes the maximum amount of compute resources allowed. - More info: https://kubernetes. - type: object - requests: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: Requests describes the minimum amount - of compute resources required. - type: object - type: object - tls: - description: TlsConfigs configures server TLS for - a feast service. - properties: - disable: - description: will disable TLS for the feast service. - useful in an openshift cluster, for example, - where TLS is configured by default - type: boolean - secretKeyNames: - description: SecretKeyNames defines the secret - key names for the TLS key and cert. - properties: - tlsCrt: - description: defaults to "tls.crt" - type: string - tlsKey: - description: defaults to "tls.key" - type: string - type: object - secretRef: - description: references the local k8s secret where - the TLS key and cert reside - 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 - x-kubernetes-validations: - - message: '`secretRef` required if `disable` is false.' - rule: '(!has(self.disable) || !self.disable) ? has(self.secretRef) - : true' - volumeMounts: - description: VolumeMounts defines the list of volumes - that should be mounted into the feast container. - items: - description: VolumeMount describes a mounting of - a Volume within a container. - properties: - mountPath: - description: |- - Path within the container at which the volume should be mounted. Must - not contain ':'. - type: string - mountPropagation: - description: |- - mountPropagation determines how mounts are propagated from the host - to container and the other way around. - type: string - name: - description: This must match the Name of a Volume. - type: string - readOnly: - description: |- - Mounted read-only if true, read-write otherwise (false or unspecified). - Defaults to false. - type: boolean - recursiveReadOnly: - description: |- - RecursiveReadOnly specifies whether read-only mounts should be handled - recursively. - type: string - subPath: - description: |- - Path within the volume from which the container's volume should be mounted. - Defaults to "" (volume's root). - type: string - subPathExpr: - description: Expanded path within the volume - from which the container's volume should be - mounted. - type: string - required: - - mountPath - - name - type: object - type: array - type: object - type: object - onlineStore: - description: OnlineStore configures the online store service - properties: - persistence: - description: OnlineStorePersistence configures the persistence - settings for the online store service - properties: - file: - description: OnlineStoreFilePersistence configures - the file-based persistence for the online store - service - properties: - path: - type: string - pvc: - description: PvcConfig defines the settings for - a persistent file store based on PVCs. - properties: - create: - description: Settings for creating a new PVC - properties: - accessModes: - description: AccessModes k8s persistent - volume access modes. Defaults to ["ReadWriteOnce"]. - items: - type: string - type: array - resources: - description: Resources describes the storage - resource requirements for a volume. - properties: - limits: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: |- - Limits describes the maximum amount of compute resources allowed. - More info: https://kubernetes. - type: object - requests: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: Requests describes the - minimum amount of compute resources - required. - type: object - type: object - storageClassName: - description: StorageClassName is the name - of an existing StorageClass to which - this persistent volume belongs. - type: string - type: object - x-kubernetes-validations: - - message: PvcCreate is immutable - rule: self == oldSelf - mountPath: - description: |- - MountPath within the container at which the volume should be mounted. - Must start by "/" and cannot contain ':'. - type: string - ref: - description: Reference to an existing field - 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 - required: - - mountPath - type: object - x-kubernetes-validations: - - message: One selection is required between ref - and create. - rule: '[has(self.ref), has(self.create)].exists_one(c, - c)' - - message: Mount path must start with '/' and - must not contain ':' - rule: self.mountPath.matches('^/[^:]*$') - type: object - x-kubernetes-validations: - - message: Ephemeral stores must have absolute paths. - rule: '(!has(self.pvc) && has(self.path)) ? self.path.startsWith(''/'') - : true' - - message: PVC path must be a file name only, with - no slashes. - rule: '(has(self.pvc) && has(self.path)) ? !self.path.startsWith(''/'') - : true' - - message: Online store does not support S3 or GS - buckets. - rule: 'has(self.path) ? !(self.path.startsWith(''s3://'') - || self.path.startsWith(''gs://'')) : true' - store: - description: OnlineStoreDBStorePersistence configures - the DB store persistence for the online store service - properties: - secretKeyName: - description: By default, the selected store "type" - is used as the SecretKeyName - type: string - secretRef: - description: Data store parameters should be placed - as-is from the "feature_store.yaml" under the - secret key. - 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: - description: Type of the persistence type you - want to use. - enum: - - snowflake.online - - redis - - ikv - - datastore - - dynamodb - - bigtable - - postgres - - cassandra - - mysql - - hazelcast - - singlestore - - hbase - - elasticsearch - - qdrant - - couchbase.online - - milvus - type: string - required: - - secretRef - - type - type: object - type: object - x-kubernetes-validations: - - message: One selection required between file or store. - rule: '[has(self.file), has(self.store)].exists_one(c, - c)' - server: - description: Creates a feature server container - properties: - env: - items: - description: EnvVar represents an environment variable - present in a Container. - properties: - name: - description: Name of the environment variable. - Must be a C_IDENTIFIER. - type: string - value: - description: |- - Variable references $(VAR_NAME) are expanded - using the previously defined environment variables in the container and - any - type: string - valueFrom: - description: Source for the environment variable's - value. Cannot be used if value is not empty. - properties: - configMapKeyRef: - description: Selects a key of a ConfigMap. - properties: - key: - description: The key to select. - type: string - name: - default: "" - description: |- - Name of the referent. - This field is effectively required, but due to backwards compatibility is - allowed to be empty. - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - fieldRef: - description: 'Selects a field of the pod: - supports metadata.name, metadata.namespace, - `metadata.labels['''']`, `metadata.' - properties: - apiVersion: - description: Version of the schema the - FieldPath is written in terms of, - defaults to "v1". - type: string - fieldPath: - description: Path of the field to select - in the specified API version. - type: string - required: - - fieldPath - type: object - x-kubernetes-map-type: atomic - resourceFieldRef: - description: |- - Selects a resource of the container: only resources limits and requests - (limits.cpu, limits.memory, limits. - properties: - containerName: - description: 'Container name: required - for volumes, optional for env vars' - type: string - divisor: - anyOf: - - type: integer - - type: string - description: Specifies the output format - of the exposed resources, defaults - to "1" - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - resource: - description: 'Required: resource to - select' - type: string - required: - - resource - type: object - x-kubernetes-map-type: atomic - secretKeyRef: - description: Selects a key of a secret in - the pod's namespace - properties: - key: - description: The key of the secret to - select from. Must be a valid secret - key. - type: string - name: - default: "" - description: |- - Name of the referent. - This field is effectively required, but due to backwards compatibility is - allowed to be empty. - type: string - optional: - description: Specify whether the Secret - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - required: - - name - type: object - type: array - envFrom: - items: - description: EnvFromSource represents the source - of a set of ConfigMaps - properties: - configMapRef: - description: The ConfigMap to select from - 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 - optional: - description: Specify whether the ConfigMap - must be defined - type: boolean - type: object - x-kubernetes-map-type: atomic - prefix: - description: An optional identifier to prepend - to each key in the ConfigMap. Must be a C_IDENTIFIER. - type: string - secretRef: - description: The Secret to select from - 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 - optional: - description: Specify whether the Secret - must be defined - type: boolean - type: object - x-kubernetes-map-type: atomic - type: object - type: array - image: - type: string - imagePullPolicy: - description: PullPolicy describes a policy for if/when - to pull a container image - type: string - logLevel: - description: |- - LogLevel sets the logging level for the server - Allowed values: "debug", "info", "warning", "error", "critical". - enum: - - debug - - info - - warning - - error - - critical - type: string - metrics: - description: Metrics exposes Prometheus-compatible - metrics for the Feast server when enabled. - type: boolean - nodeSelector: - additionalProperties: - type: string - type: object - resources: - description: ResourceRequirements describes the compute - resource requirements. - properties: - claims: - description: |- - Claims lists the names of resources, defined in spec.resourceClaims, - that are used by this container. - items: - description: ResourceClaim references one entry - in PodSpec.ResourceClaims. - properties: - name: - description: |- - Name must match the name of one entry in pod.spec.resourceClaims of - the Pod where this field is used. - type: string - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - limits: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: |- - Limits describes the maximum amount of compute resources allowed. - More info: https://kubernetes. - type: object - requests: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: Requests describes the minimum amount - of compute resources required. - type: object - type: object - tls: - description: TlsConfigs configures server TLS for - a feast service. - properties: - disable: - description: will disable TLS for the feast service. - useful in an openshift cluster, for example, - where TLS is configured by default - type: boolean - secretKeyNames: - description: SecretKeyNames defines the secret - key names for the TLS key and cert. - properties: - tlsCrt: - description: defaults to "tls.crt" - type: string - tlsKey: - description: defaults to "tls.key" - type: string - type: object - secretRef: - description: references the local k8s secret where - the TLS key and cert reside - 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 - x-kubernetes-validations: - - message: '`secretRef` required if `disable` is false.' - rule: '(!has(self.disable) || !self.disable) ? has(self.secretRef) - : true' - volumeMounts: - description: VolumeMounts defines the list of volumes - that should be mounted into the feast container. - items: - description: VolumeMount describes a mounting of - a Volume within a container. - properties: - mountPath: - description: |- - Path within the container at which the volume should be mounted. Must - not contain ':'. - type: string - mountPropagation: - description: |- - mountPropagation determines how mounts are propagated from the host - to container and the other way around. - type: string - name: - description: This must match the Name of a Volume. - type: string - readOnly: - description: |- - Mounted read-only if true, read-write otherwise (false or unspecified). - Defaults to false. - type: boolean - recursiveReadOnly: - description: |- - RecursiveReadOnly specifies whether read-only mounts should be handled - recursively. - type: string - subPath: - description: |- - Path within the volume from which the container's volume should be mounted. - Defaults to "" (volume's root). - type: string - subPathExpr: - description: Expanded path within the volume - from which the container's volume should be - mounted. - type: string - required: - - mountPath - - name - type: object - type: array - type: object - type: object - registry: - description: Registry configures the registry service. One - selection is required. Local is the default setting. - properties: - local: - description: LocalRegistryConfig configures the registry - service - properties: - persistence: - description: RegistryPersistence configures the persistence - settings for the registry service - properties: - file: - description: RegistryFilePersistence configures - the file-based persistence for the registry - service - properties: - cache_mode: - description: |- - CacheMode defines the registry cache update strategy. - Allowed values are "sync" and "thread". - enum: - - none - - sync - - thread - type: string - cache_ttl_seconds: - description: CacheTTLSeconds defines the TTL - (in seconds) for the registry cache. - format: int32 - minimum: 0 - type: integer - path: - type: string - pvc: - description: PvcConfig defines the settings - for a persistent file store based on PVCs. - properties: - create: - description: Settings for creating a new - PVC - properties: - accessModes: - description: AccessModes k8s persistent - volume access modes. Defaults to - ["ReadWriteOnce"]. - items: - type: string - type: array - resources: - description: Resources describes the - storage resource requirements for - a volume. - properties: - limits: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: |- - Limits describes the maximum amount of compute resources allowed. - More info: https://kubernetes. - type: object - requests: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: Requests describes - the minimum amount of compute - resources required. - type: object - type: object - storageClassName: - description: StorageClassName is the - name of an existing StorageClass - to which this persistent volume - belongs. - type: string - type: object - x-kubernetes-validations: - - message: PvcCreate is immutable - rule: self == oldSelf - mountPath: - description: |- - MountPath within the container at which the volume should be mounted. - Must start by "/" and cannot contain ':'. - type: string - ref: - description: Reference to an existing - field - 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 - required: - - mountPath - type: object - x-kubernetes-validations: - - message: One selection is required between - ref and create. - rule: '[has(self.ref), has(self.create)].exists_one(c, - c)' - - message: Mount path must start with '/' - and must not contain ':' - rule: self.mountPath.matches('^/[^:]*$') - s3_additional_kwargs: - additionalProperties: - type: string - type: object - type: object - x-kubernetes-validations: - - message: Registry files must use absolute paths - or be S3 ('s3://') or GS ('gs://') object - store URIs. - rule: '(!has(self.pvc) && has(self.path)) ? - (self.path.startsWith(''/'') || self.path.startsWith(''s3://'') - || self.path.startsWith(''gs://'')) : true' - - message: PVC path must be a file name only, - with no slashes. - rule: '(has(self.pvc) && has(self.path)) ? !self.path.startsWith(''/'') - : true' - - message: PVC persistence does not support S3 - or GS object store URIs. - rule: '(has(self.pvc) && has(self.path)) ? !(self.path.startsWith(''s3://'') - || self.path.startsWith(''gs://'')) : true' - - message: Additional S3 settings are available - only for S3 object store URIs. - rule: '(has(self.s3_additional_kwargs) && has(self.path)) - ? self.path.startsWith(''s3://'') : true' - store: - description: RegistryDBStorePersistence configures - the DB store persistence for the registry service - properties: - secretKeyName: - description: By default, the selected store - "type" is used as the SecretKeyName - type: string - secretRef: - description: Data store parameters should - be placed as-is from the "feature_store.yaml" - under the secret key. - 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: - description: Type of the persistence type - you want to use. - enum: - - sql - - snowflake.registry - type: string - required: - - secretRef - - type - type: object - type: object - x-kubernetes-validations: - - message: One selection required between file or - store. - rule: '[has(self.file), has(self.store)].exists_one(c, - c)' - server: - description: Creates a registry server container - properties: - env: - items: - description: EnvVar represents an environment - variable present in a Container. - properties: - name: - description: Name of the environment variable. - Must be a C_IDENTIFIER. - type: string - value: - description: |- - Variable references $(VAR_NAME) are expanded - using the previously defined environment variables in the container and - any - type: string - valueFrom: - description: Source for the environment - variable's value. Cannot be used if value - is not empty. - properties: - configMapKeyRef: - description: Selects a key of a ConfigMap. - properties: - key: - description: The key to select. - type: string - name: - default: "" - description: |- - Name of the referent. - This field is effectively required, but due to backwards compatibility is - allowed to be empty. - type: string - optional: - description: Specify whether the - ConfigMap or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - fieldRef: - description: 'Selects a field of the - pod: supports metadata.name, metadata.namespace, - `metadata.labels['''']`, `metadata.' - properties: - apiVersion: - description: Version of the schema - the FieldPath is written in terms - of, defaults to "v1". - type: string - fieldPath: - description: Path of the field to - select in the specified API version. - type: string - required: - - fieldPath - type: object - x-kubernetes-map-type: atomic - resourceFieldRef: - description: |- - Selects a resource of the container: only resources limits and requests - (limits.cpu, limits.memory, limits. - properties: - containerName: - description: 'Container name: required - for volumes, optional for env - vars' - type: string - divisor: - anyOf: - - type: integer - - type: string - description: Specifies the output - format of the exposed resources, - defaults to "1" - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - resource: - description: 'Required: resource - to select' - type: string - required: - - resource - type: object - x-kubernetes-map-type: atomic - secretKeyRef: - description: Selects a key of a secret - in the pod's namespace - properties: - key: - description: The key of the secret - to select from. Must be a valid - secret key. - type: string - name: - default: "" - description: |- - Name of the referent. - This field is effectively required, but due to backwards compatibility is - allowed to be empty. - type: string - optional: - description: Specify whether the - Secret or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - required: - - name - type: object - type: array - envFrom: - items: - description: EnvFromSource represents the source - of a set of ConfigMaps - properties: - configMapRef: - description: The ConfigMap to select from - 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 - optional: - description: Specify whether the ConfigMap - must be defined - type: boolean - type: object - x-kubernetes-map-type: atomic - prefix: - description: An optional identifier to prepend - to each key in the ConfigMap. Must be - a C_IDENTIFIER. - type: string - secretRef: - description: The Secret to select from - 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 - optional: - description: Specify whether the Secret - must be defined - type: boolean - type: object - x-kubernetes-map-type: atomic - type: object - type: array - grpc: - description: Enable gRPC registry server. Defaults - to true if unset. - type: boolean - image: - type: string - imagePullPolicy: - description: PullPolicy describes a policy for - if/when to pull a container image - type: string - logLevel: - description: |- - LogLevel sets the logging level for the server - Allowed values: "debug", "info", "warning", "error", "critical". - enum: - - debug - - info - - warning - - error - - critical - type: string - metrics: - description: Metrics exposes Prometheus-compatible - metrics for the Feast server when enabled. - type: boolean - nodeSelector: - additionalProperties: - type: string - type: object - resources: - description: ResourceRequirements describes the - compute resource requirements. - properties: - claims: - description: |- - Claims lists the names of resources, defined in spec.resourceClaims, - that are used by this container. - items: - description: ResourceClaim references one - entry in PodSpec.ResourceClaims. - properties: - name: - description: |- - Name must match the name of one entry in pod.spec.resourceClaims of - the Pod where this field is used. - type: string - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - limits: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: |- - Limits describes the maximum amount of compute resources allowed. - More info: https://kubernetes. - type: object - requests: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: Requests describes the minimum - amount of compute resources required. - type: object - type: object - restAPI: - description: Enable REST API registry server. - type: boolean - tls: - description: TlsConfigs configures server TLS - for a feast service. - properties: - disable: - description: will disable TLS for the feast - service. useful in an openshift cluster, - for example, where TLS is configured by - default - type: boolean - secretKeyNames: - description: SecretKeyNames defines the secret - key names for the TLS key and cert. - properties: - tlsCrt: - description: defaults to "tls.crt" - type: string - tlsKey: - description: defaults to "tls.key" - type: string - type: object - secretRef: - description: references the local k8s secret - where the TLS key and cert reside - 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 - x-kubernetes-validations: - - message: '`secretRef` required if `disable` - is false.' - rule: '(!has(self.disable) || !self.disable) - ? has(self.secretRef) : true' - volumeMounts: - description: VolumeMounts defines the list of - volumes that should be mounted into the feast - container. - items: - description: VolumeMount describes a mounting - of a Volume within a container. - properties: - mountPath: - description: |- - Path within the container at which the volume should be mounted. Must - not contain ':'. - type: string - mountPropagation: - description: |- - mountPropagation determines how mounts are propagated from the host - to container and the other way around. - type: string - name: - description: This must match the Name of - a Volume. - type: string - readOnly: - description: |- - Mounted read-only if true, read-write otherwise (false or unspecified). - Defaults to false. - type: boolean - recursiveReadOnly: - description: |- - RecursiveReadOnly specifies whether read-only mounts should be handled - recursively. - type: string - subPath: - description: |- - Path within the volume from which the container's volume should be mounted. - Defaults to "" (volume's root). - type: string - subPathExpr: - description: Expanded path within the volume - from which the container's volume should - be mounted. - type: string - required: - - mountPath - - name - type: object - type: array - type: object - x-kubernetes-validations: - - message: At least one of restAPI or grpc must be - true - rule: self.restAPI == true || self.grpc == true - || !has(self.grpc) - type: object - remote: - description: RemoteRegistryConfig points to a remote feast - registry server. - properties: - feastRef: - description: Reference to an existing `FeatureStore` - CR in the same k8s cluster. - properties: - name: - description: Name of the FeatureStore - type: string - namespace: - description: Namespace of the FeatureStore - type: string - required: - - name - type: object - hostname: - description: Host address of the remote registry service - - :, e.g. `registry..svc.cluster.local:80` - type: string - tls: - description: TlsRemoteRegistryConfigs configures client - TLS for a remote feast registry. - properties: - certName: - description: defines the configmap key name for - the client TLS cert. - type: string - configMapRef: - description: references the local k8s configmap - where the TLS cert resides - 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 - required: - - certName - - configMapRef - type: object - type: object - x-kubernetes-validations: - - message: One selection required. - rule: '[has(self.hostname), has(self.feastRef)].exists_one(c, - c)' - type: object - x-kubernetes-validations: - - message: One selection required. - rule: '[has(self.local), has(self.remote)].exists_one(c, - c)' - securityContext: - description: PodSecurityContext holds pod-level security attributes - and common container settings. - properties: - appArmorProfile: - description: appArmorProfile is the AppArmor options to - use by the containers in this pod. - properties: - localhostProfile: - description: localhostProfile indicates a profile - loaded on the node that should be used. - type: string - type: - description: type indicates which kind of AppArmor - profile will be applied. - type: string - required: - - type - type: object - fsGroup: - description: A special supplemental group that applies - to all containers in a pod. - format: int64 - type: integer - fsGroupChangePolicy: - description: |- - fsGroupChangePolicy defines behavior of changing ownership and permission of the volume - before being exposed inside Pod. - type: string - runAsGroup: - description: |- - The GID to run the entrypoint of the container process. - Uses runtime default if unset. - format: int64 - type: integer - runAsNonRoot: - description: Indicates that the container must run as - a non-root user. - type: boolean - runAsUser: - description: |- - The UID to run the entrypoint of the container process. - Defaults to user specified in image metadata if unspecified. - format: int64 - type: integer - seLinuxOptions: - description: The SELinux context to be applied to all - containers. - properties: - level: - description: Level is SELinux level label that applies - to the container. - type: string - role: - description: Role is a SELinux role label that applies - to the container. - type: string - type: - description: Type is a SELinux type label that applies - to the container. - type: string - user: - description: User is a SELinux user label that applies - to the container. - type: string - type: object - seccompProfile: - description: |- - The seccomp options to use by the containers in this pod. - Note that this field cannot be set when spec.os. - properties: - localhostProfile: - description: localhostProfile indicates a profile - defined in a file on the node should be used. - type: string - type: - description: type indicates which kind of seccomp - profile will be applied. - type: string - required: - - type - type: object - supplementalGroups: - description: |- - A list of groups applied to the first process run in each container, in addition - to the container's primary GID, the fsG - items: - format: int64 - type: integer - type: array - x-kubernetes-list-type: atomic - sysctls: - description: Sysctls hold a list of namespaced sysctls - used for the pod. - items: - description: Sysctl defines a kernel parameter to be - set - properties: - name: - description: Name of a property to set - type: string - value: - description: Value of a property to set - type: string - required: - - name - - value - type: object - type: array - x-kubernetes-list-type: atomic - windowsOptions: - description: The Windows specific settings applied to - all containers. - properties: - gmsaCredentialSpec: - description: |- - GMSACredentialSpec is where the GMSA admission webhook - (https://github. - type: string - gmsaCredentialSpecName: - description: GMSACredentialSpecName is the name of - the GMSA credential spec to use. - type: string - hostProcess: - description: HostProcess determines if a container - should be run as a 'Host Process' container. - type: boolean - runAsUserName: - description: The UserName in Windows to run the entrypoint - of the container process. - type: string - type: object - type: object - ui: - description: Creates a UI server container - properties: - env: - items: - description: EnvVar represents an environment variable - present in a Container. - properties: - name: - description: Name of the environment variable. Must - be a C_IDENTIFIER. - type: string - value: - description: |- - Variable references $(VAR_NAME) are expanded - using the previously defined environment variables in the container and - any - type: string - valueFrom: - description: Source for the environment variable's - value. Cannot be used if value is not empty. - properties: - configMapKeyRef: - description: Selects a key of a ConfigMap. - properties: - key: - description: The key to select. - type: string - name: - default: "" - description: |- - Name of the referent. - This field is effectively required, but due to backwards compatibility is - allowed to be empty. - type: string - optional: - description: Specify whether the ConfigMap - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - fieldRef: - description: 'Selects a field of the pod: supports - metadata.name, metadata.namespace, `metadata.labels['''']`, - `metadata.' - properties: - apiVersion: - description: Version of the schema the FieldPath - is written in terms of, defaults to "v1". - type: string - fieldPath: - description: Path of the field to select - in the specified API version. - type: string - required: - - fieldPath - type: object - x-kubernetes-map-type: atomic - resourceFieldRef: - description: |- - Selects a resource of the container: only resources limits and requests - (limits.cpu, limits.memory, limits. - properties: - containerName: - description: 'Container name: required for - volumes, optional for env vars' - type: string - divisor: - anyOf: - - type: integer - - type: string - description: Specifies the output format - of the exposed resources, defaults to - "1" - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - resource: - description: 'Required: resource to select' - type: string - required: - - resource - type: object - x-kubernetes-map-type: atomic - secretKeyRef: - description: Selects a key of a secret in the - pod's namespace - properties: - key: - description: The key of the secret to select - from. Must be a valid secret key. - type: string - name: - default: "" - description: |- - Name of the referent. - This field is effectively required, but due to backwards compatibility is - allowed to be empty. - type: string - optional: - description: Specify whether the Secret - or its key must be defined - type: boolean - required: - - key - type: object - x-kubernetes-map-type: atomic - type: object - required: - - name - type: object - type: array - envFrom: - items: - description: EnvFromSource represents the source of - a set of ConfigMaps - properties: - configMapRef: - description: The ConfigMap to select from - 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 - optional: - description: Specify whether the ConfigMap must - be defined - type: boolean - type: object - x-kubernetes-map-type: atomic - prefix: - description: An optional identifier to prepend to - each key in the ConfigMap. Must be a C_IDENTIFIER. - type: string - secretRef: - description: The Secret to select from - 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 - optional: - description: Specify whether the Secret must - be defined - type: boolean - type: object - x-kubernetes-map-type: atomic - type: object - type: array - image: - type: string - imagePullPolicy: - description: PullPolicy describes a policy for if/when - to pull a container image - type: string - logLevel: - description: |- - LogLevel sets the logging level for the server - Allowed values: "debug", "info", "warning", "error", "critical". - enum: - - debug - - info - - warning - - error - - critical - type: string - metrics: - description: Metrics exposes Prometheus-compatible metrics - for the Feast server when enabled. - type: boolean - nodeSelector: - additionalProperties: - type: string - type: object - resources: - description: ResourceRequirements describes the compute - resource requirements. - properties: - claims: - description: |- - Claims lists the names of resources, defined in spec.resourceClaims, - that are used by this container. - items: - description: ResourceClaim references one entry - in PodSpec.ResourceClaims. - properties: - name: - description: |- - Name must match the name of one entry in pod.spec.resourceClaims of - the Pod where this field is used. - type: string - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - limits: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: |- - Limits describes the maximum amount of compute resources allowed. - More info: https://kubernetes. - type: object - requests: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: Requests describes the minimum amount - of compute resources required. - type: object - type: object - tls: - description: TlsConfigs configures server TLS for a feast - service. - properties: - disable: - description: will disable TLS for the feast service. - useful in an openshift cluster, for example, where - TLS is configured by default - type: boolean - secretKeyNames: - description: SecretKeyNames defines the secret key - names for the TLS key and cert. - properties: - tlsCrt: - description: defaults to "tls.crt" - type: string - tlsKey: - description: defaults to "tls.key" - type: string - type: object - secretRef: - description: references the local k8s secret where - the TLS key and cert reside - 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 - x-kubernetes-validations: - - message: '`secretRef` required if `disable` is false.' - rule: '(!has(self.disable) || !self.disable) ? has(self.secretRef) - : true' - volumeMounts: - description: VolumeMounts defines the list of volumes - that should be mounted into the feast container. - items: - description: VolumeMount describes a mounting of a Volume - within a container. - properties: - mountPath: - description: |- - Path within the container at which the volume should be mounted. Must - not contain ':'. - type: string - mountPropagation: - description: |- - mountPropagation determines how mounts are propagated from the host - to container and the other way around. - type: string - name: - description: This must match the Name of a Volume. - type: string - readOnly: - description: |- - Mounted read-only if true, read-write otherwise (false or unspecified). - Defaults to false. - type: boolean - recursiveReadOnly: - description: |- - RecursiveReadOnly specifies whether read-only mounts should be handled - recursively. - type: string - subPath: - description: |- - Path within the volume from which the container's volume should be mounted. - Defaults to "" (volume's root). - type: string - subPathExpr: - description: Expanded path within the volume from - which the container's volume should be mounted. - type: string - required: - - mountPath - - name - type: object - type: array - type: object - volumes: - description: Volumes specifies the volumes to mount in the - FeatureStore deployment. - items: - description: Volume represents a named volume in a pod that - may be accessed by any container in the pod. - properties: - awsElasticBlockStore: - description: |- - awsElasticBlockStore represents an AWS Disk resource that is attached to a - kubelet's host machine and then exposed to th - properties: - fsType: - description: fsType is the filesystem type of the - volume that you want to mount. - type: string - partition: - description: |- - partition is the partition in the volume that you want to mount. - If omitted, the default is to mount by volume name. - format: int32 - type: integer - readOnly: - description: |- - readOnly value true will force the readOnly setting in VolumeMounts. - More info: https://kubernetes. - type: boolean - volumeID: - description: |- - volumeID is unique ID of the persistent disk resource in AWS (Amazon EBS volume). - More info: https://kubernetes. - type: string - required: - - volumeID - type: object - azureDisk: - description: azureDisk represents an Azure Data Disk - mount on the host and bind mount to the pod. - properties: - cachingMode: - description: 'cachingMode is the Host Caching mode: - None, Read Only, Read Write.' - type: string - diskName: - description: diskName is the Name of the data disk - in the blob storage - type: string - diskURI: - description: diskURI is the URI of data disk in - the blob storage - type: string - fsType: - description: |- - fsType is Filesystem type to mount. - Must be a filesystem type supported by the host operating system. - Ex. - type: string - kind: - description: 'kind expected values are Shared: multiple - blob disks per storage account Dedicated: single - blob disk per storage accoun' - type: string - readOnly: - description: |- - readOnly Defaults to false (read/write). ReadOnly here will force - the ReadOnly setting in VolumeMounts. - type: boolean - required: - - diskName - - diskURI - type: object - azureFile: - description: azureFile represents an Azure File Service - mount on the host and bind mount to the pod. - properties: - readOnly: - description: |- - readOnly defaults to false (read/write). ReadOnly here will force - the ReadOnly setting in VolumeMounts. - type: boolean - secretName: - description: secretName is the name of secret that - contains Azure Storage Account Name and Key - type: string - shareName: - description: shareName is the azure share Name - type: string - required: - - secretName - - shareName - type: object - cephfs: - description: cephFS represents a Ceph FS mount on the - host that shares a pod's lifetime - properties: - monitors: - description: |- - monitors is Required: Monitors is a collection of Ceph monitors - More info: https://examples.k8s. - items: - type: string - type: array - x-kubernetes-list-type: atomic - path: - description: 'path is Optional: Used as the mounted - root, rather than the full Ceph tree, default - is /' - type: string - readOnly: - description: |- - readOnly is Optional: Defaults to false (read/write). ReadOnly here will force - the ReadOnly setting in VolumeMounts. - type: boolean - secretFile: - description: 'secretFile is Optional: SecretFile - is the path to key ring for User, default is /etc/ceph/user.' - type: string - secretRef: - description: 'secretRef is Optional: SecretRef is - reference to the authentication secret for User, - default is empty.' - 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 - user: - description: |- - user is optional: User is the rados user name, default is admin - More info: https://examples.k8s. - type: string - required: - - monitors - type: object - cinder: - description: |- - cinder represents a cinder volume attached and mounted on kubelets host machine. - More info: https://examples.k8s. - properties: - fsType: - description: |- - fsType is the filesystem type to mount. - Must be a filesystem type supported by the host operating system. - type: string - readOnly: - description: |- - readOnly defaults to false (read/write). ReadOnly here will force - the ReadOnly setting in VolumeMounts. - type: boolean - secretRef: - description: |- - secretRef is optional: points to a secret object containing parameters used to connect - to OpenStack. - 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 - volumeID: - description: |- - volumeID used to identify the volume in cinder. - More info: https://examples.k8s.io/mysql-cinder-pd/README.md - type: string - required: - - volumeID - type: object - configMap: - description: configMap represents a configMap that should - populate this volume - properties: - defaultMode: - description: 'defaultMode is optional: mode bits - used to set permissions on created files by default.' - format: int32 - type: integer - items: - description: |- - items if unspecified, each key-value pair in the Data field of the referenced - ConfigMap will be projected into the volum - items: - description: Maps a string key to a path within - a volume. - properties: - key: - description: key is the key to project. - type: string - mode: - description: 'mode is Optional: mode bits - used to set permissions on this file.' - format: int32 - type: integer - path: - description: |- - path is the relative path of the file to map the key to. - May not be an absolute path. - type: string - required: - - key - - path - type: object - type: array - x-kubernetes-list-type: atomic - name: - default: "" - description: |- - Name of the referent. - This field is effectively required, but due to backwards compatibility is - allowed to be empty. - type: string - optional: - description: optional specify whether the ConfigMap - or its keys must be defined - type: boolean - type: object - x-kubernetes-map-type: atomic - csi: - description: csi (Container Storage Interface) represents - ephemeral storage that is handled by certain external - CSI drivers (Beta fea - properties: - driver: - description: driver is the name of the CSI driver - that handles this volume. - type: string - fsType: - description: fsType to mount. Ex. "ext4", "xfs", - "ntfs". - type: string - nodePublishSecretRef: - description: |- - nodePublishSecretRef is a reference to the secret object containing - sensitive information to pass to the CSI driver to c - 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 - readOnly: - description: |- - readOnly specifies a read-only configuration for the volume. - Defaults to false (read/write). - type: boolean - volumeAttributes: - additionalProperties: - type: string - description: |- - volumeAttributes stores driver-specific properties that are passed to the CSI - driver. - type: object - required: - - driver - type: object - downwardAPI: - description: downwardAPI represents downward API about - the pod that should populate this volume - properties: - defaultMode: - description: 'Optional: mode bits to use on created - files by default.' - format: int32 - type: integer - items: - description: Items is a list of downward API volume - file - items: - description: DownwardAPIVolumeFile represents - information to create the file containing the - pod field - properties: - fieldRef: - description: 'Required: Selects a field of - the pod: only annotations, labels, name, - namespace and uid are supported.' - properties: - apiVersion: - description: Version of the schema the - FieldPath is written in terms of, defaults - to "v1". - type: string - fieldPath: - description: Path of the field to select - in the specified API version. - type: string - required: - - fieldPath - type: object - x-kubernetes-map-type: atomic - mode: - description: |- - Optional: mode bits used to set permissions on this file, must be an octal value - between 0000 and 0777 or a decimal valu - format: int32 - type: integer - path: - description: 'Required: Path is the relative - path name of the file to be created. Must - not be absolute or contain the ''..'' path.' - type: string - resourceFieldRef: - description: |- - Selects a resource of the container: only resources limits and requests - (limits.cpu, limits.memory, requests. - properties: - containerName: - description: 'Container name: required - for volumes, optional for env vars' - type: string - divisor: - anyOf: - - type: integer - - type: string - description: Specifies the output format - of the exposed resources, defaults to - "1" - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - resource: - description: 'Required: resource to select' - type: string - required: - - resource - type: object - x-kubernetes-map-type: atomic - required: - - path - type: object - type: array - x-kubernetes-list-type: atomic - type: object - emptyDir: - description: |- - emptyDir represents a temporary directory that shares a pod's lifetime. - More info: https://kubernetes. - properties: - medium: - description: medium represents what type of storage - medium should back this directory. - type: string - sizeLimit: - anyOf: - - type: integer - - type: string - description: sizeLimit is the total amount of local - storage required for this EmptyDir volume. - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - type: object - ephemeral: - description: ephemeral represents a volume that is handled - by a cluster storage driver. - properties: - volumeClaimTemplate: - description: Will be used to create a stand-alone - PVC to provision the volume. - properties: - metadata: - description: |- - May contain labels and annotations that will be copied into the PVC - when creating it. - type: object - spec: - description: The specification for the PersistentVolumeClaim. - properties: - accessModes: - description: |- - accessModes contains the desired access modes the volume should have. - More info: https://kubernetes. - items: - type: string - type: array - x-kubernetes-list-type: atomic - dataSource: - description: |- - dataSource field can be used to specify either: - * An existing VolumeSnapshot object (snapshot.storage.k8s. - properties: - apiGroup: - description: APIGroup is the group for - the resource being referenced. - type: string - kind: - description: Kind is the type of resource - being referenced - type: string - name: - description: Name is the name of resource - being referenced - type: string - required: - - kind - - name - type: object - x-kubernetes-map-type: atomic - dataSourceRef: - description: |- - dataSourceRef specifies the object from which to populate the volume with data, if a non-empty - volume is desired. - properties: - apiGroup: - description: APIGroup is the group for - the resource being referenced. - type: string - kind: - description: Kind is the type of resource - being referenced - type: string - name: - description: Name is the name of resource - being referenced - type: string - namespace: - description: |- - Namespace is the namespace of resource being referenced - Note that when a namespace is specified, a gateway.networking. - type: string - required: - - kind - - name - type: object - resources: - description: resources represents the minimum - resources the volume should have. - properties: - limits: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: |- - Limits describes the maximum amount of compute resources allowed. - More info: https://kubernetes. - type: object - requests: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: Requests describes the - minimum amount of compute resources - required. - type: object - type: object - selector: - description: selector is a label query over - volumes to consider for binding. - properties: - matchExpressions: - description: matchExpressions is a list - of label selector requirements. The - requirements are ANDed. - items: - description: |- - A label selector requirement is a selector that contains values, a key, and an operator that - relates the key and values. - properties: - key: - description: key is the label - key that the selector applies - to. - type: string - operator: - description: |- - operator represents a key's relationship to a set of values. - Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: |- - values is an array of string values. If the operator is In or NotIn, - the values array must be non-empty. - items: - type: string - type: array - x-kubernetes-list-type: atomic - required: - - key - - operator - type: object - type: array - x-kubernetes-list-type: atomic - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of - {key,value} pairs. - type: object - type: object - x-kubernetes-map-type: atomic - storageClassName: - description: |- - storageClassName is the name of the StorageClass required by the claim. - More info: https://kubernetes. - type: string - volumeAttributesClassName: - description: volumeAttributesClassName may - be used to set the VolumeAttributesClass - used by this claim. - type: string - volumeMode: - description: volumeMode defines what type - of volume is required by the claim. - type: string - volumeName: - description: volumeName is the binding reference - to the PersistentVolume backing this claim. - type: string - type: object - required: - - spec - type: object - type: object - fc: - description: fc represents a Fibre Channel resource - that is attached to a kubelet's host machine and then - exposed to the pod. - properties: - fsType: - description: |- - fsType is the filesystem type to mount. - Must be a filesystem type supported by the host operating system. - Ex. - type: string - lun: - description: 'lun is Optional: FC target lun number' - format: int32 - type: integer - readOnly: - description: |- - readOnly is Optional: Defaults to false (read/write). ReadOnly here will force - the ReadOnly setting in VolumeMounts. - type: boolean - targetWWNs: - description: 'targetWWNs is Optional: FC target - worldwide names (WWNs)' - items: - type: string - type: array - x-kubernetes-list-type: atomic - wwids: - description: "wwids Optional: FC volume world wide - identifiers (wwids)\nEither wwids or combination - of targetWWNs and lun must be set, " - items: - type: string - type: array - x-kubernetes-list-type: atomic - type: object - flexVolume: - description: |- - flexVolume represents a generic volume resource that is - provisioned/attached using an exec based plugin. - properties: - driver: - description: driver is the name of the driver to - use for this volume. - type: string - fsType: - description: |- - fsType is the filesystem type to mount. - Must be a filesystem type supported by the host operating system. - Ex. - type: string - options: - additionalProperties: - type: string - description: 'options is Optional: this field holds - extra command options if any.' - type: object - readOnly: - description: |- - readOnly is Optional: defaults to false (read/write). ReadOnly here will force - the ReadOnly setting in VolumeMounts. - type: boolean - secretRef: - description: |- - secretRef is Optional: secretRef is reference to the secret object containing - sensitive information to pass to the plugi - 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 - required: - - driver - type: object - flocker: - description: flocker represents a Flocker volume attached - to a kubelet's host machine. - properties: - datasetName: - description: |- - datasetName is Name of the dataset stored as metadata -> name on the dataset for Flocker - should be considered as depreca - type: string - datasetUUID: - description: datasetUUID is the UUID of the dataset. - This is unique identifier of a Flocker dataset - type: string - type: object - gcePersistentDisk: - description: |- - gcePersistentDisk represents a GCE Disk resource that is attached to a - kubelet's host machine and then exposed to the po - properties: - fsType: - description: fsType is filesystem type of the volume - that you want to mount. - type: string - partition: - description: |- - partition is the partition in the volume that you want to mount. - If omitted, the default is to mount by volume name. - format: int32 - type: integer - pdName: - description: |- - pdName is unique name of the PD resource in GCE. Used to identify the disk in GCE. - More info: https://kubernetes. - type: string - readOnly: - description: |- - readOnly here will force the ReadOnly setting in VolumeMounts. - Defaults to false. - More info: https://kubernetes. - type: boolean - required: - - pdName - type: object - gitRepo: - description: |- - gitRepo represents a git repository at a particular revision. - DEPRECATED: GitRepo is deprecated. - properties: - directory: - description: |- - directory is the target directory name. - Must not contain or start with '..'. If '. - type: string - repository: - description: repository is the URL - type: string - revision: - description: revision is the commit hash for the - specified revision. - type: string - required: - - repository - type: object - glusterfs: - description: |- - glusterfs represents a Glusterfs mount on the host that shares a pod's lifetime. - More info: https://examples.k8s. - properties: - endpoints: - description: |- - endpoints is the endpoint name that details Glusterfs topology. - More info: https://examples.k8s. - type: string - path: - description: |- - path is the Glusterfs volume path. - More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod - type: string - readOnly: - description: |- - readOnly here will force the Glusterfs volume to be mounted with read-only permissions. - Defaults to false. - type: boolean - required: - - endpoints - - path - type: object - hostPath: - description: |- - hostPath represents a pre-existing file or directory on the host - machine that is directly exposed to the container. - properties: - path: - description: |- - path of the directory on the host. - If the path is a symlink, it will follow the link to the real path. - type: string - type: - description: |- - type for HostPath Volume - Defaults to "" - More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath - type: string - required: - - path - type: object - iscsi: - description: |- - iscsi represents an ISCSI Disk resource that is attached to a - kubelet's host machine and then exposed to the pod. - properties: - chapAuthDiscovery: - description: chapAuthDiscovery defines whether support - iSCSI Discovery CHAP authentication - type: boolean - chapAuthSession: - description: chapAuthSession defines whether support - iSCSI Session CHAP authentication - type: boolean - fsType: - description: fsType is the filesystem type of the - volume that you want to mount. - type: string - initiatorName: - description: initiatorName is the custom iSCSI Initiator - Name. - type: string - iqn: - description: iqn is the target iSCSI Qualified Name. - type: string - iscsiInterface: - description: |- - iscsiInterface is the interface Name that uses an iSCSI transport. - Defaults to 'default' (tcp). - type: string - lun: - description: lun represents iSCSI Target Lun number. - format: int32 - type: integer - portals: - description: portals is the iSCSI Target Portal - List. - items: - type: string - type: array - x-kubernetes-list-type: atomic - readOnly: - description: |- - readOnly here will force the ReadOnly setting in VolumeMounts. - Defaults to false. - type: boolean - secretRef: - description: secretRef is the CHAP Secret for iSCSI - target and initiator authentication - 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 - targetPortal: - description: targetPortal is iSCSI Target Portal. - type: string - required: - - iqn - - lun - - targetPortal - type: object - name: - description: |- - name of the volume. - Must be a DNS_LABEL and unique within the pod. - More info: https://kubernetes. - type: string - nfs: - description: |- - nfs represents an NFS mount on the host that shares a pod's lifetime - More info: https://kubernetes. - properties: - path: - description: |- - path that is exported by the NFS server. - More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs - type: string - readOnly: - description: |- - readOnly here will force the NFS export to be mounted with read-only permissions. - Defaults to false. - type: boolean - server: - description: |- - server is the hostname or IP address of the NFS server. - More info: https://kubernetes. - type: string - required: - - path - - server - type: object - persistentVolumeClaim: - description: |- - persistentVolumeClaimVolumeSource represents a reference to a - PersistentVolumeClaim in the same namespace. - properties: - claimName: - description: claimName is the name of a PersistentVolumeClaim - in the same namespace as the pod using this volume. - type: string - readOnly: - description: |- - readOnly Will force the ReadOnly setting in VolumeMounts. - Default false. - type: boolean - required: - - claimName - type: object - photonPersistentDisk: - description: photonPersistentDisk represents a PhotonController - persistent disk attached and mounted on kubelets host - machine - properties: - fsType: - description: |- - fsType is the filesystem type to mount. - Must be a filesystem type supported by the host operating system. - Ex. - type: string - pdID: - description: pdID is the ID that identifies Photon - Controller persistent disk - type: string - required: - - pdID - type: object - portworxVolume: - description: portworxVolume represents a portworx volume - attached and mounted on kubelets host machine - properties: - fsType: - description: |- - fSType represents the filesystem type to mount - Must be a filesystem type supported by the host operating system. - Ex. - type: string - readOnly: - description: |- - readOnly defaults to false (read/write). ReadOnly here will force - the ReadOnly setting in VolumeMounts. - type: boolean - volumeID: - description: volumeID uniquely identifies a Portworx - volume - type: string - required: - - volumeID - type: object - projected: - description: projected items for all in one resources - secrets, configmaps, and downward API - properties: - defaultMode: - description: defaultMode are the mode bits used - to set permissions on created files by default. - format: int32 - type: integer - sources: - description: sources is the list of volume projections - items: - description: Projection that may be projected - along with other supported volume types - properties: - clusterTrustBundle: - description: ClusterTrustBundle allows a pod - to access the `.spec. - properties: - labelSelector: - description: |- - Select all ClusterTrustBundles that match this label selector. Only has - effect if signerName is set. - properties: - matchExpressions: - description: matchExpressions is a - list of label selector requirements. - The requirements are ANDed. - items: - description: |- - A label selector requirement is a selector that contains values, a key, and an operator that - relates the key and values. - properties: - key: - description: key is the label - key that the selector applies - to. - type: string - operator: - description: |- - operator represents a key's relationship to a set of values. - Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: |- - values is an array of string values. If the operator is In or NotIn, - the values array must be non-empty. - items: - type: string - type: array - x-kubernetes-list-type: atomic - required: - - key - - operator - type: object - type: array - x-kubernetes-list-type: atomic - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map - of {key,value} pairs. - type: object - type: object - x-kubernetes-map-type: atomic - name: - description: |- - Select a single ClusterTrustBundle by object name. Mutually-exclusive - with signerName and labelSelector. - type: string - optional: - description: |- - If true, don't block pod startup if the referenced ClusterTrustBundle(s) - aren't available. - type: boolean - path: - description: Relative path from the volume - root to write the bundle. - type: string - signerName: - description: |- - Select all ClusterTrustBundles that match this signer name. - Mutually-exclusive with name. - type: string - required: - - path - type: object - configMap: - description: configMap information about the - configMap data to project - properties: - items: - description: |- - items if unspecified, each key-value pair in the Data field of the referenced - ConfigMap will be projected into the volum - items: - description: Maps a string key to a - path within a volume. - properties: - key: - description: key is the key to project. - type: string - mode: - description: 'mode is Optional: - mode bits used to set permissions - on this file.' - format: int32 - type: integer - path: - description: |- - path is the relative path of the file to map the key to. - May not be an absolute path. - type: string - required: - - key - - path - type: object - type: array - x-kubernetes-list-type: atomic - name: - default: "" - description: |- - Name of the referent. - This field is effectively required, but due to backwards compatibility is - allowed to be empty. - type: string - optional: - description: optional specify whether - the ConfigMap or its keys must be defined - type: boolean - type: object - x-kubernetes-map-type: atomic - downwardAPI: - description: downwardAPI information about - the downwardAPI data to project - properties: - items: - description: Items is a list of DownwardAPIVolume - file - items: - description: DownwardAPIVolumeFile represents - information to create the file containing - the pod field - properties: - fieldRef: - description: 'Required: Selects - a field of the pod: only annotations, - labels, name, namespace and uid - are supported.' - properties: - apiVersion: - description: Version of the - schema the FieldPath is written - in terms of, defaults to "v1". - type: string - fieldPath: - description: Path of the field - to select in the specified - API version. - type: string - required: - - fieldPath - type: object - x-kubernetes-map-type: atomic - mode: - description: |- - Optional: mode bits used to set permissions on this file, must be an octal value - between 0000 and 0777 or a decimal valu - format: int32 - type: integer - path: - description: 'Required: Path is the - relative path name of the file - to be created. Must not be absolute - or contain the ''..'' path.' - type: string - resourceFieldRef: - description: |- - Selects a resource of the container: only resources limits and requests - (limits.cpu, limits.memory, requests. - properties: - containerName: - description: 'Container name: - required for volumes, optional - for env vars' - type: string - divisor: - anyOf: - - type: integer - - type: string - description: Specifies the output - format of the exposed resources, - defaults to "1" - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - resource: - description: 'Required: resource - to select' - type: string - required: - - resource - type: object - x-kubernetes-map-type: atomic - required: - - path - type: object - type: array - x-kubernetes-list-type: atomic - type: object - secret: - description: secret information about the - secret data to project - properties: - items: - description: |- - items if unspecified, each key-value pair in the Data field of the referenced - Secret will be projected into the volume a - items: - description: Maps a string key to a - path within a volume. - properties: - key: - description: key is the key to project. - type: string - mode: - description: 'mode is Optional: - mode bits used to set permissions - on this file.' - format: int32 - type: integer - path: - description: |- - path is the relative path of the file to map the key to. - May not be an absolute path. - type: string - required: - - key - - path - type: object - type: array - x-kubernetes-list-type: atomic - name: - default: "" - description: |- - Name of the referent. - This field is effectively required, but due to backwards compatibility is - allowed to be empty. - type: string - optional: - description: optional field specify whether - the Secret or its key must be defined - type: boolean - type: object - x-kubernetes-map-type: atomic - serviceAccountToken: - description: serviceAccountToken is information - about the serviceAccountToken data to project - properties: - audience: - description: audience is the intended - audience of the token. - type: string - expirationSeconds: - description: |- - expirationSeconds is the requested duration of validity of the service - account token. - format: int64 - type: integer - path: - description: |- - path is the path relative to the mount point of the file to project the - token into. - type: string - required: - - path - type: object - type: object - type: array - x-kubernetes-list-type: atomic - type: object - quobyte: - description: quobyte represents a Quobyte mount on the - host that shares a pod's lifetime - properties: - group: - description: |- - group to map volume access to - Default is no group - type: string - readOnly: - description: |- - readOnly here will force the Quobyte volume to be mounted with read-only permissions. - Defaults to false. - type: boolean - registry: - description: |- - registry represents a single or multiple Quobyte Registry services - specified as a string as host:port pair (multiple ent - type: string - tenant: - description: |- - tenant owning the given Quobyte volume in the Backend - Used with dynamically provisioned Quobyte volumes, value is set by - type: string - user: - description: |- - user to map volume access to - Defaults to serivceaccount user - type: string - volume: - description: volume is a string that references - an already created Quobyte volume by name. - type: string - required: - - registry - - volume - type: object - rbd: - description: |- - rbd represents a Rados Block Device mount on the host that shares a pod's lifetime. - More info: https://examples.k8s. - properties: - fsType: - description: fsType is the filesystem type of the - volume that you want to mount. - type: string - image: - description: |- - image is the rados image name. - More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it - type: string - keyring: - description: |- - keyring is the path to key ring for RBDUser. - Default is /etc/ceph/keyring. - More info: https://examples.k8s. - type: string - monitors: - description: |- - monitors is a collection of Ceph monitors. - More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it - items: - type: string - type: array - x-kubernetes-list-type: atomic - pool: - description: |- - pool is the rados pool name. - Default is rbd. - More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it - type: string - readOnly: - description: |- - readOnly here will force the ReadOnly setting in VolumeMounts. - Defaults to false. - More info: https://examples.k8s. - type: boolean - secretRef: - description: |- - secretRef is name of the authentication secret for RBDUser. If provided - overrides keyring. - Default is nil. - 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 - user: - description: |- - user is the rados user name. - Default is admin. - More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it - type: string - required: - - image - - monitors - type: object - scaleIO: - description: scaleIO represents a ScaleIO persistent - volume attached and mounted on Kubernetes nodes. - properties: - fsType: - description: |- - fsType is the filesystem type to mount. - Must be a filesystem type supported by the host operating system. - Ex. - type: string - gateway: - description: gateway is the host address of the - ScaleIO API Gateway. - type: string - protectionDomain: - description: protectionDomain is the name of the - ScaleIO Protection Domain for the configured storage. - type: string - readOnly: - description: |- - readOnly Defaults to false (read/write). ReadOnly here will force - the ReadOnly setting in VolumeMounts. - type: boolean - secretRef: - description: |- - secretRef references to the secret for ScaleIO user and other - sensitive information. - 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 - sslEnabled: - description: sslEnabled Flag enable/disable SSL - communication with Gateway, default false - type: boolean - storageMode: - description: storageMode indicates whether the storage - for a volume should be ThickProvisioned or ThinProvisioned. - type: string - storagePool: - description: storagePool is the ScaleIO Storage - Pool associated with the protection domain. - type: string - system: - description: system is the name of the storage system - as configured in ScaleIO. - type: string - volumeName: - description: |- - volumeName is the name of a volume already created in the ScaleIO system - that is associated with this volume source. - type: string - required: - - gateway - - secretRef - - system - type: object - secret: - description: |- - secret represents a secret that should populate this volume. - More info: https://kubernetes. - properties: - defaultMode: - description: 'defaultMode is Optional: mode bits - used to set permissions on created files by default.' - format: int32 - type: integer - items: - description: |- - items If unspecified, each key-value pair in the Data field of the referenced - Secret will be projected into the volume a - items: - description: Maps a string key to a path within - a volume. - properties: - key: - description: key is the key to project. - type: string - mode: - description: 'mode is Optional: mode bits - used to set permissions on this file.' - format: int32 - type: integer - path: - description: |- - path is the relative path of the file to map the key to. - May not be an absolute path. - type: string - required: - - key - - path - type: object - type: array - x-kubernetes-list-type: atomic - optional: - description: optional field specify whether the - Secret or its keys must be defined - type: boolean - secretName: - description: |- - secretName is the name of the secret in the pod's namespace to use. - More info: https://kubernetes. - type: string - type: object - storageos: - description: storageOS represents a StorageOS volume - attached and mounted on Kubernetes nodes. - properties: - fsType: - description: |- - fsType is the filesystem type to mount. - Must be a filesystem type supported by the host operating system. - Ex. - type: string - readOnly: - description: |- - readOnly defaults to false (read/write). ReadOnly here will force - the ReadOnly setting in VolumeMounts. - type: boolean - secretRef: - description: |- - secretRef specifies the secret to use for obtaining the StorageOS API - credentials. - 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 - volumeName: - description: |- - volumeName is the human-readable name of the StorageOS volume. Volume - names are only unique within a namespace. - type: string - volumeNamespace: - description: volumeNamespace specifies the scope - of the volume within StorageOS. - type: string - type: object - vsphereVolume: - description: vsphereVolume represents a vSphere volume - attached and mounted on kubelets host machine - properties: - fsType: - description: |- - fsType is filesystem type to mount. - Must be a filesystem type supported by the host operating system. - Ex. - type: string - storagePolicyID: - description: storagePolicyID is the storage Policy - Based Management (SPBM) profile ID associated - with the StoragePolicyName. - type: string - storagePolicyName: - description: storagePolicyName is the storage Policy - Based Management (SPBM) profile name. - type: string - volumePath: - description: volumePath is the path that identifies - vSphere volume vmdk - type: string - required: - - volumePath - type: object - required: - - name - type: object - type: array - type: object - required: - - feastProject - type: object - clientConfigMap: - description: ConfigMap in this namespace containing a client `feature_store.yaml` - for this feast deployment - type: string - conditions: - items: - description: Condition contains details for one aspect of the current - state of this API Resource. - properties: - lastTransitionTime: - description: lastTransitionTime is the last time the condition - transitioned from one status to another. - format: date-time - type: string - message: - description: |- - message is a human readable message indicating details about the transition. - This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: |- - observedGeneration represents the .metadata.generation that the condition was set based upon. - For instance, if . - format: int64 - minimum: 0 - type: integer - reason: - description: reason contains a programmatic identifier indicating - the reason for the condition's last transition. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: |- - type of condition in CamelCase or in foo.example.com/CamelCase. - --- - Many .condition. - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - type: array - cronJob: - description: CronJob in this namespace for this feast deployment - type: string - feastVersion: - type: string - phase: - type: string - serviceHostnames: - description: ServiceHostnames defines the service hostnames in the - format of :, e.g. example.svc.cluster.local:80 - properties: - offlineStore: - type: string - onlineStore: - type: string - registry: - type: string - registryRest: - type: string - ui: - type: string - type: object type: object + x-kubernetes-preserve-unknown-fields: true type: object served: true - storage: true + storage: false subresources: status: {} --- diff --git a/infra/feast-operator/docs/api/markdown/ref.md b/infra/feast-operator/docs/api/markdown/ref.md index 6cdf94d38a7..2430a1a8c9c 100644 --- a/infra/feast-operator/docs/api/markdown/ref.md +++ b/infra/feast-operator/docs/api/markdown/ref.md @@ -1,12 +1,12 @@ # API Reference ## Packages -- [feast.dev/v1alpha1](#feastdevv1alpha1) +- [feast.dev/v1](#feastdevv1) -## feast.dev/v1alpha1 +## feast.dev/v1 -Package v1alpha1 contains API Schema definitions for the v1alpha1 API group +Package v1 contains API Schema definitions for the v1 API group ### Resource Types - [FeatureStore](#featurestore) @@ -166,7 +166,7 @@ FeatureStore is the Schema for the featurestores API | Field | Description | | --- | --- | -| `apiVersion` _string_ | `feast.dev/v1alpha1` +| `apiVersion` _string_ | `feast.dev/v1` | `kind` _string_ | `FeatureStore` | `metadata` _[ObjectMeta](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.30/#objectmeta-v1-meta)_ | Refer to Kubernetes API documentation for fields of `metadata`. | | `spec` _[FeatureStoreSpec](#featurestorespec)_ | | diff --git a/infra/feast-operator/internal/controller/authz/authz.go b/infra/feast-operator/internal/controller/authz/authz.go index 33a3594607f..9cb5b7c9554 100644 --- a/infra/feast-operator/internal/controller/authz/authz.go +++ b/infra/feast-operator/internal/controller/authz/authz.go @@ -4,7 +4,7 @@ import ( "context" "slices" - feastdevv1alpha1 "github.com/feast-dev/feast/infra/feast-operator/api/v1alpha1" + feastdevv1 "github.com/feast-dev/feast/infra/feast-operator/api/v1" "github.com/feast-dev/feast/infra/feast-operator/internal/controller/services" rbacv1 "k8s.io/api/rbac/v1" apimeta "k8s.io/apimachinery/pkg/api/meta" @@ -337,7 +337,7 @@ func (authz *FeastAuthorization) getFeastRoleName() string { return GetFeastRoleName(authz.Handler.FeatureStore) } -func GetFeastRoleName(featureStore *feastdevv1alpha1.FeatureStore) string { +func GetFeastRoleName(featureStore *feastdevv1.FeatureStore) string { return services.GetFeastName(featureStore) } @@ -345,7 +345,7 @@ func (authz *FeastAuthorization) getFeastClusterRoleName() string { return GetFeastClusterRoleName(authz.Handler.FeatureStore) } -func GetFeastClusterRoleName(featureStore *feastdevv1alpha1.FeatureStore) string { +func GetFeastClusterRoleName(featureStore *feastdevv1.FeatureStore) string { // Use a shared ClusterRole name for all Feast instances // This allows multiple FeatureStores to share the same Token Access Review permissions return "feast-token-review-cluster-role" @@ -355,7 +355,7 @@ func (authz *FeastAuthorization) getFeastClusterRoleBindingName() string { return GetFeastClusterRoleBindingName(authz.Handler.FeatureStore) } -func GetFeastClusterRoleBindingName(featureStore *feastdevv1alpha1.FeatureStore) string { +func GetFeastClusterRoleBindingName(featureStore *feastdevv1.FeatureStore) string { return services.GetFeastName(featureStore) + "-cluster-binding" } diff --git a/infra/feast-operator/internal/controller/authz/authz_types.go b/infra/feast-operator/internal/controller/authz/authz_types.go index f955f5b40f1..aea5e5f7a65 100644 --- a/infra/feast-operator/internal/controller/authz/authz_types.go +++ b/infra/feast-operator/internal/controller/authz/authz_types.go @@ -1,7 +1,7 @@ package authz import ( - feastdevv1alpha1 "github.com/feast-dev/feast/infra/feast-operator/api/v1alpha1" + feastdevv1 "github.com/feast-dev/feast/infra/feast-operator/api/v1" "github.com/feast-dev/feast/infra/feast-operator/internal/controller/handler" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -14,15 +14,15 @@ type FeastAuthorization struct { var ( feastKubernetesAuthConditions = map[metav1.ConditionStatus]metav1.Condition{ metav1.ConditionTrue: { - Type: feastdevv1alpha1.AuthorizationReadyType, + Type: feastdevv1.AuthorizationReadyType, Status: metav1.ConditionTrue, - Reason: feastdevv1alpha1.ReadyReason, - Message: feastdevv1alpha1.KubernetesAuthzReadyMessage, + Reason: feastdevv1.ReadyReason, + Message: feastdevv1.KubernetesAuthzReadyMessage, }, metav1.ConditionFalse: { - Type: feastdevv1alpha1.AuthorizationReadyType, + Type: feastdevv1.AuthorizationReadyType, Status: metav1.ConditionFalse, - Reason: feastdevv1alpha1.KubernetesAuthzFailedReason, + Reason: feastdevv1.KubernetesAuthzFailedReason, }, } ) diff --git a/infra/feast-operator/internal/controller/featurestore_controller.go b/infra/feast-operator/internal/controller/featurestore_controller.go index 74d8c0af9ab..912fdb1154b 100644 --- a/infra/feast-operator/internal/controller/featurestore_controller.go +++ b/infra/feast-operator/internal/controller/featurestore_controller.go @@ -36,7 +36,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/reconcile" - feastdevv1alpha1 "github.com/feast-dev/feast/infra/feast-operator/api/v1alpha1" + feastdevv1 "github.com/feast-dev/feast/infra/feast-operator/api/v1" "github.com/feast-dev/feast/infra/feast-operator/internal/controller/authz" feasthandler "github.com/feast-dev/feast/infra/feast-operator/internal/controller/handler" "github.com/feast-dev/feast/infra/feast-operator/internal/controller/services" @@ -73,14 +73,14 @@ type FeatureStoreReconciler struct { func (r *FeatureStoreReconciler) Reconcile(ctx context.Context, req ctrl.Request) (result ctrl.Result, recErr error) { logger := log.FromContext(ctx) - cr := &feastdevv1alpha1.FeatureStore{} + cr := &feastdevv1.FeatureStore{} err := r.Get(ctx, req.NamespacedName, cr) if err != nil { if apierrors.IsNotFound(err) { // CR deleted since request queued, child objects getting GC'd, no requeue logger.V(1).Info("FeatureStore CR not found, has been deleted") // Clean up namespace registry entry even if the CR is not found - if err := r.cleanupNamespaceRegistry(ctx, &feastdevv1alpha1.FeatureStore{ + if err := r.cleanupNamespaceRegistry(ctx, &feastdevv1.FeatureStore{ ObjectMeta: metav1.ObjectMeta{ Name: req.NamespacedName.Name, Namespace: req.NamespacedName.Namespace, @@ -142,13 +142,13 @@ func (r *FeatureStoreReconciler) Reconcile(ctx context.Context, req ctrl.Request return result, recErr } -func (r *FeatureStoreReconciler) deployFeast(ctx context.Context, cr *feastdevv1alpha1.FeatureStore) (result ctrl.Result, err error) { +func (r *FeatureStoreReconciler) deployFeast(ctx context.Context, cr *feastdevv1.FeatureStore) (result ctrl.Result, err error) { logger := log.FromContext(ctx) condition := metav1.Condition{ - Type: feastdevv1alpha1.ReadyType, + Type: feastdevv1.ReadyType, Status: metav1.ConditionTrue, - Reason: feastdevv1alpha1.ReadyReason, - Message: feastdevv1alpha1.ReadyMessage, + Reason: feastdevv1.ReadyReason, + Message: feastdevv1.ReadyMessage, } feast := services.FeastServices{ Handler: feasthandler.FeastHandler{ @@ -173,19 +173,19 @@ func (r *FeatureStoreReconciler) deployFeast(ctx context.Context, cr *feastdevv1 } if err != nil { condition = metav1.Condition{ - Type: feastdevv1alpha1.ReadyType, + Type: feastdevv1.ReadyType, Status: metav1.ConditionFalse, - Reason: feastdevv1alpha1.FailedReason, + Reason: feastdevv1.FailedReason, Message: "Error: " + err.Error(), } } else { deployment, deploymentErr := feast.GetDeployment() if deploymentErr != nil { condition = metav1.Condition{ - Type: feastdevv1alpha1.ReadyType, + Type: feastdevv1.ReadyType, Status: metav1.ConditionUnknown, - Reason: feastdevv1alpha1.DeploymentNotAvailableReason, - Message: feastdevv1alpha1.DeploymentNotAvailableMessage, + Reason: feastdevv1.DeploymentNotAvailableReason, + Message: feastdevv1.DeploymentNotAvailableMessage, } result = errResult @@ -193,10 +193,10 @@ func (r *FeatureStoreReconciler) deployFeast(ctx context.Context, cr *feastdevv1 isDeployAvailable := services.IsDeploymentAvailable(deployment.Status.Conditions) if !isDeployAvailable { condition = metav1.Condition{ - Type: feastdevv1alpha1.ReadyType, + Type: feastdevv1.ReadyType, Status: metav1.ConditionUnknown, - Reason: feastdevv1alpha1.DeploymentNotAvailableReason, - Message: feastdevv1alpha1.DeploymentNotAvailableMessage, + Reason: feastdevv1.DeploymentNotAvailableReason, + Message: feastdevv1.DeploymentNotAvailableMessage, } result = errResult @@ -206,12 +206,12 @@ func (r *FeatureStoreReconciler) deployFeast(ctx context.Context, cr *feastdevv1 logger.Info(condition.Message) apimeta.SetStatusCondition(&cr.Status.Conditions, condition) - if apimeta.IsStatusConditionTrue(cr.Status.Conditions, feastdevv1alpha1.ReadyType) { - cr.Status.Phase = feastdevv1alpha1.ReadyPhase - } else if apimeta.IsStatusConditionFalse(cr.Status.Conditions, feastdevv1alpha1.ReadyType) { - cr.Status.Phase = feastdevv1alpha1.FailedPhase + if apimeta.IsStatusConditionTrue(cr.Status.Conditions, feastdevv1.ReadyType) { + cr.Status.Phase = feastdevv1.ReadyPhase + } else if apimeta.IsStatusConditionFalse(cr.Status.Conditions, feastdevv1.ReadyType) { + cr.Status.Phase = feastdevv1.FailedPhase } else { - cr.Status.Phase = feastdevv1alpha1.PendingPhase + cr.Status.Phase = feastdevv1.PendingPhase } return result, err @@ -220,7 +220,7 @@ func (r *FeatureStoreReconciler) deployFeast(ctx context.Context, cr *feastdevv1 // SetupWithManager sets up the controller with the Manager. func (r *FeatureStoreReconciler) SetupWithManager(mgr ctrl.Manager) error { bldr := ctrl.NewControllerManagedBy(mgr). - For(&feastdevv1alpha1.FeatureStore{}). + For(&feastdevv1.FeatureStore{}). Owns(&corev1.ConfigMap{}). Owns(&appsv1.Deployment{}). Owns(&corev1.Service{}). @@ -229,7 +229,7 @@ func (r *FeatureStoreReconciler) SetupWithManager(mgr ctrl.Manager) error { Owns(&rbacv1.RoleBinding{}). Owns(&rbacv1.Role{}). Owns(&batchv1.CronJob{}). - Watches(&feastdevv1alpha1.FeatureStore{}, handler.EnqueueRequestsFromMapFunc(r.mapFeastRefsToFeastRequests)) + Watches(&feastdevv1.FeatureStore{}, handler.EnqueueRequestsFromMapFunc(r.mapFeastRefsToFeastRequests)) if services.IsOpenShift() { bldr = bldr.Owns(&routev1.Route{}) } @@ -239,7 +239,7 @@ func (r *FeatureStoreReconciler) SetupWithManager(mgr ctrl.Manager) error { } // cleanupNamespaceRegistry removes the feature store instance from the namespace registry -func (r *FeatureStoreReconciler) cleanupNamespaceRegistry(ctx context.Context, cr *feastdevv1alpha1.FeatureStore) error { +func (r *FeatureStoreReconciler) cleanupNamespaceRegistry(ctx context.Context, cr *feastdevv1.FeatureStore) error { feast := services.FeastServices{ Handler: feasthandler.FeastHandler{ Client: r.Client, @@ -255,10 +255,10 @@ func (r *FeatureStoreReconciler) cleanupNamespaceRegistry(ctx context.Context, c // if a remotely referenced FeatureStore is changed, reconcile any FeatureStores that reference it. func (r *FeatureStoreReconciler) mapFeastRefsToFeastRequests(ctx context.Context, object client.Object) []reconcile.Request { logger := log.FromContext(ctx) - feastRef := object.(*feastdevv1alpha1.FeatureStore) + feastRef := object.(*feastdevv1.FeatureStore) // list all FeatureStores in the cluster - var feastList feastdevv1alpha1.FeatureStoreList + var feastList feastdevv1.FeatureStoreList if err := r.List(ctx, &feastList, client.InNamespace("")); err != nil { logger.Error(err, "could not list FeatureStores. "+ "FeatureStores affected by changes to the referenced FeatureStore object will not be reconciled.") diff --git a/infra/feast-operator/internal/controller/featurestore_controller_cronjob_test.go b/infra/feast-operator/internal/controller/featurestore_controller_cronjob_test.go index b72e191ae34..c329d70f06d 100644 --- a/infra/feast-operator/internal/controller/featurestore_controller_cronjob_test.go +++ b/infra/feast-operator/internal/controller/featurestore_controller_cronjob_test.go @@ -30,7 +30,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" "sigs.k8s.io/controller-runtime/pkg/reconcile" - feastdevv1alpha1 "github.com/feast-dev/feast/infra/feast-operator/api/v1alpha1" + feastdevv1 "github.com/feast-dev/feast/infra/feast-operator/api/v1" "github.com/feast-dev/feast/infra/feast-operator/internal/controller/handler" "github.com/feast-dev/feast/infra/feast-operator/internal/controller/services" ) @@ -45,24 +45,24 @@ var _ = Describe("FeatureStore Controller - Feast CronJob", func() { Name: resourceName, Namespace: "default", } - featurestore := &feastdevv1alpha1.FeatureStore{} + featurestore := &feastdevv1.FeatureStore{} BeforeEach(func() { By("creating the custom resource for the Kind FeatureStore") err := k8sClient.Get(ctx, typeNamespacedName, featurestore) if err != nil && errors.IsNotFound(err) { - resource := &feastdevv1alpha1.FeatureStore{ + resource := &feastdevv1.FeatureStore{ ObjectMeta: metav1.ObjectMeta{ Name: resourceName, Namespace: "default", }, - Spec: feastdevv1alpha1.FeatureStoreSpec{FeastProject: feastProject}, + Spec: feastdevv1.FeatureStoreSpec{FeastProject: feastProject}, } Expect(k8sClient.Create(ctx, resource)).To(Succeed()) } }) AfterEach(func() { - resource := &feastdevv1alpha1.FeatureStore{} + resource := &feastdevv1.FeatureStore{} err := k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) @@ -82,7 +82,7 @@ var _ = Describe("FeatureStore Controller - Feast CronJob", func() { }) Expect(err).NotTo(HaveOccurred()) - resource := &feastdevv1alpha1.FeatureStore{} + resource := &feastdevv1.FeatureStore{} err = k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) feast := services.FeastServices{ @@ -100,12 +100,12 @@ var _ = Describe("FeatureStore Controller - Feast CronJob", func() { Expect(resource.Status.Applied.CronJob.Schedule).NotTo(BeEmpty()) Expect(resource.Status.Conditions).NotTo(BeEmpty()) - cond := apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.CronJobReadyType) + cond := apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.CronJobReadyType) Expect(cond).ToNot(BeNil()) - Expect(cond.Type).To(Equal(feastdevv1alpha1.CronJobReadyType)) + Expect(cond.Type).To(Equal(feastdevv1.CronJobReadyType)) Expect(cond.Status).To(Equal(metav1.ConditionTrue)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.CronJobReadyMessage)) + Expect(cond.Reason).To(Equal(feastdevv1.ReadyReason)) + Expect(cond.Message).To(Equal(feastdevv1.CronJobReadyMessage)) // check CronJob cronJob := &batchv1.CronJob{} @@ -137,7 +137,7 @@ var _ = Describe("FeatureStore Controller - Feast CronJob", func() { }) Expect(err).NotTo(HaveOccurred()) - resource := &feastdevv1alpha1.FeatureStore{} + resource := &feastdevv1.FeatureStore{} err = k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) @@ -151,7 +151,7 @@ var _ = Describe("FeatureStore Controller - Feast CronJob", func() { replacementPolicy := batchv1.TerminatingOrFailed always := corev1.PullAlways startingDeadlineSeconds := int64(6) - resource.Spec.CronJob = &feastdevv1alpha1.FeastCronJob{ + resource.Spec.CronJob = &feastdevv1.FeastCronJob{ Schedule: schedule, StartingDeadlineSeconds: &startingDeadlineSeconds, TimeZone: &timeZone, @@ -159,7 +159,7 @@ var _ = Describe("FeatureStore Controller - Feast CronJob", func() { Suspend: &suspend, SuccessfulJobsHistoryLimit: &int32Var, FailedJobsHistoryLimit: &int32Var, - ContainerConfigs: &feastdevv1alpha1.CronJobContainerConfigs{ + ContainerConfigs: &feastdevv1.CronJobContainerConfigs{ Commands: []string{ "feast apply", "feast feature-views list", @@ -167,11 +167,11 @@ var _ = Describe("FeatureStore Controller - Feast CronJob", func() { "feast on-demand-feature-views list", "feast projects list", }, - ContainerConfigs: feastdevv1alpha1.ContainerConfigs{ - DefaultCtrConfigs: feastdevv1alpha1.DefaultCtrConfigs{ + ContainerConfigs: feastdevv1.ContainerConfigs{ + DefaultCtrConfigs: feastdevv1.DefaultCtrConfigs{ Image: &image, }, - OptionalCtrConfigs: feastdevv1alpha1.OptionalCtrConfigs{ + OptionalCtrConfigs: feastdevv1.OptionalCtrConfigs{ Env: &[]corev1.EnvVar{ { Name: "test", @@ -182,7 +182,7 @@ var _ = Describe("FeatureStore Controller - Feast CronJob", func() { }, }, }, - JobSpec: &feastdevv1alpha1.JobSpec{ + JobSpec: &feastdevv1.JobSpec{ Parallelism: &int32Var, Completions: &int32Var, ActiveDeadlineSeconds: &int64Var, @@ -223,12 +223,12 @@ var _ = Describe("FeatureStore Controller - Feast CronJob", func() { Expect(resource.Status.Applied.CronJob.FailedJobsHistoryLimit).To(Equal(&int32Var)) Expect(resource.Status.Conditions).NotTo(BeEmpty()) - cond := apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.CronJobReadyType) + cond := apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.CronJobReadyType) Expect(cond).ToNot(BeNil()) - Expect(cond.Type).To(Equal(feastdevv1alpha1.CronJobReadyType)) + Expect(cond.Type).To(Equal(feastdevv1.CronJobReadyType)) Expect(cond.Status).To(Equal(metav1.ConditionTrue)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.CronJobReadyMessage)) + Expect(cond.Reason).To(Equal(feastdevv1.ReadyReason)) + Expect(cond.Message).To(Equal(feastdevv1.CronJobReadyMessage)) // check CronJob cronJob := &batchv1.CronJob{} @@ -247,7 +247,7 @@ var _ = Describe("FeatureStore Controller - Feast CronJob", func() { }) }) -func checkCronJob(appliedFeastCronJob *feastdevv1alpha1.FeastCronJob, cronSpec batchv1.CronJobSpec) { +func checkCronJob(appliedFeastCronJob *feastdevv1.FeastCronJob, cronSpec batchv1.CronJobSpec) { Expect(appliedFeastCronJob).NotTo(BeNil()) Expect(appliedFeastCronJob.Schedule).To(Equal(cronSpec.Schedule)) if len(appliedFeastCronJob.ConcurrencyPolicy) > 0 { @@ -272,7 +272,7 @@ func checkCronJob(appliedFeastCronJob *feastdevv1alpha1.FeastCronJob, cronSpec b checkCronJobContainers(appliedFeastCronJob.ContainerConfigs, cronSpec.JobTemplate.Spec.Template.Spec) } -func checkJobSpec(appliedFeastJobSpec *feastdevv1alpha1.JobSpec, jobSpec batchv1.JobSpec) { +func checkJobSpec(appliedFeastJobSpec *feastdevv1.JobSpec, jobSpec batchv1.JobSpec) { if appliedFeastJobSpec != nil { if appliedFeastJobSpec.ActiveDeadlineSeconds != nil { Expect(appliedFeastJobSpec.ActiveDeadlineSeconds).To(Equal(jobSpec.ActiveDeadlineSeconds)) @@ -310,7 +310,7 @@ func checkJobSpec(appliedFeastJobSpec *feastdevv1alpha1.JobSpec, jobSpec batchv1 } } -func checkCronJobContainers(cronJobContainerConfigs *feastdevv1alpha1.CronJobContainerConfigs, podSpec corev1.PodSpec) { +func checkCronJobContainers(cronJobContainerConfigs *feastdevv1.CronJobContainerConfigs, podSpec corev1.PodSpec) { Expect(cronJobContainerConfigs).NotTo(BeNil()) Expect(cronJobContainerConfigs.Image).NotTo(BeNil()) Expect(cronJobContainerConfigs.Commands).NotTo(BeEmpty()) diff --git a/infra/feast-operator/internal/controller/featurestore_controller_db_store_test.go b/infra/feast-operator/internal/controller/featurestore_controller_db_store_test.go index b9b21ad5540..d17bffb2377 100644 --- a/infra/feast-operator/internal/controller/featurestore_controller_db_store_test.go +++ b/infra/feast-operator/internal/controller/featurestore_controller_db_store_test.go @@ -39,7 +39,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/reconcile" "github.com/feast-dev/feast/infra/feast-operator/api/feastversion" - feastdevv1alpha1 "github.com/feast-dev/feast/infra/feast-operator/api/v1alpha1" + feastdevv1 "github.com/feast-dev/feast/infra/feast-operator/api/v1" "github.com/feast-dev/feast/infra/feast-operator/internal/controller/services" ) @@ -150,7 +150,7 @@ var _ = Describe("FeatureStore Controller - db storage services", func() { Namespace: "default", } - featurestore := &feastdevv1alpha1.FeatureStore{} + featurestore := &feastdevv1.FeatureStore{} offlineType := services.OfflineDBPersistenceSnowflakeConfigType onlineType := services.OnlineDBPersistenceCassandraConfigType registryType := services.RegistryDBPersistenceSQLConfigType @@ -208,24 +208,24 @@ var _ = Describe("FeatureStore Controller - db storage services", func() { err = k8sClient.Get(ctx, typeNamespacedName, featurestore) if err != nil && errors.IsNotFound(err) { resource := createFeatureStoreResource(resourceName, image, pullPolicy, &[]corev1.EnvVar{}, withEnvFrom()) - resource.Spec.Services.OfflineStore.Persistence = &feastdevv1alpha1.OfflineStorePersistence{ - DBPersistence: &feastdevv1alpha1.OfflineStoreDBStorePersistence{ + resource.Spec.Services.OfflineStore.Persistence = &feastdevv1.OfflineStorePersistence{ + DBPersistence: &feastdevv1.OfflineStoreDBStorePersistence{ Type: string(offlineType), SecretRef: corev1.LocalObjectReference{ Name: "offline-store-secret", }, }, } - resource.Spec.Services.OnlineStore.Persistence = &feastdevv1alpha1.OnlineStorePersistence{ - DBPersistence: &feastdevv1alpha1.OnlineStoreDBStorePersistence{ + resource.Spec.Services.OnlineStore.Persistence = &feastdevv1.OnlineStorePersistence{ + DBPersistence: &feastdevv1.OnlineStoreDBStorePersistence{ Type: string(onlineType), SecretRef: corev1.LocalObjectReference{ Name: "online-store-secret", }, }, } - resource.Spec.Services.Registry.Local.Persistence = &feastdevv1alpha1.RegistryPersistence{ - DBPersistence: &feastdevv1alpha1.RegistryDBStorePersistence{ + resource.Spec.Services.Registry.Local.Persistence = &feastdevv1.RegistryPersistence{ + DBPersistence: &feastdevv1.RegistryDBStorePersistence{ Type: string(registryType), SecretRef: corev1.LocalObjectReference{ Name: "registry-store-secret", @@ -250,7 +250,7 @@ var _ = Describe("FeatureStore Controller - db storage services", func() { err = k8sClient.Get(ctx, registrySecretNamespacedName, registrySecret) Expect(err).NotTo(HaveOccurred()) - resource := &feastdevv1alpha1.FeatureStore{} + resource := &feastdevv1.FeatureStore{} err = k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) @@ -267,7 +267,7 @@ var _ = Describe("FeatureStore Controller - db storage services", func() { It("should fail reconciling the resource", func() { By("Referring to a secret that doesn't exist") - resource := &feastdevv1alpha1.FeatureStore{} + resource := &feastdevv1.FeatureStore{} err := k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) @@ -287,14 +287,14 @@ var _ = Describe("FeatureStore Controller - db storage services", func() { Expect(err.Error()).To(Equal("secrets \"invalid_secret\" not found")) By("Referring to a secret with a key that doesn't exist") - resource = &feastdevv1alpha1.FeatureStore{} + resource = &feastdevv1.FeatureStore{} err = k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) resource.Spec.Services.OnlineStore.Persistence.DBPersistence.SecretRef = corev1.LocalObjectReference{Name: "online-store-secret"} resource.Spec.Services.OnlineStore.Persistence.DBPersistence.SecretKeyName = "invalid.secret.key" Expect(k8sClient.Update(ctx, resource)).To(Succeed()) - resource = &feastdevv1alpha1.FeatureStore{} + resource = &feastdevv1.FeatureStore{} err = k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) @@ -306,7 +306,7 @@ var _ = Describe("FeatureStore Controller - db storage services", func() { Expect(err.Error()).To(Equal("secret key invalid.secret.key doesn't exist in secret online-store-secret")) By("Referring to a secret that contains parameter named type with invalid value") - resource = &feastdevv1alpha1.FeatureStore{} + resource = &feastdevv1.FeatureStore{} err = k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) @@ -319,7 +319,7 @@ var _ = Describe("FeatureStore Controller - db storage services", func() { resource.Spec.Services.OnlineStore.Persistence.DBPersistence.SecretRef = corev1.LocalObjectReference{Name: "online-store-secret"} resource.Spec.Services.OnlineStore.Persistence.DBPersistence.SecretKeyName = "" Expect(k8sClient.Update(ctx, resource)).To(Succeed()) - resource = &feastdevv1alpha1.FeatureStore{} + resource = &feastdevv1.FeatureStore{} err = k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) @@ -343,7 +343,7 @@ var _ = Describe("FeatureStore Controller - db storage services", func() { }) Expect(err).NotTo(HaveOccurred()) - resource := &feastdevv1alpha1.FeatureStore{} + resource := &feastdevv1.FeatureStore{} err = k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) @@ -392,42 +392,42 @@ var _ = Describe("FeatureStore Controller - db storage services", func() { Expect(resource.Status.ServiceHostnames.Registry).To(Equal(feast.GetFeastServiceName(services.RegistryFeastType) + "." + resource.Namespace + domain)) Expect(resource.Status.Conditions).NotTo(BeEmpty()) - cond := apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.ReadyType) + cond := apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.ReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionUnknown)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.DeploymentNotAvailableReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.ReadyType)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.DeploymentNotAvailableMessage)) + Expect(cond.Reason).To(Equal(feastdevv1.DeploymentNotAvailableReason)) + Expect(cond.Type).To(Equal(feastdevv1.ReadyType)) + Expect(cond.Message).To(Equal(feastdevv1.DeploymentNotAvailableMessage)) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.RegistryReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.RegistryReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionTrue)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.RegistryReadyType)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.RegistryReadyMessage)) + Expect(cond.Reason).To(Equal(feastdevv1.ReadyReason)) + Expect(cond.Type).To(Equal(feastdevv1.RegistryReadyType)) + Expect(cond.Message).To(Equal(feastdevv1.RegistryReadyMessage)) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.ClientReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.ClientReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionTrue)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.ClientReadyType)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.ClientReadyMessage)) + Expect(cond.Reason).To(Equal(feastdevv1.ReadyReason)) + Expect(cond.Type).To(Equal(feastdevv1.ClientReadyType)) + Expect(cond.Message).To(Equal(feastdevv1.ClientReadyMessage)) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.OfflineStoreReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.OfflineStoreReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionTrue)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.OfflineStoreReadyType)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.OfflineStoreReadyMessage)) + Expect(cond.Reason).To(Equal(feastdevv1.ReadyReason)) + Expect(cond.Type).To(Equal(feastdevv1.OfflineStoreReadyType)) + Expect(cond.Message).To(Equal(feastdevv1.OfflineStoreReadyMessage)) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.OnlineStoreReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.OnlineStoreReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionTrue)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.OnlineStoreReadyType)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.OnlineStoreReadyMessage)) + Expect(cond.Reason).To(Equal(feastdevv1.ReadyReason)) + Expect(cond.Type).To(Equal(feastdevv1.OnlineStoreReadyType)) + Expect(cond.Message).To(Equal(feastdevv1.OnlineStoreReadyMessage)) - Expect(resource.Status.Phase).To(Equal(feastdevv1alpha1.PendingPhase)) + Expect(resource.Status.Phase).To(Equal(feastdevv1.PendingPhase)) // check deployment deploy := &appsv1.Deployment{} @@ -451,7 +451,7 @@ var _ = Describe("FeatureStore Controller - db storage services", func() { Expect(svc.Spec.Ports[0].TargetPort).To(Equal(intstr.FromInt(int(services.FeastServiceConstants[services.RegistryFeastType].TargetHttpPort)))) By("Referring to a secret that contains parameter named type") - resource = &feastdevv1alpha1.FeatureStore{} + resource = &feastdevv1.FeatureStore{} err = k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) @@ -464,7 +464,7 @@ var _ = Describe("FeatureStore Controller - db storage services", func() { resource.Spec.Services.OnlineStore.Persistence.DBPersistence.SecretRef = corev1.LocalObjectReference{Name: "online-store-secret"} resource.Spec.Services.OnlineStore.Persistence.DBPersistence.SecretKeyName = "" Expect(k8sClient.Update(ctx, resource)).To(Succeed()) - resource = &feastdevv1alpha1.FeatureStore{} + resource = &feastdevv1.FeatureStore{} err = k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) @@ -475,7 +475,7 @@ var _ = Describe("FeatureStore Controller - db storage services", func() { Expect(err).To(Not(HaveOccurred())) By("Referring to a secret that contains parameter named registry_type") - resource = &feastdevv1alpha1.FeatureStore{} + resource = &feastdevv1.FeatureStore{} err = k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) @@ -495,7 +495,7 @@ var _ = Describe("FeatureStore Controller - db storage services", func() { resource.Spec.Services.Registry.Local.Persistence.DBPersistence.SecretRef = corev1.LocalObjectReference{Name: "registry-store-secret"} resource.Spec.Services.Registry.Local.Persistence.DBPersistence.SecretKeyName = "" Expect(k8sClient.Update(ctx, resource)).To(Succeed()) - resource = &feastdevv1alpha1.FeatureStore{} + resource = &feastdevv1.FeatureStore{} err = k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) @@ -517,7 +517,7 @@ var _ = Describe("FeatureStore Controller - db storage services", func() { }) Expect(err).NotTo(HaveOccurred()) - resource := &feastdevv1alpha1.FeatureStore{} + resource := &feastdevv1.FeatureStore{} err = k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) @@ -582,7 +582,7 @@ var _ = Describe("FeatureStore Controller - db storage services", func() { testConfig := &services.RepoConfig{ Project: feastProject, Provider: services.LocalProviderType, - EntityKeySerializationVersion: feastdevv1alpha1.SerializationVersion, + EntityKeySerializationVersion: feastdevv1.SerializationVersion, OfflineStore: services.OfflineStoreConfig{ Type: services.OfflineDBPersistenceSnowflakeConfigType, DBParameters: unmarshallYamlString(snowflakeYamlString), @@ -663,7 +663,7 @@ var _ = Describe("FeatureStore Controller - db storage services", func() { clientConfig := &services.RepoConfig{ Project: feastProject, Provider: services.LocalProviderType, - EntityKeySerializationVersion: feastdevv1alpha1.SerializationVersion, + EntityKeySerializationVersion: feastdevv1.SerializationVersion, OfflineStore: offlineRemote, OnlineStore: services.OnlineStoreConfig{ Path: fmt.Sprintf("http://feast-%s-online.default.svc.cluster.local:80", resourceName), @@ -688,7 +688,7 @@ var _ = Describe("FeatureStore Controller - db storage services", func() { }) Expect(err).NotTo(HaveOccurred()) - resource = &feastdevv1alpha1.FeatureStore{} + resource = &feastdevv1.FeatureStore{} err = k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) feast.Handler.FeatureStore = resource diff --git a/infra/feast-operator/internal/controller/featurestore_controller_ephemeral_test.go b/infra/feast-operator/internal/controller/featurestore_controller_ephemeral_test.go index 5c2270bcaad..212fa80228b 100644 --- a/infra/feast-operator/internal/controller/featurestore_controller_ephemeral_test.go +++ b/infra/feast-operator/internal/controller/featurestore_controller_ephemeral_test.go @@ -38,7 +38,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/reconcile" "github.com/feast-dev/feast/infra/feast-operator/api/feastversion" - feastdevv1alpha1 "github.com/feast-dev/feast/infra/feast-operator/api/v1alpha1" + feastdevv1 "github.com/feast-dev/feast/infra/feast-operator/api/v1" "github.com/feast-dev/feast/infra/feast-operator/internal/controller/handler" "github.com/feast-dev/feast/infra/feast-operator/internal/controller/services" ) @@ -57,7 +57,7 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() { Name: resourceName, Namespace: "default", } - featurestore := &feastdevv1alpha1.FeatureStore{} + featurestore := &feastdevv1.FeatureStore{} onlineStorePath := "/data/online.db" registryPath := "/data/registry.db" @@ -68,18 +68,18 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() { 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"}}}}, withEnvFrom()) - resource.Spec.Services.OfflineStore.Persistence = &feastdevv1alpha1.OfflineStorePersistence{ - FilePersistence: &feastdevv1alpha1.OfflineStoreFilePersistence{ + resource.Spec.Services.OfflineStore.Persistence = &feastdevv1.OfflineStorePersistence{ + FilePersistence: &feastdevv1.OfflineStoreFilePersistence{ Type: offlineType, }, } - resource.Spec.Services.OnlineStore.Persistence = &feastdevv1alpha1.OnlineStorePersistence{ - FilePersistence: &feastdevv1alpha1.OnlineStoreFilePersistence{ + resource.Spec.Services.OnlineStore.Persistence = &feastdevv1.OnlineStorePersistence{ + FilePersistence: &feastdevv1.OnlineStoreFilePersistence{ Path: onlineStorePath, }, } - resource.Spec.Services.Registry.Local.Persistence = &feastdevv1alpha1.RegistryPersistence{ - FilePersistence: &feastdevv1alpha1.RegistryFilePersistence{ + resource.Spec.Services.Registry.Local.Persistence = &feastdevv1.RegistryPersistence{ + FilePersistence: &feastdevv1.RegistryFilePersistence{ Path: registryPath, }, } @@ -88,7 +88,7 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() { } }) AfterEach(func() { - resource := &feastdevv1alpha1.FeatureStore{} + resource := &feastdevv1.FeatureStore{} err := k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) @@ -110,7 +110,7 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() { }) Expect(err).NotTo(HaveOccurred()) - resource := &feastdevv1alpha1.FeatureStore{} + resource := &feastdevv1.FeatureStore{} err = k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) @@ -158,45 +158,45 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() { Expect(resource.Status.ServiceHostnames.Registry).To(Equal(feast.GetFeastServiceName(services.RegistryFeastType) + "." + resource.Namespace + domain)) Expect(resource.Status.Conditions).NotTo(BeEmpty()) - cond := apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.ReadyType) + cond := apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.ReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionUnknown)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.DeploymentNotAvailableReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.ReadyType)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.DeploymentNotAvailableMessage)) + Expect(cond.Reason).To(Equal(feastdevv1.DeploymentNotAvailableReason)) + Expect(cond.Type).To(Equal(feastdevv1.ReadyType)) + Expect(cond.Message).To(Equal(feastdevv1.DeploymentNotAvailableMessage)) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.AuthorizationReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.AuthorizationReadyType) Expect(cond).To(BeNil()) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.RegistryReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.RegistryReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionTrue)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.RegistryReadyType)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.RegistryReadyMessage)) + Expect(cond.Reason).To(Equal(feastdevv1.ReadyReason)) + Expect(cond.Type).To(Equal(feastdevv1.RegistryReadyType)) + Expect(cond.Message).To(Equal(feastdevv1.RegistryReadyMessage)) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.ClientReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.ClientReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionTrue)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.ClientReadyType)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.ClientReadyMessage)) + Expect(cond.Reason).To(Equal(feastdevv1.ReadyReason)) + Expect(cond.Type).To(Equal(feastdevv1.ClientReadyType)) + Expect(cond.Message).To(Equal(feastdevv1.ClientReadyMessage)) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.OfflineStoreReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.OfflineStoreReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionTrue)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.OfflineStoreReadyType)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.OfflineStoreReadyMessage)) + Expect(cond.Reason).To(Equal(feastdevv1.ReadyReason)) + Expect(cond.Type).To(Equal(feastdevv1.OfflineStoreReadyType)) + Expect(cond.Message).To(Equal(feastdevv1.OfflineStoreReadyMessage)) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.OnlineStoreReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.OnlineStoreReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionTrue)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.OnlineStoreReadyType)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.OnlineStoreReadyMessage)) + Expect(cond.Reason).To(Equal(feastdevv1.ReadyReason)) + Expect(cond.Type).To(Equal(feastdevv1.OnlineStoreReadyType)) + Expect(cond.Message).To(Equal(feastdevv1.OnlineStoreReadyMessage)) - Expect(resource.Status.Phase).To(Equal(feastdevv1alpha1.PendingPhase)) + Expect(resource.Status.Phase).To(Equal(feastdevv1.PendingPhase)) // check deployment deploy := &appsv1.Deployment{} @@ -232,7 +232,7 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() { }) Expect(err).NotTo(HaveOccurred()) - resource := &feastdevv1alpha1.FeatureStore{} + resource := &feastdevv1.FeatureStore{} err = k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) @@ -290,7 +290,7 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() { testConfig := &services.RepoConfig{ Project: feastProject, Provider: services.LocalProviderType, - EntityKeySerializationVersion: feastdevv1alpha1.SerializationVersion, + EntityKeySerializationVersion: feastdevv1.SerializationVersion, OfflineStore: services.OfflineStoreConfig{ Type: services.OfflineFilePersistenceDuckDbConfigType, }, @@ -358,7 +358,7 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() { clientConfig := &services.RepoConfig{ Project: feastProject, Provider: services.LocalProviderType, - EntityKeySerializationVersion: feastdevv1alpha1.SerializationVersion, + EntityKeySerializationVersion: feastdevv1.SerializationVersion, OfflineStore: services.OfflineStoreConfig{ Host: fmt.Sprintf("feast-%s-offline.default.svc.cluster.local", resourceName), Type: services.OfflineRemoteConfigType, @@ -389,7 +389,7 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() { }) Expect(err).NotTo(HaveOccurred()) - resource = &feastdevv1alpha1.FeatureStore{} + resource = &feastdevv1.FeatureStore{} err = k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) feast.Handler.FeatureStore = resource diff --git a/infra/feast-operator/internal/controller/featurestore_controller_kubernetes_auth_test.go b/infra/feast-operator/internal/controller/featurestore_controller_kubernetes_auth_test.go index 386b7c59902..3bfab485e85 100644 --- a/infra/feast-operator/internal/controller/featurestore_controller_kubernetes_auth_test.go +++ b/infra/feast-operator/internal/controller/featurestore_controller_kubernetes_auth_test.go @@ -38,7 +38,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/reconcile" "github.com/feast-dev/feast/infra/feast-operator/api/feastversion" - feastdevv1alpha1 "github.com/feast-dev/feast/infra/feast-operator/api/v1alpha1" + feastdevv1 "github.com/feast-dev/feast/infra/feast-operator/api/v1" "github.com/feast-dev/feast/infra/feast-operator/internal/controller/authz" "github.com/feast-dev/feast/infra/feast-operator/internal/controller/handler" "github.com/feast-dev/feast/infra/feast-operator/internal/controller/services" @@ -55,7 +55,7 @@ var _ = Describe("FeatureStore Controller-Kubernetes authorization", func() { Name: resourceName, Namespace: "default", } - featurestore := &feastdevv1alpha1.FeatureStore{} + featurestore := &feastdevv1.FeatureStore{} roles := []string{"reader", "writer"} BeforeEach(func() { @@ -65,7 +65,7 @@ var _ = Describe("FeatureStore Controller-Kubernetes authorization", func() { err := k8sClient.Get(ctx, typeNamespacedName, featurestore) if err != nil && errors.IsNotFound(err) { resource := createFeatureStoreResource(resourceName, image, pullPolicy, &[]corev1.EnvVar{}, withEnvFrom()) - resource.Spec.AuthzConfig = &feastdevv1alpha1.AuthzConfig{KubernetesAuthz: &feastdevv1alpha1.KubernetesAuthz{ + resource.Spec.AuthzConfig = &feastdevv1.AuthzConfig{KubernetesAuthz: &feastdevv1.KubernetesAuthz{ Roles: roles, }} @@ -73,7 +73,7 @@ var _ = Describe("FeatureStore Controller-Kubernetes authorization", func() { } }) AfterEach(func() { - resource := &feastdevv1alpha1.FeatureStore{} + resource := &feastdevv1.FeatureStore{} err := k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) @@ -95,7 +95,7 @@ var _ = Describe("FeatureStore Controller-Kubernetes authorization", func() { }) Expect(err).NotTo(HaveOccurred()) - resource := &feastdevv1alpha1.FeatureStore{} + resource := &feastdevv1.FeatureStore{} err = k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) @@ -111,8 +111,8 @@ var _ = Describe("FeatureStore Controller-Kubernetes authorization", func() { Expect(resource.Status.FeastVersion).To(Equal(feastversion.FeastVersion)) Expect(resource.Status.ClientConfigMap).To(Equal(feast.GetFeastServiceName(services.ClientFeastType))) Expect(resource.Status.Applied.FeastProject).To(Equal(resource.Spec.FeastProject)) - expectedAuthzConfig := &feastdevv1alpha1.AuthzConfig{ - KubernetesAuthz: &feastdevv1alpha1.KubernetesAuthz{ + expectedAuthzConfig := &feastdevv1.AuthzConfig{ + KubernetesAuthz: &feastdevv1.KubernetesAuthz{ Roles: roles, }, } @@ -148,49 +148,49 @@ var _ = Describe("FeatureStore Controller-Kubernetes authorization", func() { Expect(resource.Status.ServiceHostnames.Registry).To(Equal(feast.GetFeastServiceName(services.RegistryFeastType) + "." + resource.Namespace + domain)) Expect(resource.Status.Conditions).NotTo(BeEmpty()) - cond := apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.ReadyType) + cond := apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.ReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionUnknown)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.DeploymentNotAvailableReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.ReadyType)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.DeploymentNotAvailableMessage)) + Expect(cond.Reason).To(Equal(feastdevv1.DeploymentNotAvailableReason)) + Expect(cond.Type).To(Equal(feastdevv1.ReadyType)) + Expect(cond.Message).To(Equal(feastdevv1.DeploymentNotAvailableMessage)) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.AuthorizationReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.AuthorizationReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionTrue)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.AuthorizationReadyType)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.KubernetesAuthzReadyMessage)) + Expect(cond.Reason).To(Equal(feastdevv1.ReadyReason)) + Expect(cond.Type).To(Equal(feastdevv1.AuthorizationReadyType)) + Expect(cond.Message).To(Equal(feastdevv1.KubernetesAuthzReadyMessage)) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.RegistryReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.RegistryReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionTrue)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.RegistryReadyType)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.RegistryReadyMessage)) + Expect(cond.Reason).To(Equal(feastdevv1.ReadyReason)) + Expect(cond.Type).To(Equal(feastdevv1.RegistryReadyType)) + Expect(cond.Message).To(Equal(feastdevv1.RegistryReadyMessage)) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.ClientReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.ClientReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionTrue)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.ClientReadyType)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.ClientReadyMessage)) + Expect(cond.Reason).To(Equal(feastdevv1.ReadyReason)) + Expect(cond.Type).To(Equal(feastdevv1.ClientReadyType)) + Expect(cond.Message).To(Equal(feastdevv1.ClientReadyMessage)) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.OfflineStoreReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.OfflineStoreReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionTrue)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.OfflineStoreReadyType)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.OfflineStoreReadyMessage)) + Expect(cond.Reason).To(Equal(feastdevv1.ReadyReason)) + Expect(cond.Type).To(Equal(feastdevv1.OfflineStoreReadyType)) + Expect(cond.Message).To(Equal(feastdevv1.OfflineStoreReadyMessage)) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.OnlineStoreReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.OnlineStoreReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionTrue)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.OnlineStoreReadyType)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.OnlineStoreReadyMessage)) + Expect(cond.Reason).To(Equal(feastdevv1.ReadyReason)) + Expect(cond.Type).To(Equal(feastdevv1.OnlineStoreReadyType)) + Expect(cond.Message).To(Equal(feastdevv1.OnlineStoreReadyMessage)) - Expect(resource.Status.Phase).To(Equal(feastdevv1alpha1.PendingPhase)) + Expect(resource.Status.Phase).To(Equal(feastdevv1.PendingPhase)) // check deployment deploy := &appsv1.Deployment{} @@ -280,7 +280,7 @@ var _ = Describe("FeatureStore Controller-Kubernetes authorization", func() { }) Expect(err).NotTo(HaveOccurred()) - resource = &feastdevv1alpha1.FeatureStore{} + resource = &feastdevv1.FeatureStore{} err = k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) feast.Handler.FeatureStore = resource @@ -318,7 +318,7 @@ var _ = Describe("FeatureStore Controller-Kubernetes authorization", func() { }) Expect(err).NotTo(HaveOccurred()) - resource = &feastdevv1alpha1.FeatureStore{} + resource = &feastdevv1.FeatureStore{} err = k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) feast.Handler.FeatureStore = resource @@ -357,7 +357,7 @@ var _ = Describe("FeatureStore Controller-Kubernetes authorization", func() { }) Expect(err).NotTo(HaveOccurred()) - resource := &feastdevv1alpha1.FeatureStore{} + resource := &feastdevv1.FeatureStore{} err = k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) @@ -482,7 +482,7 @@ var _ = Describe("FeatureStore Controller-Kubernetes authorization", func() { clientConfig := &services.RepoConfig{ Project: feastProject, Provider: services.LocalProviderType, - EntityKeySerializationVersion: feastdevv1alpha1.SerializationVersion, + EntityKeySerializationVersion: feastdevv1.SerializationVersion, OfflineStore: offlineRemote, OnlineStore: services.OnlineStoreConfig{ Path: fmt.Sprintf("http://feast-%s-online.default.svc.cluster.local:80", resourceName), diff --git a/infra/feast-operator/internal/controller/featurestore_controller_loglevel_test.go b/infra/feast-operator/internal/controller/featurestore_controller_loglevel_test.go index a02d0894c8c..948ddec210d 100644 --- a/infra/feast-operator/internal/controller/featurestore_controller_loglevel_test.go +++ b/infra/feast-operator/internal/controller/featurestore_controller_loglevel_test.go @@ -30,7 +30,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/reconcile" "github.com/feast-dev/feast/infra/feast-operator/api/feastversion" - feastdevv1alpha1 "github.com/feast-dev/feast/infra/feast-operator/api/v1alpha1" + feastdevv1 "github.com/feast-dev/feast/infra/feast-operator/api/v1" "github.com/feast-dev/feast/infra/feast-operator/internal/controller/handler" "github.com/feast-dev/feast/infra/feast-operator/internal/controller/services" ) @@ -45,40 +45,40 @@ var _ = Describe("FeatureStore Controller - Feast service LogLevel", func() { Name: resourceName, Namespace: "default", } - featurestore := &feastdevv1alpha1.FeatureStore{} + featurestore := &feastdevv1.FeatureStore{} BeforeEach(func() { By("creating the custom resource for the Kind FeatureStore") err := k8sClient.Get(ctx, typeNamespacedName, featurestore) if err != nil && errors.IsNotFound(err) { - resource := &feastdevv1alpha1.FeatureStore{ + resource := &feastdevv1.FeatureStore{ ObjectMeta: metav1.ObjectMeta{ Name: resourceName, Namespace: "default", }, - Spec: feastdevv1alpha1.FeatureStoreSpec{ + Spec: feastdevv1.FeatureStoreSpec{ FeastProject: feastProject, - Services: &feastdevv1alpha1.FeatureStoreServices{ - Registry: &feastdevv1alpha1.Registry{ - Local: &feastdevv1alpha1.LocalRegistryConfig{ - Server: &feastdevv1alpha1.RegistryServerConfigs{ - ServerConfigs: feastdevv1alpha1.ServerConfigs{ + Services: &feastdevv1.FeatureStoreServices{ + Registry: &feastdevv1.Registry{ + Local: &feastdevv1.LocalRegistryConfig{ + Server: &feastdevv1.RegistryServerConfigs{ + ServerConfigs: feastdevv1.ServerConfigs{ LogLevel: strPtr("error"), }, }, }, }, - OnlineStore: &feastdevv1alpha1.OnlineStore{ - Server: &feastdevv1alpha1.ServerConfigs{ + OnlineStore: &feastdevv1.OnlineStore{ + Server: &feastdevv1.ServerConfigs{ LogLevel: strPtr("debug"), }, }, - OfflineStore: &feastdevv1alpha1.OfflineStore{ - Server: &feastdevv1alpha1.ServerConfigs{ + OfflineStore: &feastdevv1.OfflineStore{ + Server: &feastdevv1.ServerConfigs{ LogLevel: strPtr("info"), }, }, - UI: &feastdevv1alpha1.ServerConfigs{ + UI: &feastdevv1.ServerConfigs{ LogLevel: strPtr("info"), }, }, @@ -88,7 +88,7 @@ var _ = Describe("FeatureStore Controller - Feast service LogLevel", func() { } }) AfterEach(func() { - resource := &feastdevv1alpha1.FeatureStore{} + resource := &feastdevv1.FeatureStore{} err := k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) @@ -108,7 +108,7 @@ var _ = Describe("FeatureStore Controller - Feast service LogLevel", func() { }) Expect(err).NotTo(HaveOccurred()) - resource := &feastdevv1alpha1.FeatureStore{} + resource := &feastdevv1.FeatureStore{} err = k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) feast := services.FeastServices{ @@ -129,41 +129,41 @@ var _ = Describe("FeatureStore Controller - Feast service LogLevel", func() { Expect(resource.Status.Applied.Services.Registry).NotTo(BeNil()) Expect(resource.Status.Conditions).NotTo(BeEmpty()) - cond := apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.ReadyType) + cond := apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.ReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionUnknown)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.DeploymentNotAvailableReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.ReadyType)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.DeploymentNotAvailableMessage)) + Expect(cond.Reason).To(Equal(feastdevv1.DeploymentNotAvailableReason)) + Expect(cond.Type).To(Equal(feastdevv1.ReadyType)) + Expect(cond.Message).To(Equal(feastdevv1.DeploymentNotAvailableMessage)) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.RegistryReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.RegistryReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionTrue)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.RegistryReadyType)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.RegistryReadyMessage)) + Expect(cond.Reason).To(Equal(feastdevv1.ReadyReason)) + Expect(cond.Type).To(Equal(feastdevv1.RegistryReadyType)) + Expect(cond.Message).To(Equal(feastdevv1.RegistryReadyMessage)) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.ClientReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.ClientReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionTrue)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.ClientReadyType)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.ClientReadyMessage)) + Expect(cond.Reason).To(Equal(feastdevv1.ReadyReason)) + Expect(cond.Type).To(Equal(feastdevv1.ClientReadyType)) + Expect(cond.Message).To(Equal(feastdevv1.ClientReadyMessage)) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.OfflineStoreReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.OfflineStoreReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionTrue)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.OfflineStoreReadyType)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.OfflineStoreReadyMessage)) + Expect(cond.Reason).To(Equal(feastdevv1.ReadyReason)) + Expect(cond.Type).To(Equal(feastdevv1.OfflineStoreReadyType)) + Expect(cond.Message).To(Equal(feastdevv1.OfflineStoreReadyMessage)) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.OnlineStoreReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.OnlineStoreReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionTrue)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.OnlineStoreReadyType)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.OnlineStoreReadyMessage)) - Expect(resource.Status.Phase).To(Equal(feastdevv1alpha1.PendingPhase)) + Expect(cond.Reason).To(Equal(feastdevv1.ReadyReason)) + Expect(cond.Type).To(Equal(feastdevv1.OnlineStoreReadyType)) + Expect(cond.Message).To(Equal(feastdevv1.OnlineStoreReadyMessage)) + Expect(resource.Status.Phase).To(Equal(feastdevv1.PendingPhase)) // check deployment deploy := &appsv1.Deployment{} @@ -191,20 +191,20 @@ var _ = Describe("FeatureStore Controller - Feast service LogLevel", func() { It("should not include --log-level parameter when logLevel is not specified for any service", func() { By("Updating the FeatureStore resource without specifying logLevel for any service") - resource := &feastdevv1alpha1.FeatureStore{} + resource := &feastdevv1.FeatureStore{} err := k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) - resource.Spec.Services = &feastdevv1alpha1.FeatureStoreServices{ - Registry: &feastdevv1alpha1.Registry{ - Local: &feastdevv1alpha1.LocalRegistryConfig{ - Server: &feastdevv1alpha1.RegistryServerConfigs{ - ServerConfigs: feastdevv1alpha1.ServerConfigs{}, + resource.Spec.Services = &feastdevv1.FeatureStoreServices{ + Registry: &feastdevv1.Registry{ + Local: &feastdevv1.LocalRegistryConfig{ + Server: &feastdevv1.RegistryServerConfigs{ + ServerConfigs: feastdevv1.ServerConfigs{}, }, }, }, - OfflineStore: &feastdevv1alpha1.OfflineStore{}, - UI: &feastdevv1alpha1.ServerConfigs{}, + OfflineStore: &feastdevv1.OfflineStore{}, + UI: &feastdevv1.ServerConfigs{}, } Expect(k8sClient.Update(ctx, resource)).To(Succeed()) diff --git a/infra/feast-operator/internal/controller/featurestore_controller_namespace_registry_test.go b/infra/feast-operator/internal/controller/featurestore_controller_namespace_registry_test.go index 67fd4dcb632..b92d5cec50e 100644 --- a/infra/feast-operator/internal/controller/featurestore_controller_namespace_registry_test.go +++ b/infra/feast-operator/internal/controller/featurestore_controller_namespace_registry_test.go @@ -31,7 +31,7 @@ import ( "k8s.io/apimachinery/pkg/types" "sigs.k8s.io/controller-runtime/pkg/reconcile" - feastdevv1alpha1 "github.com/feast-dev/feast/infra/feast-operator/api/v1alpha1" + feastdevv1 "github.com/feast-dev/feast/infra/feast-operator/api/v1" "github.com/feast-dev/feast/infra/feast-operator/internal/controller/services" ) @@ -51,7 +51,7 @@ var _ = Describe("FeatureStore Controller - Namespace Registry", func() { Name: resourceName, Namespace: DefaultNamespace, } - featurestore := &feastdevv1alpha1.FeatureStore{} + featurestore := &feastdevv1.FeatureStore{} BeforeEach(func() { By("Ensuring manager namespace exists") diff --git a/infra/feast-operator/internal/controller/featurestore_controller_objectstore_test.go b/infra/feast-operator/internal/controller/featurestore_controller_objectstore_test.go index e0436b703df..37d22094147 100644 --- a/infra/feast-operator/internal/controller/featurestore_controller_objectstore_test.go +++ b/infra/feast-operator/internal/controller/featurestore_controller_objectstore_test.go @@ -37,7 +37,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/reconcile" "github.com/feast-dev/feast/infra/feast-operator/api/feastversion" - feastdevv1alpha1 "github.com/feast-dev/feast/infra/feast-operator/api/v1alpha1" + feastdevv1 "github.com/feast-dev/feast/infra/feast-operator/api/v1" "github.com/feast-dev/feast/infra/feast-operator/internal/controller/handler" "github.com/feast-dev/feast/infra/feast-operator/internal/controller/services" ) @@ -55,7 +55,7 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() { Name: resourceName, Namespace: "default", } - featurestore := &feastdevv1alpha1.FeatureStore{} + featurestore := &feastdevv1.FeatureStore{} registryPath := "s3://bucket/registry.db" s3AdditionalKwargs := map[string]string{ @@ -73,8 +73,8 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() { {Name: "fieldRefName", ValueFrom: &corev1.EnvVarSource{FieldRef: &corev1.ObjectFieldSelector{APIVersion: "v1", FieldPath: "metadata.namespace"}}}}, withEnvFrom()) resource.Spec.Services.UI = nil resource.Spec.Services.OfflineStore = nil - resource.Spec.Services.Registry.Local.Persistence = &feastdevv1alpha1.RegistryPersistence{ - FilePersistence: &feastdevv1alpha1.RegistryFilePersistence{ + resource.Spec.Services.Registry.Local.Persistence = &feastdevv1.RegistryPersistence{ + FilePersistence: &feastdevv1.RegistryFilePersistence{ Path: registryPath, S3AdditionalKwargs: &s3AdditionalKwargs, }, @@ -83,7 +83,7 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() { } }) AfterEach(func() { - resource := &feastdevv1alpha1.FeatureStore{} + resource := &feastdevv1.FeatureStore{} err := k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) @@ -105,7 +105,7 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() { }) Expect(err).NotTo(HaveOccurred()) - resource := &feastdevv1alpha1.FeatureStore{} + resource := &feastdevv1.FeatureStore{} err = k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) @@ -143,37 +143,37 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() { Expect(resource.Status.ServiceHostnames.Registry).To(Equal(feast.GetFeastServiceName(services.RegistryFeastType) + "." + resource.Namespace + domain)) Expect(resource.Status.Conditions).NotTo(BeEmpty()) - cond := apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.ReadyType) + cond := apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.ReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionUnknown)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.DeploymentNotAvailableReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.ReadyType)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.DeploymentNotAvailableMessage)) + Expect(cond.Reason).To(Equal(feastdevv1.DeploymentNotAvailableReason)) + Expect(cond.Type).To(Equal(feastdevv1.ReadyType)) + Expect(cond.Message).To(Equal(feastdevv1.DeploymentNotAvailableMessage)) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.AuthorizationReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.AuthorizationReadyType) Expect(cond).To(BeNil()) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.RegistryReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.RegistryReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionTrue)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.RegistryReadyType)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.RegistryReadyMessage)) + Expect(cond.Reason).To(Equal(feastdevv1.ReadyReason)) + Expect(cond.Type).To(Equal(feastdevv1.RegistryReadyType)) + Expect(cond.Message).To(Equal(feastdevv1.RegistryReadyMessage)) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.ClientReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.ClientReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionTrue)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.ClientReadyType)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.ClientReadyMessage)) + Expect(cond.Reason).To(Equal(feastdevv1.ReadyReason)) + Expect(cond.Type).To(Equal(feastdevv1.ClientReadyType)) + Expect(cond.Message).To(Equal(feastdevv1.ClientReadyMessage)) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.OfflineStoreReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.OfflineStoreReadyType) Expect(cond).To(BeNil()) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.OnlineStoreReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.OnlineStoreReadyType) Expect(cond).NotTo(BeNil()) - Expect(resource.Status.Phase).To(Equal(feastdevv1alpha1.PendingPhase)) + Expect(resource.Status.Phase).To(Equal(feastdevv1.PendingPhase)) // check deployment deploy := &appsv1.Deployment{} @@ -208,7 +208,7 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() { }) Expect(err).NotTo(HaveOccurred()) - resource = &feastdevv1alpha1.FeatureStore{} + resource = &feastdevv1.FeatureStore{} err = k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) feast.Handler.FeatureStore = resource @@ -239,7 +239,7 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() { }) Expect(err).NotTo(HaveOccurred()) - resource := &feastdevv1alpha1.FeatureStore{} + resource := &feastdevv1.FeatureStore{} err = k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) @@ -342,7 +342,7 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() { }) Expect(err).NotTo(HaveOccurred()) - resource = &feastdevv1alpha1.FeatureStore{} + resource = &feastdevv1.FeatureStore{} err = k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) feast.Handler.FeatureStore = resource @@ -376,7 +376,7 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() { } // update the FeatureStore to set cache settings on registry file persistence - resource := &feastdevv1alpha1.FeatureStore{} + resource := &feastdevv1.FeatureStore{} err := k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) @@ -393,7 +393,7 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() { Expect(err).NotTo(HaveOccurred()) // fetch updated resource and deployment - resource = &feastdevv1alpha1.FeatureStore{} + resource = &feastdevv1.FeatureStore{} err = k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) diff --git a/infra/feast-operator/internal/controller/featurestore_controller_oidc_auth_test.go b/infra/feast-operator/internal/controller/featurestore_controller_oidc_auth_test.go index 82980d5091f..82a7ebeb4ad 100644 --- a/infra/feast-operator/internal/controller/featurestore_controller_oidc_auth_test.go +++ b/infra/feast-operator/internal/controller/featurestore_controller_oidc_auth_test.go @@ -38,7 +38,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/reconcile" "github.com/feast-dev/feast/infra/feast-operator/api/feastversion" - feastdevv1alpha1 "github.com/feast-dev/feast/infra/feast-operator/api/v1alpha1" + feastdevv1 "github.com/feast-dev/feast/infra/feast-operator/api/v1" "github.com/feast-dev/feast/infra/feast-operator/internal/controller/authz" "github.com/feast-dev/feast/infra/feast-operator/internal/controller/handler" "github.com/feast-dev/feast/infra/feast-operator/internal/controller/services" @@ -60,7 +60,7 @@ var _ = Describe("FeatureStore Controller-OIDC authorization", func() { Name: resourceName, Namespace: "default", } - featurestore := &feastdevv1alpha1.FeatureStore{} + featurestore := &feastdevv1.FeatureStore{} BeforeEach(func() { By("creating the OIDC secret") @@ -76,7 +76,7 @@ var _ = Describe("FeatureStore Controller-OIDC authorization", func() { err = k8sClient.Get(ctx, typeNamespacedName, featurestore) if err != nil && errors.IsNotFound(err) { resource := createFeatureStoreResource(resourceName, image, pullPolicy, &[]corev1.EnvVar{}, withEnvFrom()) - resource.Spec.AuthzConfig = &feastdevv1alpha1.AuthzConfig{OidcAuthz: &feastdevv1alpha1.OidcAuthz{ + resource.Spec.AuthzConfig = &feastdevv1.AuthzConfig{OidcAuthz: &feastdevv1.OidcAuthz{ SecretRef: corev1.LocalObjectReference{ Name: oidcSecretName, }, @@ -87,7 +87,7 @@ var _ = Describe("FeatureStore Controller-OIDC authorization", func() { }) AfterEach(func() { - resource := &feastdevv1alpha1.FeatureStore{} + resource := &feastdevv1.FeatureStore{} err := k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) @@ -116,7 +116,7 @@ var _ = Describe("FeatureStore Controller-OIDC authorization", func() { }) Expect(err).NotTo(HaveOccurred()) - resource := &feastdevv1alpha1.FeatureStore{} + resource := &feastdevv1.FeatureStore{} err = k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) @@ -132,8 +132,8 @@ var _ = Describe("FeatureStore Controller-OIDC authorization", func() { Expect(resource.Status.FeastVersion).To(Equal(feastversion.FeastVersion)) Expect(resource.Status.ClientConfigMap).To(Equal(feast.GetFeastServiceName(services.ClientFeastType))) Expect(resource.Status.Applied.FeastProject).To(Equal(resource.Spec.FeastProject)) - expectedAuthzConfig := &feastdevv1alpha1.AuthzConfig{ - OidcAuthz: &feastdevv1alpha1.OidcAuthz{ + expectedAuthzConfig := &feastdevv1.AuthzConfig{ + OidcAuthz: &feastdevv1.OidcAuthz{ SecretRef: corev1.LocalObjectReference{ Name: oidcSecretName, }, @@ -171,45 +171,45 @@ var _ = Describe("FeatureStore Controller-OIDC authorization", func() { Expect(resource.Status.ServiceHostnames.Registry).To(Equal(feast.GetFeastServiceName(services.RegistryFeastType) + "." + resource.Namespace + domain)) Expect(resource.Status.Conditions).NotTo(BeEmpty()) - cond := apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.ReadyType) + cond := apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.ReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionUnknown)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.DeploymentNotAvailableReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.ReadyType)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.DeploymentNotAvailableMessage)) + Expect(cond.Reason).To(Equal(feastdevv1.DeploymentNotAvailableReason)) + Expect(cond.Type).To(Equal(feastdevv1.ReadyType)) + Expect(cond.Message).To(Equal(feastdevv1.DeploymentNotAvailableMessage)) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.AuthorizationReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.AuthorizationReadyType) Expect(cond).To(BeNil()) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.RegistryReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.RegistryReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionTrue)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.RegistryReadyType)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.RegistryReadyMessage)) + Expect(cond.Reason).To(Equal(feastdevv1.ReadyReason)) + Expect(cond.Type).To(Equal(feastdevv1.RegistryReadyType)) + Expect(cond.Message).To(Equal(feastdevv1.RegistryReadyMessage)) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.ClientReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.ClientReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionTrue)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.ClientReadyType)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.ClientReadyMessage)) + Expect(cond.Reason).To(Equal(feastdevv1.ReadyReason)) + Expect(cond.Type).To(Equal(feastdevv1.ClientReadyType)) + Expect(cond.Message).To(Equal(feastdevv1.ClientReadyMessage)) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.OfflineStoreReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.OfflineStoreReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionTrue)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.OfflineStoreReadyType)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.OfflineStoreReadyMessage)) + Expect(cond.Reason).To(Equal(feastdevv1.ReadyReason)) + Expect(cond.Type).To(Equal(feastdevv1.OfflineStoreReadyType)) + Expect(cond.Message).To(Equal(feastdevv1.OfflineStoreReadyMessage)) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.OnlineStoreReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.OnlineStoreReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionTrue)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.OnlineStoreReadyType)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.OnlineStoreReadyMessage)) + Expect(cond.Reason).To(Equal(feastdevv1.ReadyReason)) + Expect(cond.Type).To(Equal(feastdevv1.OnlineStoreReadyType)) + Expect(cond.Message).To(Equal(feastdevv1.OnlineStoreReadyMessage)) - Expect(resource.Status.Phase).To(Equal(feastdevv1alpha1.PendingPhase)) + Expect(resource.Status.Phase).To(Equal(feastdevv1.PendingPhase)) // check deployment deploy := &appsv1.Deployment{} @@ -270,7 +270,7 @@ var _ = Describe("FeatureStore Controller-OIDC authorization", func() { }) Expect(err).NotTo(HaveOccurred()) - resource = &feastdevv1alpha1.FeatureStore{} + resource = &feastdevv1.FeatureStore{} err = k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) feast.Handler.FeatureStore = resource @@ -298,7 +298,7 @@ var _ = Describe("FeatureStore Controller-OIDC authorization", func() { }) Expect(err).NotTo(HaveOccurred()) - resource := &feastdevv1alpha1.FeatureStore{} + resource := &feastdevv1.FeatureStore{} err = k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) @@ -354,7 +354,7 @@ var _ = Describe("FeatureStore Controller-OIDC authorization", func() { testConfig := &services.RepoConfig{ Project: feastProject, Provider: services.LocalProviderType, - EntityKeySerializationVersion: feastdevv1alpha1.SerializationVersion, + EntityKeySerializationVersion: feastdevv1.SerializationVersion, OfflineStore: services.OfflineStoreConfig{ Type: services.OfflineFilePersistenceDaskConfigType, }, @@ -422,7 +422,7 @@ var _ = Describe("FeatureStore Controller-OIDC authorization", func() { clientConfig := &services.RepoConfig{ Project: feastProject, Provider: services.LocalProviderType, - EntityKeySerializationVersion: feastdevv1alpha1.SerializationVersion, + EntityKeySerializationVersion: feastdevv1.SerializationVersion, OfflineStore: offlineRemote, OnlineStore: services.OnlineStoreConfig{ Path: fmt.Sprintf("http://feast-%s-online.default.svc.cluster.local:80", resourceName), @@ -455,7 +455,7 @@ var _ = Describe("FeatureStore Controller-OIDC authorization", func() { Expect(k8sClient.Create(ctx, newOidcSecret)).To(Succeed()) } - resource := &feastdevv1alpha1.FeatureStore{} + resource := &feastdevv1.FeatureStore{} err = k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) @@ -467,15 +467,15 @@ var _ = Describe("FeatureStore Controller-OIDC authorization", func() { }) Expect(err).To(HaveOccurred()) - resource = &feastdevv1alpha1.FeatureStore{} + resource = &feastdevv1.FeatureStore{} err = k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) Expect(resource.Status.Conditions).NotTo(BeEmpty()) - cond := apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.ReadyType) + cond := apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.ReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionFalse)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.FailedReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.ReadyType)) + Expect(cond.Reason).To(Equal(feastdevv1.FailedReason)) + Expect(cond.Type).To(Equal(feastdevv1.ReadyType)) Expect(cond.Message).To(ContainSubstring("missing OIDC")) }) }) diff --git a/infra/feast-operator/internal/controller/featurestore_controller_pvc_test.go b/infra/feast-operator/internal/controller/featurestore_controller_pvc_test.go index ff273c78648..8e7303cee34 100644 --- a/infra/feast-operator/internal/controller/featurestore_controller_pvc_test.go +++ b/infra/feast-operator/internal/controller/featurestore_controller_pvc_test.go @@ -41,7 +41,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/reconcile" "github.com/feast-dev/feast/infra/feast-operator/api/feastversion" - feastdevv1alpha1 "github.com/feast-dev/feast/infra/feast-operator/api/v1alpha1" + feastdevv1 "github.com/feast-dev/feast/infra/feast-operator/api/v1" "github.com/feast-dev/feast/infra/feast-operator/internal/controller/handler" "github.com/feast-dev/feast/infra/feast-operator/internal/controller/services" ) @@ -59,7 +59,7 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() { Name: resourceName, Namespace: "default", } - featurestore := &feastdevv1alpha1.FeatureStore{} + featurestore := &feastdevv1.FeatureStore{} onlineStorePath := "online.db" registryPath := "registry.db" offlineType := "duckdb" @@ -87,11 +87,11 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() { resource := createFeatureStoreResource(resourceName, image, pullPolicy, &[]corev1.EnvVar{{Name: testEnvVarName, Value: testEnvVarValue}, {Name: "fieldRefName", ValueFrom: &corev1.EnvVarSource{FieldRef: &corev1.ObjectFieldSelector{APIVersion: "v1", FieldPath: "metadata.namespace"}}}}, withEnvFrom()) resource.Spec.Services.UI = nil - resource.Spec.Services.OfflineStore.Persistence = &feastdevv1alpha1.OfflineStorePersistence{ - FilePersistence: &feastdevv1alpha1.OfflineStoreFilePersistence{ + resource.Spec.Services.OfflineStore.Persistence = &feastdevv1.OfflineStorePersistence{ + FilePersistence: &feastdevv1.OfflineStoreFilePersistence{ Type: offlineType, - PvcConfig: &feastdevv1alpha1.PvcConfig{ - Create: &feastdevv1alpha1.PvcCreate{ + PvcConfig: &feastdevv1.PvcConfig{ + Create: &feastdevv1.PvcCreate{ AccessModes: accessModes, StorageClassName: &storageClassName, }, @@ -99,20 +99,20 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() { }, }, } - resource.Spec.Services.OnlineStore.Persistence = &feastdevv1alpha1.OnlineStorePersistence{ - FilePersistence: &feastdevv1alpha1.OnlineStoreFilePersistence{ + resource.Spec.Services.OnlineStore.Persistence = &feastdevv1.OnlineStorePersistence{ + FilePersistence: &feastdevv1.OnlineStoreFilePersistence{ Path: onlineStorePath, - PvcConfig: &feastdevv1alpha1.PvcConfig{ - Create: &feastdevv1alpha1.PvcCreate{}, + PvcConfig: &feastdevv1.PvcConfig{ + Create: &feastdevv1.PvcCreate{}, MountPath: onlineStoreMountPath, }, }, } - resource.Spec.Services.Registry.Local.Persistence = &feastdevv1alpha1.RegistryPersistence{ - FilePersistence: &feastdevv1alpha1.RegistryFilePersistence{ + resource.Spec.Services.Registry.Local.Persistence = &feastdevv1.RegistryPersistence{ + FilePersistence: &feastdevv1.RegistryFilePersistence{ Path: registryPath, - PvcConfig: &feastdevv1alpha1.PvcConfig{ - Create: &feastdevv1alpha1.PvcCreate{}, + PvcConfig: &feastdevv1.PvcConfig{ + Create: &feastdevv1.PvcCreate{}, MountPath: registryMountPath, }, }, @@ -122,7 +122,7 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() { } }) AfterEach(func() { - resource := &feastdevv1alpha1.FeatureStore{} + resource := &feastdevv1.FeatureStore{} err := k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) @@ -144,7 +144,7 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() { }) Expect(err).NotTo(HaveOccurred()) - resource := &feastdevv1alpha1.FeatureStore{} + resource := &feastdevv1.FeatureStore{} err = k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) @@ -225,45 +225,45 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() { Expect(resource.Status.ServiceHostnames.Registry).To(Equal(feast.GetFeastServiceName(services.RegistryFeastType) + "." + resource.Namespace + domain)) Expect(resource.Status.Conditions).NotTo(BeEmpty()) - cond := apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.ReadyType) + cond := apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.ReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionUnknown)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.DeploymentNotAvailableReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.ReadyType)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.DeploymentNotAvailableMessage)) + Expect(cond.Reason).To(Equal(feastdevv1.DeploymentNotAvailableReason)) + Expect(cond.Type).To(Equal(feastdevv1.ReadyType)) + Expect(cond.Message).To(Equal(feastdevv1.DeploymentNotAvailableMessage)) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.AuthorizationReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.AuthorizationReadyType) Expect(cond).To(BeNil()) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.RegistryReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.RegistryReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionTrue)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.RegistryReadyType)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.RegistryReadyMessage)) + Expect(cond.Reason).To(Equal(feastdevv1.ReadyReason)) + Expect(cond.Type).To(Equal(feastdevv1.RegistryReadyType)) + Expect(cond.Message).To(Equal(feastdevv1.RegistryReadyMessage)) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.ClientReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.ClientReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionTrue)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.ClientReadyType)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.ClientReadyMessage)) + Expect(cond.Reason).To(Equal(feastdevv1.ReadyReason)) + Expect(cond.Type).To(Equal(feastdevv1.ClientReadyType)) + Expect(cond.Message).To(Equal(feastdevv1.ClientReadyMessage)) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.OfflineStoreReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.OfflineStoreReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionTrue)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.OfflineStoreReadyType)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.OfflineStoreReadyMessage)) + Expect(cond.Reason).To(Equal(feastdevv1.ReadyReason)) + Expect(cond.Type).To(Equal(feastdevv1.OfflineStoreReadyType)) + Expect(cond.Message).To(Equal(feastdevv1.OfflineStoreReadyMessage)) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.OnlineStoreReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.OnlineStoreReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionTrue)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.OnlineStoreReadyType)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.OnlineStoreReadyMessage)) + Expect(cond.Reason).To(Equal(feastdevv1.ReadyReason)) + Expect(cond.Type).To(Equal(feastdevv1.OnlineStoreReadyType)) + Expect(cond.Message).To(Equal(feastdevv1.OnlineStoreReadyMessage)) - Expect(resource.Status.Phase).To(Equal(feastdevv1alpha1.PendingPhase)) + Expect(resource.Status.Phase).To(Equal(feastdevv1.PendingPhase)) ephemeralName := "feast-data" ephemeralVolume := corev1.Volume{ @@ -383,7 +383,7 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() { }) Expect(err).NotTo(HaveOccurred()) - resource = &feastdevv1alpha1.FeatureStore{} + resource = &feastdevv1.FeatureStore{} err = k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) feast.Handler.FeatureStore = resource @@ -425,7 +425,7 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() { Scheme: k8sClient.Scheme(), } - resource := &feastdevv1alpha1.FeatureStore{} + resource := &feastdevv1.FeatureStore{} err := k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) @@ -498,7 +498,7 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() { testConfig := &services.RepoConfig{ Project: feastProject, Provider: services.LocalProviderType, - EntityKeySerializationVersion: feastdevv1alpha1.SerializationVersion, + EntityKeySerializationVersion: feastdevv1.SerializationVersion, Registry: services.RegistryConfig{ RegistryType: services.RegistryFileConfigType, Path: registryMountedPath, @@ -573,7 +573,7 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() { clientConfig := &services.RepoConfig{ Project: feastProject, Provider: services.LocalProviderType, - EntityKeySerializationVersion: feastdevv1alpha1.SerializationVersion, + EntityKeySerializationVersion: feastdevv1.SerializationVersion, OfflineStore: offlineRemote, OnlineStore: services.OnlineStoreConfig{ Path: fmt.Sprintf("http://feast-%s-online.default.svc.cluster.local:80", resourceName), @@ -601,7 +601,7 @@ var _ = Describe("FeatureStore Controller-Ephemeral services", func() { }) Expect(err).NotTo(HaveOccurred()) - resource = &feastdevv1alpha1.FeatureStore{} + resource = &feastdevv1.FeatureStore{} err = k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) feast.Handler.FeatureStore = resource diff --git a/infra/feast-operator/internal/controller/featurestore_controller_test.go b/infra/feast-operator/internal/controller/featurestore_controller_test.go index cb45d85e766..3da54279500 100644 --- a/infra/feast-operator/internal/controller/featurestore_controller_test.go +++ b/infra/feast-operator/internal/controller/featurestore_controller_test.go @@ -40,7 +40,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/reconcile" "github.com/feast-dev/feast/infra/feast-operator/api/feastversion" - feastdevv1alpha1 "github.com/feast-dev/feast/infra/feast-operator/api/v1alpha1" + feastdevv1 "github.com/feast-dev/feast/infra/feast-operator/api/v1" "github.com/feast-dev/feast/infra/feast-operator/internal/controller/handler" "github.com/feast-dev/feast/infra/feast-operator/internal/controller/services" ) @@ -65,24 +65,24 @@ var _ = Describe("FeatureStore Controller", func() { Name: resourceName, Namespace: "default", } - featurestore := &feastdevv1alpha1.FeatureStore{} + featurestore := &feastdevv1.FeatureStore{} BeforeEach(func() { By("creating the custom resource for the Kind FeatureStore") err := k8sClient.Get(ctx, typeNamespacedName, featurestore) if err != nil && errors.IsNotFound(err) { - resource := &feastdevv1alpha1.FeatureStore{ + resource := &feastdevv1.FeatureStore{ ObjectMeta: metav1.ObjectMeta{ Name: resourceName, Namespace: "default", }, - Spec: feastdevv1alpha1.FeatureStoreSpec{FeastProject: feastProject}, + Spec: feastdevv1.FeatureStoreSpec{FeastProject: feastProject}, } Expect(k8sClient.Create(ctx, resource)).To(Succeed()) } }) AfterEach(func() { - resource := &feastdevv1alpha1.FeatureStore{} + resource := &feastdevv1.FeatureStore{} err := k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) @@ -102,7 +102,7 @@ var _ = Describe("FeatureStore Controller", func() { }) Expect(err).NotTo(HaveOccurred()) - resource := &feastdevv1alpha1.FeatureStore{} + resource := &feastdevv1.FeatureStore{} err = k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) @@ -154,7 +154,7 @@ var _ = Describe("FeatureStore Controller", func() { }) Expect(err).NotTo(HaveOccurred()) - resource = &feastdevv1alpha1.FeatureStore{} + resource = &feastdevv1.FeatureStore{} err = k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) @@ -175,30 +175,30 @@ var _ = Describe("FeatureStore Controller", func() { Expect(resource.Status.Applied.Services.OnlineStore).NotTo(BeNil()) Expect(resource.Status.Conditions).NotTo(BeEmpty()) - cond := apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.ReadyType) + cond := apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.ReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionTrue)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.ReadyType)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.ReadyMessage)) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.AuthorizationReadyType) + Expect(cond.Reason).To(Equal(feastdevv1.ReadyReason)) + Expect(cond.Type).To(Equal(feastdevv1.ReadyType)) + Expect(cond.Message).To(Equal(feastdevv1.ReadyMessage)) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.AuthorizationReadyType) Expect(cond).To(BeNil()) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.OnlineStoreReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.OnlineStoreReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionTrue)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.OnlineStoreReadyType)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.OnlineStoreReadyMessage)) + Expect(cond.Reason).To(Equal(feastdevv1.ReadyReason)) + Expect(cond.Type).To(Equal(feastdevv1.OnlineStoreReadyType)) + Expect(cond.Message).To(Equal(feastdevv1.OnlineStoreReadyMessage)) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.ClientReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.ClientReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionTrue)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.ClientReadyType)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.ClientReadyMessage)) + Expect(cond.Reason).To(Equal(feastdevv1.ReadyReason)) + Expect(cond.Type).To(Equal(feastdevv1.ClientReadyType)) + Expect(cond.Message).To(Equal(feastdevv1.ClientReadyMessage)) - Expect(resource.Status.Phase).To(Equal(feastdevv1alpha1.ReadyPhase)) + Expect(resource.Status.Phase).To(Equal(feastdevv1.ReadyPhase)) deploy := &appsv1.Deployment{} objMeta := feast.GetObjectMeta() @@ -237,8 +237,8 @@ var _ = Describe("FeatureStore Controller", func() { Value: "value", }, } - resource.Spec.FeastProjectDir = &feastdevv1alpha1.FeastProjectDir{ - Git: &feastdevv1alpha1.GitCloneOptions{ + resource.Spec.FeastProjectDir = &feastdevv1.FeastProjectDir{ + Git: &feastdevv1.GitCloneOptions{ URL: "test", Ref: ref, FeatureRepoPath: featureRepoPath, @@ -274,8 +274,8 @@ var _ = Describe("FeatureStore Controller", func() { Expect(online.WorkingDir).To(Equal(services.EphemeralPath + "/" + resource.Spec.FeastProject + "/" + featureRepoPath)) // change projectDir to use an init template - resource.Spec.FeastProjectDir = &feastdevv1alpha1.FeastProjectDir{ - Init: &feastdevv1alpha1.FeastInitOptions{ + resource.Spec.FeastProjectDir = &feastdevv1.FeastProjectDir{ + Init: &feastdevv1.FeastInitOptions{ Template: "spark", }, } @@ -310,7 +310,7 @@ var _ = Describe("FeatureStore Controller", func() { }) Expect(err).NotTo(HaveOccurred()) - resource := &feastdevv1alpha1.FeatureStore{} + resource := &feastdevv1.FeatureStore{} err = k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) @@ -371,7 +371,7 @@ var _ = Describe("FeatureStore Controller", func() { // change feast project and reconcile resourceNew := resource.DeepCopy() resourceNew.Spec.FeastProject = "changed" - resourceNew.Spec.Services = &feastdevv1alpha1.FeatureStoreServices{ + resourceNew.Spec.Services = &feastdevv1.FeatureStoreServices{ DeploymentStrategy: &appsv1.DeploymentStrategy{ Type: appsv1.RollingUpdateDeploymentStrategyType, }, @@ -422,7 +422,7 @@ var _ = Describe("FeatureStore Controller", func() { }) Expect(err).NotTo(HaveOccurred()) - resource := &feastdevv1alpha1.FeatureStore{} + resource := &feastdevv1.FeatureStore{} err = k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) @@ -470,37 +470,37 @@ var _ = Describe("FeatureStore Controller", func() { Expect(err).NotTo(HaveOccurred()) Expect(resource.Status.Conditions).To(HaveLen(4)) - cond := apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.ReadyType) + cond := apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.ReadyType) Expect(cond).ToNot(BeNil()) - Expect(cond.Type).To(Equal(feastdevv1alpha1.ReadyType)) + Expect(cond.Type).To(Equal(feastdevv1.ReadyType)) Expect(cond.Status).To(Equal(metav1.ConditionFalse)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.FailedReason)) + Expect(cond.Reason).To(Equal(feastdevv1.FailedReason)) Expect(cond.Message).To(Equal("Error: Object " + resource.Namespace + "/" + deploy.Name + " is already owned by another Service controller " + name)) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.AuthorizationReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.AuthorizationReadyType) Expect(cond).To(BeNil()) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.OnlineStoreReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.OnlineStoreReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionTrue)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.OnlineStoreReadyType)) + Expect(cond.Reason).To(Equal(feastdevv1.ReadyReason)) + Expect(cond.Type).To(Equal(feastdevv1.OnlineStoreReadyType)) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.ClientReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.ClientReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionTrue)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.ClientReadyType)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.ClientReadyMessage)) + Expect(cond.Reason).To(Equal(feastdevv1.ReadyReason)) + Expect(cond.Type).To(Equal(feastdevv1.ClientReadyType)) + Expect(cond.Message).To(Equal(feastdevv1.ClientReadyMessage)) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.CronJobReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.CronJobReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionTrue)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.CronJobReadyType)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.CronJobReadyMessage)) + Expect(cond.Reason).To(Equal(feastdevv1.ReadyReason)) + Expect(cond.Type).To(Equal(feastdevv1.CronJobReadyType)) + Expect(cond.Message).To(Equal(feastdevv1.CronJobReadyMessage)) - Expect(resource.Status.Phase).To(Equal(feastdevv1alpha1.FailedPhase)) + Expect(resource.Status.Phase).To(Equal(feastdevv1.FailedPhase)) }) }) @@ -516,7 +516,7 @@ var _ = Describe("FeatureStore Controller", func() { Name: resourceName, Namespace: "default", } - featurestore := &feastdevv1alpha1.FeatureStore{} + featurestore := &feastdevv1.FeatureStore{} BeforeEach(func() { createEnvFromSecretAndConfigMap() @@ -530,7 +530,7 @@ var _ = Describe("FeatureStore Controller", func() { } }) AfterEach(func() { - resource := &feastdevv1alpha1.FeatureStore{} + resource := &feastdevv1.FeatureStore{} err := k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) @@ -553,7 +553,7 @@ var _ = Describe("FeatureStore Controller", func() { }) Expect(err).NotTo(HaveOccurred()) - resource := &feastdevv1alpha1.FeatureStore{} + resource := &feastdevv1.FeatureStore{} err = k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) @@ -607,52 +607,52 @@ var _ = Describe("FeatureStore Controller", func() { Expect(resource.Status.ServiceHostnames.UI).To(Equal(feast.GetFeastServiceName(services.UIFeastType) + "." + resource.Namespace + domain)) Expect(resource.Status.Conditions).NotTo(BeEmpty()) - cond := apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.ReadyType) + cond := apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.ReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionUnknown)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.DeploymentNotAvailableReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.ReadyType)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.DeploymentNotAvailableMessage)) + Expect(cond.Reason).To(Equal(feastdevv1.DeploymentNotAvailableReason)) + Expect(cond.Type).To(Equal(feastdevv1.ReadyType)) + Expect(cond.Message).To(Equal(feastdevv1.DeploymentNotAvailableMessage)) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.AuthorizationReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.AuthorizationReadyType) Expect(cond).To(BeNil()) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.RegistryReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.RegistryReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionTrue)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.RegistryReadyType)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.RegistryReadyMessage)) + Expect(cond.Reason).To(Equal(feastdevv1.ReadyReason)) + Expect(cond.Type).To(Equal(feastdevv1.RegistryReadyType)) + Expect(cond.Message).To(Equal(feastdevv1.RegistryReadyMessage)) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.ClientReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.ClientReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionTrue)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.ClientReadyType)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.ClientReadyMessage)) + Expect(cond.Reason).To(Equal(feastdevv1.ReadyReason)) + Expect(cond.Type).To(Equal(feastdevv1.ClientReadyType)) + Expect(cond.Message).To(Equal(feastdevv1.ClientReadyMessage)) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.OfflineStoreReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.OfflineStoreReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionTrue)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.OfflineStoreReadyType)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.OfflineStoreReadyMessage)) + Expect(cond.Reason).To(Equal(feastdevv1.ReadyReason)) + Expect(cond.Type).To(Equal(feastdevv1.OfflineStoreReadyType)) + Expect(cond.Message).To(Equal(feastdevv1.OfflineStoreReadyMessage)) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.OnlineStoreReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.OnlineStoreReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionTrue)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.OnlineStoreReadyType)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.OnlineStoreReadyMessage)) + Expect(cond.Reason).To(Equal(feastdevv1.ReadyReason)) + Expect(cond.Type).To(Equal(feastdevv1.OnlineStoreReadyType)) + Expect(cond.Message).To(Equal(feastdevv1.OnlineStoreReadyMessage)) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.UIReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.UIReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionTrue)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.UIReadyType)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.UIReadyMessage)) + Expect(cond.Reason).To(Equal(feastdevv1.ReadyReason)) + Expect(cond.Type).To(Equal(feastdevv1.UIReadyType)) + Expect(cond.Message).To(Equal(feastdevv1.UIReadyMessage)) - Expect(resource.Status.Phase).To(Equal(feastdevv1alpha1.PendingPhase)) + Expect(resource.Status.Phase).To(Equal(feastdevv1.PendingPhase)) deploy := &appsv1.Deployment{} objMeta := feast.GetObjectMeta() @@ -688,7 +688,7 @@ var _ = Describe("FeatureStore Controller", func() { }) Expect(err).NotTo(HaveOccurred()) - resource := &feastdevv1alpha1.FeatureStore{} + resource := &feastdevv1.FeatureStore{} err = k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) @@ -819,7 +819,7 @@ var _ = Describe("FeatureStore Controller", func() { clientConfig := &services.RepoConfig{ Project: feastProject, Provider: services.LocalProviderType, - EntityKeySerializationVersion: feastdevv1alpha1.SerializationVersion, + EntityKeySerializationVersion: feastdevv1.SerializationVersion, OfflineStore: offlineRemote, OnlineStore: services.OnlineStoreConfig{ Path: "http://feast-services-online.default.svc.cluster.local:80", @@ -878,7 +878,7 @@ var _ = Describe("FeatureStore Controller", func() { }) Expect(err).NotTo(HaveOccurred()) - resource := &feastdevv1alpha1.FeatureStore{} + resource := &feastdevv1.FeatureStore{} err = k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) @@ -965,7 +965,7 @@ var _ = Describe("FeatureStore Controller", func() { }) Expect(err).NotTo(HaveOccurred()) - resource := &feastdevv1alpha1.FeatureStore{} + resource := &feastdevv1.FeatureStore{} err = k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) @@ -1035,26 +1035,26 @@ var _ = Describe("FeatureStore Controller", func() { }) Expect(err).NotTo(HaveOccurred()) - referencedRegistry := &feastdevv1alpha1.FeatureStore{} + referencedRegistry := &feastdevv1.FeatureStore{} err = k8sClient.Get(ctx, typeNamespacedName, referencedRegistry) Expect(err).NotTo(HaveOccurred()) name := "remote-registry-reference" - resource := &feastdevv1alpha1.FeatureStore{ + resource := &feastdevv1.FeatureStore{ ObjectMeta: metav1.ObjectMeta{ Name: name, Namespace: referencedRegistry.Namespace, }, - Spec: feastdevv1alpha1.FeatureStoreSpec{ + Spec: feastdevv1.FeatureStoreSpec{ FeastProject: referencedRegistry.Spec.FeastProject, - Services: &feastdevv1alpha1.FeatureStoreServices{ - OnlineStore: &feastdevv1alpha1.OnlineStore{ - Server: &feastdevv1alpha1.ServerConfigs{}, + Services: &feastdevv1.FeatureStoreServices{ + OnlineStore: &feastdevv1.OnlineStore{ + Server: &feastdevv1.ServerConfigs{}, }, - OfflineStore: &feastdevv1alpha1.OfflineStore{}, - Registry: &feastdevv1alpha1.Registry{ - Remote: &feastdevv1alpha1.RemoteRegistryConfig{ - FeastRef: &feastdevv1alpha1.FeatureStoreRef{ + OfflineStore: &feastdevv1.OfflineStore{}, + Registry: &feastdevv1.Registry{ + Remote: &feastdevv1.RemoteRegistryConfig{ + FeastRef: &feastdevv1.FeatureStoreRef{ Name: name, }, }, @@ -1062,7 +1062,7 @@ var _ = Describe("FeatureStore Controller", func() { }, }, } - resource.SetGroupVersionKind(feastdevv1alpha1.GroupVersion.WithKind("FeatureStore")) + resource.SetGroupVersionKind(feastdevv1.GroupVersion.WithKind("FeatureStore")) nsName := client.ObjectKeyFromObject(resource) err = k8sClient.Create(ctx, resource) Expect(err).NotTo(HaveOccurred()) @@ -1073,10 +1073,10 @@ var _ = Describe("FeatureStore Controller", func() { err = k8sClient.Get(ctx, nsName, resource) Expect(err).NotTo(HaveOccurred()) Expect(resource.Status.Applied.Services.Registry.Remote.FeastRef.Namespace).NotTo(BeEmpty()) - Expect(apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.AuthorizationReadyType)).To(BeNil()) - Expect(apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.RegistryReadyType)).To(BeNil()) - Expect(apimeta.IsStatusConditionTrue(resource.Status.Conditions, feastdevv1alpha1.ReadyType)).To(BeFalse()) - cond := apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.ReadyType) + Expect(apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.AuthorizationReadyType)).To(BeNil()) + Expect(apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.RegistryReadyType)).To(BeNil()) + Expect(apimeta.IsStatusConditionTrue(resource.Status.Conditions, feastdevv1.ReadyType)).To(BeFalse()) + cond := apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.ReadyType) Expect(cond).NotTo(BeNil()) Expect(cond.Message).To(Equal("Error: FeatureStore '" + name + "' can't reference itself in `spec.services.registry.remote.feastRef`")) @@ -1089,10 +1089,10 @@ var _ = Describe("FeatureStore Controller", func() { Expect(err).To(HaveOccurred()) err = k8sClient.Get(ctx, nsName, resource) Expect(err).NotTo(HaveOccurred()) - Expect(apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.AuthorizationReadyType)).To(BeNil()) - Expect(apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.RegistryReadyType)).To(BeNil()) - Expect(apimeta.IsStatusConditionTrue(resource.Status.Conditions, feastdevv1alpha1.ReadyType)).To(BeFalse()) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.ReadyType) + Expect(apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.AuthorizationReadyType)).To(BeNil()) + Expect(apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.RegistryReadyType)).To(BeNil()) + Expect(apimeta.IsStatusConditionTrue(resource.Status.Conditions, feastdevv1.ReadyType)).To(BeFalse()) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.ReadyType) Expect(cond).NotTo(BeNil()) Expect(cond.Message).To(Equal("Error: Referenced FeatureStore '" + resource.Spec.Services.Registry.Remote.FeastRef.Name + "' was not found")) @@ -1107,10 +1107,10 @@ var _ = Describe("FeatureStore Controller", func() { err = k8sClient.Get(ctx, nsName, resource) Expect(err).NotTo(HaveOccurred()) - Expect(apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.AuthorizationReadyType)).To(BeNil()) - Expect(apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.RegistryReadyType)).To(BeNil()) - Expect(apimeta.IsStatusConditionTrue(resource.Status.Conditions, feastdevv1alpha1.OnlineStoreReadyType)).To(BeTrue()) - Expect(apimeta.IsStatusConditionTrue(resource.Status.Conditions, feastdevv1alpha1.OfflineStoreReadyType)).To(BeTrue()) + Expect(apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.AuthorizationReadyType)).To(BeNil()) + Expect(apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.RegistryReadyType)).To(BeNil()) + Expect(apimeta.IsStatusConditionTrue(resource.Status.Conditions, feastdevv1.OnlineStoreReadyType)).To(BeTrue()) + Expect(apimeta.IsStatusConditionTrue(resource.Status.Conditions, feastdevv1.OfflineStoreReadyType)).To(BeTrue()) Expect(resource.Status.ServiceHostnames.Registry).ToNot(BeEmpty()) Expect(resource.Status.ServiceHostnames.Registry).To(Equal(referencedRegistry.Status.ServiceHostnames.Registry)) feast := services.FeastServices{ @@ -1154,7 +1154,7 @@ var _ = Describe("FeatureStore Controller", func() { clientConfig := &services.RepoConfig{ Project: feastProject, Provider: services.LocalProviderType, - EntityKeySerializationVersion: feastdevv1alpha1.SerializationVersion, + EntityKeySerializationVersion: feastdevv1.SerializationVersion, OnlineStore: services.OnlineStoreConfig{ Path: "http://feast-" + resource.Name + "-online.default.svc.cluster.local:80", Type: services.OnlineRemoteConfigType, @@ -1188,8 +1188,8 @@ var _ = Describe("FeatureStore Controller", func() { // break remote reference hostname := "test:80" - referencedRegistry.Spec.Services.Registry = &feastdevv1alpha1.Registry{ - Remote: &feastdevv1alpha1.RemoteRegistryConfig{ + referencedRegistry.Spec.Services.Registry = &feastdevv1.Registry{ + Remote: &feastdevv1.RemoteRegistryConfig{ Hostname: &hostname, }, } @@ -1208,13 +1208,13 @@ var _ = Describe("FeatureStore Controller", func() { err = k8sClient.Get(ctx, nsName, resource) Expect(err).NotTo(HaveOccurred()) Expect(resource.Status.ServiceHostnames.Registry).To(BeEmpty()) - Expect(apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.AuthorizationReadyType)).To(BeNil()) - Expect(apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.RegistryReadyType)).To(BeNil()) - Expect(apimeta.IsStatusConditionTrue(resource.Status.Conditions, feastdevv1alpha1.ReadyType)).To(BeFalse()) - Expect(apimeta.IsStatusConditionTrue(resource.Status.Conditions, feastdevv1alpha1.OnlineStoreReadyType)).To(BeTrue()) - Expect(apimeta.IsStatusConditionTrue(resource.Status.Conditions, feastdevv1alpha1.OfflineStoreReadyType)).To(BeTrue()) + Expect(apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.AuthorizationReadyType)).To(BeNil()) + Expect(apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.RegistryReadyType)).To(BeNil()) + Expect(apimeta.IsStatusConditionTrue(resource.Status.Conditions, feastdevv1.ReadyType)).To(BeFalse()) + Expect(apimeta.IsStatusConditionTrue(resource.Status.Conditions, feastdevv1.OnlineStoreReadyType)).To(BeTrue()) + Expect(apimeta.IsStatusConditionTrue(resource.Status.Conditions, feastdevv1.OfflineStoreReadyType)).To(BeTrue()) Expect(resource.Status.Applied.Services.Registry.Remote.FeastRef.Name).To(Equal(referencedRegistry.Name)) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.ReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.ReadyType) Expect(cond).NotTo(BeNil()) Expect(cond.Message).To(Equal("Error: Remote feast registry of referenced FeatureStore '" + referencedRegistry.Name + "' is not ready")) }) @@ -1265,17 +1265,17 @@ var _ = Describe("FeatureStore Controller", func() { Name: name, Namespace: "default", } - resource := &feastdevv1alpha1.FeatureStore{ + resource := &feastdevv1.FeatureStore{ ObjectMeta: metav1.ObjectMeta{ Name: name, Namespace: "default", }, - Spec: feastdevv1alpha1.FeatureStoreSpec{ + Spec: feastdevv1.FeatureStoreSpec{ FeastProject: feastProject, - Services: &feastdevv1alpha1.FeatureStoreServices{ - Registry: &feastdevv1alpha1.Registry{ - Local: &feastdevv1alpha1.LocalRegistryConfig{ - Server: &feastdevv1alpha1.RegistryServerConfigs{ + Services: &feastdevv1.FeatureStoreServices{ + Registry: &feastdevv1.Registry{ + Local: &feastdevv1.LocalRegistryConfig{ + Server: &feastdevv1.RegistryServerConfigs{ GRPC: tc.grpc, RestAPI: tc.restAPI, }, @@ -1284,7 +1284,7 @@ var _ = Describe("FeatureStore Controller", func() { }, }, } - resource.SetGroupVersionKind(feastdevv1alpha1.GroupVersion.WithKind("FeatureStore")) + resource.SetGroupVersionKind(feastdevv1.GroupVersion.WithKind("FeatureStore")) err := k8sClient.Create(ctx, resource) Expect(err).NotTo(HaveOccurred()) @@ -1320,26 +1320,26 @@ var _ = Describe("FeatureStore Controller", func() { "expected %s to be present in container command: %v", expectedArg, registryContainer.Command) } Expect(resource.Status.Conditions).NotTo(BeEmpty()) - cond := apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.RegistryReadyType) + cond := apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.RegistryReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionTrue)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.RegistryReadyType)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.RegistryReadyMessage)) + Expect(cond.Reason).To(Equal(feastdevv1.ReadyReason)) + Expect(cond.Type).To(Equal(feastdevv1.RegistryReadyType)) + Expect(cond.Message).To(Equal(feastdevv1.RegistryReadyMessage)) } By("Verifying that creation fails when both REST API and gRPC are disabled") - disabledResource := &feastdevv1alpha1.FeatureStore{ + disabledResource := &feastdevv1.FeatureStore{ ObjectMeta: metav1.ObjectMeta{ Name: "disabled-both", Namespace: "default", }, - Spec: feastdevv1alpha1.FeatureStoreSpec{ + Spec: feastdevv1.FeatureStoreSpec{ FeastProject: feastProject, - Services: &feastdevv1alpha1.FeatureStoreServices{ - Registry: &feastdevv1alpha1.Registry{ - Local: &feastdevv1alpha1.LocalRegistryConfig{ - Server: &feastdevv1alpha1.RegistryServerConfigs{ + Services: &feastdevv1.FeatureStoreServices{ + Registry: &feastdevv1.Registry{ + Local: &feastdevv1.LocalRegistryConfig{ + Server: &feastdevv1.RegistryServerConfigs{ RestAPI: ptr(false), GRPC: ptr(false), }, @@ -1348,7 +1348,7 @@ var _ = Describe("FeatureStore Controller", func() { }, }, } - disabledResource.SetGroupVersionKind(feastdevv1alpha1.GroupVersion.WithKind("FeatureStore")) + disabledResource.SetGroupVersionKind(feastdevv1.GroupVersion.WithKind("FeatureStore")) err := k8sClient.Create(ctx, disabledResource) Expect(err).To(HaveOccurred()) @@ -1367,7 +1367,7 @@ var _ = Describe("FeatureStore Controller", func() { }) Expect(err).NotTo(HaveOccurred()) - resource := &feastdevv1alpha1.FeatureStore{} + resource := &feastdevv1.FeatureStore{} err = k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) @@ -1416,75 +1416,75 @@ var _ = Describe("FeatureStore Controller", func() { Expect(err).NotTo(HaveOccurred()) Expect(resource.Status.Conditions).To(HaveLen(7)) - cond := apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.ReadyType) + cond := apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.ReadyType) Expect(cond).ToNot(BeNil()) - Expect(cond.Type).To(Equal(feastdevv1alpha1.ReadyType)) + Expect(cond.Type).To(Equal(feastdevv1.ReadyType)) Expect(cond.Status).To(Equal(metav1.ConditionFalse)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.FailedReason)) + Expect(cond.Reason).To(Equal(feastdevv1.FailedReason)) Expect(cond.Message).To(Equal("Error: Object " + resource.Namespace + "/" + deploy.Name + " is already owned by another Service controller " + name)) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.AuthorizationReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.AuthorizationReadyType) Expect(cond).To(BeNil()) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.RegistryReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.RegistryReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionTrue)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.RegistryReadyType)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.RegistryReadyMessage)) + Expect(cond.Reason).To(Equal(feastdevv1.ReadyReason)) + Expect(cond.Type).To(Equal(feastdevv1.RegistryReadyType)) + Expect(cond.Message).To(Equal(feastdevv1.RegistryReadyMessage)) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.ClientReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.ClientReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionTrue)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.ClientReadyType)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.ClientReadyMessage)) + Expect(cond.Reason).To(Equal(feastdevv1.ReadyReason)) + Expect(cond.Type).To(Equal(feastdevv1.ClientReadyType)) + Expect(cond.Message).To(Equal(feastdevv1.ClientReadyMessage)) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.OfflineStoreReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.OfflineStoreReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionTrue)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.OfflineStoreReadyType)) + Expect(cond.Reason).To(Equal(feastdevv1.ReadyReason)) + Expect(cond.Type).To(Equal(feastdevv1.OfflineStoreReadyType)) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.OnlineStoreReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.OnlineStoreReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionTrue)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.OnlineStoreReadyType)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.OnlineStoreReadyMessage)) + Expect(cond.Reason).To(Equal(feastdevv1.ReadyReason)) + Expect(cond.Type).To(Equal(feastdevv1.OnlineStoreReadyType)) + Expect(cond.Message).To(Equal(feastdevv1.OnlineStoreReadyMessage)) - Expect(resource.Status.Phase).To(Equal(feastdevv1alpha1.FailedPhase)) + Expect(resource.Status.Phase).To(Equal(feastdevv1.FailedPhase)) }) It("should error on reconcile", func() { By("By failing to pass CRD schema validation") - resource := &feastdevv1alpha1.FeatureStore{} + resource := &feastdevv1.FeatureStore{} err := k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) - resource.Spec.Services.Registry = &feastdevv1alpha1.Registry{} + resource.Spec.Services.Registry = &feastdevv1.Registry{} err = k8sClient.Update(ctx, resource) Expect(err).To(HaveOccurred()) - resource.Spec.Services.Registry = &feastdevv1alpha1.Registry{ - Local: &feastdevv1alpha1.LocalRegistryConfig{}, - Remote: &feastdevv1alpha1.RemoteRegistryConfig{}, + resource.Spec.Services.Registry = &feastdevv1.Registry{ + Local: &feastdevv1.LocalRegistryConfig{}, + Remote: &feastdevv1.RemoteRegistryConfig{}, } err = k8sClient.Update(ctx, resource) Expect(err).To(HaveOccurred()) - resource.Spec.Services.Registry = &feastdevv1alpha1.Registry{ - Remote: &feastdevv1alpha1.RemoteRegistryConfig{}, + resource.Spec.Services.Registry = &feastdevv1.Registry{ + Remote: &feastdevv1.RemoteRegistryConfig{}, } err = k8sClient.Update(ctx, resource) Expect(err).To(HaveOccurred()) hostname := "test:80" - resource.Spec.Services.Registry = &feastdevv1alpha1.Registry{ - Remote: &feastdevv1alpha1.RemoteRegistryConfig{ + resource.Spec.Services.Registry = &feastdevv1.Registry{ + Remote: &feastdevv1.RemoteRegistryConfig{ Hostname: &hostname, - FeastRef: &feastdevv1alpha1.FeatureStoreRef{ + FeastRef: &feastdevv1.FeatureStoreRef{ Name: "test", }, }, @@ -1492,9 +1492,9 @@ var _ = Describe("FeatureStore Controller", func() { err = k8sClient.Update(ctx, resource) Expect(err).To(HaveOccurred()) - resource.Spec.Services.Registry = &feastdevv1alpha1.Registry{ - Remote: &feastdevv1alpha1.RemoteRegistryConfig{ - FeastRef: &feastdevv1alpha1.FeatureStoreRef{ + resource.Spec.Services.Registry = &feastdevv1.Registry{ + Remote: &feastdevv1.RemoteRegistryConfig{ + FeastRef: &feastdevv1.FeatureStoreRef{ Name: "test", }, }, @@ -1511,17 +1511,17 @@ var _ = Describe("FeatureStore Controller", func() { } // Create remote FeatureStore with gRPC disabled - remote := &feastdevv1alpha1.FeatureStore{ + remote := &feastdevv1.FeatureStore{ ObjectMeta: metav1.ObjectMeta{ Name: remoteStoreName, Namespace: "default", }, - Spec: feastdevv1alpha1.FeatureStoreSpec{ + Spec: feastdevv1.FeatureStoreSpec{ FeastProject: feastProject, - Services: &feastdevv1alpha1.FeatureStoreServices{ - Registry: &feastdevv1alpha1.Registry{ - Local: &feastdevv1alpha1.LocalRegistryConfig{ - Server: &feastdevv1alpha1.RegistryServerConfigs{ + Services: &feastdevv1.FeatureStoreServices{ + Registry: &feastdevv1.Registry{ + Local: &feastdevv1.LocalRegistryConfig{ + Server: &feastdevv1.RegistryServerConfigs{ GRPC: ptr(false), RestAPI: ptr(true), }, @@ -1543,9 +1543,9 @@ var _ = Describe("FeatureStore Controller", func() { // Update main FeatureStore to reference the remote registry Expect(k8sClient.Get(ctx, typeNamespacedName, featurestore)).To(Succeed()) featurestore.Spec.FeastProject = feastProject - featurestore.Spec.Services.Registry = &feastdevv1alpha1.Registry{ - Remote: &feastdevv1alpha1.RemoteRegistryConfig{ - FeastRef: &feastdevv1alpha1.FeatureStoreRef{Name: remoteStoreName}, + featurestore.Spec.Services.Registry = &feastdevv1.Registry{ + Remote: &feastdevv1.RemoteRegistryConfig{ + FeastRef: &feastdevv1.FeatureStoreRef{Name: remoteStoreName}, }, } Expect(k8sClient.Update(ctx, featurestore)).To(Succeed()) diff --git a/infra/feast-operator/internal/controller/featurestore_controller_test_utils_test.go b/infra/feast-operator/internal/controller/featurestore_controller_test_utils_test.go index 63df6d46f46..cadb1ac13e6 100644 --- a/infra/feast-operator/internal/controller/featurestore_controller_test_utils_test.go +++ b/infra/feast-operator/internal/controller/featurestore_controller_test_utils_test.go @@ -5,7 +5,7 @@ import ( . "github.com/onsi/ginkgo/v2" - feastdevv1alpha1 "github.com/feast-dev/feast/infra/feast-operator/api/v1alpha1" + feastdevv1 "github.com/feast-dev/feast/infra/feast-operator/api/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" . "github.com/onsi/gomega" @@ -95,31 +95,31 @@ func deleteEnvFromSecretAndConfigMap() { Expect(err).ToNot(HaveOccurred()) } -func createFeatureStoreResource(resourceName string, image string, pullPolicy corev1.PullPolicy, envVars *[]corev1.EnvVar, envFromVar *[]corev1.EnvFromSource) *feastdevv1alpha1.FeatureStore { - return &feastdevv1alpha1.FeatureStore{ +func createFeatureStoreResource(resourceName string, image string, pullPolicy corev1.PullPolicy, envVars *[]corev1.EnvVar, envFromVar *[]corev1.EnvFromSource) *feastdevv1.FeatureStore { + return &feastdevv1.FeatureStore{ ObjectMeta: metav1.ObjectMeta{ Name: resourceName, Namespace: "default", }, - Spec: feastdevv1alpha1.FeatureStoreSpec{ + Spec: feastdevv1.FeatureStoreSpec{ FeastProject: feastProject, - Services: &feastdevv1alpha1.FeatureStoreServices{ - OfflineStore: &feastdevv1alpha1.OfflineStore{ - Server: &feastdevv1alpha1.ServerConfigs{ - ContainerConfigs: feastdevv1alpha1.ContainerConfigs{ - OptionalCtrConfigs: feastdevv1alpha1.OptionalCtrConfigs{ + Services: &feastdevv1.FeatureStoreServices{ + OfflineStore: &feastdevv1.OfflineStore{ + Server: &feastdevv1.ServerConfigs{ + ContainerConfigs: feastdevv1.ContainerConfigs{ + OptionalCtrConfigs: feastdevv1.OptionalCtrConfigs{ EnvFrom: envFromVar, }, }, }, }, - OnlineStore: &feastdevv1alpha1.OnlineStore{ - Server: &feastdevv1alpha1.ServerConfigs{ - ContainerConfigs: feastdevv1alpha1.ContainerConfigs{ - DefaultCtrConfigs: feastdevv1alpha1.DefaultCtrConfigs{ + OnlineStore: &feastdevv1.OnlineStore{ + Server: &feastdevv1.ServerConfigs{ + ContainerConfigs: feastdevv1.ContainerConfigs{ + DefaultCtrConfigs: feastdevv1.DefaultCtrConfigs{ Image: &image, }, - OptionalCtrConfigs: feastdevv1alpha1.OptionalCtrConfigs{ + OptionalCtrConfigs: feastdevv1.OptionalCtrConfigs{ Env: envVars, EnvFrom: envFromVar, ImagePullPolicy: &pullPolicy, @@ -128,19 +128,19 @@ func createFeatureStoreResource(resourceName string, image string, pullPolicy co }, }, }, - Registry: &feastdevv1alpha1.Registry{ - Local: &feastdevv1alpha1.LocalRegistryConfig{ - Server: &feastdevv1alpha1.RegistryServerConfigs{ - ServerConfigs: feastdevv1alpha1.ServerConfigs{}, + Registry: &feastdevv1.Registry{ + Local: &feastdevv1.LocalRegistryConfig{ + Server: &feastdevv1.RegistryServerConfigs{ + ServerConfigs: feastdevv1.ServerConfigs{}, }, }, }, - UI: &feastdevv1alpha1.ServerConfigs{ - ContainerConfigs: feastdevv1alpha1.ContainerConfigs{ - DefaultCtrConfigs: feastdevv1alpha1.DefaultCtrConfigs{ + UI: &feastdevv1.ServerConfigs{ + ContainerConfigs: feastdevv1.ContainerConfigs{ + DefaultCtrConfigs: feastdevv1.DefaultCtrConfigs{ Image: &image, }, - OptionalCtrConfigs: feastdevv1alpha1.OptionalCtrConfigs{ + OptionalCtrConfigs: feastdevv1.OptionalCtrConfigs{ Env: envVars, EnvFrom: envFromVar, ImagePullPolicy: &pullPolicy, diff --git a/infra/feast-operator/internal/controller/featurestore_controller_tls_test.go b/infra/feast-operator/internal/controller/featurestore_controller_tls_test.go index b7aca319f05..0af097120ce 100644 --- a/infra/feast-operator/internal/controller/featurestore_controller_tls_test.go +++ b/infra/feast-operator/internal/controller/featurestore_controller_tls_test.go @@ -38,7 +38,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/reconcile" "github.com/feast-dev/feast/infra/feast-operator/api/feastversion" - feastdevv1alpha1 "github.com/feast-dev/feast/infra/feast-operator/api/v1alpha1" + feastdevv1 "github.com/feast-dev/feast/infra/feast-operator/api/v1" "github.com/feast-dev/feast/infra/feast-operator/internal/controller/handler" "github.com/feast-dev/feast/infra/feast-operator/internal/controller/services" ) @@ -53,43 +53,43 @@ var _ = Describe("FeatureStore Controller - Feast service TLS", func() { Name: resourceName, Namespace: "default", } - featurestore := &feastdevv1alpha1.FeatureStore{} + featurestore := &feastdevv1.FeatureStore{} localRef := corev1.LocalObjectReference{Name: "test"} - tlsConfigs := &feastdevv1alpha1.TlsConfigs{ + tlsConfigs := &feastdevv1.TlsConfigs{ SecretRef: &localRef, } BeforeEach(func() { By("creating the custom resource for the Kind FeatureStore") err := k8sClient.Get(ctx, typeNamespacedName, featurestore) if err != nil && errors.IsNotFound(err) { - resource := &feastdevv1alpha1.FeatureStore{ + resource := &feastdevv1.FeatureStore{ ObjectMeta: metav1.ObjectMeta{ Name: resourceName, Namespace: "default", }, - Spec: feastdevv1alpha1.FeatureStoreSpec{ + Spec: feastdevv1.FeatureStoreSpec{ FeastProject: feastProject, - Services: &feastdevv1alpha1.FeatureStoreServices{ - OnlineStore: &feastdevv1alpha1.OnlineStore{ - Server: &feastdevv1alpha1.ServerConfigs{ + Services: &feastdevv1.FeatureStoreServices{ + OnlineStore: &feastdevv1.OnlineStore{ + Server: &feastdevv1.ServerConfigs{ TLS: tlsConfigs, }, }, - OfflineStore: &feastdevv1alpha1.OfflineStore{ - Server: &feastdevv1alpha1.ServerConfigs{ + OfflineStore: &feastdevv1.OfflineStore{ + Server: &feastdevv1.ServerConfigs{ TLS: tlsConfigs, }, }, - Registry: &feastdevv1alpha1.Registry{ - Local: &feastdevv1alpha1.LocalRegistryConfig{ - Server: &feastdevv1alpha1.RegistryServerConfigs{ - ServerConfigs: feastdevv1alpha1.ServerConfigs{ + Registry: &feastdevv1.Registry{ + Local: &feastdevv1.LocalRegistryConfig{ + Server: &feastdevv1.RegistryServerConfigs{ + ServerConfigs: feastdevv1.ServerConfigs{ TLS: tlsConfigs, }, }, }, }, - UI: &feastdevv1alpha1.ServerConfigs{ + UI: &feastdevv1.ServerConfigs{ TLS: tlsConfigs, }, }, @@ -99,7 +99,7 @@ var _ = Describe("FeatureStore Controller - Feast service TLS", func() { } }) AfterEach(func() { - resource := &feastdevv1alpha1.FeatureStore{} + resource := &feastdevv1.FeatureStore{} err := k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) @@ -119,7 +119,7 @@ var _ = Describe("FeatureStore Controller - Feast service TLS", func() { }) Expect(err).NotTo(HaveOccurred()) - resource := &feastdevv1alpha1.FeatureStore{} + resource := &feastdevv1.FeatureStore{} err = k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) feast := services.FeastServices{ @@ -145,42 +145,42 @@ var _ = Describe("FeatureStore Controller - Feast service TLS", func() { Expect(resource.Status.ServiceHostnames.Registry).To(Equal(feast.GetFeastServiceName(services.RegistryFeastType) + "." + resource.Namespace + domainTls)) Expect(resource.Status.Conditions).NotTo(BeEmpty()) - cond := apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.ReadyType) + cond := apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.ReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionUnknown)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.DeploymentNotAvailableReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.ReadyType)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.DeploymentNotAvailableMessage)) + Expect(cond.Reason).To(Equal(feastdevv1.DeploymentNotAvailableReason)) + Expect(cond.Type).To(Equal(feastdevv1.ReadyType)) + Expect(cond.Message).To(Equal(feastdevv1.DeploymentNotAvailableMessage)) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.RegistryReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.RegistryReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionTrue)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.RegistryReadyType)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.RegistryReadyMessage)) + Expect(cond.Reason).To(Equal(feastdevv1.ReadyReason)) + Expect(cond.Type).To(Equal(feastdevv1.RegistryReadyType)) + Expect(cond.Message).To(Equal(feastdevv1.RegistryReadyMessage)) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.ClientReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.ClientReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionTrue)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.ClientReadyType)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.ClientReadyMessage)) + Expect(cond.Reason).To(Equal(feastdevv1.ReadyReason)) + Expect(cond.Type).To(Equal(feastdevv1.ClientReadyType)) + Expect(cond.Message).To(Equal(feastdevv1.ClientReadyMessage)) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.OfflineStoreReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.OfflineStoreReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionTrue)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.OfflineStoreReadyType)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.OfflineStoreReadyMessage)) + Expect(cond.Reason).To(Equal(feastdevv1.ReadyReason)) + Expect(cond.Type).To(Equal(feastdevv1.OfflineStoreReadyType)) + Expect(cond.Message).To(Equal(feastdevv1.OfflineStoreReadyMessage)) - cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1alpha1.OnlineStoreReadyType) + cond = apimeta.FindStatusCondition(resource.Status.Conditions, feastdevv1.OnlineStoreReadyType) Expect(cond).ToNot(BeNil()) Expect(cond.Status).To(Equal(metav1.ConditionTrue)) - Expect(cond.Reason).To(Equal(feastdevv1alpha1.ReadyReason)) - Expect(cond.Type).To(Equal(feastdevv1alpha1.OnlineStoreReadyType)) - Expect(cond.Message).To(Equal(feastdevv1alpha1.OnlineStoreReadyMessage)) + Expect(cond.Reason).To(Equal(feastdevv1.ReadyReason)) + Expect(cond.Type).To(Equal(feastdevv1.OnlineStoreReadyType)) + Expect(cond.Message).To(Equal(feastdevv1.OnlineStoreReadyMessage)) - Expect(resource.Status.Phase).To(Equal(feastdevv1alpha1.PendingPhase)) + Expect(resource.Status.Phase).To(Equal(feastdevv1.PendingPhase)) // check deployment deploy := &appsv1.Deployment{} @@ -216,7 +216,7 @@ var _ = Describe("FeatureStore Controller - Feast service TLS", func() { }) Expect(err).NotTo(HaveOccurred()) - resource := &feastdevv1alpha1.FeatureStore{} + resource := &feastdevv1.FeatureStore{} err = k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) feast := services.FeastServices{ @@ -338,7 +338,7 @@ var _ = Describe("FeatureStore Controller - Feast service TLS", func() { clientConfig := &services.RepoConfig{ Project: feastProject, Provider: services.LocalProviderType, - EntityKeySerializationVersion: feastdevv1alpha1.SerializationVersion, + EntityKeySerializationVersion: feastdevv1.SerializationVersion, OfflineStore: offlineRemote, OnlineStore: services.OnlineStoreConfig{ Path: fmt.Sprintf("https://feast-%s-online.default.svc.cluster.local:443", resourceName), @@ -354,25 +354,25 @@ var _ = Describe("FeatureStore Controller - Feast service TLS", func() { resourceNew := resource.DeepCopy() disable := true remoteRegHost := "test.other-ns:443" - resourceNew.Spec = feastdevv1alpha1.FeatureStoreSpec{ + resourceNew.Spec = feastdevv1.FeatureStoreSpec{ FeastProject: feastProject, - Services: &feastdevv1alpha1.FeatureStoreServices{ - OnlineStore: &feastdevv1alpha1.OnlineStore{ - Server: &feastdevv1alpha1.ServerConfigs{ - TLS: &feastdevv1alpha1.TlsConfigs{ + Services: &feastdevv1.FeatureStoreServices{ + OnlineStore: &feastdevv1.OnlineStore{ + Server: &feastdevv1.ServerConfigs{ + TLS: &feastdevv1.TlsConfigs{ Disable: &disable, }, }, }, - OfflineStore: &feastdevv1alpha1.OfflineStore{ - Server: &feastdevv1alpha1.ServerConfigs{ + OfflineStore: &feastdevv1.OfflineStore{ + Server: &feastdevv1.ServerConfigs{ TLS: tlsConfigs, }, }, - Registry: &feastdevv1alpha1.Registry{ - Remote: &feastdevv1alpha1.RemoteRegistryConfig{ + Registry: &feastdevv1.Registry{ + Remote: &feastdevv1.RemoteRegistryConfig{ Hostname: &remoteRegHost, - TLS: &feastdevv1alpha1.TlsRemoteRegistryConfigs{ + TLS: &feastdevv1.TlsRemoteRegistryConfigs{ ConfigMapRef: localRef, CertName: "remote.crt", }, @@ -387,7 +387,7 @@ var _ = Describe("FeatureStore Controller - Feast service TLS", func() { }) Expect(err).NotTo(HaveOccurred()) - resource = &feastdevv1alpha1.FeatureStore{} + resource = &feastdevv1.FeatureStore{} err = k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) feast.Handler.FeatureStore = resource @@ -457,25 +457,25 @@ var _ = Describe("Test mountCustomCABundle functionality", func() { Namespace: "default", } - fs := &feastdevv1alpha1.FeatureStore{ + fs := &feastdevv1.FeatureStore{ ObjectMeta: metav1.ObjectMeta{ Name: resourceName, Namespace: nsName.Namespace, }, - Spec: feastdevv1alpha1.FeatureStoreSpec{ + Spec: feastdevv1.FeatureStoreSpec{ FeastProject: feastProject, - Services: &feastdevv1alpha1.FeatureStoreServices{ - Registry: &feastdevv1alpha1.Registry{Local: &feastdevv1alpha1.LocalRegistryConfig{Server: &feastdevv1alpha1.RegistryServerConfigs{ServerConfigs: feastdevv1alpha1.ServerConfigs{}}}}, - OnlineStore: &feastdevv1alpha1.OnlineStore{Server: &feastdevv1alpha1.ServerConfigs{}}, - OfflineStore: &feastdevv1alpha1.OfflineStore{Server: &feastdevv1alpha1.ServerConfigs{}}, - UI: &feastdevv1alpha1.ServerConfigs{}, + Services: &feastdevv1.FeatureStoreServices{ + Registry: &feastdevv1.Registry{Local: &feastdevv1.LocalRegistryConfig{Server: &feastdevv1.RegistryServerConfigs{ServerConfigs: feastdevv1.ServerConfigs{}}}}, + OnlineStore: &feastdevv1.OnlineStore{Server: &feastdevv1.ServerConfigs{}}, + OfflineStore: &feastdevv1.OfflineStore{Server: &feastdevv1.ServerConfigs{}}, + UI: &feastdevv1.ServerConfigs{}, }, }, } AfterEach(func() { By("cleaning up FeatureStore and ConfigMap") - _ = k8sClient.Delete(ctx, &feastdevv1alpha1.FeatureStore{ObjectMeta: metav1.ObjectMeta{Name: resourceName, Namespace: nsName.Namespace}}) + _ = k8sClient.Delete(ctx, &feastdevv1.FeatureStore{ObjectMeta: metav1.ObjectMeta{Name: resourceName, Namespace: nsName.Namespace}}) _ = k8sClient.Delete(ctx, &corev1.ConfigMap{ObjectMeta: metav1.ObjectMeta{Name: configMapName, Namespace: nsName.Namespace}}) }) @@ -502,7 +502,7 @@ var _ = Describe("Test mountCustomCABundle functionality", func() { }) Expect(err).NotTo(HaveOccurred()) - resource := &feastdevv1alpha1.FeatureStore{} + resource := &feastdevv1.FeatureStore{} err = k8sClient.Get(ctx, nsName, resource) Expect(err).NotTo(HaveOccurred()) @@ -545,7 +545,7 @@ var _ = Describe("Test mountCustomCABundle functionality", func() { }) Expect(err).NotTo(HaveOccurred()) - resource := &feastdevv1alpha1.FeatureStore{} + resource := &feastdevv1.FeatureStore{} err = k8sClient.Get(ctx, nsName, resource) Expect(err).NotTo(HaveOccurred()) diff --git a/infra/feast-operator/internal/controller/featurestore_controller_volume_volumemount_test.go b/infra/feast-operator/internal/controller/featurestore_controller_volume_volumemount_test.go index 521f18cdc36..5751227e6ad 100644 --- a/infra/feast-operator/internal/controller/featurestore_controller_volume_volumemount_test.go +++ b/infra/feast-operator/internal/controller/featurestore_controller_volume_volumemount_test.go @@ -25,7 +25,7 @@ import ( "github.com/feast-dev/feast/infra/feast-operator/internal/controller/services" "sigs.k8s.io/controller-runtime/pkg/reconcile" - feastdevv1alpha1 "github.com/feast-dev/feast/infra/feast-operator/api/v1alpha1" + feastdevv1 "github.com/feast-dev/feast/infra/feast-operator/api/v1" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" appsv1 "k8s.io/api/apps/v1" @@ -46,7 +46,7 @@ var _ = Describe("FeatureStore Controller - Deployment Volumes and VolumeMounts" Name: resourceName, Namespace: "default", } - featurestore := &feastdevv1alpha1.FeatureStore{} + featurestore := &feastdevv1.FeatureStore{} onlineStorePath := "/data/online.db" registryPath := "/data/registry.db" @@ -55,20 +55,20 @@ var _ = Describe("FeatureStore Controller - Deployment Volumes and VolumeMounts" err := k8sClient.Get(ctx, typeNamespacedName, featurestore) if err != nil && errors.IsNotFound(err) { resource := createFeatureStoreVolumeResource(resourceName, image, pullPolicy) - resource.Spec.Services.OfflineStore.Persistence = &feastdevv1alpha1.OfflineStorePersistence{ - FilePersistence: &feastdevv1alpha1.OfflineStoreFilePersistence{ + resource.Spec.Services.OfflineStore.Persistence = &feastdevv1.OfflineStorePersistence{ + FilePersistence: &feastdevv1.OfflineStoreFilePersistence{ Type: offlineType, }, } - resource.Spec.Services.OnlineStore.Persistence = &feastdevv1alpha1.OnlineStorePersistence{ - FilePersistence: &feastdevv1alpha1.OnlineStoreFilePersistence{ + resource.Spec.Services.OnlineStore.Persistence = &feastdevv1.OnlineStorePersistence{ + FilePersistence: &feastdevv1.OnlineStoreFilePersistence{ Path: onlineStorePath, }, } - resource.Spec.Services.Registry = &feastdevv1alpha1.Registry{ - Local: &feastdevv1alpha1.LocalRegistryConfig{ - Persistence: &feastdevv1alpha1.RegistryPersistence{ - FilePersistence: &feastdevv1alpha1.RegistryFilePersistence{ + resource.Spec.Services.Registry = &feastdevv1.Registry{ + Local: &feastdevv1.LocalRegistryConfig{ + Persistence: &feastdevv1.RegistryPersistence{ + FilePersistence: &feastdevv1.RegistryFilePersistence{ Path: registryPath, }, }, @@ -78,7 +78,7 @@ var _ = Describe("FeatureStore Controller - Deployment Volumes and VolumeMounts" } }) AfterEach(func() { - resource := &feastdevv1alpha1.FeatureStore{} + resource := &feastdevv1.FeatureStore{} err := k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) @@ -99,7 +99,7 @@ var _ = Describe("FeatureStore Controller - Deployment Volumes and VolumeMounts" }) Expect(err).NotTo(HaveOccurred()) - resource := &feastdevv1alpha1.FeatureStore{} + resource := &feastdevv1.FeatureStore{} err = k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err).NotTo(HaveOccurred()) @@ -158,7 +158,7 @@ var _ = Describe("FeatureStore Controller - Deployment Volumes and VolumeMounts" }) }) -func createFeatureStoreVolumeResource(resourceName string, image string, pullPolicy corev1.PullPolicy) *feastdevv1alpha1.FeatureStore { +func createFeatureStoreVolumeResource(resourceName string, image string, pullPolicy corev1.PullPolicy) *feastdevv1.FeatureStore { volume := corev1.Volume{ Name: "test-volume", VolumeSource: corev1.VolumeSource{ @@ -170,40 +170,40 @@ func createFeatureStoreVolumeResource(resourceName string, image string, pullPol MountPath: "/data", } - return &feastdevv1alpha1.FeatureStore{ + return &feastdevv1.FeatureStore{ ObjectMeta: metav1.ObjectMeta{ Name: resourceName, Namespace: "default", }, - Spec: feastdevv1alpha1.FeatureStoreSpec{ + Spec: feastdevv1.FeatureStoreSpec{ FeastProject: feastProject, - Services: &feastdevv1alpha1.FeatureStoreServices{ + Services: &feastdevv1.FeatureStoreServices{ Volumes: []corev1.Volume{volume}, - OfflineStore: &feastdevv1alpha1.OfflineStore{ - Server: &feastdevv1alpha1.ServerConfigs{ - ContainerConfigs: feastdevv1alpha1.ContainerConfigs{}, + OfflineStore: &feastdevv1.OfflineStore{ + Server: &feastdevv1.ServerConfigs{ + ContainerConfigs: feastdevv1.ContainerConfigs{}, }, }, - OnlineStore: &feastdevv1alpha1.OnlineStore{ - Server: &feastdevv1alpha1.ServerConfigs{ + OnlineStore: &feastdevv1.OnlineStore{ + Server: &feastdevv1.ServerConfigs{ VolumeMounts: []corev1.VolumeMount{volumeMount}, - ContainerConfigs: feastdevv1alpha1.ContainerConfigs{ - DefaultCtrConfigs: feastdevv1alpha1.DefaultCtrConfigs{ + ContainerConfigs: feastdevv1.ContainerConfigs{ + DefaultCtrConfigs: feastdevv1.DefaultCtrConfigs{ Image: &image, }, - OptionalCtrConfigs: feastdevv1alpha1.OptionalCtrConfigs{ + OptionalCtrConfigs: feastdevv1.OptionalCtrConfigs{ ImagePullPolicy: &pullPolicy, Resources: &corev1.ResourceRequirements{}, }, }, }, }, - UI: &feastdevv1alpha1.ServerConfigs{ - ContainerConfigs: feastdevv1alpha1.ContainerConfigs{ - DefaultCtrConfigs: feastdevv1alpha1.DefaultCtrConfigs{ + UI: &feastdevv1.ServerConfigs{ + ContainerConfigs: feastdevv1.ContainerConfigs{ + DefaultCtrConfigs: feastdevv1.DefaultCtrConfigs{ Image: &image, }, - OptionalCtrConfigs: feastdevv1alpha1.OptionalCtrConfigs{ + OptionalCtrConfigs: feastdevv1.OptionalCtrConfigs{ ImagePullPolicy: &pullPolicy, Resources: &corev1.ResourceRequirements{}, }, diff --git a/infra/feast-operator/internal/controller/handler/handler_types.go b/infra/feast-operator/internal/controller/handler/handler_types.go index 5a26776f569..d6a66c55ffd 100644 --- a/infra/feast-operator/internal/controller/handler/handler_types.go +++ b/infra/feast-operator/internal/controller/handler/handler_types.go @@ -3,7 +3,7 @@ package handler import ( "context" - feastdevv1alpha1 "github.com/feast-dev/feast/infra/feast-operator/api/v1alpha1" + feastdevv1 "github.com/feast-dev/feast/infra/feast-operator/api/v1" "k8s.io/apimachinery/pkg/runtime" "sigs.k8s.io/controller-runtime/pkg/client" ) @@ -16,5 +16,5 @@ type FeastHandler struct { client.Client Context context.Context Scheme *runtime.Scheme - FeatureStore *feastdevv1alpha1.FeatureStore + FeatureStore *feastdevv1.FeatureStore } diff --git a/infra/feast-operator/internal/controller/services/cronjob.go b/infra/feast-operator/internal/controller/services/cronjob.go index 5ac017468ab..f3b978928f7 100644 --- a/infra/feast-operator/internal/controller/services/cronjob.go +++ b/infra/feast-operator/internal/controller/services/cronjob.go @@ -4,7 +4,7 @@ import ( "os" "strconv" - feastdevv1alpha1 "github.com/feast-dev/feast/infra/feast-operator/api/v1alpha1" + feastdevv1 "github.com/feast-dev/feast/infra/feast-operator/api/v1" "github.com/feast-dev/feast/infra/feast-operator/internal/controller/handler" appsv1 "k8s.io/api/apps/v1" batchv1 "k8s.io/api/batch/v1" @@ -272,7 +272,7 @@ func (feast *FeastServices) getCronJobRoleName() string { // defaults to a CronJob configuration that will never run. this default Job can be executed manually, however. // e.g. kubectl create job --from=cronjob/feast-sample feast-sample-job -func setDefaultCronJobConfigs(feastCronJob *feastdevv1alpha1.FeastCronJob) { +func setDefaultCronJobConfigs(feastCronJob *feastdevv1.FeastCronJob) { if len(feastCronJob.Schedule) == 0 { feastCronJob.Schedule = "@yearly" if feastCronJob.Suspend == nil { @@ -286,7 +286,7 @@ func setDefaultCronJobConfigs(feastCronJob *feastdevv1alpha1.FeastCronJob) { } } if feastCronJob.ContainerConfigs == nil { - feastCronJob.ContainerConfigs = &feastdevv1alpha1.CronJobContainerConfigs{} + feastCronJob.ContainerConfigs = &feastdevv1.CronJobContainerConfigs{} } if feastCronJob.ContainerConfigs.Image == nil { feastCronJob.ContainerConfigs.Image = getCronJobImage() diff --git a/infra/feast-operator/internal/controller/services/repo_config.go b/infra/feast-operator/internal/controller/services/repo_config.go index 44b295066f4..b893f031d41 100644 --- a/infra/feast-operator/internal/controller/services/repo_config.go +++ b/infra/feast-operator/internal/controller/services/repo_config.go @@ -22,7 +22,7 @@ import ( "path" "strings" - feastdevv1alpha1 "github.com/feast-dev/feast/infra/feast-operator/api/v1alpha1" + feastdevv1 "github.com/feast-dev/feast/infra/feast-operator/api/v1" "gopkg.in/yaml.v3" ) @@ -48,7 +48,7 @@ func (feast *FeastServices) getServiceRepoConfig() (RepoConfig, error) { } func getServiceRepoConfig( - featureStore *feastdevv1alpha1.FeatureStore, + featureStore *feastdevv1.FeatureStore, secretExtractionFunc func(storeType string, secretRef string, secretKeyName string) (map[string]interface{}, error)) (RepoConfig, error) { repoConfig, err := getBaseServiceRepoConfig(featureStore, secretExtractionFunc) if err != nil { @@ -82,7 +82,7 @@ func getServiceRepoConfig( } func getBaseServiceRepoConfig( - featureStore *feastdevv1alpha1.FeatureStore, + featureStore *feastdevv1.FeatureStore, secretExtractionFunc func(storeType string, secretRef string, secretKeyName string) (map[string]interface{}, error)) (RepoConfig, error) { repoConfig := defaultRepoConfig(featureStore) @@ -116,7 +116,7 @@ func getBaseServiceRepoConfig( return repoConfig, nil } -func setRepoConfigRegistry(services *feastdevv1alpha1.FeatureStoreServices, secretExtractionFunc func(storeType string, secretRef string, secretKeyName string) (map[string]interface{}, error), repoConfig *RepoConfig) error { +func setRepoConfigRegistry(services *feastdevv1.FeatureStoreServices, secretExtractionFunc func(storeType string, secretRef string, secretKeyName string) (map[string]interface{}, error), repoConfig *RepoConfig) error { registryPersistence := services.Registry.Local.Persistence if registryPersistence != nil { @@ -182,7 +182,7 @@ func setRepoConfigRegistry(services *feastdevv1alpha1.FeatureStoreServices, secr return nil } -func setRepoConfigOnline(services *feastdevv1alpha1.FeatureStoreServices, secretExtractionFunc func(storeType string, secretRef string, secretKeyName string) (map[string]interface{}, error), repoConfig *RepoConfig) error { +func setRepoConfigOnline(services *feastdevv1.FeatureStoreServices, secretExtractionFunc func(storeType string, secretRef string, secretKeyName string) (map[string]interface{}, error), repoConfig *RepoConfig) error { onlineStorePersistence := services.OnlineStore.Persistence if onlineStorePersistence != nil { @@ -215,7 +215,7 @@ func setRepoConfigOnline(services *feastdevv1alpha1.FeatureStoreServices, secret return nil } -func setRepoConfigOffline(services *feastdevv1alpha1.FeatureStoreServices, secretExtractionFunc func(storeType string, secretRef string, secretKeyName string) (map[string]interface{}, error), repoConfig *RepoConfig) error { +func setRepoConfigOffline(services *feastdevv1.FeatureStoreServices, secretExtractionFunc func(storeType string, secretRef string, secretKeyName string) (map[string]interface{}, error), repoConfig *RepoConfig) error { repoConfig.OfflineStore = defaultOfflineStoreConfig offlineStorePersistence := services.OfflineStore.Persistence @@ -257,7 +257,7 @@ func (feast *FeastServices) getClientFeatureStoreYaml(secretExtractionFunc func( } func getClientRepoConfig( - featureStore *feastdevv1alpha1.FeatureStore, + featureStore *feastdevv1.FeatureStore, secretExtractionFunc func(storeType string, secretRef string, secretKeyName string) (map[string]interface{}, error), feast *FeastServices) (RepoConfig, error) { status := featureStore.Status @@ -307,7 +307,7 @@ func getClientRepoConfig( } func getRepoConfig( - featureStore *feastdevv1alpha1.FeatureStore, + featureStore *feastdevv1.FeatureStore, secretExtractionFunc func(storeType string, secretRef string, secretKeyName string) (map[string]interface{}, error)) (RepoConfig, error) { status := featureStore.Status repoConfig := initRepoConfig(status.Applied.FeastProject) @@ -340,7 +340,7 @@ func getRepoConfig( return repoConfig, nil } -func getActualPath(filePath string, pvcConfig *feastdevv1alpha1.PvcConfig) string { +func getActualPath(filePath string, pvcConfig *feastdevv1.PvcConfig) string { if pvcConfig == nil { return filePath } @@ -407,7 +407,7 @@ func (feast *FeastServices) GetDefaultRepoConfig() RepoConfig { return defaultRepoConfig(feast.Handler.FeatureStore) } -func defaultRepoConfig(featureStore *feastdevv1alpha1.FeatureStore) RepoConfig { +func defaultRepoConfig(featureStore *feastdevv1.FeatureStore) RepoConfig { repoConfig := initRepoConfig(featureStore.Status.Applied.FeastProject) repoConfig.OnlineStore = defaultOnlineStoreConfig(featureStore) repoConfig.Registry = defaultRegistryConfig(featureStore) @@ -422,19 +422,19 @@ func initRepoConfig(feastProject string) RepoConfig { return RepoConfig{ Project: feastProject, Provider: LocalProviderType, - EntityKeySerializationVersion: feastdevv1alpha1.SerializationVersion, + EntityKeySerializationVersion: feastdevv1.SerializationVersion, AuthzConfig: defaultAuthzConfig, } } -func defaultOnlineStoreConfig(featureStore *feastdevv1alpha1.FeatureStore) OnlineStoreConfig { +func defaultOnlineStoreConfig(featureStore *feastdevv1.FeatureStore) OnlineStoreConfig { return OnlineStoreConfig{ Type: OnlineSqliteConfigType, Path: defaultOnlineStorePath(featureStore), } } -func defaultRegistryConfig(featureStore *feastdevv1alpha1.FeatureStore) RegistryConfig { +func defaultRegistryConfig(featureStore *feastdevv1.FeatureStore) RegistryConfig { return RegistryConfig{ RegistryType: RegistryFileConfigType, Path: defaultRegistryPath(featureStore), 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 72ba289900d..b31e40d7382 100644 --- a/infra/feast-operator/internal/controller/services/repo_config_test.go +++ b/infra/feast-operator/internal/controller/services/repo_config_test.go @@ -25,7 +25,7 @@ import ( corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - feastdevv1alpha1 "github.com/feast-dev/feast/infra/feast-operator/api/v1alpha1" + feastdevv1 "github.com/feast-dev/feast/infra/feast-operator/api/v1" ) var projectName = "test-project" @@ -56,11 +56,11 @@ var _ = Describe("Repo Config", func() { By("Having the local registry resource") featureStore = minimalFeatureStore() testPath := "/test/file.db" - featureStore.Spec.Services = &feastdevv1alpha1.FeatureStoreServices{ - Registry: &feastdevv1alpha1.Registry{ - Local: &feastdevv1alpha1.LocalRegistryConfig{ - Persistence: &feastdevv1alpha1.RegistryPersistence{ - FilePersistence: &feastdevv1alpha1.RegistryFilePersistence{ + featureStore.Spec.Services = &feastdevv1.FeatureStoreServices{ + Registry: &feastdevv1.Registry{ + Local: &feastdevv1.LocalRegistryConfig{ + Persistence: &feastdevv1.RegistryPersistence{ + FilePersistence: &feastdevv1.RegistryFilePersistence{ Path: testPath, }, }, @@ -82,10 +82,10 @@ var _ = Describe("Repo Config", func() { Expect(repoConfig.Registry).To(Equal(expectedRegistryConfig)) By("Adding an offlineStore with PVC") - featureStore.Spec.Services.OfflineStore = &feastdevv1alpha1.OfflineStore{ - Persistence: &feastdevv1alpha1.OfflineStorePersistence{ - FilePersistence: &feastdevv1alpha1.OfflineStoreFilePersistence{ - PvcConfig: &feastdevv1alpha1.PvcConfig{ + featureStore.Spec.Services.OfflineStore = &feastdevv1.OfflineStore{ + Persistence: &feastdevv1.OfflineStorePersistence{ + FilePersistence: &feastdevv1.OfflineStoreFilePersistence{ + PvcConfig: &feastdevv1.PvcConfig{ MountPath: "/testing", }, }, @@ -105,10 +105,10 @@ var _ = Describe("Repo Config", func() { By("Having the remote registry resource") featureStore = minimalFeatureStore() - featureStore.Spec.Services = &feastdevv1alpha1.FeatureStoreServices{ - Registry: &feastdevv1alpha1.Registry{ - Remote: &feastdevv1alpha1.RemoteRegistryConfig{ - FeastRef: &feastdevv1alpha1.FeatureStoreRef{ + featureStore.Spec.Services = &feastdevv1.FeatureStoreServices{ + Registry: &feastdevv1.Registry{ + Remote: &feastdevv1.RemoteRegistryConfig{ + FeastRef: &feastdevv1.FeatureStoreRef{ Name: "registry", }, }, @@ -124,25 +124,25 @@ var _ = Describe("Repo Config", func() { By("Having the all the file services") featureStore = minimalFeatureStore() - featureStore.Spec.Services = &feastdevv1alpha1.FeatureStoreServices{ - OfflineStore: &feastdevv1alpha1.OfflineStore{ - Persistence: &feastdevv1alpha1.OfflineStorePersistence{ - FilePersistence: &feastdevv1alpha1.OfflineStoreFilePersistence{ + featureStore.Spec.Services = &feastdevv1.FeatureStoreServices{ + OfflineStore: &feastdevv1.OfflineStore{ + Persistence: &feastdevv1.OfflineStorePersistence{ + FilePersistence: &feastdevv1.OfflineStoreFilePersistence{ Type: "duckdb", }, }, }, - OnlineStore: &feastdevv1alpha1.OnlineStore{ - Persistence: &feastdevv1alpha1.OnlineStorePersistence{ - FilePersistence: &feastdevv1alpha1.OnlineStoreFilePersistence{ + OnlineStore: &feastdevv1.OnlineStore{ + Persistence: &feastdevv1.OnlineStorePersistence{ + FilePersistence: &feastdevv1.OnlineStoreFilePersistence{ Path: "/data/online.db", }, }, }, - Registry: &feastdevv1alpha1.Registry{ - Local: &feastdevv1alpha1.LocalRegistryConfig{ - Persistence: &feastdevv1alpha1.RegistryPersistence{ - FilePersistence: &feastdevv1alpha1.RegistryFilePersistence{ + Registry: &feastdevv1.Registry{ + Local: &feastdevv1.LocalRegistryConfig{ + Persistence: &feastdevv1.RegistryPersistence{ + FilePersistence: &feastdevv1.RegistryFilePersistence{ Path: "/data/registry.db", }, }, @@ -172,14 +172,14 @@ var _ = Describe("Repo Config", func() { By("Having kubernetes authorization") featureStore = minimalFeatureStore() - featureStore.Spec.AuthzConfig = &feastdevv1alpha1.AuthzConfig{ - KubernetesAuthz: &feastdevv1alpha1.KubernetesAuthz{}, + featureStore.Spec.AuthzConfig = &feastdevv1.AuthzConfig{ + KubernetesAuthz: &feastdevv1.KubernetesAuthz{}, } - featureStore.Spec.Services = &feastdevv1alpha1.FeatureStoreServices{ - OfflineStore: &feastdevv1alpha1.OfflineStore{}, - OnlineStore: &feastdevv1alpha1.OnlineStore{}, - Registry: &feastdevv1alpha1.Registry{ - Local: &feastdevv1alpha1.LocalRegistryConfig{}, + featureStore.Spec.Services = &feastdevv1.FeatureStoreServices{ + OfflineStore: &feastdevv1.OfflineStore{}, + OnlineStore: &feastdevv1.OnlineStore{}, + Registry: &feastdevv1.Registry{ + Local: &feastdevv1.LocalRegistryConfig{}, }, } ApplyDefaultsToStatus(featureStore) @@ -196,8 +196,8 @@ var _ = Describe("Repo Config", func() { Expect(repoConfig.Registry).To(Equal(defaultRegistryConfig(featureStore))) By("Having oidc authorization") - featureStore.Spec.AuthzConfig = &feastdevv1alpha1.AuthzConfig{ - OidcAuthz: &feastdevv1alpha1.OidcAuthz{ + featureStore.Spec.AuthzConfig = &feastdevv1.AuthzConfig{ + OidcAuthz: &feastdevv1.OidcAuthz{ SecretRef: corev1.LocalObjectReference{ Name: "oidc-secret", }, @@ -231,10 +231,10 @@ var _ = Describe("Repo Config", func() { By("Having the all the db services") featureStore = minimalFeatureStore() - featureStore.Spec.Services = &feastdevv1alpha1.FeatureStoreServices{ - OfflineStore: &feastdevv1alpha1.OfflineStore{ - Persistence: &feastdevv1alpha1.OfflineStorePersistence{ - DBPersistence: &feastdevv1alpha1.OfflineStoreDBStorePersistence{ + featureStore.Spec.Services = &feastdevv1.FeatureStoreServices{ + OfflineStore: &feastdevv1.OfflineStore{ + Persistence: &feastdevv1.OfflineStorePersistence{ + DBPersistence: &feastdevv1.OfflineStoreDBStorePersistence{ Type: string(OfflineDBPersistenceSnowflakeConfigType), SecretRef: corev1.LocalObjectReference{ Name: "offline-test-secret", @@ -242,9 +242,9 @@ var _ = Describe("Repo Config", func() { }, }, }, - OnlineStore: &feastdevv1alpha1.OnlineStore{ - Persistence: &feastdevv1alpha1.OnlineStorePersistence{ - DBPersistence: &feastdevv1alpha1.OnlineStoreDBStorePersistence{ + OnlineStore: &feastdevv1.OnlineStore{ + Persistence: &feastdevv1.OnlineStorePersistence{ + DBPersistence: &feastdevv1.OnlineStoreDBStorePersistence{ Type: string(OnlineDBPersistenceSnowflakeConfigType), SecretRef: corev1.LocalObjectReference{ Name: "online-test-secret", @@ -252,10 +252,10 @@ var _ = Describe("Repo Config", func() { }, }, }, - Registry: &feastdevv1alpha1.Registry{ - Local: &feastdevv1alpha1.LocalRegistryConfig{ - Persistence: &feastdevv1alpha1.RegistryPersistence{ - DBPersistence: &feastdevv1alpha1.RegistryDBStorePersistence{ + Registry: &feastdevv1.Registry{ + Local: &feastdevv1.LocalRegistryConfig{ + Persistence: &feastdevv1.RegistryPersistence{ + DBPersistence: &feastdevv1.RegistryDBStorePersistence{ Type: string(RegistryDBPersistenceSnowflakeConfigType), SecretRef: corev1.LocalObjectReference{ Name: "registry-test-secret", @@ -297,8 +297,8 @@ var _ = Describe("Repo Config", func() { featureStore := minimalFeatureStore() By("Having invalid server oidc authorization") - featureStore.Spec.AuthzConfig = &feastdevv1alpha1.AuthzConfig{ - OidcAuthz: &feastdevv1alpha1.OidcAuthz{ + featureStore.Spec.AuthzConfig = &feastdevv1.AuthzConfig{ + OidcAuthz: &feastdevv1.OidcAuthz{ SecretRef: corev1.LocalObjectReference{ Name: "oidc-secret", }, @@ -324,8 +324,8 @@ var _ = Describe("Repo Config", func() { Expect(err).ToNot(HaveOccurred()) By("Having invalid client oidc authorization") - featureStore.Spec.AuthzConfig = &feastdevv1alpha1.AuthzConfig{ - OidcAuthz: &feastdevv1alpha1.OidcAuthz{ + featureStore.Spec.AuthzConfig = &feastdevv1.AuthzConfig{ + OidcAuthz: &feastdevv1.OidcAuthz{ SecretRef: corev1.LocalObjectReference{ Name: "oidc-secret", }, @@ -356,28 +356,28 @@ var _ = Describe("Repo Config", func() { var emptyOfflineStoreConfig = OfflineStoreConfig{} var emptyRegistryConfig = RegistryConfig{} -func minimalFeatureStore() *feastdevv1alpha1.FeatureStore { - return &feastdevv1alpha1.FeatureStore{ +func minimalFeatureStore() *feastdevv1.FeatureStore { + return &feastdevv1.FeatureStore{ ObjectMeta: metav1.ObjectMeta{Name: "test"}, - Spec: feastdevv1alpha1.FeatureStoreSpec{ + Spec: feastdevv1.FeatureStoreSpec{ FeastProject: projectName, }, } } -func minimalFeatureStoreWithAllServers() *feastdevv1alpha1.FeatureStore { +func minimalFeatureStoreWithAllServers() *feastdevv1.FeatureStore { feast := minimalFeatureStore() // onlineStore configured by default - feast.Spec.Services = &feastdevv1alpha1.FeatureStoreServices{ - OfflineStore: &feastdevv1alpha1.OfflineStore{ - Server: &feastdevv1alpha1.ServerConfigs{}, + feast.Spec.Services = &feastdevv1.FeatureStoreServices{ + OfflineStore: &feastdevv1.OfflineStore{ + Server: &feastdevv1.ServerConfigs{}, }, - Registry: &feastdevv1alpha1.Registry{ - Local: &feastdevv1alpha1.LocalRegistryConfig{ - Server: &feastdevv1alpha1.RegistryServerConfigs{}, + Registry: &feastdevv1.Registry{ + Local: &feastdevv1.LocalRegistryConfig{ + Server: &feastdevv1.RegistryServerConfigs{}, }, }, - UI: &feastdevv1alpha1.ServerConfigs{}, + UI: &feastdevv1.ServerConfigs{}, } return feast } @@ -464,50 +464,50 @@ var _ = Describe("TLS Certificate Path Configuration", func() { Context("in getClientRepoConfig", func() { It("should use individual service certificate paths when no custom CA bundle", func() { // Create a feature store with TLS enabled - featureStore := &feastdevv1alpha1.FeatureStore{ - Status: feastdevv1alpha1.FeatureStoreStatus{ - ServiceHostnames: feastdevv1alpha1.ServiceHostnames{ + featureStore := &feastdevv1.FeatureStore{ + Status: feastdevv1.FeatureStoreStatus{ + ServiceHostnames: feastdevv1.ServiceHostnames{ OfflineStore: "offline.example.com:443", OnlineStore: "online.example.com:443", Registry: "registry.example.com:443", }, - Applied: feastdevv1alpha1.FeatureStoreSpec{ - Services: &feastdevv1alpha1.FeatureStoreServices{ - OfflineStore: &feastdevv1alpha1.OfflineStore{ - Server: &feastdevv1alpha1.ServerConfigs{ - TLS: &feastdevv1alpha1.TlsConfigs{ + Applied: feastdevv1.FeatureStoreSpec{ + Services: &feastdevv1.FeatureStoreServices{ + OfflineStore: &feastdevv1.OfflineStore{ + Server: &feastdevv1.ServerConfigs{ + TLS: &feastdevv1.TlsConfigs{ SecretRef: &corev1.LocalObjectReference{Name: "offline-tls"}, - SecretKeyNames: feastdevv1alpha1.SecretKeyNames{ + SecretKeyNames: feastdevv1.SecretKeyNames{ TlsCrt: "tls.crt", }, }, }, }, - OnlineStore: &feastdevv1alpha1.OnlineStore{ - Server: &feastdevv1alpha1.ServerConfigs{ - TLS: &feastdevv1alpha1.TlsConfigs{ + OnlineStore: &feastdevv1.OnlineStore{ + Server: &feastdevv1.ServerConfigs{ + TLS: &feastdevv1.TlsConfigs{ SecretRef: &corev1.LocalObjectReference{Name: "online-tls"}, - SecretKeyNames: feastdevv1alpha1.SecretKeyNames{ + SecretKeyNames: feastdevv1.SecretKeyNames{ TlsCrt: "tls.crt", }, }, }, }, - UI: &feastdevv1alpha1.ServerConfigs{ - TLS: &feastdevv1alpha1.TlsConfigs{ + UI: &feastdevv1.ServerConfigs{ + TLS: &feastdevv1.TlsConfigs{ SecretRef: &corev1.LocalObjectReference{Name: "ui-tls"}, - SecretKeyNames: feastdevv1alpha1.SecretKeyNames{ + SecretKeyNames: feastdevv1.SecretKeyNames{ TlsCrt: "tls.crt", }, }, }, - Registry: &feastdevv1alpha1.Registry{ - Local: &feastdevv1alpha1.LocalRegistryConfig{ - Server: &feastdevv1alpha1.RegistryServerConfigs{ - ServerConfigs: feastdevv1alpha1.ServerConfigs{ - TLS: &feastdevv1alpha1.TlsConfigs{ + Registry: &feastdevv1.Registry{ + Local: &feastdevv1.LocalRegistryConfig{ + Server: &feastdevv1.RegistryServerConfigs{ + ServerConfigs: feastdevv1.ServerConfigs{ + TLS: &feastdevv1.TlsConfigs{ SecretRef: &corev1.LocalObjectReference{Name: "registry-tls"}, - SecretKeyNames: feastdevv1alpha1.SecretKeyNames{ + SecretKeyNames: feastdevv1.SecretKeyNames{ TlsCrt: "tls.crt", }, }, @@ -533,51 +533,51 @@ var _ = Describe("TLS Certificate Path Configuration", func() { It("should use custom CA bundle path when available", func() { // This test would require a full FeastServices setup with custom CA bundle // For now, we verify the function signature and basic behavior - featureStore := &feastdevv1alpha1.FeatureStore{ - Status: feastdevv1alpha1.FeatureStoreStatus{ - ServiceHostnames: feastdevv1alpha1.ServiceHostnames{ + featureStore := &feastdevv1.FeatureStore{ + Status: feastdevv1.FeatureStoreStatus{ + ServiceHostnames: feastdevv1.ServiceHostnames{ OfflineStore: "offline.example.com:443", OnlineStore: "online.example.com:443", Registry: "registry.example.com:443", UI: "ui.example.com:443", }, - Applied: feastdevv1alpha1.FeatureStoreSpec{ - Services: &feastdevv1alpha1.FeatureStoreServices{ - OfflineStore: &feastdevv1alpha1.OfflineStore{ - Server: &feastdevv1alpha1.ServerConfigs{ - TLS: &feastdevv1alpha1.TlsConfigs{ + Applied: feastdevv1.FeatureStoreSpec{ + Services: &feastdevv1.FeatureStoreServices{ + OfflineStore: &feastdevv1.OfflineStore{ + Server: &feastdevv1.ServerConfigs{ + TLS: &feastdevv1.TlsConfigs{ SecretRef: &corev1.LocalObjectReference{Name: "offline-tls"}, - SecretKeyNames: feastdevv1alpha1.SecretKeyNames{ + SecretKeyNames: feastdevv1.SecretKeyNames{ TlsCrt: "tls.crt", }, }, }, }, - OnlineStore: &feastdevv1alpha1.OnlineStore{ - Server: &feastdevv1alpha1.ServerConfigs{ - TLS: &feastdevv1alpha1.TlsConfigs{ + OnlineStore: &feastdevv1.OnlineStore{ + Server: &feastdevv1.ServerConfigs{ + TLS: &feastdevv1.TlsConfigs{ SecretRef: &corev1.LocalObjectReference{Name: "online-tls"}, - SecretKeyNames: feastdevv1alpha1.SecretKeyNames{ + SecretKeyNames: feastdevv1.SecretKeyNames{ TlsCrt: "tls.crt", }, }, }, }, - UI: &feastdevv1alpha1.ServerConfigs{ - TLS: &feastdevv1alpha1.TlsConfigs{ + UI: &feastdevv1.ServerConfigs{ + TLS: &feastdevv1.TlsConfigs{ SecretRef: &corev1.LocalObjectReference{Name: "ui-tls"}, - SecretKeyNames: feastdevv1alpha1.SecretKeyNames{ + SecretKeyNames: feastdevv1.SecretKeyNames{ TlsCrt: "tls.crt", }, }, }, - Registry: &feastdevv1alpha1.Registry{ - Local: &feastdevv1alpha1.LocalRegistryConfig{ - Server: &feastdevv1alpha1.RegistryServerConfigs{ - ServerConfigs: feastdevv1alpha1.ServerConfigs{ - TLS: &feastdevv1alpha1.TlsConfigs{ + Registry: &feastdevv1.Registry{ + Local: &feastdevv1.LocalRegistryConfig{ + Server: &feastdevv1.RegistryServerConfigs{ + ServerConfigs: feastdevv1.ServerConfigs{ + TLS: &feastdevv1.TlsConfigs{ SecretRef: &corev1.LocalObjectReference{Name: "registry-tls"}, - SecretKeyNames: feastdevv1alpha1.SecretKeyNames{ + SecretKeyNames: feastdevv1.SecretKeyNames{ TlsCrt: "tls.crt", }, }, diff --git a/infra/feast-operator/internal/controller/services/services.go b/infra/feast-operator/internal/controller/services/services.go index 8290420f7ff..39a48b1fe58 100644 --- a/infra/feast-operator/internal/controller/services/services.go +++ b/infra/feast-operator/internal/controller/services/services.go @@ -21,7 +21,7 @@ import ( "strconv" "strings" - feastdevv1alpha1 "github.com/feast-dev/feast/infra/feast-operator/api/v1alpha1" + feastdevv1 "github.com/feast-dev/feast/infra/feast-operator/api/v1" routev1 "github.com/openshift/api/route/v1" "github.com/feast-dev/feast/infra/feast-operator/internal/controller/handler" @@ -151,7 +151,7 @@ func (feast *FeastServices) Deploy() error { return nil } -func (feast *FeastServices) validateRegistryPersistence(registryPersistence *feastdevv1alpha1.RegistryPersistence) error { +func (feast *FeastServices) validateRegistryPersistence(registryPersistence *feastdevv1.RegistryPersistence) error { if registryPersistence != nil { dbPersistence := registryPersistence.DBPersistence @@ -172,7 +172,7 @@ func (feast *FeastServices) validateRegistryPersistence(registryPersistence *fea return nil } -func (feast *FeastServices) validateOnlineStorePersistence(onlinePersistence *feastdevv1alpha1.OnlineStorePersistence) error { +func (feast *FeastServices) validateOnlineStorePersistence(onlinePersistence *feastdevv1.OnlineStorePersistence) error { if onlinePersistence != nil { dbPersistence := onlinePersistence.DBPersistence @@ -193,7 +193,7 @@ func (feast *FeastServices) validateOnlineStorePersistence(onlinePersistence *fe return nil } -func (feast *FeastServices) validateOfflineStorePersistence(offlinePersistence *feastdevv1alpha1.OfflineStorePersistence) error { +func (feast *FeastServices) validateOfflineStorePersistence(offlinePersistence *feastdevv1.OfflineStorePersistence) error { if offlinePersistence != nil { filePersistence := offlinePersistence.FilePersistence dbPersistence := offlinePersistence.DBPersistence @@ -359,7 +359,7 @@ func (feast *FeastServices) createRoute(feastType FeastServiceType) error { return nil } -func (feast *FeastServices) createPVC(pvcCreate *feastdevv1alpha1.PvcCreate, feastType FeastServiceType) error { +func (feast *FeastServices) createPVC(pvcCreate *feastdevv1.PvcCreate, feastType FeastServiceType) error { logger := log.FromContext(feast.Handler.Context) pvc, err := feast.createNewPVC(pvcCreate, feastType) if err != nil { @@ -501,7 +501,7 @@ func (feast *FeastServices) setContainer(containers *[]corev1.Container, feastTy } } -func getContainer(name, workingDir string, cmd []string, containerConfigs feastdevv1alpha1.ContainerConfigs, fsYamlB64 string) *corev1.Container { +func getContainer(name, workingDir string, cmd []string, containerConfigs feastdevv1.ContainerConfigs, fsYamlB64 string) *corev1.Container { container := &corev1.Container{ Name: name, Command: cmd, @@ -779,7 +779,7 @@ func (feast *FeastServices) setServiceAccount(sa *corev1.ServiceAccount) error { return controllerutil.SetControllerReference(feast.Handler.FeatureStore, sa, feast.Handler.Scheme) } -func (feast *FeastServices) createNewPVC(pvcCreate *feastdevv1alpha1.PvcCreate, feastType FeastServiceType) (*corev1.PersistentVolumeClaim, error) { +func (feast *FeastServices) createNewPVC(pvcCreate *feastdevv1.PvcCreate, feastType FeastServiceType) (*corev1.PersistentVolumeClaim, error) { pvc := feast.initPVC(feastType) pvc.Spec = corev1.PersistentVolumeClaimSpec{ @@ -792,7 +792,7 @@ func (feast *FeastServices) createNewPVC(pvcCreate *feastdevv1alpha1.PvcCreate, return pvc, controllerutil.SetControllerReference(feast.Handler.FeatureStore, pvc, feast.Handler.Scheme) } -func (feast *FeastServices) getServerConfigs(feastType FeastServiceType) *feastdevv1alpha1.ServerConfigs { +func (feast *FeastServices) getServerConfigs(feastType FeastServiceType) *feastdevv1.ServerConfigs { appliedServices := feast.Handler.FeatureStore.Status.Applied.Services switch feastType { case OfflineFeastType: @@ -904,11 +904,11 @@ func (feast *FeastServices) GetDeployment() (appsv1.Deployment, error) { } // GetFeastServiceName returns the feast service object name based on service type -func GetFeastServiceName(featureStore *feastdevv1alpha1.FeatureStore, feastType FeastServiceType) string { +func GetFeastServiceName(featureStore *feastdevv1.FeatureStore, feastType FeastServiceType) string { return GetFeastName(featureStore) + "-" + string(feastType) } -func GetFeastName(featureStore *feastdevv1alpha1.FeatureStore) string { +func GetFeastName(featureStore *feastdevv1.FeatureStore) string { return handler.FeastPrefix + featureStore.Name } @@ -925,7 +925,7 @@ func (feast *FeastServices) getLabels() map[string]string { } func (feast *FeastServices) setServiceHostnames() error { - feast.Handler.FeatureStore.Status.ServiceHostnames = feastdevv1alpha1.ServiceHostnames{} + feast.Handler.FeatureStore.Status.ServiceHostnames = feastdevv1.ServiceHostnames{} domain := svcDomain + ":" if feast.isOfflineServer() { objMeta := feast.initFeastSvc(OfflineFeastType) @@ -984,7 +984,7 @@ func (feast *FeastServices) setRemoteRegistryURL() error { // referenced/remote registry must use the local registry server option and be in a 'Ready' state. if remoteFeast != nil && remoteFeast.isRegistryServer() && - apimeta.IsStatusConditionTrue(remoteFeast.Handler.FeatureStore.Status.Conditions, feastdevv1alpha1.RegistryReadyType) && + apimeta.IsStatusConditionTrue(remoteFeast.Handler.FeatureStore.Status.Conditions, feastdevv1.RegistryReadyType) && len(remoteFeast.Handler.FeatureStore.Status.ServiceHostnames.Registry) > 0 { // Check if gRPC server is enabled if !remoteFeast.isRegistryGrpcEnabled() { @@ -1006,7 +1006,7 @@ func (feast *FeastServices) getRemoteRegistryFeastHandler() (*FeastServices, err if nsName == crNsName { return nil, errors.New("FeatureStore '" + crNsName.Name + "' can't reference itself in `spec.services.registry.remote.feastRef`") } - remoteFeastObj := &feastdevv1alpha1.FeatureStore{} + remoteFeastObj := &feastdevv1.FeatureStore{} if err := feast.Handler.Client.Get(feast.Handler.Context, nsName, remoteFeastObj); err != nil { if apierrors.IsNotFound(err) { return nil, errors.New("Referenced FeatureStore '" + feastRemoteRef.Name + "' was not found") @@ -1131,7 +1131,7 @@ func (feast *FeastServices) initRoute(feastType FeastServiceType) *routev1.Route return route } -func applyCtrConfigs(container *corev1.Container, containerConfigs feastdevv1alpha1.ContainerConfigs) { +func applyCtrConfigs(container *corev1.Container, containerConfigs feastdevv1.ContainerConfigs) { if containerConfigs.DefaultCtrConfigs.Image != nil { container.Image = *containerConfigs.DefaultCtrConfigs.Image } @@ -1158,7 +1158,7 @@ func (feast *FeastServices) mountPvcConfigs(podSpec *corev1.PodSpec) { } } -func (feast *FeastServices) mountPvcConfig(podSpec *corev1.PodSpec, pvcConfig *feastdevv1alpha1.PvcConfig, feastType FeastServiceType) { +func (feast *FeastServices) mountPvcConfig(podSpec *corev1.PodSpec, pvcConfig *feastdevv1.PvcConfig, feastType FeastServiceType) { if podSpec != nil && pvcConfig != nil { volName := feast.initPVC(feastType).Name pvcName := volName @@ -1229,21 +1229,21 @@ func mountEmptyDirVolume(podSpec *corev1.PodSpec) { } } -func getTargetPort(feastType FeastServiceType, tls *feastdevv1alpha1.TlsConfigs) int32 { +func getTargetPort(feastType FeastServiceType, tls *feastdevv1.TlsConfigs) int32 { if tls.IsTLS() { return FeastServiceConstants[feastType].TargetHttpsPort } return FeastServiceConstants[feastType].TargetHttpPort } -func getTargetRestPort(feastType FeastServiceType, tls *feastdevv1alpha1.TlsConfigs) int32 { +func getTargetRestPort(feastType FeastServiceType, tls *feastdevv1.TlsConfigs) int32 { if tls.IsTLS() { return FeastServiceConstants[feastType].TargetRestHttpsPort } return FeastServiceConstants[feastType].TargetRestHttpPort } -func (feast *FeastServices) getProbeHandler(feastType FeastServiceType, tls *feastdevv1alpha1.TlsConfigs) corev1.ProbeHandler { +func (feast *FeastServices) getProbeHandler(feastType FeastServiceType, tls *feastdevv1.TlsConfigs) corev1.ProbeHandler { targetPort := getTargetPort(feastType, tls) if feastType == RegistryFeastType { diff --git a/infra/feast-operator/internal/controller/services/services_test.go b/infra/feast-operator/internal/controller/services/services_test.go index c7d2eade3dc..e9634f7f07d 100644 --- a/infra/feast-operator/internal/controller/services/services_test.go +++ b/infra/feast-operator/internal/controller/services/services_test.go @@ -19,7 +19,7 @@ package services import ( "context" - feastdevv1alpha1 "github.com/feast-dev/feast/infra/feast-operator/api/v1alpha1" + feastdevv1 "github.com/feast-dev/feast/infra/feast-operator/api/v1" "github.com/feast-dev/feast/infra/feast-operator/internal/controller/handler" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" @@ -34,12 +34,12 @@ func ptr[T any](v T) *T { } func (feast *FeastServices) refreshFeatureStore(ctx context.Context, key types.NamespacedName) { - fs := &feastdevv1alpha1.FeatureStore{} + fs := &feastdevv1.FeatureStore{} Expect(k8sClient.Get(ctx, key, fs)).To(Succeed()) feast.Handler.FeatureStore = fs } -func applySpecToStatus(fs *feastdevv1alpha1.FeatureStore) { +func applySpecToStatus(fs *feastdevv1.FeatureStore) { fs.Status.Applied.Services = fs.Spec.Services.DeepCopy() fs.Status.Applied.FeastProject = fs.Spec.FeastProject Expect(k8sClient.Status().Update(context.Background(), fs)).To(Succeed()) @@ -47,7 +47,7 @@ func applySpecToStatus(fs *feastdevv1alpha1.FeatureStore) { var _ = Describe("Registry Service", func() { var ( - featureStore *feastdevv1alpha1.FeatureStore + featureStore *feastdevv1.FeatureStore feast *FeastServices typeNamespacedName types.NamespacedName ctx context.Context @@ -69,20 +69,20 @@ var _ = Describe("Registry Service", func() { Namespace: "default", } - featureStore = &feastdevv1alpha1.FeatureStore{ + featureStore = &feastdevv1.FeatureStore{ ObjectMeta: metav1.ObjectMeta{ Name: typeNamespacedName.Name, Namespace: typeNamespacedName.Namespace, }, - Spec: feastdevv1alpha1.FeatureStoreSpec{ + Spec: feastdevv1.FeatureStoreSpec{ FeastProject: "testproject", - Services: &feastdevv1alpha1.FeatureStoreServices{ - Registry: &feastdevv1alpha1.Registry{ - Local: &feastdevv1alpha1.LocalRegistryConfig{ - Server: &feastdevv1alpha1.RegistryServerConfigs{ - ServerConfigs: feastdevv1alpha1.ServerConfigs{ - ContainerConfigs: feastdevv1alpha1.ContainerConfigs{ - DefaultCtrConfigs: feastdevv1alpha1.DefaultCtrConfigs{ + Services: &feastdevv1.FeatureStoreServices{ + Registry: &feastdevv1.Registry{ + Local: &feastdevv1.LocalRegistryConfig{ + Server: &feastdevv1.RegistryServerConfigs{ + ServerConfigs: feastdevv1.ServerConfigs{ + ContainerConfigs: feastdevv1.ContainerConfigs{ + DefaultCtrConfigs: feastdevv1.DefaultCtrConfigs{ Image: ptr("test-image"), }, }, @@ -244,13 +244,13 @@ var _ = Describe("Registry Service", func() { "node-type": "online", "zone": "us-west-1a", } - featureStore.Spec.Services.OnlineStore = &feastdevv1alpha1.OnlineStore{ - Server: &feastdevv1alpha1.ServerConfigs{ - ContainerConfigs: feastdevv1alpha1.ContainerConfigs{ - DefaultCtrConfigs: feastdevv1alpha1.DefaultCtrConfigs{ + featureStore.Spec.Services.OnlineStore = &feastdevv1.OnlineStore{ + Server: &feastdevv1.ServerConfigs{ + ContainerConfigs: feastdevv1.ContainerConfigs{ + DefaultCtrConfigs: feastdevv1.DefaultCtrConfigs{ Image: ptr("test-image"), }, - OptionalCtrConfigs: feastdevv1alpha1.OptionalCtrConfigs{ + OptionalCtrConfigs: feastdevv1.OptionalCtrConfigs{ NodeSelector: &onlineNodeSelector, }, }, @@ -281,12 +281,12 @@ var _ = Describe("Registry Service", func() { uiNodeSelector := map[string]string{ "node-type": "ui", } - featureStore.Spec.Services.UI = &feastdevv1alpha1.ServerConfigs{ - ContainerConfigs: feastdevv1alpha1.ContainerConfigs{ - DefaultCtrConfigs: feastdevv1alpha1.DefaultCtrConfigs{ + featureStore.Spec.Services.UI = &feastdevv1.ServerConfigs{ + ContainerConfigs: feastdevv1.ContainerConfigs{ + DefaultCtrConfigs: feastdevv1.DefaultCtrConfigs{ Image: ptr("test-image"), }, - OptionalCtrConfigs: feastdevv1alpha1.OptionalCtrConfigs{ + OptionalCtrConfigs: feastdevv1.OptionalCtrConfigs{ NodeSelector: &uiNodeSelector, }, }, @@ -328,13 +328,13 @@ var _ = Describe("Registry Service", func() { onlineNodeSelector := map[string]string{ "node-type": "online", } - featureStore.Spec.Services.OnlineStore = &feastdevv1alpha1.OnlineStore{ - Server: &feastdevv1alpha1.ServerConfigs{ - ContainerConfigs: feastdevv1alpha1.ContainerConfigs{ - DefaultCtrConfigs: feastdevv1alpha1.DefaultCtrConfigs{ + featureStore.Spec.Services.OnlineStore = &feastdevv1.OnlineStore{ + Server: &feastdevv1.ServerConfigs{ + ContainerConfigs: feastdevv1.ContainerConfigs{ + DefaultCtrConfigs: feastdevv1.DefaultCtrConfigs{ Image: ptr("test-image"), }, - OptionalCtrConfigs: feastdevv1alpha1.OptionalCtrConfigs{ + OptionalCtrConfigs: feastdevv1.OptionalCtrConfigs{ NodeSelector: &onlineNodeSelector, }, }, @@ -346,12 +346,12 @@ var _ = Describe("Registry Service", func() { "node-type": "ui", "zone": "us-east-1", } - featureStore.Spec.Services.UI = &feastdevv1alpha1.ServerConfigs{ - ContainerConfigs: feastdevv1alpha1.ContainerConfigs{ - DefaultCtrConfigs: feastdevv1alpha1.DefaultCtrConfigs{ + featureStore.Spec.Services.UI = &feastdevv1.ServerConfigs{ + ContainerConfigs: feastdevv1.ContainerConfigs{ + DefaultCtrConfigs: feastdevv1.DefaultCtrConfigs{ Image: ptr("test-image"), }, - OptionalCtrConfigs: feastdevv1alpha1.OptionalCtrConfigs{ + OptionalCtrConfigs: feastdevv1.OptionalCtrConfigs{ NodeSelector: &uiNodeSelector, }, }, @@ -376,8 +376,8 @@ var _ = Describe("Registry Service", func() { }) It("should enable metrics on the online service when configured", func() { - featureStore.Spec.Services.OnlineStore = &feastdevv1alpha1.OnlineStore{ - Server: &feastdevv1alpha1.ServerConfigs{Metrics: ptr(true)}, + featureStore.Spec.Services.OnlineStore = &feastdevv1.OnlineStore{ + Server: &feastdevv1.ServerConfigs{Metrics: ptr(true)}, } Expect(k8sClient.Update(ctx, featureStore)).To(Succeed()) diff --git a/infra/feast-operator/internal/controller/services/services_types.go b/infra/feast-operator/internal/controller/services/services_types.go index b0f99756fa7..5997307ab1c 100644 --- a/infra/feast-operator/internal/controller/services/services_types.go +++ b/infra/feast-operator/internal/controller/services/services_types.go @@ -18,7 +18,7 @@ package services import ( "github.com/feast-dev/feast/infra/feast-operator/api/feastversion" - feastdevv1alpha1 "github.com/feast-dev/feast/infra/feast-operator/api/v1alpha1" + feastdevv1 "github.com/feast-dev/feast/infra/feast-operator/api/v1" handler "github.com/feast-dev/feast/infra/feast-operator/internal/controller/handler" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -99,8 +99,8 @@ var ( DefaultImage = "quay.io/feastdev/feature-server:" + feastversion.FeastVersion DefaultCronJobImage = "quay.io/openshift/origin-cli:4.17" DefaultPVCAccessModes = []corev1.PersistentVolumeAccessMode{corev1.ReadWriteOnce} - NameLabelKey = feastdevv1alpha1.GroupVersion.Group + "/name" - ServiceTypeLabelKey = feastdevv1alpha1.GroupVersion.Group + "/service-type" + NameLabelKey = feastdevv1.GroupVersion.Group + "/name" + ServiceTypeLabelKey = feastdevv1.GroupVersion.Group + "/service-type" FeastServiceConstants = map[FeastServiceType]deploymentSettings{ OfflineFeastType: { @@ -130,80 +130,80 @@ var ( FeastServiceConditions = map[FeastServiceType]map[metav1.ConditionStatus]metav1.Condition{ OfflineFeastType: { metav1.ConditionTrue: { - Type: feastdevv1alpha1.OfflineStoreReadyType, + Type: feastdevv1.OfflineStoreReadyType, Status: metav1.ConditionTrue, - Reason: feastdevv1alpha1.ReadyReason, - Message: feastdevv1alpha1.OfflineStoreReadyMessage, + Reason: feastdevv1.ReadyReason, + Message: feastdevv1.OfflineStoreReadyMessage, }, metav1.ConditionFalse: { - Type: feastdevv1alpha1.OfflineStoreReadyType, + Type: feastdevv1.OfflineStoreReadyType, Status: metav1.ConditionFalse, - Reason: feastdevv1alpha1.OfflineStoreFailedReason, + Reason: feastdevv1.OfflineStoreFailedReason, }, }, OnlineFeastType: { metav1.ConditionTrue: { - Type: feastdevv1alpha1.OnlineStoreReadyType, + Type: feastdevv1.OnlineStoreReadyType, Status: metav1.ConditionTrue, - Reason: feastdevv1alpha1.ReadyReason, - Message: feastdevv1alpha1.OnlineStoreReadyMessage, + Reason: feastdevv1.ReadyReason, + Message: feastdevv1.OnlineStoreReadyMessage, }, metav1.ConditionFalse: { - Type: feastdevv1alpha1.OnlineStoreReadyType, + Type: feastdevv1.OnlineStoreReadyType, Status: metav1.ConditionFalse, - Reason: feastdevv1alpha1.OnlineStoreFailedReason, + Reason: feastdevv1.OnlineStoreFailedReason, }, }, RegistryFeastType: { metav1.ConditionTrue: { - Type: feastdevv1alpha1.RegistryReadyType, + Type: feastdevv1.RegistryReadyType, Status: metav1.ConditionTrue, - Reason: feastdevv1alpha1.ReadyReason, - Message: feastdevv1alpha1.RegistryReadyMessage, + Reason: feastdevv1.ReadyReason, + Message: feastdevv1.RegistryReadyMessage, }, metav1.ConditionFalse: { - Type: feastdevv1alpha1.RegistryReadyType, + Type: feastdevv1.RegistryReadyType, Status: metav1.ConditionFalse, - Reason: feastdevv1alpha1.RegistryFailedReason, + Reason: feastdevv1.RegistryFailedReason, }, }, UIFeastType: { metav1.ConditionTrue: { - Type: feastdevv1alpha1.UIReadyType, + Type: feastdevv1.UIReadyType, Status: metav1.ConditionTrue, - Reason: feastdevv1alpha1.ReadyReason, - Message: feastdevv1alpha1.UIReadyMessage, + Reason: feastdevv1.ReadyReason, + Message: feastdevv1.UIReadyMessage, }, metav1.ConditionFalse: { - Type: feastdevv1alpha1.UIReadyType, + Type: feastdevv1.UIReadyType, Status: metav1.ConditionFalse, - Reason: feastdevv1alpha1.UIFailedReason, + Reason: feastdevv1.UIFailedReason, }, }, ClientFeastType: { metav1.ConditionTrue: { - Type: feastdevv1alpha1.ClientReadyType, + Type: feastdevv1.ClientReadyType, Status: metav1.ConditionTrue, - Reason: feastdevv1alpha1.ReadyReason, - Message: feastdevv1alpha1.ClientReadyMessage, + Reason: feastdevv1.ReadyReason, + Message: feastdevv1.ClientReadyMessage, }, metav1.ConditionFalse: { - Type: feastdevv1alpha1.ClientReadyType, + Type: feastdevv1.ClientReadyType, Status: metav1.ConditionFalse, - Reason: feastdevv1alpha1.ClientFailedReason, + Reason: feastdevv1.ClientFailedReason, }, }, CronJobFeastType: { metav1.ConditionTrue: { - Type: feastdevv1alpha1.CronJobReadyType, + Type: feastdevv1.CronJobReadyType, Status: metav1.ConditionTrue, - Reason: feastdevv1alpha1.ReadyReason, - Message: feastdevv1alpha1.CronJobReadyMessage, + Reason: feastdevv1.ReadyReason, + Message: feastdevv1.CronJobReadyMessage, }, metav1.ConditionFalse: { - Type: feastdevv1alpha1.CronJobReadyType, + Type: feastdevv1.CronJobReadyType, Status: metav1.ConditionFalse, - Reason: feastdevv1alpha1.CronJobFailedReason, + Reason: feastdevv1.CronJobFailedReason, }, }, } diff --git a/infra/feast-operator/internal/controller/services/suite_test.go b/infra/feast-operator/internal/controller/services/suite_test.go index 5e922bc7e4a..a3d5bb3dae8 100644 --- a/infra/feast-operator/internal/controller/services/suite_test.go +++ b/infra/feast-operator/internal/controller/services/suite_test.go @@ -31,7 +31,7 @@ import ( logf "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/log/zap" - feastdevv1alpha1 "github.com/feast-dev/feast/infra/feast-operator/api/v1alpha1" + feastdevv1 "github.com/feast-dev/feast/infra/feast-operator/api/v1" // +kubebuilder:scaffold:imports ) @@ -68,7 +68,7 @@ var _ = BeforeSuite(func() { Expect(err).NotTo(HaveOccurred()) Expect(cfg).NotTo(BeNil()) - err = feastdevv1alpha1.AddToScheme(scheme.Scheme) + err = feastdevv1.AddToScheme(scheme.Scheme) Expect(err).NotTo(HaveOccurred()) // +kubebuilder:scaffold:scheme diff --git a/infra/feast-operator/internal/controller/services/tls.go b/infra/feast-operator/internal/controller/services/tls.go index 4b209e64e8c..4a50697c5a1 100644 --- a/infra/feast-operator/internal/controller/services/tls.go +++ b/infra/feast-operator/internal/controller/services/tls.go @@ -23,7 +23,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/log" - feastdevv1alpha1 "github.com/feast-dev/feast/infra/feast-operator/api/v1alpha1" + feastdevv1 "github.com/feast-dev/feast/infra/feast-operator/api/v1" corev1 "k8s.io/api/core/v1" ) @@ -50,21 +50,21 @@ func (feast *FeastServices) setTlsDefaults() error { func (feast *FeastServices) setOpenshiftTls() error { appliedServices := feast.Handler.FeatureStore.Status.Applied.Services if feast.offlineOpenshiftTls() { - appliedServices.OfflineStore.Server.TLS = &feastdevv1alpha1.TlsConfigs{ + appliedServices.OfflineStore.Server.TLS = &feastdevv1.TlsConfigs{ SecretRef: &corev1.LocalObjectReference{ Name: feast.initFeastSvc(OfflineFeastType).Name + tlsNameSuffix, }, } } if feast.onlineOpenshiftTls() { - appliedServices.OnlineStore.Server.TLS = &feastdevv1alpha1.TlsConfigs{ + appliedServices.OnlineStore.Server.TLS = &feastdevv1.TlsConfigs{ SecretRef: &corev1.LocalObjectReference{ Name: feast.initFeastSvc(OnlineFeastType).Name + tlsNameSuffix, }, } } if feast.uiOpenshiftTls() { - appliedServices.UI.TLS = &feastdevv1alpha1.TlsConfigs{ + appliedServices.UI.TLS = &feastdevv1.TlsConfigs{ SecretRef: &corev1.LocalObjectReference{ Name: feast.initFeastSvc(UIFeastType).Name + tlsNameSuffix, }, @@ -77,21 +77,21 @@ func (feast *FeastServices) setOpenshiftTls() error { if grpcEnabled && restEnabled { // Both services enabled: Use gRPC service name as primary certificate // The certificate will include both hostnames as SANs via service annotations - appliedServices.Registry.Local.Server.TLS = &feastdevv1alpha1.TlsConfigs{ + appliedServices.Registry.Local.Server.TLS = &feastdevv1.TlsConfigs{ SecretRef: &corev1.LocalObjectReference{ Name: feast.initFeastSvc(RegistryFeastType).Name + tlsNameSuffix, }, } } else if grpcEnabled && !restEnabled { // Only gRPC enabled: Use gRPC service name - appliedServices.Registry.Local.Server.TLS = &feastdevv1alpha1.TlsConfigs{ + appliedServices.Registry.Local.Server.TLS = &feastdevv1.TlsConfigs{ SecretRef: &corev1.LocalObjectReference{ Name: feast.initFeastSvc(RegistryFeastType).Name + tlsNameSuffix, }, } } else if !grpcEnabled && restEnabled { // Only REST enabled: Use REST service name - appliedServices.Registry.Local.Server.TLS = &feastdevv1alpha1.TlsConfigs{ + appliedServices.Registry.Local.Server.TLS = &feastdevv1.TlsConfigs{ SecretRef: &corev1.LocalObjectReference{ Name: feast.initFeastRestSvc(RegistryFeastType).Name + tlsNameSuffix, }, @@ -100,7 +100,7 @@ func (feast *FeastServices) setOpenshiftTls() error { } else if remote, err := feast.remoteRegistryOpenshiftTls(); remote { // if the remote registry reference is using openshift's service serving certificates, we can use the injected service CA bundle configMap if appliedServices.Registry.Remote.TLS == nil { - appliedServices.Registry.Remote.TLS = &feastdevv1alpha1.TlsRemoteRegistryConfigs{ + appliedServices.Registry.Remote.TLS = &feastdevv1.TlsRemoteRegistryConfigs{ ConfigMapRef: corev1.LocalObjectReference{ Name: feast.initCaConfigMap().Name, }, @@ -135,7 +135,7 @@ func (feast *FeastServices) isOpenShiftTls(feastType FeastServiceType) (isOpenSh return } -func (feast *FeastServices) getTlsConfigs(feastType FeastServiceType) *feastdevv1alpha1.TlsConfigs { +func (feast *FeastServices) getTlsConfigs(feastType FeastServiceType) *feastdevv1.TlsConfigs { if serviceConfigs := feast.getServerConfigs(feastType); serviceConfigs != nil { return serviceConfigs.TLS } @@ -234,7 +234,7 @@ func (feast *FeastServices) mountTlsConfig(feastType FeastServiceType, podSpec * } } -func mountTlsRemoteRegistryConfig(podSpec *corev1.PodSpec, tls *feastdevv1alpha1.TlsRemoteRegistryConfigs) { +func mountTlsRemoteRegistryConfig(podSpec *corev1.PodSpec, tls *feastdevv1.TlsRemoteRegistryConfigs) { if tls != nil { volName := string(RegistryFeastType) + tlsNameSuffix podSpec.Volumes = append(podSpec.Volumes, corev1.Volume{ @@ -312,14 +312,14 @@ func (feast *FeastServices) GetCustomCertificatesBundle() CustomCertificatesBund return customCertificatesBundle } -func getPortStr(tls *feastdevv1alpha1.TlsConfigs) string { +func getPortStr(tls *feastdevv1.TlsConfigs) string { if tls.IsTLS() { return strconv.Itoa(HttpsPort) } return strconv.Itoa(HttpPort) } -func tlsDefaults(tls *feastdevv1alpha1.TlsConfigs) { +func tlsDefaults(tls *feastdevv1.TlsConfigs) { if tls.IsTLS() { if len(tls.SecretKeyNames.TlsCrt) == 0 { tls.SecretKeyNames.TlsCrt = "tls.crt" @@ -330,11 +330,11 @@ func tlsDefaults(tls *feastdevv1alpha1.TlsConfigs) { } } -func localRegistryTls(featureStore *feastdevv1alpha1.FeatureStore) bool { +func localRegistryTls(featureStore *feastdevv1.FeatureStore) bool { return IsRegistryServer(featureStore) && featureStore.Status.Applied.Services.Registry.Local.Server.TLS.IsTLS() } -func remoteRegistryTls(featureStore *feastdevv1alpha1.FeatureStore) bool { +func remoteRegistryTls(featureStore *feastdevv1.FeatureStore) bool { return isRemoteRegistry(featureStore) && featureStore.Status.Applied.Services.Registry.Remote.TLS != nil } diff --git a/infra/feast-operator/internal/controller/services/tls_test.go b/infra/feast-operator/internal/controller/services/tls_test.go index aa29fe97548..e5299d79119 100644 --- a/infra/feast-operator/internal/controller/services/tls_test.go +++ b/infra/feast-operator/internal/controller/services/tls_test.go @@ -19,7 +19,7 @@ package services import ( "context" - feastdevv1alpha1 "github.com/feast-dev/feast/infra/feast-operator/api/v1alpha1" + feastdevv1 "github.com/feast-dev/feast/infra/feast-operator/api/v1" "github.com/feast-dev/feast/infra/feast-operator/internal/controller/handler" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" @@ -34,9 +34,9 @@ var _ = Describe("TLS Config", func() { Context("When reconciling a FeatureStore", func() { scheme := runtime.NewScheme() utilruntime.Must(clientgoscheme.AddToScheme(scheme)) - utilruntime.Must(feastdevv1alpha1.AddToScheme(scheme)) + utilruntime.Must(feastdevv1.AddToScheme(scheme)) - secretKeyNames := feastdevv1alpha1.SecretKeyNames{ + secretKeyNames := feastdevv1.SecretKeyNames{ TlsCrt: "tls.crt", TlsKey: "tls.key", } @@ -53,11 +53,11 @@ var _ = Describe("TLS Config", func() { FeatureStore: minimalFeatureStore(), }, } - feast.Handler.FeatureStore.Spec.Services = &feastdevv1alpha1.FeatureStoreServices{ - Registry: &feastdevv1alpha1.Registry{ - Local: &feastdevv1alpha1.LocalRegistryConfig{ - Server: &feastdevv1alpha1.RegistryServerConfigs{ - ServerConfigs: feastdevv1alpha1.ServerConfigs{}, + feast.Handler.FeatureStore.Spec.Services = &feastdevv1.FeatureStoreServices{ + Registry: &feastdevv1.Registry{ + Local: &feastdevv1.LocalRegistryConfig{ + Server: &feastdevv1.RegistryServerConfigs{ + ServerConfigs: feastdevv1.ServerConfigs{}, }, }, }, @@ -84,11 +84,11 @@ var _ = Describe("TLS Config", func() { // registry service w/ openshift tls testSetIsOpenShift() feast.Handler.FeatureStore = minimalFeatureStore() - feast.Handler.FeatureStore.Spec.Services = &feastdevv1alpha1.FeatureStoreServices{ - Registry: &feastdevv1alpha1.Registry{ - Local: &feastdevv1alpha1.LocalRegistryConfig{ - Server: &feastdevv1alpha1.RegistryServerConfigs{ - ServerConfigs: feastdevv1alpha1.ServerConfigs{}, + feast.Handler.FeatureStore.Spec.Services = &feastdevv1.FeatureStoreServices{ + Registry: &feastdevv1.Registry{ + Local: &feastdevv1.LocalRegistryConfig{ + Server: &feastdevv1.RegistryServerConfigs{ + ServerConfigs: feastdevv1.ServerConfigs{}, }, }, }, @@ -183,22 +183,22 @@ var _ = Describe("TLS Config", func() { // registry service w/ tls and in an openshift cluster feast.Handler.FeatureStore = minimalFeatureStore() - feast.Handler.FeatureStore.Spec.Services = &feastdevv1alpha1.FeatureStoreServices{ - OnlineStore: &feastdevv1alpha1.OnlineStore{ - Server: &feastdevv1alpha1.ServerConfigs{ - TLS: &feastdevv1alpha1.TlsConfigs{}, + feast.Handler.FeatureStore.Spec.Services = &feastdevv1.FeatureStoreServices{ + OnlineStore: &feastdevv1.OnlineStore{ + Server: &feastdevv1.ServerConfigs{ + TLS: &feastdevv1.TlsConfigs{}, }, }, - UI: &feastdevv1alpha1.ServerConfigs{ - TLS: &feastdevv1alpha1.TlsConfigs{}, + UI: &feastdevv1.ServerConfigs{ + TLS: &feastdevv1.TlsConfigs{}, }, - Registry: &feastdevv1alpha1.Registry{ - Local: &feastdevv1alpha1.LocalRegistryConfig{ - Server: &feastdevv1alpha1.RegistryServerConfigs{ - ServerConfigs: feastdevv1alpha1.ServerConfigs{ - TLS: &feastdevv1alpha1.TlsConfigs{ + Registry: &feastdevv1.Registry{ + Local: &feastdevv1.LocalRegistryConfig{ + Server: &feastdevv1.RegistryServerConfigs{ + ServerConfigs: feastdevv1.ServerConfigs{ + TLS: &feastdevv1.TlsConfigs{ SecretRef: &corev1.LocalObjectReference{}, - SecretKeyNames: feastdevv1alpha1.SecretKeyNames{ + SecretKeyNames: feastdevv1.SecretKeyNames{ TlsCrt: "test.crt", }, }, @@ -238,21 +238,21 @@ var _ = Describe("TLS Config", func() { // all services w/ tls and in an openshift cluster feast.Handler.FeatureStore = minimalFeatureStoreWithAllServers() disable := true - feast.Handler.FeatureStore.Spec.Services.OnlineStore = &feastdevv1alpha1.OnlineStore{ - Server: &feastdevv1alpha1.ServerConfigs{ - TLS: &feastdevv1alpha1.TlsConfigs{ + feast.Handler.FeatureStore.Spec.Services.OnlineStore = &feastdevv1.OnlineStore{ + Server: &feastdevv1.ServerConfigs{ + TLS: &feastdevv1.TlsConfigs{ Disable: &disable, }, }, } - feast.Handler.FeatureStore.Spec.Services.UI.TLS = &feastdevv1alpha1.TlsConfigs{ + feast.Handler.FeatureStore.Spec.Services.UI.TLS = &feastdevv1.TlsConfigs{ Disable: &disable, } - feast.Handler.FeatureStore.Spec.Services.Registry = &feastdevv1alpha1.Registry{ - Local: &feastdevv1alpha1.LocalRegistryConfig{ - Server: &feastdevv1alpha1.RegistryServerConfigs{ - ServerConfigs: feastdevv1alpha1.ServerConfigs{ - TLS: &feastdevv1alpha1.TlsConfigs{ + feast.Handler.FeatureStore.Spec.Services.Registry = &feastdevv1.Registry{ + Local: &feastdevv1.LocalRegistryConfig{ + Server: &feastdevv1.RegistryServerConfigs{ + ServerConfigs: feastdevv1.ServerConfigs{ + TLS: &feastdevv1.TlsConfigs{ Disable: &disable, }, }, @@ -340,11 +340,11 @@ var _ = Describe("TLS Config", func() { feast.Handler.FeatureStore = minimalFeatureStore() restEnabled := true grpcEnabled := false - feast.Handler.FeatureStore.Spec.Services = &feastdevv1alpha1.FeatureStoreServices{ - Registry: &feastdevv1alpha1.Registry{ - Local: &feastdevv1alpha1.LocalRegistryConfig{ - Server: &feastdevv1alpha1.RegistryServerConfigs{ - ServerConfigs: feastdevv1alpha1.ServerConfigs{}, + feast.Handler.FeatureStore.Spec.Services = &feastdevv1.FeatureStoreServices{ + Registry: &feastdevv1.Registry{ + Local: &feastdevv1.LocalRegistryConfig{ + Server: &feastdevv1.RegistryServerConfigs{ + ServerConfigs: feastdevv1.ServerConfigs{}, RestAPI: &restEnabled, GRPC: &grpcEnabled, }, diff --git a/infra/feast-operator/internal/controller/services/util.go b/infra/feast-operator/internal/controller/services/util.go index 662308056e2..8e8a717aecf 100644 --- a/infra/feast-operator/internal/controller/services/util.go +++ b/infra/feast-operator/internal/controller/services/util.go @@ -8,7 +8,7 @@ import ( "strings" "github.com/feast-dev/feast/infra/feast-operator/api/feastversion" - feastdevv1alpha1 "github.com/feast-dev/feast/infra/feast-operator/api/v1alpha1" + feastdevv1 "github.com/feast-dev/feast/infra/feast-operator/api/v1" appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" @@ -22,22 +22,22 @@ import ( var isOpenShift = false -func IsRegistryServer(featureStore *feastdevv1alpha1.FeatureStore) bool { +func IsRegistryServer(featureStore *feastdevv1.FeatureStore) bool { return IsLocalRegistry(featureStore) && featureStore.Status.Applied.Services.Registry.Local.Server != nil } -func IsLocalRegistry(featureStore *feastdevv1alpha1.FeatureStore) bool { +func IsLocalRegistry(featureStore *feastdevv1.FeatureStore) bool { appliedServices := featureStore.Status.Applied.Services return appliedServices != nil && appliedServices.Registry != nil && appliedServices.Registry.Local != nil } -func isRemoteRegistry(featureStore *feastdevv1alpha1.FeatureStore) bool { +func isRemoteRegistry(featureStore *feastdevv1.FeatureStore) bool { appliedServices := featureStore.Status.Applied.Services return appliedServices != nil && appliedServices.Registry != nil && appliedServices.Registry.Remote != nil } -func hasPvcConfig(featureStore *feastdevv1alpha1.FeatureStore, feastType FeastServiceType) (*feastdevv1alpha1.PvcConfig, bool) { - var pvcConfig *feastdevv1alpha1.PvcConfig +func hasPvcConfig(featureStore *feastdevv1.FeatureStore, feastType FeastServiceType) (*feastdevv1.PvcConfig, bool) { + var pvcConfig *feastdevv1.PvcConfig services := featureStore.Status.Applied.Services if services != nil { switch feastType { @@ -61,14 +61,14 @@ func hasPvcConfig(featureStore *feastdevv1alpha1.FeatureStore, feastType FeastSe return pvcConfig, pvcConfig != nil } -func shouldCreatePvc(featureStore *feastdevv1alpha1.FeatureStore, feastType FeastServiceType) (*feastdevv1alpha1.PvcCreate, bool) { +func shouldCreatePvc(featureStore *feastdevv1.FeatureStore, feastType FeastServiceType) (*feastdevv1.PvcCreate, bool) { if pvcConfig, ok := hasPvcConfig(featureStore, feastType); ok { return pvcConfig.Create, pvcConfig.Create != nil } return nil, false } -func shouldMountEmptyDir(featureStore *feastdevv1alpha1.FeatureStore) bool { +func shouldMountEmptyDir(featureStore *feastdevv1.FeatureStore) bool { for _, feastType := range feastServerTypes { if _, ok := hasPvcConfig(featureStore, feastType); !ok { return true @@ -77,26 +77,26 @@ func shouldMountEmptyDir(featureStore *feastdevv1alpha1.FeatureStore) bool { return false } -func getOfflineMountPath(featureStore *feastdevv1alpha1.FeatureStore) string { +func getOfflineMountPath(featureStore *feastdevv1.FeatureStore) string { if pvcConfig, ok := hasPvcConfig(featureStore, OfflineFeastType); ok { return pvcConfig.MountPath } return EphemeralPath } -func ApplyDefaultsToStatus(cr *feastdevv1alpha1.FeatureStore) { +func ApplyDefaultsToStatus(cr *feastdevv1.FeatureStore) { // overwrite status.applied with every reconcile cr.Spec.DeepCopyInto(&cr.Status.Applied) cr.Status.FeastVersion = feastversion.FeastVersion applied := &cr.Status.Applied if applied.FeastProjectDir == nil { - applied.FeastProjectDir = &feastdevv1alpha1.FeastProjectDir{ - Init: &feastdevv1alpha1.FeastInitOptions{}, + applied.FeastProjectDir = &feastdevv1.FeastProjectDir{ + Init: &feastdevv1.FeastInitOptions{}, } } if applied.Services == nil { - applied.Services = &feastdevv1alpha1.FeatureStoreServices{} + applied.Services = &feastdevv1.FeatureStoreServices{} } services := applied.Services @@ -105,15 +105,15 @@ func ApplyDefaultsToStatus(cr *feastdevv1alpha1.FeatureStore) { if services.Registry.Remote == nil { // if local registry not set, apply an empty pointer struct if services.Registry.Local == nil { - services.Registry.Local = &feastdevv1alpha1.LocalRegistryConfig{} + services.Registry.Local = &feastdevv1.LocalRegistryConfig{} } if services.Registry.Local.Persistence == nil { - services.Registry.Local.Persistence = &feastdevv1alpha1.RegistryPersistence{} + services.Registry.Local.Persistence = &feastdevv1.RegistryPersistence{} } if services.Registry.Local.Persistence.DBPersistence == nil { if services.Registry.Local.Persistence.FilePersistence == nil { - services.Registry.Local.Persistence.FilePersistence = &feastdevv1alpha1.RegistryFilePersistence{} + services.Registry.Local.Persistence.FilePersistence = &feastdevv1.RegistryFilePersistence{} } if len(services.Registry.Local.Persistence.FilePersistence.Path) == 0 { @@ -139,12 +139,12 @@ func ApplyDefaultsToStatus(cr *feastdevv1alpha1.FeatureStore) { if services.OfflineStore != nil { if services.OfflineStore.Persistence == nil { - services.OfflineStore.Persistence = &feastdevv1alpha1.OfflineStorePersistence{} + services.OfflineStore.Persistence = &feastdevv1.OfflineStorePersistence{} } if services.OfflineStore.Persistence.DBPersistence == nil { if services.OfflineStore.Persistence.FilePersistence == nil { - services.OfflineStore.Persistence.FilePersistence = &feastdevv1alpha1.OfflineStoreFilePersistence{} + services.OfflineStore.Persistence.FilePersistence = &feastdevv1.OfflineStoreFilePersistence{} } if len(services.OfflineStore.Persistence.FilePersistence.Type) == 0 { @@ -161,15 +161,15 @@ func ApplyDefaultsToStatus(cr *feastdevv1alpha1.FeatureStore) { // default to onlineStore service deployment if services.OnlineStore == nil { - services.OnlineStore = &feastdevv1alpha1.OnlineStore{} + services.OnlineStore = &feastdevv1.OnlineStore{} } if services.OnlineStore.Persistence == nil { - services.OnlineStore.Persistence = &feastdevv1alpha1.OnlineStorePersistence{} + services.OnlineStore.Persistence = &feastdevv1.OnlineStorePersistence{} } if services.OnlineStore.Persistence.DBPersistence == nil { if services.OnlineStore.Persistence.FilePersistence == nil { - services.OnlineStore.Persistence.FilePersistence = &feastdevv1alpha1.OnlineStoreFilePersistence{} + services.OnlineStore.Persistence.FilePersistence = &feastdevv1.OnlineStoreFilePersistence{} } if len(services.OnlineStore.Persistence.FilePersistence.Path) == 0 { @@ -180,7 +180,7 @@ func ApplyDefaultsToStatus(cr *feastdevv1alpha1.FeatureStore) { } if services.OnlineStore.Server == nil { - services.OnlineStore.Server = &feastdevv1alpha1.ServerConfigs{} + services.OnlineStore.Server = &feastdevv1.ServerConfigs{} } setDefaultCtrConfigs(&services.OnlineStore.Server.ContainerConfigs.DefaultCtrConfigs) @@ -189,12 +189,12 @@ func ApplyDefaultsToStatus(cr *feastdevv1alpha1.FeatureStore) { } if applied.CronJob == nil { - applied.CronJob = &feastdevv1alpha1.FeastCronJob{} + applied.CronJob = &feastdevv1.FeastCronJob{} } setDefaultCronJobConfigs(applied.CronJob) } -func setDefaultCtrConfigs(defaultConfigs *feastdevv1alpha1.DefaultCtrConfigs) { +func setDefaultCtrConfigs(defaultConfigs *feastdevv1.DefaultCtrConfigs) { if defaultConfigs.Image == nil { img := getFeatureServerImage() defaultConfigs.Image = &img @@ -209,7 +209,7 @@ func getFeatureServerImage() string { } func checkOfflineStoreFilePersistenceType(value string) error { - if slices.Contains(feastdevv1alpha1.ValidOfflineStoreFilePersistenceTypes, value) { + if slices.Contains(feastdevv1.ValidOfflineStoreFilePersistenceTypes, value) { return nil } return fmt.Errorf("invalid file type %s for offline store", value) @@ -224,7 +224,7 @@ func ensureRequestedStorage(resources *corev1.VolumeResourceRequirements, reques } } -func ensurePVCDefaults(pvc *feastdevv1alpha1.PvcConfig, feastType FeastServiceType) { +func ensurePVCDefaults(pvc *feastdevv1.PvcConfig, feastType FeastServiceType) { if pvc != nil { var storageRequest string switch feastType { @@ -244,7 +244,7 @@ func ensurePVCDefaults(pvc *feastdevv1alpha1.PvcConfig, feastType FeastServiceTy } } -func defaultOnlineStorePath(featureStore *feastdevv1alpha1.FeatureStore) string { +func defaultOnlineStorePath(featureStore *feastdevv1.FeatureStore) string { if _, ok := hasPvcConfig(featureStore, OnlineFeastType); ok { return DefaultOnlineStorePath } @@ -252,7 +252,7 @@ func defaultOnlineStorePath(featureStore *feastdevv1alpha1.FeatureStore) string return EphemeralPath + "/" + DefaultOnlineStorePath } -func defaultRegistryPath(featureStore *feastdevv1alpha1.FeatureStore) string { +func defaultRegistryPath(featureStore *feastdevv1.FeatureStore) string { if _, ok := hasPvcConfig(featureStore, RegistryFeastType); ok { return DefaultRegistryPath } @@ -261,21 +261,21 @@ func defaultRegistryPath(featureStore *feastdevv1alpha1.FeatureStore) string { } func checkOfflineStoreDBStorePersistenceType(value string) error { - if slices.Contains(feastdevv1alpha1.ValidOfflineStoreDBStorePersistenceTypes, value) { + if slices.Contains(feastdevv1.ValidOfflineStoreDBStorePersistenceTypes, value) { return nil } return fmt.Errorf("invalid DB store type %s for offline store", value) } func checkOnlineStoreDBStorePersistenceType(value string) error { - if slices.Contains(feastdevv1alpha1.ValidOnlineStoreDBStorePersistenceTypes, value) { + if slices.Contains(feastdevv1.ValidOnlineStoreDBStorePersistenceTypes, value) { return nil } return fmt.Errorf("invalid DB store type %s for online store", value) } func checkRegistryDBStorePersistenceType(value string) error { - if slices.Contains(feastdevv1alpha1.ValidRegistryDBStorePersistenceTypes, value) { + if slices.Contains(feastdevv1.ValidRegistryDBStorePersistenceTypes, value) { return nil } return fmt.Errorf("invalid DB store type %s for registry", value) @@ -438,19 +438,19 @@ func getContainerByType(feastType FeastServiceType, podSpec corev1.PodSpec) (int return -1, nil } -func GetRegistryVolume(featureStore *feastdevv1alpha1.FeatureStore, volumes []corev1.Volume) *corev1.Volume { +func GetRegistryVolume(featureStore *feastdevv1.FeatureStore, volumes []corev1.Volume) *corev1.Volume { return getVolumeByType(RegistryFeastType, featureStore, volumes) } -func GetOnlineVolume(featureStore *feastdevv1alpha1.FeatureStore, volumes []corev1.Volume) *corev1.Volume { +func GetOnlineVolume(featureStore *feastdevv1.FeatureStore, volumes []corev1.Volume) *corev1.Volume { return getVolumeByType(OnlineFeastType, featureStore, volumes) } -func GetOfflineVolume(featureStore *feastdevv1alpha1.FeatureStore, volumes []corev1.Volume) *corev1.Volume { +func GetOfflineVolume(featureStore *feastdevv1.FeatureStore, volumes []corev1.Volume) *corev1.Volume { return getVolumeByType(OfflineFeastType, featureStore, volumes) } -func getVolumeByType(feastType FeastServiceType, featureStore *feastdevv1alpha1.FeatureStore, volumes []corev1.Volume) *corev1.Volume { +func getVolumeByType(feastType FeastServiceType, featureStore *feastdevv1.FeatureStore, volumes []corev1.Volume) *corev1.Volume { for _, v := range volumes { if v.Name == GetFeastServiceName(featureStore, feastType) { return &v @@ -459,19 +459,19 @@ func getVolumeByType(feastType FeastServiceType, featureStore *feastdevv1alpha1. return nil } -func GetRegistryVolumeMount(featureStore *feastdevv1alpha1.FeatureStore, volumeMounts []corev1.VolumeMount) *corev1.VolumeMount { +func GetRegistryVolumeMount(featureStore *feastdevv1.FeatureStore, volumeMounts []corev1.VolumeMount) *corev1.VolumeMount { return getVolumeMountByType(RegistryFeastType, featureStore, volumeMounts) } -func GetOnlineVolumeMount(featureStore *feastdevv1alpha1.FeatureStore, volumeMounts []corev1.VolumeMount) *corev1.VolumeMount { +func GetOnlineVolumeMount(featureStore *feastdevv1.FeatureStore, volumeMounts []corev1.VolumeMount) *corev1.VolumeMount { return getVolumeMountByType(OnlineFeastType, featureStore, volumeMounts) } -func GetOfflineVolumeMount(featureStore *feastdevv1alpha1.FeatureStore, volumeMounts []corev1.VolumeMount) *corev1.VolumeMount { +func GetOfflineVolumeMount(featureStore *feastdevv1.FeatureStore, volumeMounts []corev1.VolumeMount) *corev1.VolumeMount { return getVolumeMountByType(OfflineFeastType, featureStore, volumeMounts) } -func getVolumeMountByType(feastType FeastServiceType, featureStore *feastdevv1alpha1.FeatureStore, volumeMounts []corev1.VolumeMount) *corev1.VolumeMount { +func getVolumeMountByType(feastType FeastServiceType, featureStore *feastdevv1.FeatureStore, volumeMounts []corev1.VolumeMount) *corev1.VolumeMount { for _, vm := range volumeMounts { if vm.Name == GetFeastServiceName(featureStore, feastType) { return &vm diff --git a/infra/feast-operator/internal/controller/suite_test.go b/infra/feast-operator/internal/controller/suite_test.go index 127bb7fe3b3..5a266abc8ba 100644 --- a/infra/feast-operator/internal/controller/suite_test.go +++ b/infra/feast-operator/internal/controller/suite_test.go @@ -35,7 +35,7 @@ import ( logf "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/log/zap" - feastdevv1alpha1 "github.com/feast-dev/feast/infra/feast-operator/api/v1alpha1" + feastdevv1 "github.com/feast-dev/feast/infra/feast-operator/api/v1" "github.com/feast-dev/feast/infra/feast-operator/internal/controller/services" // +kubebuilder:scaffold:imports ) @@ -73,7 +73,7 @@ var _ = BeforeSuite(func() { Expect(err).NotTo(HaveOccurred()) Expect(cfg).NotTo(BeNil()) - err = feastdevv1alpha1.AddToScheme(scheme.Scheme) + err = feastdevv1.AddToScheme(scheme.Scheme) Expect(err).NotTo(HaveOccurred()) // +kubebuilder:scaffold:scheme diff --git a/infra/feast-operator/test/api/featurestore_types_test.go b/infra/feast-operator/test/api/featurestore_types_test.go index e8b08b549d0..d426c8e0d7e 100644 --- a/infra/feast-operator/test/api/featurestore_types_test.go +++ b/infra/feast-operator/test/api/featurestore_types_test.go @@ -12,7 +12,7 @@ import ( "k8s.io/apimachinery/pkg/types" "sigs.k8s.io/controller-runtime/pkg/log" - feastdevv1alpha1 "github.com/feast-dev/feast/infra/feast-operator/api/v1alpha1" + feastdevv1 "github.com/feast-dev/feast/infra/feast-operator/api/v1" "github.com/feast-dev/feast/infra/feast-operator/internal/controller/services" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -22,19 +22,19 @@ func boolPtr(b bool) *bool { return &b } -func createFeatureStore() *feastdevv1alpha1.FeatureStore { - return &feastdevv1alpha1.FeatureStore{ +func createFeatureStore() *feastdevv1.FeatureStore { + return &feastdevv1.FeatureStore{ ObjectMeta: metav1.ObjectMeta{ Name: resourceName, Namespace: namespaceName, }, - Spec: feastdevv1alpha1.FeatureStoreSpec{ + Spec: feastdevv1.FeatureStoreSpec{ FeastProject: "test_project", }, } } -func attemptInvalidCreationAndAsserts(ctx context.Context, featurestore *feastdevv1alpha1.FeatureStore, matcher string) { +func attemptInvalidCreationAndAsserts(ctx context.Context, featurestore *feastdevv1.FeatureStore, matcher string) { By("Creating the resource") logger := log.FromContext(ctx) logger.Info("Creating", "FeatureStore", featurestore) @@ -44,26 +44,26 @@ func attemptInvalidCreationAndAsserts(ctx context.Context, featurestore *feastde Expect(err.Error()).Should(ContainSubstring(matcher)) } -func onlineStoreWithAbsolutePathForPvc(featureStore *feastdevv1alpha1.FeatureStore) *feastdevv1alpha1.FeatureStore { +func onlineStoreWithAbsolutePathForPvc(featureStore *feastdevv1.FeatureStore) *feastdevv1.FeatureStore { fsCopy := featureStore.DeepCopy() - fsCopy.Spec.Services = &feastdevv1alpha1.FeatureStoreServices{ - OnlineStore: &feastdevv1alpha1.OnlineStore{ - Persistence: &feastdevv1alpha1.OnlineStorePersistence{ - FilePersistence: &feastdevv1alpha1.OnlineStoreFilePersistence{ + fsCopy.Spec.Services = &feastdevv1.FeatureStoreServices{ + OnlineStore: &feastdevv1.OnlineStore{ + Persistence: &feastdevv1.OnlineStorePersistence{ + FilePersistence: &feastdevv1.OnlineStoreFilePersistence{ Path: "/data/online_store.db", - PvcConfig: &feastdevv1alpha1.PvcConfig{}, + PvcConfig: &feastdevv1.PvcConfig{}, }, }, }, } return fsCopy } -func onlineStoreWithRelativePathForEphemeral(featureStore *feastdevv1alpha1.FeatureStore) *feastdevv1alpha1.FeatureStore { +func onlineStoreWithRelativePathForEphemeral(featureStore *feastdevv1.FeatureStore) *feastdevv1.FeatureStore { fsCopy := featureStore.DeepCopy() - fsCopy.Spec.Services = &feastdevv1alpha1.FeatureStoreServices{ - OnlineStore: &feastdevv1alpha1.OnlineStore{ - Persistence: &feastdevv1alpha1.OnlineStorePersistence{ - FilePersistence: &feastdevv1alpha1.OnlineStoreFilePersistence{ + fsCopy.Spec.Services = &feastdevv1.FeatureStoreServices{ + OnlineStore: &feastdevv1.OnlineStore{ + Persistence: &feastdevv1.OnlineStorePersistence{ + FilePersistence: &feastdevv1.OnlineStoreFilePersistence{ Path: "data/online_store.db", }, }, @@ -72,15 +72,15 @@ func onlineStoreWithRelativePathForEphemeral(featureStore *feastdevv1alpha1.Feat return fsCopy } -func onlineStoreWithObjectStoreBucketForPvc(path string, featureStore *feastdevv1alpha1.FeatureStore) *feastdevv1alpha1.FeatureStore { +func onlineStoreWithObjectStoreBucketForPvc(path string, featureStore *feastdevv1.FeatureStore) *feastdevv1.FeatureStore { fsCopy := featureStore.DeepCopy() - fsCopy.Spec.Services = &feastdevv1alpha1.FeatureStoreServices{ - OnlineStore: &feastdevv1alpha1.OnlineStore{ - Persistence: &feastdevv1alpha1.OnlineStorePersistence{ - FilePersistence: &feastdevv1alpha1.OnlineStoreFilePersistence{ + fsCopy.Spec.Services = &feastdevv1.FeatureStoreServices{ + OnlineStore: &feastdevv1.OnlineStore{ + Persistence: &feastdevv1.OnlineStorePersistence{ + FilePersistence: &feastdevv1.OnlineStoreFilePersistence{ Path: path, - PvcConfig: &feastdevv1alpha1.PvcConfig{ - Create: &feastdevv1alpha1.PvcCreate{}, + PvcConfig: &feastdevv1.PvcConfig{ + Create: &feastdevv1.PvcCreate{}, MountPath: "/data/online", }, }, @@ -90,12 +90,12 @@ func onlineStoreWithObjectStoreBucketForPvc(path string, featureStore *feastdevv return fsCopy } -func offlineStoreWithUnmanagedFileType(featureStore *feastdevv1alpha1.FeatureStore) *feastdevv1alpha1.FeatureStore { +func offlineStoreWithUnmanagedFileType(featureStore *feastdevv1.FeatureStore) *feastdevv1.FeatureStore { fsCopy := featureStore.DeepCopy() - fsCopy.Spec.Services = &feastdevv1alpha1.FeatureStoreServices{ - OfflineStore: &feastdevv1alpha1.OfflineStore{ - Persistence: &feastdevv1alpha1.OfflineStorePersistence{ - FilePersistence: &feastdevv1alpha1.OfflineStoreFilePersistence{ + fsCopy.Spec.Services = &feastdevv1.FeatureStoreServices{ + OfflineStore: &feastdevv1.OfflineStore{ + Persistence: &feastdevv1.OfflineStorePersistence{ + FilePersistence: &feastdevv1.OfflineStoreFilePersistence{ Type: "unmanaged", }, }, @@ -104,28 +104,28 @@ func offlineStoreWithUnmanagedFileType(featureStore *feastdevv1alpha1.FeatureSto return fsCopy } -func registryWithAbsolutePathForPvc(featureStore *feastdevv1alpha1.FeatureStore) *feastdevv1alpha1.FeatureStore { +func registryWithAbsolutePathForPvc(featureStore *feastdevv1.FeatureStore) *feastdevv1.FeatureStore { fsCopy := featureStore.DeepCopy() - fsCopy.Spec.Services = &feastdevv1alpha1.FeatureStoreServices{ - Registry: &feastdevv1alpha1.Registry{ - Local: &feastdevv1alpha1.LocalRegistryConfig{ - Persistence: &feastdevv1alpha1.RegistryPersistence{ - FilePersistence: &feastdevv1alpha1.RegistryFilePersistence{ + fsCopy.Spec.Services = &feastdevv1.FeatureStoreServices{ + Registry: &feastdevv1.Registry{ + Local: &feastdevv1.LocalRegistryConfig{ + Persistence: &feastdevv1.RegistryPersistence{ + FilePersistence: &feastdevv1.RegistryFilePersistence{ Path: "/data/registry.db", - PvcConfig: &feastdevv1alpha1.PvcConfig{}, + PvcConfig: &feastdevv1.PvcConfig{}, }}, }, }, } return fsCopy } -func registryWithRelativePathForEphemeral(featureStore *feastdevv1alpha1.FeatureStore) *feastdevv1alpha1.FeatureStore { +func registryWithRelativePathForEphemeral(featureStore *feastdevv1.FeatureStore) *feastdevv1.FeatureStore { fsCopy := featureStore.DeepCopy() - fsCopy.Spec.Services = &feastdevv1alpha1.FeatureStoreServices{ - Registry: &feastdevv1alpha1.Registry{ - Local: &feastdevv1alpha1.LocalRegistryConfig{ - Persistence: &feastdevv1alpha1.RegistryPersistence{ - FilePersistence: &feastdevv1alpha1.RegistryFilePersistence{ + fsCopy.Spec.Services = &feastdevv1.FeatureStoreServices{ + Registry: &feastdevv1.Registry{ + Local: &feastdevv1.LocalRegistryConfig{ + Persistence: &feastdevv1.RegistryPersistence{ + FilePersistence: &feastdevv1.RegistryFilePersistence{ Path: "data/online_store.db", }, }, @@ -134,16 +134,16 @@ func registryWithRelativePathForEphemeral(featureStore *feastdevv1alpha1.Feature } return fsCopy } -func registryWithObjectStoreBucketForPvc(path string, featureStore *feastdevv1alpha1.FeatureStore) *feastdevv1alpha1.FeatureStore { +func registryWithObjectStoreBucketForPvc(path string, featureStore *feastdevv1.FeatureStore) *feastdevv1.FeatureStore { fsCopy := featureStore.DeepCopy() - fsCopy.Spec.Services = &feastdevv1alpha1.FeatureStoreServices{ - Registry: &feastdevv1alpha1.Registry{ - Local: &feastdevv1alpha1.LocalRegistryConfig{ - Persistence: &feastdevv1alpha1.RegistryPersistence{ - FilePersistence: &feastdevv1alpha1.RegistryFilePersistence{ + fsCopy.Spec.Services = &feastdevv1.FeatureStoreServices{ + Registry: &feastdevv1.Registry{ + Local: &feastdevv1.LocalRegistryConfig{ + Persistence: &feastdevv1.RegistryPersistence{ + FilePersistence: &feastdevv1.RegistryFilePersistence{ Path: path, - PvcConfig: &feastdevv1alpha1.PvcConfig{ - Create: &feastdevv1alpha1.PvcCreate{}, + PvcConfig: &feastdevv1.PvcConfig{ + Create: &feastdevv1.PvcCreate{}, MountPath: "/data/registry", }, }, @@ -153,13 +153,13 @@ func registryWithObjectStoreBucketForPvc(path string, featureStore *feastdevv1al } return fsCopy } -func registryWithS3AdditionalKeywordsForFile(featureStore *feastdevv1alpha1.FeatureStore) *feastdevv1alpha1.FeatureStore { +func registryWithS3AdditionalKeywordsForFile(featureStore *feastdevv1.FeatureStore) *feastdevv1.FeatureStore { fsCopy := featureStore.DeepCopy() - fsCopy.Spec.Services = &feastdevv1alpha1.FeatureStoreServices{ - Registry: &feastdevv1alpha1.Registry{ - Local: &feastdevv1alpha1.LocalRegistryConfig{ - Persistence: &feastdevv1alpha1.RegistryPersistence{ - FilePersistence: &feastdevv1alpha1.RegistryFilePersistence{ + fsCopy.Spec.Services = &feastdevv1.FeatureStoreServices{ + Registry: &feastdevv1.Registry{ + Local: &feastdevv1.LocalRegistryConfig{ + Persistence: &feastdevv1.RegistryPersistence{ + FilePersistence: &feastdevv1.RegistryFilePersistence{ Path: "/data/online_store.db", S3AdditionalKwargs: &map[string]string{}, }, @@ -169,13 +169,13 @@ func registryWithS3AdditionalKeywordsForFile(featureStore *feastdevv1alpha1.Feat } return fsCopy } -func registryWithS3AdditionalKeywordsForGsBucket(featureStore *feastdevv1alpha1.FeatureStore) *feastdevv1alpha1.FeatureStore { +func registryWithS3AdditionalKeywordsForGsBucket(featureStore *feastdevv1.FeatureStore) *feastdevv1.FeatureStore { fsCopy := featureStore.DeepCopy() - fsCopy.Spec.Services = &feastdevv1alpha1.FeatureStoreServices{ - Registry: &feastdevv1alpha1.Registry{ - Local: &feastdevv1alpha1.LocalRegistryConfig{ - Persistence: &feastdevv1alpha1.RegistryPersistence{ - FilePersistence: &feastdevv1alpha1.RegistryFilePersistence{ + fsCopy.Spec.Services = &feastdevv1.FeatureStoreServices{ + Registry: &feastdevv1.Registry{ + Local: &feastdevv1.LocalRegistryConfig{ + Persistence: &feastdevv1.RegistryPersistence{ + FilePersistence: &feastdevv1.RegistryFilePersistence{ Path: "gs://online_store.db", S3AdditionalKwargs: &map[string]string{}, }, @@ -186,30 +186,30 @@ func registryWithS3AdditionalKeywordsForGsBucket(featureStore *feastdevv1alpha1. return fsCopy } -func pvcConfigWithNeitherRefNorCreate(featureStore *feastdevv1alpha1.FeatureStore) *feastdevv1alpha1.FeatureStore { +func pvcConfigWithNeitherRefNorCreate(featureStore *feastdevv1.FeatureStore) *feastdevv1.FeatureStore { fsCopy := featureStore.DeepCopy() - fsCopy.Spec.Services = &feastdevv1alpha1.FeatureStoreServices{ - OfflineStore: &feastdevv1alpha1.OfflineStore{ - Persistence: &feastdevv1alpha1.OfflineStorePersistence{ - FilePersistence: &feastdevv1alpha1.OfflineStoreFilePersistence{ - PvcConfig: &feastdevv1alpha1.PvcConfig{}, + fsCopy.Spec.Services = &feastdevv1.FeatureStoreServices{ + OfflineStore: &feastdevv1.OfflineStore{ + Persistence: &feastdevv1.OfflineStorePersistence{ + FilePersistence: &feastdevv1.OfflineStoreFilePersistence{ + PvcConfig: &feastdevv1.PvcConfig{}, }, }, }, } return fsCopy } -func pvcConfigWithBothRefAndCreate(featureStore *feastdevv1alpha1.FeatureStore) *feastdevv1alpha1.FeatureStore { +func pvcConfigWithBothRefAndCreate(featureStore *feastdevv1.FeatureStore) *feastdevv1.FeatureStore { fsCopy := featureStore.DeepCopy() - fsCopy.Spec.Services = &feastdevv1alpha1.FeatureStoreServices{ - OfflineStore: &feastdevv1alpha1.OfflineStore{ - Persistence: &feastdevv1alpha1.OfflineStorePersistence{ - FilePersistence: &feastdevv1alpha1.OfflineStoreFilePersistence{ - PvcConfig: &feastdevv1alpha1.PvcConfig{ + fsCopy.Spec.Services = &feastdevv1.FeatureStoreServices{ + OfflineStore: &feastdevv1.OfflineStore{ + Persistence: &feastdevv1.OfflineStorePersistence{ + FilePersistence: &feastdevv1.OfflineStoreFilePersistence{ + PvcConfig: &feastdevv1.PvcConfig{ Ref: &corev1.LocalObjectReference{ Name: "pvc", }, - Create: &feastdevv1alpha1.PvcCreate{}, + Create: &feastdevv1.PvcCreate{}, }, }, }, @@ -218,35 +218,35 @@ func pvcConfigWithBothRefAndCreate(featureStore *feastdevv1alpha1.FeatureStore) return fsCopy } -func pvcConfigWithNoResources(featureStore *feastdevv1alpha1.FeatureStore) *feastdevv1alpha1.FeatureStore { +func pvcConfigWithNoResources(featureStore *feastdevv1.FeatureStore) *feastdevv1.FeatureStore { fsCopy := featureStore.DeepCopy() - fsCopy.Spec.Services = &feastdevv1alpha1.FeatureStoreServices{ - OfflineStore: &feastdevv1alpha1.OfflineStore{ - Persistence: &feastdevv1alpha1.OfflineStorePersistence{ - FilePersistence: &feastdevv1alpha1.OfflineStoreFilePersistence{ - PvcConfig: &feastdevv1alpha1.PvcConfig{ - Create: &feastdevv1alpha1.PvcCreate{}, + fsCopy.Spec.Services = &feastdevv1.FeatureStoreServices{ + OfflineStore: &feastdevv1.OfflineStore{ + Persistence: &feastdevv1.OfflineStorePersistence{ + FilePersistence: &feastdevv1.OfflineStoreFilePersistence{ + PvcConfig: &feastdevv1.PvcConfig{ + Create: &feastdevv1.PvcCreate{}, MountPath: "/data/offline", }, }, }, }, - OnlineStore: &feastdevv1alpha1.OnlineStore{ - Persistence: &feastdevv1alpha1.OnlineStorePersistence{ - FilePersistence: &feastdevv1alpha1.OnlineStoreFilePersistence{ - PvcConfig: &feastdevv1alpha1.PvcConfig{ - Create: &feastdevv1alpha1.PvcCreate{}, + OnlineStore: &feastdevv1.OnlineStore{ + Persistence: &feastdevv1.OnlineStorePersistence{ + FilePersistence: &feastdevv1.OnlineStoreFilePersistence{ + PvcConfig: &feastdevv1.PvcConfig{ + Create: &feastdevv1.PvcCreate{}, MountPath: "/data/online", }, }, }, }, - Registry: &feastdevv1alpha1.Registry{ - Local: &feastdevv1alpha1.LocalRegistryConfig{ - Persistence: &feastdevv1alpha1.RegistryPersistence{ - FilePersistence: &feastdevv1alpha1.RegistryFilePersistence{ - PvcConfig: &feastdevv1alpha1.PvcConfig{ - Create: &feastdevv1alpha1.PvcCreate{}, + Registry: &feastdevv1.Registry{ + Local: &feastdevv1.LocalRegistryConfig{ + Persistence: &feastdevv1.RegistryPersistence{ + FilePersistence: &feastdevv1.RegistryFilePersistence{ + PvcConfig: &feastdevv1.PvcConfig{ + Create: &feastdevv1.PvcCreate{}, MountPath: "/data/registry", }, }, @@ -257,7 +257,7 @@ func pvcConfigWithNoResources(featureStore *feastdevv1alpha1.FeatureStore) *feas return fsCopy } -func pvcConfigWithResources(featureStore *feastdevv1alpha1.FeatureStore) *feastdevv1alpha1.FeatureStore { +func pvcConfigWithResources(featureStore *feastdevv1.FeatureStore) *feastdevv1.FeatureStore { fsCopy := pvcConfigWithNoResources(featureStore) fsCopy.Spec.Services.OfflineStore.Persistence.FilePersistence.PvcConfig.Create.Resources = corev1.VolumeResourceRequirements{ Requests: corev1.ResourceList{ @@ -277,31 +277,31 @@ func pvcConfigWithResources(featureStore *feastdevv1alpha1.FeatureStore) *feastd return fsCopy } -func authzConfigWithKubernetes(featureStore *feastdevv1alpha1.FeatureStore) *feastdevv1alpha1.FeatureStore { +func authzConfigWithKubernetes(featureStore *feastdevv1.FeatureStore) *feastdevv1.FeatureStore { fsCopy := featureStore.DeepCopy() if fsCopy.Spec.AuthzConfig == nil { - fsCopy.Spec.AuthzConfig = &feastdevv1alpha1.AuthzConfig{} + fsCopy.Spec.AuthzConfig = &feastdevv1.AuthzConfig{} } - fsCopy.Spec.AuthzConfig.KubernetesAuthz = &feastdevv1alpha1.KubernetesAuthz{ + fsCopy.Spec.AuthzConfig.KubernetesAuthz = &feastdevv1.KubernetesAuthz{ Roles: []string{}, } return fsCopy } -func authzConfigWithOidc(featureStore *feastdevv1alpha1.FeatureStore) *feastdevv1alpha1.FeatureStore { +func authzConfigWithOidc(featureStore *feastdevv1.FeatureStore) *feastdevv1.FeatureStore { fsCopy := featureStore.DeepCopy() if fsCopy.Spec.AuthzConfig == nil { - fsCopy.Spec.AuthzConfig = &feastdevv1alpha1.AuthzConfig{} + fsCopy.Spec.AuthzConfig = &feastdevv1.AuthzConfig{} } - fsCopy.Spec.AuthzConfig.OidcAuthz = &feastdevv1alpha1.OidcAuthz{} + fsCopy.Spec.AuthzConfig.OidcAuthz = &feastdevv1.OidcAuthz{} return fsCopy } -func onlineStoreWithDBPersistenceType(dbPersistenceType string, featureStore *feastdevv1alpha1.FeatureStore) *feastdevv1alpha1.FeatureStore { +func onlineStoreWithDBPersistenceType(dbPersistenceType string, featureStore *feastdevv1.FeatureStore) *feastdevv1.FeatureStore { fsCopy := featureStore.DeepCopy() - fsCopy.Spec.Services = &feastdevv1alpha1.FeatureStoreServices{ - OnlineStore: &feastdevv1alpha1.OnlineStore{ - Persistence: &feastdevv1alpha1.OnlineStorePersistence{ - DBPersistence: &feastdevv1alpha1.OnlineStoreDBStorePersistence{ + fsCopy.Spec.Services = &feastdevv1.FeatureStoreServices{ + OnlineStore: &feastdevv1.OnlineStore{ + Persistence: &feastdevv1.OnlineStorePersistence{ + DBPersistence: &feastdevv1.OnlineStoreDBStorePersistence{ Type: dbPersistenceType, }, }, @@ -310,12 +310,12 @@ func onlineStoreWithDBPersistenceType(dbPersistenceType string, featureStore *fe return fsCopy } -func offlineStoreWithDBPersistenceType(dbPersistenceType string, featureStore *feastdevv1alpha1.FeatureStore) *feastdevv1alpha1.FeatureStore { +func offlineStoreWithDBPersistenceType(dbPersistenceType string, featureStore *feastdevv1.FeatureStore) *feastdevv1.FeatureStore { fsCopy := featureStore.DeepCopy() - fsCopy.Spec.Services = &feastdevv1alpha1.FeatureStoreServices{ - OfflineStore: &feastdevv1alpha1.OfflineStore{ - Persistence: &feastdevv1alpha1.OfflineStorePersistence{ - DBPersistence: &feastdevv1alpha1.OfflineStoreDBStorePersistence{ + fsCopy.Spec.Services = &feastdevv1.FeatureStoreServices{ + OfflineStore: &feastdevv1.OfflineStore{ + Persistence: &feastdevv1.OfflineStorePersistence{ + DBPersistence: &feastdevv1.OfflineStoreDBStorePersistence{ Type: dbPersistenceType, }, }, @@ -324,13 +324,13 @@ func offlineStoreWithDBPersistenceType(dbPersistenceType string, featureStore *f return fsCopy } -func registryStoreWithDBPersistenceType(dbPersistenceType string, featureStore *feastdevv1alpha1.FeatureStore) *feastdevv1alpha1.FeatureStore { +func registryStoreWithDBPersistenceType(dbPersistenceType string, featureStore *feastdevv1.FeatureStore) *feastdevv1.FeatureStore { fsCopy := featureStore.DeepCopy() - fsCopy.Spec.Services = &feastdevv1alpha1.FeatureStoreServices{ - Registry: &feastdevv1alpha1.Registry{ - Local: &feastdevv1alpha1.LocalRegistryConfig{ - Persistence: &feastdevv1alpha1.RegistryPersistence{ - DBPersistence: &feastdevv1alpha1.RegistryDBStorePersistence{ + fsCopy.Spec.Services = &feastdevv1.FeatureStoreServices{ + Registry: &feastdevv1.Registry{ + Local: &feastdevv1.LocalRegistryConfig{ + Persistence: &feastdevv1.RegistryPersistence{ + DBPersistence: &feastdevv1.RegistryDBStorePersistence{ Type: dbPersistenceType, }, }, @@ -340,12 +340,12 @@ func registryStoreWithDBPersistenceType(dbPersistenceType string, featureStore * return fsCopy } -func registryWithRestAPIFalse(featureStore *feastdevv1alpha1.FeatureStore) *feastdevv1alpha1.FeatureStore { +func registryWithRestAPIFalse(featureStore *feastdevv1.FeatureStore) *feastdevv1.FeatureStore { fsCopy := featureStore.DeepCopy() - fsCopy.Spec.Services = &feastdevv1alpha1.FeatureStoreServices{ - Registry: &feastdevv1alpha1.Registry{ - Local: &feastdevv1alpha1.LocalRegistryConfig{ - Server: &feastdevv1alpha1.RegistryServerConfigs{ + fsCopy.Spec.Services = &feastdevv1.FeatureStoreServices{ + Registry: &feastdevv1.Registry{ + Local: &feastdevv1.LocalRegistryConfig{ + Server: &feastdevv1.RegistryServerConfigs{ RestAPI: boolPtr(false), }, }, @@ -354,12 +354,12 @@ func registryWithRestAPIFalse(featureStore *feastdevv1alpha1.FeatureStore) *feas return fsCopy } -func registryWithOnlyRestAPI(featureStore *feastdevv1alpha1.FeatureStore) *feastdevv1alpha1.FeatureStore { +func registryWithOnlyRestAPI(featureStore *feastdevv1.FeatureStore) *feastdevv1.FeatureStore { fsCopy := featureStore.DeepCopy() - fsCopy.Spec.Services = &feastdevv1alpha1.FeatureStoreServices{ - Registry: &feastdevv1alpha1.Registry{ - Local: &feastdevv1alpha1.LocalRegistryConfig{ - Server: &feastdevv1alpha1.RegistryServerConfigs{ + fsCopy.Spec.Services = &feastdevv1.FeatureStoreServices{ + Registry: &feastdevv1.Registry{ + Local: &feastdevv1.LocalRegistryConfig{ + Server: &feastdevv1.RegistryServerConfigs{ RestAPI: boolPtr(true), }, }, @@ -368,12 +368,12 @@ func registryWithOnlyRestAPI(featureStore *feastdevv1alpha1.FeatureStore) *feast return fsCopy } -func registryWithOnlyGRPC(featureStore *feastdevv1alpha1.FeatureStore) *feastdevv1alpha1.FeatureStore { +func registryWithOnlyGRPC(featureStore *feastdevv1.FeatureStore) *feastdevv1.FeatureStore { fsCopy := featureStore.DeepCopy() - fsCopy.Spec.Services = &feastdevv1alpha1.FeatureStoreServices{ - Registry: &feastdevv1alpha1.Registry{ - Local: &feastdevv1alpha1.LocalRegistryConfig{ - Server: &feastdevv1alpha1.RegistryServerConfigs{ + fsCopy.Spec.Services = &feastdevv1.FeatureStoreServices{ + Registry: &feastdevv1.Registry{ + Local: &feastdevv1.LocalRegistryConfig{ + Server: &feastdevv1.RegistryServerConfigs{ GRPC: boolPtr(true), }, }, @@ -382,12 +382,12 @@ func registryWithOnlyGRPC(featureStore *feastdevv1alpha1.FeatureStore) *feastdev return fsCopy } -func registryWithBothAPIs(featureStore *feastdevv1alpha1.FeatureStore) *feastdevv1alpha1.FeatureStore { +func registryWithBothAPIs(featureStore *feastdevv1.FeatureStore) *feastdevv1.FeatureStore { fsCopy := featureStore.DeepCopy() - fsCopy.Spec.Services = &feastdevv1alpha1.FeatureStoreServices{ - Registry: &feastdevv1alpha1.Registry{ - Local: &feastdevv1alpha1.LocalRegistryConfig{ - Server: &feastdevv1alpha1.RegistryServerConfigs{ + fsCopy.Spec.Services = &feastdevv1.FeatureStoreServices{ + Registry: &feastdevv1.Registry{ + Local: &feastdevv1.LocalRegistryConfig{ + Server: &feastdevv1.RegistryServerConfigs{ RestAPI: boolPtr(true), GRPC: boolPtr(true), }, @@ -397,24 +397,24 @@ func registryWithBothAPIs(featureStore *feastdevv1alpha1.FeatureStore) *feastdev return fsCopy } -func registryWithNoAPIs(featureStore *feastdevv1alpha1.FeatureStore) *feastdevv1alpha1.FeatureStore { +func registryWithNoAPIs(featureStore *feastdevv1.FeatureStore) *feastdevv1.FeatureStore { fsCopy := featureStore.DeepCopy() - fsCopy.Spec.Services = &feastdevv1alpha1.FeatureStoreServices{ - Registry: &feastdevv1alpha1.Registry{ - Local: &feastdevv1alpha1.LocalRegistryConfig{ - Server: &feastdevv1alpha1.RegistryServerConfigs{}, + fsCopy.Spec.Services = &feastdevv1.FeatureStoreServices{ + Registry: &feastdevv1.Registry{ + Local: &feastdevv1.LocalRegistryConfig{ + Server: &feastdevv1.RegistryServerConfigs{}, }, }, } return fsCopy } -func registryWithBothFalse(featureStore *feastdevv1alpha1.FeatureStore) *feastdevv1alpha1.FeatureStore { +func registryWithBothFalse(featureStore *feastdevv1.FeatureStore) *feastdevv1.FeatureStore { fsCopy := featureStore.DeepCopy() - fsCopy.Spec.Services = &feastdevv1alpha1.FeatureStoreServices{ - Registry: &feastdevv1alpha1.Registry{ - Local: &feastdevv1alpha1.LocalRegistryConfig{ - Server: &feastdevv1alpha1.RegistryServerConfigs{ + fsCopy.Spec.Services = &feastdevv1.FeatureStoreServices{ + Registry: &feastdevv1.Registry{ + Local: &feastdevv1.LocalRegistryConfig{ + Server: &feastdevv1.RegistryServerConfigs{ RestAPI: boolPtr(false), GRPC: boolPtr(false), }, @@ -424,12 +424,12 @@ func registryWithBothFalse(featureStore *feastdevv1alpha1.FeatureStore) *feastde return fsCopy } -func registryWithGRPCFalse(featureStore *feastdevv1alpha1.FeatureStore) *feastdevv1alpha1.FeatureStore { +func registryWithGRPCFalse(featureStore *feastdevv1.FeatureStore) *feastdevv1.FeatureStore { fsCopy := featureStore.DeepCopy() - fsCopy.Spec.Services = &feastdevv1alpha1.FeatureStoreServices{ - Registry: &feastdevv1alpha1.Registry{ - Local: &feastdevv1alpha1.LocalRegistryConfig{ - Server: &feastdevv1alpha1.RegistryServerConfigs{ + fsCopy.Spec.Services = &feastdevv1.FeatureStoreServices{ + Registry: &feastdevv1.Registry{ + Local: &feastdevv1.LocalRegistryConfig{ + Server: &feastdevv1.RegistryServerConfigs{ GRPC: boolPtr(false), }, }, @@ -438,9 +438,9 @@ func registryWithGRPCFalse(featureStore *feastdevv1alpha1.FeatureStore) *feastde return fsCopy } -func cronJobWithAnnotations(featureStore *feastdevv1alpha1.FeatureStore) *feastdevv1alpha1.FeatureStore { +func cronJobWithAnnotations(featureStore *feastdevv1.FeatureStore) *feastdevv1.FeatureStore { fsCopy := featureStore.DeepCopy() - fsCopy.Spec.CronJob = &feastdevv1alpha1.FeastCronJob{ + fsCopy.Spec.CronJob = &feastdevv1.FeastCronJob{ Annotations: map[string]string{ "test-annotation": "test-value", "another-annotation": "another-value", @@ -450,18 +450,18 @@ func cronJobWithAnnotations(featureStore *feastdevv1alpha1.FeatureStore) *feastd return fsCopy } -func cronJobWithEmptyAnnotations(featureStore *feastdevv1alpha1.FeatureStore) *feastdevv1alpha1.FeatureStore { +func cronJobWithEmptyAnnotations(featureStore *feastdevv1.FeatureStore) *feastdevv1.FeatureStore { fsCopy := featureStore.DeepCopy() - fsCopy.Spec.CronJob = &feastdevv1alpha1.FeastCronJob{ + fsCopy.Spec.CronJob = &feastdevv1.FeastCronJob{ Annotations: map[string]string{}, Schedule: "0 0 * * *", } return fsCopy } -func cronJobWithoutAnnotations(featureStore *feastdevv1alpha1.FeatureStore) *feastdevv1alpha1.FeatureStore { +func cronJobWithoutAnnotations(featureStore *feastdevv1.FeatureStore) *feastdevv1.FeatureStore { fsCopy := featureStore.DeepCopy() - fsCopy.Spec.CronJob = &feastdevv1alpha1.FeastCronJob{ + fsCopy.Spec.CronJob = &feastdevv1.FeastCronJob{ Schedule: "0 0 * * *", } return fsCopy @@ -485,7 +485,7 @@ var typeNamespacedName = types.NamespacedName{ Namespace: "default", } -func initContext() (context.Context, *feastdevv1alpha1.FeatureStore) { +func initContext() (context.Context, *feastdevv1.FeatureStore) { ctx := context.Background() featurestore := createFeatureStore() @@ -520,7 +520,7 @@ var _ = Describe("FeatureStore API", func() { }) It("should fail when db persistence type is invalid", func() { - attemptInvalidCreationAndAsserts(ctx, onlineStoreWithDBPersistenceType("invalid", featurestore), "Unsupported value: \"invalid\": supported values: "+quotedSlice(feastdevv1alpha1.ValidOnlineStoreDBStorePersistenceTypes)) + attemptInvalidCreationAndAsserts(ctx, onlineStoreWithDBPersistenceType("invalid", featurestore), "Unsupported value: \"invalid\": supported values: "+quotedSlice(feastdevv1.ValidOnlineStoreDBStorePersistenceTypes)) }) }) @@ -531,7 +531,7 @@ var _ = Describe("FeatureStore API", func() { attemptInvalidCreationAndAsserts(ctx, offlineStoreWithUnmanagedFileType(featurestore), "Unsupported value") }) It("should fail when db persistence type is invalid", func() { - attemptInvalidCreationAndAsserts(ctx, offlineStoreWithDBPersistenceType("invalid", featurestore), "Unsupported value: \"invalid\": supported values: "+quotedSlice(feastdevv1alpha1.ValidOfflineStoreDBStorePersistenceTypes)) + attemptInvalidCreationAndAsserts(ctx, offlineStoreWithDBPersistenceType("invalid", featurestore), "Unsupported value: \"invalid\": supported values: "+quotedSlice(feastdevv1.ValidOfflineStoreDBStorePersistenceTypes)) }) }) @@ -553,7 +553,7 @@ var _ = Describe("FeatureStore API", func() { attemptInvalidCreationAndAsserts(ctx, registryWithS3AdditionalKeywordsForGsBucket(featurestore), "Additional S3 settings are available only for S3 object store URIs") }) It("should fail when db persistence type is invalid", func() { - attemptInvalidCreationAndAsserts(ctx, registryStoreWithDBPersistenceType("invalid", featurestore), "Unsupported value: \"invalid\": supported values: "+quotedSlice(feastdevv1alpha1.ValidRegistryDBStorePersistenceTypes)) + attemptInvalidCreationAndAsserts(ctx, registryStoreWithDBPersistenceType("invalid", featurestore), "Unsupported value: \"invalid\": supported values: "+quotedSlice(feastdevv1.ValidRegistryDBStorePersistenceTypes)) }) }) @@ -613,13 +613,13 @@ var _ = Describe("FeatureStore API", func() { BeforeEach(func() { By("verifying the custom resource FeatureStore is not there") - resource := &feastdevv1alpha1.FeatureStore{} + resource := &feastdevv1.FeatureStore{} err := k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err != nil && errors.IsNotFound(err)).To(BeTrue()) }) AfterEach(func() { By("Cleaning up the test resource") - resource := &feastdevv1alpha1.FeatureStore{} + resource := &feastdevv1.FeatureStore{} err := k8sClient.Get(ctx, typeNamespacedName, resource) if err == nil { Expect(k8sClient.Delete(ctx, resource)).To(Succeed()) @@ -680,13 +680,13 @@ var _ = Describe("FeatureStore API", func() { BeforeEach(func() { By("verifying the custom resource FeatureStore is not there") - resource := &feastdevv1alpha1.FeatureStore{} + resource := &feastdevv1.FeatureStore{} err := k8sClient.Get(ctx, typeNamespacedName, resource) Expect(err != nil && errors.IsNotFound(err)).To(BeTrue()) }) AfterEach(func() { By("Cleaning up the test resource") - resource := &feastdevv1alpha1.FeatureStore{} + resource := &feastdevv1.FeatureStore{} err := k8sClient.Get(ctx, typeNamespacedName, resource) if err == nil { Expect(k8sClient.Delete(ctx, resource)).To(Succeed()) diff --git a/infra/feast-operator/test/api/suite_test.go b/infra/feast-operator/test/api/suite_test.go index e8c46a240c1..558068a7957 100644 --- a/infra/feast-operator/test/api/suite_test.go +++ b/infra/feast-operator/test/api/suite_test.go @@ -25,7 +25,7 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - feastdevv1alpha1 "github.com/feast-dev/feast/infra/feast-operator/api/v1alpha1" + feastdevv1 "github.com/feast-dev/feast/infra/feast-operator/api/v1" "k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/rest" "sigs.k8s.io/controller-runtime/pkg/client" @@ -71,7 +71,7 @@ var _ = BeforeSuite(func() { Expect(err).NotTo(HaveOccurred()) Expect(cfg).NotTo(BeNil()) - err = feastdevv1alpha1.AddToScheme(scheme.Scheme) + err = feastdevv1.AddToScheme(scheme.Scheme) Expect(err).NotTo(HaveOccurred()) // +kubebuilder:scaffold:scheme diff --git a/infra/feast-operator/test/data-source-types/data_source_types_test.go b/infra/feast-operator/test/data-source-types/data_source_types_test.go index 8448b2c4212..09d71239349 100644 --- a/infra/feast-operator/test/data-source-types/data_source_types_test.go +++ b/infra/feast-operator/test/data-source-types/data_source_types_test.go @@ -9,7 +9,7 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - feastdevv1alpha1 "github.com/feast-dev/feast/infra/feast-operator/api/v1alpha1" + feastdevv1 "github.com/feast-dev/feast/infra/feast-operator/api/v1" "github.com/feast-dev/feast/infra/feast-operator/internal/controller/services" ) @@ -23,16 +23,16 @@ var _ = Describe("FeatureStore Data Source Types", func() { Context("When checking against the python code in feast.repo_config", func() { It("should match defined registry persistence types in the operator", func() { registryFilePersistenceTypes := []string{string(services.RegistryFileConfigType)} - registryPersistenceTypes := append(feastdevv1alpha1.ValidRegistryDBStorePersistenceTypes, registryFilePersistenceTypes...) + registryPersistenceTypes := append(feastdevv1.ValidRegistryDBStorePersistenceTypes, registryFilePersistenceTypes...) checkPythonPersistenceTypes("registry.out", registryPersistenceTypes) }) It("should match defined onlineStore persistence types in the operator", func() { onlineFilePersistenceTypes := []string{string(services.OnlineSqliteConfigType)} - onlinePersistenceTypes := append(feastdevv1alpha1.ValidOnlineStoreDBStorePersistenceTypes, onlineFilePersistenceTypes...) + onlinePersistenceTypes := append(feastdevv1.ValidOnlineStoreDBStorePersistenceTypes, onlineFilePersistenceTypes...) checkPythonPersistenceTypes("online-store.out", onlinePersistenceTypes) }) It("should match defined offlineStore persistence types in the operator", func() { - offlinePersistenceTypes := append(feastdevv1alpha1.ValidOfflineStoreDBStorePersistenceTypes, feastdevv1alpha1.ValidOfflineStoreFilePersistenceTypes...) + offlinePersistenceTypes := append(feastdevv1.ValidOfflineStoreDBStorePersistenceTypes, feastdevv1.ValidOfflineStoreFilePersistenceTypes...) checkPythonPersistenceTypes("offline-store.out", offlinePersistenceTypes) }) }) diff --git a/infra/feast-operator/test/e2e/e2e_test.go b/infra/feast-operator/test/e2e/e2e_test.go index fb2ce69992a..4515dcccc9f 100644 --- a/infra/feast-operator/test/e2e/e2e_test.go +++ b/infra/feast-operator/test/e2e/e2e_test.go @@ -40,12 +40,12 @@ var _ = Describe("controller", Ordered, func() { applyAndMaterializeTest := "TestApplyAndMaterializeFeastDefinitions" runTestDeploySimpleCRFunc := utils.GetTestDeploySimpleCRFunc("/test/e2e", - "test/testdata/feast_integration_test_crs/v1alpha1_default_featurestore.yaml", + "test/testdata/feast_integration_test_crs/v1_default_featurestore.yaml", featureStoreName, feastResourceName, feastK8sResourceNames, namespace) runTestWithRemoteRegistryFunction := utils.GetTestWithRemoteRegistryFunc("/test/e2e", - "test/testdata/feast_integration_test_crs/v1alpha1_default_featurestore.yaml", - "test/testdata/feast_integration_test_crs/v1alpha1_remote_registry_featurestore.yaml", + "test/testdata/feast_integration_test_crs/v1_default_featurestore.yaml", + "test/testdata/feast_integration_test_crs/v1_remote_registry_featurestore.yaml", featureStoreName, feastResourceName, feastK8sResourceNames, namespace) runTestApplyAndMaterializeFunc := utils.RunTestApplyAndMaterializeFunc("/test/e2e", namespace, "credit-scoring", utils.FeastPrefix+"credit-scoring") diff --git a/infra/feast-operator/test/e2e_rhoai/resources/feast_kube_auth.yaml b/infra/feast-operator/test/e2e_rhoai/resources/feast_kube_auth.yaml index 2ec348c63db..fae126b528a 100644 --- a/infra/feast-operator/test/e2e_rhoai/resources/feast_kube_auth.yaml +++ b/infra/feast-operator/test/e2e_rhoai/resources/feast_kube_auth.yaml @@ -13,7 +13,7 @@ stringData: echo: false pool_pre_ping: true --- -apiVersion: feast.dev/v1alpha1 +apiVersion: feast.dev/v1 kind: FeatureStore metadata: name: credit-scoring diff --git a/infra/feast-operator/test/testdata/feast_integration_test_crs/feast.yaml b/infra/feast-operator/test/testdata/feast_integration_test_crs/feast.yaml index 70fb133050c..9dec3831b8c 100644 --- a/infra/feast-operator/test/testdata/feast_integration_test_crs/feast.yaml +++ b/infra/feast-operator/test/testdata/feast_integration_test_crs/feast.yaml @@ -13,7 +13,7 @@ stringData: echo: false pool_pre_ping: true --- -apiVersion: feast.dev/v1alpha1 +apiVersion: feast.dev/v1 kind: FeatureStore metadata: name: credit-scoring diff --git a/infra/feast-operator/test/testdata/feast_integration_test_crs/v1alpha1_default_featurestore.yaml b/infra/feast-operator/test/testdata/feast_integration_test_crs/v1_default_featurestore.yaml similarity index 86% rename from infra/feast-operator/test/testdata/feast_integration_test_crs/v1alpha1_default_featurestore.yaml rename to infra/feast-operator/test/testdata/feast_integration_test_crs/v1_default_featurestore.yaml index 9edf1dd9664..f0011b9b287 100644 --- a/infra/feast-operator/test/testdata/feast_integration_test_crs/v1alpha1_default_featurestore.yaml +++ b/infra/feast-operator/test/testdata/feast_integration_test_crs/v1_default_featurestore.yaml @@ -1,4 +1,4 @@ -apiVersion: feast.dev/v1alpha1 +apiVersion: feast.dev/v1 kind: FeatureStore metadata: name: simple-feast-setup diff --git a/infra/feast-operator/test/testdata/feast_integration_test_crs/v1alpha1_remote_registry_featurestore.yaml b/infra/feast-operator/test/testdata/feast_integration_test_crs/v1_remote_registry_featurestore.yaml similarity index 89% rename from infra/feast-operator/test/testdata/feast_integration_test_crs/v1alpha1_remote_registry_featurestore.yaml rename to infra/feast-operator/test/testdata/feast_integration_test_crs/v1_remote_registry_featurestore.yaml index e90d9142a5a..61891d5c5f0 100644 --- a/infra/feast-operator/test/testdata/feast_integration_test_crs/v1alpha1_remote_registry_featurestore.yaml +++ b/infra/feast-operator/test/testdata/feast_integration_test_crs/v1_remote_registry_featurestore.yaml @@ -1,4 +1,4 @@ -apiVersion: feast.dev/v1alpha1 +apiVersion: feast.dev/v1 kind: FeatureStore metadata: name: simple-feast-remote-setup diff --git a/infra/feast-operator/test/utils/test_util.go b/infra/feast-operator/test/utils/test_util.go index a98719a4f2e..88359aab862 100644 --- a/infra/feast-operator/test/utils/test_util.go +++ b/infra/feast-operator/test/utils/test_util.go @@ -16,7 +16,7 @@ import ( appsv1 "k8s.io/api/apps/v1" "github.com/feast-dev/feast/infra/feast-operator/api/feastversion" - "github.com/feast-dev/feast/infra/feast-operator/api/v1alpha1" + v1 "github.com/feast-dev/feast/infra/feast-operator/api/v1" ) const ( @@ -46,7 +46,7 @@ func checkIfFeatureStoreCustomResourceConditionsInReady(featureStoreName, namesp } // Parse the JSON into FeatureStore - var resource v1alpha1.FeatureStore + var resource v1.FeatureStore if err := json.Unmarshal(out.Bytes(), &resource); err != nil { return fmt.Errorf("failed to parse the resource JSON. Error: %v", err) } @@ -206,7 +206,7 @@ func isFeatureStoreHavingRemoteRegistry(namespace, featureStoreName string) (boo } // Parse the JSON into a map - var registryConfig v1alpha1.Registry + var registryConfig v1.Registry if err := json.Unmarshal([]byte(result), ®istryConfig); err != nil { return false, err // Return false on JSON parsing failure } @@ -429,7 +429,18 @@ func DeleteOperatorDeployment(testDir string) { func DeployPreviousVersionOperator() { var err error - cmd := exec.Command("kubectl", "apply", "-f", fmt.Sprintf("https://raw.githubusercontent.com/feast-dev/feast/refs/tags/v%s/infra/feast-operator/dist/install.yaml", feastversion.FeastVersion)) + // Clean up existing CRD first to avoid version conflicts + // This is necessary because the existing CRD might have versions in storedVersions + // that the previous version's CRD doesn't support + By("Cleaning up existing CRD to avoid version conflicts") + cmd := exec.Command("kubectl", "delete", "crd", "featurestores.feast.dev", "--ignore-not-found=true") + _, err = Run(cmd, "/test/upgrade") + ExpectWithOffset(1, err).NotTo(HaveOccurred()) + + // Wait a moment for CRD deletion to complete + time.Sleep(2 * time.Second) + + cmd = exec.Command("kubectl", "apply", "-f", fmt.Sprintf("https://raw.githubusercontent.com/feast-dev/feast/refs/tags/v%s/infra/feast-operator/dist/install.yaml", feastversion.FeastVersion)) _, err = Run(cmd, "/test/upgrade") ExpectWithOffset(1, err).NotTo(HaveOccurred()) @@ -447,6 +458,7 @@ func GetSimplePreviousVerCR() string { } // GetRemoteRegistryPreviousVerCR - Get The previous version remote registry CR for tests +// Note: Previous version (v0.57.0) uses v1alpha1 API, so we use v1alpha1_* file names func GetRemoteRegistryPreviousVerCR() string { return fmt.Sprintf("https://raw.githubusercontent.com/feast-dev/feast/refs/tags/v%s/infra/feast-operator/test/testdata/feast_integration_test_crs/v1alpha1_remote_registry_featurestore.yaml", feastversion.FeastVersion) } diff --git a/sdk/python/tests/registry_rest_api_tests/resource/feast_config_credit_scoring.yaml b/sdk/python/tests/registry_rest_api_tests/resource/feast_config_credit_scoring.yaml index f75fb4c031e..f7eae5353fd 100644 --- a/sdk/python/tests/registry_rest_api_tests/resource/feast_config_credit_scoring.yaml +++ b/sdk/python/tests/registry_rest_api_tests/resource/feast_config_credit_scoring.yaml @@ -13,7 +13,7 @@ stringData: echo: false pool_pre_ping: true --- -apiVersion: feast.dev/v1alpha1 +apiVersion: feast.dev/v1 kind: FeatureStore metadata: name: credit-scoring diff --git a/sdk/python/tests/registry_rest_api_tests/resource/feast_config_driver_ranking.yaml b/sdk/python/tests/registry_rest_api_tests/resource/feast_config_driver_ranking.yaml index 6341a6e4eed..e2de7bc1683 100644 --- a/sdk/python/tests/registry_rest_api_tests/resource/feast_config_driver_ranking.yaml +++ b/sdk/python/tests/registry_rest_api_tests/resource/feast_config_driver_ranking.yaml @@ -1,4 +1,4 @@ -apiVersion: feast.dev/v1alpha1 +apiVersion: feast.dev/v1 kind: FeatureStore metadata: name: driver-ranking diff --git a/sdk/python/tests/registry_rest_api_tests/resource/feast_config_rhoai.yaml b/sdk/python/tests/registry_rest_api_tests/resource/feast_config_rhoai.yaml index 247f23acabf..c6c63ab8073 100644 --- a/sdk/python/tests/registry_rest_api_tests/resource/feast_config_rhoai.yaml +++ b/sdk/python/tests/registry_rest_api_tests/resource/feast_config_rhoai.yaml @@ -8,7 +8,7 @@ stringData: AWS_SECRET_ACCESS_KEY: AWS_SECRET_KEY_PLACEHOLDER AWS_DEFAULT_REGION: us-east-1 --- -apiVersion: feast.dev/v1alpha1 +apiVersion: feast.dev/v1 kind: FeatureStore metadata: name: test-s3