diff --git a/fern/definition/admin/clusters/datacenters/__package__.yml b/fern/definition/admin/clusters/datacenters/__package__.yml index c8affc38be..1ca26aaf28 100644 --- a/fern/definition/admin/clusters/datacenters/__package__.yml +++ b/fern/definition/admin/clusters/datacenters/__package__.yml @@ -21,6 +21,14 @@ service: request: body: CreateRequest response: CreateResponse + update: + path: /{datacenter_id} + path-parameters: + datacenter_id: + type: uuid + method: PATCH + request: + body: UpdateRequest taint: path: /{datacenter_id}/taint path-parameters: @@ -42,3 +50,10 @@ types: CreateResponse: properties: datacenter_id: uuid + UpdateRequest: + properties: + pool_type: localCommons.PoolType + hardware: list + desired_count: optional + max_count: optional + drain_timeout: optional diff --git a/lib/api-helper/macros/src/lib.rs b/lib/api-helper/macros/src/lib.rs index e0a96e5475..6a55ce627c 100644 --- a/lib/api-helper/macros/src/lib.rs +++ b/lib/api-helper/macros/src/lib.rs @@ -560,7 +560,7 @@ impl Endpoint { struct EndpointFunction { /// Path of the given Rust function. path: syn::Path, - /// Request type of the endpoint. (GET, PUT, POST, etc) + /// Request type of the endpoint. (GET, POST, PUT, PATCH, etc) req_type: String, /// The request `body` type. body: Option, @@ -574,11 +574,11 @@ impl Parse for EndpointFunction { let req_type = req_type_ident.to_string(); match req_type.as_str() { - "GET" | "POST" | "PUT" | "DELETE" => {} + "GET" | "POST" | "PUT" | "PATCH" | "DELETE" => {} _ => { return Err(syn::Error::new( req_type_ident.span(), - "Invalid endpoint request type (try GET, POST, PUT, DELETE)", + "Invalid endpoint request type (try GET, POST, PUT, PATCH, DELETE)", )); } }; @@ -609,7 +609,7 @@ impl Parse for EndpointFunction { .map(|arg| arg.value.expect_expr().cloned()) .transpose()?; - // Make sure body is set for post and put requests + // Make sure body is set for post, put, and patch requests if body.is_none() && !args .iter() @@ -618,7 +618,7 @@ impl Parse for EndpointFunction { if req_type != "GET" && req_type != "DELETE" { return Err(syn::Error::new( args_tt.span, - "POST and PUT endpoints must have a body argument", + "POST, PUT, and PATCH endpoints must have a body argument", )); } } else if req_type == "DELETE" || req_type == "GET" { diff --git a/lib/bolt/cli/src/commands/admin/cluster/datacenter.rs b/lib/bolt/cli/src/commands/admin/cluster/datacenter.rs index a02989b8ce..f38f3d8e3c 100644 --- a/lib/bolt/cli/src/commands/admin/cluster/datacenter.rs +++ b/lib/bolt/cli/src/commands/admin/cluster/datacenter.rs @@ -35,6 +35,23 @@ impl From for models::AdminBuildDeliveryMethod { } } +#[derive(ValueEnum, Clone)] +pub enum DatacenterPoolType { + Job, + Gg, + Ats, +} + +impl From for models::AdminPoolType { + fn from(pool_type: DatacenterPoolType) -> Self { + match pool_type { + DatacenterPoolType::Job => models::AdminPoolType::Job, + DatacenterPoolType::Gg => models::AdminPoolType::Gg, + DatacenterPoolType::Ats => models::AdminPoolType::Ats, + } + } +} + #[derive(Parser)] pub enum SubCommand { /// Creates a new datacenter @@ -73,6 +90,30 @@ pub enum SubCommand { #[clap(long, short = 'd')] name_id: String, }, + /// Update a datacenter's pools + Update { + /// The name id of the cluster + #[clap(long, short = 'c')] + cluster: String, + /// The name id of the datacenter + #[clap(index = 1)] + name_id: String, + /// The pool type + #[clap(index = 2)] + pool: DatacenterPoolType, + /// The hardware types + #[clap(long)] + hardware: Vec, + /// The desired count + #[clap(long)] + desired_count: Option, + /// The max count + #[clap(long)] + max_count: Option, + /// The drain timeout + #[clap(long)] + drain_timeout: Option, + }, } #[derive(Tabled)] @@ -92,10 +133,10 @@ impl SubCommand { provider_datacenter_id, build_delivery_method, } => { - ensure!( - ctx.ns().rivet.provisioning.is_some(), - "Provisioning is not enabled on this cluster" - ); + // ensure!( + // ctx.ns().rivet.provisioning.is_some(), + // "Provisioning is not enabled on this cluster" + // ); let clusters = admin_clusters_api::admin_clusters_list(&ctx.openapi_config_cloud().await?) @@ -188,6 +229,62 @@ impl SubCommand { ) .await?; } + Self::Update { + cluster: cluster_name_id, + name_id, + pool, + hardware, + desired_count, + max_count, + drain_timeout, + } => { + let clusters = + admin_clusters_api::admin_clusters_list(&ctx.openapi_config_cloud().await?) + .await? + .clusters; + + let cluster = clusters.iter().find(|c| c.name_id == cluster_name_id); + + let cluster = match cluster { + Some(c) => c, + None => bail!("cluster with the name id {} not found", cluster_name_id), + }; + + let datacenters = admin_clusters_datacenters_api::admin_clusters_datacenters_list( + &ctx.openapi_config_cloud().await?, + &cluster.cluster_id.to_string(), + ) + .await? + .datacenters; + + let datacenter = datacenters.iter().find(|d| d.name_id == name_id); + + let datacenter = match datacenter { + Some(d) => d, + None => bail!("datacenter with the name id {} not found", name_id), + }; + + admin_clusters_datacenters_api::admin_clusters_datacenters_update( + &ctx.openapi_config_cloud().await?, + &cluster.cluster_id.to_string(), + &datacenter.datacenter_id.to_string(), + models::AdminClustersDatacentersUpdateRequest { + desired_count, + drain_timeout, + hardware: hardware + .iter() + .map(|hardware| models::AdminHardware { + provider_hardware: hardware.clone(), + }) + .collect(), + max_count, + pool_type: pool.into(), + }, + ) + .await?; + + rivet_term::status::success("Datacenter updated", ""); + } } Ok(()) diff --git a/lib/bolt/cli/src/commands/admin/cluster/mod.rs b/lib/bolt/cli/src/commands/admin/cluster/mod.rs index 9c0c724a3b..d10ca3087f 100644 --- a/lib/bolt/cli/src/commands/admin/cluster/mod.rs +++ b/lib/bolt/cli/src/commands/admin/cluster/mod.rs @@ -40,10 +40,10 @@ impl SubCommand { name_id, owner_team_id, } => { - ensure!( - ctx.ns().rivet.provisioning.is_some(), - "Provisioning is not enabled on this cluster" - ); + // ensure!( + // ctx.ns().rivet.provisioning.is_some(), + // "Provisioning is not enabled on this cluster" + // ); admin_clusters_api::admin_clusters_create( &ctx.openapi_config_cloud().await?, diff --git a/sdks/full/go/admin/clusters/datacenters/client/client.go b/sdks/full/go/admin/clusters/datacenters/client/client.go index 0ac88ed60a..db4260d608 100644 --- a/sdks/full/go/admin/clusters/datacenters/client/client.go +++ b/sdks/full/go/admin/clusters/datacenters/client/client.go @@ -190,6 +190,82 @@ func (c *Client) Create(ctx context.Context, clusterId uuid.UUID, request *datac return response, nil } +func (c *Client) Update(ctx context.Context, clusterId uuid.UUID, datacenterId uuid.UUID, request *datacenters.UpdateRequest) error { + baseURL := "https://api.rivet.gg" + if c.baseURL != "" { + baseURL = c.baseURL + } + endpointURL := fmt.Sprintf(baseURL+"/"+"admin/clusters/%v/datacenters/%v", clusterId, datacenterId) + + errorDecoder := func(statusCode int, body io.Reader) error { + raw, err := io.ReadAll(body) + if err != nil { + return err + } + apiError := core.NewAPIError(statusCode, errors.New(string(raw))) + decoder := json.NewDecoder(bytes.NewReader(raw)) + switch statusCode { + case 500: + value := new(sdk.InternalError) + value.APIError = apiError + if err := decoder.Decode(value); err != nil { + return apiError + } + return value + case 429: + value := new(sdk.RateLimitError) + value.APIError = apiError + if err := decoder.Decode(value); err != nil { + return apiError + } + return value + case 403: + value := new(sdk.ForbiddenError) + value.APIError = apiError + if err := decoder.Decode(value); err != nil { + return apiError + } + return value + case 408: + value := new(sdk.UnauthorizedError) + value.APIError = apiError + if err := decoder.Decode(value); err != nil { + return apiError + } + return value + case 404: + value := new(sdk.NotFoundError) + value.APIError = apiError + if err := decoder.Decode(value); err != nil { + return apiError + } + return value + case 400: + value := new(sdk.BadRequestError) + value.APIError = apiError + if err := decoder.Decode(value); err != nil { + return apiError + } + return value + } + return apiError + } + + if err := c.caller.Call( + ctx, + &core.CallParams{ + URL: endpointURL, + Method: http.MethodPatch, + Headers: c.header, + Request: request, + ErrorDecoder: errorDecoder, + }, + ); err != nil { + return err + } + return nil +} + func (c *Client) Taint(ctx context.Context, clusterId uuid.UUID, datacenterId string) error { baseURL := "https://api.rivet.gg" if c.baseURL != "" { diff --git a/sdks/full/go/admin/clusters/datacenters/datacenters.go b/sdks/full/go/admin/clusters/datacenters/datacenters.go index 9bd818be60..a518c5b8b1 100644 --- a/sdks/full/go/admin/clusters/datacenters/datacenters.go +++ b/sdks/full/go/admin/clusters/datacenters/datacenters.go @@ -100,3 +100,36 @@ func (l *ListResponse) String() string { } return fmt.Sprintf("%#v", l) } + +type UpdateRequest struct { + PoolType admin.PoolType `json:"pool_type,omitempty"` + Hardware []*admin.Hardware `json:"hardware,omitempty"` + DesiredCount *int `json:"desired_count,omitempty"` + MaxCount *int `json:"max_count,omitempty"` + DrainTimeout *int64 `json:"drain_timeout,omitempty"` + + _rawJSON json.RawMessage +} + +func (u *UpdateRequest) UnmarshalJSON(data []byte) error { + type unmarshaler UpdateRequest + var value unmarshaler + if err := json.Unmarshal(data, &value); err != nil { + return err + } + *u = UpdateRequest(value) + u._rawJSON = json.RawMessage(data) + return nil +} + +func (u *UpdateRequest) String() string { + if len(u._rawJSON) > 0 { + if value, err := core.StringifyJSON(u._rawJSON); err == nil { + return value + } + } + if value, err := core.StringifyJSON(u); err == nil { + return value + } + return fmt.Sprintf("%#v", u) +} diff --git a/sdks/full/openapi/openapi.yml b/sdks/full/openapi/openapi.yml index c3aff92db5..984451e47c 100644 --- a/sdks/full/openapi/openapi.yml +++ b/sdks/full/openapi/openapi.yml @@ -346,6 +346,70 @@ paths: application/json: schema: $ref: '#/components/schemas/AdminClustersDatacentersCreateRequest' + /admin/clusters/{cluster_id}/datacenters/{datacenter_id}: + patch: + operationId: admin_clusters_datacenters_update + tags: + - AdminClustersDatacenters + parameters: + - name: cluster_id + in: path + required: true + schema: + type: string + format: uuid + - name: datacenter_id + in: path + required: true + schema: + type: string + format: uuid + responses: + '204': + description: '' + '400': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorBody' + '403': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorBody' + '404': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorBody' + '408': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorBody' + '429': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorBody' + '500': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorBody' + security: *ref_0 + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/AdminClustersDatacentersUpdateRequest' /admin/clusters/{cluster_id}/datacenters/{datacenter_id}/taint: get: operationId: admin_clusters_datacenters_taint @@ -8955,6 +9019,25 @@ components: format: uuid required: - datacenter_id + AdminClustersDatacentersUpdateRequest: + type: object + properties: + pool_type: + $ref: '#/components/schemas/AdminPoolType' + hardware: + type: array + items: + $ref: '#/components/schemas/AdminHardware' + desired_count: + type: integer + max_count: + type: integer + drain_timeout: + type: integer + format: int64 + required: + - pool_type + - hardware CloudBootstrapResponse: type: object properties: diff --git a/sdks/full/openapi_compat/openapi.yml b/sdks/full/openapi_compat/openapi.yml index 2138920093..fa3a1e6a78 100644 --- a/sdks/full/openapi_compat/openapi.yml +++ b/sdks/full/openapi_compat/openapi.yml @@ -79,6 +79,25 @@ components: required: - datacenters type: object + AdminClustersDatacentersUpdateRequest: + properties: + desired_count: + type: integer + drain_timeout: + format: int64 + type: integer + hardware: + items: + $ref: '#/components/schemas/AdminHardware' + type: array + max_count: + type: integer + pool_type: + $ref: '#/components/schemas/AdminPoolType' + required: + - pool_type + - hardware + type: object AdminClustersGetServerIpsResponse: properties: ips: @@ -4763,6 +4782,70 @@ paths: security: *id001 tags: - AdminClustersDatacenters + /admin/clusters/{cluster_id}/datacenters/{datacenter_id}: + patch: + operationId: admin_clusters_datacenters_update + parameters: + - in: path + name: cluster_id + required: true + schema: + format: uuid + type: string + - in: path + name: datacenter_id + required: true + schema: + format: uuid + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/AdminClustersDatacentersUpdateRequest' + required: true + responses: + '204': + description: '' + '400': + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorBody' + description: '' + '403': + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorBody' + description: '' + '404': + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorBody' + description: '' + '408': + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorBody' + description: '' + '429': + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorBody' + description: '' + '500': + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorBody' + description: '' + security: *id001 + tags: + - AdminClustersDatacenters /admin/clusters/{cluster_id}/datacenters/{datacenter_id}/taint: get: operationId: admin_clusters_datacenters_taint diff --git a/sdks/full/rust-cli/.openapi-generator/FILES b/sdks/full/rust-cli/.openapi-generator/FILES index a4ee9ae797..1bde2fe484 100644 --- a/sdks/full/rust-cli/.openapi-generator/FILES +++ b/sdks/full/rust-cli/.openapi-generator/FILES @@ -13,6 +13,7 @@ docs/AdminClustersDatacentersApi.md docs/AdminClustersDatacentersCreateRequest.md docs/AdminClustersDatacentersCreateResponse.md docs/AdminClustersDatacentersListResponse.md +docs/AdminClustersDatacentersUpdateRequest.md docs/AdminClustersGetServerIpsResponse.md docs/AdminClustersListResponse.md docs/AdminDatacenter.md @@ -400,6 +401,7 @@ src/models/admin_clusters_create_response.rs src/models/admin_clusters_datacenters_create_request.rs src/models/admin_clusters_datacenters_create_response.rs src/models/admin_clusters_datacenters_list_response.rs +src/models/admin_clusters_datacenters_update_request.rs src/models/admin_clusters_get_server_ips_response.rs src/models/admin_clusters_list_response.rs src/models/admin_datacenter.rs diff --git a/sdks/full/rust-cli/README.md b/sdks/full/rust-cli/README.md index 76a1608799..6d83dd8d86 100644 --- a/sdks/full/rust-cli/README.md +++ b/sdks/full/rust-cli/README.md @@ -32,6 +32,7 @@ Class | Method | HTTP request | Description *AdminClustersDatacentersApi* | [**admin_clusters_datacenters_create**](docs/AdminClustersDatacentersApi.md#admin_clusters_datacenters_create) | **POST** /admin/clusters/{cluster_id}/datacenters | *AdminClustersDatacentersApi* | [**admin_clusters_datacenters_list**](docs/AdminClustersDatacentersApi.md#admin_clusters_datacenters_list) | **GET** /admin/clusters/{cluster_id}/datacenters | *AdminClustersDatacentersApi* | [**admin_clusters_datacenters_taint**](docs/AdminClustersDatacentersApi.md#admin_clusters_datacenters_taint) | **GET** /admin/clusters/{cluster_id}/datacenters/{datacenter_id}/taint | +*AdminClustersDatacentersApi* | [**admin_clusters_datacenters_update**](docs/AdminClustersDatacentersApi.md#admin_clusters_datacenters_update) | **PATCH** /admin/clusters/{cluster_id}/datacenters/{datacenter_id} | *AuthIdentityAccessTokenApi* | [**auth_identity_access_token_complete_access_token_verification**](docs/AuthIdentityAccessTokenApi.md#auth_identity_access_token_complete_access_token_verification) | **POST** /auth/identity/access-token/complete-verification | *AuthIdentityEmailApi* | [**auth_identity_email_complete_email_verification**](docs/AuthIdentityEmailApi.md#auth_identity_email_complete_email_verification) | **POST** /auth/identity/email/complete-verification | *AuthIdentityEmailApi* | [**auth_identity_email_start_email_verification**](docs/AuthIdentityEmailApi.md#auth_identity_email_start_email_verification) | **POST** /auth/identity/email/start-verification | @@ -178,6 +179,7 @@ Class | Method | HTTP request | Description - [AdminClustersDatacentersCreateRequest](docs/AdminClustersDatacentersCreateRequest.md) - [AdminClustersDatacentersCreateResponse](docs/AdminClustersDatacentersCreateResponse.md) - [AdminClustersDatacentersListResponse](docs/AdminClustersDatacentersListResponse.md) + - [AdminClustersDatacentersUpdateRequest](docs/AdminClustersDatacentersUpdateRequest.md) - [AdminClustersGetServerIpsResponse](docs/AdminClustersGetServerIpsResponse.md) - [AdminClustersListResponse](docs/AdminClustersListResponse.md) - [AdminDatacenter](docs/AdminDatacenter.md) diff --git a/sdks/full/rust-cli/docs/AdminClustersDatacentersApi.md b/sdks/full/rust-cli/docs/AdminClustersDatacentersApi.md index 4af7680145..d97e835e4a 100644 --- a/sdks/full/rust-cli/docs/AdminClustersDatacentersApi.md +++ b/sdks/full/rust-cli/docs/AdminClustersDatacentersApi.md @@ -7,6 +7,7 @@ Method | HTTP request | Description [**admin_clusters_datacenters_create**](AdminClustersDatacentersApi.md#admin_clusters_datacenters_create) | **POST** /admin/clusters/{cluster_id}/datacenters | [**admin_clusters_datacenters_list**](AdminClustersDatacentersApi.md#admin_clusters_datacenters_list) | **GET** /admin/clusters/{cluster_id}/datacenters | [**admin_clusters_datacenters_taint**](AdminClustersDatacentersApi.md#admin_clusters_datacenters_taint) | **GET** /admin/clusters/{cluster_id}/datacenters/{datacenter_id}/taint | +[**admin_clusters_datacenters_update**](AdminClustersDatacentersApi.md#admin_clusters_datacenters_update) | **PATCH** /admin/clusters/{cluster_id}/datacenters/{datacenter_id} | @@ -97,3 +98,33 @@ Name | Type | Description | Required | Notes [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +## admin_clusters_datacenters_update + +> admin_clusters_datacenters_update(cluster_id, datacenter_id, admin_clusters_datacenters_update_request) + + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**cluster_id** | **uuid::Uuid** | | [required] | +**datacenter_id** | **uuid::Uuid** | | [required] | +**admin_clusters_datacenters_update_request** | [**AdminClustersDatacentersUpdateRequest**](AdminClustersDatacentersUpdateRequest.md) | | [required] | + +### Return type + + (empty response body) + +### Authorization + +[BearerAuth](../README.md#BearerAuth) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/sdks/full/rust-cli/docs/AdminClustersDatacentersUpdateRequest.md b/sdks/full/rust-cli/docs/AdminClustersDatacentersUpdateRequest.md new file mode 100644 index 0000000000..f007f70566 --- /dev/null +++ b/sdks/full/rust-cli/docs/AdminClustersDatacentersUpdateRequest.md @@ -0,0 +1,15 @@ +# AdminClustersDatacentersUpdateRequest + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**desired_count** | Option<**i32**> | | [optional] +**drain_timeout** | Option<**i64**> | | [optional] +**hardware** | [**Vec**](AdminHardware.md) | | +**max_count** | Option<**i32**> | | [optional] +**pool_type** | [**crate::models::AdminPoolType**](AdminPoolType.md) | | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/sdks/full/rust-cli/src/apis/admin_clusters_datacenters_api.rs b/sdks/full/rust-cli/src/apis/admin_clusters_datacenters_api.rs index a54f6146bf..3d94683d54 100644 --- a/sdks/full/rust-cli/src/apis/admin_clusters_datacenters_api.rs +++ b/sdks/full/rust-cli/src/apis/admin_clusters_datacenters_api.rs @@ -54,6 +54,19 @@ pub enum AdminClustersDatacentersTaintError { UnknownValue(serde_json::Value), } +/// struct for typed errors of method [`admin_clusters_datacenters_update`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum AdminClustersDatacentersUpdateError { + Status400(crate::models::ErrorBody), + Status403(crate::models::ErrorBody), + Status404(crate::models::ErrorBody), + Status408(crate::models::ErrorBody), + Status429(crate::models::ErrorBody), + Status500(crate::models::ErrorBody), + UnknownValue(serde_json::Value), +} + pub async fn admin_clusters_datacenters_create(configuration: &configuration::Configuration, cluster_id: &str, admin_clusters_datacenters_create_request: crate::models::AdminClustersDatacentersCreateRequest) -> Result> { let local_var_configuration = configuration; @@ -147,3 +160,34 @@ pub async fn admin_clusters_datacenters_taint(configuration: &configuration::Con } } +pub async fn admin_clusters_datacenters_update(configuration: &configuration::Configuration, cluster_id: &str, datacenter_id: &str, admin_clusters_datacenters_update_request: crate::models::AdminClustersDatacentersUpdateRequest) -> Result<(), Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/admin/clusters/{cluster_id}/datacenters/{datacenter_id}", local_var_configuration.base_path, cluster_id=crate::apis::urlencode(cluster_id), datacenter_id=crate::apis::urlencode(datacenter_id)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::PATCH, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_token) = local_var_configuration.bearer_access_token { + local_var_req_builder = local_var_req_builder.bearer_auth(local_var_token.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&admin_clusters_datacenters_update_request); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + Ok(()) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + diff --git a/sdks/full/rust-cli/src/models/admin_clusters_datacenters_update_request.rs b/sdks/full/rust-cli/src/models/admin_clusters_datacenters_update_request.rs new file mode 100644 index 0000000000..fb10e610ef --- /dev/null +++ b/sdks/full/rust-cli/src/models/admin_clusters_datacenters_update_request.rs @@ -0,0 +1,40 @@ +/* + * Rivet API + * + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 0.0.1 + * + * Generated by: https://openapi-generator.tech + */ + + + + +#[derive(Clone, Debug, PartialEq, Default, Serialize, Deserialize)] +pub struct AdminClustersDatacentersUpdateRequest { + #[serde(rename = "desired_count", skip_serializing_if = "Option::is_none")] + pub desired_count: Option, + #[serde(rename = "drain_timeout", skip_serializing_if = "Option::is_none")] + pub drain_timeout: Option, + #[serde(rename = "hardware")] + pub hardware: Vec, + #[serde(rename = "max_count", skip_serializing_if = "Option::is_none")] + pub max_count: Option, + #[serde(rename = "pool_type")] + pub pool_type: crate::models::AdminPoolType, +} + +impl AdminClustersDatacentersUpdateRequest { + pub fn new(hardware: Vec, pool_type: crate::models::AdminPoolType) -> AdminClustersDatacentersUpdateRequest { + AdminClustersDatacentersUpdateRequest { + desired_count: None, + drain_timeout: None, + hardware, + max_count: None, + pool_type, + } + } +} + + diff --git a/sdks/full/rust-cli/src/models/mod.rs b/sdks/full/rust-cli/src/models/mod.rs index d9e112b609..3abe695bdd 100644 --- a/sdks/full/rust-cli/src/models/mod.rs +++ b/sdks/full/rust-cli/src/models/mod.rs @@ -12,6 +12,8 @@ pub mod admin_clusters_datacenters_create_response; pub use self::admin_clusters_datacenters_create_response::AdminClustersDatacentersCreateResponse; pub mod admin_clusters_datacenters_list_response; pub use self::admin_clusters_datacenters_list_response::AdminClustersDatacentersListResponse; +pub mod admin_clusters_datacenters_update_request; +pub use self::admin_clusters_datacenters_update_request::AdminClustersDatacentersUpdateRequest; pub mod admin_clusters_get_server_ips_response; pub use self::admin_clusters_get_server_ips_response::AdminClustersGetServerIpsResponse; pub mod admin_clusters_list_response; diff --git a/sdks/full/rust/.openapi-generator/FILES b/sdks/full/rust/.openapi-generator/FILES index a4ee9ae797..1bde2fe484 100644 --- a/sdks/full/rust/.openapi-generator/FILES +++ b/sdks/full/rust/.openapi-generator/FILES @@ -13,6 +13,7 @@ docs/AdminClustersDatacentersApi.md docs/AdminClustersDatacentersCreateRequest.md docs/AdminClustersDatacentersCreateResponse.md docs/AdminClustersDatacentersListResponse.md +docs/AdminClustersDatacentersUpdateRequest.md docs/AdminClustersGetServerIpsResponse.md docs/AdminClustersListResponse.md docs/AdminDatacenter.md @@ -400,6 +401,7 @@ src/models/admin_clusters_create_response.rs src/models/admin_clusters_datacenters_create_request.rs src/models/admin_clusters_datacenters_create_response.rs src/models/admin_clusters_datacenters_list_response.rs +src/models/admin_clusters_datacenters_update_request.rs src/models/admin_clusters_get_server_ips_response.rs src/models/admin_clusters_list_response.rs src/models/admin_datacenter.rs diff --git a/sdks/full/rust/README.md b/sdks/full/rust/README.md index 76a1608799..6d83dd8d86 100644 --- a/sdks/full/rust/README.md +++ b/sdks/full/rust/README.md @@ -32,6 +32,7 @@ Class | Method | HTTP request | Description *AdminClustersDatacentersApi* | [**admin_clusters_datacenters_create**](docs/AdminClustersDatacentersApi.md#admin_clusters_datacenters_create) | **POST** /admin/clusters/{cluster_id}/datacenters | *AdminClustersDatacentersApi* | [**admin_clusters_datacenters_list**](docs/AdminClustersDatacentersApi.md#admin_clusters_datacenters_list) | **GET** /admin/clusters/{cluster_id}/datacenters | *AdminClustersDatacentersApi* | [**admin_clusters_datacenters_taint**](docs/AdminClustersDatacentersApi.md#admin_clusters_datacenters_taint) | **GET** /admin/clusters/{cluster_id}/datacenters/{datacenter_id}/taint | +*AdminClustersDatacentersApi* | [**admin_clusters_datacenters_update**](docs/AdminClustersDatacentersApi.md#admin_clusters_datacenters_update) | **PATCH** /admin/clusters/{cluster_id}/datacenters/{datacenter_id} | *AuthIdentityAccessTokenApi* | [**auth_identity_access_token_complete_access_token_verification**](docs/AuthIdentityAccessTokenApi.md#auth_identity_access_token_complete_access_token_verification) | **POST** /auth/identity/access-token/complete-verification | *AuthIdentityEmailApi* | [**auth_identity_email_complete_email_verification**](docs/AuthIdentityEmailApi.md#auth_identity_email_complete_email_verification) | **POST** /auth/identity/email/complete-verification | *AuthIdentityEmailApi* | [**auth_identity_email_start_email_verification**](docs/AuthIdentityEmailApi.md#auth_identity_email_start_email_verification) | **POST** /auth/identity/email/start-verification | @@ -178,6 +179,7 @@ Class | Method | HTTP request | Description - [AdminClustersDatacentersCreateRequest](docs/AdminClustersDatacentersCreateRequest.md) - [AdminClustersDatacentersCreateResponse](docs/AdminClustersDatacentersCreateResponse.md) - [AdminClustersDatacentersListResponse](docs/AdminClustersDatacentersListResponse.md) + - [AdminClustersDatacentersUpdateRequest](docs/AdminClustersDatacentersUpdateRequest.md) - [AdminClustersGetServerIpsResponse](docs/AdminClustersGetServerIpsResponse.md) - [AdminClustersListResponse](docs/AdminClustersListResponse.md) - [AdminDatacenter](docs/AdminDatacenter.md) diff --git a/sdks/full/rust/docs/AdminClustersDatacentersApi.md b/sdks/full/rust/docs/AdminClustersDatacentersApi.md index 4af7680145..d97e835e4a 100644 --- a/sdks/full/rust/docs/AdminClustersDatacentersApi.md +++ b/sdks/full/rust/docs/AdminClustersDatacentersApi.md @@ -7,6 +7,7 @@ Method | HTTP request | Description [**admin_clusters_datacenters_create**](AdminClustersDatacentersApi.md#admin_clusters_datacenters_create) | **POST** /admin/clusters/{cluster_id}/datacenters | [**admin_clusters_datacenters_list**](AdminClustersDatacentersApi.md#admin_clusters_datacenters_list) | **GET** /admin/clusters/{cluster_id}/datacenters | [**admin_clusters_datacenters_taint**](AdminClustersDatacentersApi.md#admin_clusters_datacenters_taint) | **GET** /admin/clusters/{cluster_id}/datacenters/{datacenter_id}/taint | +[**admin_clusters_datacenters_update**](AdminClustersDatacentersApi.md#admin_clusters_datacenters_update) | **PATCH** /admin/clusters/{cluster_id}/datacenters/{datacenter_id} | @@ -97,3 +98,33 @@ Name | Type | Description | Required | Notes [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +## admin_clusters_datacenters_update + +> admin_clusters_datacenters_update(cluster_id, datacenter_id, admin_clusters_datacenters_update_request) + + +### Parameters + + +Name | Type | Description | Required | Notes +------------- | ------------- | ------------- | ------------- | ------------- +**cluster_id** | **uuid::Uuid** | | [required] | +**datacenter_id** | **uuid::Uuid** | | [required] | +**admin_clusters_datacenters_update_request** | [**AdminClustersDatacentersUpdateRequest**](AdminClustersDatacentersUpdateRequest.md) | | [required] | + +### Return type + + (empty response body) + +### Authorization + +[BearerAuth](../README.md#BearerAuth) + +### HTTP request headers + +- **Content-Type**: application/json +- **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/sdks/full/rust/docs/AdminClustersDatacentersUpdateRequest.md b/sdks/full/rust/docs/AdminClustersDatacentersUpdateRequest.md new file mode 100644 index 0000000000..f007f70566 --- /dev/null +++ b/sdks/full/rust/docs/AdminClustersDatacentersUpdateRequest.md @@ -0,0 +1,15 @@ +# AdminClustersDatacentersUpdateRequest + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**desired_count** | Option<**i32**> | | [optional] +**drain_timeout** | Option<**i64**> | | [optional] +**hardware** | [**Vec**](AdminHardware.md) | | +**max_count** | Option<**i32**> | | [optional] +**pool_type** | [**crate::models::AdminPoolType**](AdminPoolType.md) | | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/sdks/full/rust/src/apis/admin_clusters_datacenters_api.rs b/sdks/full/rust/src/apis/admin_clusters_datacenters_api.rs index a54f6146bf..3d94683d54 100644 --- a/sdks/full/rust/src/apis/admin_clusters_datacenters_api.rs +++ b/sdks/full/rust/src/apis/admin_clusters_datacenters_api.rs @@ -54,6 +54,19 @@ pub enum AdminClustersDatacentersTaintError { UnknownValue(serde_json::Value), } +/// struct for typed errors of method [`admin_clusters_datacenters_update`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum AdminClustersDatacentersUpdateError { + Status400(crate::models::ErrorBody), + Status403(crate::models::ErrorBody), + Status404(crate::models::ErrorBody), + Status408(crate::models::ErrorBody), + Status429(crate::models::ErrorBody), + Status500(crate::models::ErrorBody), + UnknownValue(serde_json::Value), +} + pub async fn admin_clusters_datacenters_create(configuration: &configuration::Configuration, cluster_id: &str, admin_clusters_datacenters_create_request: crate::models::AdminClustersDatacentersCreateRequest) -> Result> { let local_var_configuration = configuration; @@ -147,3 +160,34 @@ pub async fn admin_clusters_datacenters_taint(configuration: &configuration::Con } } +pub async fn admin_clusters_datacenters_update(configuration: &configuration::Configuration, cluster_id: &str, datacenter_id: &str, admin_clusters_datacenters_update_request: crate::models::AdminClustersDatacentersUpdateRequest) -> Result<(), Error> { + let local_var_configuration = configuration; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!("{}/admin/clusters/{cluster_id}/datacenters/{datacenter_id}", local_var_configuration.base_path, cluster_id=crate::apis::urlencode(cluster_id), datacenter_id=crate::apis::urlencode(datacenter_id)); + let mut local_var_req_builder = local_var_client.request(reqwest::Method::PATCH, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_token) = local_var_configuration.bearer_access_token { + local_var_req_builder = local_var_req_builder.bearer_auth(local_var_token.to_owned()); + }; + local_var_req_builder = local_var_req_builder.json(&admin_clusters_datacenters_update_request); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + Ok(()) + } else { + let local_var_entity: Option = serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity }; + Err(Error::ResponseError(local_var_error)) + } +} + diff --git a/sdks/full/rust/src/models/admin_clusters_datacenters_update_request.rs b/sdks/full/rust/src/models/admin_clusters_datacenters_update_request.rs new file mode 100644 index 0000000000..fb10e610ef --- /dev/null +++ b/sdks/full/rust/src/models/admin_clusters_datacenters_update_request.rs @@ -0,0 +1,40 @@ +/* + * Rivet API + * + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 0.0.1 + * + * Generated by: https://openapi-generator.tech + */ + + + + +#[derive(Clone, Debug, PartialEq, Default, Serialize, Deserialize)] +pub struct AdminClustersDatacentersUpdateRequest { + #[serde(rename = "desired_count", skip_serializing_if = "Option::is_none")] + pub desired_count: Option, + #[serde(rename = "drain_timeout", skip_serializing_if = "Option::is_none")] + pub drain_timeout: Option, + #[serde(rename = "hardware")] + pub hardware: Vec, + #[serde(rename = "max_count", skip_serializing_if = "Option::is_none")] + pub max_count: Option, + #[serde(rename = "pool_type")] + pub pool_type: crate::models::AdminPoolType, +} + +impl AdminClustersDatacentersUpdateRequest { + pub fn new(hardware: Vec, pool_type: crate::models::AdminPoolType) -> AdminClustersDatacentersUpdateRequest { + AdminClustersDatacentersUpdateRequest { + desired_count: None, + drain_timeout: None, + hardware, + max_count: None, + pool_type, + } + } +} + + diff --git a/sdks/full/rust/src/models/mod.rs b/sdks/full/rust/src/models/mod.rs index d9e112b609..3abe695bdd 100644 --- a/sdks/full/rust/src/models/mod.rs +++ b/sdks/full/rust/src/models/mod.rs @@ -12,6 +12,8 @@ pub mod admin_clusters_datacenters_create_response; pub use self::admin_clusters_datacenters_create_response::AdminClustersDatacentersCreateResponse; pub mod admin_clusters_datacenters_list_response; pub use self::admin_clusters_datacenters_list_response::AdminClustersDatacentersListResponse; +pub mod admin_clusters_datacenters_update_request; +pub use self::admin_clusters_datacenters_update_request::AdminClustersDatacentersUpdateRequest; pub mod admin_clusters_get_server_ips_response; pub use self::admin_clusters_get_server_ips_response::AdminClustersGetServerIpsResponse; pub mod admin_clusters_list_response; diff --git a/sdks/full/typescript/archive.tgz b/sdks/full/typescript/archive.tgz index 4df7d3a65f..19b1626280 100644 --- a/sdks/full/typescript/archive.tgz +++ b/sdks/full/typescript/archive.tgz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:df3f7ab36cd3c462670949976ac2d0263e74e8a41a9a3fb016ccf4f2a2cfa383 -size 633132 +oid sha256:38f957dfa8a9d28fd62ba9f28d8aeaa7c524b7010cb25b5a44236eecba7caa00 +size 633868 diff --git a/sdks/full/typescript/src/api/resources/admin/resources/clusters/resources/datacenters/client/Client.ts b/sdks/full/typescript/src/api/resources/admin/resources/clusters/resources/datacenters/client/Client.ts index fde4baaaf4..f4fb82870f 100644 --- a/sdks/full/typescript/src/api/resources/admin/resources/clusters/resources/datacenters/client/Client.ts +++ b/sdks/full/typescript/src/api/resources/admin/resources/clusters/resources/datacenters/client/Client.ts @@ -270,6 +270,125 @@ export class Datacenters { } } + /** + * @throws {@link Rivet.InternalError} + * @throws {@link Rivet.RateLimitError} + * @throws {@link Rivet.ForbiddenError} + * @throws {@link Rivet.UnauthorizedError} + * @throws {@link Rivet.NotFoundError} + * @throws {@link Rivet.BadRequestError} + */ + public async update( + clusterId: string, + datacenterId: string, + request: Rivet.admin.clusters.datacenters.UpdateRequest, + requestOptions?: Datacenters.RequestOptions + ): Promise { + const _response = await (this._options.fetcher ?? core.fetcher)({ + url: urlJoin( + (await core.Supplier.get(this._options.environment)) ?? environments.RivetEnvironment.Production, + `/admin/clusters/${clusterId}/datacenters/${datacenterId}` + ), + method: "PATCH", + headers: { + Authorization: await this._getAuthorizationHeader(), + }, + contentType: "application/json", + body: await serializers.admin.clusters.datacenters.UpdateRequest.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + }), + timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 180000, + maxRetries: requestOptions?.maxRetries, + }); + if (_response.ok) { + return; + } + + if (_response.error.reason === "status-code") { + switch (_response.error.statusCode) { + case 500: + throw new Rivet.InternalError( + await serializers.ErrorBody.parseOrThrow(_response.error.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }) + ); + case 429: + throw new Rivet.RateLimitError( + await serializers.ErrorBody.parseOrThrow(_response.error.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }) + ); + case 403: + throw new Rivet.ForbiddenError( + await serializers.ErrorBody.parseOrThrow(_response.error.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }) + ); + case 408: + throw new Rivet.UnauthorizedError( + await serializers.ErrorBody.parseOrThrow(_response.error.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }) + ); + case 404: + throw new Rivet.NotFoundError( + await serializers.ErrorBody.parseOrThrow(_response.error.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }) + ); + case 400: + throw new Rivet.BadRequestError( + await serializers.ErrorBody.parseOrThrow(_response.error.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }) + ); + default: + throw new errors.RivetError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + }); + } + } + + switch (_response.error.reason) { + case "non-json": + throw new errors.RivetError({ + statusCode: _response.error.statusCode, + body: _response.error.rawBody, + }); + case "timeout": + throw new errors.RivetTimeoutError(); + case "unknown": + throw new errors.RivetError({ + message: _response.error.errorMessage, + }); + } + } + /** * @throws {@link Rivet.InternalError} * @throws {@link Rivet.RateLimitError} diff --git a/svc/api/admin/src/route/clusters/datacenters.rs b/svc/api/admin/src/route/clusters/datacenters.rs index 513e4d0336..e7799c6e01 100644 --- a/svc/api/admin/src/route/clusters/datacenters.rs +++ b/svc/api/admin/src/route/clusters/datacenters.rs @@ -136,3 +136,50 @@ pub async fn taint( Ok(json!({})) } + +// MARK: PUT /admin/clusters/{cluster_id}/datacenters/{datacenter_id} +pub async fn update( + ctx: Ctx, + cluster_id: Uuid, + datacenter_id: Uuid, + body: models::AdminClustersDatacentersUpdateRequest, +) -> GlobalResult { + // Make sure that the datacenter is part of the cluster + let datacenters = op!([ctx] cluster_datacenter_get { + datacenter_ids: vec![datacenter_id.into()], + }) + .await? + .datacenters; + + let datacenter = match datacenters.first() { + Some(d) => d, + None => bail_with!(CLUSTER_DATACENTER_NOT_FOUND), + }; + + if datacenter.cluster_id != Some(cluster_id.into()) { + bail_with!(CLUSTER_DATACENTER_NOT_IN_CLUSTER); + } + + let pools = vec![cluster::msg::datacenter_update::PoolUpdate { + pool_type: backend::cluster::PoolType::api_from(body.pool_type) as i32, + hardware: body + .hardware + .iter() + .map(|h| backend::cluster::Hardware { + provider_hardware: h.provider_hardware.clone(), + }) + .collect(), + desired_count: body.desired_count.map(|c| c as u32), + max_count: body.max_count.map(|c| c as u32), + drain_timeout: body.drain_timeout.map(|d| d as u64), + }]; + + msg!([ctx] cluster::msg::datacenter_update(datacenter_id) -> cluster::msg::datacenter_scale { + datacenter_id: Some(datacenter_id.into()), + pools: pools, + }) + .await + .unwrap(); + + Ok(json!({})) +} diff --git a/svc/api/admin/src/route/mod.rs b/svc/api/admin/src/route/mod.rs index f9dccb6e7a..af83cd417d 100644 --- a/svc/api/admin/src/route/mod.rs +++ b/svc/api/admin/src/route/mod.rs @@ -47,6 +47,12 @@ define_router! { ), }, + "clusters" / Uuid / "datacenters" / Uuid : { + PATCH: clusters::datacenters::update( + body: models::AdminClustersDatacentersUpdateRequest, + ), + }, + "clusters" / Uuid / "datacenters" / Uuid / "taint": { GET: clusters::datacenters::taint(), },