Skip to main content

timeweb_rs/apis/
balancers_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 [`add_ips_to_balancer`]
18#[derive(Debug, Clone, Serialize, Deserialize)]
19#[serde(untagged)]
20pub enum AddIpsToBalancerError {
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 [`create_balancer`]
31#[derive(Debug, Clone, Serialize, Deserialize)]
32#[serde(untagged)]
33pub enum CreateBalancerError {
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 [`create_balancer_rule`]
44#[derive(Debug, Clone, Serialize, Deserialize)]
45#[serde(untagged)]
46pub enum CreateBalancerRuleError {
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 [`delete_balancer`]
57#[derive(Debug, Clone, Serialize, Deserialize)]
58#[serde(untagged)]
59pub enum DeleteBalancerError {
60    Status400(models::GetFinances400Response),
61    Status401(models::GetFinances401Response),
62    Status403(models::GetAccountStatus403Response),
63    Status404(models::GetImage404Response),
64    Status429(models::GetFinances429Response),
65    Status500(models::GetFinances500Response),
66    UnknownValue(serde_json::Value)
67}
68
69/// struct for typed errors of method [`delete_balancer_rule`]
70#[derive(Debug, Clone, Serialize, Deserialize)]
71#[serde(untagged)]
72pub enum DeleteBalancerRuleError {
73    Status400(models::GetFinances400Response),
74    Status401(models::GetFinances401Response),
75    Status403(models::GetAccountStatus403Response),
76    Status404(models::GetImage404Response),
77    Status429(models::GetFinances429Response),
78    Status500(models::GetFinances500Response),
79    UnknownValue(serde_json::Value)
80}
81
82/// struct for typed errors of method [`delete_ips_from_balancer`]
83#[derive(Debug, Clone, Serialize, Deserialize)]
84#[serde(untagged)]
85pub enum DeleteIpsFromBalancerError {
86    Status400(models::GetFinances400Response),
87    Status401(models::GetFinances401Response),
88    Status403(models::GetAccountStatus403Response),
89    Status404(models::GetImage404Response),
90    Status429(models::GetFinances429Response),
91    Status500(models::GetFinances500Response),
92    UnknownValue(serde_json::Value)
93}
94
95/// struct for typed errors of method [`get_balancer`]
96#[derive(Debug, Clone, Serialize, Deserialize)]
97#[serde(untagged)]
98pub enum GetBalancerError {
99    Status400(models::GetFinances400Response),
100    Status401(models::GetFinances401Response),
101    Status403(models::GetAccountStatus403Response),
102    Status404(models::GetImage404Response),
103    Status429(models::GetFinances429Response),
104    Status500(models::GetFinances500Response),
105    UnknownValue(serde_json::Value)
106}
107
108/// struct for typed errors of method [`get_balancer_ips`]
109#[derive(Debug, Clone, Serialize, Deserialize)]
110#[serde(untagged)]
111pub enum GetBalancerIpsError {
112    Status400(models::GetFinances400Response),
113    Status401(models::GetFinances401Response),
114    Status403(models::GetAccountStatus403Response),
115    Status404(models::GetImage404Response),
116    Status429(models::GetFinances429Response),
117    Status500(models::GetFinances500Response),
118    UnknownValue(serde_json::Value)
119}
120
121/// struct for typed errors of method [`get_balancer_rules`]
122#[derive(Debug, Clone, Serialize, Deserialize)]
123#[serde(untagged)]
124pub enum GetBalancerRulesError {
125    Status400(models::GetFinances400Response),
126    Status401(models::GetFinances401Response),
127    Status403(models::GetAccountStatus403Response),
128    Status404(models::GetImage404Response),
129    Status429(models::GetFinances429Response),
130    Status500(models::GetFinances500Response),
131    UnknownValue(serde_json::Value)
132}
133
134/// struct for typed errors of method [`get_balancers`]
135#[derive(Debug, Clone, Serialize, Deserialize)]
136#[serde(untagged)]
137pub enum GetBalancersError {
138    Status400(models::GetFinances400Response),
139    Status401(models::GetFinances401Response),
140    Status403(models::GetAccountStatus403Response),
141    Status404(models::GetImage404Response),
142    Status429(models::GetFinances429Response),
143    Status500(models::GetFinances500Response),
144    UnknownValue(serde_json::Value)
145}
146
147/// struct for typed errors of method [`get_balancers_presets`]
148#[derive(Debug, Clone, Serialize, Deserialize)]
149#[serde(untagged)]
150pub enum GetBalancersPresetsError {
151    Status400(models::GetFinances400Response),
152    Status401(models::GetFinances401Response),
153    Status403(models::GetAccountStatus403Response),
154    Status404(models::GetImage404Response),
155    Status429(models::GetFinances429Response),
156    Status500(models::GetFinances500Response),
157    UnknownValue(serde_json::Value)
158}
159
160/// struct for typed errors of method [`update_balancer`]
161#[derive(Debug, Clone, Serialize, Deserialize)]
162#[serde(untagged)]
163pub enum UpdateBalancerError {
164    Status400(models::GetFinances400Response),
165    Status401(models::GetFinances401Response),
166    Status403(models::GetAccountStatus403Response),
167    Status404(models::GetImage404Response),
168    Status429(models::GetFinances429Response),
169    Status500(models::GetFinances500Response),
170    UnknownValue(serde_json::Value)
171}
172
173/// struct for typed errors of method [`update_balancer_rule`]
174#[derive(Debug, Clone, Serialize, Deserialize)]
175#[serde(untagged)]
176pub enum UpdateBalancerRuleError {
177    Status400(models::GetFinances400Response),
178    Status401(models::GetFinances401Response),
179    Status403(models::GetAccountStatus403Response),
180    Status404(models::GetImage404Response),
181    Status429(models::GetFinances429Response),
182    Status500(models::GetFinances500Response),
183    UnknownValue(serde_json::Value)
184}
185
186/// Чтобы добавить `IP`-адреса к балансировщику, отправьте запрос POST в
187/// `api/v1/balancers/{balancer_id}/ips`.
188pub async fn add_ips_to_balancer(
189    configuration: &configuration::Configuration,
190    balancer_id: i32,
191    add_ips_to_balancer_request: models::AddIpsToBalancerRequest
192) -> Result<(), Error<AddIpsToBalancerError>> {
193    // add a prefix to parameters to efficiently prevent name collisions
194    let p_path_balancer_id = balancer_id;
195    let p_body_add_ips_to_balancer_request = add_ips_to_balancer_request;
196
197    let uri_str = format!(
198        "{}/api/v1/balancers/{balancer_id}/ips",
199        configuration.base_path,
200        balancer_id = p_path_balancer_id
201    );
202    let mut req_builder = configuration
203        .client
204        .request(reqwest::Method::POST, &uri_str);
205
206    if let Some(ref user_agent) = configuration.user_agent {
207        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
208    }
209    if let Some(ref token) = configuration.bearer_access_token {
210        req_builder = req_builder.bearer_auth(token.to_owned());
211    };
212    req_builder = req_builder.json(&p_body_add_ips_to_balancer_request);
213
214    let req = req_builder.build()?;
215    let resp = configuration.client.execute(req).await?;
216
217    let status = resp.status();
218
219    if !status.is_client_error() && !status.is_server_error() {
220        Ok(())
221    } else {
222        let content = resp.text().await?;
223        let entity: Option<AddIpsToBalancerError> = serde_json::from_str(&content).ok();
224        Err(Error::ResponseError(ResponseContent {
225            status,
226            content,
227            entity
228        }))
229    }
230}
231
232/// Чтобы создать бaлансировщик на вашем аккаунте, отправьте POST-запрос на
233/// `/api/v1/balancers`, задав необходимые атрибуты.  Балансировщик будет создан
234/// с использованием предоставленной информации. Тело ответа будет содержать
235/// объект JSON с информацией о созданном балансировщике.
236pub async fn create_balancer(
237    configuration: &configuration::Configuration,
238    create_balancer: models::CreateBalancer
239) -> Result<models::CreateBalancer200Response, Error<CreateBalancerError>> {
240    // add a prefix to parameters to efficiently prevent name collisions
241    let p_body_create_balancer = create_balancer;
242
243    let uri_str = format!("{}/api/v1/balancers", configuration.base_path);
244    let mut req_builder = configuration
245        .client
246        .request(reqwest::Method::POST, &uri_str);
247
248    if let Some(ref user_agent) = configuration.user_agent {
249        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
250    }
251    if let Some(ref token) = configuration.bearer_access_token {
252        req_builder = req_builder.bearer_auth(token.to_owned());
253    };
254    req_builder = req_builder.json(&p_body_create_balancer);
255
256    let req = req_builder.build()?;
257    let resp = configuration.client.execute(req).await?;
258
259    let status = resp.status();
260    let content_type = resp
261        .headers()
262        .get("content-type")
263        .and_then(|v| v.to_str().ok())
264        .unwrap_or("application/octet-stream");
265    let content_type = super::ContentType::from(content_type);
266
267    if !status.is_client_error() && !status.is_server_error() {
268        let content = resp.text().await?;
269        match content_type {
270            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
271            ContentType::Text => {
272                return Err(Error::from(serde_json::Error::custom(
273                    "Received `text/plain` content type response that cannot be converted to `models::CreateBalancer200Response`"
274                )));
275            }
276            ContentType::Unsupported(unknown_type) => {
277                return Err(Error::from(serde_json::Error::custom(format!(
278                    "Received `{unknown_type}` content type response that cannot be converted to `models::CreateBalancer200Response`"
279                ))));
280            }
281        }
282    } else {
283        let content = resp.text().await?;
284        let entity: Option<CreateBalancerError> = serde_json::from_str(&content).ok();
285        Err(Error::ResponseError(ResponseContent {
286            status,
287            content,
288            entity
289        }))
290    }
291}
292
293/// Чтобы создать правило для балансировщика, отправьте запрос POST в
294/// `api/v1/balancers/{balancer_id}/rules`.
295pub async fn create_balancer_rule(
296    configuration: &configuration::Configuration,
297    balancer_id: i32,
298    create_rule: models::CreateRule
299) -> Result<models::CreateBalancerRule200Response, Error<CreateBalancerRuleError>> {
300    // add a prefix to parameters to efficiently prevent name collisions
301    let p_path_balancer_id = balancer_id;
302    let p_body_create_rule = create_rule;
303
304    let uri_str = format!(
305        "{}/api/v1/balancers/{balancer_id}/rules",
306        configuration.base_path,
307        balancer_id = p_path_balancer_id
308    );
309    let mut req_builder = configuration
310        .client
311        .request(reqwest::Method::POST, &uri_str);
312
313    if let Some(ref user_agent) = configuration.user_agent {
314        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
315    }
316    if let Some(ref token) = configuration.bearer_access_token {
317        req_builder = req_builder.bearer_auth(token.to_owned());
318    };
319    req_builder = req_builder.json(&p_body_create_rule);
320
321    let req = req_builder.build()?;
322    let resp = configuration.client.execute(req).await?;
323
324    let status = resp.status();
325    let content_type = resp
326        .headers()
327        .get("content-type")
328        .and_then(|v| v.to_str().ok())
329        .unwrap_or("application/octet-stream");
330    let content_type = super::ContentType::from(content_type);
331
332    if !status.is_client_error() && !status.is_server_error() {
333        let content = resp.text().await?;
334        match content_type {
335            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
336            ContentType::Text => {
337                return Err(Error::from(serde_json::Error::custom(
338                    "Received `text/plain` content type response that cannot be converted to `models::CreateBalancerRule200Response`"
339                )));
340            }
341            ContentType::Unsupported(unknown_type) => {
342                return Err(Error::from(serde_json::Error::custom(format!(
343                    "Received `{unknown_type}` content type response that cannot be converted to `models::CreateBalancerRule200Response`"
344                ))));
345            }
346        }
347    } else {
348        let content = resp.text().await?;
349        let entity: Option<CreateBalancerRuleError> = serde_json::from_str(&content).ok();
350        Err(Error::ResponseError(ResponseContent {
351            status,
352            content,
353            entity
354        }))
355    }
356}
357
358/// Чтобы удалить балансировщик, отправьте запрос DELETE в
359/// `api/v1/balancers/{balancer_id}`.
360pub async fn delete_balancer(
361    configuration: &configuration::Configuration,
362    balancer_id: i32,
363    hash: Option<&str>,
364    code: Option<&str>
365) -> Result<models::DeleteBalancer200Response, Error<DeleteBalancerError>> {
366    // add a prefix to parameters to efficiently prevent name collisions
367    let p_path_balancer_id = balancer_id;
368    let p_query_hash = hash;
369    let p_query_code = code;
370
371    let uri_str = format!(
372        "{}/api/v1/balancers/{balancer_id}",
373        configuration.base_path,
374        balancer_id = p_path_balancer_id
375    );
376    let mut req_builder = configuration
377        .client
378        .request(reqwest::Method::DELETE, &uri_str);
379
380    if let Some(ref param_value) = p_query_hash {
381        req_builder = req_builder.query(&[("hash", &param_value.to_string())]);
382    }
383    if let Some(ref param_value) = p_query_code {
384        req_builder = req_builder.query(&[("code", &param_value.to_string())]);
385    }
386    if let Some(ref user_agent) = configuration.user_agent {
387        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
388    }
389    if let Some(ref token) = configuration.bearer_access_token {
390        req_builder = req_builder.bearer_auth(token.to_owned());
391    };
392
393    let req = req_builder.build()?;
394    let resp = configuration.client.execute(req).await?;
395
396    let status = resp.status();
397    let content_type = resp
398        .headers()
399        .get("content-type")
400        .and_then(|v| v.to_str().ok())
401        .unwrap_or("application/octet-stream");
402    let content_type = super::ContentType::from(content_type);
403
404    if !status.is_client_error() && !status.is_server_error() {
405        let content = resp.text().await?;
406        match content_type {
407            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
408            ContentType::Text => {
409                return Err(Error::from(serde_json::Error::custom(
410                    "Received `text/plain` content type response that cannot be converted to `models::DeleteBalancer200Response`"
411                )));
412            }
413            ContentType::Unsupported(unknown_type) => {
414                return Err(Error::from(serde_json::Error::custom(format!(
415                    "Received `{unknown_type}` content type response that cannot be converted to `models::DeleteBalancer200Response`"
416                ))));
417            }
418        }
419    } else {
420        let content = resp.text().await?;
421        let entity: Option<DeleteBalancerError> = serde_json::from_str(&content).ok();
422        Err(Error::ResponseError(ResponseContent {
423            status,
424            content,
425            entity
426        }))
427    }
428}
429
430/// Чтобы удалить правило для балансировщика, отправьте запрос DELETE в
431/// `api/v1/balancers/{balancer_id}/rules/{rule_id}`.
432pub async fn delete_balancer_rule(
433    configuration: &configuration::Configuration,
434    balancer_id: i32,
435    rule_id: i32
436) -> Result<(), Error<DeleteBalancerRuleError>> {
437    // add a prefix to parameters to efficiently prevent name collisions
438    let p_path_balancer_id = balancer_id;
439    let p_path_rule_id = rule_id;
440
441    let uri_str = format!(
442        "{}/api/v1/balancers/{balancer_id}/rules/{rule_id}",
443        configuration.base_path,
444        balancer_id = p_path_balancer_id,
445        rule_id = p_path_rule_id
446    );
447    let mut req_builder = configuration
448        .client
449        .request(reqwest::Method::DELETE, &uri_str);
450
451    if let Some(ref user_agent) = configuration.user_agent {
452        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
453    }
454    if let Some(ref token) = configuration.bearer_access_token {
455        req_builder = req_builder.bearer_auth(token.to_owned());
456    };
457
458    let req = req_builder.build()?;
459    let resp = configuration.client.execute(req).await?;
460
461    let status = resp.status();
462
463    if !status.is_client_error() && !status.is_server_error() {
464        Ok(())
465    } else {
466        let content = resp.text().await?;
467        let entity: Option<DeleteBalancerRuleError> = serde_json::from_str(&content).ok();
468        Err(Error::ResponseError(ResponseContent {
469            status,
470            content,
471            entity
472        }))
473    }
474}
475
476/// Чтобы удалить `IP`-адреса из балансировщика, отправьте запрос DELETE в
477/// `api/v1/balancers/{balancer_id}/ips`.
478pub async fn delete_ips_from_balancer(
479    configuration: &configuration::Configuration,
480    balancer_id: i32,
481    add_ips_to_balancer_request: models::AddIpsToBalancerRequest
482) -> Result<(), Error<DeleteIpsFromBalancerError>> {
483    // add a prefix to parameters to efficiently prevent name collisions
484    let p_path_balancer_id = balancer_id;
485    let p_body_add_ips_to_balancer_request = add_ips_to_balancer_request;
486
487    let uri_str = format!(
488        "{}/api/v1/balancers/{balancer_id}/ips",
489        configuration.base_path,
490        balancer_id = p_path_balancer_id
491    );
492    let mut req_builder = configuration
493        .client
494        .request(reqwest::Method::DELETE, &uri_str);
495
496    if let Some(ref user_agent) = configuration.user_agent {
497        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
498    }
499    if let Some(ref token) = configuration.bearer_access_token {
500        req_builder = req_builder.bearer_auth(token.to_owned());
501    };
502    req_builder = req_builder.json(&p_body_add_ips_to_balancer_request);
503
504    let req = req_builder.build()?;
505    let resp = configuration.client.execute(req).await?;
506
507    let status = resp.status();
508
509    if !status.is_client_error() && !status.is_server_error() {
510        Ok(())
511    } else {
512        let content = resp.text().await?;
513        let entity: Option<DeleteIpsFromBalancerError> = serde_json::from_str(&content).ok();
514        Err(Error::ResponseError(ResponseContent {
515            status,
516            content,
517            entity
518        }))
519    }
520}
521
522/// Чтобы отобразить информацию об отдельном балансировщике, отправьте запрос
523/// GET на `api/v1/balancers/{balancer_id}`.
524pub async fn get_balancer(
525    configuration: &configuration::Configuration,
526    balancer_id: i32
527) -> Result<models::CreateBalancer200Response, Error<GetBalancerError>> {
528    // add a prefix to parameters to efficiently prevent name collisions
529    let p_path_balancer_id = balancer_id;
530
531    let uri_str = format!(
532        "{}/api/v1/balancers/{balancer_id}",
533        configuration.base_path,
534        balancer_id = p_path_balancer_id
535    );
536    let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
537
538    if let Some(ref user_agent) = configuration.user_agent {
539        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
540    }
541    if let Some(ref token) = configuration.bearer_access_token {
542        req_builder = req_builder.bearer_auth(token.to_owned());
543    };
544
545    let req = req_builder.build()?;
546    let resp = configuration.client.execute(req).await?;
547
548    let status = resp.status();
549    let content_type = resp
550        .headers()
551        .get("content-type")
552        .and_then(|v| v.to_str().ok())
553        .unwrap_or("application/octet-stream");
554    let content_type = super::ContentType::from(content_type);
555
556    if !status.is_client_error() && !status.is_server_error() {
557        let content = resp.text().await?;
558        match content_type {
559            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
560            ContentType::Text => {
561                return Err(Error::from(serde_json::Error::custom(
562                    "Received `text/plain` content type response that cannot be converted to `models::CreateBalancer200Response`"
563                )));
564            }
565            ContentType::Unsupported(unknown_type) => {
566                return Err(Error::from(serde_json::Error::custom(format!(
567                    "Received `{unknown_type}` content type response that cannot be converted to `models::CreateBalancer200Response`"
568                ))));
569            }
570        }
571    } else {
572        let content = resp.text().await?;
573        let entity: Option<GetBalancerError> = serde_json::from_str(&content).ok();
574        Err(Error::ResponseError(ResponseContent {
575            status,
576            content,
577            entity
578        }))
579    }
580}
581
582/// Чтобы добавить `IP`-адреса к балансировщику, отправьте запрос GET в
583/// `api/v1/balancers/{balancer_id}/ips`.
584pub async fn get_balancer_ips(
585    configuration: &configuration::Configuration,
586    balancer_id: i32
587) -> Result<models::GetBalancerIps200Response, Error<GetBalancerIpsError>> {
588    // add a prefix to parameters to efficiently prevent name collisions
589    let p_path_balancer_id = balancer_id;
590
591    let uri_str = format!(
592        "{}/api/v1/balancers/{balancer_id}/ips",
593        configuration.base_path,
594        balancer_id = p_path_balancer_id
595    );
596    let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
597
598    if let Some(ref user_agent) = configuration.user_agent {
599        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
600    }
601    if let Some(ref token) = configuration.bearer_access_token {
602        req_builder = req_builder.bearer_auth(token.to_owned());
603    };
604
605    let req = req_builder.build()?;
606    let resp = configuration.client.execute(req).await?;
607
608    let status = resp.status();
609    let content_type = resp
610        .headers()
611        .get("content-type")
612        .and_then(|v| v.to_str().ok())
613        .unwrap_or("application/octet-stream");
614    let content_type = super::ContentType::from(content_type);
615
616    if !status.is_client_error() && !status.is_server_error() {
617        let content = resp.text().await?;
618        match content_type {
619            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
620            ContentType::Text => {
621                return Err(Error::from(serde_json::Error::custom(
622                    "Received `text/plain` content type response that cannot be converted to `models::GetBalancerIps200Response`"
623                )));
624            }
625            ContentType::Unsupported(unknown_type) => {
626                return Err(Error::from(serde_json::Error::custom(format!(
627                    "Received `{unknown_type}` content type response that cannot be converted to `models::GetBalancerIps200Response`"
628                ))));
629            }
630        }
631    } else {
632        let content = resp.text().await?;
633        let entity: Option<GetBalancerIpsError> = serde_json::from_str(&content).ok();
634        Err(Error::ResponseError(ResponseContent {
635            status,
636            content,
637            entity
638        }))
639    }
640}
641
642/// Чтобы получить правила балансировщика, отправьте запрос GET в
643/// `api/v1/balancers/{balancer_id}/rules`.
644pub async fn get_balancer_rules(
645    configuration: &configuration::Configuration,
646    balancer_id: i32
647) -> Result<models::GetBalancerRules200Response, Error<GetBalancerRulesError>> {
648    // add a prefix to parameters to efficiently prevent name collisions
649    let p_path_balancer_id = balancer_id;
650
651    let uri_str = format!(
652        "{}/api/v1/balancers/{balancer_id}/rules",
653        configuration.base_path,
654        balancer_id = p_path_balancer_id
655    );
656    let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
657
658    if let Some(ref user_agent) = configuration.user_agent {
659        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
660    }
661    if let Some(ref token) = configuration.bearer_access_token {
662        req_builder = req_builder.bearer_auth(token.to_owned());
663    };
664
665    let req = req_builder.build()?;
666    let resp = configuration.client.execute(req).await?;
667
668    let status = resp.status();
669    let content_type = resp
670        .headers()
671        .get("content-type")
672        .and_then(|v| v.to_str().ok())
673        .unwrap_or("application/octet-stream");
674    let content_type = super::ContentType::from(content_type);
675
676    if !status.is_client_error() && !status.is_server_error() {
677        let content = resp.text().await?;
678        match content_type {
679            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
680            ContentType::Text => {
681                return Err(Error::from(serde_json::Error::custom(
682                    "Received `text/plain` content type response that cannot be converted to `models::GetBalancerRules200Response`"
683                )));
684            }
685            ContentType::Unsupported(unknown_type) => {
686                return Err(Error::from(serde_json::Error::custom(format!(
687                    "Received `{unknown_type}` content type response that cannot be converted to `models::GetBalancerRules200Response`"
688                ))));
689            }
690        }
691    } else {
692        let content = resp.text().await?;
693        let entity: Option<GetBalancerRulesError> = serde_json::from_str(&content).ok();
694        Err(Error::ResponseError(ResponseContent {
695            status,
696            content,
697            entity
698        }))
699    }
700}
701
702/// Чтобы получить список всех бaлансировщиков на вашем аккаунте, отправьте
703/// GET-запрос на `/api/v1/balancers`.   Тело ответа будет представлять собой
704/// объект JSON с ключом `balancers`.
705pub async fn get_balancers(
706    configuration: &configuration::Configuration,
707    limit: Option<i32>,
708    offset: Option<i32>
709) -> Result<models::GetBalancers200Response, Error<GetBalancersError>> {
710    // add a prefix to parameters to efficiently prevent name collisions
711    let p_query_limit = limit;
712    let p_query_offset = offset;
713
714    let uri_str = format!("{}/api/v1/balancers", configuration.base_path);
715    let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
716
717    if let Some(ref param_value) = p_query_limit {
718        req_builder = req_builder.query(&[("limit", &param_value.to_string())]);
719    }
720    if let Some(ref param_value) = p_query_offset {
721        req_builder = req_builder.query(&[("offset", &param_value.to_string())]);
722    }
723    if let Some(ref user_agent) = configuration.user_agent {
724        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
725    }
726    if let Some(ref token) = configuration.bearer_access_token {
727        req_builder = req_builder.bearer_auth(token.to_owned());
728    };
729
730    let req = req_builder.build()?;
731    let resp = configuration.client.execute(req).await?;
732
733    let status = resp.status();
734    let content_type = resp
735        .headers()
736        .get("content-type")
737        .and_then(|v| v.to_str().ok())
738        .unwrap_or("application/octet-stream");
739    let content_type = super::ContentType::from(content_type);
740
741    if !status.is_client_error() && !status.is_server_error() {
742        let content = resp.text().await?;
743        match content_type {
744            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
745            ContentType::Text => {
746                return Err(Error::from(serde_json::Error::custom(
747                    "Received `text/plain` content type response that cannot be converted to `models::GetBalancers200Response`"
748                )));
749            }
750            ContentType::Unsupported(unknown_type) => {
751                return Err(Error::from(serde_json::Error::custom(format!(
752                    "Received `{unknown_type}` content type response that cannot be converted to `models::GetBalancers200Response`"
753                ))));
754            }
755        }
756    } else {
757        let content = resp.text().await?;
758        let entity: Option<GetBalancersError> = serde_json::from_str(&content).ok();
759        Err(Error::ResponseError(ResponseContent {
760            status,
761            content,
762            entity
763        }))
764    }
765}
766
767/// Чтобы получить список тарифов для балансировщика, отправьте GET-запрос на
768/// `/api/v1/presets/balancers`.   Тело ответа будет представлять собой объект
769/// JSON с ключом `balancers_presets`.
770pub async fn get_balancers_presets(
771    configuration: &configuration::Configuration
772) -> Result<models::GetBalancersPresets200Response, Error<GetBalancersPresetsError>> {
773    let uri_str = format!("{}/api/v1/presets/balancers", configuration.base_path);
774    let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
775
776    if let Some(ref user_agent) = configuration.user_agent {
777        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
778    }
779    if let Some(ref token) = configuration.bearer_access_token {
780        req_builder = req_builder.bearer_auth(token.to_owned());
781    };
782
783    let req = req_builder.build()?;
784    let resp = configuration.client.execute(req).await?;
785
786    let status = resp.status();
787    let content_type = resp
788        .headers()
789        .get("content-type")
790        .and_then(|v| v.to_str().ok())
791        .unwrap_or("application/octet-stream");
792    let content_type = super::ContentType::from(content_type);
793
794    if !status.is_client_error() && !status.is_server_error() {
795        let content = resp.text().await?;
796        match content_type {
797            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
798            ContentType::Text => {
799                return Err(Error::from(serde_json::Error::custom(
800                    "Received `text/plain` content type response that cannot be converted to `models::GetBalancersPresets200Response`"
801                )));
802            }
803            ContentType::Unsupported(unknown_type) => {
804                return Err(Error::from(serde_json::Error::custom(format!(
805                    "Received `{unknown_type}` content type response that cannot be converted to `models::GetBalancersPresets200Response`"
806                ))));
807            }
808        }
809    } else {
810        let content = resp.text().await?;
811        let entity: Option<GetBalancersPresetsError> = serde_json::from_str(&content).ok();
812        Err(Error::ResponseError(ResponseContent {
813            status,
814            content,
815            entity
816        }))
817    }
818}
819
820/// Чтобы обновить только определенные атрибуты балансировщика, отправьте запрос
821/// PATCH в `api/v1/balancers/{balancer_id}`.
822pub async fn update_balancer(
823    configuration: &configuration::Configuration,
824    balancer_id: i32,
825    update_balancer: models::UpdateBalancer
826) -> Result<models::CreateBalancer200Response, Error<UpdateBalancerError>> {
827    // add a prefix to parameters to efficiently prevent name collisions
828    let p_path_balancer_id = balancer_id;
829    let p_body_update_balancer = update_balancer;
830
831    let uri_str = format!(
832        "{}/api/v1/balancers/{balancer_id}",
833        configuration.base_path,
834        balancer_id = p_path_balancer_id
835    );
836    let mut req_builder = configuration
837        .client
838        .request(reqwest::Method::PATCH, &uri_str);
839
840    if let Some(ref user_agent) = configuration.user_agent {
841        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
842    }
843    if let Some(ref token) = configuration.bearer_access_token {
844        req_builder = req_builder.bearer_auth(token.to_owned());
845    };
846    req_builder = req_builder.json(&p_body_update_balancer);
847
848    let req = req_builder.build()?;
849    let resp = configuration.client.execute(req).await?;
850
851    let status = resp.status();
852    let content_type = resp
853        .headers()
854        .get("content-type")
855        .and_then(|v| v.to_str().ok())
856        .unwrap_or("application/octet-stream");
857    let content_type = super::ContentType::from(content_type);
858
859    if !status.is_client_error() && !status.is_server_error() {
860        let content = resp.text().await?;
861        match content_type {
862            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
863            ContentType::Text => {
864                return Err(Error::from(serde_json::Error::custom(
865                    "Received `text/plain` content type response that cannot be converted to `models::CreateBalancer200Response`"
866                )));
867            }
868            ContentType::Unsupported(unknown_type) => {
869                return Err(Error::from(serde_json::Error::custom(format!(
870                    "Received `{unknown_type}` content type response that cannot be converted to `models::CreateBalancer200Response`"
871                ))));
872            }
873        }
874    } else {
875        let content = resp.text().await?;
876        let entity: Option<UpdateBalancerError> = serde_json::from_str(&content).ok();
877        Err(Error::ResponseError(ResponseContent {
878            status,
879            content,
880            entity
881        }))
882    }
883}
884
885/// Чтобы обновить правило для балансировщика, отправьте запрос PATCH в
886/// `api/v1/balancers/{balancer_id}/rules/{rule_id}`.
887pub async fn update_balancer_rule(
888    configuration: &configuration::Configuration,
889    balancer_id: i32,
890    rule_id: i32,
891    update_rule: models::UpdateRule
892) -> Result<models::CreateBalancerRule200Response, Error<UpdateBalancerRuleError>> {
893    // add a prefix to parameters to efficiently prevent name collisions
894    let p_path_balancer_id = balancer_id;
895    let p_path_rule_id = rule_id;
896    let p_body_update_rule = update_rule;
897
898    let uri_str = format!(
899        "{}/api/v1/balancers/{balancer_id}/rules/{rule_id}",
900        configuration.base_path,
901        balancer_id = p_path_balancer_id,
902        rule_id = p_path_rule_id
903    );
904    let mut req_builder = configuration
905        .client
906        .request(reqwest::Method::PATCH, &uri_str);
907
908    if let Some(ref user_agent) = configuration.user_agent {
909        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
910    }
911    if let Some(ref token) = configuration.bearer_access_token {
912        req_builder = req_builder.bearer_auth(token.to_owned());
913    };
914    req_builder = req_builder.json(&p_body_update_rule);
915
916    let req = req_builder.build()?;
917    let resp = configuration.client.execute(req).await?;
918
919    let status = resp.status();
920    let content_type = resp
921        .headers()
922        .get("content-type")
923        .and_then(|v| v.to_str().ok())
924        .unwrap_or("application/octet-stream");
925    let content_type = super::ContentType::from(content_type);
926
927    if !status.is_client_error() && !status.is_server_error() {
928        let content = resp.text().await?;
929        match content_type {
930            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
931            ContentType::Text => {
932                return Err(Error::from(serde_json::Error::custom(
933                    "Received `text/plain` content type response that cannot be converted to `models::CreateBalancerRule200Response`"
934                )));
935            }
936            ContentType::Unsupported(unknown_type) => {
937                return Err(Error::from(serde_json::Error::custom(format!(
938                    "Received `{unknown_type}` content type response that cannot be converted to `models::CreateBalancerRule200Response`"
939                ))));
940            }
941        }
942    } else {
943        let content = resp.text().await?;
944        let entity: Option<UpdateBalancerRuleError> = serde_json::from_str(&content).ok();
945        Err(Error::ResponseError(ResponseContent {
946            status,
947            content,
948            entity
949        }))
950    }
951}