Перейти к основному содержимому

Лимиты и квоты

Аккаунт ограничен и по количеству ресурсов, и по суммарным вычислительным ресурсам машин. API отдаёт эти ограничения вместе с текущим потреблением, чтобы клиент мог показать остаток и предупредить пользователя до отправки запроса, а не после отказа.

Что возвращает GET /limits

Ответ состоит из квот. У каждой квоты три числа: limit — сколько всего можно, used — сколько занято сейчас, remaining — сколько ещё можно создать. Поле remaining никогда не бывает отрицательным.

  • projects, accessTokens, networks, publicIps — квоты на количество ресурсов у пользователя.

  • vmResources — суммарные cpu, ram и disk по всем машинам пользователя. Единицы: ядра, гигабайты, гигабайты.

  • maxSshKeysPerProject — число, а не квота: ограничение действует внутри одного проекта, поэтому потребление зависит от того, какой проект вы смотрите.

curl --request GET \
  --url 'https://api.zennohosting.com/v1/limits' \
  --header 'Authorization: Bearer <token>' \
  --header 'Accept: application/json'

Потребление — это снимок, а не гарантия

Значение used отражает состояние на момент запроса и может немного отставать. Оно предназначено для показа и предварительных проверок. Окончательное решение принимается при создании ресурса, поэтому запрос может быть отклонён даже тогда, когда remaining только что был больше нуля. Считайте лимиты подсказкой для интерфейса, а не заменой обработки ошибки.

Что возвращает GET /limits/name-lengths

Это не квоты, а правила валидации: максимальные длины значений, которые задаёт пользователь. Они одинаковы для всех и не зависят от запроса, поэтому потребления в ответе нет — только предельные числа.

  • maxProjectNameLength, maxNetworkNameLength, maxVmNameLength — имена проекта, сети и машины.

  • maxSshKeyNameLength и maxSshKeyPublicKeyLength — имя SSH-ключа и длина самого публичного ключа.

  • maxAccessTokenNameLength — имя токена доступа.

Забирайте эти значения при старте клиента и проверяйте по ним ввод до отправки запроса: API применяет те же ограничения и отклонит слишком длинное значение с ошибкой валидации.

curl --request GET \
  --url 'https://api.zennohosting.com/v1/limits/name-lengths' \
  --header 'Authorization: Bearer <token>' \
  --header 'Accept: application/json'

Три разных ограничения

Не путайте квоты аккаунта с двумя другими видами ограничений — они живут в разных местах API и ведут себя по-разному.

  • Квота аккаунта — сколько ресурсов разрешено вам. Смотрите GET /limits.

  • Доступность мощностей — есть ли сейчас место в кластере под конкретную конфигурацию. Смотрите поля availability и maxCount в списке конфигураций. Это ограничение платформы, а не ваше: при его нехватке создание машины отвечает 409 Conflict с кодом insufficientCapacity.

  • Правила валидации — длины имён и ключей. Смотрите GET /limits/name-lengths.

  1. 1

    Запросите лимиты при входе пользователя

    Один вызов GET /limits даёт всё, что нужно для индикаторов остатка по проектам, сетям, публичным адресам, токенам и вычислительным ресурсам.

  2. 2

    Кешируйте длины имён, но не потребление

    Ответ GET /limits/name-lengths стабилен, его можно запросить один раз за сессию. Потребление из GET /limits меняется вместе с ресурсами, поэтому обновляйте его после создания и удаления.

  3. 3

    Проверяйте ввод до отправки

    Если remaining равен нулю, не отправляйте запрос на создание — объясните пользователю, что квота исчерпана. Если имя длиннее допустимого, покажите ошибку в форме.

  4. 4

    Всё равно обрабатывайте отказ

    Проверка на клиенте не отменяет обработку ответа: между чтением лимитов и созданием ресурса состояние могло измениться, в том числе из другой сессии того же пользователя.

Связанные эндпоинты