Skip to main content

timeweb_rs/apis/
dedicated_servers_api.rs

1/*
2 * Документация публичного API
3 *
4 * # Введение API Timeweb Cloud позволяет вам управлять ресурсами в облаке программным способом с использованием обычных HTTP-запросов.  Множество функций, которые доступны в панели управления Timeweb Cloud, также доступны через API, что позволяет вам автоматизировать ваши собственные сценарии.  В этой документации сперва будет описан общий дизайн и принципы работы API, а после этого конкретные конечные точки. Также будут приведены примеры запросов к ним.   ## Запросы Запросы должны выполняться по протоколу `HTTPS`, чтобы гарантировать шифрование транзакций. Поддерживаются следующие методы запроса: |Метод|Применение| |--- |--- | |GET|Извлекает данные о коллекциях и отдельных ресурсах.| |POST|Для коллекций создает новый ресурс этого типа. Также используется для выполнения действий с конкретным ресурсом.| |PUT|Обновляет существующий ресурс.| |PATCH|Некоторые ресурсы поддерживают частичное обновление, то есть обновление только части атрибутов ресурса, в этом случае вместо метода PUT будет использован PATCH.| |DELETE|Удаляет ресурс.|  Методы `POST`, `PUT` и `PATCH` могут включать объект в тело запроса с типом содержимого `application/json`.  ### Параметры в запросах Некоторые коллекции поддерживают пагинацию, поиск или сортировку в запросах. В параметрах запроса требуется передать: - `limit` — обозначает количество записей, которое необходимо вернуть  - `offset` — указывает на смещение, относительно начала списка  - `search` — позволяет указать набор символов для поиска  - `sort` — можно задать правило сортировки коллекции  ## Ответы Запросы вернут один из следующих кодов состояния ответа HTTP:  |Статус|Описание| |--- |--- | |200 OK|Действие с ресурсом было выполнено успешно.| |201 Created|Ресурс был успешно создан. При этом ресурс может быть как уже готовым к использованию, так и находиться в процессе запуска.| |204 No Content|Действие с ресурсом было выполнено успешно, и ответ не содержит дополнительной информации в теле.| |400 Bad Request|Был отправлен неверный запрос, например, в нем отсутствуют обязательные параметры и т. д. Тело ответа будет содержать дополнительную информацию об ошибке.| |401 Unauthorized|Ошибка аутентификации.| |403 Forbidden|Аутентификация прошла успешно, но недостаточно прав для выполнения действия.| |404 Not Found|Запрашиваемый ресурс не найден.| |409 Conflict|Запрос конфликтует с текущим состоянием.| |423 Locked|Ресурс из запроса заблокирован от применения к нему указанного метода.| |429 Too Many Requests|Был достигнут лимит по количеству запросов в единицу времени.| |500 Internal Server Error|При выполнении запроса произошла какая-то внутренняя ошибка. Чтобы решить эту проблему, лучше всего создать тикет в панели управления.|  ### Структура успешного ответа Все конечные точки будут возвращать данные в формате `JSON`. Ответы на `GET`-запросы будут иметь на верхнем уровне следующую структуру атрибутов:  |Название поля|Тип|Описание| |--- |--- |--- | |[entity_name]|object, object[], string[], number[], boolean|Динамическое поле, которое будет меняться в зависимости от запрашиваемого ресурса и будет содержать все атрибуты, необходимые для описания этого ресурса. Например, при запросе списка баз данных будет возвращаться поле `dbs`, а при запросе конкретного облачного сервера `server`. Для некоторых конечных точек в ответе может возвращаться сразу несколько ресурсов.| |meta|object|Опционально. Объект, который содержит вспомогательную информацию о ресурсе. Чаще всего будет встречаться при запросе коллекций и содержать поле `total`, которое будет указывать на количество элементов в коллекции.| |response_id|string|Опционально. В большинстве случаев в ответе будет содержаться ID ответа в формате UUIDv4, который однозначно указывает на ваш запрос внутри нашей системы. Если вам потребуется задать вопрос нашей поддержке, приложите к вопросу этот ID— так мы сможем найти ответ на него намного быстрее. Также вы можете использовать этот ID, чтобы убедиться, что это новый ответ на запрос и результат не был получен из кэша.|  Пример запроса на получение списка SSH-ключей: ```     HTTP/2.0 200 OK     {       \"ssh_keys\":[           {             \"body\":\"ssh-rsa AAAAB3NzaC1sdfghjkOAsBwWhs= example@device.local\",             \"created_at\":\"2021-09-15T19:52:27Z\",             \"expired_at\":null,             \"id\":5297,             \"is_default\":false,             \"name\":\"example@device.local\",             \"used_at\":null,             \"used_by\":[]           }       ],       \"meta\":{           \"total\":1       },       \"response_id\":\"94608d15-8672-4eed-8ab6-28bd6fa3cdf7\"     } ```  ### Структура ответа с ошибкой |Название поля|Тип|Описание| |--- |--- |--- | |status_code|number|Короткий числовой идентификатор ошибки.| |error_code|string|Короткий текстовый идентификатор ошибки, который уточняет числовой идентификатор и удобен для программной обработки. Самый простой пример — это код `not_found` для ошибки 404.| |message|string, string[]|Опционально. В большинстве случаев в ответе будет содержаться человекочитаемое подробное описание ошибки или ошибок, которые помогут понять, что нужно исправить.| |response_id|string|Опционально. В большинстве случае в ответе будет содержаться ID ответа в формате UUIDv4, который однозначно указывает на ваш запрос внутри нашей системы. Если вам потребуется задать вопрос нашей поддержке, приложите к вопросу этот ID — так мы сможем найти ответ на него намного быстрее.|  Пример: ```     HTTP/2.0 403 Forbidden     {       \"status_code\": 403,       \"error_code\":  \"forbidden\",       \"message\":     \"You do not have access for the attempted action\",       \"response_id\": \"94608d15-8672-4eed-8ab6-28bd6fa3cdf7\"     } ```  ## Статусы ресурсов Важно учесть, что при создании большинства ресурсов внутри платформы вам будет сразу возвращен ответ от сервера со статусом `200 OK` или `201 Created` и ID созданного ресурса в теле ответа, но при этом этот ресурс может быть ещё в *состоянии запуска*.  Для того чтобы понять, в каком состоянии сейчас находится ваш ресурс, мы добавили поле `status` в ответ на получение информации о ресурсе.  Список статусов будет отличаться в зависимости от типа ресурса. Увидеть поддерживаемый список статусов вы сможете в описании каждого конкретного ресурса.     ## Ограничение скорости запросов (Rate Limiting) Чтобы обеспечить стабильность для всех пользователей, Timeweb Cloud защищает API от всплесков входящего трафика, анализируя количество запросов c каждого аккаунта к каждой конечной точке.  Если ваше приложение отправляет более 20 запросов в секунду на одну конечную точку, то для этого запроса API может вернуть код состояния HTTP `429 Too Many Requests`.   ## Аутентификация Доступ к API осуществляется с помощью JWT-токена. Токенами можно управлять внутри панели управления Timeweb Cloud в разделе *API и Terraform*.  Токен необходимо передавать в заголовке каждого запроса в формате: ```   Authorization: Bearer $TIMEWEB_CLOUD_TOKEN ```  ## Формат примеров API Примеры в этой документации описаны с помощью `curl`, HTTP-клиента командной строки. На компьютерах `Linux` и `macOS` обычно по умолчанию установлен `curl`, и он доступен для загрузки на всех популярных платформах, включая `Windows`.  Каждый пример разделен на несколько строк символом `\\`, который совместим с `bash`. Типичный пример выглядит так: ```   curl -X PATCH      -H \"Content-Type: application/json\"      -H \"Authorization: Bearer $TIMEWEB_CLOUD_TOKEN\"      -d '{\"name\":\"Cute Corvus\",\"comment\":\"Development Server\"}'      \"https://api.timeweb.cloud/api/v1/dedicated/1051\" ``` - Параметр `-X` задает метод запроса. Для согласованности метод будет указан во всех примерах, даже если он явно не требуется для методов `GET`. - Строки `-H` задают требуемые HTTP-заголовки. - Примеры, для которых требуется объект JSON в теле запроса, передают требуемые данные через параметр `-d`.  Чтобы использовать приведенные примеры, не подставляя каждый раз в них свой токен, вы можете добавить токен один раз в переменные окружения в вашей консоли. Например, на `Linux` это можно сделать с помощью команды:  ``` TIMEWEB_CLOUD_TOKEN=\"token\" ```  После этого токен будет автоматически подставляться в ваши запросы.  Обратите внимание, что все значения в этой документации являются примерами. Не полагайтесь на IDы операционных систем, тарифов и т.д., используемые в примерах. Используйте соответствующую конечную точку для получения значений перед созданием ресурсов.   ## Версионирование API построено согласно принципам [семантического версионирования](https://semver.org/lang/ru). Это значит, что мы гарантируем обратную совместимость всех изменений в пределах одной мажорной версии.  Мажорная версия каждой конечной точки обозначается в пути запроса, например, запрос `/api/v1/servers` указывает, что этот метод имеет версию 1.
5 *
6 * The version of the OpenAPI document: 1.0.0
7 * Contact: info@timeweb.cloud
8 * Generated by: https://openapi-generator.tech
9 */
10
11use reqwest;
12use serde::{Deserialize, Serialize, de::Error as _};
13
14use super::{ContentType, Error, configuration};
15use crate::{apis::ResponseContent, models};
16
17/// struct for typed errors of method [`create_dedicated_server`]
18#[derive(Debug, Clone, Serialize, Deserialize)]
19#[serde(untagged)]
20pub enum CreateDedicatedServerError {
21    Status400(models::GetFinances400Response),
22    Status401(models::GetFinances401Response),
23    Status403(models::GetAccountStatus403Response),
24    Status404(models::GetImage404Response),
25    Status429(models::GetFinances429Response),
26    Status500(models::GetFinances500Response),
27    UnknownValue(serde_json::Value)
28}
29
30/// struct for typed errors of method [`delete_dedicated_server`]
31#[derive(Debug, Clone, Serialize, Deserialize)]
32#[serde(untagged)]
33pub enum DeleteDedicatedServerError {
34    Status400(models::GetFinances400Response),
35    Status401(models::GetFinances401Response),
36    Status403(models::GetAccountStatus403Response),
37    Status404(models::GetImage404Response),
38    Status429(models::GetFinances429Response),
39    Status500(models::GetFinances500Response),
40    UnknownValue(serde_json::Value)
41}
42
43/// struct for typed errors of method [`get_dedicated_server`]
44#[derive(Debug, Clone, Serialize, Deserialize)]
45#[serde(untagged)]
46pub enum GetDedicatedServerError {
47    Status400(models::GetFinances400Response),
48    Status401(models::GetFinances401Response),
49    Status403(models::GetAccountStatus403Response),
50    Status404(models::GetImage404Response),
51    Status429(models::GetFinances429Response),
52    Status500(models::GetFinances500Response),
53    UnknownValue(serde_json::Value)
54}
55
56/// struct for typed errors of method
57/// [`get_dedicated_server_preset_additional_services`]
58#[derive(Debug, Clone, Serialize, Deserialize)]
59#[serde(untagged)]
60pub enum GetDedicatedServerPresetAdditionalServicesError {
61    Status400(models::GetFinances400Response),
62    Status401(models::GetFinances401Response),
63    Status403(models::GetAccountStatus403Response),
64    Status404(models::GetImage404Response),
65    Status429(models::GetFinances429Response),
66    Status500(models::GetFinances500Response),
67    UnknownValue(serde_json::Value)
68}
69
70/// struct for typed errors of method [`get_dedicated_servers`]
71#[derive(Debug, Clone, Serialize, Deserialize)]
72#[serde(untagged)]
73pub enum GetDedicatedServersError {
74    Status400(models::GetFinances400Response),
75    Status401(models::GetFinances401Response),
76    Status403(models::GetAccountStatus403Response),
77    Status404(models::GetImage404Response),
78    Status429(models::GetFinances429Response),
79    Status500(models::GetFinances500Response),
80    UnknownValue(serde_json::Value)
81}
82
83/// struct for typed errors of method [`get_dedicated_servers_presets`]
84#[derive(Debug, Clone, Serialize, Deserialize)]
85#[serde(untagged)]
86pub enum GetDedicatedServersPresetsError {
87    Status400(models::GetFinances400Response),
88    Status401(models::GetFinances401Response),
89    Status403(models::GetAccountStatus403Response),
90    Status404(models::GetImage404Response),
91    Status429(models::GetFinances429Response),
92    Status500(models::GetFinances500Response),
93    UnknownValue(serde_json::Value)
94}
95
96/// struct for typed errors of method [`update_dedicated_server`]
97#[derive(Debug, Clone, Serialize, Deserialize)]
98#[serde(untagged)]
99pub enum UpdateDedicatedServerError {
100    Status400(models::GetFinances400Response),
101    Status401(models::GetFinances401Response),
102    Status403(models::GetAccountStatus403Response),
103    Status404(models::GetImage404Response),
104    Status429(models::GetFinances429Response),
105    Status500(models::GetFinances500Response),
106    UnknownValue(serde_json::Value)
107}
108
109/// Чтобы создать выделенный сервер, отправьте POST-запрос в
110/// `api/v1/dedicated-servers`, задав необходимые атрибуты.  Выделенный сервер
111/// будет создан с использованием предоставленной информации. Тело ответа будет
112/// содержать объект JSON с информацией о созданном выделенном сервере.
113pub async fn create_dedicated_server(
114    configuration: &configuration::Configuration,
115    create_dedicated_server: models::CreateDedicatedServer
116) -> Result<models::CreateDedicatedServer201Response, Error<CreateDedicatedServerError>> {
117    // add a prefix to parameters to efficiently prevent name collisions
118    let p_body_create_dedicated_server = create_dedicated_server;
119
120    let uri_str = format!("{}/api/v1/dedicated-servers", configuration.base_path);
121    let mut req_builder = configuration
122        .client
123        .request(reqwest::Method::POST, &uri_str);
124
125    if let Some(ref user_agent) = configuration.user_agent {
126        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
127    }
128    if let Some(ref token) = configuration.bearer_access_token {
129        req_builder = req_builder.bearer_auth(token.to_owned());
130    };
131    req_builder = req_builder.json(&p_body_create_dedicated_server);
132
133    let req = req_builder.build()?;
134    let resp = configuration.client.execute(req).await?;
135
136    let status = resp.status();
137    let content_type = resp
138        .headers()
139        .get("content-type")
140        .and_then(|v| v.to_str().ok())
141        .unwrap_or("application/octet-stream");
142    let content_type = super::ContentType::from(content_type);
143
144    if !status.is_client_error() && !status.is_server_error() {
145        let content = resp.text().await?;
146        match content_type {
147            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
148            ContentType::Text => {
149                return Err(Error::from(serde_json::Error::custom(
150                    "Received `text/plain` content type response that cannot be converted to `models::CreateDedicatedServer201Response`"
151                )));
152            }
153            ContentType::Unsupported(unknown_type) => {
154                return Err(Error::from(serde_json::Error::custom(format!(
155                    "Received `{unknown_type}` content type response that cannot be converted to `models::CreateDedicatedServer201Response`"
156                ))));
157            }
158        }
159    } else {
160        let content = resp.text().await?;
161        let entity: Option<CreateDedicatedServerError> = serde_json::from_str(&content).ok();
162        Err(Error::ResponseError(ResponseContent {
163            status,
164            content,
165            entity
166        }))
167    }
168}
169
170/// Чтобы удалить выделенный сервер, отправьте запрос DELETE в
171/// `api/v1/dedicated-servers/{dedicated_id}`.
172pub async fn delete_dedicated_server(
173    configuration: &configuration::Configuration,
174    dedicated_id: i32
175) -> Result<(), Error<DeleteDedicatedServerError>> {
176    // add a prefix to parameters to efficiently prevent name collisions
177    let p_path_dedicated_id = dedicated_id;
178
179    let uri_str = format!(
180        "{}/api/v1/dedicated-servers/{dedicated_id}",
181        configuration.base_path,
182        dedicated_id = p_path_dedicated_id
183    );
184    let mut req_builder = configuration
185        .client
186        .request(reqwest::Method::DELETE, &uri_str);
187
188    if let Some(ref user_agent) = configuration.user_agent {
189        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
190    }
191    if let Some(ref token) = configuration.bearer_access_token {
192        req_builder = req_builder.bearer_auth(token.to_owned());
193    };
194
195    let req = req_builder.build()?;
196    let resp = configuration.client.execute(req).await?;
197
198    let status = resp.status();
199
200    if !status.is_client_error() && !status.is_server_error() {
201        Ok(())
202    } else {
203        let content = resp.text().await?;
204        let entity: Option<DeleteDedicatedServerError> = serde_json::from_str(&content).ok();
205        Err(Error::ResponseError(ResponseContent {
206            status,
207            content,
208            entity
209        }))
210    }
211}
212
213/// Чтобы отобразить информацию об отдельном выделенном сервере, отправьте
214/// запрос GET на `api/v1/dedicated-servers/{dedicated_id}`.
215pub async fn get_dedicated_server(
216    configuration: &configuration::Configuration,
217    dedicated_id: i32
218) -> Result<models::CreateDedicatedServer201Response, Error<GetDedicatedServerError>> {
219    // add a prefix to parameters to efficiently prevent name collisions
220    let p_path_dedicated_id = dedicated_id;
221
222    let uri_str = format!(
223        "{}/api/v1/dedicated-servers/{dedicated_id}",
224        configuration.base_path,
225        dedicated_id = p_path_dedicated_id
226    );
227    let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
228
229    if let Some(ref user_agent) = configuration.user_agent {
230        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
231    }
232    if let Some(ref token) = configuration.bearer_access_token {
233        req_builder = req_builder.bearer_auth(token.to_owned());
234    };
235
236    let req = req_builder.build()?;
237    let resp = configuration.client.execute(req).await?;
238
239    let status = resp.status();
240    let content_type = resp
241        .headers()
242        .get("content-type")
243        .and_then(|v| v.to_str().ok())
244        .unwrap_or("application/octet-stream");
245    let content_type = super::ContentType::from(content_type);
246
247    if !status.is_client_error() && !status.is_server_error() {
248        let content = resp.text().await?;
249        match content_type {
250            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
251            ContentType::Text => {
252                return Err(Error::from(serde_json::Error::custom(
253                    "Received `text/plain` content type response that cannot be converted to `models::CreateDedicatedServer201Response`"
254                )));
255            }
256            ContentType::Unsupported(unknown_type) => {
257                return Err(Error::from(serde_json::Error::custom(format!(
258                    "Received `{unknown_type}` content type response that cannot be converted to `models::CreateDedicatedServer201Response`"
259                ))));
260            }
261        }
262    } else {
263        let content = resp.text().await?;
264        let entity: Option<GetDedicatedServerError> = serde_json::from_str(&content).ok();
265        Err(Error::ResponseError(ResponseContent {
266            status,
267            content,
268            entity
269        }))
270    }
271}
272
273/// Чтобы получить список всех дополнительных услуг для выделенных серверов,
274/// отправьте GET-запрос на
275/// `/api/v1/presets/dedicated-servers/{preset_id}/additional-services`.
276pub async fn get_dedicated_server_preset_additional_services(
277    configuration: &configuration::Configuration,
278    preset_id: i32
279) -> Result<
280    models::GetDedicatedServerPresetAdditionalServices200Response,
281    Error<GetDedicatedServerPresetAdditionalServicesError>
282> {
283    // add a prefix to parameters to efficiently prevent name collisions
284    let p_path_preset_id = preset_id;
285
286    let uri_str = format!(
287        "{}/api/v1/presets/dedicated-servers/{preset_id}/additional-services",
288        configuration.base_path,
289        preset_id = p_path_preset_id
290    );
291    let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
292
293    if let Some(ref user_agent) = configuration.user_agent {
294        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
295    }
296    if let Some(ref token) = configuration.bearer_access_token {
297        req_builder = req_builder.bearer_auth(token.to_owned());
298    };
299
300    let req = req_builder.build()?;
301    let resp = configuration.client.execute(req).await?;
302
303    let status = resp.status();
304    let content_type = resp
305        .headers()
306        .get("content-type")
307        .and_then(|v| v.to_str().ok())
308        .unwrap_or("application/octet-stream");
309    let content_type = super::ContentType::from(content_type);
310
311    if !status.is_client_error() && !status.is_server_error() {
312        let content = resp.text().await?;
313        match content_type {
314            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
315            ContentType::Text => {
316                return Err(Error::from(serde_json::Error::custom(
317                    "Received `text/plain` content type response that cannot be converted to `models::GetDedicatedServerPresetAdditionalServices200Response`"
318                )));
319            }
320            ContentType::Unsupported(unknown_type) => {
321                return Err(Error::from(serde_json::Error::custom(format!(
322                    "Received `{unknown_type}` content type response that cannot be converted to `models::GetDedicatedServerPresetAdditionalServices200Response`"
323                ))));
324            }
325        }
326    } else {
327        let content = resp.text().await?;
328        let entity: Option<GetDedicatedServerPresetAdditionalServicesError> =
329            serde_json::from_str(&content).ok();
330        Err(Error::ResponseError(ResponseContent {
331            status,
332            content,
333            entity
334        }))
335    }
336}
337
338/// Чтобы получить список всех выделенных серверов на вашем аккаунте, отправьте
339/// GET-запрос на `/api/v1/dedicated-servers`.   Тело ответа будет представлять
340/// собой объект JSON с ключом `dedicated_servers`.
341pub async fn get_dedicated_servers(
342    configuration: &configuration::Configuration
343) -> Result<models::GetDedicatedServers200Response, Error<GetDedicatedServersError>> {
344    let uri_str = format!("{}/api/v1/dedicated-servers", configuration.base_path);
345    let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
346
347    if let Some(ref user_agent) = configuration.user_agent {
348        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
349    }
350    if let Some(ref token) = configuration.bearer_access_token {
351        req_builder = req_builder.bearer_auth(token.to_owned());
352    };
353
354    let req = req_builder.build()?;
355    let resp = configuration.client.execute(req).await?;
356
357    let status = resp.status();
358    let content_type = resp
359        .headers()
360        .get("content-type")
361        .and_then(|v| v.to_str().ok())
362        .unwrap_or("application/octet-stream");
363    let content_type = super::ContentType::from(content_type);
364
365    if !status.is_client_error() && !status.is_server_error() {
366        let content = resp.text().await?;
367        match content_type {
368            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
369            ContentType::Text => {
370                return Err(Error::from(serde_json::Error::custom(
371                    "Received `text/plain` content type response that cannot be converted to `models::GetDedicatedServers200Response`"
372                )));
373            }
374            ContentType::Unsupported(unknown_type) => {
375                return Err(Error::from(serde_json::Error::custom(format!(
376                    "Received `{unknown_type}` content type response that cannot be converted to `models::GetDedicatedServers200Response`"
377                ))));
378            }
379        }
380    } else {
381        let content = resp.text().await?;
382        let entity: Option<GetDedicatedServersError> = serde_json::from_str(&content).ok();
383        Err(Error::ResponseError(ResponseContent {
384            status,
385            content,
386            entity
387        }))
388    }
389}
390
391/// Чтобы получить список всех тарифов выделенных серверов, отправьте GET-запрос
392/// на `/api/v1/presets/dedicated-servers`.
393pub async fn get_dedicated_servers_presets(
394    configuration: &configuration::Configuration,
395    location: Option<&str>
396) -> Result<models::GetDedicatedServersPresets200Response, Error<GetDedicatedServersPresetsError>>
397{
398    // add a prefix to parameters to efficiently prevent name collisions
399    let p_query_location = location;
400
401    let uri_str = format!(
402        "{}/api/v1/presets/dedicated-servers",
403        configuration.base_path
404    );
405    let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
406
407    if let Some(ref param_value) = p_query_location {
408        req_builder = req_builder.query(&[("location", &param_value.to_string())]);
409    }
410    if let Some(ref user_agent) = configuration.user_agent {
411        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
412    }
413    if let Some(ref token) = configuration.bearer_access_token {
414        req_builder = req_builder.bearer_auth(token.to_owned());
415    };
416
417    let req = req_builder.build()?;
418    let resp = configuration.client.execute(req).await?;
419
420    let status = resp.status();
421    let content_type = resp
422        .headers()
423        .get("content-type")
424        .and_then(|v| v.to_str().ok())
425        .unwrap_or("application/octet-stream");
426    let content_type = super::ContentType::from(content_type);
427
428    if !status.is_client_error() && !status.is_server_error() {
429        let content = resp.text().await?;
430        match content_type {
431            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
432            ContentType::Text => {
433                return Err(Error::from(serde_json::Error::custom(
434                    "Received `text/plain` content type response that cannot be converted to `models::GetDedicatedServersPresets200Response`"
435                )));
436            }
437            ContentType::Unsupported(unknown_type) => {
438                return Err(Error::from(serde_json::Error::custom(format!(
439                    "Received `{unknown_type}` content type response that cannot be converted to `models::GetDedicatedServersPresets200Response`"
440                ))));
441            }
442        }
443    } else {
444        let content = resp.text().await?;
445        let entity: Option<GetDedicatedServersPresetsError> = serde_json::from_str(&content).ok();
446        Err(Error::ResponseError(ResponseContent {
447            status,
448            content,
449            entity
450        }))
451    }
452}
453
454/// Чтобы обновить только определенные атрибуты выделенного сервера, отправьте
455/// запрос PATCH в `api/v1/dedicated-servers/{dedicated_id}`.
456pub async fn update_dedicated_server(
457    configuration: &configuration::Configuration,
458    dedicated_id: i32,
459    update_dedicated_server_request: Option<models::UpdateDedicatedServerRequest>
460) -> Result<models::CreateDedicatedServer201Response, Error<UpdateDedicatedServerError>> {
461    // add a prefix to parameters to efficiently prevent name collisions
462    let p_path_dedicated_id = dedicated_id;
463    let p_body_update_dedicated_server_request = update_dedicated_server_request;
464
465    let uri_str = format!(
466        "{}/api/v1/dedicated-servers/{dedicated_id}",
467        configuration.base_path,
468        dedicated_id = p_path_dedicated_id
469    );
470    let mut req_builder = configuration
471        .client
472        .request(reqwest::Method::PATCH, &uri_str);
473
474    if let Some(ref user_agent) = configuration.user_agent {
475        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
476    }
477    if let Some(ref token) = configuration.bearer_access_token {
478        req_builder = req_builder.bearer_auth(token.to_owned());
479    };
480    req_builder = req_builder.json(&p_body_update_dedicated_server_request);
481
482    let req = req_builder.build()?;
483    let resp = configuration.client.execute(req).await?;
484
485    let status = resp.status();
486    let content_type = resp
487        .headers()
488        .get("content-type")
489        .and_then(|v| v.to_str().ok())
490        .unwrap_or("application/octet-stream");
491    let content_type = super::ContentType::from(content_type);
492
493    if !status.is_client_error() && !status.is_server_error() {
494        let content = resp.text().await?;
495        match content_type {
496            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
497            ContentType::Text => {
498                return Err(Error::from(serde_json::Error::custom(
499                    "Received `text/plain` content type response that cannot be converted to `models::CreateDedicatedServer201Response`"
500                )));
501            }
502            ContentType::Unsupported(unknown_type) => {
503                return Err(Error::from(serde_json::Error::custom(format!(
504                    "Received `{unknown_type}` content type response that cannot be converted to `models::CreateDedicatedServer201Response`"
505                ))));
506            }
507        }
508    } else {
509        let content = resp.text().await?;
510        let entity: Option<UpdateDedicatedServerError> = serde_json::from_str(&content).ok();
511        Err(Error::ResponseError(ResponseContent {
512            status,
513            content,
514            entity
515        }))
516    }
517}