anyscale 0.24.86__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.
Files changed (1131) hide show
  1. anyscale/__init__.py +181 -0
  2. anyscale/_private/anyscale_client/README.md +16 -0
  3. anyscale/_private/anyscale_client/__init__.py +8 -0
  4. anyscale/_private/anyscale_client/anyscale_client.py +1847 -0
  5. anyscale/_private/anyscale_client/common.py +593 -0
  6. anyscale/_private/anyscale_client/fake_anyscale_client.py +1080 -0
  7. anyscale/_private/docgen/README.md +15 -0
  8. anyscale/_private/docgen/__main__.py +700 -0
  9. anyscale/_private/docgen/api.md +1106 -0
  10. anyscale/_private/docgen/generator.py +559 -0
  11. anyscale/_private/docgen/generator_legacy.py +104 -0
  12. anyscale/_private/docgen/models.md +2261 -0
  13. anyscale/_private/models/__init__.py +2 -0
  14. anyscale/_private/models/image_uri.py +116 -0
  15. anyscale/_private/models/model_base.py +251 -0
  16. anyscale/_private/sdk/__init__.py +102 -0
  17. anyscale/_private/sdk/base_sdk.py +35 -0
  18. anyscale/_private/sdk/timer.py +46 -0
  19. anyscale/_private/utils/__init__.py +0 -0
  20. anyscale/_private/utils/progress_util.py +85 -0
  21. anyscale/_private/workload/__init__.py +2 -0
  22. anyscale/_private/workload/workload_config.py +195 -0
  23. anyscale/_private/workload/workload_sdk.py +324 -0
  24. anyscale/aggregated_instance_usage/__init__.py +36 -0
  25. anyscale/aggregated_instance_usage/_private/aggregated_instance_usage_sdk.py +30 -0
  26. anyscale/aggregated_instance_usage/commands.py +42 -0
  27. anyscale/aggregated_instance_usage/models.py +85 -0
  28. anyscale/anyscale-cloud-setup-gcp-oa.yaml +88 -0
  29. anyscale/anyscale-cloud-setup-gcp.yaml +113 -0
  30. anyscale/anyscale-cloud-setup-oa.yaml +121 -0
  31. anyscale/anyscale-cloud-setup.yaml +327 -0
  32. anyscale/anyscale_pydantic/HISTORY.md +1254 -0
  33. anyscale/anyscale_pydantic/LICENSE +21 -0
  34. anyscale/anyscale_pydantic/PKG-INFO +1351 -0
  35. anyscale/anyscale_pydantic/README.md +7 -0
  36. anyscale/anyscale_pydantic/__init__.py +131 -0
  37. anyscale/anyscale_pydantic/_hypothesis_plugin.py +391 -0
  38. anyscale/anyscale_pydantic/annotated_types.py +72 -0
  39. anyscale/anyscale_pydantic/class_validators.py +361 -0
  40. anyscale/anyscale_pydantic/color.py +494 -0
  41. anyscale/anyscale_pydantic/config.py +191 -0
  42. anyscale/anyscale_pydantic/dataclasses.py +478 -0
  43. anyscale/anyscale_pydantic/datetime_parse.py +248 -0
  44. anyscale/anyscale_pydantic/decorator.py +264 -0
  45. anyscale/anyscale_pydantic/env_settings.py +350 -0
  46. anyscale/anyscale_pydantic/error_wrappers.py +162 -0
  47. anyscale/anyscale_pydantic/errors.py +646 -0
  48. anyscale/anyscale_pydantic/fields.py +1256 -0
  49. anyscale/anyscale_pydantic/generics.py +400 -0
  50. anyscale/anyscale_pydantic/json.py +112 -0
  51. anyscale/anyscale_pydantic/main.py +1109 -0
  52. anyscale/anyscale_pydantic/mypy.py +943 -0
  53. anyscale/anyscale_pydantic/networks.py +739 -0
  54. anyscale/anyscale_pydantic/parse.py +66 -0
  55. anyscale/anyscale_pydantic/py.typed +0 -0
  56. anyscale/anyscale_pydantic/schema.py +1164 -0
  57. anyscale/anyscale_pydantic/tools.py +92 -0
  58. anyscale/anyscale_pydantic/types.py +1206 -0
  59. anyscale/anyscale_pydantic/typing.py +603 -0
  60. anyscale/anyscale_pydantic/utils.py +803 -0
  61. anyscale/anyscale_pydantic/validators.py +765 -0
  62. anyscale/anyscale_pydantic/version.py +38 -0
  63. anyscale/anyscale_schema.json +9 -0
  64. anyscale/api.py +215 -0
  65. anyscale/api_utils/README.md +2 -0
  66. anyscale/api_utils/__init__.py +0 -0
  67. anyscale/api_utils/common_utils.py +81 -0
  68. anyscale/api_utils/exceptions/__init__.py +0 -0
  69. anyscale/api_utils/exceptions/job_errors.py +2 -0
  70. anyscale/api_utils/job_logs_util.py +116 -0
  71. anyscale/api_utils/job_util.py +22 -0
  72. anyscale/api_utils/logs_util.py +61 -0
  73. anyscale/authenticate.py +298 -0
  74. anyscale/aws_iam_policies.py +465 -0
  75. anyscale/background/__init__.py +0 -0
  76. anyscale/background/job_runner.py +64 -0
  77. anyscale/cli_logger.py +378 -0
  78. anyscale/client/.gitignore +66 -0
  79. anyscale/client/.openapi-generator/VERSION +1 -0
  80. anyscale/client/.openapi-generator-ignore +23 -0
  81. anyscale/client/README.md +1070 -0
  82. anyscale/client/git_push.sh +58 -0
  83. anyscale/client/openapi_client/__init__.py +667 -0
  84. anyscale/client/openapi_client/api/__init__.py +6 -0
  85. anyscale/client/openapi_client/api/default_api.py +40922 -0
  86. anyscale/client/openapi_client/api_client.py +647 -0
  87. anyscale/client/openapi_client/configuration.py +373 -0
  88. anyscale/client/openapi_client/exceptions.py +120 -0
  89. anyscale/client/openapi_client/models/__init__.py +652 -0
  90. anyscale/client/openapi_client/models/access_config.py +122 -0
  91. anyscale/client/openapi_client/models/aggregated_instance_usage_with_cost_model.py +733 -0
  92. anyscale/client/openapi_client/models/aggregatedinstanceusagewithcostmodel_list_response.py +147 -0
  93. anyscale/client/openapi_client/models/aica_endpoint.py +527 -0
  94. anyscale/client/openapi_client/models/aica_endpoint_event.py +433 -0
  95. anyscale/client/openapi_client/models/aica_endpoint_event_level.py +103 -0
  96. anyscale/client/openapi_client/models/aica_endpoint_event_type.py +120 -0
  97. anyscale/client/openapi_client/models/aica_endpoint_scope.py +102 -0
  98. anyscale/client/openapi_client/models/aica_model.py +398 -0
  99. anyscale/client/openapi_client/models/aica_model_accelerator_map.py +123 -0
  100. anyscale/client/openapi_client/models/aica_model_configuration.py +209 -0
  101. anyscale/client/openapi_client/models/aica_observability_urls.py +178 -0
  102. anyscale/client/openapi_client/models/aicaendpoint_list_response.py +147 -0
  103. anyscale/client/openapi_client/models/aicaendpoint_response.py +121 -0
  104. anyscale/client/openapi_client/models/aicaendpointevent_list_response.py +147 -0
  105. anyscale/client/openapi_client/models/aicamodel_list_response.py +147 -0
  106. anyscale/client/openapi_client/models/aicamodel_response.py +121 -0
  107. anyscale/client/openapi_client/models/aioa_cloud_waitlist_record.py +254 -0
  108. anyscale/client/openapi_client/models/aioacloudwaitlistrecord_response.py +121 -0
  109. anyscale/client/openapi_client/models/alert_type.py +103 -0
  110. anyscale/client/openapi_client/models/anyscale_aws_account.py +121 -0
  111. anyscale/client/openapi_client/models/anyscale_service_account.py +256 -0
  112. anyscale/client/openapi_client/models/anyscale_version_response.py +121 -0
  113. anyscale/client/openapi_client/models/anyscaleawsaccount_response.py +121 -0
  114. anyscale/client/openapi_client/models/anyscaled_credential_response.py +121 -0
  115. anyscale/client/openapi_client/models/anyscaledcredentialresponse_response.py +121 -0
  116. anyscale/client/openapi_client/models/anyscaleserviceaccount_response.py +121 -0
  117. anyscale/client/openapi_client/models/anyscaleversionresponse_response.py +121 -0
  118. anyscale/client/openapi_client/models/api_key_parameters.py +147 -0
  119. anyscale/client/openapi_client/models/app_config.py +436 -0
  120. anyscale/client/openapi_client/models/app_config_config_schema.py +235 -0
  121. anyscale/client/openapi_client/models/appconfig_list_response.py +147 -0
  122. anyscale/client/openapi_client/models/appconfig_response.py +121 -0
  123. anyscale/client/openapi_client/models/application_type.py +99 -0
  124. anyscale/client/openapi_client/models/applied_snapshot.py +175 -0
  125. anyscale/client/openapi_client/models/apply_production_service_v2_model.py +490 -0
  126. anyscale/client/openapi_client/models/archive_status.py +101 -0
  127. anyscale/client/openapi_client/models/archived_logs_info.py +164 -0
  128. anyscale/client/openapi_client/models/archivedlogsinfo_response.py +121 -0
  129. anyscale/client/openapi_client/models/attach_machine_pool_to_cloud_request.py +152 -0
  130. anyscale/client/openapi_client/models/attachmachinepooltocloudresponse_response.py +121 -0
  131. anyscale/client/openapi_client/models/aviary_model_config_v2.py +358 -0
  132. anyscale/client/openapi_client/models/aws_credentials.py +181 -0
  133. anyscale/client/openapi_client/models/aws_memory_db_cluster_config.py +148 -0
  134. anyscale/client/openapi_client/models/aws_region_and_zones.py +123 -0
  135. anyscale/client/openapi_client/models/aws_region_info.py +152 -0
  136. anyscale/client/openapi_client/models/awsregionandzones_response.py +121 -0
  137. anyscale/client/openapi_client/models/bank_account_information.py +239 -0
  138. anyscale/client/openapi_client/models/base_job_status.py +105 -0
  139. anyscale/client/openapi_client/models/baseimagesenum.py +2130 -0
  140. anyscale/client/openapi_client/models/batch_response_batched_result_organization_invitation_base.py +121 -0
  141. anyscale/client/openapi_client/models/batched_result_organization_invitation_base.py +173 -0
  142. anyscale/client/openapi_client/models/billing_information.py +181 -0
  143. anyscale/client/openapi_client/models/billing_version_code.py +100 -0
  144. anyscale/client/openapi_client/models/body_aws_marketplace_registration_api_v2_organization_billing_aws_marketplace_registration_post.py +121 -0
  145. anyscale/client/openapi_client/models/buffer_registration.py +285 -0
  146. anyscale/client/openapi_client/models/build.py +607 -0
  147. anyscale/client/openapi_client/models/build_log_response.py +123 -0
  148. anyscale/client/openapi_client/models/build_registration.py +285 -0
  149. anyscale/client/openapi_client/models/build_response.py +121 -0
  150. anyscale/client/openapi_client/models/build_status.py +104 -0
  151. anyscale/client/openapi_client/models/buildlogresponse_response.py +121 -0
  152. anyscale/client/openapi_client/models/card.py +181 -0
  153. anyscale/client/openapi_client/models/card_id.py +108 -0
  154. anyscale/client/openapi_client/models/card_list_response.py +147 -0
  155. anyscale/client/openapi_client/models/change_password_params.py +148 -0
  156. anyscale/client/openapi_client/models/cleanup_leaked_grafana_dashboard_response.py +208 -0
  157. anyscale/client/openapi_client/models/cleanupleakedgrafanadashboardresponse_response.py +121 -0
  158. anyscale/client/openapi_client/models/clone_experimental_workspace.py +151 -0
  159. anyscale/client/openapi_client/models/cloud.py +802 -0
  160. anyscale/client/openapi_client/models/cloud_analytics_event.py +351 -0
  161. anyscale/client/openapi_client/models/cloud_analytics_event_cloud_provider_error.py +152 -0
  162. anyscale/client/openapi_client/models/cloud_analytics_event_cloud_resource.py +117 -0
  163. anyscale/client/openapi_client/models/cloud_analytics_event_command_name.py +103 -0
  164. anyscale/client/openapi_client/models/cloud_analytics_event_error.py +150 -0
  165. anyscale/client/openapi_client/models/cloud_analytics_event_name.py +109 -0
  166. anyscale/client/openapi_client/models/cloud_collaborator.py +175 -0
  167. anyscale/client/openapi_client/models/cloud_collaborator_value.py +177 -0
  168. anyscale/client/openapi_client/models/cloud_collaborators_query.py +122 -0
  169. anyscale/client/openapi_client/models/cloud_config.py +206 -0
  170. anyscale/client/openapi_client/models/cloud_data_bucket_access_mode.py +100 -0
  171. anyscale/client/openapi_client/models/cloud_data_bucket_file_type.py +102 -0
  172. anyscale/client/openapi_client/models/cloud_data_bucket_presigned_upload_info.py +268 -0
  173. anyscale/client/openapi_client/models/cloud_data_bucket_presigned_upload_request.py +152 -0
  174. anyscale/client/openapi_client/models/cloud_data_bucket_presigned_upload_scheme.py +100 -0
  175. anyscale/client/openapi_client/models/cloud_data_bucket_presigned_url_request.py +209 -0
  176. anyscale/client/openapi_client/models/cloud_data_bucket_presigned_url_response.py +296 -0
  177. anyscale/client/openapi_client/models/cloud_data_bucket_presigned_url_scheme.py +100 -0
  178. anyscale/client/openapi_client/models/cloud_data_bucket_request_scope.py +100 -0
  179. anyscale/client/openapi_client/models/cloud_hosting_type.py +100 -0
  180. anyscale/client/openapi_client/models/cloud_list_response.py +147 -0
  181. anyscale/client/openapi_client/models/cloud_name_options.py +121 -0
  182. anyscale/client/openapi_client/models/cloud_overview_dashboard.py +175 -0
  183. anyscale/client/openapi_client/models/cloud_project_collaborator.py +175 -0
  184. anyscale/client/openapi_client/models/cloud_project_collaborator_value.py +121 -0
  185. anyscale/client/openapi_client/models/cloud_provider.py +102 -0
  186. anyscale/client/openapi_client/models/cloud_providers.py +103 -0
  187. anyscale/client/openapi_client/models/cloud_region_and_zones.py +123 -0
  188. anyscale/client/openapi_client/models/cloud_region_info.py +152 -0
  189. anyscale/client/openapi_client/models/cloud_resource.py +740 -0
  190. anyscale/client/openapi_client/models/cloud_resource_gcp.py +691 -0
  191. anyscale/client/openapi_client/models/cloud_response.py +121 -0
  192. anyscale/client/openapi_client/models/cloud_state.py +104 -0
  193. anyscale/client/openapi_client/models/cloud_status.py +100 -0
  194. anyscale/client/openapi_client/models/cloud_type.py +100 -0
  195. anyscale/client/openapi_client/models/cloud_types.py +100 -0
  196. anyscale/client/openapi_client/models/cloud_version.py +100 -0
  197. anyscale/client/openapi_client/models/cloud_waitlist_status.py +102 -0
  198. anyscale/client/openapi_client/models/cloud_with_cloud_resource.py +830 -0
  199. anyscale/client/openapi_client/models/cloud_with_cloud_resource_gcp.py +830 -0
  200. anyscale/client/openapi_client/models/cloudcollaborator_list_response.py +147 -0
  201. anyscale/client/openapi_client/models/clouddatabucketpresigneduploadinfo_response.py +121 -0
  202. anyscale/client/openapi_client/models/clouddatabucketpresignedurlresponse_response.py +121 -0
  203. anyscale/client/openapi_client/models/cloudoverviewdashboard_response.py +121 -0
  204. anyscale/client/openapi_client/models/cloudregionandzones_response.py +121 -0
  205. anyscale/client/openapi_client/models/cloudresource_response.py +121 -0
  206. anyscale/client/openapi_client/models/cloudresourcegcp_response.py +121 -0
  207. anyscale/client/openapi_client/models/cloudwithcloudresource_response.py +121 -0
  208. anyscale/client/openapi_client/models/cloudwithcloudresourcegcp_response.py +121 -0
  209. anyscale/client/openapi_client/models/cluster_auth_response.py +148 -0
  210. anyscale/client/openapi_client/models/cluster_config.py +178 -0
  211. anyscale/client/openapi_client/models/cluster_config_with_session_idle_timeout.py +204 -0
  212. anyscale/client/openapi_client/models/cluster_environments_query.py +290 -0
  213. anyscale/client/openapi_client/models/cluster_event.py +174 -0
  214. anyscale/client/openapi_client/models/cluster_events_output.py +175 -0
  215. anyscale/client/openapi_client/models/cluster_features.py +152 -0
  216. anyscale/client/openapi_client/models/cluster_management_stack_versions.py +100 -0
  217. anyscale/client/openapi_client/models/cluster_startup.py +208 -0
  218. anyscale/client/openapi_client/models/cluster_status.py +104 -0
  219. anyscale/client/openapi_client/models/cluster_status_details.py +100 -0
  220. anyscale/client/openapi_client/models/clusterauthresponse_response.py +121 -0
  221. anyscale/client/openapi_client/models/clusterconfig_response.py +121 -0
  222. anyscale/client/openapi_client/models/clusterconfigwithsessionidletimeout_response.py +121 -0
  223. anyscale/client/openapi_client/models/clustereventsoutput_response.py +121 -0
  224. anyscale/client/openapi_client/models/clusterfeatures_response.py +121 -0
  225. anyscale/client/openapi_client/models/company_size.py +103 -0
  226. anyscale/client/openapi_client/models/compute_node_type.py +292 -0
  227. anyscale/client/openapi_client/models/compute_stack.py +100 -0
  228. anyscale/client/openapi_client/models/compute_template.py +415 -0
  229. anyscale/client/openapi_client/models/compute_template_config.py +461 -0
  230. anyscale/client/openapi_client/models/compute_template_query.py +316 -0
  231. anyscale/client/openapi_client/models/computetemplate_response.py +121 -0
  232. anyscale/client/openapi_client/models/computetemplateconfig_response.py +121 -0
  233. anyscale/client/openapi_client/models/create_aica_endpoint.py +210 -0
  234. anyscale/client/openapi_client/models/create_aioa_cloud_waitlist.py +173 -0
  235. anyscale/client/openapi_client/models/create_analytics_event.py +122 -0
  236. anyscale/client/openapi_client/models/create_app_config.py +235 -0
  237. anyscale/client/openapi_client/models/create_app_config_configuration_schema.py +235 -0
  238. anyscale/client/openapi_client/models/create_billing_version.py +181 -0
  239. anyscale/client/openapi_client/models/create_bug_report_response.py +152 -0
  240. anyscale/client/openapi_client/models/create_build.py +263 -0
  241. anyscale/client/openapi_client/models/create_byod_app_config.py +180 -0
  242. anyscale/client/openapi_client/models/create_byod_app_config_configuration_schema.py +206 -0
  243. anyscale/client/openapi_client/models/create_byod_build.py +152 -0
  244. anyscale/client/openapi_client/models/create_cloud_collaborator.py +148 -0
  245. anyscale/client/openapi_client/models/create_cloud_resource.py +682 -0
  246. anyscale/client/openapi_client/models/create_cloud_resource_gcp.py +633 -0
  247. anyscale/client/openapi_client/models/create_cloud_with_cloud_resource.py +546 -0
  248. anyscale/client/openapi_client/models/create_cluster_compute_config.py +463 -0
  249. anyscale/client/openapi_client/models/create_compute_template.py +229 -0
  250. anyscale/client/openapi_client/models/create_compute_template_config.py +464 -0
  251. anyscale/client/openapi_client/models/create_dataset.py +200 -0
  252. anyscale/client/openapi_client/models/create_experimental_workspace.py +435 -0
  253. anyscale/client/openapi_client/models/create_experimental_workspace_from_job.py +123 -0
  254. anyscale/client/openapi_client/models/create_fine_tuning_hyperparameters.py +156 -0
  255. anyscale/client/openapi_client/models/create_fine_tuning_job_product_request.py +353 -0
  256. anyscale/client/openapi_client/models/create_instance_usage_budget.py +253 -0
  257. anyscale/client/openapi_client/models/create_internal_production_job.py +262 -0
  258. anyscale/client/openapi_client/models/create_job_queue_config.py +206 -0
  259. anyscale/client/openapi_client/models/create_job_queue_requests.py +323 -0
  260. anyscale/client/openapi_client/models/create_machine_pool_request.py +151 -0
  261. anyscale/client/openapi_client/models/create_machine_pool_response.py +123 -0
  262. anyscale/client/openapi_client/models/create_machine_request.py +151 -0
  263. anyscale/client/openapi_client/models/create_machine_response.py +123 -0
  264. anyscale/client/openapi_client/models/create_metronome_webhook_notification.py +175 -0
  265. anyscale/client/openapi_client/models/create_notification_channel_record.py +146 -0
  266. anyscale/client/openapi_client/models/create_organization_configuration.py +199 -0
  267. anyscale/client/openapi_client/models/create_organization_invitation.py +121 -0
  268. anyscale/client/openapi_client/models/create_otp_return_api_model.py +148 -0
  269. anyscale/client/openapi_client/models/create_production_job_config.py +347 -0
  270. anyscale/client/openapi_client/models/create_resource_quota.py +293 -0
  271. anyscale/client/openapi_client/models/create_schedule.py +263 -0
  272. anyscale/client/openapi_client/models/create_session_from_snapshot_options.py +565 -0
  273. anyscale/client/openapi_client/models/create_session_in_db.py +434 -0
  274. anyscale/client/openapi_client/models/create_session_response.py +174 -0
  275. anyscale/client/openapi_client/models/create_user.py +439 -0
  276. anyscale/client/openapi_client/models/create_user_project_collaborator.py +148 -0
  277. anyscale/client/openapi_client/models/create_user_project_collaborator_value.py +121 -0
  278. anyscale/client/openapi_client/models/create_workspace_from_template.py +263 -0
  279. anyscale/client/openapi_client/models/createbugreportresponse_response.py +121 -0
  280. anyscale/client/openapi_client/models/createcomputetemplateconfig_response.py +121 -0
  281. anyscale/client/openapi_client/models/createmachinepoolresponse_response.py +121 -0
  282. anyscale/client/openapi_client/models/createmachineresponse_response.py +121 -0
  283. anyscale/client/openapi_client/models/createotpreturnapimodel_response.py +121 -0
  284. anyscale/client/openapi_client/models/createsessionresponse_response.py +121 -0
  285. anyscale/client/openapi_client/models/credit_card_information.py +268 -0
  286. anyscale/client/openapi_client/models/customer_alert_status.py +101 -0
  287. anyscale/client/openapi_client/models/customer_billing_type.py +101 -0
  288. anyscale/client/openapi_client/models/dataplane_services.py +102 -0
  289. anyscale/client/openapi_client/models/dataset.py +416 -0
  290. anyscale/client/openapi_client/models/dataset_list_response.py +150 -0
  291. anyscale/client/openapi_client/models/dataset_response.py +121 -0
  292. anyscale/client/openapi_client/models/dataset_upload.py +148 -0
  293. anyscale/client/openapi_client/models/datasetupload_response.py +121 -0
  294. anyscale/client/openapi_client/models/decorated_application_template.py +493 -0
  295. anyscale/client/openapi_client/models/decorated_build.py +664 -0
  296. anyscale/client/openapi_client/models/decorated_compute_template.py +446 -0
  297. anyscale/client/openapi_client/models/decorated_compute_template_config.py +490 -0
  298. anyscale/client/openapi_client/models/decorated_interactive_session.py +793 -0
  299. anyscale/client/openapi_client/models/decorated_job.py +793 -0
  300. anyscale/client/openapi_client/models/decorated_job_queue.py +639 -0
  301. anyscale/client/openapi_client/models/decorated_job_submission.py +575 -0
  302. anyscale/client/openapi_client/models/decorated_list_service_api_model.py +670 -0
  303. anyscale/client/openapi_client/models/decorated_production_job.py +805 -0
  304. anyscale/client/openapi_client/models/decorated_production_job_state_transition.py +319 -0
  305. anyscale/client/openapi_client/models/decorated_production_service_v2_api_model.py +641 -0
  306. anyscale/client/openapi_client/models/decorated_production_service_v2_version_api_model.py +437 -0
  307. anyscale/client/openapi_client/models/decorated_runtime_env.py +488 -0
  308. anyscale/client/openapi_client/models/decorated_schedule.py +552 -0
  309. anyscale/client/openapi_client/models/decorated_serve_deployment.py +711 -0
  310. anyscale/client/openapi_client/models/decorated_service_event_api_model.py +513 -0
  311. anyscale/client/openapi_client/models/decorated_session.py +1789 -0
  312. anyscale/client/openapi_client/models/decorated_support_request.py +283 -0
  313. anyscale/client/openapi_client/models/decorated_unified_job.py +466 -0
  314. anyscale/client/openapi_client/models/decoratedapplicationtemplate_list_response.py +147 -0
  315. anyscale/client/openapi_client/models/decoratedapplicationtemplate_response.py +121 -0
  316. anyscale/client/openapi_client/models/decoratedbuild_list_response.py +147 -0
  317. anyscale/client/openapi_client/models/decoratedbuild_response.py +121 -0
  318. anyscale/client/openapi_client/models/decoratedcomputetemplate_list_response.py +147 -0
  319. anyscale/client/openapi_client/models/decoratedcomputetemplate_response.py +121 -0
  320. anyscale/client/openapi_client/models/decoratedinteractivesession_list_response.py +147 -0
  321. anyscale/client/openapi_client/models/decoratedinteractivesession_response.py +121 -0
  322. anyscale/client/openapi_client/models/decoratedjob_list_response.py +147 -0
  323. anyscale/client/openapi_client/models/decoratedjob_response.py +121 -0
  324. anyscale/client/openapi_client/models/decoratedjobqueue_list_response.py +147 -0
  325. anyscale/client/openapi_client/models/decoratedjobqueue_response.py +121 -0
  326. anyscale/client/openapi_client/models/decoratedjobsubmission_list_response.py +147 -0
  327. anyscale/client/openapi_client/models/decoratedjobsubmission_response.py +121 -0
  328. anyscale/client/openapi_client/models/decoratedlistserviceapimodel_list_response.py +147 -0
  329. anyscale/client/openapi_client/models/decoratedproductionjob_list_response.py +147 -0
  330. anyscale/client/openapi_client/models/decoratedproductionjob_response.py +121 -0
  331. anyscale/client/openapi_client/models/decoratedproductionjobstatetransition_list_response.py +147 -0
  332. anyscale/client/openapi_client/models/decoratedproductionservicev2_apimodel_response.py +121 -0
  333. anyscale/client/openapi_client/models/decoratedproductionservicev2_versionapimodel_list_response.py +147 -0
  334. anyscale/client/openapi_client/models/decoratedruntimeenv_list_response.py +147 -0
  335. anyscale/client/openapi_client/models/decoratedruntimeenv_response.py +121 -0
  336. anyscale/client/openapi_client/models/decoratedschedule_list_response.py +147 -0
  337. anyscale/client/openapi_client/models/decoratedschedule_response.py +121 -0
  338. anyscale/client/openapi_client/models/decoratedservedeployment_list_response.py +147 -0
  339. anyscale/client/openapi_client/models/decoratedservedeployment_response.py +121 -0
  340. anyscale/client/openapi_client/models/decoratedserviceeventapimodel_list_response.py +147 -0
  341. anyscale/client/openapi_client/models/decoratedsession_list_response.py +147 -0
  342. anyscale/client/openapi_client/models/decoratedsession_response.py +121 -0
  343. anyscale/client/openapi_client/models/decoratedsupportrequest_list_response.py +147 -0
  344. anyscale/client/openapi_client/models/decoratedsupportrequest_response.py +121 -0
  345. anyscale/client/openapi_client/models/decoratedunifiedjob_list_response.py +147 -0
  346. anyscale/client/openapi_client/models/decoratedunifiedjob_response.py +121 -0
  347. anyscale/client/openapi_client/models/delete_machine_pool_request.py +123 -0
  348. anyscale/client/openapi_client/models/delete_machine_request.py +206 -0
  349. anyscale/client/openapi_client/models/deleted_platform_fine_tuned_model.py +148 -0
  350. anyscale/client/openapi_client/models/deletedplatformfinetunedmodel_response.py +121 -0
  351. anyscale/client/openapi_client/models/deletemachinepoolresponse_response.py +121 -0
  352. anyscale/client/openapi_client/models/detach_machine_pool_from_cloud_request.py +152 -0
  353. anyscale/client/openapi_client/models/detachmachinepoolfromcloudresponse_response.py +121 -0
  354. anyscale/client/openapi_client/models/dismissal_type.py +100 -0
  355. anyscale/client/openapi_client/models/editable_cloud_resource.py +206 -0
  356. anyscale/client/openapi_client/models/editable_cloud_resource_gcp.py +178 -0
  357. anyscale/client/openapi_client/models/error.py +174 -0
  358. anyscale/client/openapi_client/models/event_level.py +104 -0
  359. anyscale/client/openapi_client/models/execute_command_response.py +175 -0
  360. anyscale/client/openapi_client/models/execute_interactive_command_options.py +147 -0
  361. anyscale/client/openapi_client/models/execute_shell_command_options.py +121 -0
  362. anyscale/client/openapi_client/models/executecommandresponse_response.py +121 -0
  363. anyscale/client/openapi_client/models/experimental_workspace.py +748 -0
  364. anyscale/client/openapi_client/models/experimental_workspaces_sort_field.py +100 -0
  365. anyscale/client/openapi_client/models/experimentalworkspace_list_response.py +147 -0
  366. anyscale/client/openapi_client/models/experimentalworkspace_response.py +121 -0
  367. anyscale/client/openapi_client/models/external_service_status.py +147 -0
  368. anyscale/client/openapi_client/models/external_service_status_response.py +250 -0
  369. anyscale/client/openapi_client/models/external_terminal_command.py +280 -0
  370. anyscale/client/openapi_client/models/externalservicestatusresponse_response.py +121 -0
  371. anyscale/client/openapi_client/models/feature_compatibility.py +152 -0
  372. anyscale/client/openapi_client/models/feature_flag_response.py +121 -0
  373. anyscale/client/openapi_client/models/featureflagresponse_response.py +121 -0
  374. anyscale/client/openapi_client/models/fine_tune_type.py +100 -0
  375. anyscale/client/openapi_client/models/fine_tuned_model.py +412 -0
  376. anyscale/client/openapi_client/models/fine_tuning_job_status.py +103 -0
  377. anyscale/client/openapi_client/models/finetunedmodel_list_response.py +147 -0
  378. anyscale/client/openapi_client/models/finetunedmodel_response.py +121 -0
  379. anyscale/client/openapi_client/models/finish_ft_job_request.py +204 -0
  380. anyscale/client/openapi_client/models/finish_ft_job_request_v2.py +183 -0
  381. anyscale/client/openapi_client/models/gcp_file_store_config.py +175 -0
  382. anyscale/client/openapi_client/models/gcp_memorystore_instance_config.py +148 -0
  383. anyscale/client/openapi_client/models/grafana_dashboard.py +201 -0
  384. anyscale/client/openapi_client/models/grpc_protocol_config.py +178 -0
  385. anyscale/client/openapi_client/models/ha_job_error_types.py +103 -0
  386. anyscale/client/openapi_client/models/ha_job_event_level.py +101 -0
  387. anyscale/client/openapi_client/models/ha_job_event_origin.py +100 -0
  388. anyscale/client/openapi_client/models/ha_job_goal_states.py +102 -0
  389. anyscale/client/openapi_client/models/ha_job_states.py +109 -0
  390. anyscale/client/openapi_client/models/ha_job_type.py +100 -0
  391. anyscale/client/openapi_client/models/ha_jobs_sort_field.py +105 -0
  392. anyscale/client/openapi_client/models/head_ip.py +121 -0
  393. anyscale/client/openapi_client/models/headip_response.py +121 -0
  394. anyscale/client/openapi_client/models/http_protocol_config.py +150 -0
  395. anyscale/client/openapi_client/models/http_validation_error.py +120 -0
  396. anyscale/client/openapi_client/models/idle_termination_status.py +104 -0
  397. anyscale/client/openapi_client/models/import_aica_model.py +241 -0
  398. anyscale/client/openapi_client/models/instance_usage_budget.py +572 -0
  399. anyscale/client/openapi_client/models/instance_usage_budget_evaluation_period.py +100 -0
  400. anyscale/client/openapi_client/models/instanceusagebudget_list_response.py +147 -0
  401. anyscale/client/openapi_client/models/instanceusagebudget_response.py +121 -0
  402. anyscale/client/openapi_client/models/integration_details.py +120 -0
  403. anyscale/client/openapi_client/models/interactive_session_logs.py +152 -0
  404. anyscale/client/openapi_client/models/interactivesessionlogs_response.py +121 -0
  405. anyscale/client/openapi_client/models/internal_production_job.py +663 -0
  406. anyscale/client/openapi_client/models/internalproductionjob_response.py +121 -0
  407. anyscale/client/openapi_client/models/invoice.py +413 -0
  408. anyscale/client/openapi_client/models/invoice_list_response.py +147 -0
  409. anyscale/client/openapi_client/models/invoice_status.py +102 -0
  410. anyscale/client/openapi_client/models/invoices_query.py +150 -0
  411. anyscale/client/openapi_client/models/job_access.py +102 -0
  412. anyscale/client/openapi_client/models/job_queue.py +467 -0
  413. anyscale/client/openapi_client/models/job_queue_config.py +122 -0
  414. anyscale/client/openapi_client/models/job_queue_execution_mode.py +101 -0
  415. anyscale/client/openapi_client/models/job_queue_spec.py +263 -0
  416. anyscale/client/openapi_client/models/job_queue_state.py +100 -0
  417. anyscale/client/openapi_client/models/job_queues_query.py +262 -0
  418. anyscale/client/openapi_client/models/job_run_type.py +101 -0
  419. anyscale/client/openapi_client/models/job_state_log_level_types.py +100 -0
  420. anyscale/client/openapi_client/models/job_status.py +105 -0
  421. anyscale/client/openapi_client/models/job_submissions_sort_field.py +101 -0
  422. anyscale/client/openapi_client/models/jobqueue_response.py +121 -0
  423. anyscale/client/openapi_client/models/jobs_logs.py +152 -0
  424. anyscale/client/openapi_client/models/jobs_logs_query_info.py +181 -0
  425. anyscale/client/openapi_client/models/jobs_sort_field.py +104 -0
  426. anyscale/client/openapi_client/models/jobslogs_response.py +121 -0
  427. anyscale/client/openapi_client/models/jobslogsqueryinfo_response.py +121 -0
  428. anyscale/client/openapi_client/models/json_patch_operation.py +200 -0
  429. anyscale/client/openapi_client/models/kubernetes_manager_registration_request.py +123 -0
  430. anyscale/client/openapi_client/models/kubernetes_manager_registration_response.py +123 -0
  431. anyscale/client/openapi_client/models/kubernetesmanagerregistrationresponse_response.py +121 -0
  432. anyscale/client/openapi_client/models/lb_resource.py +123 -0
  433. anyscale/client/openapi_client/models/lbresource_response.py +121 -0
  434. anyscale/client/openapi_client/models/list_machine_pools_response.py +123 -0
  435. anyscale/client/openapi_client/models/list_machines_response.py +121 -0
  436. anyscale/client/openapi_client/models/list_resource_quotas_query.py +234 -0
  437. anyscale/client/openapi_client/models/list_response_metadata.py +146 -0
  438. anyscale/client/openapi_client/models/listmachinepoolsresponse_response.py +121 -0
  439. anyscale/client/openapi_client/models/listmachinesresponse_response.py +121 -0
  440. anyscale/client/openapi_client/models/log_detail.py +187 -0
  441. anyscale/client/openapi_client/models/log_details.py +151 -0
  442. anyscale/client/openapi_client/models/log_download_config.py +206 -0
  443. anyscale/client/openapi_client/models/log_download_request.py +150 -0
  444. anyscale/client/openapi_client/models/log_download_result.py +207 -0
  445. anyscale/client/openapi_client/models/log_file_chunk.py +439 -0
  446. anyscale/client/openapi_client/models/log_filter.py +430 -0
  447. anyscale/client/openapi_client/models/log_item.py +181 -0
  448. anyscale/client/openapi_client/models/log_item_batch.py +151 -0
  449. anyscale/client/openapi_client/models/log_level_types.py +100 -0
  450. anyscale/client/openapi_client/models/log_stream.py +151 -0
  451. anyscale/client/openapi_client/models/logdetails_response.py +121 -0
  452. anyscale/client/openapi_client/models/logdownloadresult_response.py +121 -0
  453. anyscale/client/openapi_client/models/login_user_params.py +205 -0
  454. anyscale/client/openapi_client/models/logitembatch_response.py +121 -0
  455. anyscale/client/openapi_client/models/logs_output.py +202 -0
  456. anyscale/client/openapi_client/models/logsoutput_response.py +121 -0
  457. anyscale/client/openapi_client/models/logstream_response.py +121 -0
  458. anyscale/client/openapi_client/models/long_running_workload.py +256 -0
  459. anyscale/client/openapi_client/models/longrunningworkload_list_response.py +147 -0
  460. anyscale/client/openapi_client/models/machine_allocation_state.py +100 -0
  461. anyscale/client/openapi_client/models/machine_connection_state.py +100 -0
  462. anyscale/client/openapi_client/models/machine_info.py +466 -0
  463. anyscale/client/openapi_client/models/machine_pool.py +266 -0
  464. anyscale/client/openapi_client/models/metronome_customer_info_model.py +148 -0
  465. anyscale/client/openapi_client/models/metronome_dashboard_type.py +101 -0
  466. anyscale/client/openapi_client/models/metronomecustomerinfomodel_list_response.py +147 -0
  467. anyscale/client/openapi_client/models/metronomecustomerinfomodel_response.py +121 -0
  468. anyscale/client/openapi_client/models/mini_build.py +267 -0
  469. anyscale/client/openapi_client/models/mini_cloud.py +321 -0
  470. anyscale/client/openapi_client/models/mini_cluster.py +148 -0
  471. anyscale/client/openapi_client/models/mini_compute_template.py +228 -0
  472. anyscale/client/openapi_client/models/mini_compute_template_config.py +121 -0
  473. anyscale/client/openapi_client/models/mini_job_run.py +599 -0
  474. anyscale/client/openapi_client/models/mini_namespace.py +148 -0
  475. anyscale/client/openapi_client/models/mini_organization.py +148 -0
  476. anyscale/client/openapi_client/models/mini_production_job.py +202 -0
  477. anyscale/client/openapi_client/models/mini_project.py +205 -0
  478. anyscale/client/openapi_client/models/mini_runtime_environment.py +147 -0
  479. anyscale/client/openapi_client/models/mini_schedule.py +180 -0
  480. anyscale/client/openapi_client/models/mini_user.py +266 -0
  481. anyscale/client/openapi_client/models/minibuild_list_response.py +147 -0
  482. anyscale/client/openapi_client/models/minicomputetemplate_list_response.py +147 -0
  483. anyscale/client/openapi_client/models/miniproject_list_response.py +147 -0
  484. anyscale/client/openapi_client/models/monitor_logs_extension.py +100 -0
  485. anyscale/client/openapi_client/models/named_entity.py +148 -0
  486. anyscale/client/openapi_client/models/nfs_mount_target.py +151 -0
  487. anyscale/client/openapi_client/models/node_registration_aws.py +152 -0
  488. anyscale/client/openapi_client/models/node_registration_gcp.py +123 -0
  489. anyscale/client/openapi_client/models/node_registration_k8_s.py +178 -0
  490. anyscale/client/openapi_client/models/node_registration_provisioned.py +150 -0
  491. anyscale/client/openapi_client/models/node_registration_v2.py +279 -0
  492. anyscale/client/openapi_client/models/node_type.py +100 -0
  493. anyscale/client/openapi_client/models/notification_channel_email_config.py +121 -0
  494. anyscale/client/openapi_client/models/notification_channel_webhook_config.py +121 -0
  495. anyscale/client/openapi_client/models/onboarding_user_cards_query.py +122 -0
  496. anyscale/client/openapi_client/models/organization.py +490 -0
  497. anyscale/client/openapi_client/models/organization_availability.py +148 -0
  498. anyscale/client/openapi_client/models/organization_collaborator.py +259 -0
  499. anyscale/client/openapi_client/models/organization_configuration.py +280 -0
  500. anyscale/client/openapi_client/models/organization_configuration_response.py +227 -0
  501. anyscale/client/openapi_client/models/organization_invitation.py +255 -0
  502. anyscale/client/openapi_client/models/organization_invitation_base.py +121 -0
  503. anyscale/client/openapi_client/models/organization_marketing_questions.py +198 -0
  504. anyscale/client/openapi_client/models/organization_permission_level.py +100 -0
  505. anyscale/client/openapi_client/models/organization_project_collaborator.py +175 -0
  506. anyscale/client/openapi_client/models/organization_project_collaborator_value.py +148 -0
  507. anyscale/client/openapi_client/models/organization_public_identifier.py +121 -0
  508. anyscale/client/openapi_client/models/organization_response.py +121 -0
  509. anyscale/client/openapi_client/models/organization_summary.py +229 -0
  510. anyscale/client/openapi_client/models/organization_usage_alert.py +210 -0
  511. anyscale/client/openapi_client/models/organization_usage_alert_severity.py +100 -0
  512. anyscale/client/openapi_client/models/organizationavailability_response.py +121 -0
  513. anyscale/client/openapi_client/models/organizationcollaborator_list_response.py +147 -0
  514. anyscale/client/openapi_client/models/organizationconfiguration_list_response.py +147 -0
  515. anyscale/client/openapi_client/models/organizationconfigurationresponse_response.py +121 -0
  516. anyscale/client/openapi_client/models/organizationinvitation_list_response.py +147 -0
  517. anyscale/client/openapi_client/models/organizationinvitation_response.py +121 -0
  518. anyscale/client/openapi_client/models/organizationinvitationbase_response.py +121 -0
  519. anyscale/client/openapi_client/models/organizationprojectcollaborator_list_response.py +147 -0
  520. anyscale/client/openapi_client/models/organizationpublicidentifier_response.py +121 -0
  521. anyscale/client/openapi_client/models/organizationusagealert_list_response.py +147 -0
  522. anyscale/client/openapi_client/models/page_query.py +153 -0
  523. anyscale/client/openapi_client/models/pause_schedule.py +123 -0
  524. anyscale/client/openapi_client/models/permission_level.py +101 -0
  525. anyscale/client/openapi_client/models/platform_fine_tuning_job.py +577 -0
  526. anyscale/client/openapi_client/models/platformfinetuningjob_list_response.py +147 -0
  527. anyscale/client/openapi_client/models/platformfinetuningjob_response.py +121 -0
  528. anyscale/client/openapi_client/models/product_autoscaler_flag.py +122 -0
  529. anyscale/client/openapi_client/models/product_type.py +100 -0
  530. anyscale/client/openapi_client/models/productautoscalerflag_response.py +121 -0
  531. anyscale/client/openapi_client/models/production_job.py +437 -0
  532. anyscale/client/openapi_client/models/production_job_config.py +348 -0
  533. anyscale/client/openapi_client/models/production_job_event.py +378 -0
  534. anyscale/client/openapi_client/models/production_job_event_scope_filter.py +101 -0
  535. anyscale/client/openapi_client/models/production_job_state_transition.py +293 -0
  536. anyscale/client/openapi_client/models/productionjob_response.py +121 -0
  537. anyscale/client/openapi_client/models/productionjobevent_list_response.py +147 -0
  538. anyscale/client/openapi_client/models/project.py +554 -0
  539. anyscale/client/openapi_client/models/project_base.py +121 -0
  540. anyscale/client/openapi_client/models/project_collaborator.py +175 -0
  541. anyscale/client/openapi_client/models/project_collaborator_value.py +175 -0
  542. anyscale/client/openapi_client/models/project_collaborators_put_message.py +121 -0
  543. anyscale/client/openapi_client/models/project_create_message.py +148 -0
  544. anyscale/client/openapi_client/models/project_default_session_name.py +121 -0
  545. anyscale/client/openapi_client/models/project_delete_message.py +121 -0
  546. anyscale/client/openapi_client/models/project_list_response.py +147 -0
  547. anyscale/client/openapi_client/models/project_patch_message.py +121 -0
  548. anyscale/client/openapi_client/models/project_response.py +121 -0
  549. anyscale/client/openapi_client/models/projectbase_response.py +121 -0
  550. anyscale/client/openapi_client/models/projectcollaborator_list_response.py +147 -0
  551. anyscale/client/openapi_client/models/projectdefaultsessionname_response.py +121 -0
  552. anyscale/client/openapi_client/models/projects_sort_field.py +101 -0
  553. anyscale/client/openapi_client/models/projects_violating_tree_hierarchy_response.py +121 -0
  554. anyscale/client/openapi_client/models/projectsviolatingtreehierarchyresponse_response.py +121 -0
  555. anyscale/client/openapi_client/models/protocols.py +150 -0
  556. anyscale/client/openapi_client/models/provider_metadata.py +205 -0
  557. anyscale/client/openapi_client/models/providermetadata_response.py +121 -0
  558. anyscale/client/openapi_client/models/python_modules.py +150 -0
  559. anyscale/client/openapi_client/models/quota.py +198 -0
  560. anyscale/client/openapi_client/models/ray_gcs_external_storage_config.py +178 -0
  561. anyscale/client/openapi_client/models/ray_runtime_env_config.py +262 -0
  562. anyscale/client/openapi_client/models/read_billing_version.py +210 -0
  563. anyscale/client/openapi_client/models/readbillingversion_list_response.py +147 -0
  564. anyscale/client/openapi_client/models/replica_details.py +152 -0
  565. anyscale/client/openapi_client/models/replica_state.py +104 -0
  566. anyscale/client/openapi_client/models/request_email_magic_link_response.py +147 -0
  567. anyscale/client/openapi_client/models/request_otp_return_api_model.py +148 -0
  568. anyscale/client/openapi_client/models/request_password_reset_params.py +147 -0
  569. anyscale/client/openapi_client/models/requestemailmagiclinkresponse_response.py +121 -0
  570. anyscale/client/openapi_client/models/requestotpreturnapimodel_response.py +121 -0
  571. anyscale/client/openapi_client/models/reset_password_params.py +148 -0
  572. anyscale/client/openapi_client/models/resource_quota.py +465 -0
  573. anyscale/client/openapi_client/models/resource_quota_status.py +123 -0
  574. anyscale/client/openapi_client/models/resourcequota_list_response.py +147 -0
  575. anyscale/client/openapi_client/models/resourcequota_response.py +121 -0
  576. anyscale/client/openapi_client/models/resources.py +234 -0
  577. anyscale/client/openapi_client/models/resubmit_ft_job_request.py +121 -0
  578. anyscale/client/openapi_client/models/rollback_service_model.py +122 -0
  579. anyscale/client/openapi_client/models/rollout_strategy.py +100 -0
  580. anyscale/client/openapi_client/models/s3_download_location.py +148 -0
  581. anyscale/client/openapi_client/models/schedule_config.py +151 -0
  582. anyscale/client/openapi_client/models/serve_deployment_grafana_dashboard_status.py +101 -0
  583. anyscale/client/openapi_client/models/serve_deployment_logs.py +152 -0
  584. anyscale/client/openapi_client/models/serve_deployment_state.py +104 -0
  585. anyscale/client/openapi_client/models/servedeploymentlogs_response.py +121 -0
  586. anyscale/client/openapi_client/models/server_session_token.py +121 -0
  587. anyscale/client/openapi_client/models/serversessiontoken_response.py +121 -0
  588. anyscale/client/openapi_client/models/service_config.py +178 -0
  589. anyscale/client/openapi_client/models/service_event_current_state.py +108 -0
  590. anyscale/client/openapi_client/models/service_event_level.py +102 -0
  591. anyscale/client/openapi_client/models/service_event_origin.py +103 -0
  592. anyscale/client/openapi_client/models/service_event_scope.py +103 -0
  593. anyscale/client/openapi_client/models/service_event_scope_filter.py +104 -0
  594. anyscale/client/openapi_client/models/service_event_type.py +125 -0
  595. anyscale/client/openapi_client/models/service_event_verbose_message_model.py +180 -0
  596. anyscale/client/openapi_client/models/service_goal_states.py +100 -0
  597. anyscale/client/openapi_client/models/service_observability_urls.py +206 -0
  598. anyscale/client/openapi_client/models/service_sort_field.py +101 -0
  599. anyscale/client/openapi_client/models/service_type.py +100 -0
  600. anyscale/client/openapi_client/models/service_usage.py +353 -0
  601. anyscale/client/openapi_client/models/service_version_state.py +106 -0
  602. anyscale/client/openapi_client/models/serviceeventverbosemessagemodel_list_response.py +147 -0
  603. anyscale/client/openapi_client/models/session.py +834 -0
  604. anyscale/client/openapi_client/models/session_access.py +102 -0
  605. anyscale/client/openapi_client/models/session_autosync_sessions_update_message.py +121 -0
  606. anyscale/client/openapi_client/models/session_command.py +413 -0
  607. anyscale/client/openapi_client/models/session_command_finish_options.py +226 -0
  608. anyscale/client/openapi_client/models/session_command_id.py +121 -0
  609. anyscale/client/openapi_client/models/session_command_types.py +100 -0
  610. anyscale/client/openapi_client/models/session_create_message.py +148 -0
  611. anyscale/client/openapi_client/models/session_delete_message.py +121 -0
  612. anyscale/client/openapi_client/models/session_describe.py +175 -0
  613. anyscale/client/openapi_client/models/session_details.py +148 -0
  614. anyscale/client/openapi_client/models/session_event.py +267 -0
  615. anyscale/client/openapi_client/models/session_event_cause.py +150 -0
  616. anyscale/client/openapi_client/models/session_event_types.py +111 -0
  617. anyscale/client/openapi_client/models/session_execute_message.py +121 -0
  618. anyscale/client/openapi_client/models/session_finish_command_message.py +175 -0
  619. anyscale/client/openapi_client/models/session_history_item.py +146 -0
  620. anyscale/client/openapi_client/models/session_kill_command_message.py +121 -0
  621. anyscale/client/openapi_client/models/session_list_response.py +147 -0
  622. anyscale/client/openapi_client/models/session_patch_message.py +121 -0
  623. anyscale/client/openapi_client/models/session_response.py +121 -0
  624. anyscale/client/openapi_client/models/session_ssh_key.py +148 -0
  625. anyscale/client/openapi_client/models/session_starting_up_data.py +146 -0
  626. anyscale/client/openapi_client/models/session_state.py +111 -0
  627. anyscale/client/openapi_client/models/session_state_change_message.py +121 -0
  628. anyscale/client/openapi_client/models/session_state_data.py +146 -0
  629. anyscale/client/openapi_client/models/session_stopping_data.py +146 -0
  630. anyscale/client/openapi_client/models/sessioncommand_list_response.py +147 -0
  631. anyscale/client/openapi_client/models/sessioncommandid_response.py +121 -0
  632. anyscale/client/openapi_client/models/sessiondescribe_response.py +121 -0
  633. anyscale/client/openapi_client/models/sessiondetails_response.py +121 -0
  634. anyscale/client/openapi_client/models/sessionevent_list_response.py +147 -0
  635. anyscale/client/openapi_client/models/sessionhistoryitem_list_response.py +147 -0
  636. anyscale/client/openapi_client/models/sessions_sort_field.py +104 -0
  637. anyscale/client/openapi_client/models/sessionsshkey_response.py +121 -0
  638. anyscale/client/openapi_client/models/setup_initialize_session_options.py +225 -0
  639. anyscale/client/openapi_client/models/show_otp_source_return_api_model.py +121 -0
  640. anyscale/client/openapi_client/models/showotpsourcereturnapimodel_response.py +121 -0
  641. anyscale/client/openapi_client/models/snapshot_create_message.py +148 -0
  642. anyscale/client/openapi_client/models/snapshot_delete_message.py +148 -0
  643. anyscale/client/openapi_client/models/snapshot_patch_message.py +148 -0
  644. anyscale/client/openapi_client/models/socket_message_schemas.py +499 -0
  645. anyscale/client/openapi_client/models/socket_message_types.py +113 -0
  646. anyscale/client/openapi_client/models/socketmessageschemas_response.py +121 -0
  647. anyscale/client/openapi_client/models/socketmessagetypes_response.py +121 -0
  648. anyscale/client/openapi_client/models/sort_order.py +100 -0
  649. anyscale/client/openapi_client/models/sso_login_info.py +151 -0
  650. anyscale/client/openapi_client/models/ssologininfo_response.py +121 -0
  651. anyscale/client/openapi_client/models/start_session_options.py +146 -0
  652. anyscale/client/openapi_client/models/stop_session_options.py +227 -0
  653. anyscale/client/openapi_client/models/stream_publish_request.py +239 -0
  654. anyscale/client/openapi_client/models/subnet_id_with_availability_zone_aws.py +148 -0
  655. anyscale/client/openapi_client/models/support_requests_query.py +178 -0
  656. anyscale/client/openapi_client/models/supportedbaseimagesenum.py +1570 -0
  657. anyscale/client/openapi_client/models/templatized_compute_configs.py +202 -0
  658. anyscale/client/openapi_client/models/templatized_decorated_application_templates.py +202 -0
  659. anyscale/client/openapi_client/models/templatizedcomputeconfigs_response.py +121 -0
  660. anyscale/client/openapi_client/models/templatizeddecoratedapplicationtemplates_response.py +121 -0
  661. anyscale/client/openapi_client/models/text_query.py +178 -0
  662. anyscale/client/openapi_client/models/timestamped_logs_output.py +148 -0
  663. anyscale/client/openapi_client/models/timestampedlogsoutput_response.py +121 -0
  664. anyscale/client/openapi_client/models/tool.py +100 -0
  665. anyscale/client/openapi_client/models/tracing_config.py +178 -0
  666. anyscale/client/openapi_client/models/try_login_email_response.py +208 -0
  667. anyscale/client/openapi_client/models/tryloginemailresponse_response.py +121 -0
  668. anyscale/client/openapi_client/models/unified_job_sort_field.py +103 -0
  669. anyscale/client/openapi_client/models/unified_job_status.py +114 -0
  670. anyscale/client/openapi_client/models/unified_job_type.py +100 -0
  671. anyscale/client/openapi_client/models/update_cloud_with_cloud_resource.py +178 -0
  672. anyscale/client/openapi_client/models/update_cloud_with_cloud_resource_gcp.py +178 -0
  673. anyscale/client/openapi_client/models/update_cluster_dns.py +152 -0
  674. anyscale/client/openapi_client/models/update_compute_template.py +146 -0
  675. anyscale/client/openapi_client/models/update_compute_template_config.py +464 -0
  676. anyscale/client/openapi_client/models/update_endpoint.py +152 -0
  677. anyscale/client/openapi_client/models/update_machine_pool_request.py +151 -0
  678. anyscale/client/openapi_client/models/update_model_deployment.py +152 -0
  679. anyscale/client/openapi_client/models/update_organization_collaborator.py +121 -0
  680. anyscale/client/openapi_client/models/update_project_collaborator.py +121 -0
  681. anyscale/client/openapi_client/models/update_resource_quota.py +122 -0
  682. anyscale/client/openapi_client/models/updatemachinepoolresponse_response.py +121 -0
  683. anyscale/client/openapi_client/models/upload_session_command_logs_locations.py +148 -0
  684. anyscale/client/openapi_client/models/uploadsessioncommandlogslocations_response.py +121 -0
  685. anyscale/client/openapi_client/models/user_info.py +569 -0
  686. anyscale/client/openapi_client/models/user_resend_email_options.py +147 -0
  687. anyscale/client/openapi_client/models/user_service_access_types.py +100 -0
  688. anyscale/client/openapi_client/models/userinfo_response.py +121 -0
  689. anyscale/client/openapi_client/models/utm_fields.py +224 -0
  690. anyscale/client/openapi_client/models/ux_instance.py +468 -0
  691. anyscale/client/openapi_client/models/validate_otp_params_api_model.py +121 -0
  692. anyscale/client/openapi_client/models/validation_error.py +175 -0
  693. anyscale/client/openapi_client/models/verify_response.py +147 -0
  694. anyscale/client/openapi_client/models/verifyresponse_response.py +121 -0
  695. anyscale/client/openapi_client/models/visibility.py +100 -0
  696. anyscale/client/openapi_client/models/waitlist_status_response.py +121 -0
  697. anyscale/client/openapi_client/models/waitlist_status_type.py +100 -0
  698. anyscale/client/openapi_client/models/waitliststatusresponse_response.py +121 -0
  699. anyscale/client/openapi_client/models/wand_b_run_details.py +147 -0
  700. anyscale/client/openapi_client/models/web_terminal.py +121 -0
  701. anyscale/client/openapi_client/models/webterminal_list_response.py +147 -0
  702. anyscale/client/openapi_client/models/webterminal_response.py +121 -0
  703. anyscale/client/openapi_client/models/worker_node_type.py +404 -0
  704. anyscale/client/openapi_client/models/workload_type.py +102 -0
  705. anyscale/client/openapi_client/models/workspace_dataplane_artifact.py +181 -0
  706. anyscale/client/openapi_client/models/workspace_dataplane_artifacts.py +123 -0
  707. anyscale/client/openapi_client/models/workspace_dataplane_proxied_artifacts.py +178 -0
  708. anyscale/client/openapi_client/models/workspace_event.py +325 -0
  709. anyscale/client/openapi_client/models/workspace_event_source.py +100 -0
  710. anyscale/client/openapi_client/models/workspace_event_source_filter.py +101 -0
  711. anyscale/client/openapi_client/models/workspace_readme.py +123 -0
  712. anyscale/client/openapi_client/models/workspace_snapshot_states.py +108 -0
  713. anyscale/client/openapi_client/models/workspace_template.py +353 -0
  714. anyscale/client/openapi_client/models/workspace_template_cluster_environment_metadata.py +178 -0
  715. anyscale/client/openapi_client/models/workspacedataplaneartifacts_response.py +121 -0
  716. anyscale/client/openapi_client/models/workspacedataplaneproxiedartifacts_response.py +121 -0
  717. anyscale/client/openapi_client/models/workspaceevent_list_response.py +147 -0
  718. anyscale/client/openapi_client/models/workspacereadme_response.py +121 -0
  719. anyscale/client/openapi_client/models/workspacetemplate_list_response.py +147 -0
  720. anyscale/client/openapi_client/models/workspacetemplateclusterenvironmentmetadata_response.py +121 -0
  721. anyscale/client/openapi_client/models/write_cloud.py +546 -0
  722. anyscale/client/openapi_client/models/write_cluster_config.py +123 -0
  723. anyscale/client/openapi_client/models/write_project.py +226 -0
  724. anyscale/client/openapi_client/models/write_session.py +147 -0
  725. anyscale/client/openapi_client/models/write_support_request.py +121 -0
  726. anyscale/client/openapi_client/rest.py +296 -0
  727. anyscale/client/requirements.txt +6 -0
  728. anyscale/client/setup.cfg +2 -0
  729. anyscale/client/setup.py +40 -0
  730. anyscale/client/test-requirements.txt +3 -0
  731. anyscale/client/tox.ini +9 -0
  732. anyscale/cloud.py +216 -0
  733. anyscale/cloud_resource.py +1032 -0
  734. anyscale/cluster.py +138 -0
  735. anyscale/cluster_compute.py +167 -0
  736. anyscale/cluster_env.py +173 -0
  737. anyscale/commands/__init__.py +0 -0
  738. anyscale/commands/aggregated_instance_usage_commands.py +86 -0
  739. anyscale/commands/anyscale_api/__init__.py +0 -0
  740. anyscale/commands/anyscale_api/api_commands.py +23 -0
  741. anyscale/commands/anyscale_api/session_commands_commands.py +80 -0
  742. anyscale/commands/anyscale_api/session_operations_commands.py +28 -0
  743. anyscale/commands/anyscale_api/sessions_commands.py +152 -0
  744. anyscale/commands/auth_commands.py +41 -0
  745. anyscale/commands/cloud_commands.py +1011 -0
  746. anyscale/commands/cloud_commands_util.py +10 -0
  747. anyscale/commands/cluster_commands.py +476 -0
  748. anyscale/commands/cluster_env_commands.py +139 -0
  749. anyscale/commands/command_examples.py +495 -0
  750. anyscale/commands/compute_config_commands.py +252 -0
  751. anyscale/commands/config_commands.py +213 -0
  752. anyscale/commands/exec_commands.py +14 -0
  753. anyscale/commands/experimental_integrations_commands.py +70 -0
  754. anyscale/commands/image_commands.py +125 -0
  755. anyscale/commands/job_commands.py +745 -0
  756. anyscale/commands/list_commands.py +85 -0
  757. anyscale/commands/llm/dataset_commands.py +269 -0
  758. anyscale/commands/llm/group.py +15 -0
  759. anyscale/commands/llm/models_commands.py +123 -0
  760. anyscale/commands/login_commands.py +79 -0
  761. anyscale/commands/logs_commands.py +312 -0
  762. anyscale/commands/machine_commands.py +116 -0
  763. anyscale/commands/machine_pool_commands.py +163 -0
  764. anyscale/commands/migrate_commands.py +84 -0
  765. anyscale/commands/project_commands.py +203 -0
  766. anyscale/commands/resource_quota_commands.py +214 -0
  767. anyscale/commands/schedule_commands.py +436 -0
  768. anyscale/commands/service_account_commands.py +72 -0
  769. anyscale/commands/service_commands.py +738 -0
  770. anyscale/commands/session_commands_hidden.py +179 -0
  771. anyscale/commands/util.py +152 -0
  772. anyscale/commands/workspace_commands.py +511 -0
  773. anyscale/commands/workspace_commands_v2.py +874 -0
  774. anyscale/component_activity_util.py +83 -0
  775. anyscale/compute_config/__init__.py +84 -0
  776. anyscale/compute_config/_private/compute_config_sdk.py +433 -0
  777. anyscale/compute_config/commands.py +122 -0
  778. anyscale/compute_config/models.py +630 -0
  779. anyscale/conf.py +23 -0
  780. anyscale/connect.py +1323 -0
  781. anyscale/connect_utils/__init__.py +0 -0
  782. anyscale/connect_utils/prepare_cluster.py +962 -0
  783. anyscale/connect_utils/project.py +298 -0
  784. anyscale/connect_utils/start_interactive_session.py +437 -0
  785. anyscale/controllers/__init__.py +0 -0
  786. anyscale/controllers/auth_controller.py +134 -0
  787. anyscale/controllers/base_controller.py +52 -0
  788. anyscale/controllers/cloud_controller.py +3609 -0
  789. anyscale/controllers/cloud_functional_verification_controller.py +858 -0
  790. anyscale/controllers/cluster_controller.py +720 -0
  791. anyscale/controllers/cluster_env_controller.py +219 -0
  792. anyscale/controllers/compute_config_controller.py +351 -0
  793. anyscale/controllers/config_controller.py +422 -0
  794. anyscale/controllers/experimental_integrations_controller.py +80 -0
  795. anyscale/controllers/job_controller.py +647 -0
  796. anyscale/controllers/jobs_bg_controller.py +0 -0
  797. anyscale/controllers/list_controller.py +290 -0
  798. anyscale/controllers/llm/__init__.py +0 -0
  799. anyscale/controllers/llm/models_controller.py +144 -0
  800. anyscale/controllers/logs_controller.py +449 -0
  801. anyscale/controllers/machine_controller.py +37 -0
  802. anyscale/controllers/machine_pool_controller.py +86 -0
  803. anyscale/controllers/project_controller.py +281 -0
  804. anyscale/controllers/resource_quota_controller.py +183 -0
  805. anyscale/controllers/schedule_controller.py +333 -0
  806. anyscale/controllers/service_account_controller.py +168 -0
  807. anyscale/controllers/service_controller.py +453 -0
  808. anyscale/controllers/workspace_controller.py +253 -0
  809. anyscale/feature_flags.py +4 -0
  810. anyscale/fingerprint.py +62 -0
  811. anyscale/formatters/__init__.py +0 -0
  812. anyscale/formatters/clouds_formatter.py +65 -0
  813. anyscale/formatters/common_formatter.py +22 -0
  814. anyscale/gcp_verification.py +792 -0
  815. anyscale/image/__init__.py +73 -0
  816. anyscale/image/_private/image_sdk.py +202 -0
  817. anyscale/image/commands.py +117 -0
  818. anyscale/image/models.py +57 -0
  819. anyscale/integrations.py +329 -0
  820. anyscale/job/__init__.py +166 -0
  821. anyscale/job/_private/job_sdk.py +497 -0
  822. anyscale/job/commands.py +267 -0
  823. anyscale/job/models.py +500 -0
  824. anyscale/links.py +4 -0
  825. anyscale/llm/__init__.py +2 -0
  826. anyscale/llm/dataset/__init__.py +2 -0
  827. anyscale/llm/dataset/_private/__init__.py +0 -0
  828. anyscale/llm/dataset/_private/docs.py +63 -0
  829. anyscale/llm/dataset/_private/models.py +71 -0
  830. anyscale/llm/dataset/_private/sdk.py +147 -0
  831. anyscale/llm/model/__init__.py +2 -0
  832. anyscale/llm/model/_private/models_sdk.py +62 -0
  833. anyscale/llm/model/commands.py +93 -0
  834. anyscale/llm/model/models.py +171 -0
  835. anyscale/llm/model/sdk.py +62 -0
  836. anyscale/llm/sdk.py +27 -0
  837. anyscale/memorydb_supported_zones.json +22 -0
  838. anyscale/models/job_model.py +457 -0
  839. anyscale/models/service_model.py +125 -0
  840. anyscale/project.py +501 -0
  841. anyscale/schedule/__init__.py +91 -0
  842. anyscale/schedule/_private/schedule_sdk.py +165 -0
  843. anyscale/schedule/commands.py +149 -0
  844. anyscale/schedule/models.py +145 -0
  845. anyscale/scripts.py +164 -0
  846. anyscale/sdk/anyscale_client/__init__.py +235 -0
  847. anyscale/sdk/anyscale_client/api/__init__.py +6 -0
  848. anyscale/sdk/anyscale_client/api/default_api.py +11625 -0
  849. anyscale/sdk/anyscale_client/api_client.py +647 -0
  850. anyscale/sdk/anyscale_client/configuration.py +373 -0
  851. anyscale/sdk/anyscale_client/exceptions.py +120 -0
  852. anyscale/sdk/anyscale_client/models/__init__.py +220 -0
  853. anyscale/sdk/anyscale_client/models/access_config.py +122 -0
  854. anyscale/sdk/anyscale_client/models/app_config.py +436 -0
  855. anyscale/sdk/anyscale_client/models/app_config_config_schema.py +235 -0
  856. anyscale/sdk/anyscale_client/models/appconfig_list_response.py +147 -0
  857. anyscale/sdk/anyscale_client/models/appconfig_response.py +121 -0
  858. anyscale/sdk/anyscale_client/models/apply_production_service_v2_model.py +490 -0
  859. anyscale/sdk/anyscale_client/models/apply_service_model.py +490 -0
  860. anyscale/sdk/anyscale_client/models/archive_status.py +101 -0
  861. anyscale/sdk/anyscale_client/models/base_job_status.py +105 -0
  862. anyscale/sdk/anyscale_client/models/baseimagesenum.py +2130 -0
  863. anyscale/sdk/anyscale_client/models/build.py +607 -0
  864. anyscale/sdk/anyscale_client/models/build_list_response.py +147 -0
  865. anyscale/sdk/anyscale_client/models/build_log_response.py +123 -0
  866. anyscale/sdk/anyscale_client/models/build_response.py +121 -0
  867. anyscale/sdk/anyscale_client/models/build_status.py +104 -0
  868. anyscale/sdk/anyscale_client/models/buildlogresponse_response.py +121 -0
  869. anyscale/sdk/anyscale_client/models/cloud.py +802 -0
  870. anyscale/sdk/anyscale_client/models/cloud_config.py +206 -0
  871. anyscale/sdk/anyscale_client/models/cloud_list_response.py +147 -0
  872. anyscale/sdk/anyscale_client/models/cloud_providers.py +103 -0
  873. anyscale/sdk/anyscale_client/models/cloud_response.py +121 -0
  874. anyscale/sdk/anyscale_client/models/cloud_state.py +104 -0
  875. anyscale/sdk/anyscale_client/models/cloud_status.py +100 -0
  876. anyscale/sdk/anyscale_client/models/cloud_type.py +100 -0
  877. anyscale/sdk/anyscale_client/models/cloud_types.py +100 -0
  878. anyscale/sdk/anyscale_client/models/cloud_version.py +100 -0
  879. anyscale/sdk/anyscale_client/models/clouds_query.py +150 -0
  880. anyscale/sdk/anyscale_client/models/cluster.py +721 -0
  881. anyscale/sdk/anyscale_client/models/cluster_compute.py +415 -0
  882. anyscale/sdk/anyscale_client/models/cluster_compute_config.py +461 -0
  883. anyscale/sdk/anyscale_client/models/cluster_computes_query.py +293 -0
  884. anyscale/sdk/anyscale_client/models/cluster_environment.py +380 -0
  885. anyscale/sdk/anyscale_client/models/cluster_environment_build.py +578 -0
  886. anyscale/sdk/anyscale_client/models/cluster_environment_build_log_response.py +123 -0
  887. anyscale/sdk/anyscale_client/models/cluster_environment_build_operation.py +237 -0
  888. anyscale/sdk/anyscale_client/models/cluster_environment_build_status.py +104 -0
  889. anyscale/sdk/anyscale_client/models/cluster_environments_query.py +290 -0
  890. anyscale/sdk/anyscale_client/models/cluster_head_node_info.py +152 -0
  891. anyscale/sdk/anyscale_client/models/cluster_list_response.py +147 -0
  892. anyscale/sdk/anyscale_client/models/cluster_management_stack_versions.py +100 -0
  893. anyscale/sdk/anyscale_client/models/cluster_operation.py +266 -0
  894. anyscale/sdk/anyscale_client/models/cluster_operation_type.py +101 -0
  895. anyscale/sdk/anyscale_client/models/cluster_response.py +121 -0
  896. anyscale/sdk/anyscale_client/models/cluster_services_urls.py +430 -0
  897. anyscale/sdk/anyscale_client/models/cluster_state.py +108 -0
  898. anyscale/sdk/anyscale_client/models/cluster_status.py +104 -0
  899. anyscale/sdk/anyscale_client/models/cluster_status_details.py +100 -0
  900. anyscale/sdk/anyscale_client/models/clustercompute_list_response.py +147 -0
  901. anyscale/sdk/anyscale_client/models/clustercompute_response.py +121 -0
  902. anyscale/sdk/anyscale_client/models/clusterenvironment_list_response.py +147 -0
  903. anyscale/sdk/anyscale_client/models/clusterenvironment_response.py +121 -0
  904. anyscale/sdk/anyscale_client/models/clusterenvironmentbuild_list_response.py +147 -0
  905. anyscale/sdk/anyscale_client/models/clusterenvironmentbuild_response.py +121 -0
  906. anyscale/sdk/anyscale_client/models/clusterenvironmentbuildlogresponse_response.py +121 -0
  907. anyscale/sdk/anyscale_client/models/clusterenvironmentbuildoperation_response.py +121 -0
  908. anyscale/sdk/anyscale_client/models/clusteroperation_response.py +121 -0
  909. anyscale/sdk/anyscale_client/models/clusters_query.py +234 -0
  910. anyscale/sdk/anyscale_client/models/compute_node_type.py +292 -0
  911. anyscale/sdk/anyscale_client/models/compute_stack.py +100 -0
  912. anyscale/sdk/anyscale_client/models/compute_template.py +415 -0
  913. anyscale/sdk/anyscale_client/models/compute_template_config.py +461 -0
  914. anyscale/sdk/anyscale_client/models/compute_template_query.py +316 -0
  915. anyscale/sdk/anyscale_client/models/computetemplate_list_response.py +147 -0
  916. anyscale/sdk/anyscale_client/models/computetemplate_response.py +121 -0
  917. anyscale/sdk/anyscale_client/models/computetemplateconfig_response.py +121 -0
  918. anyscale/sdk/anyscale_client/models/create_app_config.py +235 -0
  919. anyscale/sdk/anyscale_client/models/create_app_config_configuration_schema.py +235 -0
  920. anyscale/sdk/anyscale_client/models/create_build.py +263 -0
  921. anyscale/sdk/anyscale_client/models/create_byod_app_config_configuration_schema.py +206 -0
  922. anyscale/sdk/anyscale_client/models/create_byod_cluster_environment.py +180 -0
  923. anyscale/sdk/anyscale_client/models/create_byod_cluster_environment_build.py +152 -0
  924. anyscale/sdk/anyscale_client/models/create_byod_cluster_environment_configuration_schema.py +208 -0
  925. anyscale/sdk/anyscale_client/models/create_cloud.py +518 -0
  926. anyscale/sdk/anyscale_client/models/create_cluster.py +376 -0
  927. anyscale/sdk/anyscale_client/models/create_cluster_compute.py +229 -0
  928. anyscale/sdk/anyscale_client/models/create_cluster_compute_config.py +463 -0
  929. anyscale/sdk/anyscale_client/models/create_cluster_environment.py +235 -0
  930. anyscale/sdk/anyscale_client/models/create_cluster_environment_build.py +263 -0
  931. anyscale/sdk/anyscale_client/models/create_cluster_environment_configuration_schema.py +235 -0
  932. anyscale/sdk/anyscale_client/models/create_compute_template.py +229 -0
  933. anyscale/sdk/anyscale_client/models/create_compute_template_config.py +464 -0
  934. anyscale/sdk/anyscale_client/models/create_job_queue_config.py +206 -0
  935. anyscale/sdk/anyscale_client/models/create_production_job.py +234 -0
  936. anyscale/sdk/anyscale_client/models/create_production_job_config.py +347 -0
  937. anyscale/sdk/anyscale_client/models/create_project.py +207 -0
  938. anyscale/sdk/anyscale_client/models/create_schedule.py +263 -0
  939. anyscale/sdk/anyscale_client/models/create_session.py +432 -0
  940. anyscale/sdk/anyscale_client/models/create_session_command.py +152 -0
  941. anyscale/sdk/anyscale_client/models/create_sso_config.py +150 -0
  942. anyscale/sdk/anyscale_client/models/grpc_protocol_config.py +178 -0
  943. anyscale/sdk/anyscale_client/models/ha_job_goal_states.py +102 -0
  944. anyscale/sdk/anyscale_client/models/ha_job_states.py +109 -0
  945. anyscale/sdk/anyscale_client/models/http_protocol_config.py +150 -0
  946. anyscale/sdk/anyscale_client/models/http_validation_error.py +120 -0
  947. anyscale/sdk/anyscale_client/models/idle_termination_status.py +104 -0
  948. anyscale/sdk/anyscale_client/models/job.py +466 -0
  949. anyscale/sdk/anyscale_client/models/job_list_response.py +147 -0
  950. anyscale/sdk/anyscale_client/models/job_queue_config.py +122 -0
  951. anyscale/sdk/anyscale_client/models/job_queue_execution_mode.py +101 -0
  952. anyscale/sdk/anyscale_client/models/job_queue_spec.py +263 -0
  953. anyscale/sdk/anyscale_client/models/job_run_type.py +101 -0
  954. anyscale/sdk/anyscale_client/models/job_status.py +105 -0
  955. anyscale/sdk/anyscale_client/models/jobs_query.py +458 -0
  956. anyscale/sdk/anyscale_client/models/jobs_sort_field.py +104 -0
  957. anyscale/sdk/anyscale_client/models/list_response_metadata.py +146 -0
  958. anyscale/sdk/anyscale_client/models/list_service_model.py +347 -0
  959. anyscale/sdk/anyscale_client/models/listservicemodel_list_response.py +147 -0
  960. anyscale/sdk/anyscale_client/models/log_download_result.py +207 -0
  961. anyscale/sdk/anyscale_client/models/log_file_chunk.py +439 -0
  962. anyscale/sdk/anyscale_client/models/log_level_types.py +100 -0
  963. anyscale/sdk/anyscale_client/models/log_stream.py +151 -0
  964. anyscale/sdk/anyscale_client/models/logdownloadresult_response.py +121 -0
  965. anyscale/sdk/anyscale_client/models/logstream_response.py +121 -0
  966. anyscale/sdk/anyscale_client/models/node_type.py +100 -0
  967. anyscale/sdk/anyscale_client/models/object_storage_config.py +122 -0
  968. anyscale/sdk/anyscale_client/models/object_storage_config_s3.py +256 -0
  969. anyscale/sdk/anyscale_client/models/objectstorageconfig_response.py +121 -0
  970. anyscale/sdk/anyscale_client/models/operation_error.py +123 -0
  971. anyscale/sdk/anyscale_client/models/operation_progress.py +123 -0
  972. anyscale/sdk/anyscale_client/models/operation_result.py +150 -0
  973. anyscale/sdk/anyscale_client/models/organization.py +209 -0
  974. anyscale/sdk/anyscale_client/models/organization_response.py +121 -0
  975. anyscale/sdk/anyscale_client/models/page_query.py +153 -0
  976. anyscale/sdk/anyscale_client/models/pause_schedule.py +123 -0
  977. anyscale/sdk/anyscale_client/models/production_job.py +437 -0
  978. anyscale/sdk/anyscale_client/models/production_job_config.py +348 -0
  979. anyscale/sdk/anyscale_client/models/production_job_state_transition.py +293 -0
  980. anyscale/sdk/anyscale_client/models/production_service_v2_model.py +612 -0
  981. anyscale/sdk/anyscale_client/models/production_service_v2_version_model.py +437 -0
  982. anyscale/sdk/anyscale_client/models/productionjob_list_response.py +147 -0
  983. anyscale/sdk/anyscale_client/models/productionjob_response.py +121 -0
  984. anyscale/sdk/anyscale_client/models/productionservicev2_model_response.py +121 -0
  985. anyscale/sdk/anyscale_client/models/project.py +467 -0
  986. anyscale/sdk/anyscale_client/models/project_list_response.py +147 -0
  987. anyscale/sdk/anyscale_client/models/project_response.py +121 -0
  988. anyscale/sdk/anyscale_client/models/projects_query.py +234 -0
  989. anyscale/sdk/anyscale_client/models/protocols.py +150 -0
  990. anyscale/sdk/anyscale_client/models/python_modules.py +150 -0
  991. anyscale/sdk/anyscale_client/models/python_version.py +105 -0
  992. anyscale/sdk/anyscale_client/models/ray_gcs_external_storage_config.py +178 -0
  993. anyscale/sdk/anyscale_client/models/ray_runtime_env_config.py +262 -0
  994. anyscale/sdk/anyscale_client/models/resources.py +234 -0
  995. anyscale/sdk/anyscale_client/models/rollback_service_model.py +122 -0
  996. anyscale/sdk/anyscale_client/models/rollout_strategy.py +100 -0
  997. anyscale/sdk/anyscale_client/models/runtime_environment.py +406 -0
  998. anyscale/sdk/anyscale_client/models/runtimeenvironment_response.py +121 -0
  999. anyscale/sdk/anyscale_client/models/schedule_api_model.py +467 -0
  1000. anyscale/sdk/anyscale_client/models/schedule_config.py +151 -0
  1001. anyscale/sdk/anyscale_client/models/scheduleapimodel_list_response.py +147 -0
  1002. anyscale/sdk/anyscale_client/models/scheduleapimodel_response.py +121 -0
  1003. anyscale/sdk/anyscale_client/models/service_config.py +178 -0
  1004. anyscale/sdk/anyscale_client/models/service_event_current_state.py +108 -0
  1005. anyscale/sdk/anyscale_client/models/service_goal_states.py +100 -0
  1006. anyscale/sdk/anyscale_client/models/service_model.py +612 -0
  1007. anyscale/sdk/anyscale_client/models/service_observability_urls.py +206 -0
  1008. anyscale/sdk/anyscale_client/models/service_sort_field.py +101 -0
  1009. anyscale/sdk/anyscale_client/models/service_type.py +100 -0
  1010. anyscale/sdk/anyscale_client/models/service_version_state.py +106 -0
  1011. anyscale/sdk/anyscale_client/models/servicemodel_list_response.py +147 -0
  1012. anyscale/sdk/anyscale_client/models/servicemodel_response.py +121 -0
  1013. anyscale/sdk/anyscale_client/models/session.py +1535 -0
  1014. anyscale/sdk/anyscale_client/models/session_command.py +350 -0
  1015. anyscale/sdk/anyscale_client/models/session_command_types.py +100 -0
  1016. anyscale/sdk/anyscale_client/models/session_event.py +267 -0
  1017. anyscale/sdk/anyscale_client/models/session_event_cause.py +150 -0
  1018. anyscale/sdk/anyscale_client/models/session_event_types.py +111 -0
  1019. anyscale/sdk/anyscale_client/models/session_list_response.py +147 -0
  1020. anyscale/sdk/anyscale_client/models/session_operation.py +266 -0
  1021. anyscale/sdk/anyscale_client/models/session_operation_type.py +101 -0
  1022. anyscale/sdk/anyscale_client/models/session_response.py +121 -0
  1023. anyscale/sdk/anyscale_client/models/session_starting_up_data.py +146 -0
  1024. anyscale/sdk/anyscale_client/models/session_state.py +111 -0
  1025. anyscale/sdk/anyscale_client/models/session_state_data.py +146 -0
  1026. anyscale/sdk/anyscale_client/models/session_stopping_data.py +146 -0
  1027. anyscale/sdk/anyscale_client/models/sessioncommand_list_response.py +147 -0
  1028. anyscale/sdk/anyscale_client/models/sessioncommand_response.py +121 -0
  1029. anyscale/sdk/anyscale_client/models/sessionevent_list_response.py +147 -0
  1030. anyscale/sdk/anyscale_client/models/sessionoperation_response.py +121 -0
  1031. anyscale/sdk/anyscale_client/models/sessions_query.py +206 -0
  1032. anyscale/sdk/anyscale_client/models/sort_by_clause_jobs_sort_field.py +148 -0
  1033. anyscale/sdk/anyscale_client/models/sort_order.py +100 -0
  1034. anyscale/sdk/anyscale_client/models/sso_config.py +237 -0
  1035. anyscale/sdk/anyscale_client/models/sso_mode.py +101 -0
  1036. anyscale/sdk/anyscale_client/models/ssoconfig_response.py +121 -0
  1037. anyscale/sdk/anyscale_client/models/start_cluster_options.py +178 -0
  1038. anyscale/sdk/anyscale_client/models/start_session_options.py +206 -0
  1039. anyscale/sdk/anyscale_client/models/static_sso_config.py +210 -0
  1040. anyscale/sdk/anyscale_client/models/supportedbaseimagesenum.py +1570 -0
  1041. anyscale/sdk/anyscale_client/models/terminate_cluster_options.py +122 -0
  1042. anyscale/sdk/anyscale_client/models/terminate_session_options.py +206 -0
  1043. anyscale/sdk/anyscale_client/models/text_query.py +178 -0
  1044. anyscale/sdk/anyscale_client/models/tracing_config.py +178 -0
  1045. anyscale/sdk/anyscale_client/models/update_app_config.py +122 -0
  1046. anyscale/sdk/anyscale_client/models/update_cloud.py +150 -0
  1047. anyscale/sdk/anyscale_client/models/update_cluster.py +206 -0
  1048. anyscale/sdk/anyscale_client/models/update_compute_template.py +146 -0
  1049. anyscale/sdk/anyscale_client/models/update_compute_template_config.py +464 -0
  1050. anyscale/sdk/anyscale_client/models/update_organization.py +123 -0
  1051. anyscale/sdk/anyscale_client/models/update_project.py +150 -0
  1052. anyscale/sdk/anyscale_client/models/update_session.py +150 -0
  1053. anyscale/sdk/anyscale_client/models/user_service_access_types.py +100 -0
  1054. anyscale/sdk/anyscale_client/models/ux_instance.py +468 -0
  1055. anyscale/sdk/anyscale_client/models/validation_error.py +175 -0
  1056. anyscale/sdk/anyscale_client/models/worker_node_type.py +404 -0
  1057. anyscale/sdk/anyscale_client/rest.py +296 -0
  1058. anyscale/sdk/anyscale_client/sdk.py +634 -0
  1059. anyscale/service/__init__.py +168 -0
  1060. anyscale/service/_private/service_sdk.py +702 -0
  1061. anyscale/service/commands.py +261 -0
  1062. anyscale/service/models.py +671 -0
  1063. anyscale/shared_anyscale_utils/__init__.py +1 -0
  1064. anyscale/shared_anyscale_utils/aws.py +153 -0
  1065. anyscale/shared_anyscale_utils/bytes_util.py +10 -0
  1066. anyscale/shared_anyscale_utils/conf.py +47 -0
  1067. anyscale/shared_anyscale_utils/default_anyscale_aws.yaml +74 -0
  1068. anyscale/shared_anyscale_utils/default_anyscale_gcp.yaml +80 -0
  1069. anyscale/shared_anyscale_utils/headers.py +38 -0
  1070. anyscale/shared_anyscale_utils/latest_ray_version.py +2 -0
  1071. anyscale/shared_anyscale_utils/project.py +15 -0
  1072. anyscale/shared_anyscale_utils/test_util.py +22 -0
  1073. anyscale/shared_anyscale_utils/tests/__init__.py +1 -0
  1074. anyscale/shared_anyscale_utils/tests/test_asyncio.py +41 -0
  1075. anyscale/shared_anyscale_utils/tests/test_ray_semver.py +63 -0
  1076. anyscale/shared_anyscale_utils/util.py +50 -0
  1077. anyscale/shared_anyscale_utils/utils/__init__.py +2 -0
  1078. anyscale/shared_anyscale_utils/utils/asyncio.py +120 -0
  1079. anyscale/shared_anyscale_utils/utils/byod.py +40 -0
  1080. anyscale/shared_anyscale_utils/utils/collections.py +33 -0
  1081. anyscale/shared_anyscale_utils/utils/id_gen.py +147 -0
  1082. anyscale/shared_anyscale_utils/utils/protected_string.py +89 -0
  1083. anyscale/shared_anyscale_utils/utils/ray_semver.py +81 -0
  1084. anyscale/snapshot.py +46 -0
  1085. anyscale/tables.py +82 -0
  1086. anyscale/util.py +1155 -0
  1087. anyscale/utils/__init__.py +0 -0
  1088. anyscale/utils/cli_version_check_util.py +63 -0
  1089. anyscale/utils/cloud_update_utils.py +862 -0
  1090. anyscale/utils/cloud_utils.py +317 -0
  1091. anyscale/utils/cluster_debug.py +191 -0
  1092. anyscale/utils/connect_helpers.py +155 -0
  1093. anyscale/utils/deprecation_util.py +32 -0
  1094. anyscale/utils/entity_arg_utils.py +43 -0
  1095. anyscale/utils/env_utils.py +17 -0
  1096. anyscale/utils/gcp_managed_setup_utils.py +888 -0
  1097. anyscale/utils/gcp_utils.py +312 -0
  1098. anyscale/utils/imports/__init__.py +0 -0
  1099. anyscale/utils/imports/all.py +13 -0
  1100. anyscale/utils/imports/azure.py +14 -0
  1101. anyscale/utils/imports/gcp.py +59 -0
  1102. anyscale/utils/logs_utils.py +141 -0
  1103. anyscale/utils/name_utils.py +33 -0
  1104. anyscale/utils/network_verification.py +153 -0
  1105. anyscale/utils/ray_utils.py +128 -0
  1106. anyscale/utils/ray_version_checker.py +48 -0
  1107. anyscale/utils/ray_version_utils.py +53 -0
  1108. anyscale/utils/runtime_env.py +487 -0
  1109. anyscale/utils/s3.py +92 -0
  1110. anyscale/utils/user_utils.py +17 -0
  1111. anyscale/utils/workload_types.py +7 -0
  1112. anyscale/utils/workspace_notification.py +39 -0
  1113. anyscale/utils/workspace_utils.py +65 -0
  1114. anyscale/version.py +1 -0
  1115. anyscale/webterminal/__init__.py +0 -0
  1116. anyscale/webterminal/bash-preexec.sh +370 -0
  1117. anyscale/webterminal/command_persister.py +164 -0
  1118. anyscale/webterminal/utils.py +176 -0
  1119. anyscale/webterminal/webterminal.py +311 -0
  1120. anyscale/workspace/__init__.py +270 -0
  1121. anyscale/workspace/_private/workspace_sdk.py +737 -0
  1122. anyscale/workspace/commands.py +472 -0
  1123. anyscale/workspace/models.py +296 -0
  1124. anyscale/workspace_utils.py +35 -0
  1125. anyscale-0.24.86.dist-info/LICENSE +68 -0
  1126. anyscale-0.24.86.dist-info/METADATA +82 -0
  1127. anyscale-0.24.86.dist-info/NOTICE +6 -0
  1128. anyscale-0.24.86.dist-info/RECORD +1131 -0
  1129. anyscale-0.24.86.dist-info/WHEEL +5 -0
  1130. anyscale-0.24.86.dist-info/entry_points.txt +2 -0
  1131. anyscale-0.24.86.dist-info/top_level.txt +1 -0
