thestage 0.5.40__tar.gz → 0.5.42__tar.gz
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-0.5.40 → thestage-0.5.42}/PKG-INFO +1 -1
- {thestage-0.5.40 → thestage-0.5.42}/pyproject.toml +1 -1
- thestage-0.5.42/thestage/.env +6 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/__init__.py +1 -1
- {thestage-0.5.40 → thestage-0.5.42}/thestage/controllers/config_controller.py +3 -1
- {thestage-0.5.40 → thestage-0.5.42}/thestage/controllers/project_controller.py +40 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/helpers/error_handler.py +2 -1
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/git/git_client.py +5 -1
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/api_client.py +4 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/project_controller/project_start_inference_simulator_request.py +3 -1
- thestage-0.5.42/thestage/services/logging/exception/log_polling_exception.py +6 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/logging/logging_service.py +12 -2
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/project/project_service.py +11 -6
- thestage-0.5.40/thestage/.env +0 -5
- thestage-0.5.40/thestage/services/clients/.DS_Store +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/LICENSE.txt +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/README.md +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/__main__.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/color_scheme/color_scheme.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/config/__init__.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/config/env_base.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/controllers/__init__.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/controllers/base_controller.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/controllers/container_controller.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/controllers/instance_controller.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/controllers/utils_controller.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/debug_main.dist.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/entities/__init__.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/entities/container.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/entities/enums/__init__.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/entities/enums/order_direction_type.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/entities/enums/shell_type.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/entities/enums/tail_output_type.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/entities/enums/yes_no_response.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/entities/file_item.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/entities/project_inference_simulator.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/entities/project_inference_simulator_model.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/entities/project_task.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/entities/rented_instance.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/entities/self_hosted_instance.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/exceptions/__init__.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/exceptions/auth_exception.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/exceptions/base_exception.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/exceptions/business_logic_exception.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/exceptions/config_exception.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/exceptions/file_system_exception.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/exceptions/git_access_exception.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/exceptions/http_error_exception.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/exceptions/remote_server_exception.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/git/ProgressPrinter.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/helpers/__init__.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/helpers/logger/__init__.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/helpers/logger/app_logger.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/helpers/ssh_util.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/i18n/en_GB/messages.po +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/i18n/translation.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/main.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/.env +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/__init__.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/abstract_mapper.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/abstract_service.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/app_config_service.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/__init__.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/git/__init__.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/__init__.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/core/api_client_abstract.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/core/api_client_core.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/core/http_client_exception.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/__init__.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/base_response.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/cloud_provider_region.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/container_param_request.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/container_response.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/docker_container_assigned_device.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/docker_container_controller/docker_container_list_request.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/docker_container_controller/docker_container_list_response.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/docker_container_mapping.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/entity_filter_request.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/enums/__init__.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/enums/container_pending_action.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/enums/container_status.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/enums/cpu_type.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/enums/currency_type.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/enums/daemon_status.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/enums/disk_type.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/enums/drive_type.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/enums/gpu_name.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/enums/inference_model_status.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/enums/inference_simulator_status.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/enums/instance_rented_status.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/enums/instance_type.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/enums/location_region.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/enums/power_status.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/enums/provider_name.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/enums/selfhosted_status.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/enums/task_execution_status.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/enums/task_status.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/frontend_status.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/inference_controller/deploy_inference_model_to_instance_request.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/inference_controller/deploy_inference_model_to_instance_response.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/inference_controller/deploy_inference_model_to_sagemaker_request.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/inference_controller/deploy_inference_model_to_sagemaker_response.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/inference_controller/get_inference_simulator_request.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/inference_controller/get_inference_simulator_response.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/inference_controller/inference_simulator_list_for_project_request.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/inference_controller/inference_simulator_list_for_project_response.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/inference_controller/inference_simulator_model_list_for_project_request.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/inference_controller/inference_simulator_model_list_for_project_response.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/inference_simulator_model_response.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/inference_simulator_response.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/installed_service.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/instance_detected_gpus.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/instance_rented_response.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/logging_controller/docker_container_log_stream_request.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/logging_controller/log_polling_request.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/logging_controller/log_polling_response.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/logging_controller/task_log_stream_request.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/logging_controller/user_logs_query_request.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/logging_controller/user_logs_query_response.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/paginated_entity_list.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/pagination_data.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/price_definition.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/project_controller/project_get_deploy_ssh_key_request.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/project_controller/project_get_deploy_ssh_key_response.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/project_controller/project_push_inference_simulator_model_request.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/project_controller/project_push_inference_simulator_model_response.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/project_controller/project_run_task_request.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/project_controller/project_run_task_response.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/project_controller/project_start_inference_simulator_response.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/project_response.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/selfhosted_instance_response.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/sftp_path_helper.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/ssh_key_controller/add_ssh_key_to_user_request.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/ssh_key_controller/add_ssh_key_to_user_response.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/ssh_key_controller/add_ssh_public_key_to_instance_request.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/ssh_key_controller/add_ssh_public_key_to_instance_response.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/ssh_key_controller/is_user_has_public_ssh_key_request.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/ssh_key_controller/is_user_has_public_ssh_key_response.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/task_controller/task_list_for_project_request.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/task_controller/task_list_for_project_response.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/task_controller/task_status_localized_map_response.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/task_controller/task_view_response.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/user_profile.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/config_provider/__init__.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/config_provider/config_provider.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/connect/connect_service.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/connect/dto/remote_server_config.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/container/__init__.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/container/container_service.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/container/mapper/__init__.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/container/mapper/container_mapper.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/core_files/config_entity.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/filesystem_service.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/instance/__init__.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/instance/instance_service.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/instance/mapper/__init__.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/instance/mapper/instance_mapper.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/instance/mapper/selfhosted_mapper.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/logging/byte_print_style.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/logging/dto/log_message.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/logging/dto/log_type.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/logging/logging_constants.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/project/__init__.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/project/dto/inference_simulator_dto.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/project/dto/inference_simulator_model_dto.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/project/dto/project_config.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/project/mapper/__init__.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/project/mapper/project_inference_simulator_mapper.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/project/mapper/project_inference_simulator_model_mapper.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/project/mapper/project_task_mapper.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/remote_server_service.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/service_factory.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/task/dto/task_dto.py +0 -0
- {thestage-0.5.40 → thestage-0.5.42}/thestage/services/validation_service.py +0 -0
|
@@ -6,7 +6,7 @@ from thestage.services.core_files.config_entity import ConfigEntity
|
|
|
6
6
|
|
|
7
7
|
from thestage.entities.enums.yes_no_response import YesOrNoResponse
|
|
8
8
|
from thestage.i18n.translation import __
|
|
9
|
-
from thestage.helpers.logger.app_logger import app_logger
|
|
9
|
+
from thestage.helpers.logger.app_logger import app_logger, get_log_path_from_os
|
|
10
10
|
from thestage.services.config_provider.config_provider import ConfigProvider
|
|
11
11
|
from thestage.services.connect.connect_service import ConnectService
|
|
12
12
|
from thestage.services.service_factory import ServiceFactory
|
|
@@ -40,6 +40,8 @@ def config_get():
|
|
|
40
40
|
if config.runtime.config_global_path:
|
|
41
41
|
typer.echo(__('CONFIG PATH: %path%', {'path': str(config.runtime.config_global_path or '') + f'/config.json'}))
|
|
42
42
|
|
|
43
|
+
typer.echo(__('APPLICATION LOGS PATH: %path%', {'path': str(get_log_path_from_os())}))
|
|
44
|
+
|
|
43
45
|
raise typer.Exit(0)
|
|
44
46
|
|
|
45
47
|
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import time
|
|
2
|
+
from pathlib import Path
|
|
2
3
|
from typing import Optional, List
|
|
3
4
|
|
|
4
5
|
import re
|
|
6
|
+
|
|
5
7
|
import typer
|
|
6
8
|
from typing_extensions import Annotated
|
|
7
9
|
|
|
@@ -425,6 +427,13 @@ def run_inference_simulator(
|
|
|
425
427
|
help=__("Disable real-time log streaming"),
|
|
426
428
|
is_eager=False,
|
|
427
429
|
),
|
|
430
|
+
is_skip_installation: Optional[bool] = typer.Option(
|
|
431
|
+
False,
|
|
432
|
+
"--skip-installation",
|
|
433
|
+
"-si",
|
|
434
|
+
help=__("Skip installing dependencies from requirements.txt and install.sh"),
|
|
435
|
+
is_eager=False,
|
|
436
|
+
),
|
|
428
437
|
):
|
|
429
438
|
"""
|
|
430
439
|
Run an inference simulator within a project
|
|
@@ -438,6 +447,35 @@ def run_inference_simulator(
|
|
|
438
447
|
service_factory = validate_config_and_get_service_factory(working_directory=working_directory)
|
|
439
448
|
config = service_factory.get_config_provider().get_full_config()
|
|
440
449
|
|
|
450
|
+
working_dir_path = Path(working_directory) if working_directory else Path(config.runtime.working_directory)
|
|
451
|
+
inference_files = list(working_dir_path.rglob("inference.py"))
|
|
452
|
+
if not inference_files:
|
|
453
|
+
typer.echo("No inference.py file found in the project directory.")
|
|
454
|
+
raise typer.Exit(1)
|
|
455
|
+
elif len(inference_files) == 1:
|
|
456
|
+
selected_inference = inference_files[0]
|
|
457
|
+
else:
|
|
458
|
+
choices = [str(path.relative_to(working_dir_path)) for path in inference_files]
|
|
459
|
+
typer.echo("Multiple inference.py files found:")
|
|
460
|
+
for idx, choice in enumerate(choices, start=1):
|
|
461
|
+
typer.echo(f"{idx}) {choice}")
|
|
462
|
+
choice_str = typer.prompt("Choose which inference.py to use")
|
|
463
|
+
try:
|
|
464
|
+
choice_index = int(choice_str)
|
|
465
|
+
except ValueError:
|
|
466
|
+
raise typer.BadParameter("Invalid input. Please enter a number.")
|
|
467
|
+
if not (1 <= choice_index <= len(choices)):
|
|
468
|
+
raise typer.BadParameter("Choice out of range.")
|
|
469
|
+
selected_inference = inference_files[choice_index - 1]
|
|
470
|
+
|
|
471
|
+
relative_inference = selected_inference.relative_to(working_dir_path)
|
|
472
|
+
parent_dir = relative_inference.parent
|
|
473
|
+
if parent_dir == Path("."):
|
|
474
|
+
inference_dir = "/"
|
|
475
|
+
else:
|
|
476
|
+
inference_dir = f"{parent_dir.as_posix()}/"
|
|
477
|
+
typer.echo(f"Selected inference file relative path: {inference_dir}")
|
|
478
|
+
|
|
441
479
|
project_service = service_factory.get_project_service()
|
|
442
480
|
|
|
443
481
|
project_service.project_run_inference_simulator(
|
|
@@ -446,6 +484,8 @@ def run_inference_simulator(
|
|
|
446
484
|
slug=unique_id,
|
|
447
485
|
rented_instance_unique_id=rented_instance_unique_id,
|
|
448
486
|
self_hosted_instance_unique_id=self_hosted_instance_unique_id,
|
|
487
|
+
inference_dir=inference_dir,
|
|
488
|
+
is_skip_installation=is_skip_installation,
|
|
449
489
|
)
|
|
450
490
|
|
|
451
491
|
if enable_log_stream:
|
|
@@ -107,7 +107,8 @@ def error_handler() -> Callable:
|
|
|
107
107
|
else:
|
|
108
108
|
typer.echo(__('Undefined error occurred'))
|
|
109
109
|
# typer.echo(e100.__class__.__name__)
|
|
110
|
-
print(traceback.format_exc())
|
|
110
|
+
# print(traceback.format_exc())
|
|
111
|
+
# TODO send all exceptions to backend?
|
|
111
112
|
app_logger.info(f'{traceback.format_exc()}')
|
|
112
113
|
raise typer.Exit(1)
|
|
113
114
|
return wrapper
|
|
@@ -6,6 +6,7 @@ from typing import Optional, List
|
|
|
6
6
|
import git
|
|
7
7
|
import typer
|
|
8
8
|
from git import Remote, Repo, GitCommandError, Commit
|
|
9
|
+
from gitdb.exc import BadName
|
|
9
10
|
from rich import print
|
|
10
11
|
|
|
11
12
|
from thestage.color_scheme.color_scheme import ColorScheme
|
|
@@ -227,7 +228,10 @@ class GitLocalClient:
|
|
|
227
228
|
def get_commit_by_hash(self, path: str, commit_hash: str) -> Optional[Commit]:
|
|
228
229
|
repo = self.__get_repo(path=path)
|
|
229
230
|
if repo:
|
|
230
|
-
|
|
231
|
+
try:
|
|
232
|
+
return repo.commit(commit_hash)
|
|
233
|
+
except BadName as ex:
|
|
234
|
+
return None
|
|
231
235
|
else:
|
|
232
236
|
return None
|
|
233
237
|
|
|
@@ -603,6 +603,8 @@ class TheStageApiClient(TheStageApiClientCore):
|
|
|
603
603
|
commit_hash: Optional[str] = None,
|
|
604
604
|
rented_instance_unique_id: Optional[str] = None,
|
|
605
605
|
self_hosted_instance_unique_id: Optional[str] = None,
|
|
606
|
+
inference_dir: Optional[str] = None,
|
|
607
|
+
is_skip_installation: Optional[bool] = False,
|
|
606
608
|
) -> Optional[ProjectStartInferenceSimulatorResponse]:
|
|
607
609
|
request = ProjectStartInferenceSimulatorRequest(
|
|
608
610
|
projectSlug=project_slug,
|
|
@@ -610,6 +612,8 @@ class TheStageApiClient(TheStageApiClientCore):
|
|
|
610
612
|
slug=slug,
|
|
611
613
|
instanceRentedUId=rented_instance_unique_id,
|
|
612
614
|
selfhostedInstanceUId=self_hosted_instance_unique_id,
|
|
615
|
+
inferenceDir=inference_dir,
|
|
616
|
+
isSkipInstallation=is_skip_installation,
|
|
613
617
|
)
|
|
614
618
|
|
|
615
619
|
response = self._request(
|
|
@@ -10,4 +10,6 @@ class ProjectStartInferenceSimulatorRequest(BaseModel):
|
|
|
10
10
|
instanceRentedUId: Optional[str] = Field(None, alias='instanceRentedUId')
|
|
11
11
|
selfhostedInstanceUId: Optional[str] = Field(None, alias='selfhostedInstanceUId')
|
|
12
12
|
commitHash: Optional[str] = Field(None, alias='commitHash')
|
|
13
|
-
slug: Optional[str] = Field(None, alias='slug')
|
|
13
|
+
slug: Optional[str] = Field(None, alias='slug')
|
|
14
|
+
inferenceDir: Optional[str] = Field(None, alias='inferenceDir')
|
|
15
|
+
isSkipInstallation: Optional[bool] = Field(False, alias='isSkipInstallation')
|
|
@@ -9,6 +9,7 @@ import typer
|
|
|
9
9
|
from httpx import ReadTimeout, ConnectError, ConnectTimeout
|
|
10
10
|
from requests.exceptions import ChunkedEncodingError
|
|
11
11
|
|
|
12
|
+
from thestage.helpers.logger.app_logger import app_logger
|
|
12
13
|
from thestage.services.clients.thestage_api.dtos.enums.container_status import DockerContainerStatus
|
|
13
14
|
from thestage.services.core_files.config_entity import ConfigEntity
|
|
14
15
|
from thestage.services.clients.thestage_api.dtos.enums.inference_simulator_status import InferenceSimulatorStatus
|
|
@@ -27,6 +28,7 @@ from thestage.services.clients.thestage_api.api_client import TheStageApiClient
|
|
|
27
28
|
from thestage.services.config_provider.config_provider import ConfigProvider
|
|
28
29
|
from rich import print
|
|
29
30
|
|
|
31
|
+
from thestage.services.logging.exception.log_polling_exception import LogPollingException
|
|
30
32
|
from thestage.services.logging.logging_constants import LOG_MESSAGE_CODE_TASK_FINISHED, \
|
|
31
33
|
LOG_MESSAGE_CODE_INFERENCE_SIMULATOR_FAILED
|
|
32
34
|
|
|
@@ -302,6 +304,11 @@ class LoggingService(AbstractService):
|
|
|
302
304
|
last_log_id=last_log_id
|
|
303
305
|
)
|
|
304
306
|
|
|
307
|
+
if not logs_response.is_success:
|
|
308
|
+
app_logger.info(f'Polling logs error: {logs_response.message}')
|
|
309
|
+
raise LogPollingException('')
|
|
310
|
+
|
|
311
|
+
|
|
305
312
|
if consecutive_error_count > 0:
|
|
306
313
|
consecutive_error_count = 0
|
|
307
314
|
errors_started_at = None
|
|
@@ -323,10 +330,13 @@ class LoggingService(AbstractService):
|
|
|
323
330
|
|
|
324
331
|
if is_no_more_logs:
|
|
325
332
|
break
|
|
326
|
-
except (ReadTimeout, ConnectError, ConnectTimeout) as e:
|
|
333
|
+
except (ReadTimeout, ConnectError, ConnectTimeout, LogPollingException) as e:
|
|
327
334
|
consecutive_error_count += 1
|
|
328
335
|
if consecutive_error_count == 1:
|
|
329
|
-
|
|
336
|
+
if isinstance(e, LogPollingException):
|
|
337
|
+
print_nonblocking("Some problems raised while getting logs...", writer, BytePrintStyle.ORANGE)
|
|
338
|
+
else:
|
|
339
|
+
print_nonblocking("Network issues, attempting to re-establish connection...", writer, BytePrintStyle.ORANGE)
|
|
330
340
|
if not errors_started_at:
|
|
331
341
|
errors_started_at = datetime.utcnow()
|
|
332
342
|
|
|
@@ -367,13 +367,14 @@ class ProjectService(AbstractService):
|
|
|
367
367
|
commit = self.__git_local_client.get_current_commit(path=config.runtime.working_directory)
|
|
368
368
|
if commit and isinstance(commit, Commit):
|
|
369
369
|
commit_hash = commit.hexsha
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
370
|
+
|
|
371
|
+
commit = self.__git_local_client.get_commit_by_hash(path=config.runtime.working_directory, commit_hash=commit_hash)
|
|
372
|
+
if commit and isinstance(commit, Commit):
|
|
373
373
|
if not task_title:
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
374
|
+
task_title = commit.message.strip()
|
|
375
|
+
else:
|
|
376
|
+
print(f'[red]Error: commit \'{commit_hash}\' was not found in the local repository[/red]')
|
|
377
|
+
raise typer.Exit(0)
|
|
377
378
|
|
|
378
379
|
if not task_title: # should not happen but maybe git allows some kind of empty messages
|
|
379
380
|
task_title = f'Task_{commit_hash}'
|
|
@@ -408,6 +409,8 @@ class ProjectService(AbstractService):
|
|
|
408
409
|
commit_hash: Optional[str] = None,
|
|
409
410
|
rented_instance_unique_id: Optional[str] = None,
|
|
410
411
|
self_hosted_instance_unique_id: Optional[str] = None,
|
|
412
|
+
inference_dir: Optional[str] = None,
|
|
413
|
+
is_skip_installation: Optional[bool] = False,
|
|
411
414
|
) -> Optional[InferenceSimulatorDto]:
|
|
412
415
|
project_config: ProjectConfig = self.__get_fixed_project_config(config=config)
|
|
413
416
|
if not project_config:
|
|
@@ -542,6 +545,8 @@ class ProjectService(AbstractService):
|
|
|
542
545
|
slug=slug,
|
|
543
546
|
rented_instance_unique_id=rented_instance_unique_id,
|
|
544
547
|
self_hosted_instance_unique_id=self_hosted_instance_unique_id,
|
|
548
|
+
inference_dir=inference_dir,
|
|
549
|
+
is_skip_installation=is_skip_installation,
|
|
545
550
|
)
|
|
546
551
|
if start_inference_simulator_response:
|
|
547
552
|
if start_inference_simulator_response.message:
|
thestage-0.5.40/thestage/.env
DELETED
|
Binary file
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/core/api_client_core.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/base_response.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/enums/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/enums/cpu_type.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/enums/disk_type.py
RENAMED
|
File without changes
|
{thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/enums/drive_type.py
RENAMED
|
File without changes
|
{thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/enums/gpu_name.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/enums/task_status.py
RENAMED
|
File without changes
|
{thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/frontend_status.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/installed_service.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/pagination_data.py
RENAMED
|
File without changes
|
{thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/price_definition.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/project_response.py
RENAMED
|
File without changes
|
|
File without changes
|
{thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/sftp_path_helper.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{thestage-0.5.40 → thestage-0.5.42}/thestage/services/clients/thestage_api/dtos/user_profile.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{thestage-0.5.40 → thestage-0.5.42}/thestage/services/project/dto/inference_simulator_dto.py
RENAMED
|
File without changes
|
{thestage-0.5.40 → thestage-0.5.42}/thestage/services/project/dto/inference_simulator_model_dto.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|