frogml-cli 0.0.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- frogml_cli/__init__.py +10 -0
- frogml_cli/cli.py +40 -0
- frogml_cli/commands/__init__.py +0 -0
- frogml_cli/commands/_logic/__init__.py +0 -0
- frogml_cli/commands/_logic/tools.py +6 -0
- frogml_cli/commands/alerts/__init__.py +0 -0
- frogml_cli/commands/alerts/alerts_commnad_group.py +18 -0
- frogml_cli/commands/alerts/delete/__init__.py +0 -0
- frogml_cli/commands/alerts/delete/_logic.py +5 -0
- frogml_cli/commands/alerts/delete/ui.py +10 -0
- frogml_cli/commands/alerts/list/__init__.py +0 -0
- frogml_cli/commands/alerts/list/_logic.py +23 -0
- frogml_cli/commands/alerts/list/ui.py +17 -0
- frogml_cli/commands/alerts/register/__init__.py +0 -0
- frogml_cli/commands/alerts/register/_logic.py +72 -0
- frogml_cli/commands/alerts/register/ui.py +30 -0
- frogml_cli/commands/audience/__init__.py +0 -0
- frogml_cli/commands/audience/_logic/__init__.py +0 -0
- frogml_cli/commands/audience/_logic/config/__init__.py +0 -0
- frogml_cli/commands/audience/_logic/config/config_base.py +15 -0
- frogml_cli/commands/audience/_logic/config/parser.py +30 -0
- frogml_cli/commands/audience/_logic/config/v1/__init__.py +0 -0
- frogml_cli/commands/audience/_logic/config/v1/audience_config.py +25 -0
- frogml_cli/commands/audience/_logic/config/v1/conditions_config.py +59 -0
- frogml_cli/commands/audience/_logic/config/v1/config_v1.py +23 -0
- frogml_cli/commands/audience/_logic/config/v1/route_config.py +15 -0
- frogml_cli/commands/audience/_logic/config/v1/spec.py +9 -0
- frogml_cli/commands/audience/audience_api_dump.py +86 -0
- frogml_cli/commands/audience/audience_commands_group.py +30 -0
- frogml_cli/commands/audience/create/__init__.py +0 -0
- frogml_cli/commands/audience/create/logic.py +41 -0
- frogml_cli/commands/audience/create/ui.py +21 -0
- frogml_cli/commands/audience/delete/__init__.py +0 -0
- frogml_cli/commands/audience/delete/logic.py +13 -0
- frogml_cli/commands/audience/delete/ui.py +17 -0
- frogml_cli/commands/audience/get/__init__.py +0 -0
- frogml_cli/commands/audience/get/logic.py +14 -0
- frogml_cli/commands/audience/get/ui.py +25 -0
- frogml_cli/commands/audience/list/__init__.py +0 -0
- frogml_cli/commands/audience/list/logic.py +16 -0
- frogml_cli/commands/audience/list/ui.py +26 -0
- frogml_cli/commands/audience/update/__init__.py +0 -0
- frogml_cli/commands/audience/update/logic.py +37 -0
- frogml_cli/commands/audience/update/ui.py +26 -0
- frogml_cli/commands/auto_scalling/__init__.py +0 -0
- frogml_cli/commands/auto_scalling/_logic/__init__.py +0 -0
- frogml_cli/commands/auto_scalling/_logic/config/__init__.py +3 -0
- frogml_cli/commands/auto_scalling/_logic/config/config.py +152 -0
- frogml_cli/commands/auto_scalling/_logic/config/parser.py +21 -0
- frogml_cli/commands/auto_scalling/attach/__init__.py +0 -0
- frogml_cli/commands/auto_scalling/attach/_logic.py +43 -0
- frogml_cli/commands/auto_scalling/attach/ui.py +21 -0
- frogml_cli/commands/auto_scalling/autoscaling_commands_group.py +15 -0
- frogml_cli/commands/automations/__init__.py +0 -0
- frogml_cli/commands/automations/automations_commands_group.py +30 -0
- frogml_cli/commands/automations/delete/__init__.py +0 -0
- frogml_cli/commands/automations/delete/_logic.py +6 -0
- frogml_cli/commands/automations/delete/ui.py +23 -0
- frogml_cli/commands/automations/executions/__init__.py +0 -0
- frogml_cli/commands/automations/executions/executions_commands_group.py +14 -0
- frogml_cli/commands/automations/executions/list/__init__.py +0 -0
- frogml_cli/commands/automations/executions/list/_logic.py +8 -0
- frogml_cli/commands/automations/executions/list/ui.py +27 -0
- frogml_cli/commands/automations/list/__init__.py +0 -0
- frogml_cli/commands/automations/list/_logic.py +36 -0
- frogml_cli/commands/automations/list/ui.py +21 -0
- frogml_cli/commands/automations/register/__init__.py +0 -0
- frogml_cli/commands/automations/register/_logic.py +43 -0
- frogml_cli/commands/automations/register/ui.py +44 -0
- frogml_cli/commands/config/__init__.py +0 -0
- frogml_cli/commands/config/add/__init__.py +0 -0
- frogml_cli/commands/config/add/ui.py +62 -0
- frogml_cli/commands/config/config_commands_group.py +11 -0
- frogml_cli/commands/feature_store/__init__.py +0 -0
- frogml_cli/commands/feature_store/backfill/__init__.py +0 -0
- frogml_cli/commands/feature_store/backfill/_logic.py +140 -0
- frogml_cli/commands/feature_store/backfill/ui.py +129 -0
- frogml_cli/commands/feature_store/delete/__init__.py +0 -0
- frogml_cli/commands/feature_store/delete/_logic.py +107 -0
- frogml_cli/commands/feature_store/delete/ui.py +40 -0
- frogml_cli/commands/feature_store/execution/__init__.py +0 -0
- frogml_cli/commands/feature_store/execution/ui.py +19 -0
- frogml_cli/commands/feature_store/feature_store_command_group.py +29 -0
- frogml_cli/commands/feature_store/list/__init__.py +0 -0
- frogml_cli/commands/feature_store/list/ui.py +140 -0
- frogml_cli/commands/feature_store/pause/__init__.py +0 -0
- frogml_cli/commands/feature_store/pause/ui.py +18 -0
- frogml_cli/commands/feature_store/register/__init__.py +0 -0
- frogml_cli/commands/feature_store/register/_logic.py +369 -0
- frogml_cli/commands/feature_store/register/ui.py +111 -0
- frogml_cli/commands/feature_store/resume/__init__.py +0 -0
- frogml_cli/commands/feature_store/resume/ui.py +18 -0
- frogml_cli/commands/feature_store/trigger/__init__.py +0 -0
- frogml_cli/commands/feature_store/trigger/ui.py +39 -0
- frogml_cli/commands/models/__init__.py +0 -0
- frogml_cli/commands/models/build/__init__.py +0 -0
- frogml_cli/commands/models/build/_logic/__init__.py +0 -0
- frogml_cli/commands/models/build/_logic/build_steps.py +42 -0
- frogml_cli/commands/models/build/_logic/client_logs/__init__.py +0 -0
- frogml_cli/commands/models/build/_logic/client_logs/cli_phase_run_handler.py +123 -0
- frogml_cli/commands/models/build/_logic/client_logs/cli_trigger_build_logger.py +19 -0
- frogml_cli/commands/models/build/_logic/client_logs/logger.py +88 -0
- frogml_cli/commands/models/build/_logic/client_logs/messages.py +36 -0
- frogml_cli/commands/models/build/_logic/client_logs/spinner.py +14 -0
- frogml_cli/commands/models/build/_logic/client_logs/trigger_build_logger.py +54 -0
- frogml_cli/commands/models/build/_logic/client_logs/utils.py +12 -0
- frogml_cli/commands/models/build/_logic/phase/__init__.py +0 -0
- frogml_cli/commands/models/build/_logic/phase/a_fetch_model_code/__init__.py +20 -0
- frogml_cli/commands/models/build/_logic/phase/a_fetch_model_code/get_sdk_version_step.py +15 -0
- frogml_cli/commands/models/build/_logic/phase/b_remote_register_frogml_build/__init__.py +16 -0
- frogml_cli/commands/models/build/_logic/phase/c_deploy/__init__.py +6 -0
- frogml_cli/commands/models/build/_logic/phase/c_deploy/build_polling_status.py +55 -0
- frogml_cli/commands/models/build/_logic/phase/c_deploy/deploy_build.py +61 -0
- frogml_cli/commands/models/build/_logic/util/__init__.py +0 -0
- frogml_cli/commands/models/build/_logic/util/protobuf_factory.py +45 -0
- frogml_cli/commands/models/build/_logic/util/step_decorator.py +60 -0
- frogml_cli/commands/models/build/_logic/util/text.py +9 -0
- frogml_cli/commands/models/build/_logic/wait_until_finished.py +27 -0
- frogml_cli/commands/models/build/ui.py +337 -0
- frogml_cli/commands/models/builds/__init__.py +0 -0
- frogml_cli/commands/models/builds/builds_commands_group.py +16 -0
- frogml_cli/commands/models/builds/cancel/__init__.py +0 -0
- frogml_cli/commands/models/builds/cancel/_logic.py +5 -0
- frogml_cli/commands/models/builds/cancel/ui.py +15 -0
- frogml_cli/commands/models/builds/logs/__init__.py +0 -0
- frogml_cli/commands/models/builds/logs/ui.py +35 -0
- frogml_cli/commands/models/builds/status/__init__.py +0 -0
- frogml_cli/commands/models/builds/status/_logic.py +6 -0
- frogml_cli/commands/models/builds/status/ui.py +39 -0
- frogml_cli/commands/models/create/__init__.py +0 -0
- frogml_cli/commands/models/create/_logic.py +40 -0
- frogml_cli/commands/models/create/ui.py +46 -0
- frogml_cli/commands/models/delete/__init__.py +0 -0
- frogml_cli/commands/models/delete/_logic.py +18 -0
- frogml_cli/commands/models/delete/ui.py +25 -0
- frogml_cli/commands/models/deployments/__init__.py +0 -0
- frogml_cli/commands/models/deployments/deploy/__init__.py +0 -0
- frogml_cli/commands/models/deployments/deploy/_logic/__init__.py +0 -0
- frogml_cli/commands/models/deployments/deploy/_logic/advance_deployment_options_handler.py +31 -0
- frogml_cli/commands/models/deployments/deploy/_logic/base_deploy_executor.py +70 -0
- frogml_cli/commands/models/deployments/deploy/_logic/deploy_config.py +261 -0
- frogml_cli/commands/models/deployments/deploy/_logic/deployment.py +407 -0
- frogml_cli/commands/models/deployments/deploy/_logic/deployment_message_helpers.py +116 -0
- frogml_cli/commands/models/deployments/deploy/_logic/deployment_response_handler.py +156 -0
- frogml_cli/commands/models/deployments/deploy/_logic/deployment_size_mapper.py +98 -0
- frogml_cli/commands/models/deployments/deploy/_logic/get_latest_successful_build.py +28 -0
- frogml_cli/commands/models/deployments/deploy/_logic/local_deployment.py +193 -0
- frogml_cli/commands/models/deployments/deploy/batch/__init__.py +0 -0
- frogml_cli/commands/models/deployments/deploy/batch/_logic/__init__.py +0 -0
- frogml_cli/commands/models/deployments/deploy/batch/_logic/advanced_deployment_mapper.py +15 -0
- frogml_cli/commands/models/deployments/deploy/batch/_logic/deploy_executor.py +24 -0
- frogml_cli/commands/models/deployments/deploy/batch/ui.py +119 -0
- frogml_cli/commands/models/deployments/deploy/deploy_commands_group.py +19 -0
- frogml_cli/commands/models/deployments/deploy/realtime/__init__.py +0 -0
- frogml_cli/commands/models/deployments/deploy/realtime/_logic/__init__.py +0 -0
- frogml_cli/commands/models/deployments/deploy/realtime/_logic/advanced_deployment_mapper.py +21 -0
- frogml_cli/commands/models/deployments/deploy/realtime/_logic/deploy_executor.py +24 -0
- frogml_cli/commands/models/deployments/deploy/realtime/_logic/serving_strategy_mapper.py +75 -0
- frogml_cli/commands/models/deployments/deploy/realtime/ui.py +202 -0
- frogml_cli/commands/models/deployments/deploy/streaming/__init__.py +0 -0
- frogml_cli/commands/models/deployments/deploy/streaming/_logic/__init__.py +0 -0
- frogml_cli/commands/models/deployments/deploy/streaming/_logic/deploy_executor.py +24 -0
- frogml_cli/commands/models/deployments/deploy/streaming/_logic/serving_strategy_mapper.py +38 -0
- frogml_cli/commands/models/deployments/deploy/streaming/ui.py +206 -0
- frogml_cli/commands/models/deployments/undeploy/__init__.py +0 -0
- frogml_cli/commands/models/deployments/undeploy/_logic/__init__.py +0 -0
- frogml_cli/commands/models/deployments/undeploy/_logic/request_undeploy.py +249 -0
- frogml_cli/commands/models/deployments/undeploy/ui.py +61 -0
- frogml_cli/commands/models/describe/__init__.py +0 -0
- frogml_cli/commands/models/describe/_logic.py +169 -0
- frogml_cli/commands/models/describe/ui.py +35 -0
- frogml_cli/commands/models/executions/__init__.py +0 -0
- frogml_cli/commands/models/executions/cancel/__init__.py +0 -0
- frogml_cli/commands/models/executions/cancel/_logic.py +9 -0
- frogml_cli/commands/models/executions/cancel/ui.py +27 -0
- frogml_cli/commands/models/executions/execution_commands_group.py +24 -0
- frogml_cli/commands/models/executions/report/__init__.py +0 -0
- frogml_cli/commands/models/executions/report/_logic.py +14 -0
- frogml_cli/commands/models/executions/report/ui.py +43 -0
- frogml_cli/commands/models/executions/start/__init__.py +0 -0
- frogml_cli/commands/models/executions/start/_logic.py +83 -0
- frogml_cli/commands/models/executions/start/ui.py +208 -0
- frogml_cli/commands/models/executions/status/__init__.py +0 -0
- frogml_cli/commands/models/executions/status/_logic.py +13 -0
- frogml_cli/commands/models/executions/status/ui.py +27 -0
- frogml_cli/commands/models/init/__init__.py +0 -0
- frogml_cli/commands/models/init/_logic/__init__.py +0 -0
- frogml_cli/commands/models/init/_logic/initialize_model_structure.py +40 -0
- frogml_cli/commands/models/init/_logic/template/__init__.py +0 -0
- frogml_cli/commands/models/init/_logic/template/churn/__init__.py +0 -0
- frogml_cli/commands/models/init/_logic/template/churn/cookiecutter.json +3 -0
- frogml_cli/commands/models/init/_logic/template/churn/{{cookiecutter.model_directory}}/__init__.py +0 -0
- frogml_cli/commands/models/init/_logic/template/churn/{{cookiecutter.model_directory}}/main/__init__.py +5 -0
- frogml_cli/commands/models/init/_logic/template/churn/{{cookiecutter.model_directory}}/main/conda.yml +10 -0
- frogml_cli/commands/models/init/_logic/template/churn/{{cookiecutter.model_directory}}/main/data.csv +1001 -0
- frogml_cli/commands/models/init/_logic/template/churn/{{cookiecutter.model_directory}}/main/model.py +99 -0
- frogml_cli/commands/models/init/_logic/template/churn/{{cookiecutter.model_directory}}/tests/__init__.py +0 -0
- frogml_cli/commands/models/init/_logic/template/churn/{{cookiecutter.model_directory}}/tests/it/__init__.py +0 -0
- frogml_cli/commands/models/init/_logic/template/churn/{{cookiecutter.model_directory}}/tests/it/test_churn.py +32 -0
- frogml_cli/commands/models/init/_logic/template/credit_risk/__init__.py +0 -0
- frogml_cli/commands/models/init/_logic/template/credit_risk/cookiecutter.json +3 -0
- frogml_cli/commands/models/init/_logic/template/credit_risk/{{cookiecutter.model_directory}}/__init__.py +0 -0
- frogml_cli/commands/models/init/_logic/template/credit_risk/{{cookiecutter.model_directory}}/main/__init__.py +5 -0
- frogml_cli/commands/models/init/_logic/template/credit_risk/{{cookiecutter.model_directory}}/main/conda.yml +11 -0
- frogml_cli/commands/models/init/_logic/template/credit_risk/{{cookiecutter.model_directory}}/main/data.csv +1001 -0
- frogml_cli/commands/models/init/_logic/template/credit_risk/{{cookiecutter.model_directory}}/main/model.py +108 -0
- frogml_cli/commands/models/init/_logic/template/general/__init__.py +0 -0
- frogml_cli/commands/models/init/_logic/template/general/cookiecutter.json +6 -0
- frogml_cli/commands/models/init/_logic/template/general/{{cookiecutter.model_directory}}/__init__.py +0 -0
- frogml_cli/commands/models/init/_logic/template/general/{{cookiecutter.model_directory}}/{{cookiecutter.main_directory}}/__init__.py +5 -0
- frogml_cli/commands/models/init/_logic/template/general/{{cookiecutter.model_directory}}/{{cookiecutter.main_directory}}/conda.yml +8 -0
- frogml_cli/commands/models/init/_logic/template/general/{{cookiecutter.model_directory}}/{{cookiecutter.main_directory}}/model.py +66 -0
- frogml_cli/commands/models/init/_logic/template/general/{{cookiecutter.model_directory}}/{{cookiecutter.test_directory}}/__init__.py +0 -0
- frogml_cli/commands/models/init/_logic/template/general/{{cookiecutter.model_directory}}/{{cookiecutter.test_directory}}/test_qwak_model.py +5 -0
- frogml_cli/commands/models/init/_logic/template/titanic/__init__.py +0 -0
- frogml_cli/commands/models/init/_logic/template/titanic/cookiecutter.json +3 -0
- frogml_cli/commands/models/init/_logic/template/titanic/{{cookiecutter.model_directory}}/__init__.py +0 -0
- frogml_cli/commands/models/init/_logic/template/titanic/{{cookiecutter.model_directory}}/main/__init__.py +5 -0
- frogml_cli/commands/models/init/_logic/template/titanic/{{cookiecutter.model_directory}}/main/conda.yml +11 -0
- frogml_cli/commands/models/init/_logic/template/titanic/{{cookiecutter.model_directory}}/main/model.py +98 -0
- frogml_cli/commands/models/init/_logic/template/titanic/{{cookiecutter.model_directory}}/tests/__init__.py +0 -0
- frogml_cli/commands/models/init/_logic/template/titanic/{{cookiecutter.model_directory}}/tests/it/__init__.py +0 -0
- frogml_cli/commands/models/init/_logic/template/titanic/{{cookiecutter.model_directory}}/tests/it/test_titanic.py +24 -0
- frogml_cli/commands/models/init/_logic/template/titanic_poetry/__init__.py +0 -0
- frogml_cli/commands/models/init/_logic/template/titanic_poetry/cookiecutter.json +3 -0
- frogml_cli/commands/models/init/_logic/template/titanic_poetry/{{cookiecutter.model_directory}}/__init__.py +0 -0
- frogml_cli/commands/models/init/_logic/template/titanic_poetry/{{cookiecutter.model_directory}}/main/__init__.py +5 -0
- frogml_cli/commands/models/init/_logic/template/titanic_poetry/{{cookiecutter.model_directory}}/main/model.py +98 -0
- frogml_cli/commands/models/init/_logic/template/titanic_poetry/{{cookiecutter.model_directory}}/main/pyproject.toml +20 -0
- frogml_cli/commands/models/init/_logic/template/titanic_poetry/{{cookiecutter.model_directory}}/tests/__init__.py +0 -0
- frogml_cli/commands/models/init/_logic/template/titanic_poetry/{{cookiecutter.model_directory}}/tests/it/__init__.py +0 -0
- frogml_cli/commands/models/init/_logic/template/titanic_poetry/{{cookiecutter.model_directory}}/tests/it/test_titanic.py +25 -0
- frogml_cli/commands/models/init/ui.py +61 -0
- frogml_cli/commands/models/list/__init__.py +0 -0
- frogml_cli/commands/models/list/_logic.py +5 -0
- frogml_cli/commands/models/list/ui.py +41 -0
- frogml_cli/commands/models/list_models/__init__.py +0 -0
- frogml_cli/commands/models/list_models/_logic.py +11 -0
- frogml_cli/commands/models/list_models/ui.py +60 -0
- frogml_cli/commands/models/metadata/__init__.py +0 -0
- frogml_cli/commands/models/metadata/_logic.py +12 -0
- frogml_cli/commands/models/metadata/ui.py +60 -0
- frogml_cli/commands/models/models_command_group.py +44 -0
- frogml_cli/commands/models/runtime/__init__.py +0 -0
- frogml_cli/commands/models/runtime/logs/__init__.py +0 -0
- frogml_cli/commands/models/runtime/logs/ui.py +63 -0
- frogml_cli/commands/models/runtime/runtime_commands_group.py +17 -0
- frogml_cli/commands/models/runtime/update/__init__.py +0 -0
- frogml_cli/commands/models/runtime/update/_logic.py +9 -0
- frogml_cli/commands/models/runtime/update/ui.py +17 -0
- frogml_cli/commands/secrets/__init__.py +0 -0
- frogml_cli/commands/secrets/delete/__init__.py +0 -0
- frogml_cli/commands/secrets/delete/_logic.py +5 -0
- frogml_cli/commands/secrets/delete/ui.py +21 -0
- frogml_cli/commands/secrets/get/__init__.py +0 -0
- frogml_cli/commands/secrets/get/_logic.py +5 -0
- frogml_cli/commands/secrets/get/ui.py +17 -0
- frogml_cli/commands/secrets/secrets_commands_group.py +19 -0
- frogml_cli/commands/secrets/set/__init__.py +0 -0
- frogml_cli/commands/secrets/set/_logic.py +5 -0
- frogml_cli/commands/secrets/set/ui.py +16 -0
- frogml_cli/commands/ui_tools.py +18 -0
- frogml_cli/exceptions/__init__.py +14 -0
- frogml_cli/exceptions/frogml_command_exception.py +2 -0
- frogml_cli/exceptions/frogml_deploy_new_build_failed.py +5 -0
- frogml_cli/exceptions/frogml_resource_not_found.py +2 -0
- frogml_cli/inner/__init__.py +0 -0
- frogml_cli/inner/file_registry.py +98 -0
- frogml_cli/inner/tools/__init__.py +0 -0
- frogml_cli/inner/tools/cli_tools.py +179 -0
- frogml_cli/inner/tools/config_handler.py +29 -0
- frogml_cli/inner/tools/dataclasses_utils.py +21 -0
- frogml_cli/inner/tools/logger/__init__.py +3 -0
- frogml_cli/inner/tools/logger/logger.py +278 -0
- frogml_cli/inner/tools/logger/logging.yml +79 -0
- frogml_cli/inner/tools/tracking.py +47 -0
- frogml_cli/main.py +9 -0
- frogml_cli/tools/__init__.py +0 -0
- frogml_cli/tools/colors.py +13 -0
- frogml_cli/tools/const.py +3 -0
- frogml_cli/tools/files.py +63 -0
- frogml_cli/tools/log_handling.py +159 -0
- frogml_cli/tools/utils.py +45 -0
- frogml_cli-0.0.1.dist-info/METADATA +51 -0
- frogml_cli-0.0.1.dist-info/RECORD +287 -0
- frogml_cli-0.0.1.dist-info/WHEEL +4 -0
- frogml_cli-0.0.1.dist-info/entry_points.txt +3 -0
@@ -0,0 +1,44 @@
|
|
1
|
+
import os
|
2
|
+
from pathlib import Path
|
3
|
+
|
4
|
+
import click
|
5
|
+
|
6
|
+
from frogml_cli.commands.automations.register._logic import register_automations
|
7
|
+
from frogml_cli.inner.file_registry import list_qwak_python_files
|
8
|
+
from frogml_cli.inner.tools.cli_tools import FrogMLCommand
|
9
|
+
from frogml_cli.tools.utils import frogml_spinner
|
10
|
+
|
11
|
+
|
12
|
+
@click.command(
|
13
|
+
"register",
|
14
|
+
help="Register all automations object under the given path. Registered "
|
15
|
+
"automations will be visible on the Frogml management platform after registration",
|
16
|
+
cls=FrogMLCommand,
|
17
|
+
)
|
18
|
+
@click.option(
|
19
|
+
"--path",
|
20
|
+
"-p",
|
21
|
+
type=click.Path(exists=True),
|
22
|
+
metavar="PATH",
|
23
|
+
help="Directory / module where frogml automations objects are stored",
|
24
|
+
)
|
25
|
+
@click.option(
|
26
|
+
"--force",
|
27
|
+
"-f",
|
28
|
+
default=False,
|
29
|
+
is_flag=True,
|
30
|
+
metavar="FLAG",
|
31
|
+
help="Force register all found frogml automations Store objects",
|
32
|
+
)
|
33
|
+
def register(path: Path, force: bool, **kwargs):
|
34
|
+
path = Path(path) if path else Path.cwd()
|
35
|
+
if path.is_file():
|
36
|
+
qwak_python_files = [(str(path), os.path.abspath(path))]
|
37
|
+
elif Path.is_dir(path):
|
38
|
+
with frogml_spinner(
|
39
|
+
begin_text="Recursively looking for python files in input dir",
|
40
|
+
print_callback=print,
|
41
|
+
) as sp:
|
42
|
+
qwak_python_files = list_qwak_python_files(path, sp)
|
43
|
+
|
44
|
+
register_automations(qwak_python_files, force)
|
File without changes
|
File without changes
|
@@ -0,0 +1,62 @@
|
|
1
|
+
from typing import Optional
|
2
|
+
|
3
|
+
import click
|
4
|
+
from frogml.core.inner.di_configuration import UserAccountConfiguration
|
5
|
+
from frogml.core.inner.di_configuration.account import UserAccount
|
6
|
+
|
7
|
+
from frogml_cli.inner.tools.cli_tools import FrogMLCommand
|
8
|
+
|
9
|
+
|
10
|
+
@click.command("add", cls=FrogMLCommand, help="Adds a server configuration.")
|
11
|
+
@click.option("--url", metavar="BASE_URL", required=False, help="Artifactory base url")
|
12
|
+
@click.option(
|
13
|
+
"--username", metavar="USERNAME", required=False, help="The user's username"
|
14
|
+
)
|
15
|
+
@click.option(
|
16
|
+
"--password", metavar="PASSWORD", required=False, help="The user's password"
|
17
|
+
)
|
18
|
+
@click.option(
|
19
|
+
"--access-token",
|
20
|
+
metavar="ACCESS_TOKEN",
|
21
|
+
required=False,
|
22
|
+
help="Access token to authenticate",
|
23
|
+
)
|
24
|
+
@click.option(
|
25
|
+
"--interactive",
|
26
|
+
metavar="INTERACTIVE",
|
27
|
+
required=False,
|
28
|
+
help="Login with interactive flow",
|
29
|
+
default=False,
|
30
|
+
)
|
31
|
+
@click.option(
|
32
|
+
"--server-id",
|
33
|
+
metavar="SERVER_ID",
|
34
|
+
required=False,
|
35
|
+
help="The server id, if not provided, the server id will be auto generated as uuid.",
|
36
|
+
)
|
37
|
+
def add_config(
|
38
|
+
url: Optional[str],
|
39
|
+
username: Optional[str],
|
40
|
+
password: Optional[str],
|
41
|
+
access_token: Optional[str],
|
42
|
+
server_id: Optional[str],
|
43
|
+
interactive: Optional[bool],
|
44
|
+
**_,
|
45
|
+
):
|
46
|
+
if url is None and not interactive:
|
47
|
+
raise click.BadOptionUsage(
|
48
|
+
option_name="config add",
|
49
|
+
message="One of --interactive or --url must be provided",
|
50
|
+
)
|
51
|
+
account_config = UserAccountConfiguration()
|
52
|
+
account_config.configure_user(
|
53
|
+
UserAccount(
|
54
|
+
url=url,
|
55
|
+
username=username,
|
56
|
+
password=password,
|
57
|
+
token=access_token,
|
58
|
+
anonymous=False,
|
59
|
+
is_interactive=interactive,
|
60
|
+
server_id=server_id,
|
61
|
+
)
|
62
|
+
)
|
File without changes
|
File without changes
|
@@ -0,0 +1,140 @@
|
|
1
|
+
from datetime import datetime, timezone
|
2
|
+
from typing import Optional
|
3
|
+
|
4
|
+
from croniter import croniter
|
5
|
+
from frogml._proto.qwak.feature_store.features.feature_set_pb2 import FeatureSet
|
6
|
+
from frogml._proto.qwak.feature_store.features.feature_set_service_pb2 import (
|
7
|
+
GetFeatureSetByNameResponse,
|
8
|
+
)
|
9
|
+
from frogml.core.clients.feature_store import FeatureRegistryClient
|
10
|
+
from frogml.core.feature_store.execution.backfill import Backfill
|
11
|
+
from frogml.feature_store.feature_sets.batch import BatchFeatureSet
|
12
|
+
|
13
|
+
from frogml_cli.inner.tools.cli_tools import ask_yesno
|
14
|
+
from frogml_cli.tools.colors import Color
|
15
|
+
|
16
|
+
|
17
|
+
class _BackfillLogic:
|
18
|
+
featureset: FeatureSet
|
19
|
+
batch_featureset: BatchFeatureSet
|
20
|
+
|
21
|
+
def configure_window_backfill(
|
22
|
+
self,
|
23
|
+
featureset_name: str,
|
24
|
+
start_time: Optional[datetime] = None,
|
25
|
+
stop_time: Optional[datetime] = None,
|
26
|
+
comment: str = None,
|
27
|
+
cluster_template: str = None,
|
28
|
+
) -> Optional[Backfill]:
|
29
|
+
"""
|
30
|
+
Configures a window back-fill object. This type of backfill will not reset the entire featureset, but will be
|
31
|
+
performed from the requested start time to the requested stop time in ticks calculated according to the
|
32
|
+
feature sets scheduling policy.
|
33
|
+
@param featureset_name: feature set name to perform the backfill job for
|
34
|
+
@type featureset_name: str
|
35
|
+
@param start_time: backfill requested start date
|
36
|
+
@type start_time: optional[datetime]
|
37
|
+
@param stop_time:
|
38
|
+
@type stop_time: optional[datetime]
|
39
|
+
@param comment:
|
40
|
+
@type comment: str
|
41
|
+
@param cluster_template:
|
42
|
+
@type cluster_template: str
|
43
|
+
@return:
|
44
|
+
@rtype:
|
45
|
+
"""
|
46
|
+
print(
|
47
|
+
f"{Color.BLUE} Backfilling from {start_time} to {stop_time}, "
|
48
|
+
f"the following ticks are going to be performed {Color.END}"
|
49
|
+
)
|
50
|
+
zipped_tick_strs = Backfill.generate_expected_ticks_repr(
|
51
|
+
scheduling_policy=self.batch_featureset.scheduling_policy,
|
52
|
+
start_time=start_time,
|
53
|
+
stop_time=stop_time,
|
54
|
+
)
|
55
|
+
print("\n".join(zipped_tick_strs))
|
56
|
+
if ask_yesno("", force=False):
|
57
|
+
backfill_execution = Backfill(
|
58
|
+
featureset_name=featureset_name,
|
59
|
+
comment=comment,
|
60
|
+
cluster_template=cluster_template,
|
61
|
+
start_time=start_time,
|
62
|
+
stop_time=stop_time,
|
63
|
+
)
|
64
|
+
return backfill_execution
|
65
|
+
return None
|
66
|
+
|
67
|
+
@staticmethod
|
68
|
+
def _get_featureset_by_name(featureset_name: str) -> GetFeatureSetByNameResponse:
|
69
|
+
registry_client = FeatureRegistryClient()
|
70
|
+
|
71
|
+
return registry_client.get_feature_set_by_name(feature_set_name=featureset_name)
|
72
|
+
|
73
|
+
def get_start_stop_times(
|
74
|
+
self,
|
75
|
+
requested_start_time: Optional[datetime] = None,
|
76
|
+
requested_stop_time: Optional[datetime] = None,
|
77
|
+
) -> tuple:
|
78
|
+
start_time: datetime = (
|
79
|
+
requested_start_time or self.batch_featureset.backfill.start_date
|
80
|
+
).replace(tzinfo=timezone.utc)
|
81
|
+
stop_time: datetime
|
82
|
+
|
83
|
+
if start_time and start_time > datetime.now().replace(tzinfo=timezone.utc):
|
84
|
+
stop_time = datetime.utcnow().replace(tzinfo=timezone.utc)
|
85
|
+
else:
|
86
|
+
stop_time = (
|
87
|
+
requested_stop_time or datetime.utcnow().replace(tzinfo=timezone.utc)
|
88
|
+
).replace(tzinfo=timezone.utc)
|
89
|
+
|
90
|
+
return start_time, stop_time
|
91
|
+
|
92
|
+
def is_valid_input(
|
93
|
+
self,
|
94
|
+
reset_backfill: bool,
|
95
|
+
start_time: Optional[datetime],
|
96
|
+
stop_time: Optional[datetime],
|
97
|
+
featureset_name: str,
|
98
|
+
) -> bool:
|
99
|
+
# Validate reset_backfill or start and stop times
|
100
|
+
if (not reset_backfill and not start_time and not stop_time) or (
|
101
|
+
reset_backfill and (start_time or stop_time)
|
102
|
+
):
|
103
|
+
print(
|
104
|
+
f"{Color.RED} please specify either --reset-backfill or one or more of --start-time/--stop-time"
|
105
|
+
)
|
106
|
+
return False
|
107
|
+
|
108
|
+
# Validate featureset exists
|
109
|
+
get_featureset_resp = self._get_featureset_by_name(
|
110
|
+
featureset_name=featureset_name
|
111
|
+
)
|
112
|
+
if not get_featureset_resp or not get_featureset_resp.feature_set:
|
113
|
+
print(f"{Color.RED} Failed to retrieve featureset {featureset_name}")
|
114
|
+
return False
|
115
|
+
|
116
|
+
self.featureset = get_featureset_resp.feature_set
|
117
|
+
fs_type_attr: str = self.featureset.feature_set_definition.feature_set_spec.feature_set_type.WhichOneof(
|
118
|
+
"set_type"
|
119
|
+
)
|
120
|
+
# Validate featureset is batch v1
|
121
|
+
if fs_type_attr != "batch_feature_set_v1":
|
122
|
+
print(
|
123
|
+
f"{Color.RED} Feature set {featureset_name} is of type {fs_type_attr}. Only BatchV1 is supported."
|
124
|
+
)
|
125
|
+
return False
|
126
|
+
|
127
|
+
self.batch_featureset = BatchFeatureSet._from_proto(
|
128
|
+
self.featureset.feature_set_definition.feature_set_spec
|
129
|
+
)
|
130
|
+
|
131
|
+
# Validate scheduling policy
|
132
|
+
if not self.batch_featureset.scheduling_policy or not croniter.is_valid(
|
133
|
+
self.batch_featureset.scheduling_policy
|
134
|
+
):
|
135
|
+
print(
|
136
|
+
f"{Color.RED} Feature set {featureset_name} has an invalid scheduling policy {self.batch_featureset.scheduling_policy}."
|
137
|
+
)
|
138
|
+
return False
|
139
|
+
|
140
|
+
return True
|
@@ -0,0 +1,129 @@
|
|
1
|
+
from datetime import datetime
|
2
|
+
from typing import Optional
|
3
|
+
|
4
|
+
import click
|
5
|
+
from frogml.core.feature_store.execution.backfill import Backfill
|
6
|
+
|
7
|
+
from frogml_cli.commands.feature_store.backfill._logic import _BackfillLogic
|
8
|
+
from frogml_cli.inner.tools.cli_tools import FrogMLCommand, ask_yesno
|
9
|
+
from frogml_cli.tools.colors import Color
|
10
|
+
|
11
|
+
|
12
|
+
@click.command(
|
13
|
+
"backfill", cls=FrogMLCommand, help="Trigger a backfill process for a Feature Set"
|
14
|
+
)
|
15
|
+
@click.option(
|
16
|
+
"--feature-set",
|
17
|
+
"--name",
|
18
|
+
help="Feature Set name to perform the backfill process for",
|
19
|
+
required=True,
|
20
|
+
type=click.STRING,
|
21
|
+
)
|
22
|
+
@click.option(
|
23
|
+
"--reset-backfill",
|
24
|
+
"--reset",
|
25
|
+
is_flag=True,
|
26
|
+
metavar="FLAG",
|
27
|
+
default=False,
|
28
|
+
help="Perform a complete reset of the featuresets data. "
|
29
|
+
"This will result in the deletion of the current existing data.",
|
30
|
+
)
|
31
|
+
@click.option(
|
32
|
+
"--start-time",
|
33
|
+
type=click.DateTime(),
|
34
|
+
default=None,
|
35
|
+
required=False,
|
36
|
+
help="The time from which the featuresets data should be backfilled in UTC. "
|
37
|
+
"Defaults to the featuresets configured backfill start time.",
|
38
|
+
)
|
39
|
+
@click.option(
|
40
|
+
"--stop-time",
|
41
|
+
type=click.DateTime(),
|
42
|
+
default=None,
|
43
|
+
required=False,
|
44
|
+
help="The time up until the featuresets data should be backfilled in UTC. Defaults to the current timestamp. "
|
45
|
+
"If the time provided is in the future, stop time will be rounded down to the current time. ",
|
46
|
+
)
|
47
|
+
@click.option(
|
48
|
+
"--cluster-template",
|
49
|
+
type=str,
|
50
|
+
default=None,
|
51
|
+
required=False,
|
52
|
+
help="Backfill resource configuration, expects a ClusterType size. "
|
53
|
+
"Defaults to the featureset resource configuration",
|
54
|
+
)
|
55
|
+
@click.option(
|
56
|
+
"--comment",
|
57
|
+
type=str,
|
58
|
+
default=None,
|
59
|
+
required=False,
|
60
|
+
help="Backfill job optional comment tag line",
|
61
|
+
)
|
62
|
+
def backfill(
|
63
|
+
feature_set: str,
|
64
|
+
reset_backfill: bool,
|
65
|
+
start_time: Optional[datetime],
|
66
|
+
stop_time: Optional[datetime],
|
67
|
+
cluster_template: Optional[str],
|
68
|
+
comment: Optional[str],
|
69
|
+
**kwargs,
|
70
|
+
):
|
71
|
+
backill_logic = _BackfillLogic()
|
72
|
+
if not backill_logic.is_valid_input(
|
73
|
+
reset_backfill=reset_backfill,
|
74
|
+
start_time=start_time,
|
75
|
+
stop_time=stop_time,
|
76
|
+
featureset_name=feature_set,
|
77
|
+
):
|
78
|
+
return
|
79
|
+
|
80
|
+
if reset_backfill:
|
81
|
+
backfill_execution = _configure_backfill_triggered(
|
82
|
+
featureset_name=feature_set,
|
83
|
+
comment=comment,
|
84
|
+
cluster_template=cluster_template,
|
85
|
+
)
|
86
|
+
else:
|
87
|
+
start, stop = backill_logic.get_start_stop_times(
|
88
|
+
requested_start_time=start_time, requested_stop_time=stop_time
|
89
|
+
)
|
90
|
+
if start >= stop:
|
91
|
+
print(
|
92
|
+
f"{Color.RED} Stop time {stop.isoformat()} must be after start time {start.isoformat()}"
|
93
|
+
)
|
94
|
+
return
|
95
|
+
|
96
|
+
backfill_execution = backill_logic.configure_window_backfill(
|
97
|
+
featureset_name=feature_set,
|
98
|
+
start_time=start,
|
99
|
+
stop_time=stop,
|
100
|
+
comment=comment,
|
101
|
+
cluster_template=cluster_template,
|
102
|
+
)
|
103
|
+
|
104
|
+
if backfill_execution:
|
105
|
+
execution_id: str = backfill_execution.trigger_batch_backfill()
|
106
|
+
print(
|
107
|
+
f"{Color.BLUE}✅ Triggered backfill execution for featureset {feature_set}, "
|
108
|
+
f"execution id for follow up on is {execution_id}."
|
109
|
+
)
|
110
|
+
print(
|
111
|
+
f"To inquire the status of the execution run "
|
112
|
+
f"'frogml features execution-status --execution-id {execution_id}'"
|
113
|
+
)
|
114
|
+
|
115
|
+
|
116
|
+
def _configure_backfill_triggered(
|
117
|
+
featureset_name: str, comment: str, cluster_template: str
|
118
|
+
) -> Optional[Backfill]:
|
119
|
+
if ask_yesno(
|
120
|
+
f"You are about to remove and re-populate all data in {featureset_name}",
|
121
|
+
force=False,
|
122
|
+
):
|
123
|
+
print(f"{Color.RED} - A backfill reset was triggered")
|
124
|
+
return Backfill(
|
125
|
+
featureset_name=featureset_name,
|
126
|
+
comment=comment,
|
127
|
+
cluster_template=cluster_template,
|
128
|
+
)
|
129
|
+
return None
|
File without changes
|
@@ -0,0 +1,107 @@
|
|
1
|
+
from frogml._proto.qwak.feature_store.entities.entity_pb2 import (
|
2
|
+
Entity,
|
3
|
+
EntityDefinition,
|
4
|
+
)
|
5
|
+
from frogml._proto.qwak.feature_store.entities.entity_service_pb2 import (
|
6
|
+
GetEntityByNameResponse,
|
7
|
+
)
|
8
|
+
from frogml._proto.qwak.feature_store.features.feature_set_pb2 import FeatureSet
|
9
|
+
from frogml._proto.qwak.feature_store.features.feature_set_service_pb2 import (
|
10
|
+
GetFeatureSetByNameResponse,
|
11
|
+
)
|
12
|
+
from frogml.core.clients.feature_store import FeatureRegistryClient
|
13
|
+
from frogml.core.exceptions import FrogmlException
|
14
|
+
from frogml.feature_store._common.feature_set_utils import _INTERNAL_KEY_PREFIX
|
15
|
+
|
16
|
+
from frogml_cli.tools.colors import Color
|
17
|
+
|
18
|
+
FEATURE_SET = "feature_set"
|
19
|
+
ENTITY = "entity"
|
20
|
+
DATA_SOURCE = "data_source"
|
21
|
+
All = "all"
|
22
|
+
|
23
|
+
|
24
|
+
def _handle_featureset_key_deletion(
|
25
|
+
entity_definition: EntityDefinition, registry_client: FeatureRegistryClient
|
26
|
+
):
|
27
|
+
# If entity name start with the fs name
|
28
|
+
if entity_definition.entity_spec.name.startswith(_INTERNAL_KEY_PREFIX):
|
29
|
+
get_entity_resp: GetEntityByNameResponse = registry_client.get_entity_by_name(
|
30
|
+
entity_definition.entity_spec.name
|
31
|
+
)
|
32
|
+
|
33
|
+
# the entity exists
|
34
|
+
if get_entity_resp:
|
35
|
+
entity_id: str = entity_definition.entity_id
|
36
|
+
registered_entity: Entity = get_entity_resp.entity
|
37
|
+
|
38
|
+
# it has a no registered fs for it
|
39
|
+
if (
|
40
|
+
not registered_entity.feature_sets
|
41
|
+
or len(registered_entity.feature_sets) == 0
|
42
|
+
):
|
43
|
+
try:
|
44
|
+
# delete since it's a key and not an entity
|
45
|
+
registry_client.delete_entity(entity_id=entity_id)
|
46
|
+
# we fail this silently
|
47
|
+
except FrogmlException:
|
48
|
+
pass
|
49
|
+
|
50
|
+
|
51
|
+
def _inner_delete(name, object, registry_client):
|
52
|
+
if object == ENTITY:
|
53
|
+
feature_store_entity = registry_client.get_entity_by_name(name)
|
54
|
+
_delete_object(
|
55
|
+
lambda e: registry_client.delete_entity(
|
56
|
+
e.entity.entity_definition.entity_id
|
57
|
+
),
|
58
|
+
feature_store_entity,
|
59
|
+
"entity",
|
60
|
+
name,
|
61
|
+
)
|
62
|
+
if object == FEATURE_SET:
|
63
|
+
feature_set_response: GetFeatureSetByNameResponse = (
|
64
|
+
registry_client.get_feature_set_by_name(name)
|
65
|
+
)
|
66
|
+
if feature_set_response:
|
67
|
+
feature_set: FeatureSet = feature_set_response.feature_set
|
68
|
+
|
69
|
+
# Delete fs regardless
|
70
|
+
registry_client.delete_feature_set(
|
71
|
+
feature_set.feature_set_definition.feature_set_id
|
72
|
+
)
|
73
|
+
print(
|
74
|
+
f"{Color.GREEN}Feature Set '{name}' deletion request is being handled by the service"
|
75
|
+
)
|
76
|
+
|
77
|
+
entity: EntityDefinition = (
|
78
|
+
feature_set.feature_set_definition.feature_set_spec.entity
|
79
|
+
)
|
80
|
+
|
81
|
+
_handle_featureset_key_deletion(
|
82
|
+
entity_definition=entity, registry_client=registry_client
|
83
|
+
)
|
84
|
+
else:
|
85
|
+
print(
|
86
|
+
f"{Color.RED}Could not find specified feature set named '{name}' to delete{Color.END}"
|
87
|
+
)
|
88
|
+
if object == DATA_SOURCE:
|
89
|
+
feature_store_ds = registry_client.get_data_source_by_name(name)
|
90
|
+
_delete_object(
|
91
|
+
lambda e: registry_client.delete_data_source(
|
92
|
+
e.data_source.data_source_definition.data_source_id
|
93
|
+
),
|
94
|
+
feature_store_ds,
|
95
|
+
"data source",
|
96
|
+
name,
|
97
|
+
)
|
98
|
+
|
99
|
+
|
100
|
+
def _delete_object(delete_func, _object, _type, name):
|
101
|
+
if _object:
|
102
|
+
delete_func(_object)
|
103
|
+
print(f"{Color.GREEN}Successfully deleted the {_type} named '{name}'")
|
104
|
+
else:
|
105
|
+
print(
|
106
|
+
f"{Color.RED}Could not find specified {_type} named '{name}' to delete{Color.END}"
|
107
|
+
)
|
@@ -0,0 +1,40 @@
|
|
1
|
+
import click
|
2
|
+
from frogml.core.clients.feature_store import FeatureRegistryClient
|
3
|
+
|
4
|
+
from frogml_cli.commands.feature_store.delete._logic import (
|
5
|
+
DATA_SOURCE,
|
6
|
+
ENTITY,
|
7
|
+
FEATURE_SET,
|
8
|
+
_inner_delete,
|
9
|
+
)
|
10
|
+
from frogml_cli.inner.tools.cli_tools import FrogMLCommand
|
11
|
+
|
12
|
+
|
13
|
+
@click.command(
|
14
|
+
"delete",
|
15
|
+
cls=FrogMLCommand,
|
16
|
+
help="Delete by name a feature store object - a feature set, entity, or data source",
|
17
|
+
)
|
18
|
+
@click.option(
|
19
|
+
"--feature-set",
|
20
|
+
"object",
|
21
|
+
flag_value=FEATURE_SET,
|
22
|
+
default=True,
|
23
|
+
help="Delete a feature set [default option]",
|
24
|
+
)
|
25
|
+
@click.option(
|
26
|
+
"--data-source", "object", flag_value=DATA_SOURCE, help="Delete a data source"
|
27
|
+
)
|
28
|
+
@click.option("--entity", "object", flag_value=ENTITY, help="Delete an entity")
|
29
|
+
@click.argument("name")
|
30
|
+
def delete_fs_object(object, name, **kwargs):
|
31
|
+
"""
|
32
|
+
Delete Feature Store object
|
33
|
+
|
34
|
+
Args:
|
35
|
+
object: type of object to delete
|
36
|
+
name: name of the object to delete
|
37
|
+
"""
|
38
|
+
|
39
|
+
registry_client = FeatureRegistryClient()
|
40
|
+
_inner_delete(name, object, registry_client)
|
File without changes
|
@@ -0,0 +1,19 @@
|
|
1
|
+
import click
|
2
|
+
from frogml.core.feature_store.execution.execution_query import ExecutionQuery
|
3
|
+
|
4
|
+
from frogml_cli.inner.tools.cli_tools import FrogMLCommand
|
5
|
+
|
6
|
+
|
7
|
+
@click.command(
|
8
|
+
"execution-status",
|
9
|
+
cls=FrogMLCommand,
|
10
|
+
help="Retrieve the current status of an execution (backfill/batch job ingestion)",
|
11
|
+
)
|
12
|
+
@click.option(
|
13
|
+
"--execution-id",
|
14
|
+
type=str,
|
15
|
+
required=True,
|
16
|
+
help="The id of the execution to retrieve the status for.",
|
17
|
+
)
|
18
|
+
def execution_status(execution_id: str, **kwargs):
|
19
|
+
print(ExecutionQuery.get_execution_status_message(execution_id=execution_id))
|
@@ -0,0 +1,29 @@
|
|
1
|
+
import click
|
2
|
+
|
3
|
+
from frogml_cli.commands.feature_store.backfill.ui import backfill
|
4
|
+
from frogml_cli.commands.feature_store.delete.ui import delete_fs_object
|
5
|
+
from frogml_cli.commands.feature_store.execution.ui import execution_status
|
6
|
+
from frogml_cli.commands.feature_store.list.ui import list_feature_sets
|
7
|
+
from frogml_cli.commands.feature_store.pause.ui import pause_feature_set
|
8
|
+
from frogml_cli.commands.feature_store.register.ui import register_fs_objects
|
9
|
+
from frogml_cli.commands.feature_store.resume.ui import resume_feature_set
|
10
|
+
from frogml_cli.commands.feature_store.trigger.ui import trigger_feature_set
|
11
|
+
|
12
|
+
|
13
|
+
@click.group(
|
14
|
+
name="features",
|
15
|
+
help="Commands for interacting with the Qwak Feature Store",
|
16
|
+
)
|
17
|
+
def feature_store_commands_group():
|
18
|
+
# Click commands group injection
|
19
|
+
pass
|
20
|
+
|
21
|
+
|
22
|
+
feature_store_commands_group.add_command(delete_fs_object)
|
23
|
+
feature_store_commands_group.add_command(list_feature_sets)
|
24
|
+
feature_store_commands_group.add_command(pause_feature_set)
|
25
|
+
feature_store_commands_group.add_command(resume_feature_set)
|
26
|
+
feature_store_commands_group.add_command(trigger_feature_set)
|
27
|
+
feature_store_commands_group.add_command(register_fs_objects)
|
28
|
+
feature_store_commands_group.add_command(backfill)
|
29
|
+
feature_store_commands_group.add_command(execution_status)
|
File without changes
|