render 1.0.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- render/__init__.py +98 -0
- render/client/__init__.py +119 -0
- render/client/client.py +110 -0
- render/client/errors.py +39 -0
- render/client/sse.py +90 -0
- render/client/sse_sync.py +20 -0
- render/client/tests/__init__.py +0 -0
- render/client/tests/test_client.py +379 -0
- render/client/tests/test_method_parity.py +118 -0
- render/client/tests/test_render.py +52 -0
- render/client/tests/test_sse.py +67 -0
- render/client/tests/test_util.py +303 -0
- render/client/tests/test_util_sync.py +73 -0
- render/client/tests/test_workflows_sync.py +313 -0
- render/client/types.py +52 -0
- render/client/util.py +285 -0
- render/client/util_sync.py +83 -0
- render/client/workflows.py +363 -0
- render/client/workflows_sync.py +298 -0
- render/experimental/__init__.py +37 -0
- render/experimental/experimental.py +93 -0
- render/experimental/experimental_sync.py +78 -0
- render/experimental/key_value/__init__.py +33 -0
- render/experimental/key_value/api.py +243 -0
- render/experimental/key_value/compare.py +83 -0
- render/experimental/key_value/provider.py +285 -0
- render/experimental/key_value/tests/__init__.py +0 -0
- render/experimental/key_value/tests/test_api.py +371 -0
- render/experimental/key_value/tests/test_compare.py +136 -0
- render/experimental/key_value/tests/test_provider.py +1016 -0
- render/experimental/key_value/types.py +130 -0
- render/experimental/key_value/utils.py +11 -0
- render/experimental/object/__init__.py +38 -0
- render/experimental/object/api.py +250 -0
- render/experimental/object/api_sync.py +250 -0
- render/experimental/object/client.py +545 -0
- render/experimental/object/client_sync.py +547 -0
- render/experimental/object/e2e_helpers.py +78 -0
- render/experimental/object/tests/__init__.py +0 -0
- render/experimental/object/tests/test_client.py +228 -0
- render/experimental/object/tests/test_e2e.py +125 -0
- render/experimental/object/types.py +87 -0
- render/experimental/sandbox/__init__.py +31 -0
- render/experimental/sandbox/_tar.py +278 -0
- render/experimental/sandbox/api.py +518 -0
- render/experimental/sandbox/api_sync.py +514 -0
- render/experimental/sandbox/client.py +168 -0
- render/experimental/sandbox/client_sync.py +170 -0
- render/experimental/sandbox/errors.py +37 -0
- render/experimental/sandbox/files.py +378 -0
- render/experimental/sandbox/tests/__init__.py +0 -0
- render/experimental/sandbox/tests/test_client.py +802 -0
- render/experimental/sandbox/tests/test_download.py +728 -0
- render/experimental/sandbox/tests/test_e2e.py +252 -0
- render/experimental/sandbox/tests/test_tar.py +153 -0
- render/experimental/sandbox/tests/test_types.py +57 -0
- render/experimental/sandbox/types.py +46 -0
- render/public_api/__init__.py +8 -0
- render/public_api/api/__init__.py +1 -0
- render/public_api/api/artifact_sources/__init__.py +1 -0
- render/public_api/api/artifact_sources/add_or_update_artifact_source_secret_file.py +252 -0
- render/public_api/api/artifact_sources/create_artifact_source.py +243 -0
- render/public_api/api/artifact_sources/delete_artifact_source.py +188 -0
- render/public_api/api/artifact_sources/delete_artifact_source_env_var.py +223 -0
- render/public_api/api/artifact_sources/delete_artifact_source_secret_file.py +223 -0
- render/public_api/api/artifact_sources/get_artifact_source.py +185 -0
- render/public_api/api/artifact_sources/get_env_vars_for_artifact_source.py +241 -0
- render/public_api/api/artifact_sources/link_artifact_source_to_env_group.py +215 -0
- render/public_api/api/artifact_sources/list_artifact_sources.py +338 -0
- render/public_api/api/artifact_sources/list_artifacts_in_artifact_source.py +241 -0
- render/public_api/api/artifact_sources/list_secret_files_for_artifact_source.py +241 -0
- render/public_api/api/artifact_sources/retrieve_artifact_source_env_var.py +225 -0
- render/public_api/api/artifact_sources/retrieve_artifact_source_secret_file.py +225 -0
- render/public_api/api/artifact_sources/unlink_artifact_source_from_env_group.py +209 -0
- render/public_api/api/artifact_sources/update_artifact_source.py +244 -0
- render/public_api/api/artifact_sources/update_artifact_source_env_var.py +257 -0
- render/public_api/api/artifact_sources/update_env_vars_for_artifact_source.py +245 -0
- render/public_api/api/artifact_sources/update_secret_files_for_artifact_source.py +255 -0
- render/public_api/api/audit_logs/__init__.py +1 -0
- render/public_api/api/audit_logs/list_organization_audit_logs.py +303 -0
- render/public_api/api/audit_logs/list_owner_audit_logs.py +303 -0
- render/public_api/api/blueprints/__init__.py +1 -0
- render/public_api/api/blueprints/disconnect_blueprint.py +210 -0
- render/public_api/api/blueprints/list_blueprint_syncs.py +241 -0
- render/public_api/api/blueprints/list_blueprints.py +251 -0
- render/public_api/api/blueprints/retrieve_blueprint.py +200 -0
- render/public_api/api/blueprints/update_blueprint.py +222 -0
- render/public_api/api/blueprints/validate_blueprint.py +217 -0
- render/public_api/api/custom_domains/__init__.py +1 -0
- render/public_api/api/custom_domains/create_custom_domain.py +242 -0
- render/public_api/api/custom_domains/delete_custom_domain.py +216 -0
- render/public_api/api/custom_domains/list_custom_domains.py +346 -0
- render/public_api/api/custom_domains/refresh_custom_domain.py +216 -0
- render/public_api/api/custom_domains/retrieve_custom_domain.py +218 -0
- render/public_api/api/dedicated_i_ps/__init__.py +1 -0
- render/public_api/api/dedicated_i_ps/create_dedicated_ip.py +234 -0
- render/public_api/api/dedicated_i_ps/delete_dedicated_ip.py +198 -0
- render/public_api/api/dedicated_i_ps/list_dedicated_ips.py +223 -0
- render/public_api/api/dedicated_i_ps/retrieve_dedicated_ip.py +200 -0
- render/public_api/api/dedicated_i_ps/update_dedicated_ip.py +244 -0
- render/public_api/api/deploys/__init__.py +1 -0
- render/public_api/api/deploys/cancel_deploy.py +216 -0
- render/public_api/api/deploys/create_deploy.py +231 -0
- render/public_api/api/deploys/list_deploys.py +377 -0
- render/public_api/api/deploys/retrieve_deploy.py +213 -0
- render/public_api/api/deploys/rollback_deploy.py +241 -0
- render/public_api/api/disks/__init__.py +1 -0
- render/public_api/api/disks/add_disk.py +222 -0
- render/public_api/api/disks/delete_disk.py +210 -0
- render/public_api/api/disks/list_disks.py +381 -0
- render/public_api/api/disks/list_snapshots.py +214 -0
- render/public_api/api/disks/restore_snapshot.py +255 -0
- render/public_api/api/disks/retrieve_disk.py +200 -0
- render/public_api/api/disks/update_disk.py +243 -0
- render/public_api/api/environment_groups/__init__.py +1 -0
- render/public_api/api/environment_groups/create_env_group.py +199 -0
- render/public_api/api/environment_groups/delete_env_group.py +192 -0
- render/public_api/api/environment_groups/delete_env_group_env_var.py +201 -0
- render/public_api/api/environment_groups/delete_env_group_secret_file.py +201 -0
- render/public_api/api/environment_groups/link_service_to_env_group.py +211 -0
- render/public_api/api/environment_groups/list_env_groups.py +352 -0
- render/public_api/api/environment_groups/retrieve_env_group.py +190 -0
- render/public_api/api/environment_groups/retrieve_env_group_env_var.py +203 -0
- render/public_api/api/environment_groups/retrieve_env_group_secret_file.py +203 -0
- render/public_api/api/environment_groups/unlink_service_from_env_group.py +209 -0
- render/public_api/api/environment_groups/update_env_group.py +212 -0
- render/public_api/api/environment_groups/update_env_group_env_var.py +230 -0
- render/public_api/api/environment_groups/update_env_group_secret_file.py +225 -0
- render/public_api/api/events/__init__.py +1 -0
- render/public_api/api/events/retrieve_event.py +205 -0
- render/public_api/api/key_value/__init__.py +1 -0
- render/public_api/api/key_value/create_key_value.py +199 -0
- render/public_api/api/key_value/delete_key_value.py +188 -0
- render/public_api/api/key_value/list_key_value.py +380 -0
- render/public_api/api/key_value/resume_key_value.py +203 -0
- render/public_api/api/key_value/retrieve_key_value.py +190 -0
- render/public_api/api/key_value/retrieve_key_value_connection_info.py +194 -0
- render/public_api/api/key_value/suspend_key_value.py +203 -0
- render/public_api/api/key_value/update_key_value.py +221 -0
- render/public_api/api/logs/__init__.py +1 -0
- render/public_api/api/logs/delete_owner_log_stream.py +188 -0
- render/public_api/api/logs/delete_resource_log_stream.py +192 -0
- render/public_api/api/logs/get_owner_log_stream.py +205 -0
- render/public_api/api/logs/get_resource_log_stream.py +209 -0
- render/public_api/api/logs/list_logs.py +535 -0
- render/public_api/api/logs/list_logs_values.py +527 -0
- render/public_api/api/logs/list_resource_log_streams.py +317 -0
- render/public_api/api/logs/subscribe_logs.py +527 -0
- render/public_api/api/logs/update_owner_log_stream.py +231 -0
- render/public_api/api/logs/update_resource_log_stream.py +231 -0
- render/public_api/api/maintenance/__init__.py +1 -0
- render/public_api/api/maintenance/list_maintenance.py +249 -0
- render/public_api/api/maintenance/retrieve_maintenance.py +190 -0
- render/public_api/api/maintenance/trigger_maintenance.py +212 -0
- render/public_api/api/maintenance/update_maintenance.py +222 -0
- render/public_api/api/metrics/__init__.py +1 -0
- render/public_api/api/metrics/delete_owner_metrics_stream.py +172 -0
- render/public_api/api/metrics/get_active_connections.py +237 -0
- render/public_api/api/metrics/get_bandwidth.py +237 -0
- render/public_api/api/metrics/get_bandwidth_sources.py +250 -0
- render/public_api/api/metrics/get_cpu.py +287 -0
- render/public_api/api/metrics/get_cpu_limit.py +267 -0
- render/public_api/api/metrics/get_cpu_target.py +267 -0
- render/public_api/api/metrics/get_disk_capacity.py +252 -0
- render/public_api/api/metrics/get_disk_usage.py +252 -0
- render/public_api/api/metrics/get_http_latency.py +297 -0
- render/public_api/api/metrics/get_http_requests.py +302 -0
- render/public_api/api/metrics/get_instance_count.py +252 -0
- render/public_api/api/metrics/get_memory.py +267 -0
- render/public_api/api/metrics/get_memory_limit.py +267 -0
- render/public_api/api/metrics/get_memory_target.py +267 -0
- render/public_api/api/metrics/get_owner_metrics_stream.py +174 -0
- render/public_api/api/metrics/get_replication_lag.py +237 -0
- render/public_api/api/metrics/get_task_runs_completed.py +281 -0
- render/public_api/api/metrics/get_task_runs_queued.py +237 -0
- render/public_api/api/metrics/list_application_filter_values.py +254 -0
- render/public_api/api/metrics/list_http_filter_values.py +282 -0
- render/public_api/api/metrics/list_path_filter_values.py +289 -0
- render/public_api/api/metrics/upsert_owner_metrics_stream.py +192 -0
- render/public_api/api/notification_settings/__init__.py +1 -0
- render/public_api/api/notification_settings/list_notification_overrides.py +255 -0
- render/public_api/api/notification_settings/patch_owner_notification_settings.py +207 -0
- render/public_api/api/notification_settings/patch_service_notification_overrides.py +207 -0
- render/public_api/api/notification_settings/retrieve_owner_notification_settings.py +193 -0
- render/public_api/api/notification_settings/retrieve_service_notification_overrides.py +193 -0
- render/public_api/api/object_storage/__init__.py +1 -0
- render/public_api/api/object_storage/delete_object.py +215 -0
- render/public_api/api/object_storage/get_object.py +221 -0
- render/public_api/api/object_storage/list_objects.py +240 -0
- render/public_api/api/object_storage/put_object.py +248 -0
- render/public_api/api/one_off_jobs/__init__.py +1 -0
- render/public_api/api/one_off_jobs/cancel_job.py +203 -0
- render/public_api/api/one_off_jobs/list_job.py +367 -0
- render/public_api/api/one_off_jobs/post_job.py +216 -0
- render/public_api/api/one_off_jobs/retrieve_job.py +203 -0
- render/public_api/api/postgres/__init__.py +1 -0
- render/public_api/api/postgres/create_postgres.py +199 -0
- render/public_api/api/postgres/create_postgres_export.py +207 -0
- render/public_api/api/postgres/create_postgres_user.py +229 -0
- render/public_api/api/postgres/delete_postgres.py +192 -0
- render/public_api/api/postgres/delete_postgres_user.py +201 -0
- render/public_api/api/postgres/failover_postgres.py +207 -0
- render/public_api/api/postgres/list_available_postgres_parameter_overrides.py +190 -0
- render/public_api/api/postgres/list_postgres.py +418 -0
- render/public_api/api/postgres/list_postgres_export.py +199 -0
- render/public_api/api/postgres/list_postgres_parameter_overrides.py +190 -0
- render/public_api/api/postgres/list_postgres_processes.py +190 -0
- render/public_api/api/postgres/list_postgres_sizes.py +190 -0
- render/public_api/api/postgres/list_postgres_table_scans.py +190 -0
- render/public_api/api/postgres/list_postgres_top_queries.py +194 -0
- render/public_api/api/postgres/list_postgres_users.py +195 -0
- render/public_api/api/postgres/promote_postgres.py +203 -0
- render/public_api/api/postgres/recover_postgres.py +231 -0
- render/public_api/api/postgres/restart_postgres.py +203 -0
- render/public_api/api/postgres/resume_postgres.py +203 -0
- render/public_api/api/postgres/retrieve_postgres.py +190 -0
- render/public_api/api/postgres/retrieve_postgres_connection_info.py +194 -0
- render/public_api/api/postgres/retrieve_postgres_recovery_info.py +194 -0
- render/public_api/api/postgres/setup_postgres_replication.py +231 -0
- render/public_api/api/postgres/suspend_postgres.py +203 -0
- render/public_api/api/postgres/update_postgres.py +217 -0
- render/public_api/api/postgres/update_postgres_parameter_overrides.py +217 -0
- render/public_api/api/projects_environments/__init__.py +1 -0
- render/public_api/api/projects_environments/add_resources_to_environment.py +212 -0
- render/public_api/api/projects_environments/create_environment.py +199 -0
- render/public_api/api/projects_environments/create_project.py +199 -0
- render/public_api/api/projects_environments/delete_environment.py +216 -0
- render/public_api/api/projects_environments/delete_project.py +216 -0
- render/public_api/api/projects_environments/list_environments.py +369 -0
- render/public_api/api/projects_environments/list_projects.py +329 -0
- render/public_api/api/projects_environments/remove_resources_from_environment.py +211 -0
- render/public_api/api/projects_environments/retrieve_environment.py +190 -0
- render/public_api/api/projects_environments/retrieve_project.py +190 -0
- render/public_api/api/projects_environments/update_environment.py +212 -0
- render/public_api/api/projects_environments/update_project.py +224 -0
- render/public_api/api/redis_deprecated/__init__.py +1 -0
- render/public_api/api/redis_deprecated/create_redis.py +199 -0
- render/public_api/api/redis_deprecated/delete_redis.py +188 -0
- render/public_api/api/redis_deprecated/list_redis.py +384 -0
- render/public_api/api/redis_deprecated/resume_redis.py +203 -0
- render/public_api/api/redis_deprecated/retrieve_redis.py +190 -0
- render/public_api/api/redis_deprecated/retrieve_redis_connection_info.py +194 -0
- render/public_api/api/redis_deprecated/suspend_redis.py +203 -0
- render/public_api/api/redis_deprecated/update_redis.py +217 -0
- render/public_api/api/registry_credentials/__init__.py +1 -0
- render/public_api/api/registry_credentials/create_registry_credential.py +209 -0
- render/public_api/api/registry_credentials/delete_registry_credential.py +198 -0
- render/public_api/api/registry_credentials/list_registry_credentials.py +370 -0
- render/public_api/api/registry_credentials/retrieve_registry_credential.py +200 -0
- render/public_api/api/registry_credentials/update_registry_credential.py +241 -0
- render/public_api/api/sandboxes/__init__.py +1 -0
- render/public_api/api/sandboxes/connect_sandbox_files.py +281 -0
- render/public_api/api/sandboxes/connect_sandbox_run.py +271 -0
- render/public_api/api/sandboxes/create_sandbox.py +199 -0
- render/public_api/api/sandboxes/list_sandbox_files.py +244 -0
- render/public_api/api/sandboxes/list_sandbox_groups.py +216 -0
- render/public_api/api/sandboxes/list_sandboxes.py +269 -0
- render/public_api/api/sandboxes/retrieve_sandbox.py +211 -0
- render/public_api/api/sandboxes/retrieve_sandbox_execution.py +224 -0
- render/public_api/api/sandboxes/stream_sandbox_logs.py +274 -0
- render/public_api/api/sandboxes/terminate_sandbox.py +217 -0
- render/public_api/api/sandboxes/update_sandbox_exec.py +258 -0
- render/public_api/api/services/__init__.py +1 -0
- render/public_api/api/services/add_or_update_secret_file.py +252 -0
- render/public_api/api/services/autoscale_service.py +230 -0
- render/public_api/api/services/create_ephemeral_shell.py +217 -0
- render/public_api/api/services/create_service.py +204 -0
- render/public_api/api/services/delete_autoscaling_config.py +198 -0
- render/public_api/api/services/delete_env_var.py +223 -0
- render/public_api/api/services/delete_secret_file.py +223 -0
- render/public_api/api/services/delete_service.py +198 -0
- render/public_api/api/services/get_env_vars_for_service.py +241 -0
- render/public_api/api/services/list_events.py +288 -0
- render/public_api/api/services/list_instances.py +190 -0
- render/public_api/api/services/list_secret_files_for_service.py +241 -0
- render/public_api/api/services/list_services.py +439 -0
- render/public_api/api/services/preview_service.py +227 -0
- render/public_api/api/services/purge_cache.py +203 -0
- render/public_api/api/services/restart_service.py +211 -0
- render/public_api/api/services/resume_service.py +203 -0
- render/public_api/api/services/retrieve_env_var.py +225 -0
- render/public_api/api/services/retrieve_secret_file.py +225 -0
- render/public_api/api/services/retrieve_service.py +190 -0
- render/public_api/api/services/retrieve_service_outbound_ips.py +207 -0
- render/public_api/api/services/scale_service.py +237 -0
- render/public_api/api/services/suspend_service.py +203 -0
- render/public_api/api/services/update_env_var.py +257 -0
- render/public_api/api/services/update_env_vars_for_service.py +241 -0
- render/public_api/api/services/update_secret_files_for_service.py +255 -0
- render/public_api/api/services/update_service.py +227 -0
- render/public_api/api/services_cron_jobs/__init__.py +1 -0
- render/public_api/api/services_cron_jobs/cancel_cron_job_run.py +183 -0
- render/public_api/api/services_cron_jobs/run_cron_job.py +185 -0
- render/public_api/api/services_headers/__init__.py +1 -0
- render/public_api/api/services_headers/add_headers.py +222 -0
- render/public_api/api/services_headers/delete_header.py +211 -0
- render/public_api/api/services_headers/list_headers.py +302 -0
- render/public_api/api/services_headers/update_headers.py +243 -0
- render/public_api/api/services_routes/__init__.py +1 -0
- render/public_api/api/services_routes/add_route.py +227 -0
- render/public_api/api/services_routes/delete_route.py +211 -0
- render/public_api/api/services_routes/list_routes.py +306 -0
- render/public_api/api/services_routes/patch_route.py +259 -0
- render/public_api/api/services_routes/put_routes.py +259 -0
- render/public_api/api/users/__init__.py +1 -0
- render/public_api/api/users/get_user.py +161 -0
- render/public_api/api/webhooks/__init__.py +1 -0
- render/public_api/api/webhooks/create_webhook.py +199 -0
- render/public_api/api/webhooks/delete_webhook.py +183 -0
- render/public_api/api/webhooks/list_webhook_events.py +268 -0
- render/public_api/api/webhooks/list_webhooks.py +237 -0
- render/public_api/api/webhooks/retrieve_webhook.py +185 -0
- render/public_api/api/webhooks/update_webhook.py +212 -0
- render/public_api/api/workflow_tasks_beta/__init__.py +1 -0
- render/public_api/api/workflow_tasks_beta/cancel_task_run.py +188 -0
- render/public_api/api/workflow_tasks_beta/create_task.py +204 -0
- render/public_api/api/workflow_tasks_beta/get_task.py +190 -0
- render/public_api/api/workflow_tasks_beta/get_task_run.py +190 -0
- render/public_api/api/workflow_tasks_beta/list_task_runs.py +317 -0
- render/public_api/api/workflow_tasks_beta/list_tasks.py +298 -0
- render/public_api/api/workflow_tasks_beta/stream_task_runs_events.py +230 -0
- render/public_api/api/workflows_beta/__init__.py +1 -0
- render/public_api/api/workflows_beta/create_workflow.py +199 -0
- render/public_api/api/workflows_beta/create_workflow_version.py +197 -0
- render/public_api/api/workflows_beta/delete_workflow.py +188 -0
- render/public_api/api/workflows_beta/get_workflow.py +190 -0
- render/public_api/api/workflows_beta/get_workflow_version.py +190 -0
- render/public_api/api/workflows_beta/list_workflow_versions.py +275 -0
- render/public_api/api/workflows_beta/list_workflows.py +298 -0
- render/public_api/api/workflows_beta/update_workflow.py +212 -0
- render/public_api/api/workspaces/__init__.py +1 -0
- render/public_api/api/workspaces/list_owners.py +255 -0
- render/public_api/api/workspaces/remove_workspace_member.py +206 -0
- render/public_api/api/workspaces/retrieve_owner.py +207 -0
- render/public_api/api/workspaces/retrieve_owner_members.py +200 -0
- render/public_api/api/workspaces/update_workspace_member.py +235 -0
- render/public_api/client.py +268 -0
- render/public_api/errors.py +16 -0
- render/public_api/models/__init__.py +861 -0
- render/public_api/models/add_headers_response_201.py +72 -0
- render/public_api/models/add_or_update_artifact_source_secret_file_body.py +59 -0
- render/public_api/models/add_or_update_secret_file_body.py +59 -0
- render/public_api/models/artifact.py +145 -0
- render/public_api/models/artifact_fetch_failed.py +67 -0
- render/public_api/models/artifact_source.py +162 -0
- render/public_api/models/artifact_source_changed.py +70 -0
- render/public_api/models/artifact_source_git.py +167 -0
- render/public_api/models/artifact_source_git_region.py +12 -0
- render/public_api/models/artifact_source_git_runtime.py +14 -0
- render/public_api/models/artifact_source_image.py +78 -0
- render/public_api/models/artifact_source_patch_git.py +175 -0
- render/public_api/models/artifact_source_patch_git_region.py +12 -0
- render/public_api/models/artifact_source_patch_git_runtime.py +14 -0
- render/public_api/models/artifact_source_patch_image.py +71 -0
- render/public_api/models/artifact_source_patch_input.py +101 -0
- render/public_api/models/artifact_source_post_input.py +213 -0
- render/public_api/models/artifact_source_service_link.py +67 -0
- render/public_api/models/artifact_source_with_cursor.py +73 -0
- render/public_api/models/audit_log.py +113 -0
- render/public_api/models/audit_log_actor.py +80 -0
- render/public_api/models/audit_log_actor_type.py +10 -0
- render/public_api/models/audit_log_event.py +87 -0
- render/public_api/models/audit_log_metadata.py +49 -0
- render/public_api/models/audit_log_status.py +9 -0
- render/public_api/models/audit_log_with_cursor.py +73 -0
- render/public_api/models/auto_deploy.py +9 -0
- render/public_api/models/auto_deploy_disabled.py +79 -0
- render/public_api/models/auto_deploy_enabled.py +68 -0
- render/public_api/models/auto_deploy_trigger.py +10 -0
- render/public_api/models/autoscaling_config.py +89 -0
- render/public_api/models/autoscaling_config_changed.py +83 -0
- render/public_api/models/autoscaling_criteria.py +73 -0
- render/public_api/models/autoscaling_criteria_percentage.py +68 -0
- render/public_api/models/autoscaling_ended.py +67 -0
- render/public_api/models/autoscaling_started.py +105 -0
- render/public_api/models/background_worker_details.py +256 -0
- render/public_api/models/background_worker_details_patch.py +184 -0
- render/public_api/models/background_worker_details_post.py +266 -0
- render/public_api/models/blueprint.py +128 -0
- render/public_api/models/blueprint_detail.py +150 -0
- render/public_api/models/blueprint_patch.py +77 -0
- render/public_api/models/blueprint_with_cursor.py +74 -0
- render/public_api/models/branch_deleted.py +67 -0
- render/public_api/models/build.py +148 -0
- render/public_api/models/build_config.py +96 -0
- render/public_api/models/build_deploy_end_reason.py +122 -0
- render/public_api/models/build_deploy_end_reason_id.py +59 -0
- render/public_api/models/build_deploy_trigger.py +150 -0
- render/public_api/models/build_ended.py +91 -0
- render/public_api/models/build_filter.py +67 -0
- render/public_api/models/build_plan.py +9 -0
- render/public_api/models/build_runtime.py +14 -0
- render/public_api/models/build_started.py +73 -0
- render/public_api/models/build_status.py +13 -0
- render/public_api/models/cache.py +61 -0
- render/public_api/models/cache_profile.py +10 -0
- render/public_api/models/cidr_block_and_description.py +67 -0
- render/public_api/models/commit_ignored.py +67 -0
- render/public_api/models/commit_ref.py +59 -0
- render/public_api/models/connect_sandbox_files_operation.py +9 -0
- render/public_api/models/connect_sandbox_run_operation.py +9 -0
- render/public_api/models/create_custom_domain_body.py +59 -0
- render/public_api/models/create_deploy_body.py +130 -0
- render/public_api/models/create_deploy_body_clear_cache.py +9 -0
- render/public_api/models/create_ephemeral_shell_body.py +69 -0
- render/public_api/models/create_ephemeral_shell_response_201.py +59 -0
- render/public_api/models/create_registry_credential_body.py +93 -0
- render/public_api/models/create_version.py +70 -0
- render/public_api/models/credential_create_input.py +59 -0
- render/public_api/models/cron_job_details.py +163 -0
- render/public_api/models/cron_job_details_patch.py +138 -0
- render/public_api/models/cron_job_details_post.py +172 -0
- render/public_api/models/cron_job_run.py +123 -0
- render/public_api/models/cron_job_run_ended.py +110 -0
- render/public_api/models/cron_job_run_started.py +59 -0
- render/public_api/models/cron_job_run_status.py +11 -0
- render/public_api/models/custom_domain.py +135 -0
- render/public_api/models/custom_domain_domain_type.py +9 -0
- render/public_api/models/custom_domain_server.py +68 -0
- render/public_api/models/custom_domain_verification_status.py +9 -0
- render/public_api/models/custom_domain_with_cursor.py +73 -0
- render/public_api/models/database_role.py +9 -0
- render/public_api/models/database_status.py +18 -0
- render/public_api/models/dedicated_ip.py +146 -0
- render/public_api/models/dedicated_ip_status.py +14 -0
- render/public_api/models/dedicated_ippatch.py +81 -0
- render/public_api/models/dedicated_ippost.py +100 -0
- render/public_api/models/deploy.py +211 -0
- render/public_api/models/deploy_commit.py +86 -0
- render/public_api/models/deploy_ended.py +102 -0
- render/public_api/models/deploy_image.py +78 -0
- render/public_api/models/deploy_mode.py +9 -0
- render/public_api/models/deploy_started.py +85 -0
- render/public_api/models/deploy_status.py +18 -0
- render/public_api/models/deploy_trigger.py +17 -0
- render/public_api/models/deploy_with_cursor.py +81 -0
- render/public_api/models/disk.py +83 -0
- render/public_api/models/disk_created.py +67 -0
- render/public_api/models/disk_deleted.py +59 -0
- render/public_api/models/disk_details.py +112 -0
- render/public_api/models/disk_patch.py +77 -0
- render/public_api/models/disk_post.py +83 -0
- render/public_api/models/disk_snapshot.py +88 -0
- render/public_api/models/disk_updated.py +75 -0
- render/public_api/models/disk_with_cursor.py +73 -0
- render/public_api/models/docker_details.py +108 -0
- render/public_api/models/docker_details_patch.py +86 -0
- render/public_api/models/docker_details_post.py +86 -0
- render/public_api/models/edge_cache_disabled.py +65 -0
- render/public_api/models/edge_cache_enabled.py +65 -0
- render/public_api/models/edge_cache_purged.py +65 -0
- render/public_api/models/edge_cache_trigger.py +91 -0
- render/public_api/models/env_group.py +162 -0
- render/public_api/models/env_group_link.py +77 -0
- render/public_api/models/env_group_meta.py +126 -0
- render/public_api/models/env_group_patch_input.py +59 -0
- render/public_api/models/env_group_post_input.py +161 -0
- render/public_api/models/env_var.py +67 -0
- render/public_api/models/env_var_generate_value.py +59 -0
- render/public_api/models/env_var_key_generate_value.py +68 -0
- render/public_api/models/env_var_key_value.py +67 -0
- render/public_api/models/env_var_value.py +59 -0
- render/public_api/models/env_var_with_cursor.py +73 -0
- render/public_api/models/environment.py +152 -0
- render/public_api/models/environment_patch_input.py +112 -0
- render/public_api/models/environment_post_input.py +122 -0
- render/public_api/models/environment_resources_post_input.py +59 -0
- render/public_api/models/environment_with_cursor.py +74 -0
- render/public_api/models/error.py +79 -0
- render/public_api/models/error_code.py +10 -0
- render/public_api/models/event.py +1122 -0
- render/public_api/models/event_status.py +10 -0
- render/public_api/models/event_type.py +74 -0
- render/public_api/models/execution.py +144 -0
- render/public_api/models/execution_operation.py +11 -0
- render/public_api/models/execution_type.py +9 -0
- render/public_api/models/failure_reason.py +138 -0
- render/public_api/models/filter_application_values_collection_item.py +78 -0
- render/public_api/models/filter_application_values_collection_item_filter.py +8 -0
- render/public_api/models/filter_http_values_collection_item.py +78 -0
- render/public_api/models/filter_http_values_collection_item_filter.py +9 -0
- render/public_api/models/get_bandwidth_sources_response_200.py +75 -0
- render/public_api/models/get_bandwidth_sources_response_200_data_item.py +101 -0
- render/public_api/models/get_bandwidth_sources_response_200_data_item_labels.py +78 -0
- render/public_api/models/get_bandwidth_sources_response_200_data_item_labels_traffic_source.py +12 -0
- render/public_api/models/get_bandwidth_sources_response_200_data_item_values_item.py +68 -0
- render/public_api/models/get_cpu_aggregation_method.py +10 -0
- render/public_api/models/get_http_requests_aggregate_by.py +9 -0
- render/public_api/models/get_object_output.py +71 -0
- render/public_api/models/get_task_runs_completed_aggregate_by.py +8 -0
- render/public_api/models/get_task_runs_completed_state.py +9 -0
- render/public_api/models/header.py +83 -0
- render/public_api/models/header_input.py +76 -0
- render/public_api/models/header_with_cursor.py +73 -0
- render/public_api/models/image.py +80 -0
- render/public_api/models/image_pull_failed.py +67 -0
- render/public_api/models/initial_deploy_hook_ended.py +59 -0
- render/public_api/models/initial_deploy_hook_started.py +59 -0
- render/public_api/models/instance_count_changed.py +67 -0
- render/public_api/models/instance_type_changed.py +67 -0
- render/public_api/models/internal_routing.py +8 -0
- render/public_api/models/job.py +144 -0
- render/public_api/models/job_run_ended.py +92 -0
- render/public_api/models/job_status.py +12 -0
- render/public_api/models/job_with_cursor.py +73 -0
- render/public_api/models/key_value.py +182 -0
- render/public_api/models/key_value_available.py +44 -0
- render/public_api/models/key_value_config_restart.py +67 -0
- render/public_api/models/key_value_connection_info.py +76 -0
- render/public_api/models/key_value_detail.py +192 -0
- render/public_api/models/key_value_options.py +79 -0
- render/public_api/models/key_value_patch_input.py +138 -0
- render/public_api/models/key_value_plan.py +13 -0
- render/public_api/models/key_value_post_input.py +166 -0
- render/public_api/models/key_value_unhealthy.py +44 -0
- render/public_api/models/key_value_with_cursor.py +73 -0
- render/public_api/models/label.py +68 -0
- render/public_api/models/list_custom_domains_domain_type.py +9 -0
- render/public_api/models/list_custom_domains_verification_status.py +9 -0
- render/public_api/models/list_logs_response_200.py +102 -0
- render/public_api/models/list_logs_values_label.py +13 -0
- render/public_api/models/list_objects_response.py +92 -0
- render/public_api/models/list_postgres_suspended_item.py +9 -0
- render/public_api/models/list_postgres_users_response_200_item.py +86 -0
- render/public_api/models/list_routes_type_item.py +9 -0
- render/public_api/models/list_services_suspended_item.py +9 -0
- render/public_api/models/log.py +100 -0
- render/public_api/models/log_direction.py +9 -0
- render/public_api/models/log_label.py +70 -0
- render/public_api/models/log_label_name.py +22 -0
- render/public_api/models/log_stream_owner_update.py +80 -0
- render/public_api/models/log_stream_preview_setting.py +9 -0
- render/public_api/models/log_stream_resource_update.py +80 -0
- render/public_api/models/log_stream_setting.py +9 -0
- render/public_api/models/maintenance_ended.py +44 -0
- render/public_api/models/maintenance_mode.py +68 -0
- render/public_api/models/maintenance_mode_enabled.py +59 -0
- render/public_api/models/maintenance_mode_uri_updated.py +67 -0
- render/public_api/models/maintenance_run.py +105 -0
- render/public_api/models/maintenance_run_patch.py +69 -0
- render/public_api/models/maintenance_run_with_resource.py +114 -0
- render/public_api/models/maintenance_started.py +65 -0
- render/public_api/models/maintenance_state.py +13 -0
- render/public_api/models/maintenance_trigger.py +91 -0
- render/public_api/models/maxmemory_policy.py +15 -0
- render/public_api/models/metrics_stream.py +77 -0
- render/public_api/models/metrics_stream_input.py +86 -0
- render/public_api/models/native_environment_details.py +78 -0
- render/public_api/models/native_environment_details_patch.py +68 -0
- render/public_api/models/native_environment_details_post.py +68 -0
- render/public_api/models/notification_override.py +78 -0
- render/public_api/models/notification_override_with_cursor.py +73 -0
- render/public_api/models/notification_service_override.py +78 -0
- render/public_api/models/notification_service_override_patch.py +84 -0
- render/public_api/models/notification_setting.py +93 -0
- render/public_api/models/notification_setting_patch.py +85 -0
- render/public_api/models/notify_override.py +11 -0
- render/public_api/models/notify_preview_override.py +10 -0
- render/public_api/models/notify_setting.py +10 -0
- render/public_api/models/notify_setting_v2.py +10 -0
- render/public_api/models/object_metadata.py +77 -0
- render/public_api/models/object_with_cursor.py +73 -0
- render/public_api/models/oom_killed.py +59 -0
- render/public_api/models/otel_provider_type.py +16 -0
- render/public_api/models/outbound_ips.py +81 -0
- render/public_api/models/outbound_ips_type.py +9 -0
- render/public_api/models/owner.py +121 -0
- render/public_api/models/owner_log_stream_setting.py +86 -0
- render/public_api/models/owner_type.py +9 -0
- render/public_api/models/owner_with_cursor.py +81 -0
- render/public_api/models/paid_plan.py +13 -0
- render/public_api/models/patch_route_response_200.py +72 -0
- render/public_api/models/persistence_mode.py +10 -0
- render/public_api/models/pipeline_minutes_exhausted.py +73 -0
- render/public_api/models/plan.py +22 -0
- render/public_api/models/post_job_body.py +70 -0
- render/public_api/models/postgres.py +300 -0
- render/public_api/models/postgres_available.py +44 -0
- render/public_api/models/postgres_available_parameter_override.py +106 -0
- render/public_api/models/postgres_available_parameter_overrides_result.py +75 -0
- render/public_api/models/postgres_backup_completed.py +44 -0
- render/public_api/models/postgres_backup_failed.py +44 -0
- render/public_api/models/postgres_backup_started.py +44 -0
- render/public_api/models/postgres_cluster_leader_changed.py +59 -0
- render/public_api/models/postgres_connection_info.py +103 -0
- render/public_api/models/postgres_connection_pool_changed.py +91 -0
- render/public_api/models/postgres_connection_pool_enabled_changed.py +83 -0
- render/public_api/models/postgres_created.py +72 -0
- render/public_api/models/postgres_detail.py +336 -0
- render/public_api/models/postgres_detail_suspended.py +9 -0
- render/public_api/models/postgres_disk_size_changed.py +91 -0
- render/public_api/models/postgres_export.py +80 -0
- render/public_api/models/postgres_ha_status_changed.py +67 -0
- render/public_api/models/postgres_parameter_overrides.py +44 -0
- render/public_api/models/postgres_parameter_overrides_wrapper.py +65 -0
- render/public_api/models/postgres_patch_input.py +199 -0
- render/public_api/models/postgres_pitr_checkpoint_completed.py +44 -0
- render/public_api/models/postgres_pitr_checkpoint_failed.py +44 -0
- render/public_api/models/postgres_pitr_checkpoint_started.py +44 -0
- render/public_api/models/postgres_plans.py +35 -0
- render/public_api/models/postgres_post_input.py +254 -0
- render/public_api/models/postgres_process.py +185 -0
- render/public_api/models/postgres_processes_result.py +73 -0
- render/public_api/models/postgres_put_parameter_overrides_result.py +82 -0
- render/public_api/models/postgres_query_statistic.py +222 -0
- render/public_api/models/postgres_read_replica_stale.py +44 -0
- render/public_api/models/postgres_read_replicas_changed.py +67 -0
- render/public_api/models/postgres_replication_setup_input.py +96 -0
- render/public_api/models/postgres_restarted.py +72 -0
- render/public_api/models/postgres_size.py +96 -0
- render/public_api/models/postgres_sizes_result.py +73 -0
- render/public_api/models/postgres_suspended.py +9 -0
- render/public_api/models/postgres_table_scan.py +87 -0
- render/public_api/models/postgres_table_scans_result.py +73 -0
- render/public_api/models/postgres_top_queries_result.py +73 -0
- render/public_api/models/postgres_unavailable.py +44 -0
- render/public_api/models/postgres_upgrade_failed.py +67 -0
- render/public_api/models/postgres_upgrade_started.py +91 -0
- render/public_api/models/postgres_upgrade_succeeded.py +67 -0
- render/public_api/models/postgres_version.py +15 -0
- render/public_api/models/postgres_with_cursor.py +73 -0
- render/public_api/models/pre_deploy_ended.py +99 -0
- render/public_api/models/pre_deploy_started.py +67 -0
- render/public_api/models/preview_input.py +94 -0
- render/public_api/models/previews.py +67 -0
- render/public_api/models/previews_generation.py +10 -0
- render/public_api/models/private_service_details.py +282 -0
- render/public_api/models/private_service_details_patch.py +184 -0
- render/public_api/models/private_service_details_post.py +266 -0
- render/public_api/models/project.py +108 -0
- render/public_api/models/project_patch_input.py +60 -0
- render/public_api/models/project_post_environment_input.py +114 -0
- render/public_api/models/project_post_input.py +89 -0
- render/public_api/models/project_with_cursor.py +73 -0
- render/public_api/models/protected_status.py +9 -0
- render/public_api/models/pull_request_previews_enabled.py +9 -0
- render/public_api/models/put_object_input.py +59 -0
- render/public_api/models/put_object_output.py +79 -0
- render/public_api/models/read_replica.py +91 -0
- render/public_api/models/read_replica_input.py +83 -0
- render/public_api/models/recovery_info.py +80 -0
- render/public_api/models/recovery_info_recovery_status.py +10 -0
- render/public_api/models/recovery_input.py +114 -0
- render/public_api/models/redis.py +182 -0
- render/public_api/models/redis_connection_info.py +76 -0
- render/public_api/models/redis_detail.py +192 -0
- render/public_api/models/redis_options.py +79 -0
- render/public_api/models/redis_patch_input.py +138 -0
- render/public_api/models/redis_plan.py +13 -0
- render/public_api/models/redis_post_input.py +166 -0
- render/public_api/models/redis_with_cursor.py +73 -0
- render/public_api/models/region.py +12 -0
- render/public_api/models/registry_credential.py +95 -0
- render/public_api/models/registry_credential_registry.py +12 -0
- render/public_api/models/registry_credential_summary.py +67 -0
- render/public_api/models/render_subdomain_policy.py +9 -0
- render/public_api/models/resource.py +67 -0
- render/public_api/models/resource_log_stream_setting.py +87 -0
- render/public_api/models/resource_ref.py +77 -0
- render/public_api/models/resource_ref_type.py +17 -0
- render/public_api/models/rollback_deploy_body.py +59 -0
- render/public_api/models/route.py +93 -0
- render/public_api/models/route_patch.py +60 -0
- render/public_api/models/route_post.py +88 -0
- render/public_api/models/route_put.py +77 -0
- render/public_api/models/route_type.py +9 -0
- render/public_api/models/route_with_cursor.py +73 -0
- render/public_api/models/run_task.py +96 -0
- render/public_api/models/runtime.py +12 -0
- render/public_api/models/sandbox.py +149 -0
- render/public_api/models/sandbox_connect_request.py +62 -0
- render/public_api/models/sandbox_connect_response.py +98 -0
- render/public_api/models/sandbox_directory_listing.py +82 -0
- render/public_api/models/sandbox_exec_update_request.py +60 -0
- render/public_api/models/sandbox_exec_update_response.py +130 -0
- render/public_api/models/sandbox_file_entry.py +98 -0
- render/public_api/models/sandbox_file_entry_type.py +10 -0
- render/public_api/models/sandbox_group.py +141 -0
- render/public_api/models/sandbox_group_with_cursor.py +74 -0
- render/public_api/models/sandbox_network_policy.py +61 -0
- render/public_api/models/sandbox_network_policy_default.py +9 -0
- render/public_api/models/sandbox_plan.py +10 -0
- render/public_api/models/sandbox_post.py +138 -0
- render/public_api/models/sandbox_post_env.py +44 -0
- render/public_api/models/sandbox_status.py +13 -0
- render/public_api/models/sandbox_with_cursor.py +74 -0
- render/public_api/models/scale_service_body.py +59 -0
- render/public_api/models/schemas_build_filter.py +70 -0
- render/public_api/models/schemas_image.py +96 -0
- render/public_api/models/schemas_user.py +68 -0
- render/public_api/models/secret_file.py +67 -0
- render/public_api/models/secret_file_input.py +67 -0
- render/public_api/models/secret_file_with_cursor.py +73 -0
- render/public_api/models/server_available.py +44 -0
- render/public_api/models/server_failed.py +81 -0
- render/public_api/models/server_hardware_failure.py +44 -0
- render/public_api/models/server_port.py +69 -0
- render/public_api/models/server_port_protocol.py +9 -0
- render/public_api/models/server_restarted.py +66 -0
- render/public_api/models/service_disk.py +78 -0
- render/public_api/models/service_env.py +15 -0
- render/public_api/models/service_event.py +770 -0
- render/public_api/models/service_event_type.py +48 -0
- render/public_api/models/service_event_with_cursor.py +66 -0
- render/public_api/models/service_instance.py +69 -0
- render/public_api/models/service_patch.py +273 -0
- render/public_api/models/service_post.py +357 -0
- render/public_api/models/service_resumed.py +44 -0
- render/public_api/models/service_runtime.py +15 -0
- render/public_api/models/service_suspended.py +44 -0
- render/public_api/models/service_type.py +12 -0
- render/public_api/models/service_type_short.py +12 -0
- render/public_api/models/setup_postgres_replication_response_201.py +44 -0
- render/public_api/models/snapshot_restore_post.py +72 -0
- render/public_api/models/static_site_details.py +183 -0
- render/public_api/models/static_site_details_patch.py +147 -0
- render/public_api/models/static_site_details_post.py +189 -0
- render/public_api/models/status.py +12 -0
- render/public_api/models/stream_sandbox_logs_accept.py +8 -0
- render/public_api/models/stream_task_runs_events_accept.py +8 -0
- render/public_api/models/suspender_added.py +83 -0
- render/public_api/models/suspender_removed.py +83 -0
- render/public_api/models/suspender_type.py +14 -0
- render/public_api/models/sync.py +118 -0
- render/public_api/models/sync_state.py +12 -0
- render/public_api/models/sync_with_cursor.py +74 -0
- render/public_api/models/task.py +97 -0
- render/public_api/models/task_attempt.py +121 -0
- render/public_api/models/task_attempt_details.py +141 -0
- render/public_api/models/task_data_type_1.py +44 -0
- render/public_api/models/task_run.py +168 -0
- render/public_api/models/task_run_details.py +216 -0
- render/public_api/models/task_run_status.py +14 -0
- render/public_api/models/task_run_with_cursor.py +73 -0
- render/public_api/models/task_with_cursor.py +73 -0
- render/public_api/models/team_member.py +102 -0
- render/public_api/models/team_member_role.py +12 -0
- render/public_api/models/team_member_status.py +9 -0
- render/public_api/models/time_series.py +100 -0
- render/public_api/models/time_series_value.py +70 -0
- render/public_api/models/update_env_group_secret_file_body.py +59 -0
- render/public_api/models/update_registry_credential_body.py +85 -0
- render/public_api/models/update_workspace_member_body.py +61 -0
- render/public_api/models/user.py +67 -0
- render/public_api/models/validate_blueprint_request.py +84 -0
- render/public_api/models/validate_blueprint_response.py +105 -0
- render/public_api/models/validation_error.py +88 -0
- render/public_api/models/validation_plan_summary.py +107 -0
- render/public_api/models/web_service_details.py +385 -0
- render/public_api/models/web_service_details_patch.py +270 -0
- render/public_api/models/web_service_details_post.py +354 -0
- render/public_api/models/webhook.py +110 -0
- render/public_api/models/webhook_event.py +115 -0
- render/public_api/models/webhook_event_with_cursor.py +73 -0
- render/public_api/models/webhook_patch_input.py +98 -0
- render/public_api/models/webhook_post_input.py +102 -0
- render/public_api/models/webhook_with_cursor.py +73 -0
- render/public_api/models/workflow.py +163 -0
- render/public_api/models/workflow_create.py +169 -0
- render/public_api/models/workflow_update.py +109 -0
- render/public_api/models/workflow_version.py +95 -0
- render/public_api/models/workflow_version_status.py +13 -0
- render/public_api/models/workflow_version_with_cursor.py +73 -0
- render/public_api/models/workflow_with_cursor.py +73 -0
- render/public_api/models/zero_downtime_redeploy_ended.py +44 -0
- render/public_api/models/zero_downtime_redeploy_started.py +59 -0
- render/public_api/py.typed +1 -0
- render/public_api/types.py +54 -0
- render/py.typed +0 -0
- render/render.py +81 -0
- render/render_async.py +80 -0
- render/version.py +27 -0
- render/workflows/__init__.py +25 -0
- render/workflows/_callback_models.py +194 -0
- render/workflows/_uds_http.py +128 -0
- render/workflows/app.py +263 -0
- render/workflows/cli.py +62 -0
- render/workflows/client.py +354 -0
- render/workflows/context.py +75 -0
- render/workflows/executor.py +86 -0
- render/workflows/runner.py +174 -0
- render/workflows/task.py +348 -0
- render/workflows/tests/__init__.py +0 -0
- render/workflows/tests/test_app.py +343 -0
- render/workflows/tests/test_cli.py +134 -0
- render/workflows/tests/test_client.py +59 -0
- render/workflows/tests/test_context.py +118 -0
- render/workflows/tests/test_end_to_end.py +307 -0
- render/workflows/tests/test_executor.py +221 -0
- render/workflows/tests/test_lazy_imports.py +100 -0
- render/workflows/tests/test_registration.py +293 -0
- render/workflows/tests/test_translate_errors.py +126 -0
- render/workflows/tests/test_uds_http.py +199 -0
- render/workflows/tests/test_version.py +15 -0
- render-1.0.1.dist-info/METADATA +382 -0
- render-1.0.1.dist-info/RECORD +799 -0
- render-1.0.1.dist-info/WHEEL +4 -0
- render-1.0.1.dist-info/entry_points.txt +2 -0
- render-1.0.1.dist-info/licenses/LICENSE +201 -0
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
"""Type definitions for Key Value experimental feature."""
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from typing import Literal
|
|
5
|
+
|
|
6
|
+
from render.public_api.models.cidr_block_and_description import (
|
|
7
|
+
CidrBlockAndDescription,
|
|
8
|
+
)
|
|
9
|
+
from render.public_api.models.database_status import DatabaseStatus
|
|
10
|
+
from render.public_api.models.key_value_plan import KeyValuePlan
|
|
11
|
+
from render.public_api.models.maxmemory_policy import MaxmemoryPolicy
|
|
12
|
+
|
|
13
|
+
__all__ = [
|
|
14
|
+
"ConnectionInfo",
|
|
15
|
+
"InstanceConfiguration",
|
|
16
|
+
"IPAllowListEntry",
|
|
17
|
+
"KeyValueInstance",
|
|
18
|
+
"MaxmemoryPolicy",
|
|
19
|
+
"NameOwnerIdOptions",
|
|
20
|
+
"Options",
|
|
21
|
+
"OwnerId",
|
|
22
|
+
"Plan",
|
|
23
|
+
"ServiceIdOptions",
|
|
24
|
+
]
|
|
25
|
+
|
|
26
|
+
# Excludes "custom", which is a managed plan not available for provisioning
|
|
27
|
+
Plan = Literal[
|
|
28
|
+
"free",
|
|
29
|
+
"starter",
|
|
30
|
+
"standard",
|
|
31
|
+
"pro",
|
|
32
|
+
"pro_plus",
|
|
33
|
+
]
|
|
34
|
+
|
|
35
|
+
# Owner ID (format: "tea-xxx" for workspace teams, "own-xxx" for individuals)
|
|
36
|
+
OwnerId = str
|
|
37
|
+
|
|
38
|
+
# IP allow list entry is a CIDR block paired with a description
|
|
39
|
+
IPAllowListEntry = CidrBlockAndDescription
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
@dataclass
|
|
43
|
+
class KeyValueInstance:
|
|
44
|
+
"""Subset of Key Value instance state needed by the client.
|
|
45
|
+
|
|
46
|
+
Returned by all KeyValueApi methods so that client.py and compare.py
|
|
47
|
+
don't depend on the generated KeyValue / KeyValueDetail models directly.
|
|
48
|
+
|
|
49
|
+
Attributes:
|
|
50
|
+
id: The Render service ID of the instance.
|
|
51
|
+
status: Current lifecycle status.
|
|
52
|
+
plan: Current billing plan.
|
|
53
|
+
maxmemory_policy: Current eviction policy, or None if unset.
|
|
54
|
+
ip_allow_list: Current IP allow list entries.
|
|
55
|
+
"""
|
|
56
|
+
|
|
57
|
+
id: str
|
|
58
|
+
status: DatabaseStatus
|
|
59
|
+
plan: KeyValuePlan
|
|
60
|
+
maxmemory_policy: MaxmemoryPolicy | None
|
|
61
|
+
ip_allow_list: list[IPAllowListEntry]
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
@dataclass
|
|
65
|
+
class ConnectionInfo:
|
|
66
|
+
"""Parsed connection information for a Key Value instance.
|
|
67
|
+
|
|
68
|
+
Attributes:
|
|
69
|
+
host: Hostname of the Key Value instance.
|
|
70
|
+
port: Port number.
|
|
71
|
+
username: Optional username for authentication.
|
|
72
|
+
password: Optional password for authentication.
|
|
73
|
+
"""
|
|
74
|
+
|
|
75
|
+
host: str
|
|
76
|
+
port: int
|
|
77
|
+
username: str | None = None
|
|
78
|
+
password: str | None = None
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
@dataclass
|
|
82
|
+
class InstanceConfiguration:
|
|
83
|
+
"""Configuration settings for an instance, used for automatic provisioning
|
|
84
|
+
and settings sync
|
|
85
|
+
|
|
86
|
+
Attributes:
|
|
87
|
+
plan: Desired plan
|
|
88
|
+
maxmemory_policy: Desired eviction policy
|
|
89
|
+
ip_allow_list: Desired IP allowlist for external connections
|
|
90
|
+
"""
|
|
91
|
+
|
|
92
|
+
plan: Plan | None = None
|
|
93
|
+
maxmemory_policy: MaxmemoryPolicy | None = None
|
|
94
|
+
ip_allow_list: list[IPAllowListEntry] | None = None
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
@dataclass
|
|
98
|
+
class ServiceIdOptions:
|
|
99
|
+
"""Options for identifying a Key Value instance by its Render service ID.
|
|
100
|
+
|
|
101
|
+
Attributes:
|
|
102
|
+
service_id: The Render service ID of the Key Value instance.
|
|
103
|
+
auto_provision: Instance configuration settings to use for automatic
|
|
104
|
+
provisioning and settings sync. Set to `False` to disable
|
|
105
|
+
automatic instance changes
|
|
106
|
+
"""
|
|
107
|
+
|
|
108
|
+
service_id: str
|
|
109
|
+
auto_provision: bool | InstanceConfiguration | None = None
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
@dataclass
|
|
113
|
+
class NameOwnerIdOptions:
|
|
114
|
+
"""Options for identifying a Key Value instance by name.
|
|
115
|
+
|
|
116
|
+
Attributes:
|
|
117
|
+
name: Name of the Key Value instance.
|
|
118
|
+
owner_id: Owner ID of the instance. Must be set here, when initializing the
|
|
119
|
+
Render client, or via the RENDER_WORKSPACE_ID environment variable.
|
|
120
|
+
auto_provision: Instance configuration settings to use for automatic
|
|
121
|
+
provisioning and settings sync. Set to `False` to disable
|
|
122
|
+
automatic instance changes
|
|
123
|
+
"""
|
|
124
|
+
|
|
125
|
+
name: str
|
|
126
|
+
owner_id: OwnerId | None = None
|
|
127
|
+
auto_provision: bool | InstanceConfiguration | None = None
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
Options = ServiceIdOptions | NameOwnerIdOptions
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"""Shared utilities for the Key Value module."""
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def _format_error_message(failure: str, call_to_action: str) -> str:
|
|
7
|
+
return f"{failure}\n\n{call_to_action}"
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def _is_local_dev() -> bool:
|
|
11
|
+
return os.environ.get("RENDER_USE_LOCAL_DEV") == "true"
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"""Object storage API exports."""
|
|
2
|
+
|
|
3
|
+
from render.experimental.object.api import ObjectApi
|
|
4
|
+
from render.experimental.object.api_sync import SyncObjectApi
|
|
5
|
+
from render.experimental.object.client import ObjectClient, ScopedObjectClient
|
|
6
|
+
from render.experimental.object.client_sync import (
|
|
7
|
+
SyncObjectClient,
|
|
8
|
+
SyncScopedObjectClient,
|
|
9
|
+
)
|
|
10
|
+
from render.experimental.object.types import (
|
|
11
|
+
DownloadResponse,
|
|
12
|
+
ListObjectsResponse,
|
|
13
|
+
ObjectData,
|
|
14
|
+
ObjectMetadata,
|
|
15
|
+
OwnerID,
|
|
16
|
+
PutObjectResult,
|
|
17
|
+
Region,
|
|
18
|
+
UploadResponse,
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
__all__ = [
|
|
22
|
+
# API classes
|
|
23
|
+
"ObjectApi",
|
|
24
|
+
"ObjectClient",
|
|
25
|
+
"ScopedObjectClient",
|
|
26
|
+
"SyncObjectApi",
|
|
27
|
+
"SyncObjectClient",
|
|
28
|
+
"SyncScopedObjectClient",
|
|
29
|
+
# Types
|
|
30
|
+
"DownloadResponse",
|
|
31
|
+
"ListObjectsResponse",
|
|
32
|
+
"ObjectData",
|
|
33
|
+
"ObjectMetadata",
|
|
34
|
+
"OwnerID",
|
|
35
|
+
"PutObjectResult",
|
|
36
|
+
"Region",
|
|
37
|
+
"UploadResponse",
|
|
38
|
+
]
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
"""Typed Object API Client
|
|
2
|
+
|
|
3
|
+
Provides idiomatic Python wrapper around the raw OpenAPI client.
|
|
4
|
+
Handles presigned URL flow but still exposes the two-step nature
|
|
5
|
+
(get URL, then upload/download). Useful for advanced use cases
|
|
6
|
+
requiring fine-grained control.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from typing import TYPE_CHECKING, cast
|
|
10
|
+
|
|
11
|
+
from render.client.errors import RenderError
|
|
12
|
+
from render.client.util import handle_http_errors
|
|
13
|
+
from render.experimental.object.types import (
|
|
14
|
+
DownloadResponse,
|
|
15
|
+
ListObjectsResponse,
|
|
16
|
+
ObjectMetadata,
|
|
17
|
+
UploadResponse,
|
|
18
|
+
)
|
|
19
|
+
from render.public_api.api.object_storage import (
|
|
20
|
+
delete_object,
|
|
21
|
+
get_object,
|
|
22
|
+
list_objects,
|
|
23
|
+
put_object,
|
|
24
|
+
)
|
|
25
|
+
from render.public_api.models.error import Error
|
|
26
|
+
from render.public_api.models.get_object_output import GetObjectOutput
|
|
27
|
+
from render.public_api.models.list_objects_response import (
|
|
28
|
+
ListObjectsResponse as GeneratedListObjectsResponse,
|
|
29
|
+
)
|
|
30
|
+
from render.public_api.models.put_object_input import (
|
|
31
|
+
PutObjectInput as PutObjectInputModel,
|
|
32
|
+
)
|
|
33
|
+
from render.public_api.models.put_object_output import PutObjectOutput
|
|
34
|
+
from render.public_api.models.region import Region
|
|
35
|
+
from render.public_api.types import UNSET, Response
|
|
36
|
+
|
|
37
|
+
if TYPE_CHECKING:
|
|
38
|
+
from render.public_api.client import AuthenticatedClient, Client
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class ObjectApi:
|
|
42
|
+
"""Typed Object API Client
|
|
43
|
+
|
|
44
|
+
Provides idiomatic Python wrapper around the raw OpenAPI client.
|
|
45
|
+
Handles presigned URL flow but still exposes the two-step nature.
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
def __init__(self, client: "AuthenticatedClient | Client"):
|
|
49
|
+
self.client = client
|
|
50
|
+
|
|
51
|
+
async def get_upload_url(
|
|
52
|
+
self,
|
|
53
|
+
owner_id: str,
|
|
54
|
+
region: Region | str,
|
|
55
|
+
key: str,
|
|
56
|
+
size_bytes: int,
|
|
57
|
+
) -> UploadResponse:
|
|
58
|
+
"""Get a presigned URL for uploading an object.
|
|
59
|
+
|
|
60
|
+
Args:
|
|
61
|
+
owner_id: Owner ID (workspace team ID)
|
|
62
|
+
region: Storage region
|
|
63
|
+
key: Object key (path)
|
|
64
|
+
size_bytes: Size of the object in bytes
|
|
65
|
+
|
|
66
|
+
Returns:
|
|
67
|
+
UploadResponse: Upload URL with expiration and size limit
|
|
68
|
+
|
|
69
|
+
Raises:
|
|
70
|
+
ClientError: For 4xx client errors
|
|
71
|
+
ServerError: For 5xx server errors
|
|
72
|
+
TimeoutError: If the request times out
|
|
73
|
+
"""
|
|
74
|
+
response = await self._get_upload_url_api_call(
|
|
75
|
+
owner_id, region, key, size_bytes
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
if not isinstance(response.parsed, PutObjectOutput):
|
|
79
|
+
raise RenderError("Failed to get upload URL: unexpected response type")
|
|
80
|
+
|
|
81
|
+
return UploadResponse(
|
|
82
|
+
url=response.parsed.url,
|
|
83
|
+
expires_at=response.parsed.expires_at,
|
|
84
|
+
max_size_bytes=response.parsed.max_size_bytes,
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
@handle_http_errors("get upload URL")
|
|
88
|
+
async def _get_upload_url_api_call(
|
|
89
|
+
self,
|
|
90
|
+
owner_id: str,
|
|
91
|
+
region: Region | str,
|
|
92
|
+
key: str,
|
|
93
|
+
size_bytes: int,
|
|
94
|
+
) -> Response[Error | PutObjectOutput]:
|
|
95
|
+
"""Internal method to make the get upload URL API call."""
|
|
96
|
+
body = PutObjectInputModel(size_bytes=size_bytes)
|
|
97
|
+
|
|
98
|
+
return await put_object.asyncio_detailed(
|
|
99
|
+
owner_id=owner_id,
|
|
100
|
+
region=cast(Region, region),
|
|
101
|
+
key=key,
|
|
102
|
+
client=self.client,
|
|
103
|
+
body=body,
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
async def get_download_url(
|
|
107
|
+
self,
|
|
108
|
+
owner_id: str,
|
|
109
|
+
region: Region | str,
|
|
110
|
+
key: str,
|
|
111
|
+
) -> DownloadResponse:
|
|
112
|
+
"""Get a presigned URL for downloading an object.
|
|
113
|
+
|
|
114
|
+
Args:
|
|
115
|
+
owner_id: Owner ID (workspace team ID)
|
|
116
|
+
region: Storage region
|
|
117
|
+
key: Object key (path)
|
|
118
|
+
|
|
119
|
+
Returns:
|
|
120
|
+
DownloadResponse: Download URL with expiration
|
|
121
|
+
|
|
122
|
+
Raises:
|
|
123
|
+
ClientError: For 4xx client errors
|
|
124
|
+
ServerError: For 5xx server errors
|
|
125
|
+
TimeoutError: If the request times out
|
|
126
|
+
"""
|
|
127
|
+
response = await self._get_download_url_api_call(owner_id, region, key)
|
|
128
|
+
|
|
129
|
+
if not isinstance(response.parsed, GetObjectOutput):
|
|
130
|
+
raise RenderError("Failed to get download URL: unexpected response type")
|
|
131
|
+
|
|
132
|
+
return DownloadResponse(
|
|
133
|
+
url=response.parsed.url,
|
|
134
|
+
expires_at=response.parsed.expires_at,
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
@handle_http_errors("get download URL")
|
|
138
|
+
async def _get_download_url_api_call(
|
|
139
|
+
self,
|
|
140
|
+
owner_id: str,
|
|
141
|
+
region: Region | str,
|
|
142
|
+
key: str,
|
|
143
|
+
) -> Response[Error | GetObjectOutput]:
|
|
144
|
+
"""Internal method to make the get download URL API call."""
|
|
145
|
+
return await get_object.asyncio_detailed(
|
|
146
|
+
owner_id=owner_id,
|
|
147
|
+
region=cast(Region, region),
|
|
148
|
+
key=key,
|
|
149
|
+
client=self.client,
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
async def delete(
|
|
153
|
+
self,
|
|
154
|
+
owner_id: str,
|
|
155
|
+
region: Region | str,
|
|
156
|
+
key: str,
|
|
157
|
+
) -> None:
|
|
158
|
+
"""Delete an object.
|
|
159
|
+
|
|
160
|
+
Args:
|
|
161
|
+
owner_id: Owner ID (workspace team ID)
|
|
162
|
+
region: Storage region
|
|
163
|
+
key: Object key (path)
|
|
164
|
+
|
|
165
|
+
Raises:
|
|
166
|
+
ClientError: For 4xx client errors
|
|
167
|
+
ServerError: For 5xx server errors
|
|
168
|
+
TimeoutError: If the request times out
|
|
169
|
+
"""
|
|
170
|
+
await self._delete_api_call(owner_id, region, key)
|
|
171
|
+
|
|
172
|
+
@handle_http_errors("delete object")
|
|
173
|
+
async def _delete_api_call(
|
|
174
|
+
self,
|
|
175
|
+
owner_id: str,
|
|
176
|
+
region: Region | str,
|
|
177
|
+
key: str,
|
|
178
|
+
) -> Response[Error | None]:
|
|
179
|
+
"""Internal method to make the delete object API call."""
|
|
180
|
+
return await delete_object.asyncio_detailed(
|
|
181
|
+
owner_id=owner_id,
|
|
182
|
+
region=cast(Region, region),
|
|
183
|
+
key=key,
|
|
184
|
+
client=self.client,
|
|
185
|
+
)
|
|
186
|
+
|
|
187
|
+
async def list_objects(
|
|
188
|
+
self,
|
|
189
|
+
owner_id: str,
|
|
190
|
+
region: Region | str,
|
|
191
|
+
cursor: str | None = None,
|
|
192
|
+
limit: int | None = None,
|
|
193
|
+
) -> ListObjectsResponse:
|
|
194
|
+
"""List objects in storage.
|
|
195
|
+
|
|
196
|
+
Args:
|
|
197
|
+
owner_id: Owner ID (workspace team ID)
|
|
198
|
+
region: Storage region
|
|
199
|
+
cursor: Pagination cursor from previous response
|
|
200
|
+
limit: Maximum number of objects to return (default 20)
|
|
201
|
+
|
|
202
|
+
Returns:
|
|
203
|
+
ListObjectsResponse: List of object metadata with optional next cursor
|
|
204
|
+
|
|
205
|
+
Raises:
|
|
206
|
+
ClientError: For 4xx client errors
|
|
207
|
+
ServerError: For 5xx server errors
|
|
208
|
+
TimeoutError: If the request times out
|
|
209
|
+
"""
|
|
210
|
+
response = await self._list_objects_api_call(owner_id, region, cursor, limit)
|
|
211
|
+
|
|
212
|
+
if not isinstance(response.parsed, GeneratedListObjectsResponse):
|
|
213
|
+
raise RenderError("Failed to list objects: unexpected response type")
|
|
214
|
+
|
|
215
|
+
parsed = response.parsed
|
|
216
|
+
objects = [
|
|
217
|
+
ObjectMetadata(
|
|
218
|
+
key=item.object_.key,
|
|
219
|
+
size=item.object_.size_bytes,
|
|
220
|
+
last_modified=item.object_.last_modified,
|
|
221
|
+
)
|
|
222
|
+
for item in parsed.items
|
|
223
|
+
]
|
|
224
|
+
|
|
225
|
+
next_cursor = (
|
|
226
|
+
parsed.next_cursor if isinstance(parsed.next_cursor, str) else None
|
|
227
|
+
)
|
|
228
|
+
|
|
229
|
+
return ListObjectsResponse(
|
|
230
|
+
objects=objects,
|
|
231
|
+
has_next=parsed.has_next,
|
|
232
|
+
next_cursor=next_cursor,
|
|
233
|
+
)
|
|
234
|
+
|
|
235
|
+
@handle_http_errors("list objects")
|
|
236
|
+
async def _list_objects_api_call(
|
|
237
|
+
self,
|
|
238
|
+
owner_id: str,
|
|
239
|
+
region: Region | str,
|
|
240
|
+
cursor: str | None,
|
|
241
|
+
limit: int | None,
|
|
242
|
+
) -> Response[Error | GeneratedListObjectsResponse]:
|
|
243
|
+
"""Internal method to make the list objects API call."""
|
|
244
|
+
return await list_objects.asyncio_detailed(
|
|
245
|
+
owner_id=owner_id,
|
|
246
|
+
region=cast(Region, region),
|
|
247
|
+
cursor=cursor if cursor is not None else UNSET,
|
|
248
|
+
limit=limit if limit is not None else UNSET,
|
|
249
|
+
client=self.client,
|
|
250
|
+
)
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
# Auto-generated sync version. Do not edit — run scripts/unasync.py instead.
|
|
2
|
+
|
|
3
|
+
"""Typed Object API Client
|
|
4
|
+
|
|
5
|
+
Provides idiomatic Python wrapper around the raw OpenAPI client.
|
|
6
|
+
Handles presigned URL flow but still exposes the two-step nature
|
|
7
|
+
(get URL, then upload/download). Useful for advanced use cases
|
|
8
|
+
requiring fine-grained control.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from typing import TYPE_CHECKING, cast
|
|
12
|
+
|
|
13
|
+
from render.client.errors import RenderError
|
|
14
|
+
from render.client.util_sync import handle_http_errors
|
|
15
|
+
from render.experimental.object.types import (
|
|
16
|
+
DownloadResponse,
|
|
17
|
+
ListObjectsResponse,
|
|
18
|
+
ObjectMetadata,
|
|
19
|
+
UploadResponse,
|
|
20
|
+
)
|
|
21
|
+
from render.public_api.api.object_storage import (
|
|
22
|
+
delete_object,
|
|
23
|
+
get_object,
|
|
24
|
+
list_objects,
|
|
25
|
+
put_object,
|
|
26
|
+
)
|
|
27
|
+
from render.public_api.models.error import Error
|
|
28
|
+
from render.public_api.models.get_object_output import GetObjectOutput
|
|
29
|
+
from render.public_api.models.list_objects_response import (
|
|
30
|
+
ListObjectsResponse as GeneratedListObjectsResponse,
|
|
31
|
+
)
|
|
32
|
+
from render.public_api.models.put_object_input import (
|
|
33
|
+
PutObjectInput as PutObjectInputModel,
|
|
34
|
+
)
|
|
35
|
+
from render.public_api.models.put_object_output import PutObjectOutput
|
|
36
|
+
from render.public_api.models.region import Region
|
|
37
|
+
from render.public_api.types import UNSET, Response
|
|
38
|
+
|
|
39
|
+
if TYPE_CHECKING:
|
|
40
|
+
from render.public_api.client import AuthenticatedClient, Client
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class SyncObjectApi:
|
|
44
|
+
"""Typed Object API Client
|
|
45
|
+
|
|
46
|
+
Provides idiomatic Python wrapper around the raw OpenAPI client.
|
|
47
|
+
Handles presigned URL flow but still exposes the two-step nature.
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
def __init__(self, client: "AuthenticatedClient | Client"):
|
|
51
|
+
self.client = client
|
|
52
|
+
|
|
53
|
+
def get_upload_url(
|
|
54
|
+
self,
|
|
55
|
+
owner_id: str,
|
|
56
|
+
region: Region | str,
|
|
57
|
+
key: str,
|
|
58
|
+
size_bytes: int,
|
|
59
|
+
) -> UploadResponse:
|
|
60
|
+
"""Get a presigned URL for uploading an object.
|
|
61
|
+
|
|
62
|
+
Args:
|
|
63
|
+
owner_id: Owner ID (workspace team ID)
|
|
64
|
+
region: Storage region
|
|
65
|
+
key: Object key (path)
|
|
66
|
+
size_bytes: Size of the object in bytes
|
|
67
|
+
|
|
68
|
+
Returns:
|
|
69
|
+
UploadResponse: Upload URL with expiration and size limit
|
|
70
|
+
|
|
71
|
+
Raises:
|
|
72
|
+
ClientError: For 4xx client errors
|
|
73
|
+
ServerError: For 5xx server errors
|
|
74
|
+
TimeoutError: If the request times out
|
|
75
|
+
"""
|
|
76
|
+
response = self._get_upload_url_api_call(owner_id, region, key, size_bytes)
|
|
77
|
+
|
|
78
|
+
if not isinstance(response.parsed, PutObjectOutput):
|
|
79
|
+
raise RenderError("Failed to get upload URL: unexpected response type")
|
|
80
|
+
|
|
81
|
+
return UploadResponse(
|
|
82
|
+
url=response.parsed.url,
|
|
83
|
+
expires_at=response.parsed.expires_at,
|
|
84
|
+
max_size_bytes=response.parsed.max_size_bytes,
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
@handle_http_errors("get upload URL")
|
|
88
|
+
def _get_upload_url_api_call(
|
|
89
|
+
self,
|
|
90
|
+
owner_id: str,
|
|
91
|
+
region: Region | str,
|
|
92
|
+
key: str,
|
|
93
|
+
size_bytes: int,
|
|
94
|
+
) -> Response[Error | PutObjectOutput]:
|
|
95
|
+
"""Internal method to make the get upload URL API call."""
|
|
96
|
+
body = PutObjectInputModel(size_bytes=size_bytes)
|
|
97
|
+
|
|
98
|
+
return put_object.sync_detailed(
|
|
99
|
+
owner_id=owner_id,
|
|
100
|
+
region=cast(Region, region),
|
|
101
|
+
key=key,
|
|
102
|
+
client=self.client,
|
|
103
|
+
body=body,
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
def get_download_url(
|
|
107
|
+
self,
|
|
108
|
+
owner_id: str,
|
|
109
|
+
region: Region | str,
|
|
110
|
+
key: str,
|
|
111
|
+
) -> DownloadResponse:
|
|
112
|
+
"""Get a presigned URL for downloading an object.
|
|
113
|
+
|
|
114
|
+
Args:
|
|
115
|
+
owner_id: Owner ID (workspace team ID)
|
|
116
|
+
region: Storage region
|
|
117
|
+
key: Object key (path)
|
|
118
|
+
|
|
119
|
+
Returns:
|
|
120
|
+
DownloadResponse: Download URL with expiration
|
|
121
|
+
|
|
122
|
+
Raises:
|
|
123
|
+
ClientError: For 4xx client errors
|
|
124
|
+
ServerError: For 5xx server errors
|
|
125
|
+
TimeoutError: If the request times out
|
|
126
|
+
"""
|
|
127
|
+
response = self._get_download_url_api_call(owner_id, region, key)
|
|
128
|
+
|
|
129
|
+
if not isinstance(response.parsed, GetObjectOutput):
|
|
130
|
+
raise RenderError("Failed to get download URL: unexpected response type")
|
|
131
|
+
|
|
132
|
+
return DownloadResponse(
|
|
133
|
+
url=response.parsed.url,
|
|
134
|
+
expires_at=response.parsed.expires_at,
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
@handle_http_errors("get download URL")
|
|
138
|
+
def _get_download_url_api_call(
|
|
139
|
+
self,
|
|
140
|
+
owner_id: str,
|
|
141
|
+
region: Region | str,
|
|
142
|
+
key: str,
|
|
143
|
+
) -> Response[Error | GetObjectOutput]:
|
|
144
|
+
"""Internal method to make the get download URL API call."""
|
|
145
|
+
return get_object.sync_detailed(
|
|
146
|
+
owner_id=owner_id,
|
|
147
|
+
region=cast(Region, region),
|
|
148
|
+
key=key,
|
|
149
|
+
client=self.client,
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
def delete(
|
|
153
|
+
self,
|
|
154
|
+
owner_id: str,
|
|
155
|
+
region: Region | str,
|
|
156
|
+
key: str,
|
|
157
|
+
) -> None:
|
|
158
|
+
"""Delete an object.
|
|
159
|
+
|
|
160
|
+
Args:
|
|
161
|
+
owner_id: Owner ID (workspace team ID)
|
|
162
|
+
region: Storage region
|
|
163
|
+
key: Object key (path)
|
|
164
|
+
|
|
165
|
+
Raises:
|
|
166
|
+
ClientError: For 4xx client errors
|
|
167
|
+
ServerError: For 5xx server errors
|
|
168
|
+
TimeoutError: If the request times out
|
|
169
|
+
"""
|
|
170
|
+
self._delete_api_call(owner_id, region, key)
|
|
171
|
+
|
|
172
|
+
@handle_http_errors("delete object")
|
|
173
|
+
def _delete_api_call(
|
|
174
|
+
self,
|
|
175
|
+
owner_id: str,
|
|
176
|
+
region: Region | str,
|
|
177
|
+
key: str,
|
|
178
|
+
) -> Response[Error | None]:
|
|
179
|
+
"""Internal method to make the delete object API call."""
|
|
180
|
+
return delete_object.sync_detailed(
|
|
181
|
+
owner_id=owner_id,
|
|
182
|
+
region=cast(Region, region),
|
|
183
|
+
key=key,
|
|
184
|
+
client=self.client,
|
|
185
|
+
)
|
|
186
|
+
|
|
187
|
+
def list_objects(
|
|
188
|
+
self,
|
|
189
|
+
owner_id: str,
|
|
190
|
+
region: Region | str,
|
|
191
|
+
cursor: str | None = None,
|
|
192
|
+
limit: int | None = None,
|
|
193
|
+
) -> ListObjectsResponse:
|
|
194
|
+
"""List objects in storage.
|
|
195
|
+
|
|
196
|
+
Args:
|
|
197
|
+
owner_id: Owner ID (workspace team ID)
|
|
198
|
+
region: Storage region
|
|
199
|
+
cursor: Pagination cursor from previous response
|
|
200
|
+
limit: Maximum number of objects to return (default 20)
|
|
201
|
+
|
|
202
|
+
Returns:
|
|
203
|
+
ListObjectsResponse: List of object metadata with optional next cursor
|
|
204
|
+
|
|
205
|
+
Raises:
|
|
206
|
+
ClientError: For 4xx client errors
|
|
207
|
+
ServerError: For 5xx server errors
|
|
208
|
+
TimeoutError: If the request times out
|
|
209
|
+
"""
|
|
210
|
+
response = self._list_objects_api_call(owner_id, region, cursor, limit)
|
|
211
|
+
|
|
212
|
+
if not isinstance(response.parsed, GeneratedListObjectsResponse):
|
|
213
|
+
raise RenderError("Failed to list objects: unexpected response type")
|
|
214
|
+
|
|
215
|
+
parsed = response.parsed
|
|
216
|
+
objects = [
|
|
217
|
+
ObjectMetadata(
|
|
218
|
+
key=item.object_.key,
|
|
219
|
+
size=item.object_.size_bytes,
|
|
220
|
+
last_modified=item.object_.last_modified,
|
|
221
|
+
)
|
|
222
|
+
for item in parsed.items
|
|
223
|
+
]
|
|
224
|
+
|
|
225
|
+
next_cursor = (
|
|
226
|
+
parsed.next_cursor if isinstance(parsed.next_cursor, str) else None
|
|
227
|
+
)
|
|
228
|
+
|
|
229
|
+
return ListObjectsResponse(
|
|
230
|
+
objects=objects,
|
|
231
|
+
has_next=parsed.has_next,
|
|
232
|
+
next_cursor=next_cursor,
|
|
233
|
+
)
|
|
234
|
+
|
|
235
|
+
@handle_http_errors("list objects")
|
|
236
|
+
def _list_objects_api_call(
|
|
237
|
+
self,
|
|
238
|
+
owner_id: str,
|
|
239
|
+
region: Region | str,
|
|
240
|
+
cursor: str | None,
|
|
241
|
+
limit: int | None,
|
|
242
|
+
) -> Response[Error | GeneratedListObjectsResponse]:
|
|
243
|
+
"""Internal method to make the list objects API call."""
|
|
244
|
+
return list_objects.sync_detailed(
|
|
245
|
+
owner_id=owner_id,
|
|
246
|
+
region=cast(Region, region),
|
|
247
|
+
cursor=cursor if cursor is not None else UNSET,
|
|
248
|
+
limit=limit if limit is not None else UNSET,
|
|
249
|
+
client=self.client,
|
|
250
|
+
)
|