lightning-sdk 2025.8.6rc2__py3-none-any.whl → 2025.11.5__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.
- lightning_sdk/__init__.py +13 -7
- lightning_sdk/__version__.py +3 -0
- lightning_sdk/agents.py +2 -1
- lightning_sdk/ai_hub.py +2 -1
- lightning_sdk/api/__init__.py +2 -0
- lightning_sdk/api/base_studio_api.py +13 -9
- lightning_sdk/api/cloud_account_api.py +31 -10
- lightning_sdk/api/deployment_api.py +27 -1
- lightning_sdk/api/job_api.py +16 -12
- lightning_sdk/api/license_api.py +26 -59
- lightning_sdk/api/llm_api.py +25 -2
- lightning_sdk/api/mmt_api.py +5 -2
- lightning_sdk/api/studio_api.py +252 -55
- lightning_sdk/api/teamspace_api.py +106 -30
- lightning_sdk/api/user_api.py +56 -2
- lightning_sdk/api/utils.py +108 -18
- lightning_sdk/base_studio.py +51 -27
- lightning_sdk/cli/__init__.py +1 -0
- lightning_sdk/cli/base_studio/__init__.py +10 -0
- lightning_sdk/cli/base_studio/list.py +43 -0
- lightning_sdk/cli/config/__init__.py +14 -0
- lightning_sdk/cli/config/get.py +57 -0
- lightning_sdk/cli/config/set.py +92 -0
- lightning_sdk/cli/config/show.py +9 -0
- lightning_sdk/cli/entrypoint.py +71 -71
- lightning_sdk/cli/groups.py +56 -0
- lightning_sdk/cli/job/__init__.py +7 -0
- lightning_sdk/cli/{clusters_menu.py → legacy/clusters_menu.py} +9 -6
- lightning_sdk/cli/{configure.py → legacy/configure.py} +2 -2
- lightning_sdk/cli/{connect.py → legacy/connect.py} +2 -2
- lightning_sdk/cli/{create.py → legacy/create.py} +12 -14
- lightning_sdk/cli/{delete.py → legacy/delete.py} +5 -5
- lightning_sdk/cli/legacy/deploy/__init__.py +0 -0
- lightning_sdk/cli/{deploy → legacy/deploy}/_auth.py +5 -6
- lightning_sdk/cli/{deploy → legacy/deploy}/devbox.py +8 -2
- lightning_sdk/cli/{deploy → legacy/deploy}/serve.py +19 -8
- lightning_sdk/cli/{download.py → legacy/download.py} +14 -15
- lightning_sdk/cli/legacy/entrypoint.py +110 -0
- lightning_sdk/cli/{generate.py → legacy/generate.py} +1 -1
- lightning_sdk/cli/{inspection.py → legacy/inspection.py} +1 -1
- lightning_sdk/cli/{job_and_mmt_action.py → legacy/job_and_mmt_action.py} +6 -6
- lightning_sdk/cli/{jobs_menu.py → legacy/jobs_menu.py} +1 -1
- lightning_sdk/cli/{list.py → legacy/list.py} +12 -13
- lightning_sdk/cli/{mmts_menu.py → legacy/mmts_menu.py} +1 -1
- lightning_sdk/cli/{open.py → legacy/open.py} +4 -4
- lightning_sdk/cli/{start.py → legacy/start.py} +1 -0
- lightning_sdk/cli/{stop.py → legacy/stop.py} +1 -1
- lightning_sdk/cli/{switch.py → legacy/switch.py} +1 -0
- lightning_sdk/cli/{teamspace_menu.py → legacy/teamspace_menu.py} +1 -1
- lightning_sdk/cli/{upload.py → legacy/upload.py} +7 -8
- lightning_sdk/cli/license/__init__.py +14 -0
- lightning_sdk/cli/license/get.py +15 -0
- lightning_sdk/cli/license/list.py +45 -0
- lightning_sdk/cli/license/set.py +13 -0
- lightning_sdk/cli/mmt/__init__.py +7 -0
- lightning_sdk/cli/studio/__init__.py +24 -0
- lightning_sdk/cli/studio/connect.py +139 -0
- lightning_sdk/cli/studio/create.py +96 -0
- lightning_sdk/cli/studio/delete.py +49 -0
- lightning_sdk/cli/studio/list.py +85 -0
- lightning_sdk/cli/studio/ssh.py +64 -0
- lightning_sdk/cli/studio/start.py +115 -0
- lightning_sdk/cli/studio/stop.py +45 -0
- lightning_sdk/cli/studio/switch.py +66 -0
- lightning_sdk/cli/utils/__init__.py +7 -0
- lightning_sdk/cli/utils/cloud_account_map.py +10 -0
- lightning_sdk/cli/utils/get_base_studio.py +24 -0
- lightning_sdk/cli/utils/handle_machine_and_gpus_args.py +69 -0
- lightning_sdk/cli/utils/logging.py +122 -0
- lightning_sdk/cli/utils/owner_selection.py +110 -0
- lightning_sdk/cli/utils/resolve.py +28 -0
- lightning_sdk/cli/utils/richt_print.py +35 -0
- lightning_sdk/cli/utils/save_to_config.py +27 -0
- lightning_sdk/cli/utils/ssh_connection.py +59 -0
- lightning_sdk/cli/utils/studio_selection.py +113 -0
- lightning_sdk/cli/utils/teamspace_selection.py +125 -0
- lightning_sdk/cli/vm/__init__.py +20 -0
- lightning_sdk/cli/vm/create.py +33 -0
- lightning_sdk/cli/vm/delete.py +25 -0
- lightning_sdk/cli/vm/list.py +30 -0
- lightning_sdk/cli/vm/ssh.py +31 -0
- lightning_sdk/cli/vm/start.py +60 -0
- lightning_sdk/cli/vm/stop.py +25 -0
- lightning_sdk/cli/vm/switch.py +38 -0
- lightning_sdk/constants.py +1 -0
- lightning_sdk/deployment/__init__.py +2 -0
- lightning_sdk/deployment/deployment.py +17 -2
- lightning_sdk/helpers.py +56 -37
- lightning_sdk/job/base.py +21 -6
- lightning_sdk/job/job.py +13 -0
- lightning_sdk/job/v1.py +11 -0
- lightning_sdk/job/v2.py +12 -0
- lightning_sdk/lightning_cloud/login.py +320 -10
- lightning_sdk/lightning_cloud/openapi/__init__.py +113 -3
- lightning_sdk/lightning_cloud/openapi/api/__init__.py +3 -0
- lightning_sdk/lightning_cloud/openapi/api/assistants_service_api.py +713 -75
- lightning_sdk/lightning_cloud/openapi/api/auth_service_api.py +376 -0
- lightning_sdk/lightning_cloud/openapi/api/billing_service_api.py +191 -1
- lightning_sdk/lightning_cloud/openapi/api/cloud_space_environment_template_service_api.py +5 -1
- lightning_sdk/lightning_cloud/openapi/api/cloud_space_service_api.py +420 -0
- lightning_sdk/lightning_cloud/openapi/api/cloudy_service_api.py +0 -97
- lightning_sdk/lightning_cloud/openapi/api/cluster_service_api.py +420 -0
- lightning_sdk/lightning_cloud/openapi/api/data_connection_service_api.py +101 -0
- lightning_sdk/lightning_cloud/openapi/api/incidents_service_api.py +1058 -0
- lightning_sdk/lightning_cloud/openapi/api/jobs_service_api.py +121 -0
- lightning_sdk/lightning_cloud/openapi/api/k8_s_cluster_service_api.py +1742 -94
- lightning_sdk/lightning_cloud/openapi/api/markets_service_api.py +145 -0
- lightning_sdk/lightning_cloud/openapi/api/models_store_api.py +4 -4
- lightning_sdk/lightning_cloud/openapi/api/product_license_service_api.py +108 -108
- lightning_sdk/lightning_cloud/openapi/api/projects_service_api.py +105 -0
- lightning_sdk/lightning_cloud/openapi/api/schedules_service_api.py +347 -0
- lightning_sdk/lightning_cloud/openapi/api/sdk_command_history_service_api.py +141 -0
- lightning_sdk/lightning_cloud/openapi/api/storage_service_api.py +761 -1
- lightning_sdk/lightning_cloud/openapi/configuration.py +3 -19
- lightning_sdk/lightning_cloud/openapi/models/__init__.py +110 -3
- lightning_sdk/lightning_cloud/openapi/models/assistant_id_conversations_body.py +15 -15
- lightning_sdk/lightning_cloud/openapi/models/cloudspace_id_visibility_body.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/cluster_id_kubernetestemplates_body.py +201 -0
- lightning_sdk/lightning_cloud/openapi/models/cluster_id_metrics_body.py +131 -1
- lightning_sdk/lightning_cloud/openapi/models/create.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/create_machine_request_represents_the_request_to_create_a_machine.py +461 -0
- lightning_sdk/lightning_cloud/openapi/models/deployments_id_body.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/externalv1_cloud_space_instance_status.py +105 -1
- lightning_sdk/lightning_cloud/openapi/models/externalv1_user_status.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/id_codeconfig_body.py +3 -81
- lightning_sdk/lightning_cloud/openapi/models/id_fork_body1.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/id_render_body.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/id_sleepconfig_body.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/id_transfer_body.py +53 -1
- lightning_sdk/lightning_cloud/openapi/models/incident_id_messages_body.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/incidents_id_body.py +279 -0
- lightning_sdk/lightning_cloud/openapi/models/job_id_reportroutingtelemetry_body.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/kubernetestemplates_id_body.py +201 -0
- lightning_sdk/lightning_cloud/openapi/models/license_key_validate_body.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/message_id_actions_body.py +201 -0
- lightning_sdk/lightning_cloud/openapi/models/messages_message_id_body.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/metricsstream_create_body.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/models_model_id_body.py +109 -31
- lightning_sdk/lightning_cloud/openapi/models/models_model_id_body1.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/orgs_id_body.py +53 -1
- lightning_sdk/lightning_cloud/openapi/models/project_id_storage_body.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/project_id_storagetransfers_body.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/project_tab_management_messages.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/projects_id_body.py +79 -1
- lightning_sdk/lightning_cloud/openapi/models/storage_complete_body.py +41 -15
- lightning_sdk/lightning_cloud/openapi/models/storagetransfers_validate_body.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/update1.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/uploads_upload_id_body1.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/user_id_affiliatelinks_body.py +107 -3
- lightning_sdk/lightning_cloud/openapi/models/v1_abort_storage_transfer_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_aggregated_pod_metrics.py +799 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_ai_pod_v1.py +53 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_assistant_session_daily_aggregated.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_billing_tier.py +0 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_cancel_running_cloud_space_instance_transfer_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_cloud_provider.py +2 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_cloud_space_environment_template_config.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_cloud_space_specialized_view.py +1 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_cloud_space_transfer_metadata.py +147 -17
- lightning_sdk/lightning_cloud/openapi/models/v1_cloudflare_v1.py +3 -29
- lightning_sdk/lightning_cloud/openapi/models/v1_cluster_accelerator.py +53 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_cluster_capacity_reservation.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_cluster_metrics.py +1527 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_cluster_security_options.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_cluster_spec.py +53 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_cluster_type.py +1 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_container_metrics.py +21 -21
- lightning_sdk/lightning_cloud/openapi/models/v1_create_incident_request.py +305 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_create_license_request.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_create_machine_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_create_model_metrics_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_create_project_request.py +79 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_create_sdk_command_history_request.py +253 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_create_sdk_command_history_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_daily_model_metrics.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_data_connection.py +53 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_delete_incident_message_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_delete_incident_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_delete_kubernetes_template_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_delete_license_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_delete_machine_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_deployment.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_external_cluster_spec.py +53 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_external_search_user.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_filestore_data_connection.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_filesystem_metric.py +201 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_firewall_rule.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_get_cloud_space_required_balance_status_response.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_get_cloud_space_transfer_estimate_response.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_get_latest_model_metrics_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_get_machine_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_get_market_pricing_response.py +201 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_get_model_metrics_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_get_temp_bucket_credentials_response.py +201 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_get_user_response.py +41 -15
- lightning_sdk/lightning_cloud/openapi/models/v1_google_cloud_direct_v1.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_group_node_metrics.py +1215 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_group_pod_metrics.py +1241 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_guest_login_request.py +177 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_guest_login_response.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_guest_user.py +201 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_incident.py +565 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_incident_detail.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_incident_event.py +591 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_incident_message.py +253 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_incident_severity.py +105 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_incident_type.py +108 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_job.py +53 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_job_spec.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_k8s_incident_indexes.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_kai_scheduler_queue_metrics.py +627 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_kubernetes_aws_config.py +279 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_kubernetes_direct_settings_v1.py +253 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_kubernetes_direct_v1.py +107 -3
- lightning_sdk/lightning_cloud/openapi/models/v1_kubernetes_template.py +357 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_kubernetes_template_property.py +227 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_lambda_labs_direct_v1.py +29 -3
- lightning_sdk/lightning_cloud/openapi/models/v1_license.py +227 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_lightning_elastic_cluster_v1.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_aggregated_pod_metrics_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_cluster_metric_timestamps_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_cluster_metrics_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_cluster_namespace_metrics_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_cluster_namespace_user_metrics_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_conversation_message_actions_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_filesystem_metrics_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_group_pod_metrics_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_incident_events_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_incident_messages_response.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_incidents_response.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_kai_scheduler_queues_metrics_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_kubernetes_templates_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/{v1_list_product_licenses_response.py → v1_list_license_response.py} +16 -16
- lightning_sdk/lightning_cloud/openapi/models/v1_list_machines_response.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_platform_notifications_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_schedule_runs_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_list_storage_transfers_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_lustre_data_connection.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_machine.py +617 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_machine_direct_v1.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_magic_link_login_request.py +1 -27
- lightning_sdk/lightning_cloud/openapi/models/v1_magic_link_login_response.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_managed_model.py +29 -3
- lightning_sdk/lightning_cloud/openapi/models/v1_market_price.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_membership.py +53 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_message_action.py +279 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_metrics_stream.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_model_metrics.py +175 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_namespace_metrics.py +591 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_namespace_user_metrics.py +435 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_nebius_direct_v1.py +29 -3
- lightning_sdk/lightning_cloud/openapi/models/v1_node_metrics.py +361 -23
- lightning_sdk/lightning_cloud/openapi/models/v1_notification_type.py +1 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_organization.py +53 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_pause_storage_transfer_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_platform_notification.py +279 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_pod_metrics.py +335 -23
- lightning_sdk/lightning_cloud/openapi/models/v1_project.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_project_cluster_binding.py +27 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_project_membership.py +53 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_project_settings.py +53 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_project_tab.py +149 -0
- lightning_sdk/lightning_cloud/openapi/models/{v1_product_license_check_response.py → v1_purchase_annual_upsell_request.py} +23 -23
- lightning_sdk/lightning_cloud/openapi/models/v1_purchase_annual_upsell_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_quote_annual_upsell_response.py +227 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_render_kubernetes_template_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_report_deployment_routing_telemetry_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_required_balance_reason.py +107 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_reset_api_key_request.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_reset_api_key_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_resource_visibility.py +1 -27
- lightning_sdk/lightning_cloud/openapi/models/v1_resume_storage_transfer_response.py +97 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_routing_telemetry.py +79 -1
- lightning_sdk/lightning_cloud/openapi/models/v1_rule_resource.py +1 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_schedule_run.py +357 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_sdk_command_history_severity.py +104 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_sdk_command_history_type.py +104 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_secret_type.py +1 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_server_alert_type.py +1 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_slack_notifier.py +201 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_slack_notifier_type.py +105 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_storage_asset.py +133 -3
- lightning_sdk/lightning_cloud/openapi/models/v1_storage_transfer.py +435 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_storage_transfer_status.py +108 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_token_login_request.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_token_login_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_token_owner_type.py +104 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_update_cloud_space_instance_config_request.py +3 -81
- lightning_sdk/lightning_cloud/openapi/models/v1_update_project_tab_order_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_update_user_request.py +41 -15
- lightning_sdk/lightning_cloud/openapi/models/v1_user_features.py +444 -600
- lightning_sdk/lightning_cloud/openapi/models/v1_validate_license_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_validate_storage_transfer_response.py +123 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_voltage_park_direct_v1.py +29 -3
- lightning_sdk/lightning_cloud/rest_client.py +48 -45
- lightning_sdk/lightning_cloud/utils/data_connection.py +51 -1
- lightning_sdk/llm/llm.py +175 -56
- lightning_sdk/llm/public_assistants.py +44 -7
- lightning_sdk/machine.py +21 -2
- lightning_sdk/mmt/base.py +7 -0
- lightning_sdk/mmt/mmt.py +11 -3
- lightning_sdk/mmt/v1.py +3 -1
- lightning_sdk/mmt/v2.py +4 -0
- lightning_sdk/owner.py +2 -1
- lightning_sdk/pipeline/steps.py +6 -0
- lightning_sdk/plugin.py +6 -1
- lightning_sdk/studio.py +294 -53
- lightning_sdk/teamspace.py +167 -7
- lightning_sdk/user.py +19 -1
- lightning_sdk/utils/config.py +179 -0
- lightning_sdk/utils/license.py +13 -0
- lightning_sdk/utils/logging.py +79 -0
- lightning_sdk/utils/names.py +1179 -0
- lightning_sdk/utils/progress.py +283 -0
- lightning_sdk/utils/resolve.py +82 -7
- {lightning_sdk-2025.8.6rc2.dist-info → lightning_sdk-2025.11.5.dist-info}/METADATA +2 -1
- {lightning_sdk-2025.8.6rc2.dist-info → lightning_sdk-2025.11.5.dist-info}/RECORD +328 -169
- {lightning_sdk-2025.8.6rc2.dist-info → lightning_sdk-2025.11.5.dist-info}/entry_points.txt +1 -0
- lightning_sdk/lightning_cloud/openapi/models/v1_product_license.py +0 -435
- lightning_sdk/services/license.py +0 -363
- /lightning_sdk/cli/{deploy → legacy}/__init__.py +0 -0
- /lightning_sdk/cli/{ai_hub.py → legacy/ai_hub.py} +0 -0
- /lightning_sdk/cli/{docker_cli.py → legacy/docker_cli.py} +0 -0
- /lightning_sdk/cli/{exceptions.py → legacy/exceptions.py} +0 -0
- /lightning_sdk/cli/{run.py → legacy/run.py} +0 -0
- /lightning_sdk/cli/{studios_menu.py → legacy/studios_menu.py} +0 -0
- /lightning_sdk/cli/{coloring.py → utils/coloring.py} +0 -0
- {lightning_sdk-2025.8.6rc2.dist-info → lightning_sdk-2025.11.5.dist-info}/LICENSE +0 -0
- {lightning_sdk-2025.8.6rc2.dist-info → lightning_sdk-2025.11.5.dist-info}/WHEEL +0 -0
- {lightning_sdk-2025.8.6rc2.dist-info → lightning_sdk-2025.11.5.dist-info}/top_level.txt +0 -0
lightning_sdk/cli/entrypoint.py
CHANGED
|
@@ -1,69 +1,38 @@
|
|
|
1
|
+
"""New Lightning CLI entrypoint with organized command groups."""
|
|
2
|
+
|
|
3
|
+
import os
|
|
1
4
|
import sys
|
|
2
|
-
import traceback
|
|
3
|
-
from types import TracebackType
|
|
4
|
-
from typing import Type
|
|
5
5
|
|
|
6
6
|
import click
|
|
7
|
-
from rich.console import Console, Group
|
|
8
|
-
from rich.panel import Panel
|
|
9
|
-
from rich.syntax import Syntax
|
|
10
|
-
from rich.text import Text
|
|
11
7
|
|
|
12
8
|
from lightning_sdk import __version__
|
|
13
9
|
from lightning_sdk.api.studio_api import _cloud_url
|
|
14
|
-
from lightning_sdk.cli.ai_hub import aihub
|
|
15
|
-
from lightning_sdk.cli.coloring import CustomHelpFormatter
|
|
16
|
-
from lightning_sdk.cli.configure import configure
|
|
17
|
-
from lightning_sdk.cli.connect import connect
|
|
18
|
-
from lightning_sdk.cli.create import create
|
|
19
|
-
from lightning_sdk.cli.delete import delete
|
|
20
|
-
from lightning_sdk.cli.deploy.serve import deploy
|
|
21
|
-
from lightning_sdk.cli.docker_cli import dockerize
|
|
22
|
-
from lightning_sdk.cli.download import download
|
|
23
|
-
from lightning_sdk.cli.generate import generate
|
|
24
|
-
from lightning_sdk.cli.inspection import inspect
|
|
25
|
-
from lightning_sdk.cli.list import list_cli
|
|
26
|
-
from lightning_sdk.cli.open import open
|
|
27
|
-
from lightning_sdk.cli.run import run
|
|
28
|
-
from lightning_sdk.cli.start import start
|
|
29
|
-
from lightning_sdk.cli.stop import stop
|
|
30
|
-
from lightning_sdk.cli.switch import switch
|
|
31
|
-
from lightning_sdk.cli.upload import upload
|
|
32
|
-
from lightning_sdk.constants import _LIGHTNING_DEBUG
|
|
33
|
-
from lightning_sdk.lightning_cloud.login import Auth
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
def _notify_exception(exception_type: Type[BaseException], value: BaseException, tb: TracebackType) -> None:
|
|
37
|
-
"""CLI won't show tracebacks, just print the exception message."""
|
|
38
|
-
console = Console()
|
|
39
|
-
|
|
40
|
-
message = str(value.args[0]) if value.args else str(value) or "An unknown error occurred"
|
|
41
10
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
renderables.append(Text("\n📘 Need help? Run: lightning <command> --help", style="cyan"))
|
|
56
|
-
|
|
57
|
-
console.print(Panel(Group(*renderables), title="⚡ Lightning CLI Error", border_style="red"))
|
|
11
|
+
# Import legacy groups directly from groups.py
|
|
12
|
+
from lightning_sdk.cli.groups import (
|
|
13
|
+
base_studio,
|
|
14
|
+
config,
|
|
15
|
+
# job,
|
|
16
|
+
license,
|
|
17
|
+
# mmt,
|
|
18
|
+
studio,
|
|
19
|
+
vm,
|
|
20
|
+
)
|
|
21
|
+
from lightning_sdk.cli.utils import CustomHelpFormatter
|
|
22
|
+
from lightning_sdk.cli.utils.logging import CommandLoggingGroup, logging_excepthook
|
|
23
|
+
from lightning_sdk.lightning_cloud.login import Auth
|
|
58
24
|
|
|
59
25
|
|
|
60
|
-
@click.group(
|
|
26
|
+
@click.group(
|
|
27
|
+
name="lightning",
|
|
28
|
+
help="Command line interface (CLI) to interact with/manage Lightning AI Studios.",
|
|
29
|
+
cls=CommandLoggingGroup,
|
|
30
|
+
)
|
|
61
31
|
@click.version_option(__version__, message="Lightning CLI version %(version)s")
|
|
62
32
|
def main_cli() -> None:
|
|
63
|
-
sys.excepthook =
|
|
33
|
+
sys.excepthook = logging_excepthook
|
|
64
34
|
|
|
65
35
|
|
|
66
|
-
# colorful help messages
|
|
67
36
|
main_cli.context_class.formatter_class = CustomHelpFormatter
|
|
68
37
|
|
|
69
38
|
|
|
@@ -86,24 +55,55 @@ def logout() -> None:
|
|
|
86
55
|
auth.clear()
|
|
87
56
|
|
|
88
57
|
|
|
89
|
-
#
|
|
90
|
-
main_cli.add_command(
|
|
91
|
-
main_cli.add_command(
|
|
92
|
-
main_cli.add_command(
|
|
93
|
-
main_cli.add_command(
|
|
94
|
-
main_cli.add_command(
|
|
95
|
-
main_cli.add_command(
|
|
96
|
-
main_cli.add_command(
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
58
|
+
# Add new command groups
|
|
59
|
+
main_cli.add_command(config)
|
|
60
|
+
# main_cli.add_command(job)
|
|
61
|
+
# main_cli.add_command(mmt)
|
|
62
|
+
main_cli.add_command(studio)
|
|
63
|
+
main_cli.add_command(vm)
|
|
64
|
+
main_cli.add_command(base_studio)
|
|
65
|
+
main_cli.add_command(license)
|
|
66
|
+
|
|
67
|
+
if os.environ.get("LIGHTNING_EXPERIMENTAL_CLI_ONLY", "0") != "1":
|
|
68
|
+
#### LEGACY COMMANDS ####
|
|
69
|
+
# these commands are currently supported for backwards compatibility, but will potentially be removed in the future.
|
|
70
|
+
# they've grown pretty wild and provide a very inconsistent UX.
|
|
71
|
+
from lightning_sdk.cli.legacy.ai_hub import aihub
|
|
72
|
+
from lightning_sdk.cli.legacy.configure import configure
|
|
73
|
+
from lightning_sdk.cli.legacy.connect import connect
|
|
74
|
+
from lightning_sdk.cli.legacy.create import create
|
|
75
|
+
from lightning_sdk.cli.legacy.delete import delete
|
|
76
|
+
from lightning_sdk.cli.legacy.deploy.serve import deploy
|
|
77
|
+
from lightning_sdk.cli.legacy.docker_cli import dockerize
|
|
78
|
+
from lightning_sdk.cli.legacy.download import download
|
|
79
|
+
from lightning_sdk.cli.legacy.generate import generate
|
|
80
|
+
from lightning_sdk.cli.legacy.inspection import inspect
|
|
81
|
+
from lightning_sdk.cli.legacy.list import list_cli
|
|
82
|
+
from lightning_sdk.cli.legacy.open import open as open_cmd
|
|
83
|
+
from lightning_sdk.cli.legacy.run import run
|
|
84
|
+
from lightning_sdk.cli.legacy.start import start
|
|
85
|
+
from lightning_sdk.cli.legacy.stop import stop
|
|
86
|
+
from lightning_sdk.cli.legacy.switch import switch
|
|
87
|
+
from lightning_sdk.cli.legacy.upload import upload
|
|
88
|
+
|
|
89
|
+
# Add old command groups
|
|
90
|
+
main_cli.add_command(aihub)
|
|
91
|
+
main_cli.add_command(configure)
|
|
92
|
+
main_cli.add_command(connect)
|
|
93
|
+
main_cli.add_command(create)
|
|
94
|
+
main_cli.add_command(delete)
|
|
95
|
+
main_cli.add_command(deploy)
|
|
96
|
+
main_cli.add_command(dockerize)
|
|
97
|
+
main_cli.add_command(download)
|
|
98
|
+
main_cli.add_command(generate)
|
|
99
|
+
main_cli.add_command(inspect)
|
|
100
|
+
main_cli.add_command(list_cli)
|
|
101
|
+
main_cli.add_command(open_cmd)
|
|
102
|
+
main_cli.add_command(run)
|
|
103
|
+
main_cli.add_command(start)
|
|
104
|
+
main_cli.add_command(stop)
|
|
105
|
+
main_cli.add_command(switch)
|
|
106
|
+
main_cli.add_command(upload)
|
|
107
107
|
|
|
108
108
|
|
|
109
109
|
if __name__ == "__main__":
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"""CLI groups for organizing Lightning SDK commands."""
|
|
2
|
+
|
|
3
|
+
import click
|
|
4
|
+
|
|
5
|
+
from lightning_sdk.cli.base_studio import register_commands as register_base_studio_commands
|
|
6
|
+
from lightning_sdk.cli.config import register_commands as register_config_commands
|
|
7
|
+
from lightning_sdk.cli.job import register_commands as register_job_commands
|
|
8
|
+
from lightning_sdk.cli.license import register_commands as register_license_commands
|
|
9
|
+
from lightning_sdk.cli.mmt import register_commands as register_mmt_commands
|
|
10
|
+
from lightning_sdk.cli.studio import register_commands as register_studio_commands
|
|
11
|
+
from lightning_sdk.cli.vm import register_commands as register_vm_commands
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@click.group(name="studio")
|
|
15
|
+
def studio() -> None:
|
|
16
|
+
"""Manage Lightning AI Studios."""
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@click.group(name="job")
|
|
20
|
+
def job() -> None:
|
|
21
|
+
"""Manage Lightning AI Jobs."""
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@click.group(name="mmt")
|
|
25
|
+
def mmt() -> None:
|
|
26
|
+
"""Manage Lightning AI Multi-Machine Training (MMT)."""
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@click.group(name="config")
|
|
30
|
+
def config() -> None:
|
|
31
|
+
"""Manage Lightning SDK and CLI configuration."""
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@click.group(name="vm")
|
|
35
|
+
def vm() -> None:
|
|
36
|
+
"""Manage Lightning AI VMs."""
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
@click.group(name="base-studio")
|
|
40
|
+
def base_studio() -> None:
|
|
41
|
+
"""Manage Lightning AI Base Studios."""
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@click.group(name="license")
|
|
45
|
+
def license() -> None: # noqa: A001
|
|
46
|
+
"""Manage Lightning AI Product Licenses."""
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
# Register config commands with the main config group
|
|
50
|
+
register_job_commands(job)
|
|
51
|
+
register_mmt_commands(mmt)
|
|
52
|
+
register_studio_commands(studio)
|
|
53
|
+
register_config_commands(config)
|
|
54
|
+
register_vm_commands(vm)
|
|
55
|
+
register_base_studio_commands(base_studio)
|
|
56
|
+
register_license_commands(license)
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import sys
|
|
2
|
-
from typing import List
|
|
2
|
+
from typing import List, Optional
|
|
3
3
|
|
|
4
4
|
from rich.console import Console
|
|
5
5
|
from simple_term_menu import TerminalMenu
|
|
6
6
|
|
|
7
7
|
from lightning_sdk import Teamspace
|
|
8
8
|
from lightning_sdk.api.cloud_account_api import CloudAccountApi
|
|
9
|
-
from lightning_sdk.lightning_cloud.openapi import
|
|
9
|
+
from lightning_sdk.lightning_cloud.openapi import V1ClusterType, V1ProjectClusterBinding
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
class _ClustersMenu:
|
|
@@ -22,18 +22,21 @@ class _ClustersMenu:
|
|
|
22
22
|
|
|
23
23
|
return TerminalMenu(cluster_ids, title=title, clear_menu_on_exit=True)
|
|
24
24
|
|
|
25
|
-
def _resolve_cluster(self, teamspace: Teamspace) ->
|
|
25
|
+
def _resolve_cluster(self, teamspace: Teamspace) -> Optional[str]:
|
|
26
26
|
selected_cluster_id = None
|
|
27
27
|
console = Console()
|
|
28
28
|
try:
|
|
29
|
-
selected_cluster_id = self._get_cluster_from_interactive_menu(
|
|
29
|
+
selected_cluster_id = teamspace.default_cloud_account or self._get_cluster_from_interactive_menu(
|
|
30
30
|
possible_clusters=teamspace.cloud_account_objs
|
|
31
31
|
)
|
|
32
|
+
|
|
32
33
|
cloud_account_api = CloudAccountApi()
|
|
33
34
|
|
|
34
|
-
|
|
35
|
-
|
|
35
|
+
resolved_cluster_obj = cloud_account_api.get_cloud_account(
|
|
36
|
+
cloud_account_id=selected_cluster_id, org_id=teamspace.owner.id, teamspace_id=teamspace.id
|
|
36
37
|
)
|
|
38
|
+
|
|
39
|
+
return None if resolved_cluster_obj.spec.cluster_type == V1ClusterType.GLOBAL else resolved_cluster_obj.id
|
|
37
40
|
except KeyboardInterrupt:
|
|
38
41
|
console.print("Operation cancelled by user")
|
|
39
42
|
sys.exit(0)
|
|
@@ -7,8 +7,8 @@ from typing import Optional, Union
|
|
|
7
7
|
import click
|
|
8
8
|
from rich.console import Console
|
|
9
9
|
|
|
10
|
-
from lightning_sdk.cli.generate import _generate_ssh_config
|
|
11
|
-
from lightning_sdk.cli.studios_menu import _StudiosMenu
|
|
10
|
+
from lightning_sdk.cli.legacy.generate import _generate_ssh_config
|
|
11
|
+
from lightning_sdk.cli.legacy.studios_menu import _StudiosMenu
|
|
12
12
|
from lightning_sdk.lightning_cloud.login import Auth
|
|
13
13
|
|
|
14
14
|
|
|
@@ -4,8 +4,8 @@ from typing import Optional
|
|
|
4
4
|
|
|
5
5
|
import click
|
|
6
6
|
|
|
7
|
-
from lightning_sdk.cli.configure import _configure_ssh_internal
|
|
8
|
-
from lightning_sdk.cli.studios_menu import _StudiosMenu
|
|
7
|
+
from lightning_sdk.cli.legacy.configure import _configure_ssh_internal
|
|
8
|
+
from lightning_sdk.cli.legacy.studios_menu import _StudiosMenu
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
@click.group(name="connect")
|
|
@@ -7,10 +7,8 @@ import click
|
|
|
7
7
|
from rich.console import Console
|
|
8
8
|
|
|
9
9
|
from lightning_sdk import Machine, Studio
|
|
10
|
-
from lightning_sdk.
|
|
11
|
-
from lightning_sdk.cli.teamspace_menu import _TeamspacesMenu
|
|
10
|
+
from lightning_sdk.cli.utils.teamspace_selection import TeamspacesMenu
|
|
12
11
|
from lightning_sdk.machine import CloudProvider
|
|
13
|
-
from lightning_sdk.utils.resolve import _resolve_deprecated_provider
|
|
14
12
|
|
|
15
13
|
_MACHINE_VALUES = tuple(
|
|
16
14
|
[machine.name for machine in Machine.__dict__.values() if isinstance(machine, Machine) and machine._include_in_cli]
|
|
@@ -80,16 +78,8 @@ def studio(
|
|
|
80
78
|
|
|
81
79
|
NAME: the name of the studio to create. If already present within teamspace, will add a random suffix.
|
|
82
80
|
"""
|
|
83
|
-
menu =
|
|
84
|
-
teamspace_resolved = menu
|
|
85
|
-
|
|
86
|
-
cloud_provider = str(_resolve_deprecated_provider(cloud_provider, provider))
|
|
87
|
-
|
|
88
|
-
if cloud_provider is not None:
|
|
89
|
-
cloud_account_api = CloudAccountApi()
|
|
90
|
-
cloud_account = cloud_account_api.resolve_cloud_account(
|
|
91
|
-
teamspace_resolved.id, cloud_account, cloud_provider, teamspace_resolved.default_cloud_account
|
|
92
|
-
)
|
|
81
|
+
menu = TeamspacesMenu()
|
|
82
|
+
teamspace_resolved = menu(teamspace)
|
|
93
83
|
|
|
94
84
|
# default cloud account to current studios cloud account if run from studio
|
|
95
85
|
# else it will fall back to teamspace default in the backend
|
|
@@ -107,11 +97,19 @@ def studio(
|
|
|
107
97
|
console.print(f"Studio with name {name} already exists. Using {new_name} instead.")
|
|
108
98
|
name = new_name
|
|
109
99
|
|
|
110
|
-
studio = Studio(
|
|
100
|
+
studio = Studio(
|
|
101
|
+
name=name,
|
|
102
|
+
teamspace=teamspace_resolved,
|
|
103
|
+
cloud_account=cloud_account,
|
|
104
|
+
create_ok=True,
|
|
105
|
+
cloud_provider=cloud_provider,
|
|
106
|
+
provider=provider,
|
|
107
|
+
)
|
|
111
108
|
|
|
112
109
|
console.print(f"Created Studio {studio.name}.")
|
|
113
110
|
|
|
114
111
|
if start is not None:
|
|
115
112
|
start_machine = getattr(Machine, start, start)
|
|
113
|
+
Studio.show_progress = True
|
|
116
114
|
studio.start(start_machine)
|
|
117
115
|
console.print(f"Started Studio {studio.name} on machine {start}")
|
|
@@ -3,9 +3,9 @@ from typing import Optional
|
|
|
3
3
|
import click
|
|
4
4
|
from rich.console import Console
|
|
5
5
|
|
|
6
|
-
from lightning_sdk.cli.exceptions import StudioCliError
|
|
7
|
-
from lightning_sdk.cli.job_and_mmt_action import _JobAndMMTAction
|
|
8
|
-
from lightning_sdk.cli.
|
|
6
|
+
from lightning_sdk.cli.legacy.exceptions import StudioCliError
|
|
7
|
+
from lightning_sdk.cli.legacy.job_and_mmt_action import _JobAndMMTAction
|
|
8
|
+
from lightning_sdk.cli.utils.teamspace_selection import TeamspacesMenu
|
|
9
9
|
from lightning_sdk.lightning_cloud.openapi.rest import ApiException
|
|
10
10
|
from lightning_sdk.lit_container import LitContainer
|
|
11
11
|
from lightning_sdk.studio import Studio
|
|
@@ -30,8 +30,8 @@ def delete() -> None:
|
|
|
30
30
|
def container(name: str, teamspace: Optional[str] = None) -> None:
|
|
31
31
|
"""Delete the docker container NAME."""
|
|
32
32
|
api = LitContainer()
|
|
33
|
-
menu =
|
|
34
|
-
resolved_teamspace = menu
|
|
33
|
+
menu = TeamspacesMenu()
|
|
34
|
+
resolved_teamspace = menu(teamspace=teamspace)
|
|
35
35
|
try:
|
|
36
36
|
api.delete_container(name, resolved_teamspace.name, resolved_teamspace.owner.name)
|
|
37
37
|
Console().print(f"Container {name} deleted successfully.")
|
|
File without changes
|
|
@@ -10,7 +10,7 @@ from rich.prompt import Confirm
|
|
|
10
10
|
|
|
11
11
|
from lightning_sdk import Teamspace
|
|
12
12
|
from lightning_sdk.api import UserApi
|
|
13
|
-
from lightning_sdk.cli.
|
|
13
|
+
from lightning_sdk.cli.utils.teamspace_selection import TeamspacesMenu
|
|
14
14
|
from lightning_sdk.lightning_cloud import env
|
|
15
15
|
from lightning_sdk.lightning_cloud.login import Auth, AuthServer
|
|
16
16
|
from lightning_sdk.lightning_cloud.openapi import V1CloudSpace
|
|
@@ -73,14 +73,13 @@ def authenticate(mode: _AuthMode, shall_confirm: bool = True) -> None:
|
|
|
73
73
|
|
|
74
74
|
def select_teamspace(teamspace: Optional[str], org: Optional[str], user: Optional[str]) -> Teamspace:
|
|
75
75
|
if teamspace is None:
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
possible_teamspaces = menu._get_possible_teamspaces(user)
|
|
76
|
+
menu = TeamspacesMenu()
|
|
77
|
+
possible_teamspaces = menu._get_possible_teamspaces(_get_authed_user())
|
|
79
78
|
if len(possible_teamspaces) == 1:
|
|
80
79
|
name = next(iter(possible_teamspaces.values()))["name"]
|
|
81
80
|
return Teamspace(name=name, org=org, user=user)
|
|
82
81
|
|
|
83
|
-
return menu
|
|
82
|
+
return menu(teamspace)
|
|
84
83
|
|
|
85
84
|
return _resolve_teamspace(teamspace=teamspace, org=org, user=user)
|
|
86
85
|
|
|
@@ -180,7 +179,7 @@ class _Onboarding:
|
|
|
180
179
|
return select_teamspace(teamspace, org, user)
|
|
181
180
|
|
|
182
181
|
# Run only when user hasn't completed onboarding yet.
|
|
183
|
-
menu =
|
|
182
|
+
menu = TeamspacesMenu()
|
|
184
183
|
self._wait_user_onboarding()
|
|
185
184
|
# Onboarding has been completed - user already selected organization if they could
|
|
186
185
|
possible_teamspaces = menu._get_possible_teamspaces(self.user)
|
|
@@ -12,8 +12,14 @@ from rich.prompt import Confirm
|
|
|
12
12
|
from rich.syntax import Syntax
|
|
13
13
|
|
|
14
14
|
from lightning_sdk import Machine
|
|
15
|
-
from lightning_sdk.cli.deploy._auth import
|
|
16
|
-
|
|
15
|
+
from lightning_sdk.cli.legacy.deploy._auth import (
|
|
16
|
+
_AuthMode,
|
|
17
|
+
_Onboarding,
|
|
18
|
+
authenticate,
|
|
19
|
+
poll_verified_status,
|
|
20
|
+
select_teamspace,
|
|
21
|
+
)
|
|
22
|
+
from lightning_sdk.cli.legacy.upload import (
|
|
17
23
|
_dump_current_upload_state,
|
|
18
24
|
_resolve_previous_upload_state,
|
|
19
25
|
_single_file_upload,
|
|
@@ -15,14 +15,15 @@ from rich.prompt import Confirm
|
|
|
15
15
|
from lightning_sdk import Machine, Teamspace
|
|
16
16
|
from lightning_sdk.api.lit_container_api import LitContainerApi
|
|
17
17
|
from lightning_sdk.api.utils import _get_registry_url
|
|
18
|
-
from lightning_sdk.cli.
|
|
18
|
+
from lightning_sdk.cli.legacy.clusters_menu import _ClustersMenu
|
|
19
|
+
from lightning_sdk.cli.legacy.deploy._auth import (
|
|
19
20
|
_AuthMode,
|
|
20
21
|
_Onboarding,
|
|
21
22
|
authenticate,
|
|
22
23
|
poll_verified_status,
|
|
23
24
|
select_teamspace,
|
|
24
25
|
)
|
|
25
|
-
from lightning_sdk.cli.deploy.devbox import _handle_devbox
|
|
26
|
+
from lightning_sdk.cli.legacy.deploy.devbox import _handle_devbox
|
|
26
27
|
from lightning_sdk.serve import _LitServeDeployer
|
|
27
28
|
|
|
28
29
|
_MACHINE_VALUES = tuple(
|
|
@@ -377,18 +378,24 @@ def _handle_cloud(
|
|
|
377
378
|
else:
|
|
378
379
|
resolved_teamspace = select_teamspace(teamspace, org, user)
|
|
379
380
|
|
|
381
|
+
lightning_containers_cloud_account = cloud_account
|
|
382
|
+
if not cloud_account:
|
|
383
|
+
clusters_menu = _ClustersMenu()
|
|
384
|
+
lightning_containers_cloud_account = clusters_menu._resolve_cluster(resolved_teamspace)
|
|
385
|
+
cloud_account = resolved_teamspace.default_cloud_account
|
|
386
|
+
|
|
380
387
|
# list containers to create the project if it doesn't exist
|
|
381
388
|
lit_cr = LitContainerApi()
|
|
382
|
-
lit_cr.list_containers(resolved_teamspace.id, cloud_account=
|
|
389
|
+
lit_cr.list_containers(resolved_teamspace.id, cloud_account=lightning_containers_cloud_account)
|
|
383
390
|
|
|
384
391
|
registry_url = _get_registry_url()
|
|
385
392
|
container_basename = repository.split("/")[-1]
|
|
386
393
|
image = (
|
|
387
|
-
f"{registry_url}/lit-container
|
|
388
|
-
f"{
|
|
394
|
+
f"{registry_url}/lit-container"
|
|
395
|
+
+ (f"-{lightning_containers_cloud_account}" if lightning_containers_cloud_account is not None else "")
|
|
396
|
+
+ f"/{resolved_teamspace.owner.name}/{resolved_teamspace.name}/{container_basename}"
|
|
389
397
|
)
|
|
390
398
|
|
|
391
|
-
cloud_account = cloud_account or resolved_teamspace.default_cloud_account
|
|
392
399
|
if from_onboarding:
|
|
393
400
|
thread = Thread(
|
|
394
401
|
target=ls_deployer.run_on_cloud,
|
|
@@ -411,13 +418,17 @@ def _handle_cloud(
|
|
|
411
418
|
)
|
|
412
419
|
thread.start()
|
|
413
420
|
console.print("🚀 Deployment started")
|
|
414
|
-
if not _upload_container(
|
|
421
|
+
if not _upload_container(
|
|
422
|
+
console, ls_deployer, repository, tag, resolved_teamspace, lit_cr, lightning_containers_cloud_account
|
|
423
|
+
):
|
|
415
424
|
thread.join()
|
|
416
425
|
return
|
|
417
426
|
thread.join()
|
|
418
427
|
return
|
|
419
428
|
|
|
420
|
-
if not _upload_container(
|
|
429
|
+
if not _upload_container(
|
|
430
|
+
console, ls_deployer, repository, tag, resolved_teamspace, lit_cr, lightning_containers_cloud_account
|
|
431
|
+
):
|
|
421
432
|
return
|
|
422
433
|
|
|
423
434
|
deployment_status = ls_deployer.run_on_cloud(
|
|
@@ -9,12 +9,12 @@ from rich.console import Console
|
|
|
9
9
|
|
|
10
10
|
from lightning_sdk.api.license_api import LicenseApi
|
|
11
11
|
from lightning_sdk.api.lit_container_api import LitContainerApi
|
|
12
|
-
from lightning_sdk.cli.exceptions import StudioCliError
|
|
13
|
-
from lightning_sdk.cli.studios_menu import _StudiosMenu
|
|
14
|
-
from lightning_sdk.cli.
|
|
12
|
+
from lightning_sdk.cli.legacy.exceptions import StudioCliError
|
|
13
|
+
from lightning_sdk.cli.legacy.studios_menu import _StudiosMenu
|
|
14
|
+
from lightning_sdk.cli.utils.teamspace_selection import TeamspacesMenu
|
|
15
15
|
from lightning_sdk.models import download_model
|
|
16
16
|
from lightning_sdk.studio import Studio
|
|
17
|
-
from lightning_sdk.utils.resolve import _get_authed_user
|
|
17
|
+
from lightning_sdk.utils.resolve import _get_authed_user
|
|
18
18
|
|
|
19
19
|
|
|
20
20
|
def _expand_remote_path(path: str) -> str:
|
|
@@ -110,8 +110,8 @@ def folder(
|
|
|
110
110
|
path = _expand_remote_path(path)
|
|
111
111
|
resolved_downloader = _resolve_studio(studio)
|
|
112
112
|
elif teamspace:
|
|
113
|
-
menu =
|
|
114
|
-
resolved_downloader = menu
|
|
113
|
+
menu = TeamspacesMenu()
|
|
114
|
+
resolved_downloader = menu(teamspace)
|
|
115
115
|
else:
|
|
116
116
|
raise ValueError("Either --studio or --teamspace must be provided")
|
|
117
117
|
|
|
@@ -136,7 +136,7 @@ def folder(
|
|
|
136
136
|
"--studio",
|
|
137
137
|
default=None,
|
|
138
138
|
help=(
|
|
139
|
-
"The name of the studio to
|
|
139
|
+
"The name of the studio to download from. "
|
|
140
140
|
"Will show a menu with user's owned studios for selection if not specified. "
|
|
141
141
|
"If provided, should be in the form of <TEAMSPACE-NAME>/<STUDIO-NAME> where the names are case-sensitive. "
|
|
142
142
|
"The teamspace and studio names can be regular expressions to match, "
|
|
@@ -173,8 +173,8 @@ def file(path: str = "", studio: Optional[str] = None, teamspace: Optional[str]
|
|
|
173
173
|
if studio:
|
|
174
174
|
resolved_downloader = _resolve_studio(studio)
|
|
175
175
|
elif teamspace:
|
|
176
|
-
menu =
|
|
177
|
-
resolved_downloader = menu
|
|
176
|
+
menu = TeamspacesMenu()
|
|
177
|
+
resolved_downloader = menu(teamspace)
|
|
178
178
|
else:
|
|
179
179
|
raise ValueError("Either --studio or --teamspace must be provided")
|
|
180
180
|
|
|
@@ -214,8 +214,8 @@ def download_container(
|
|
|
214
214
|
CONTAINER: The name of the container to download.
|
|
215
215
|
"""
|
|
216
216
|
console = Console()
|
|
217
|
-
menu =
|
|
218
|
-
resolved_teamspace = menu
|
|
217
|
+
menu = TeamspacesMenu()
|
|
218
|
+
resolved_teamspace = menu(teamspace)
|
|
219
219
|
with console.status("Downloading container..."):
|
|
220
220
|
api = LitContainerApi()
|
|
221
221
|
api.download_container(container, resolved_teamspace, tag, cloud_account)
|
|
@@ -242,7 +242,7 @@ def _resolve_studio(studio: Optional[str]) -> Studio:
|
|
|
242
242
|
and (re.match(studio_name, st["name"]) or studio_name in st["name"]),
|
|
243
243
|
possible_studios,
|
|
244
244
|
)
|
|
245
|
-
if not possible_studios:
|
|
245
|
+
if not len(possible_studios):
|
|
246
246
|
raise ValueError(
|
|
247
247
|
f"Could not find Studio like '{studio}', please consider update your filtering pattern."
|
|
248
248
|
)
|
|
@@ -256,12 +256,11 @@ def _resolve_studio(studio: Optional[str]) -> Studio:
|
|
|
256
256
|
# give user friendlier error message
|
|
257
257
|
except Exception as e:
|
|
258
258
|
raise StudioCliError(
|
|
259
|
-
f"Could not find the given Studio {studio} to
|
|
259
|
+
f"Could not find the given Studio {studio} to download files from. "
|
|
260
260
|
"Please contact Lightning AI directly to resolve this issue."
|
|
261
261
|
) from e
|
|
262
262
|
|
|
263
|
-
|
|
264
|
-
return Studio(**selected_studio)
|
|
263
|
+
return Studio(**selected_studio)
|
|
265
264
|
|
|
266
265
|
|
|
267
266
|
@download.command(name="licenses")
|