anyscale/util.py ADDED
@@ -0,0 +1,1155 @@
1
+ from contextlib import contextmanager
2
+ from copy import deepcopy
3
+ import datetime
4
+ import ipaddress
5
+ import json
6
+ import logging
7
+ import os
8
+ import random
9
+ import string
10
+ import sys
11
+ import time
12
+ from typing import (
13
+ Any,
14
+ Callable,
15
+ cast,
16
+ Dict,
17
+ Generator,
18
+ List,
19
+ Optional,
20
+ Set,
21
+ Tuple,
22
+ TypeVar,
23
+ Union,
24
+ )
25
+ from urllib.parse import urljoin
26
+
27
+ import boto3
28
+ from boto3.resources.base import ServiceResource as Boto3Resource
29
+ from botocore.config import Config
30
+ from botocore.exceptions import ClientError, NoRegionError
31
+ import click
32
+ from packaging import version
33
+ import requests
34
+ from requests import Response
35
+
36
+ from anyscale.authenticate import get_auth_api_client
37
+ from anyscale.aws_iam_policies import ANYSCALE_IAM_POLICIES, AnyscaleIAMPolicy
38
+ from anyscale.cli_logger import BlockLogger, CloudSetupLogger
39
+ from anyscale.client.openapi_client.api.default_api import DefaultApi as ProductApi
40
+ from anyscale.client.openapi_client.models import AWSMemoryDBClusterConfig
41
+ from anyscale.client.openapi_client.models.cloud_analytics_event_cloud_resource import (
42
+ CloudAnalyticsEventCloudResource,
43
+ )
44
+ from anyscale.client.openapi_client.models.decorated_compute_template import (
45
+ DecoratedComputeTemplate,
46
+ )
47
+ from anyscale.client.openapi_client.models.user_info import UserInfo
48
+ from anyscale.cluster_compute import get_cluster_compute_from_name
49
+ import anyscale.conf
50
+ from anyscale.conf import MINIMUM_RAY_VERSION
51
+ from anyscale.feature_flags import FLAG_DEFAULT_WORKING_DIR_FOR_PROJ
52
+ from anyscale.sdk.anyscale_client.api.default_api import DefaultApi as BaseApi
53
+ from anyscale.sdk.anyscale_client.models.cluster import Cluster
54
+ from anyscale.sdk.anyscale_client.models.compute_template import ComputeTemplate
55
+ import anyscale.shared_anyscale_utils.conf as shared_anyscale_conf
56
+ from anyscale.utils.cloud_utils import CloudSetupError
57
+
58
+
59
+ logger = logging.getLogger(__file__)
60
+
61
+ BOTO_MAX_RETRIES = 5
62
+ PROJECT_NAME_ENV_VAR = "ANYSCALE_PROJECT_NAME"
63
+
64
+ VALID_BYOD_PYTHON_VERSIONS = ["py36", "py37", "py38", "py39"]
65
+
66
+ REDIS_TLS_ADDRESS_PREFIX = "rediss://"
67
+
68
+ log = BlockLogger() # Anyscale CLI Logger
69
+
70
+ VPC_CIDR_RANGE = "10.0.0.0/16"
71
+
72
+ DEFAULT_RAY_VERSION = "1.7.0"
73
+
74
+ # The V2 stack has some delay before changing the state of a new cluster from
75
+ # Terminated to StartingUp. Allow the terminated state for the duration of this
76
+ # grace period before erroring.
77
+ TERMINATED_STATE_GRACE_PERIOD_SECONDS = 5 * 60 # 5 minutes
78
+
79
+ MEMORY_DB_OUTPUT = """ MemoryDB:
80
+ Description: MemoryDB cluster
81
+ Value:
82
+ Fn::ToJsonString:
83
+ arn: !GetAtt MemoryDB.ARN
84
+ ClusterEndpointAddress: !GetAtt MemoryDB.ClusterEndpoint.Address"""
85
+
86
+ MEMORY_DB_RESOURCE = """ MemoryDBSubnetGroup:
87
+ Type: AWS::MemoryDB::SubnetGroup
88
+ Properties:
89
+ Description: Anyscale managed MemoryDB subnet group
90
+ SubnetGroupName: !Ref AWS::StackName
91
+ SubnetIds:
92
+ {}
93
+ Tags:
94
+ - Key: anyscale-cloud-id
95
+ Value: !Ref CloudID
96
+
97
+ MemoryDBParameterGroup:
98
+ Type: AWS::MemoryDB::ParameterGroup
99
+ Properties:
100
+ Description: Parameter group for anyscale managed MemoryDB
101
+ Family: memorydb_redis7
102
+ ParameterGroupName: !Ref AWS::StackName
103
+ Tags:
104
+ - Key: anyscale-cloud-id
105
+ Value: !Ref CloudID
106
+
107
+ MemoryDB:
108
+ Type: AWS::MemoryDB::Cluster
109
+ Properties:
110
+ ACLName: open-access
111
+ Description: Anyscale managed MemoryDB
112
+ ClusterName: !Ref AWS::StackName
113
+ NodeType: db.t4g.small
114
+ Port: !Ref MemoryDBRedisPort
115
+ SubnetGroupName: !Ref MemoryDBSubnetGroup
116
+ SecurityGroupIds:
117
+ - !Ref AnyscaleSecurityGroup
118
+ EngineVersion: "7.0"
119
+ ParameterGroupName: !Ref MemoryDBParameterGroup
120
+ TLSEnabled: true
121
+ Tags:
122
+ - Key: anyscale-cloud-id
123
+ Value: !Ref CloudID"""
124
+
125
+ # Some resources (e.g. memorystore) take a long time to create, so we need to increase the timeout.
126
+ GCP_DEPLOYMENT_MANAGER_TIMEOUT_SECONDS_LONG = 600 # 10 minutes
127
+
128
+
129
+ def confirm(msg: str, yes: bool) -> Optional[bool]:
130
+ return None if yes else click.confirm(msg, abort=True)
131
+
132
+
133
+ class AnyscaleEndpointFormatter:
134
+ def __init__(self, host: Optional[str] = None):
135
+ self.host = host or shared_anyscale_conf.ANYSCALE_HOST
136
+
137
+ def get_endpoint(self, endpoint: str) -> str:
138
+ return str(urljoin(self.host, endpoint))
139
+
140
+ def get_job_endpoint(self, job_id: str) -> str:
141
+ return self.get_endpoint(f"/jobs/{job_id}")
142
+
143
+ def get_schedule_endpoint(self, schedule_id: str) -> str:
144
+ return self.get_endpoint(f"/scheduled-jobs/{schedule_id}")
145
+
146
+
147
+ def get_endpoint(endpoint: str, host: Optional[str] = None) -> str:
148
+ return str(urljoin(host or shared_anyscale_conf.ANYSCALE_HOST, endpoint))
149
+
150
+
151
+ def send_json_request_raw(
152
+ endpoint: str,
153
+ json_args: Dict[str, Any],
154
+ method: str = "GET",
155
+ cli_token: Optional[str] = None,
156
+ host: Optional[str] = None,
157
+ ) -> Response:
158
+ get_auth_api_client(cli_token=cli_token, host=host)
159
+
160
+ url = get_endpoint(endpoint, host=host)
161
+ cookies = {"cli_token": cli_token or anyscale.conf.CLI_TOKEN or ""}
162
+ try:
163
+ if method == "GET":
164
+ resp = requests.get(url, params=json_args, cookies=cookies)
165
+ elif method == "POST":
166
+ resp = requests.post(url, json=json_args, cookies=cookies)
167
+ elif method == "DELETE":
168
+ resp = requests.delete(url, json=json_args, cookies=cookies)
169
+ elif method == "PATCH":
170
+ resp = requests.patch(url, data=json_args, cookies=cookies)
171
+ elif method == "PUT":
172
+ resp = requests.put(url, json=json_args, cookies=cookies)
173
+ else:
174
+ raise AssertionError(f"unknown method {method}")
175
+ except requests.exceptions.ConnectionError:
176
+ raise click.ClickException(f"Failed to connect to anyscale server at {url}")
177
+
178
+ return resp
179
+
180
+
181
+ def send_json_request(
182
+ endpoint: str,
183
+ json_args: Dict[str, Any],
184
+ method: str = "GET",
185
+ cli_token: Optional[str] = None,
186
+ host: Optional[str] = None,
187
+ ) -> Dict[str, Any]:
188
+ resp = send_json_request_raw(
189
+ endpoint, json_args, method=method, cli_token=cli_token, host=host,
190
+ )
191
+
192
+ if not resp.ok:
193
+ if resp.status_code == 500:
194
+ raise click.ClickException(
195
+ "There was an internal error in this command. "
196
+ "Please report this to the Anyscale team at support@anyscale.com "
197
+ "with the token '{}'.".format(resp.headers["x-trace-id"])
198
+ )
199
+
200
+ raise click.ClickException(f"{resp.status_code}: {resp.text}.")
201
+
202
+ if resp.status_code == 204:
203
+ return {}
204
+
205
+ json_resp: Dict[str, Any] = resp.json()
206
+ if "error" in json_resp:
207
+ raise click.ClickException("{}".format(json_resp["error"]))
208
+
209
+ return json_resp
210
+
211
+
212
+ def deserialize_datetime(s: str) -> datetime.datetime:
213
+ if sys.version_info < (3, 7) and s[-3:-2] == ":":
214
+ s = s[:-3] + s[-2:]
215
+
216
+ return datetime.datetime.strptime(s, "%Y-%m-%dT%H:%M:%S.%f%z")
217
+
218
+
219
+ def humanize_timestamp(timestamp: datetime.datetime) -> str:
220
+ delta = datetime.datetime.now(datetime.timezone.utc) - timestamp
221
+ offset = float(delta.seconds + (delta.days * 60 * 60 * 24))
222
+ delta_s = int(offset % 60)
223
+ offset /= 60
224
+ delta_m = int(offset % 60)
225
+ offset /= 60
226
+ delta_h = int(offset % 24)
227
+ offset /= 24
228
+ delta_d = int(offset)
229
+
230
+ if delta_d >= 1:
231
+ return "{} day{} ago".format(delta_d, "s" if delta_d > 1 else "")
232
+ if delta_h > 0:
233
+ return "{} hour{} ago".format(delta_h, "s" if delta_h > 1 else "")
234
+ if delta_m > 0:
235
+ return "{} minute{} ago".format(delta_m, "s" if delta_m > 1 else "")
236
+ else:
237
+ return "{} second{} ago".format(delta_s, "s" if delta_s > 1 else "")
238
+
239
+
240
+ def get_requirements(requirements_path: str) -> str:
241
+ with open(requirements_path) as f:
242
+ return f.read()
243
+
244
+
245
+ def _resource(name: str, region: str) -> Boto3Resource:
246
+ boto_config = Config(retries={"max_attempts": BOTO_MAX_RETRIES})
247
+ return boto3.resource(name, region, config=boto_config) # type: ignore
248
+
249
+
250
+ def _client(name: str, region: str) -> Any:
251
+ return _resource(name, region).meta.client
252
+
253
+
254
+ def _get_role(
255
+ role_name: str, region: str, boto3_session: Optional[boto3.Session] = None
256
+ ) -> Optional[Boto3Resource]:
257
+ if boto3_session is None:
258
+ iam = _resource("iam", region)
259
+ else:
260
+ iam = boto3_session.resource("iam")
261
+ role = iam.Role(role_name) # type: ignore
262
+ try:
263
+ role.load()
264
+ return role # type: ignore
265
+ except ClientError as exc:
266
+ if exc.response.get("Error", {}).get("Code") == "NoSuchEntity":
267
+ return None
268
+ else:
269
+ raise exc
270
+
271
+
272
+ def _get_aws_efs_mount_target_ip(boto3_session: Any, efs_id: str) -> Optional[str]:
273
+ client = boto3_session.client("efs")
274
+ try:
275
+ mount_targets_response = client.describe_mount_targets(FileSystemId=efs_id)
276
+ if not mount_targets_response.get("MountTargets"):
277
+ logger.warning(f"EFS with id {efs_id} does not contain mount targets.")
278
+ return None
279
+ return mount_targets_response.get("MountTargets")[0].get("IpAddress")
280
+ except ClientError as e:
281
+ if e.response["Error"]["Code"] == "FileSystemNotFound":
282
+ return None
283
+ raise e
284
+
285
+
286
+ def _get_subnet(
287
+ subnet_arn: str, region: str, logger: CloudSetupLogger
288
+ ) -> Optional[Boto3Resource]:
289
+ ec2 = _resource("ec2", region) # TODO: take a resource as an argument
290
+ subnet = ec2.Subnet(subnet_arn) # type: ignore
291
+ try:
292
+ subnet.load()
293
+ return subnet # type: ignore
294
+ except ClientError as e:
295
+ if e.response["Error"]["Code"] == "InvalidSubnetID.NotFound":
296
+ logger.log_resource_error(
297
+ CloudAnalyticsEventCloudResource.AWS_SUBNET,
298
+ CloudSetupError.RESOURCE_NOT_FOUND,
299
+ )
300
+ raise click.ClickException(
301
+ f"{subnet_arn} does not exist. Please make sure the subnet arn is correct and the subnet is in the same region as the cloud."
302
+ )
303
+ else:
304
+ logger.log_resource_exception(
305
+ CloudAnalyticsEventCloudResource.AWS_SUBNET, e
306
+ )
307
+ raise e
308
+
309
+
310
+ def _get_memorydb_cluster_config(
311
+ memorydb_cluster_id: str, region: str, logger: CloudSetupLogger
312
+ ) -> Optional[AWSMemoryDBClusterConfig]:
313
+ try:
314
+ memorydb_client = boto3.client("memorydb", region_name=region)
315
+ response = memorydb_client.describe_clusters(ClusterName=memorydb_cluster_id)
316
+
317
+ if not response.get("Clusters") or not response.get("Clusters")[0]:
318
+ logger.log_resource_error(
319
+ CloudAnalyticsEventCloudResource.AWS_MEMORYDB,
320
+ CloudSetupError.RESOURCE_NOT_FOUND,
321
+ )
322
+ raise click.ClickException(
323
+ f"MemoryDB cluster with id {memorydb_cluster_id} does not exist."
324
+ )
325
+ cluster = response["Clusters"][0]
326
+ if cluster["Status"] != "available":
327
+ logger.log_resource_error(
328
+ CloudAnalyticsEventCloudResource.AWS_MEMORYDB,
329
+ CloudSetupError.MEMORYDB_CLUSTER_UNAVAILABLE,
330
+ )
331
+ raise click.ClickException(
332
+ f"MemoryDB cluster with id {memorydb_cluster_id} is not currently available. Please make sure the cluster is available and try again."
333
+ )
334
+ endpoint = cluster["ClusterEndpoint"]
335
+
336
+ return AWSMemoryDBClusterConfig(
337
+ id=cluster["ARN"],
338
+ endpoint=f"{REDIS_TLS_ADDRESS_PREFIX}{endpoint['Address']}:{endpoint['Port']}",
339
+ )
340
+ except ClientError as e:
341
+ if e.response["Error"]["Code"] == "ClusterNotFoundFault":
342
+ logger.log_resource_error(
343
+ CloudAnalyticsEventCloudResource.AWS_MEMORYDB,
344
+ CloudSetupError.RESOURCE_NOT_FOUND,
345
+ )
346
+ else:
347
+ logger.log_resource_exception(
348
+ CloudAnalyticsEventCloudResource.AWS_MEMORYDB, e
349
+ )
350
+ raise e
351
+
352
+
353
+ def get_available_regions(boto3_session: Optional[boto3.Session] = None) -> List[str]:
354
+ if boto3_session is None:
355
+ boto3_session = boto3.Session()
356
+ try:
357
+ client = boto3_session.client("ec2")
358
+ except NoRegionError:
359
+ # If there is no region, default to `us-west-2`
360
+ client = boto3_session.client("ec2", region_name="us-west-2")
361
+ return [region["RegionName"] for region in client.describe_regions()["Regions"]]
362
+
363
+
364
+ def get_availability_zones(
365
+ region: str, boto3_session: Optional[boto3.Session] = None
366
+ ) -> Dict[str, str]:
367
+ """
368
+ Returns a mapping of availability zone ids to names for the given region.
369
+ """
370
+ if boto3_session is None:
371
+ boto3_session = boto3.Session()
372
+ client = boto3_session.client("ec2", region_name=region)
373
+ return {
374
+ zone["ZoneId"]: zone["ZoneName"]
375
+ for zone in client.describe_availability_zones()["AvailabilityZones"]
376
+ }
377
+
378
+
379
+ def get_memorydb_supported_zones(
380
+ region: str, zone_ids_to_names: Dict[str, str]
381
+ ) -> List[str]:
382
+ """
383
+ Returns a list of supported zone names for MemoryDB in the given region.
384
+ """
385
+ with open(f"{anyscale.conf.ROOT_DIR_PATH}/memorydb_supported_zones.json") as f:
386
+ # There's no API to get the supported zones for MemoryDB, so we need to read it from a file.
387
+ memorydb_supported_zones = json.load(f)
388
+
389
+ supported_zone_ids_for_cloud_region = memorydb_supported_zones.get(region, [])
390
+ if len(supported_zone_ids_for_cloud_region) == 0:
391
+ raise click.ClickException(f"MemoryDB is not supported in the region {region}.")
392
+ return [
393
+ zone_ids_to_names[zone_id] for zone_id in supported_zone_ids_for_cloud_region
394
+ ]
395
+
396
+
397
+ def get_project_directory_name(project_id: str, api_client: ProductApi = None) -> str:
398
+ if api_client is None:
399
+ api_client = get_auth_api_client().api_client
400
+
401
+ # TODO (yiran): return error early if project doesn't exist.
402
+ resp = api_client.get_project_api_v2_projects_project_id_get(project_id)
403
+ if api_client.check_is_feature_flag_on_api_v2_userinfo_check_is_feature_flag_on_get(
404
+ FLAG_DEFAULT_WORKING_DIR_FOR_PROJ
405
+ ).result.is_on:
406
+ directory_name = resp.result.directory_name
407
+ else:
408
+ directory_name = resp.result.name
409
+ assert len(directory_name) > 0, "Empty directory name found."
410
+ return cast(str, directory_name)
411
+
412
+
413
+ def get_working_dir(project_id: str, api_client: ProductApi = None) -> str:
414
+ project_directory_name = get_project_directory_name(project_id, api_client)
415
+ return f"/home/ray/{project_directory_name}"
416
+
417
+
418
+ # Python 3.7 and before have different wheel name conventions.
419
+ # Though product today only support Python 3.9 or above.
420
+ _LEGACY_PY_VERSIONS = ["3" + str(x) for x in range(8)]
421
+
422
+
423
+ def get_wheel_url(
424
+ ray_commit: str,
425
+ ray_version: str,
426
+ py_version: Optional[str] = None,
427
+ sys_platform: Optional[str] = None,
428
+ ) -> str:
429
+ """Return S3 URL for the given release spec or 'latest'."""
430
+ if py_version is None:
431
+ py_version = "".join(str(x) for x in sys.version_info[0:2])
432
+ if sys_platform is None:
433
+ sys_platform = sys.platform
434
+
435
+ if sys_platform == "darwin":
436
+ if py_version not in _LEGACY_PY_VERSIONS:
437
+ platform = "macosx_10_15_x86_64"
438
+ else:
439
+ platform = "macosx_10_15_intel"
440
+ elif sys_platform == "win32":
441
+ platform = "win_amd64"
442
+ else:
443
+ platform = "manylinux2014_x86_64"
444
+
445
+ if py_version in _LEGACY_PY_VERSIONS:
446
+ py_version_malloc = f"{py_version}m"
447
+ else:
448
+ py_version_malloc = py_version
449
+
450
+ if "dev" in ray_version:
451
+ ray_release = f"master/{ray_commit}"
452
+ else:
453
+ ray_release = f"releases/{ray_version}/{ray_commit}"
454
+ return (
455
+ "https://s3-us-west-2.amazonaws.com/ray-wheels/"
456
+ "{}/ray-{}-cp{}-cp{}-{}.whl".format(
457
+ ray_release, ray_version, py_version, py_version_malloc, platform
458
+ )
459
+ )
460
+
461
+
462
+ @contextmanager
463
+ def updating_printer() -> Generator[Callable[[str], None], None, None]:
464
+ import shutil
465
+
466
+ cols, _ = shutil.get_terminal_size()
467
+
468
+ def print_status(status: str) -> None:
469
+ lines = status.splitlines()
470
+ first_line = lines[0]
471
+ truncated_first_line = (
472
+ first_line[0:cols]
473
+ if len(first_line) <= cols and len(lines) == 1
474
+ else (first_line[0 : cols - 3] + "...")
475
+ )
476
+ # Clear the line first
477
+ print("\r" + " " * cols, end="\r")
478
+ print(truncated_first_line, end="", flush=True)
479
+
480
+ try:
481
+ yield print_status
482
+ finally:
483
+ # Clear out the status and return to the beginning to reprint
484
+ print("\r" + " " * cols, end="\r", flush=True)
485
+
486
+
487
+ def wait_for_session_start(
488
+ project_id: str,
489
+ session_name: str,
490
+ api_client: Optional[ProductApi] = None,
491
+ log: BlockLogger = log,
492
+ block_label: Optional[str] = None,
493
+ ) -> str:
494
+ if block_label:
495
+ log.info(
496
+ f"Waiting for cluster {BlockLogger.highlight(session_name)} to start. This may take a few minutes",
497
+ block_label=block_label,
498
+ )
499
+ else:
500
+ log.info(
501
+ f"Waiting for cluster {session_name} to start. This may take a few minutes"
502
+ )
503
+
504
+ if api_client is None:
505
+ api_client = get_auth_api_client().api_client
506
+
507
+ start_time = time.time()
508
+ with updating_printer() as print_status:
509
+ while True:
510
+ sessions = api_client.list_sessions_api_v2_sessions_get(
511
+ project_id=project_id, name=session_name, active_only=False
512
+ ).results
513
+
514
+ if len(sessions) > 0:
515
+ session = sessions[0]
516
+
517
+ # TODO: Remove "session.host_name" check once https://github.com/anyscale/product/issues/15502 is fixed
518
+ # A cluster may have "running" state while its dns is not set up yet. When DNS is not ready,
519
+ # many cluster operations, like ray job submission will fail. So we wait until DNS info
520
+ # is ready.
521
+ if (
522
+ session.state == "Running"
523
+ and session.pending_state is None
524
+ and session.host_name
525
+ ):
526
+ return cast(str, session.id)
527
+
528
+ # Check for start up errors
529
+ if (
530
+ session.state_data
531
+ and session.state_data.startup
532
+ and session.state_data.startup.startup_error
533
+ ):
534
+ raise click.ClickException(
535
+ f"Error while starting cluster {session_name}: {session.state_data.startup.startup_error}"
536
+ )
537
+ elif (
538
+ session.state
539
+ and "Errored" in session.state
540
+ and session.pending_state is None
541
+ ):
542
+ raise click.ClickException(
543
+ f"Error while starting cluster {session_name}: Cluster startup failed due to an error ({session.state})."
544
+ )
545
+ elif (
546
+ session.state
547
+ and session.state in {"Terminated", "Stopped"}
548
+ and session.pending_state is None
549
+ ):
550
+ if time.time() - start_time < TERMINATED_STATE_GRACE_PERIOD_SECONDS:
551
+ # The V2 stack has some delay before transitioning from Terminated to StartingUp.
552
+ # Don't error until the grace period has passed
553
+ print_status("Waiting for start up...")
554
+ else:
555
+ # Cluster is created in Terminated state; Check pending state to see if it is pending transition.
556
+ raise click.ClickException(
557
+ f"Error while starting cluster {session_name}: Cluster is still in stopped/terminated state."
558
+ )
559
+ elif (
560
+ session.state_data
561
+ and session.state_data.startup
562
+ and session.state_data.startup.startup_progress
563
+ ):
564
+ # Print the latest status
565
+ print_status(
566
+ "Starting up " + session.state_data.startup.startup_progress
567
+ )
568
+ elif (
569
+ session.state != "StartingUp"
570
+ and session.pending_state == "StartingUp"
571
+ ):
572
+ print_status("Waiting for start up...")
573
+ else:
574
+ raise click.ClickException(
575
+ f"Error while starting cluster {session_name}: Cluster doesn't exist."
576
+ )
577
+
578
+ time.sleep(2)
579
+
580
+
581
+ def populate_session_args(cluster_config_str: str, config_file_name: str) -> str:
582
+ import jinja2
583
+
584
+ env = jinja2.Environment()
585
+ t = env.parse(cluster_config_str)
586
+ for elem in t.body[0].nodes: # type: ignore
587
+ if isinstance(elem, jinja2.nodes.Getattr) and elem.attr not in os.environ:
588
+ prefixed_command = " ".join(
589
+ [f"{elem.attr}=<value>", "anyscale"] + sys.argv[1:]
590
+ )
591
+ raise click.ClickException(
592
+ f"\tThe environment variable {elem.attr} was not set, yet it is required "
593
+ f"for configuration file {config_file_name}.\n\tPlease specify {elem.attr} "
594
+ f"by prefixing the command.\n\t\t{prefixed_command}"
595
+ )
596
+
597
+ template = jinja2.Template(cluster_config_str)
598
+ cluster_config_filled = template.render(env=os.environ)
599
+ return cluster_config_filled
600
+
601
+
602
+ def get_user_info() -> Optional[UserInfo]:
603
+ try:
604
+ api_client = get_auth_api_client().api_client
605
+ except click.exceptions.ClickException:
606
+ return None
607
+ return api_client.get_user_info_api_v2_userinfo_get().result
608
+
609
+
610
+ def generate_slug(length: int = 6) -> str:
611
+ return "".join(random.choices(string.ascii_lowercase + string.digits, k=length))
612
+
613
+
614
+ def validate_non_negative_arg(ctx, param, value): # noqa: ARG001
615
+ """
616
+ Checks that an integer option to click command is non-negative.
617
+ """
618
+ if value < 0:
619
+ raise click.ClickException(
620
+ f"Please specify a non-negative value for {param.opts[0]}"
621
+ )
622
+ return value
623
+
624
+
625
+ def _update_external_ids_for_policy(
626
+ original_policy: Dict[str, Any], new_external_id: str
627
+ ):
628
+ """Gets All External IDs From policy Dict."""
629
+ policy = deepcopy(original_policy)
630
+ external_ids = [
631
+ statement.setdefault("Condition", {})
632
+ .setdefault("StringEquals", {})
633
+ .setdefault("sts:ExternalId", [])
634
+ for statement in policy.get("Statement", [])
635
+ ]
636
+
637
+ external_ids = [
638
+ [i, new_external_id] if isinstance(i, str) else i + [new_external_id]
639
+ for i in external_ids
640
+ ]
641
+
642
+ _ = [
643
+ policy["Statement"][i]["Condition"]["StringEquals"].update(
644
+ {"sts:ExternalId": external_ids[i]}
645
+ )
646
+ for i in range(len(policy.get("Statement", [])))
647
+ ]
648
+ return policy
649
+
650
+
651
+ def extract_versions_from_image_name(image_name: str) -> Tuple[str, str]:
652
+ """Returns the python version and ray extracted from an image tag.
653
+ This should be used when creating BYOD images.
654
+
655
+ Args:
656
+ image_name: e.g. anyscale/ray-ml:1.11.1-py38-gpu
657
+
658
+ Returns:
659
+ The (python version, ray version), e.g. ("py38", "1.11.1")
660
+ """
661
+ # e.g. 1.11.1-py32-gpu
662
+ image_version = image_name.split(":")[-1]
663
+ parts = image_version.split("-")
664
+ # e.g. 1.11.1
665
+
666
+ if len(parts) < 2:
667
+ raise ValueError(
668
+ f"Expected the docker image name have an image version tag (something like ray-ml:1.11.1-py38-gpu), got {image_version}."
669
+ )
670
+
671
+ ray_version = parts[0]
672
+ # Verify ray_version is valid.
673
+ _ray_version_major_minor(ray_version)
674
+
675
+ python_version = parts[1]
676
+ _check_python_version(python_version)
677
+ return (python_version, ray_version)
678
+
679
+
680
+ def _ray_version_major_minor(ray_version: str) -> Tuple[int, int]:
681
+ """Takes in a Ray version such as "1.9.0rc1", "1.10.2", "2.0.0dev0".
682
+
683
+ Returns the major minor pair e.g. (1,9) (1,10) (2,0).
684
+
685
+ To avoid introducing undesirable dependencies, partly duplicates logic from the Anyscale
686
+ backend.
687
+ """
688
+ invalid_ray_version_msg = (
689
+ f"The Ray version `{ray_version}` has an unexpected format."
690
+ )
691
+ version_components = ray_version.split(".")
692
+ assert len(version_components) >= 2, invalid_ray_version_msg
693
+ major_str, minor_str = version_components[:2]
694
+ assert major_str.isnumeric() and minor_str.isnumeric(), invalid_ray_version_msg
695
+ major_int, minor_int = int(major_str), int(minor_str)
696
+ return (major_int, minor_int)
697
+
698
+
699
+ def _check_python_version(python_version: str) -> None:
700
+ assert (
701
+ python_version in VALID_BYOD_PYTHON_VERSIONS
702
+ ), f"Expected python_version to be one of {VALID_BYOD_PYTHON_VERSIONS}, got {python_version}."
703
+
704
+
705
+ def sleep_till(wake_time: float) -> None:
706
+ """Sleep till the designated time"""
707
+ now = time.time()
708
+ if now >= wake_time:
709
+ return
710
+ time.sleep(wake_time - now)
711
+
712
+
713
+ def poll(
714
+ interval_secs: float = 1,
715
+ timeout_secs: Optional[float] = None,
716
+ max_iter: Optional[int] = None,
717
+ ) -> Generator[int, None, None]:
718
+ """Poll every interval_secs, until timeout_secs, or max iterations has been reached.
719
+ Yield the iteration number, starting at 1.
720
+ """
721
+ now = time.time()
722
+ end_time = now + timeout_secs if timeout_secs else None
723
+ count = 0
724
+ should_continue_iter = max_iter is None or count < max_iter
725
+ should_continue_time = end_time is None or now < end_time
726
+ while should_continue_iter and should_continue_time:
727
+ count += 1
728
+ wake_time = now + interval_secs
729
+ yield count
730
+ sleep_till(wake_time)
731
+ now = time.time()
732
+ should_continue_iter = max_iter is None or count < max_iter
733
+ should_continue_time = end_time is None or now < end_time
734
+
735
+
736
+ def is_anyscale_workspace() -> bool:
737
+ return "ANYSCALE_EXPERIMENTAL_WORKSPACE_ID" in os.environ
738
+
739
+
740
+ def is_anyscale_cluster() -> bool:
741
+ return "ANYSCALE_SESSION_ID" in os.environ
742
+
743
+
744
+ def credentials_check_sanity(credentials_str: str) -> bool:
745
+ """
746
+ The main goal of this function is to perform a minimal sanity check
747
+ to make sure that the CLI token string (entered by user or read from file)
748
+ is not totally broken.
749
+ refer to https://www.notion.so/anyscale-hq/Authentication-Infrastructure
750
+ """
751
+ # Old token style
752
+ if credentials_str.startswith("sss_"):
753
+ return True
754
+ # Future token style
755
+ if credentials_str.startswith("a") and credentials_str.count("_") > 0:
756
+ return True
757
+ return False
758
+
759
+
760
+ def get_current_cluster_id() -> Optional[str]:
761
+ """If we are running on an Anyscale Cluster, return the id from the environment."""
762
+ return os.getenv("ANYSCALE_SESSION_ID")
763
+
764
+
765
+ def str_data_size(s: str) -> int:
766
+ """Returns the size of the string when encoded to raw bytes."""
767
+ return len(s.encode("utf-8"))
768
+
769
+
770
+ def get_user_env_aws_account(region: str) -> str:
771
+ """Get the AWS account used in the user environment"""
772
+ return boto3.client("sts", region_name=region).get_caller_identity()["Account"]
773
+
774
+
775
+ def generate_inline_policy_parameter(policy: AnyscaleIAMPolicy) -> str:
776
+ """Generate the inline policy paramter for the cross account role"""
777
+ return f""" {policy.parameter_key}:
778
+ Description: {policy.parameter_description}
779
+ Type: String"""
780
+
781
+
782
+ def generate_inline_policy_resource(policy: AnyscaleIAMPolicy) -> str:
783
+ """Generate the inline policy resource for the cross account role"""
784
+ return f""" {policy.resource_logical_id}:
785
+ Type: AWS::IAM::Policy
786
+ Properties:
787
+ PolicyDocument: !Ref {policy.parameter_key}
788
+ PolicyName: {policy.policy_name}
789
+ Roles:
790
+ - !Ref customerRole"""
791
+
792
+
793
+ def get_anyscale_cross_account_iam_policies() -> List[Dict[str, str]]:
794
+ return [
795
+ {
796
+ "ParameterKey": policy.parameter_key,
797
+ "ParameterValue": policy.policy_document,
798
+ }
799
+ for policy in ANYSCALE_IAM_POLICIES
800
+ ]
801
+
802
+
803
+ def prepare_cloudformation_template(
804
+ region: str,
805
+ cfn_stack_name: str,
806
+ cloud_id: str,
807
+ enable_head_node_fault_tolerance: bool,
808
+ boto3_session: Optional[boto3.Session] = None,
809
+ is_anyscale_hosted: bool = False,
810
+ ) -> str:
811
+ if is_anyscale_hosted:
812
+ with open(f"{anyscale.conf.ROOT_DIR_PATH}/anyscale-cloud-setup-oa.yaml") as f:
813
+ body = f.read()
814
+ else:
815
+ with open(f"{anyscale.conf.ROOT_DIR_PATH}/anyscale-cloud-setup.yaml") as f:
816
+ body = f.read()
817
+ body = body.replace(
818
+ "$ALLOWED_ORIGIN", shared_anyscale_conf.ANYSCALE_CORS_ORIGIN
819
+ )
820
+
821
+ zone_ids_to_names = get_availability_zones(region, boto3_session)
822
+ azs = sorted(zone_ids_to_names.values())
823
+ subnet_templates: List[str] = []
824
+ subnets_route_table_association: List[str] = []
825
+ subnets_with_availability_zones: List[str] = []
826
+ efs_mount_targets: List[str] = []
827
+
828
+ vpc_cidr = ipaddress.ip_network(VPC_CIDR_RANGE)
829
+ if len(azs) > 4:
830
+ subnet_cidrs = list(vpc_cidr.subnets(prefixlen_diff=3))
831
+ else:
832
+ subnet_cidrs = list(vpc_cidr.subnets(prefixlen_diff=2))
833
+
834
+ for i, az in enumerate(azs):
835
+ subnet_templates.append(
836
+ f"""
837
+ Subnet{i}:
838
+ Type: AWS::EC2::Subnet
839
+ Properties:
840
+ VpcId: !Ref VPC
841
+ AvailabilityZone: {az}
842
+ CidrBlock: {subnet_cidrs[i]}
843
+ MapPublicIpOnLaunch: true
844
+ Tags:
845
+ - Key: Name
846
+ Value: {cfn_stack_name}-subnet-{az}
847
+ - Key: anyscale-cloud-id
848
+ Value: {cloud_id}"""
849
+ )
850
+
851
+ subnets_route_table_association.append(
852
+ f"""
853
+ Subnet{i}RouteTableAssociation:
854
+ Type: AWS::EC2::SubnetRouteTableAssociation
855
+ Properties:
856
+ RouteTableId: !Ref PublicRouteTable
857
+ SubnetId: !Ref Subnet{i}"""
858
+ )
859
+
860
+ subnets_with_availability_zones.append(
861
+ f'{{"subnet_id": !Ref Subnet{i}, "availability_zone": !GetAtt Subnet{i}.AvailabilityZone}}'
862
+ )
863
+
864
+ if not is_anyscale_hosted:
865
+ efs_mount_targets.append(
866
+ f"""
867
+ EFSMountTarget{i}:
868
+ Type: AWS::EFS::MountTarget
869
+ Properties:
870
+ FileSystemId: !Ref EFS
871
+ SecurityGroups:
872
+ - !Ref AnyscaleSecurityGroup
873
+ SubnetId: !Ref Subnet{i}"""
874
+ )
875
+
876
+ body = body.replace("$SUBNETS_TEMPLATES", "\n".join(subnet_templates))
877
+ body = body.replace(
878
+ "$SUBNETS_ROUTE_TABLE_ASSOCIATION", "\n".join(subnets_route_table_association),
879
+ )
880
+ body = body.replace(
881
+ "$SUBNETS_WITH_AVAILABILITY_ZONES",
882
+ f'[{",".join(subnets_with_availability_zones)}]',
883
+ )
884
+ if not is_anyscale_hosted:
885
+ body = body.replace("$EFSMountTargets", "\n".join(efs_mount_targets))
886
+
887
+ iam_policy_parameters = [
888
+ generate_inline_policy_parameter(policy) for policy in ANYSCALE_IAM_POLICIES
889
+ ]
890
+ body = body.replace(
891
+ "$ANYSCALE_CROSS_ACCOUNT_IAM_POLICY_PARAMETERS",
892
+ "\n\n".join(iam_policy_parameters),
893
+ )
894
+
895
+ iam_policy_resources = [
896
+ generate_inline_policy_resource(policy) for policy in ANYSCALE_IAM_POLICIES
897
+ ]
898
+ body = body.replace(
899
+ "$ANYSCALE_CROSS_ACCOUNT_IAM_POLICY_RESOURCES",
900
+ "\n\n".join(iam_policy_resources),
901
+ )
902
+
903
+ if enable_head_node_fault_tolerance:
904
+ supported_zone_names = get_memorydb_supported_zones(region, zone_ids_to_names)
905
+ allowed_az_indices = sorted(azs.index(az) for az in supported_zone_names)
906
+ body = body.replace("$MEMORY_DB_OUTPUT", MEMORY_DB_OUTPUT,)
907
+ body = body.replace(
908
+ "$MEMORY_DB_RESOURCE",
909
+ MEMORY_DB_RESOURCE.format(
910
+ "\n".join([f" - !Ref Subnet{i}" for i in allowed_az_indices])
911
+ ),
912
+ )
913
+ else:
914
+ body = body.replace("$MEMORY_DB_OUTPUT", "")
915
+ body = body.replace("$MEMORY_DB_RESOURCE", "")
916
+
917
+ return body
918
+
919
+
920
+ def get_latest_ray_version():
921
+ """
922
+ Gets latest Ray version from PYPI. This method should not
923
+ assume Ray is already installed.
924
+ """
925
+ try:
926
+ response = requests.get("https://pypi.org/pypi/ray/json")
927
+ latest_version = response.json()["info"]["version"]
928
+ except Exception as e: # noqa: BLE001
929
+ log.debug(
930
+ f"Unable to get latest Ray version from https://pypi.org/pypi/ray/json {e!s}"
931
+ )
932
+ latest_version = DEFAULT_RAY_VERSION
933
+ return latest_version
934
+
935
+
936
+ def get_ray_and_py_version_for_default_cluster_env() -> Tuple[str, str]:
937
+ py_version = "".join(str(x) for x in sys.version_info[0:2])
938
+ try:
939
+ import ray
940
+
941
+ ray_version = ray.__version__
942
+ if version.parse(ray_version) < version.parse(MINIMUM_RAY_VERSION):
943
+ raise ValueError(
944
+ f"No default cluster env for Ray version {ray_version}. Please upgrade "
945
+ f'to a version >= {MINIMUM_RAY_VERSION} with `pip install "ray>={MINIMUM_RAY_VERSION}"`.'
946
+ )
947
+ if "dev0" in ray_version:
948
+ raise ValueError(
949
+ f"Your locally installed Ray version is {ray_version}. "
950
+ "There is no default cluster environments for nightly versions of Ray."
951
+ )
952
+ except ImportError:
953
+ # Use latest Ray version if Ray not locally installed, because Anyscale cluster envs for
954
+ # new Ray versions are available before the open source package is released on PYPI.
955
+ ray_version = get_latest_ray_version()
956
+ log.debug(
957
+ f"Ray is not installed locally. Using latest Ray version {ray_version} for "
958
+ "the cluster env."
959
+ )
960
+
961
+ return ray_version, py_version
962
+
963
+
964
+ def validate_job_config_dict(
965
+ config_dict: Dict[str, Any], api_client: ProductApi
966
+ ) -> None:
967
+ """
968
+ Throws an exception if there are invalid values in the config dict.
969
+ """
970
+ compute_config: Optional[Union[ComputeTemplate, DecoratedComputeTemplate]] = None
971
+ if "compute_config" in config_dict and isinstance(
972
+ config_dict["compute_config"], str
973
+ ):
974
+ compute_config = get_cluster_compute_from_name(
975
+ config_dict["compute_config"], api_client
976
+ )
977
+ elif "compute_config_id" in config_dict:
978
+ cluster_compute_id = config_dict["compute_config_id"]
979
+ compute_config = api_client.get_compute_template_api_v2_compute_templates_template_id_get(
980
+ cluster_compute_id
981
+ ).result
982
+
983
+ if compute_config and compute_config.archived_at:
984
+ raise click.ClickException(
985
+ "This job is using an archived compute config. To submit this job, use another compute config."
986
+ )
987
+
988
+
989
+ def get_cluster_model_for_current_workspace(
990
+ anyscale_api_client: BaseApi,
991
+ ) -> Optional[Cluster]:
992
+ """If run within a workspace, returns the `Cluster` info for that workspace.
993
+
994
+ Else, returns `None`.
995
+ """
996
+ session_id = os.environ.get("ANYSCALE_SESSION_ID")
997
+ if not session_id or not is_anyscale_workspace():
998
+ return None
999
+
1000
+ return anyscale_api_client.get_cluster(session_id).result
1001
+
1002
+
1003
+ def populate_unspecified_cluster_configs(
1004
+ config: Dict[str, Any], workspace_cluster: Cluster, *, populate_name: bool = False
1005
+ ):
1006
+ """Populates unspecified fields in the config from a workspace cluster model.
1007
+
1008
+ This is used to fill in smart defaults when deploying from a workspace.
1009
+
1010
+ Fields that are defaulted:
1011
+ - `project_id` if it is not specified.
1012
+ - `build_id` if none of {`build_id, `cluster_env`} are specified.
1013
+ - `compute_config_id` if none of {`cloud`, `compute_config`, `compute_config_id`} are specified.
1014
+ - `name` if `populate_name` is passed and it is not specified.
1015
+
1016
+ The defaulted name will be the name of the wor
1017
+ """
1018
+ if "project_id" not in config and "project" not in config:
1019
+ config["project_id"] = workspace_cluster.project_id
1020
+
1021
+ if "build_id" not in config and "cluster_env" not in config:
1022
+ config["build_id"] = workspace_cluster.cluster_environment_build_id
1023
+
1024
+ if (
1025
+ "compute_config" not in config
1026
+ and "compute_config_id" not in config
1027
+ and "cloud" not in config
1028
+ ):
1029
+ config["compute_config_id"] = workspace_cluster.cluster_compute_id
1030
+
1031
+ if populate_name and "name" not in config:
1032
+ name = workspace_cluster.name
1033
+ # All workspace cluster names should start with this prefix.
1034
+ # Defensively default to the name as-is if they don't.
1035
+ if name.startswith("workspace-cluster-"):
1036
+ name = name[len("workspace-cluster-") :]
1037
+
1038
+ config["name"] = name
1039
+
1040
+ return config
1041
+
1042
+
1043
+ def populate_unspecified_cluster_configs_from_current_workspace(
1044
+ config: Dict[str, Any], anyscale_api_client: BaseApi, *, populate_name: bool = False
1045
+ ) -> Dict[str, Any]:
1046
+ workspace_cluster = get_cluster_model_for_current_workspace(anyscale_api_client)
1047
+ if workspace_cluster is not None:
1048
+ config = populate_unspecified_cluster_configs(
1049
+ config, workspace_cluster, populate_name=populate_name
1050
+ )
1051
+
1052
+ return config
1053
+
1054
+
1055
+ def filter_actions_from_policy_document(
1056
+ policy_document: Dict[Any, Any],
1057
+ action_filter: Optional[Callable[[Dict], bool]] = None,
1058
+ ) -> set:
1059
+ if action_filter is None:
1060
+ action_filter = lambda statement: statement["Effect"] == "Allow" # noqa: E731
1061
+ return {
1062
+ action
1063
+ for statement in _coerce_to_list(policy_document.get("Statement", {}))
1064
+ for action in _coerce_to_list(statement.get("Action"))
1065
+ if action_filter(statement)
1066
+ }
1067
+
1068
+
1069
+ def filter_actions_associated_with_role(
1070
+ boto3_session: boto3.Session,
1071
+ role: Boto3Resource,
1072
+ action_filter: Optional[Callable[[Dict], bool]] = None,
1073
+ ) -> Set[str]:
1074
+ iam = boto3_session.resource("iam")
1075
+ attached_policy_documents = [
1076
+ iam.PolicyVersion(policy.arn, policy.default_version_id).document
1077
+ for policy in role.attached_policies.all() # type: ignore
1078
+ ]
1079
+
1080
+ role_policy_documents = [policy.policy_document for policy in role.policies.all()] # type: ignore
1081
+
1082
+ list_of_allow_actions_sets = [
1083
+ filter_actions_from_policy_document(policy_document, action_filter)
1084
+ for policy_document in role_policy_documents + attached_policy_documents
1085
+ ]
1086
+ return (
1087
+ set.union(*list_of_allow_actions_sets) if list_of_allow_actions_sets else set()
1088
+ )
1089
+
1090
+
1091
+ def contains_control_plane_role(
1092
+ assume_role_policy_document: Dict[str, Any], anyscale_aws_account: str
1093
+ ) -> bool:
1094
+ def action_filter(statement: dict):
1095
+ if not statement:
1096
+ return False
1097
+ # Ensure it is `Allow` & `sts:AssumeRole`
1098
+ if (
1099
+ statement["Effect"] != "Allow"
1100
+ or statement.get("Action") != "sts:AssumeRole"
1101
+ ):
1102
+ return False
1103
+
1104
+ expected_accounts = {
1105
+ f"arn:aws:iam::{anyscale_aws_account}:root",
1106
+ anyscale_aws_account,
1107
+ }
1108
+ return any(
1109
+ aws_principal in expected_accounts
1110
+ for aws_principal in _coerce_to_list(statement["Principal"].get("AWS"))
1111
+ )
1112
+
1113
+ return (
1114
+ len(
1115
+ filter_actions_from_policy_document(
1116
+ assume_role_policy_document, action_filter
1117
+ )
1118
+ )
1119
+ > 0
1120
+ )
1121
+
1122
+
1123
+ def verify_data_plane_role_assume_role_policy(
1124
+ assume_role_policy_document: Dict[str, Any]
1125
+ ) -> bool:
1126
+ def action_filter(statement: dict):
1127
+ # Ensure it is `Allow` & `sts:AssumeRole`
1128
+ if not statement:
1129
+ return False
1130
+ if (
1131
+ statement["Effect"] != "Allow"
1132
+ or statement.get("Action") != "sts:AssumeRole"
1133
+ ):
1134
+ return False
1135
+
1136
+ return any(
1137
+ service == "ec2.amazonaws.com"
1138
+ for service in _coerce_to_list(statement["Principal"].get("Service"))
1139
+ )
1140
+
1141
+ return (
1142
+ len(
1143
+ filter_actions_from_policy_document(
1144
+ assume_role_policy_document, action_filter
1145
+ )
1146
+ )
1147
+ > 0
1148
+ )
1149
+
1150
+
1151
+ T = TypeVar("T")
1152
+
1153
+
1154
+ def _coerce_to_list(maybe_list: Union[T, List[T]]) -> List[T]:
1155
+ return maybe_list if isinstance(maybe_list, list) else [maybe_list]