thestage 0.5.47__py3-none-any.whl → 0.5.49__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.
- thestage/.env +5 -5
- thestage/__init__.py +3 -4
- thestage/__main__.py +9 -9
- thestage/cli_command.py +56 -56
- thestage/cli_command_helper.py +51 -51
- thestage/color_scheme/color_scheme.py +7 -7
- thestage/config/__init__.py +18 -18
- thestage/config/config_storage.py +5 -3
- thestage/config/env_base.py +7 -7
- thestage/controllers/__init__.py +0 -0
- thestage/controllers/base_controller.py +67 -67
- thestage/controllers/config_controller.py +137 -137
- thestage/controllers/container_controller.py +389 -389
- thestage/controllers/instance_controller.py +183 -183
- thestage/controllers/project_controller.py +802 -783
- thestage/controllers/utils_controller.py +32 -32
- thestage/debug_main.dist.py +28 -28
- thestage/entities/__init__.py +0 -0
- thestage/entities/container.py +17 -17
- thestage/entities/enums/__init__.py +0 -0
- thestage/entities/enums/order_direction_type.py +6 -6
- thestage/entities/enums/shell_type.py +7 -7
- thestage/entities/enums/tail_output_type.py +6 -6
- thestage/entities/enums/yes_no_response.py +7 -7
- thestage/entities/file_item.py +27 -27
- thestage/entities/project_inference_simulator.py +18 -18
- thestage/entities/project_inference_simulator_model.py +16 -16
- thestage/entities/project_task.py +19 -19
- thestage/entities/rented_instance.py +19 -19
- thestage/entities/self_hosted_instance.py +18 -18
- thestage/exceptions/__init__.py +0 -0
- thestage/exceptions/auth_exception.py +6 -6
- thestage/exceptions/base_exception.py +13 -13
- thestage/exceptions/business_logic_exception.py +6 -6
- thestage/exceptions/config_exception.py +6 -6
- thestage/exceptions/file_system_exception.py +6 -6
- thestage/exceptions/git_access_exception.py +17 -17
- thestage/exceptions/remote_server_exception.py +24 -24
- thestage/git/ProgressPrinter.py +22 -22
- thestage/helpers/__init__.py +0 -0
- thestage/helpers/error_handler.py +115 -115
- thestage/helpers/exception_hook.py +14 -14
- thestage/helpers/logger/__init__.py +0 -0
- thestage/helpers/logger/app_logger.py +50 -50
- thestage/helpers/ssh_util.py +38 -38
- thestage/i18n/en_GB/messages.po +947 -947
- thestage/i18n/translation.py +9 -9
- thestage/main.py +36 -36
- thestage/services/.env +6 -6
- thestage/services/__init__.py +0 -0
- thestage/services/abstract_mapper.py +9 -9
- thestage/services/abstract_service.py +87 -87
- thestage/services/app_config_service.py +52 -52
- thestage/services/clients/__init__.py +0 -0
- thestage/services/clients/git/__init__.py +0 -0
- thestage/services/clients/git/git_client.py +433 -331
- thestage/services/clients/thestage_api/__init__.py +0 -0
- thestage/services/clients/thestage_api/api_client.py +718 -720
- thestage/services/clients/thestage_api/core/api_client_core.py +108 -108
- thestage/services/clients/thestage_api/core/http_client_exception.py +12 -12
- thestage/services/clients/thestage_api/dtos/__init__.py +0 -0
- thestage/services/clients/thestage_api/dtos/base_response.py +13 -13
- thestage/services/clients/thestage_api/dtos/cloud_provider_region.py +19 -19
- thestage/services/clients/thestage_api/dtos/container_param_request.py +11 -11
- thestage/services/clients/thestage_api/dtos/container_response.py +67 -67
- thestage/services/clients/thestage_api/dtos/docker_container_assigned_device.py +10 -10
- thestage/services/clients/thestage_api/dtos/docker_container_controller/docker_container_list_request.py +13 -13
- thestage/services/clients/thestage_api/dtos/docker_container_controller/docker_container_list_response.py +13 -13
- thestage/services/clients/thestage_api/dtos/docker_container_mapping.py +10 -10
- thestage/services/clients/thestage_api/dtos/entity_filter_request.py +14 -14
- thestage/services/clients/thestage_api/dtos/enums/__init__.py +0 -0
- thestage/services/clients/thestage_api/dtos/enums/container_pending_action.py +10 -10
- thestage/services/clients/thestage_api/dtos/enums/container_status.py +17 -17
- thestage/services/clients/thestage_api/dtos/enums/cpu_type.py +8 -8
- thestage/services/clients/thestage_api/dtos/enums/currency_type.py +10 -10
- thestage/services/clients/thestage_api/dtos/enums/daemon_status.py +9 -9
- thestage/services/clients/thestage_api/dtos/enums/disk_type.py +7 -7
- thestage/services/clients/thestage_api/dtos/enums/drive_type.py +7 -7
- thestage/services/clients/thestage_api/dtos/enums/gpu_name.py +8 -8
- thestage/services/clients/thestage_api/dtos/enums/inference_model_status.py +9 -9
- thestage/services/clients/thestage_api/dtos/enums/inference_simulator_status.py +15 -15
- thestage/services/clients/thestage_api/dtos/enums/instance_rented_status.py +17 -17
- thestage/services/clients/thestage_api/dtos/enums/instance_type.py +7 -7
- thestage/services/clients/thestage_api/dtos/enums/location_region.py +11 -11
- thestage/services/clients/thestage_api/dtos/enums/power_status.py +10 -10
- thestage/services/clients/thestage_api/dtos/enums/provider_name.py +11 -11
- thestage/services/clients/thestage_api/dtos/enums/selfhosted_status.py +10 -10
- thestage/services/clients/thestage_api/dtos/enums/task_execution_status.py +12 -12
- thestage/services/clients/thestage_api/dtos/enums/task_status.py +12 -12
- thestage/services/clients/thestage_api/dtos/frontend_status.py +10 -10
- thestage/services/clients/thestage_api/dtos/inference_controller/deploy_inference_model_to_instance_request.py +13 -13
- thestage/services/clients/thestage_api/dtos/inference_controller/deploy_inference_model_to_instance_response.py +13 -13
- thestage/services/clients/thestage_api/dtos/inference_controller/deploy_inference_model_to_sagemaker_request.py +12 -12
- thestage/services/clients/thestage_api/dtos/inference_controller/deploy_inference_model_to_sagemaker_response.py +12 -12
- thestage/services/clients/thestage_api/dtos/inference_controller/get_inference_simulator_request.py +10 -10
- thestage/services/clients/thestage_api/dtos/inference_controller/get_inference_simulator_response.py +13 -13
- thestage/services/clients/thestage_api/dtos/inference_controller/inference_simulator_list_for_project_request.py +14 -14
- thestage/services/clients/thestage_api/dtos/inference_controller/inference_simulator_list_for_project_response.py +12 -12
- thestage/services/clients/thestage_api/dtos/inference_controller/inference_simulator_model_list_for_project_request.py +12 -12
- thestage/services/clients/thestage_api/dtos/inference_controller/inference_simulator_model_list_for_project_response.py +13 -13
- thestage/services/clients/thestage_api/dtos/inference_simulator_model_response.py +11 -11
- thestage/services/clients/thestage_api/dtos/inference_simulator_response.py +11 -11
- thestage/services/clients/thestage_api/dtos/installed_service.py +17 -17
- thestage/services/clients/thestage_api/dtos/instance_detected_gpus.py +20 -20
- thestage/services/clients/thestage_api/dtos/instance_rented_response.py +71 -71
- thestage/services/clients/thestage_api/dtos/logging_controller/docker_container_log_stream_request.py +7 -7
- thestage/services/clients/thestage_api/dtos/logging_controller/log_polling_request.py +13 -13
- thestage/services/clients/thestage_api/dtos/logging_controller/log_polling_response.py +14 -14
- thestage/services/clients/thestage_api/dtos/logging_controller/task_log_stream_request.py +7 -7
- thestage/services/clients/thestage_api/dtos/logging_controller/user_logs_query_request.py +21 -21
- thestage/services/clients/thestage_api/dtos/logging_controller/user_logs_query_response.py +14 -14
- thestage/services/clients/thestage_api/dtos/paginated_entity_list.py +11 -11
- thestage/services/clients/thestage_api/dtos/pagination_data.py +10 -10
- thestage/services/clients/thestage_api/dtos/price_definition.py +14 -14
- thestage/services/clients/thestage_api/dtos/project_controller/project_get_deploy_ssh_key_request.py +7 -7
- thestage/services/clients/thestage_api/dtos/project_controller/project_get_deploy_ssh_key_response.py +10 -10
- thestage/services/clients/thestage_api/dtos/project_controller/project_push_inference_simulator_model_request.py +8 -8
- thestage/services/clients/thestage_api/dtos/project_controller/project_push_inference_simulator_model_response.py +6 -6
- thestage/services/clients/thestage_api/dtos/project_controller/project_run_task_request.py +15 -15
- thestage/services/clients/thestage_api/dtos/project_controller/project_run_task_response.py +10 -10
- thestage/services/clients/thestage_api/dtos/project_controller/project_start_inference_simulator_request.py +13 -14
- thestage/services/clients/thestage_api/dtos/project_controller/project_start_inference_simulator_response.py +10 -10
- thestage/services/clients/thestage_api/dtos/project_response.py +32 -32
- thestage/services/clients/thestage_api/dtos/selfhosted_instance_response.py +56 -56
- thestage/services/clients/thestage_api/dtos/sftp_path_helper.py +13 -13
- thestage/services/clients/thestage_api/dtos/ssh_key_controller/add_ssh_key_to_user_request.py +8 -8
- thestage/services/clients/thestage_api/dtos/ssh_key_controller/add_ssh_key_to_user_response.py +11 -11
- thestage/services/clients/thestage_api/dtos/ssh_key_controller/add_ssh_public_key_to_instance_request.py +8 -8
- thestage/services/clients/thestage_api/dtos/ssh_key_controller/add_ssh_public_key_to_instance_response.py +11 -11
- thestage/services/clients/thestage_api/dtos/ssh_key_controller/is_user_has_public_ssh_key_request.py +7 -7
- thestage/services/clients/thestage_api/dtos/ssh_key_controller/is_user_has_public_ssh_key_response.py +12 -12
- thestage/services/clients/thestage_api/dtos/task_controller/task_list_for_project_request.py +10 -10
- thestage/services/clients/thestage_api/dtos/task_controller/task_list_for_project_response.py +12 -12
- thestage/services/clients/thestage_api/dtos/task_controller/task_status_localized_map_response.py +9 -9
- thestage/services/clients/thestage_api/dtos/task_controller/task_view_response.py +12 -12
- thestage/services/clients/thestage_api/dtos/user_controller/user_profile.py +12 -12
- thestage/services/clients/thestage_api/dtos/validate_token_response.py +11 -11
- thestage/services/config_provider/__init__.py +0 -0
- thestage/services/config_provider/config_provider.py +237 -237
- thestage/services/connect/connect_service.py +196 -196
- thestage/services/connect/dto/remote_server_config.py +9 -9
- thestage/services/container/__init__.py +0 -0
- thestage/services/container/container_service.py +374 -374
- thestage/services/container/mapper/__init__.py +0 -0
- thestage/services/container/mapper/container_mapper.py +30 -30
- thestage/services/core_files/config_entity.py +26 -26
- thestage/services/filesystem_service.py +133 -133
- thestage/services/instance/__init__.py +0 -0
- thestage/services/instance/instance_service.py +303 -303
- thestage/services/instance/mapper/__init__.py +0 -0
- thestage/services/instance/mapper/instance_mapper.py +24 -24
- thestage/services/instance/mapper/selfhosted_mapper.py +33 -33
- thestage/services/logging/byte_print_style.py +5 -5
- thestage/services/logging/dto/log_message.py +15 -15
- thestage/services/logging/dto/log_type.py +6 -6
- thestage/services/logging/exception/log_polling_exception.py +6 -6
- thestage/services/logging/logging_constants.py +3 -3
- thestage/services/logging/logging_service.py +367 -367
- thestage/services/project/__init__.py +0 -0
- thestage/services/project/dto/inference_simulator_dto.py +22 -22
- thestage/services/project/dto/inference_simulator_model_dto.py +20 -20
- thestage/services/project/dto/project_config.py +14 -14
- thestage/services/project/mapper/__init__.py +0 -0
- thestage/services/project/mapper/project_inference_simulator_mapper.py +21 -21
- thestage/services/project/mapper/project_inference_simulator_model_mapper.py +21 -21
- thestage/services/project/mapper/project_task_mapper.py +22 -22
- thestage/services/project/project_service.py +1260 -1241
- thestage/services/remote_server_service.py +609 -609
- thestage/services/service_factory.py +97 -97
- thestage/services/task/dto/task_dto.py +40 -40
- thestage/services/validation_service.py +61 -61
- {thestage-0.5.47.dist-info → thestage-0.5.49.dist-info}/LICENSE.txt +12 -12
- {thestage-0.5.47.dist-info → thestage-0.5.49.dist-info}/METADATA +1 -1
- thestage-0.5.49.dist-info/RECORD +176 -0
- {thestage-0.5.47.dist-info → thestage-0.5.49.dist-info}/WHEEL +1 -1
- thestage/debug_tests.py +0 -12
- thestage/services/clients/.DS_Store +0 -0
- thestage-0.5.47.dist-info/RECORD +0 -178
- {thestage-0.5.47.dist-info → thestage-0.5.49.dist-info}/entry_points.txt +0 -0
thestage/.env
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
THESTAGE_CONFIG_DIR=.thestage
|
|
2
|
+
THESTAGE_CONFIG_FILE=config.json
|
|
3
|
+
THESTAGE_API_URL=https://backend-staging.thestage.ai
|
|
4
|
+
THESTAGE_API_URL=https://backend.thestage.ai
|
|
5
|
+
LOG_FILE=thestage.log
|
thestage/__init__.py
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
from . import *
|
|
2
|
-
__app_name__ = "thestage"
|
|
3
|
-
|
|
4
|
-
__version__ = "0.5.47"
|
|
1
|
+
from . import *
|
|
2
|
+
__app_name__ = "thestage"
|
|
3
|
+
__version__ = "0.5.49"
|
thestage/__main__.py
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import thestage.main as main
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
def start():
|
|
5
|
-
main.main()
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
if __name__ == "__main__":
|
|
9
|
-
start()
|
|
1
|
+
import thestage.main as main
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def start():
|
|
5
|
+
main.main()
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
if __name__ == "__main__":
|
|
9
|
+
start()
|
thestage/cli_command.py
CHANGED
|
@@ -1,56 +1,56 @@
|
|
|
1
|
-
from enum import Enum
|
|
2
|
-
|
|
3
|
-
class CliCommand(str, Enum):
|
|
4
|
-
VERSION = "VERSION"
|
|
5
|
-
CONNECT = "CONNECT"
|
|
6
|
-
PROJECT_CLONE = "PROJECT_CLONE"
|
|
7
|
-
PROJECT_INIT = "PROJECT_INIT"
|
|
8
|
-
PROJECT_RUN = "PROJECT_RUN"
|
|
9
|
-
PROJECT_CHECKOUT = "PROJECT_CHECKOUT"
|
|
10
|
-
PROJECT_PULL = "PROJECT_PULL"
|
|
11
|
-
PROJECT_RESET = "PROJECT_RESET"
|
|
12
|
-
PROJECT_INFERENCE_SIMULATOR_RUN = "PROJECT_INFERENCE_SIMULATOR_RUN"
|
|
13
|
-
PROJECT_INFERENCE_SIMULATOR_SAVE_METADATA = "PROJECT_INFERENCE_SIMULATOR_SAVE_METADATA"
|
|
14
|
-
PROJECT_INFERENCE_SIMULATOR_PUSH = "PROJECT_INFERENCE_SIMULATOR_PUSH"
|
|
15
|
-
PROJECT_INFERENCE_SIMULATOR_LS = "PROJECT_INFERENCE_SIMULATOR_LS"
|
|
16
|
-
PROJECT_INFERENCE_SIMULATOR_LOGS = "PROJECT_INFERENCE_SIMULATOR_LOGS"
|
|
17
|
-
PROJECT_MODEL_LS = "PROJECT_MODEL_LS"
|
|
18
|
-
PROJECT_MODEL_DEPLOY_INSTANCE = "PROJECT_MODEL_DEPLOY_INSTANCE"
|
|
19
|
-
PROJECT_MODEL_DEPLOY_SAGEMAKER = "PROJECT_MODEL_DEPLOY_SAGEMAKER"
|
|
20
|
-
PROJECT_TASK_CANCEL = "PROJECT_TASK_CANCEL"
|
|
21
|
-
PROJECT_TASK_LS = "PROJECT_TASK_LS"
|
|
22
|
-
PROJECT_TASK_LOGS = "PROJECT_TASK_LOGS"
|
|
23
|
-
PROJECT_CONFIG_SET_DEFAULT_CONTAINER = "PROJECT_CONFIG_SET_DEFAULT_CONTAINER"
|
|
24
|
-
PROJECT_CONFIG_GET = "PROJECT_CONFIG_GET"
|
|
25
|
-
CONTAINER_LS = "CONTAINER_LS"
|
|
26
|
-
CONTAINER_INFO = "CONTAINER_INFO"
|
|
27
|
-
CONTAINER_CONNECT = "CONTAINER_CONNECT"
|
|
28
|
-
CONTAINER_UPLOAD = "CONTAINER_UPLOAD"
|
|
29
|
-
CONTAINER_DOWNLOAD = "CONTAINER_DOWNLOAD"
|
|
30
|
-
CONTAINER_START = "CONTAINER_START"
|
|
31
|
-
CONTAINER_STOP = "CONTAINER_STOP"
|
|
32
|
-
CONTAINER_RESTART = "CONTAINER_RESTART"
|
|
33
|
-
CONTAINER_LOGS = "CONTAINER_LOGS"
|
|
34
|
-
INSTANCE_RENTED_LS = "INSTANCE_RENTED_LS"
|
|
35
|
-
INSTANCE_RENTED_CONNECT = "INSTANCE_RENTED_CONNECT"
|
|
36
|
-
INSTANCE_SELF_HOSTED_LS = "INSTANCE_SELF_HOSTED_LS"
|
|
37
|
-
INSTANCE_SELF_HOSTED_CONNECT = "INSTANCE_SELF_HOSTED_CONNECT"
|
|
38
|
-
CONFIG_GET = "CONFIG_GET"
|
|
39
|
-
CONFIG_SET = "CONFIG_SET"
|
|
40
|
-
CONFIG_CLEAR = "CONFIG_CLEAR"
|
|
41
|
-
CONFIG_UPLOAD_SSH_KEY = "CONFIG_UPLOAD_SSH_KEY"
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
class CliCommandAvailability(str, Enum):
|
|
45
|
-
ALLOWED = "ALLOWED"
|
|
46
|
-
RESTRICTED = "RESTRICTED"
|
|
47
|
-
DEPRECATED = "DEPRECATED"
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
ALWAYS_AVAILABLE_COMMANDS = [
|
|
51
|
-
CliCommand.VERSION,
|
|
52
|
-
CliCommand.PROJECT_CONFIG_GET,
|
|
53
|
-
CliCommand.CONFIG_GET,
|
|
54
|
-
CliCommand.CONFIG_SET,
|
|
55
|
-
CliCommand.CONFIG_CLEAR,
|
|
56
|
-
]
|
|
1
|
+
from enum import Enum
|
|
2
|
+
|
|
3
|
+
class CliCommand(str, Enum):
|
|
4
|
+
VERSION = "VERSION"
|
|
5
|
+
CONNECT = "CONNECT"
|
|
6
|
+
PROJECT_CLONE = "PROJECT_CLONE"
|
|
7
|
+
PROJECT_INIT = "PROJECT_INIT"
|
|
8
|
+
PROJECT_RUN = "PROJECT_RUN"
|
|
9
|
+
PROJECT_CHECKOUT = "PROJECT_CHECKOUT"
|
|
10
|
+
PROJECT_PULL = "PROJECT_PULL"
|
|
11
|
+
PROJECT_RESET = "PROJECT_RESET"
|
|
12
|
+
PROJECT_INFERENCE_SIMULATOR_RUN = "PROJECT_INFERENCE_SIMULATOR_RUN"
|
|
13
|
+
PROJECT_INFERENCE_SIMULATOR_SAVE_METADATA = "PROJECT_INFERENCE_SIMULATOR_SAVE_METADATA"
|
|
14
|
+
PROJECT_INFERENCE_SIMULATOR_PUSH = "PROJECT_INFERENCE_SIMULATOR_PUSH"
|
|
15
|
+
PROJECT_INFERENCE_SIMULATOR_LS = "PROJECT_INFERENCE_SIMULATOR_LS"
|
|
16
|
+
PROJECT_INFERENCE_SIMULATOR_LOGS = "PROJECT_INFERENCE_SIMULATOR_LOGS"
|
|
17
|
+
PROJECT_MODEL_LS = "PROJECT_MODEL_LS"
|
|
18
|
+
PROJECT_MODEL_DEPLOY_INSTANCE = "PROJECT_MODEL_DEPLOY_INSTANCE"
|
|
19
|
+
PROJECT_MODEL_DEPLOY_SAGEMAKER = "PROJECT_MODEL_DEPLOY_SAGEMAKER"
|
|
20
|
+
PROJECT_TASK_CANCEL = "PROJECT_TASK_CANCEL"
|
|
21
|
+
PROJECT_TASK_LS = "PROJECT_TASK_LS"
|
|
22
|
+
PROJECT_TASK_LOGS = "PROJECT_TASK_LOGS"
|
|
23
|
+
PROJECT_CONFIG_SET_DEFAULT_CONTAINER = "PROJECT_CONFIG_SET_DEFAULT_CONTAINER"
|
|
24
|
+
PROJECT_CONFIG_GET = "PROJECT_CONFIG_GET"
|
|
25
|
+
CONTAINER_LS = "CONTAINER_LS"
|
|
26
|
+
CONTAINER_INFO = "CONTAINER_INFO"
|
|
27
|
+
CONTAINER_CONNECT = "CONTAINER_CONNECT"
|
|
28
|
+
CONTAINER_UPLOAD = "CONTAINER_UPLOAD"
|
|
29
|
+
CONTAINER_DOWNLOAD = "CONTAINER_DOWNLOAD"
|
|
30
|
+
CONTAINER_START = "CONTAINER_START"
|
|
31
|
+
CONTAINER_STOP = "CONTAINER_STOP"
|
|
32
|
+
CONTAINER_RESTART = "CONTAINER_RESTART"
|
|
33
|
+
CONTAINER_LOGS = "CONTAINER_LOGS"
|
|
34
|
+
INSTANCE_RENTED_LS = "INSTANCE_RENTED_LS"
|
|
35
|
+
INSTANCE_RENTED_CONNECT = "INSTANCE_RENTED_CONNECT"
|
|
36
|
+
INSTANCE_SELF_HOSTED_LS = "INSTANCE_SELF_HOSTED_LS"
|
|
37
|
+
INSTANCE_SELF_HOSTED_CONNECT = "INSTANCE_SELF_HOSTED_CONNECT"
|
|
38
|
+
CONFIG_GET = "CONFIG_GET"
|
|
39
|
+
CONFIG_SET = "CONFIG_SET"
|
|
40
|
+
CONFIG_CLEAR = "CONFIG_CLEAR"
|
|
41
|
+
CONFIG_UPLOAD_SSH_KEY = "CONFIG_UPLOAD_SSH_KEY"
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class CliCommandAvailability(str, Enum):
|
|
45
|
+
ALLOWED = "ALLOWED"
|
|
46
|
+
RESTRICTED = "RESTRICTED"
|
|
47
|
+
DEPRECATED = "DEPRECATED"
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
ALWAYS_AVAILABLE_COMMANDS = [
|
|
51
|
+
CliCommand.VERSION,
|
|
52
|
+
CliCommand.PROJECT_CONFIG_GET,
|
|
53
|
+
CliCommand.CONFIG_GET,
|
|
54
|
+
CliCommand.CONFIG_SET,
|
|
55
|
+
CliCommand.CONFIG_CLEAR,
|
|
56
|
+
]
|
thestage/cli_command_helper.py
CHANGED
|
@@ -1,51 +1,51 @@
|
|
|
1
|
-
from typing import Callable
|
|
2
|
-
|
|
3
|
-
import typer
|
|
4
|
-
|
|
5
|
-
from thestage.cli_command import CliCommand, CliCommandAvailability
|
|
6
|
-
from thestage.color_scheme.color_scheme import ColorScheme
|
|
7
|
-
from thestage.config import config_storage
|
|
8
|
-
from rich import print
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
def cli_command(command_id: CliCommand):
|
|
12
|
-
def decorator(func: Callable):
|
|
13
|
-
setattr(func, "__cli_command__", command_id)
|
|
14
|
-
return func
|
|
15
|
-
return decorator
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
def get_command_metadata(command_id: CliCommand) -> dict:
|
|
19
|
-
return {
|
|
20
|
-
"rich_help_panel": get_command_help_panel(command_id),
|
|
21
|
-
"deprecated": is_command_deprecated(command_id),
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
def get_command_group_help_panel() -> str:
|
|
26
|
-
return "Command Groups"
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
def get_command_help_panel(command: CliCommand) -> str:
|
|
30
|
-
if config_storage.APP_CONFIG.runtime.allowed_commands.get(command) == CliCommandAvailability.ALLOWED:
|
|
31
|
-
return "Allowed Commands"
|
|
32
|
-
if config_storage.APP_CONFIG.runtime.allowed_commands.get(command) == CliCommandAvailability.RESTRICTED:
|
|
33
|
-
return "Restricted Commands"
|
|
34
|
-
if config_storage.APP_CONFIG.runtime.allowed_commands.get(command) == CliCommandAvailability.DEPRECATED:
|
|
35
|
-
return "Deprecated Commands"
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
def is_command_deprecated(command: CliCommand) -> bool:
|
|
39
|
-
if config_storage.APP_CONFIG.runtime.allowed_commands.get(command) == CliCommandAvailability.DEPRECATED:
|
|
40
|
-
return True
|
|
41
|
-
return False
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
def check_command_permission(executed_command: CliCommand):
|
|
45
|
-
if config_storage.APP_CONFIG.runtime.is_token_valid == False and executed_command != CliCommand.CONFIG_SET:
|
|
46
|
-
print(f"[{ColorScheme.WARNING.value}]Your API Token is not valid. You can update the token using 'thestage config set' command[{ColorScheme.WARNING.value}]")
|
|
47
|
-
|
|
48
|
-
is_allowed = config_storage.APP_CONFIG.runtime.allowed_commands.get(executed_command) == CliCommandAvailability.ALLOWED
|
|
49
|
-
if not is_allowed:
|
|
50
|
-
typer.echo("Action is not allowed")
|
|
51
|
-
raise typer.Exit(code=1)
|
|
1
|
+
from typing import Callable
|
|
2
|
+
|
|
3
|
+
import typer
|
|
4
|
+
|
|
5
|
+
from thestage.cli_command import CliCommand, CliCommandAvailability
|
|
6
|
+
from thestage.color_scheme.color_scheme import ColorScheme
|
|
7
|
+
from thestage.config import config_storage
|
|
8
|
+
from rich import print
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def cli_command(command_id: CliCommand):
|
|
12
|
+
def decorator(func: Callable):
|
|
13
|
+
setattr(func, "__cli_command__", command_id)
|
|
14
|
+
return func
|
|
15
|
+
return decorator
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def get_command_metadata(command_id: CliCommand) -> dict:
|
|
19
|
+
return {
|
|
20
|
+
"rich_help_panel": get_command_help_panel(command_id),
|
|
21
|
+
"deprecated": is_command_deprecated(command_id),
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def get_command_group_help_panel() -> str:
|
|
26
|
+
return "Command Groups"
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def get_command_help_panel(command: CliCommand) -> str:
|
|
30
|
+
if config_storage.APP_CONFIG.runtime.allowed_commands.get(command) == CliCommandAvailability.ALLOWED:
|
|
31
|
+
return "Allowed Commands"
|
|
32
|
+
if config_storage.APP_CONFIG.runtime.allowed_commands.get(command) == CliCommandAvailability.RESTRICTED:
|
|
33
|
+
return "Restricted Commands"
|
|
34
|
+
if config_storage.APP_CONFIG.runtime.allowed_commands.get(command) == CliCommandAvailability.DEPRECATED:
|
|
35
|
+
return "Deprecated Commands"
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def is_command_deprecated(command: CliCommand) -> bool:
|
|
39
|
+
if config_storage.APP_CONFIG.runtime.allowed_commands.get(command) == CliCommandAvailability.DEPRECATED:
|
|
40
|
+
return True
|
|
41
|
+
return False
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def check_command_permission(executed_command: CliCommand):
|
|
45
|
+
if config_storage.APP_CONFIG.runtime.is_token_valid == False and executed_command != CliCommand.CONFIG_SET:
|
|
46
|
+
print(f"[{ColorScheme.WARNING.value}]Your API Token is not valid. You can update the token using 'thestage config set' command[{ColorScheme.WARNING.value}]")
|
|
47
|
+
|
|
48
|
+
is_allowed = config_storage.APP_CONFIG.runtime.allowed_commands.get(executed_command) == CliCommandAvailability.ALLOWED
|
|
49
|
+
if not is_allowed:
|
|
50
|
+
typer.echo("Action is not allowed")
|
|
51
|
+
raise typer.Exit(code=1)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
from enum import Enum
|
|
2
|
-
|
|
3
|
-
# https://rich.readthedocs.io/en/stable/appendix/colors.html
|
|
4
|
-
class ColorScheme(str, Enum):
|
|
5
|
-
GIT_HEADLESS = "orange_red1"
|
|
6
|
-
WARNING = "orange_red1"
|
|
7
|
-
USEFUL_INFO = "deep_sky_blue1"
|
|
1
|
+
from enum import Enum
|
|
2
|
+
|
|
3
|
+
# https://rich.readthedocs.io/en/stable/appendix/colors.html
|
|
4
|
+
class ColorScheme(str, Enum):
|
|
5
|
+
GIT_HEADLESS = "orange_red1"
|
|
6
|
+
WARNING = "orange_red1"
|
|
7
|
+
USEFUL_INFO = "deep_sky_blue1"
|
thestage/config/__init__.py
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
# Init project settings by ENV environment variable
|
|
2
|
-
import locale
|
|
3
|
-
from pathlib import Path
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
from python_gettext_translations.translations import init_translations
|
|
7
|
-
|
|
8
|
-
from thestage.config.env_base import *
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
THESTAGE_LOCAL_LANGUAGE = 'en_GB'
|
|
12
|
-
if locale.getlocale():
|
|
13
|
-
THESTAGE_LOCAL_LANGUAGE = locale.getlocale()[0]
|
|
14
|
-
|
|
15
|
-
translation = Path(f'i18n/')
|
|
16
|
-
|
|
17
|
-
if translation.exists() and translation.is_dir():
|
|
18
|
-
init_translations(f'i18n/')
|
|
1
|
+
# Init project settings by ENV environment variable
|
|
2
|
+
import locale
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
from python_gettext_translations.translations import init_translations
|
|
7
|
+
|
|
8
|
+
from thestage.config.env_base import *
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
THESTAGE_LOCAL_LANGUAGE = 'en_GB'
|
|
12
|
+
if locale.getlocale():
|
|
13
|
+
THESTAGE_LOCAL_LANGUAGE = locale.getlocale()[0]
|
|
14
|
+
|
|
15
|
+
translation = Path(f'i18n/')
|
|
16
|
+
|
|
17
|
+
if translation.exists() and translation.is_dir():
|
|
18
|
+
init_translations(f'i18n/')
|
thestage/config/env_base.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import os
|
|
2
|
-
|
|
3
|
-
THESTAGE_CONFIG_DIR = os.getenv('THESTAGE_CONFIG_DIR', '.thestage')
|
|
4
|
-
THESTAGE_CONFIG_FILE = os.getenv('THESTAGE_CONFIG_FILE', 'config.json')
|
|
5
|
-
THESTAGE_AUTH_TOKEN = os.getenv('THESTAGE_AUTH_TOKEN', None)
|
|
6
|
-
THESTAGE_LOGGING_FILE = os.getenv('THESTAGE_LOGGING_FILE', 'thestage.log')
|
|
7
|
-
THESTAGE_API_URL = os.getenv('THESTAGE_API_URL', 'https://backend.thestage.ai')
|
|
1
|
+
import os
|
|
2
|
+
|
|
3
|
+
THESTAGE_CONFIG_DIR = os.getenv('THESTAGE_CONFIG_DIR', '.thestage')
|
|
4
|
+
THESTAGE_CONFIG_FILE = os.getenv('THESTAGE_CONFIG_FILE', 'config.json')
|
|
5
|
+
THESTAGE_AUTH_TOKEN = os.getenv('THESTAGE_AUTH_TOKEN', None)
|
|
6
|
+
THESTAGE_LOGGING_FILE = os.getenv('THESTAGE_LOGGING_FILE', 'thestage.log')
|
|
7
|
+
THESTAGE_API_URL = os.getenv('THESTAGE_API_URL', 'https://backend.thestage.ai')
|
thestage/controllers/__init__.py
CHANGED
|
File without changes
|
|
@@ -1,67 +1,67 @@
|
|
|
1
|
-
from pathlib import Path
|
|
2
|
-
from typing import Optional
|
|
3
|
-
|
|
4
|
-
from thestage.cli_command import CliCommand
|
|
5
|
-
from thestage.cli_command_helper import get_command_metadata, check_command_permission
|
|
6
|
-
from thestage.i18n.translation import __
|
|
7
|
-
from thestage.helpers.logger.app_logger import app_logger
|
|
8
|
-
from thestage.controllers.utils_controller import get_current_directory, validate_config_and_get_service_factory
|
|
9
|
-
from thestage import __app_name__, __version__
|
|
10
|
-
|
|
11
|
-
import typer
|
|
12
|
-
|
|
13
|
-
from thestage.services.connect.connect_service import ConnectService
|
|
14
|
-
|
|
15
|
-
app = typer.Typer(no_args_is_help=True,)
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
@app.command(name='version', help="Get application's name and version", no_args_is_help=False, **get_command_metadata(CliCommand.VERSION))
|
|
19
|
-
def version():
|
|
20
|
-
command_name = CliCommand.VERSION
|
|
21
|
-
app_logger.info(f'Running {command_name} from {get_current_directory()}')
|
|
22
|
-
check_command_permission(command_name)
|
|
23
|
-
|
|
24
|
-
typer.echo(f"{__app_name__} v{__version__}")
|
|
25
|
-
raise typer.Exit(0)
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
@app.command(name="connect", no_args_is_help=True, help=__("Connect to server instance or container or task"), **get_command_metadata(CliCommand.CONNECT))
|
|
29
|
-
def connect(
|
|
30
|
-
uid: Optional[str] = typer.Argument(
|
|
31
|
-
help=__("Unique ID of server instance or container or task ID"), ),
|
|
32
|
-
username: Optional[str] = typer.Option(
|
|
33
|
-
None,
|
|
34
|
-
'--username',
|
|
35
|
-
'-u',
|
|
36
|
-
help=__("Username for the server instance (required when connecting to self-hosted instance)"),
|
|
37
|
-
is_eager=False,
|
|
38
|
-
),
|
|
39
|
-
private_ssh_key_path: str = typer.Option(
|
|
40
|
-
None,
|
|
41
|
-
"--private-key-path",
|
|
42
|
-
"-pk",
|
|
43
|
-
help=__("Path to private key that will be accepted by remote server (optional)"),
|
|
44
|
-
is_eager=False,
|
|
45
|
-
),
|
|
46
|
-
):
|
|
47
|
-
command_name = CliCommand.CONNECT
|
|
48
|
-
app_logger.info(f'Running {command_name} from {get_current_directory()}')
|
|
49
|
-
check_command_permission(command_name)
|
|
50
|
-
|
|
51
|
-
if private_ssh_key_path and not Path(private_ssh_key_path).is_file():
|
|
52
|
-
typer.echo(f'No file found at provided path {private_ssh_key_path}')
|
|
53
|
-
raise typer.Exit(1)
|
|
54
|
-
|
|
55
|
-
service_factory = validate_config_and_get_service_factory()
|
|
56
|
-
|
|
57
|
-
connect_service: ConnectService = service_factory.get_connect_service()
|
|
58
|
-
|
|
59
|
-
connect_service.connect_to_entity(
|
|
60
|
-
uid=uid,
|
|
61
|
-
username=username,
|
|
62
|
-
private_key_path=private_ssh_key_path
|
|
63
|
-
)
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
app_logger.info(f'Stop connect to entity')
|
|
67
|
-
raise typer.Exit(0)
|
|
1
|
+
from pathlib import Path
|
|
2
|
+
from typing import Optional
|
|
3
|
+
|
|
4
|
+
from thestage.cli_command import CliCommand
|
|
5
|
+
from thestage.cli_command_helper import get_command_metadata, check_command_permission
|
|
6
|
+
from thestage.i18n.translation import __
|
|
7
|
+
from thestage.helpers.logger.app_logger import app_logger
|
|
8
|
+
from thestage.controllers.utils_controller import get_current_directory, validate_config_and_get_service_factory
|
|
9
|
+
from thestage import __app_name__, __version__
|
|
10
|
+
|
|
11
|
+
import typer
|
|
12
|
+
|
|
13
|
+
from thestage.services.connect.connect_service import ConnectService
|
|
14
|
+
|
|
15
|
+
app = typer.Typer(no_args_is_help=True,)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@app.command(name='version', help="Get application's name and version", no_args_is_help=False, **get_command_metadata(CliCommand.VERSION))
|
|
19
|
+
def version():
|
|
20
|
+
command_name = CliCommand.VERSION
|
|
21
|
+
app_logger.info(f'Running {command_name} from {get_current_directory()}')
|
|
22
|
+
check_command_permission(command_name)
|
|
23
|
+
|
|
24
|
+
typer.echo(f"{__app_name__} v{__version__}")
|
|
25
|
+
raise typer.Exit(0)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@app.command(name="connect", no_args_is_help=True, help=__("Connect to server instance or container or task"), **get_command_metadata(CliCommand.CONNECT))
|
|
29
|
+
def connect(
|
|
30
|
+
uid: Optional[str] = typer.Argument(
|
|
31
|
+
help=__("Unique ID of server instance or container or task ID"), ),
|
|
32
|
+
username: Optional[str] = typer.Option(
|
|
33
|
+
None,
|
|
34
|
+
'--username',
|
|
35
|
+
'-u',
|
|
36
|
+
help=__("Username for the server instance (required when connecting to self-hosted instance)"),
|
|
37
|
+
is_eager=False,
|
|
38
|
+
),
|
|
39
|
+
private_ssh_key_path: str = typer.Option(
|
|
40
|
+
None,
|
|
41
|
+
"--private-key-path",
|
|
42
|
+
"-pk",
|
|
43
|
+
help=__("Path to private key that will be accepted by remote server (optional)"),
|
|
44
|
+
is_eager=False,
|
|
45
|
+
),
|
|
46
|
+
):
|
|
47
|
+
command_name = CliCommand.CONNECT
|
|
48
|
+
app_logger.info(f'Running {command_name} from {get_current_directory()}')
|
|
49
|
+
check_command_permission(command_name)
|
|
50
|
+
|
|
51
|
+
if private_ssh_key_path and not Path(private_ssh_key_path).is_file():
|
|
52
|
+
typer.echo(f'No file found at provided path {private_ssh_key_path}')
|
|
53
|
+
raise typer.Exit(1)
|
|
54
|
+
|
|
55
|
+
service_factory = validate_config_and_get_service_factory()
|
|
56
|
+
|
|
57
|
+
connect_service: ConnectService = service_factory.get_connect_service()
|
|
58
|
+
|
|
59
|
+
connect_service.connect_to_entity(
|
|
60
|
+
uid=uid,
|
|
61
|
+
username=username,
|
|
62
|
+
private_key_path=private_ssh_key_path
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
app_logger.info(f'Stop connect to entity')
|
|
67
|
+
raise typer.Exit(0)
|