From bacb19a760138696e09994782ff4c2742c22d19d Mon Sep 17 00:00:00 2001 From: Francisco Javier Arceo Date: Fri, 10 Jan 2025 17:02:02 -0500 Subject: [PATCH] removing modified files Signed-off-by: Francisco Javier Arceo --- Makefile | 661 +----------------- .../feature_repo/data/driver_stats.parquet | Bin 35187 -> 0 bytes sdk/python/feast/repo_config.py | 2 +- .../feature_repos/repo_configuration.py | 1 - 4 files changed, 18 insertions(+), 646 deletions(-) delete mode 100644 examples/rag/feature_repo/data/driver_stats.parquet diff --git a/Makefile b/Makefile index 7c96ddecbd..8252f48d46 100644 --- a/Makefile +++ b/Makefile @@ -107,13 +107,26 @@ test-python-unit: test-python-integration: python -m pytest --tb=short -v -n 8 --integration --color=yes --durations=10 --timeout=1200 --timeout_method=thread --dist loadgroup \ -k "(not snowflake or not test_historical_features_main)" \ - sdk/python/tests/integration/online_store/test_universal_online.py::test_online_retrieval_success + -m "not rbac_remote_integration_test" \ + --log-cli-level=INFO -s \ + sdk/python/tests test-python-integration-local: FEAST_IS_LOCAL_TEST=True \ FEAST_LOCAL_ONLINE_CONTAINER=True \ python -m pytest --tb=short -v -n 8 --color=yes --integration --durations=10 --timeout=1200 --timeout_method=thread --dist loadgroup \ -k "not test_lambda_materialization and not test_snowflake_materialization" \ + -m "not rbac_remote_integration_test" \ + --log-cli-level=INFO -s \ + sdk/python/tests + +test-python-integration-rbac-remote: + FEAST_IS_LOCAL_TEST=True \ + FEAST_LOCAL_ONLINE_CONTAINER=True \ + python -m pytest --tb=short -v -n 8 --color=yes --integration --durations=10 --timeout=1200 --timeout_method=thread --dist loadgroup \ + -k "not test_lambda_materialization and not test_snowflake_materialization" \ + -m "rbac_remote_integration_test" \ + --log-cli-level=INFO -s \ sdk/python/tests test-python-integration-container: @@ -361,652 +374,12 @@ test-python-universal-elasticsearch-online: not test_universal_types and \ not test_snowflake" \ sdk/python/tests -# -# Copyright 2019 The Feast Authors -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST)))) - -# install tools in project (tool) dir to not pollute the system -TOOL_DIR := $(ROOT_DIR)/tools -export GOBIN=$(TOOL_DIR)/bin -export PATH := $(TOOL_DIR)/bin:$(PATH) - -MVN := mvn -f java/pom.xml ${MAVEN_EXTRA_OPTS} -OS := linux -ifeq ($(shell uname -s), Darwin) - OS = osx -endif -TRINO_VERSION ?= 376 -PYTHON_VERSION = ${shell python --version | grep -Eo '[0-9]\.[0-9]+'} - -PYTHON_VERSIONS := 3.9 3.10 3.11 - -define get_env_name -$(subst .,,py$(1)) -endef - - -# General -$(TOOL_DIR): - mkdir -p $@/bin - -format: format-python format-java - -lint: lint-python lint-java - -test: test-python-unit test-java - -protos: compile-protos-python compile-protos-docs - -build: protos build-java build-docker - -# Python SDK - local -# formerly install-python-ci-dependencies-uv-venv -# editable install -install-python-dependencies-dev: - uv pip sync sdk/python/requirements/py$(PYTHON_VERSION)-ci-requirements.txt - uv pip install --no-deps -e . - -# Python SDK - system -# the --system flag installs dependencies in the global python context -# instead of a venv which is useful when working in a docker container or ci. - -# Used in github actions/ci -# formerly install-python-ci-dependencies-uv -install-python-dependencies-ci: - uv pip sync --system sdk/python/requirements/py$(PYTHON_VERSION)-ci-requirements.txt - uv pip install --system --no-deps -e . - -# Used by multicloud/Dockerfile.dev -install-python-ci-dependencies: - python -m piptools sync sdk/python/requirements/py$(PYTHON_VERSION)-ci-requirements.txt - pip install --no-deps -e . - -# Currently used in test-end-to-end.sh -install-python: - python -m piptools sync sdk/python/requirements/py$(PYTHON_VERSION)-requirements.txt - python setup.py develop - -lock-python-dependencies-all: - # Remove all existing requirements because we noticed the lock file is not always updated correctly. - # Removing and running the command again ensures that the lock file is always up to date. - rm -rf sdk/python/requirements/* 2>/dev/null || true - - $(foreach ver,$(PYTHON_VERSIONS),\ - pixi run --environment $(call get_env_name,$(ver)) --manifest-path infra/scripts/pixi/pixi.toml \ - "uv pip compile -p $(ver) --system --no-strip-extras setup.py \ - --output-file sdk/python/requirements/py$(ver)-requirements.txt" && \ - pixi run --environment $(call get_env_name,$(ver)) --manifest-path infra/scripts/pixi/pixi.toml \ - "uv pip compile -p $(ver) --system --no-strip-extras setup.py --extra ci \ - --output-file sdk/python/requirements/py$(ver)-ci-requirements.txt" && \ - ) true - - -compile-protos-python: - python infra/scripts/generate_protos.py - -benchmark-python: - IS_TEST=True python -m pytest --integration --benchmark --benchmark-autosave --benchmark-save-data sdk/python/tests - -benchmark-python-local: - IS_TEST=True FEAST_IS_LOCAL_TEST=True python -m pytest --integration --benchmark --benchmark-autosave --benchmark-save-data sdk/python/tests - -test-python-unit: - python -m pytest -n 8 --color=yes sdk/python/tests - -test-python-integration: - python -m pytest --tb=short -v -n 8 --integration --color=yes --durations=10 --timeout=1200 --timeout_method=thread --dist loadgroup \ - -k "(not snowflake or not test_historical_features_main)" \ - sdk/python/tests/integration/online_store/test_universal_online.py::test_online_retrieval_success - -test-python-integration-local: - FEAST_IS_LOCAL_TEST=True \ - FEAST_LOCAL_ONLINE_CONTAINER=True \ - python -m pytest --tb=short -v -n 8 --color=yes --integration --durations=10 --timeout=1200 --timeout_method=thread --dist loadgroup \ - -k "not test_lambda_materialization and not test_snowflake_materialization" \ - -m "not rbac_remote_integration_test" \ - --log-cli-level=INFO -s \ - sdk/python/tests - -test-python-integration-rbac-remote: - FEAST_IS_LOCAL_TEST=True \ - FEAST_LOCAL_ONLINE_CONTAINER=True \ - python -m pytest --tb=short -v -n 8 --color=yes --integration --durations=10 --timeout=1200 --timeout_method=thread --dist loadgroup \ - -k "not test_lambda_materialization and not test_snowflake_materialization" \ - -m "rbac_remote_integration_test" \ - --log-cli-level=INFO -s \ - sdk/python/tests - -test-python-integration-container: - @(docker info > /dev/null 2>&1 && \ - FEAST_LOCAL_ONLINE_CONTAINER=True \ - python -m pytest -n 8 --integration sdk/python/tests \ - ) || echo "This script uses Docker, and it isn't running - please start the Docker Daemon and try again!"; - -test-python-universal-spark: - PYTHONPATH='.' \ - FULL_REPO_CONFIGS_MODULE=sdk.python.feast.infra.offline_stores.contrib.spark_repo_configuration \ - PYTEST_PLUGINS=feast.infra.offline_stores.contrib.spark_offline_store.tests \ - python -m pytest -n 8 --integration \ - -k "not test_historical_retrieval_fails_on_validation and \ - not test_historical_retrieval_with_validation and \ - not test_historical_features_persisting and \ - not test_historical_retrieval_fails_on_validation and \ - not test_universal_cli and \ - not test_go_feature_server and \ - not test_feature_logging and \ - not test_reorder_columns and \ - not test_logged_features_validation and \ - not test_lambda_materialization_consistency and \ - not test_offline_write and \ - not test_push_features_to_offline_store.py and \ - not gcs_registry and \ - not s3_registry and \ - not test_universal_types and \ - not test_snowflake" \ - sdk/python/tests - -test-python-universal-trino: - PYTHONPATH='.' \ - FULL_REPO_CONFIGS_MODULE=sdk.python.feast.infra.offline_stores.contrib.trino_repo_configuration \ - PYTEST_PLUGINS=feast.infra.offline_stores.contrib.trino_offline_store.tests \ - python -m pytest -n 8 --integration \ - -k "not test_historical_retrieval_fails_on_validation and \ - not test_historical_retrieval_with_validation and \ - not test_historical_features_persisting and \ - not test_historical_retrieval_fails_on_validation and \ - not test_universal_cli and \ - not test_go_feature_server and \ - not test_feature_logging and \ - not test_reorder_columns and \ - not test_logged_features_validation and \ - not test_lambda_materialization_consistency and \ - not test_offline_write and \ - not test_push_features_to_offline_store.py and \ - not gcs_registry and \ - not s3_registry and \ - not test_universal_types and \ - not test_snowflake" \ - sdk/python/tests - - -# Note: to use this, you'll need to have Microsoft ODBC 17 installed. -# See https://docs.microsoft.com/en-us/sql/connect/odbc/linux-mac/install-microsoft-odbc-driver-sql-server-macos?view=sql-server-ver15#17 -test-python-universal-mssql: - PYTHONPATH='.' \ - FULL_REPO_CONFIGS_MODULE=sdk.python.feast.infra.offline_stores.contrib.mssql_repo_configuration \ - PYTEST_PLUGINS=feast.infra.offline_stores.contrib.mssql_offline_store.tests \ - FEAST_LOCAL_ONLINE_CONTAINER=True \ - python -m pytest -n 8 --integration \ - -k "not gcs_registry and \ - not s3_registry and \ - not test_lambda_materialization and \ - not test_snowflake and \ - not test_historical_features_persisting and \ - not validation and \ - not test_feature_service_logging" \ - sdk/python/tests - - -# To use Athena as an offline store, you need to create an Athena database and an S3 bucket on AWS. -# https://docs.aws.amazon.com/athena/latest/ug/getting-started.html -# Modify environment variables ATHENA_REGION, ATHENA_DATA_SOURCE, ATHENA_DATABASE, ATHENA_WORKGROUP or -# ATHENA_S3_BUCKET_NAME according to your needs. If tests fail with the pytest -n 8 option, change the number to 1. -test-python-universal-athena: - PYTHONPATH='.' \ - FULL_REPO_CONFIGS_MODULE=sdk.python.feast.infra.offline_stores.contrib.athena_repo_configuration \ - PYTEST_PLUGINS=feast.infra.offline_stores.contrib.athena_offline_store.tests \ - ATHENA_REGION=ap-northeast-2 \ - ATHENA_DATA_SOURCE=AwsDataCatalog \ - ATHENA_DATABASE=default \ - ATHENA_WORKGROUP=primary \ - ATHENA_S3_BUCKET_NAME=feast-int-bucket \ - python -m pytest -n 8 --integration \ - -k "not test_go_feature_server and \ - not test_logged_features_validation and \ - not test_lambda and \ - not test_feature_logging and \ - not test_offline_write and \ - not test_push_offline and \ - not test_historical_retrieval_with_validation and \ - not test_historical_features_persisting and \ - not test_historical_retrieval_fails_on_validation and \ - not gcs_registry and \ - not s3_registry and \ - not test_snowflake" \ - sdk/python/tests -test-python-universal-postgres-offline: +test-python-universal-milvus-online: PYTHONPATH='.' \ - FULL_REPO_CONFIGS_MODULE=sdk.python.feast.infra.offline_stores.contrib.postgres_repo_configuration \ - PYTEST_PLUGINS=sdk.python.feast.infra.offline_stores.contrib.postgres_offline_store.tests \ + FULL_REPO_CONFIGS_MODULE=sdk.python.feast.infra.online_stores.milvus_online_store.milvus_repo_configuration \ + PYTEST_PLUGINS=sdk.python.tests.integration.feature_repos.universal.online_store.milvus \ python -m pytest -n 8 --integration \ - -k "not test_historical_retrieval_with_validation and \ - not test_historical_features_persisting and \ - not test_universal_cli and \ - not test_go_feature_server and \ - not test_feature_logging and \ - not test_reorder_columns and \ - not test_logged_features_validation and \ - not test_lambda_materialization_consistency and \ - not test_offline_write and \ - not test_push_features_to_offline_store and \ - not gcs_registry and \ - not s3_registry and \ - not test_snowflake and \ - not test_universal_types" \ - sdk/python/tests - -test-python-universal-postgres-online: - PYTHONPATH='.' \ - FULL_REPO_CONFIGS_MODULE=sdk.python.feast.infra.online_stores.postgres_online_store.postgres_repo_configuration \ - PYTEST_PLUGINS=sdk.python.tests.integration.feature_repos.universal.online_store.postgres \ - python -m pytest -n 8 --integration \ - -k "not test_universal_cli and \ - not test_go_feature_server and \ - not test_feature_logging and \ - not test_reorder_columns and \ - not test_logged_features_validation and \ - not test_lambda_materialization_consistency and \ - not test_offline_write and \ - not test_push_features_to_offline_store and \ - not gcs_registry and \ - not s3_registry and \ - not test_universal_types and \ - not test_snowflake" \ - sdk/python/tests - - test-python-universal-pgvector-online: - PYTHONPATH='.' \ - FULL_REPO_CONFIGS_MODULE=sdk.python.feast.infra.online_stores.postgres_online_store.pgvector_repo_configuration \ - PYTEST_PLUGINS=sdk.python.tests.integration.feature_repos.universal.online_store.postgres \ - python -m pytest -n 8 --integration \ - -k "not test_universal_cli and \ - not test_go_feature_server and \ - not test_feature_logging and \ - not test_reorder_columns and \ - not test_logged_features_validation and \ - not test_lambda_materialization_consistency and \ - not test_offline_write and \ - not test_push_features_to_offline_store and \ - not gcs_registry and \ - not s3_registry and \ - not test_universal_types and \ - not test_validation and \ - not test_spark_materialization_consistency and \ - not test_historical_features_containing_backfills and \ - not test_snowflake" \ - sdk/python/tests - -test-python-universal-mysql-online: - PYTHONPATH='.' \ - FULL_REPO_CONFIGS_MODULE=sdk.python.feast.infra.online_stores.mysql_online_store.mysql_repo_configuration \ - PYTEST_PLUGINS=sdk.python.tests.integration.feature_repos.universal.online_store.mysql \ - python -m pytest -n 8 --integration \ - -k "not test_universal_cli and \ - not test_go_feature_server and \ - not test_feature_logging and \ - not test_reorder_columns and \ - not test_logged_features_validation and \ - not test_lambda_materialization_consistency and \ - not test_offline_write and \ - not test_push_features_to_offline_store and \ - not gcs_registry and \ - not s3_registry and \ - not test_universal_types and \ - not test_snowflake" \ - sdk/python/tests - -test-python-universal-cassandra: - PYTHONPATH='.' \ - FULL_REPO_CONFIGS_MODULE=sdk.python.feast.infra.online_stores.cassandra_online_store.cassandra_repo_configuration \ - PYTEST_PLUGINS=sdk.python.tests.integration.feature_repos.universal.online_store.cassandra \ - python -m pytest -x --integration \ - sdk/python/tests/integration/offline_store/test_feature_logging.py \ - --ignore=sdk/python/tests/integration/offline_store/test_validation.py \ - -k "not test_snowflake and \ - not test_spark_materialization_consistency and \ - not test_universal_materialization" - -test-python-universal-hazelcast: - PYTHONPATH='.' \ - FULL_REPO_CONFIGS_MODULE=sdk.python.feast.infra.online_stores.hazelcast_online_store.hazelcast_repo_configuration \ - PYTEST_PLUGINS=sdk.python.tests.integration.feature_repos.universal.online_store.hazelcast \ - python -m pytest -n 8 --integration \ - -k "not test_universal_cli and \ - not test_go_feature_server and \ - not test_feature_logging and \ - not test_reorder_columns and \ - not test_logged_features_validation and \ - not test_lambda_materialization_consistency and \ - not test_offline_write and \ - not test_push_features_to_offline_store and \ - not gcs_registry and \ - not s3_registry and \ - not test_universal_types and \ - not test_snowflake" \ - sdk/python/tests - -test-python-universal-cassandra-no-cloud-providers: - PYTHONPATH='.' \ - FULL_REPO_CONFIGS_MODULE=sdk.python.feast.infra.online_stores.cassandra_online_store.cassandra_repo_configuration \ - PYTEST_PLUGINS=sdk.python.tests.integration.feature_repos.universal.online_store.cassandra \ - python -m pytest -x --integration \ - -k "not test_lambda_materialization_consistency and \ - not test_apply_entity_integration and \ - not test_apply_feature_view_integration and \ - not test_apply_entity_integration and \ - not test_apply_feature_view_integration and \ - not test_apply_data_source_integration and \ - not test_nullable_online_store and \ - not gcs_registry and \ - not s3_registry and \ - not test_snowflake" \ - sdk/python/tests - -test-python-universal-elasticsearch-online: - PYTHONPATH='.' \ - FULL_REPO_CONFIGS_MODULE=sdk.python.feast.infra.online_stores.elasticsearch_online_store.elasticsearch_repo_configuration \ - PYTEST_PLUGINS=sdk.python.tests.integration.feature_repos.universal.online_store.elasticsearch \ - python -m pytest -n 8 --integration \ - -k "not test_universal_cli and \ - not test_go_feature_server and \ - not test_feature_logging and \ - not test_reorder_columns and \ - not test_logged_features_validation and \ - not test_lambda_materialization_consistency and \ - not test_offline_write and \ - not test_push_features_to_offline_store and \ - not gcs_registry and \ - not s3_registry and \ - not test_universal_types and \ - not test_snowflake" \ - sdk/python/tests - -test-python-universal-milvus-online: - PYTHONPATH='.' \ - FULL_REPO_CONFIGS_MODULE=sdk.python.feast.infra.online_stores.milvus_online_store.milvus_repo_configuration \ - PYTEST_PLUGINS=sdk.python.tests.integration.feature_repos.universal.online_store.milvus \ - python -m pytest --integration \ - -k "test_retrieve_online_milvus_documents" \ - sdk/python/tests --ignore=sdk/python/tests/integration/offline_store/test_dqm_validation.py - -test-python-universal-singlestore-online: - PYTHONPATH='.' \ - FULL_REPO_CONFIGS_MODULE=sdk.python.feast.infra.online_stores.singlestore_repo_configuration \ - PYTEST_PLUGINS=sdk.python.tests.integration.feature_repos.universal.online_store.singlestore \ - python -m pytest -n 8 --integration \ - -k "not test_universal_cli and \ - not gcs_registry and \ - not s3_registry and \ - not test_snowflake" \ - sdk/python/tests - -test-python-universal-qdrant-online: - PYTHONPATH='.' \ - FULL_REPO_CONFIGS_MODULE=sdk.python.feast.infra.online_stores.qdrant_online_store.qdrant_repo_configuration \ - PYTEST_PLUGINS=sdk.python.tests.integration.feature_repos.universal.online_store.qdrant \ - python -m pytest -n 8 --integration \ - -k "test_retrieve_online_documents" \ - sdk/python/tests/integration/online_store/test_universal_online.py - -test-python-universal-couchbase-online: - PYTHONPATH='.' \ - FULL_REPO_CONFIGS_MODULE=sdk.python.feast.infra.online_stores.contrib.couchbase_repo_configuration \ - PYTEST_PLUGINS=sdk.python.tests.integration.feature_repos.universal.online_store.couchbase \ - python -m pytest -n 8 --integration \ - -k "not test_universal_cli and \ - not test_go_feature_server and \ - not test_feature_logging and \ - not test_reorder_columns and \ - not test_logged_features_validation and \ - not test_lambda_materialization_consistency and \ - not test_offline_write and \ - not test_push_features_to_offline_store and \ - not gcs_registry and \ - not s3_registry and \ - not test_universal_types and \ - not test_snowflake" \ - sdk/python/tests - -test-python-universal: - python -m pytest -n 8 --integration sdk/python/tests - -format-python: - cd ${ROOT_DIR}/sdk/python; python -m ruff check --fix feast/ tests/ - cd ${ROOT_DIR}/sdk/python; python -m ruff format feast/ tests/ - -lint-python: - cd ${ROOT_DIR}/sdk/python; python -m mypy feast - cd ${ROOT_DIR}/sdk/python; python -m ruff check feast/ tests/ - cd ${ROOT_DIR}/sdk/python; python -m ruff format --check feast/ tests -# Java - -install-java-ci-dependencies: - ${MVN} verify clean --fail-never - -format-java: - ${MVN} spotless:apply - -lint-java: - ${MVN} --no-transfer-progress spotless:check - -test-java: - ${MVN} --no-transfer-progress -DskipITs=true test - -test-java-integration: - ${MVN} --no-transfer-progress -Dmaven.javadoc.skip=true -Dgpg.skip -DskipUTs=true clean verify - -test-java-with-coverage: - ${MVN} --no-transfer-progress -DskipITs=true test jacoco:report-aggregate - -build-java: - ${MVN} clean verify - -build-java-no-tests: - ${MVN} --no-transfer-progress -Dmaven.javadoc.skip=true -Dgpg.skip -DskipUTs=true -DskipITs=true -Drevision=${REVISION} clean package - -# Trino plugin -start-trino-locally: - cd ${ROOT_DIR}; docker run --detach --rm -p 8080:8080 --name trino -v ${ROOT_DIR}/sdk/python/feast/infra/offline_stores/contrib/trino_offline_store/test_config/properties/:/etc/catalog/:ro trinodb/trino:${TRINO_VERSION} - sleep 15 - -test-trino-plugin-locally: - cd ${ROOT_DIR}/sdk/python; FULL_REPO_CONFIGS_MODULE=feast.infra.offline_stores.contrib.trino_offline_store.test_config.manual_tests IS_TEST=True python -m pytest --integration tests/ - -kill-trino-locally: - cd ${ROOT_DIR}; docker stop trino - -# Docker - -build-docker: build-feature-server-python-aws-docker build-feature-transformation-server-docker build-feature-server-java-docker - -push-ci-docker: - docker push $(REGISTRY)/feast-ci:$(VERSION) - -push-feature-server-docker: - docker push $(REGISTRY)/feature-server:$$VERSION - -build-feature-server-docker: - docker buildx build --build-arg VERSION=$$VERSION \ - -t $(REGISTRY)/feature-server:$$VERSION \ - -f sdk/python/feast/infra/feature_servers/multicloud/Dockerfile --load . - -push-feature-transformation-server-docker: - docker push $(REGISTRY)/feature-transformation-server:$(VERSION) - -build-feature-transformation-server-docker: - docker buildx build --build-arg VERSION=$(VERSION) \ - -t $(REGISTRY)/feature-transformation-server:$(VERSION) \ - -f sdk/python/feast/infra/transformation_servers/Dockerfile --load . - -push-feature-server-java-docker: - docker push $(REGISTRY)/feature-server-java:$(VERSION) - -build-feature-server-java-docker: - docker buildx build --build-arg VERSION=$(VERSION) \ - -t $(REGISTRY)/feature-server-java:$(VERSION) \ - -f java/infra/docker/feature-server/Dockerfile --load . - -push-feast-helm-operator-docker: - cd infra/feast-helm-operator && \ - IMAGE_TAG_BASE=$(REGISTRY)/feast-helm-operator \ - VERSION=$(VERSION) \ - $(MAKE) docker-push - -build-feast-helm-operator-docker: - cd infra/feast-helm-operator && \ - IMAGE_TAG_BASE=$(REGISTRY)/feast-helm-operator \ - VERSION=$(VERSION) \ - $(MAKE) docker-build - -push-feast-operator-docker: - cd infra/feast-operator && \ - IMAGE_TAG_BASE=$(REGISTRY)/feast-operator \ - VERSION=$(VERSION) \ - $(MAKE) docker-push - -build-feast-operator-docker: - cd infra/feast-operator && \ - IMAGE_TAG_BASE=$(REGISTRY)/feast-operator \ - VERSION=$(VERSION) \ - $(MAKE) docker-build - -# Dev images - -build-feature-server-dev: - docker buildx build --build-arg VERSION=dev \ - -t feastdev/feature-server:dev \ - -f sdk/python/feast/infra/feature_servers/multicloud/Dockerfile.dev --load . - -build-java-docker-dev: - make build-java-no-tests REVISION=dev - docker buildx build --build-arg VERSION=dev \ - -t feastdev/feature-transformation-server:dev \ - -f sdk/python/feast/infra/transformation_servers/Dockerfile --load . - docker buildx build --build-arg VERSION=dev \ - -t feastdev/feature-server-java:dev \ - -f java/infra/docker/feature-server/Dockerfile.dev --load . - -# Documentation - -install-dependencies-proto-docs: - cd ${ROOT_DIR}/protos; - mkdir -p $$HOME/bin - mkdir -p $$HOME/include - go get github.com/golang/protobuf/proto && \ - go get github.com/russross/blackfriday/v2 && \ - cd $$(mktemp -d) && \ - git clone https://github.com/istio/tools/ && \ - cd tools/cmd/protoc-gen-docs && \ - go build && \ - cp protoc-gen-docs $$HOME/bin && \ - cd $$HOME && curl -OL https://github.com/protocolbuffers/protobuf/releases/download/v3.11.2/protoc-3.11.2-${OS}-x86_64.zip && \ - unzip protoc-3.11.2-${OS}-x86_64.zip -d protoc3 && \ - mv protoc3/bin/* $$HOME/bin/ && \ - chmod +x $$HOME/bin/protoc && \ - mv protoc3/include/* $$HOME/include - -compile-protos-docs: - rm -rf $(ROOT_DIR)/dist/grpc - mkdir -p dist/grpc; - cd ${ROOT_DIR}/protos && protoc --docs_out=../dist/grpc feast/*/*.proto - -build-sphinx: compile-protos-python - cd $(ROOT_DIR)/sdk/python/docs && $(MAKE) build-api-source - -build-templates: - python infra/scripts/compile-templates.py - -build-helm-docs: - cd ${ROOT_DIR}/infra/charts/feast; helm-docs - cd ${ROOT_DIR}/infra/charts/feast-feature-server; helm-docs - -# Web UI - -# Note: requires node and yarn to be installed -build-ui: - cd $(ROOT_DIR)/sdk/python/feast/ui && yarn upgrade @feast-dev/feast-ui --latest && yarn install && npm run build --omit=dev - - - -# Go SDK & embedded -PB_REL = https://github.com/protocolbuffers/protobuf/releases -PB_VERSION = 3.11.2 -PB_ARCH := $(shell uname -m) -ifeq ($(PB_ARCH), arm64) - PB_ARCH=aarch_64 -endif -PB_PROTO_FOLDERS=core registry serving types storage - -$(TOOL_DIR)/protoc-$(PB_VERSION)-$(OS)-$(PB_ARCH).zip: $(TOOL_DIR) - cd $(TOOL_DIR) && \ - curl -LO $(PB_REL)/download/v$(PB_VERSION)/protoc-$(PB_VERSION)-$(OS)-$(PB_ARCH).zip - -.PHONY: install-go-proto-dependencies -install-go-proto-dependencies: $(TOOL_DIR)/protoc-$(PB_VERSION)-$(OS)-$(PB_ARCH).zip - unzip -u $(TOOL_DIR)/protoc-$(PB_VERSION)-$(OS)-$(PB_ARCH).zip -d $(TOOL_DIR) - go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.31.0 - go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.3.0 - -.PHONY: compile-protos-go -compile-protos-go: install-go-proto-dependencies - $(foreach folder,$(PB_PROTO_FOLDERS), \ - protoc --proto_path=$(ROOT_DIR)/protos \ - --go_out=$(ROOT_DIR)/go/protos \ - --go_opt=module=github.com/feast-dev/feast/go/protos \ - --go-grpc_out=$(ROOT_DIR)/go/protos \ - --go-grpc_opt=module=github.com/feast-dev/feast/go/protos $(ROOT_DIR)/protos/feast/$(folder)/*.proto; ) true - -#install-go-ci-dependencies: - # go install golang.org/x/tools/cmd/goimports - # python -m pip install "pybindgen==0.22.1" "grpcio-tools>=1.56.2,<2" "mypy-protobuf>=3.1" - -.PHONY: build-go -build-go: compile-protos-go - go build -o feast ./go/main.go - -.PHONY: install-feast-ci-locally -install-feast-ci-locally: - uv pip install -e ".[ci]" - -.PHONY: test-go -test-go: compile-protos-go install-feast-ci-locally compile-protos-python - CGO_ENABLED=1 go test -coverprofile=coverage.out ./... && go tool cover -html=coverage.out -o coverage.html - -.PHONY: format-go -format-go: - gofmt -s -w go/ - -.PHONY: lint-go -lint-go: compile-protos-go - go vet ./go/internal/feast - -.PHONY: build-go-docker-dev -build-go-docker-dev: - docker buildx build --build-arg VERSION=dev \ - -t feastdev/feature-server-go:dev \ - -f go/infra/docker/feature-server/Dockerfile --load . - - -test-python-universal-milvus-online: - PYTHONPATH='.' \ - FULL_REPO_CONFIGS_MODULE=sdk.python.feast.infra.online_stores.milvus_online_store.milvus_repo_configuration \ - PYTEST_PLUGINS=sdk.python.tests.integration.feature_repos.universal.online_store.milvus \ - python -m pytest --integration \ -k "test_retrieve_online_milvus_documents" \ sdk/python/tests --ignore=sdk/python/tests/integration/offline_store/test_dqm_validation.py diff --git a/examples/rag/feature_repo/data/driver_stats.parquet b/examples/rag/feature_repo/data/driver_stats.parquet deleted file mode 100644 index eaef42755853514697c57e6c4278865af0e923c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35187 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 Icp=vR2N(CekN^Mx diff --git a/sdk/python/feast/repo_config.py b/sdk/python/feast/repo_config.py index d422945c81..2b8d5174e1 100644 --- a/sdk/python/feast/repo_config.py +++ b/sdk/python/feast/repo_config.py @@ -60,7 +60,7 @@ "feast.infra.online_stores.contrib.ikv_online_store.ikv.IKVOnlineStore": "feast.infra.online_stores.ikv_online_store.ikv.IKVOnlineStore", "feast.infra.online_stores.contrib.elasticsearch.ElasticSearchOnlineStore": "feast.infra.online_stores.elasticsearch_online_store.ElasticSearchOnlineStore", "feast.infra.online_stores.contrib.singlestore_online_store.singlestore.SingleStoreOnlineStore": "feast.infra.online_stores.singlestore_online_store.singlestore.SingleStoreOnlineStore", - # "feast.infra.online_stores.contrib.qdrant.QdrantOnlineStore": "feast.infra.online_stores.cqdrant.QdrantOnlineStore", + "feast.infra.online_stores.contrib.qdrant.QdrantOnlineStore": "feast.infra.online_stores.cqdrant.QdrantOnlineStore", } ONLINE_STORE_CLASS_FOR_TYPE = { diff --git a/sdk/python/tests/integration/feature_repos/repo_configuration.py b/sdk/python/tests/integration/feature_repos/repo_configuration.py index 1999d098f1..54129f23c6 100644 --- a/sdk/python/tests/integration/feature_repos/repo_configuration.py +++ b/sdk/python/tests/integration/feature_repos/repo_configuration.py @@ -214,7 +214,6 @@ "dynamodb": (DYNAMO_CONFIG, DynamoDBOnlineStoreCreator), "datastore": ("datastore", DatastoreOnlineStoreCreator), "bigtable": ("bigtable", BigtableOnlineStoreCreator), - # "milvus:": (MILVUS_CONFIG, MilvusOnlineStoreCreator), } for key, replacement in replacements.items():