Полное покрытие API
Клиент дописан до всех двадцати семи эндпоинтов платформы. Добавлено: - регионы, образы с разбивкой на системы и готовые сборки, вторая версия API образов - все действия над сервером: старт, стоп, перезагрузка, переустановка, смена тарифа, клонирование, откат, консоль, бэкапы - снимки целиком, включая ожидание готовности и поиск поднятых из них серверов - ключи доступа, IP-адреса с обратными записями, приватные сети, kubeconfig - история операций, биллинг, расход в час и в сутки - сборка и проверка slug тарифа по правилам платформы - ошибки разложены по смыслу, чтобы ловить прицельно Claude-Session: https://claude.ai/code/session_01Loz5stgQZH6ofBdMqTxiJu
Этот коммит содержится в:
@@ -0,0 +1,25 @@
|
||||
"""Эталонный образ: настроить машину один раз, снять снимок, дальше клонировать.
|
||||
|
||||
Так разворачивание клиента занимает минуты вместо часа настройки.
|
||||
"""
|
||||
from regcloud_api import RegCloud
|
||||
|
||||
api = RegCloud()
|
||||
REGION = "openstack-msk1"
|
||||
SIZE = "c2-m4-d60-hp"
|
||||
|
||||
srv = api.create_server(size=SIZE, image="ubuntu-24-04-amd64", name="golden", region=REGION)
|
||||
info = api.wait_active(srv["id"])
|
||||
print("настраивайте машину по адресу", RegCloud.ip_of(info))
|
||||
input("нажмите Enter, когда закончите...")
|
||||
|
||||
api.snapshot(srv["id"], "golden-v1", offline=True)
|
||||
snap = api.wait_snapshot("golden-v1")
|
||||
print("снимок готов:", snap["id"], snap.get("size_gigabytes"), "ГБ")
|
||||
|
||||
api.destroy_server(srv["id"])
|
||||
print("эталон удалён, снимок остался")
|
||||
|
||||
for n in range(1, 4):
|
||||
copy = api.create_server(size=SIZE, image=snap["id"], name=f"client-{n:02d}", region=REGION)
|
||||
print("поднял копию", copy["id"])
|
||||
@@ -0,0 +1,26 @@
|
||||
"""Осмотреться на аккаунте: что где размещается, что запущено, куда уходят деньги."""
|
||||
from regcloud_api import RegCloud
|
||||
|
||||
api = RegCloud()
|
||||
|
||||
print("РЕГИОНЫ")
|
||||
for r in api.regions():
|
||||
print(f" {r['slug']:18s} {r['name']}")
|
||||
|
||||
print("\nСЕРВЕРЫ")
|
||||
for s in api.servers():
|
||||
info = api.size_info(s.get("size_slug", ""))
|
||||
print(f" {s['id']} {s['name']:20s} {s['status']:8s} {RegCloud.ip_of(s):16s} "
|
||||
f"{info.get('vcpus','?')} ядер, {info.get('memory_gb','?')} ГБ")
|
||||
|
||||
print("\nСНИМКИ")
|
||||
for s in api.snapshots():
|
||||
print(f" {s['id']} {s['name']:20s} {s.get('size_gigabytes')} ГБ")
|
||||
|
||||
print("\nКЛЮЧИ")
|
||||
for k in api.ssh_keys():
|
||||
print(f" {k['id']} {k['name']:15s} {k['fingerprint']}")
|
||||
|
||||
print("\nДЕНЬГИ")
|
||||
for k, v in api.burn_rate().items():
|
||||
print(f" {k}: {v}")
|
||||
@@ -0,0 +1,31 @@
|
||||
"""Развернуть сервер под клиента: выбрать регион и систему, поднять, отдать доступы.
|
||||
|
||||
Пример под перепродажу хостинга. Тариф собирается из требований, а не берётся
|
||||
из готового списка, так что можно продавать любую конфигурацию.
|
||||
"""
|
||||
import sys
|
||||
from regcloud_api import RegCloud, ValidationError
|
||||
|
||||
api = RegCloud()
|
||||
|
||||
CPU, RAM, DISK, LINE = 2, 4, 60, "hp"
|
||||
REGION = "openstack-msk1"
|
||||
OS = "ubuntu-24-04-amd64"
|
||||
|
||||
size = RegCloud.make_size(CPU, RAM, DISK, LINE) # проверит сочетание сам
|
||||
print("тариф:", size, api.size_info(size))
|
||||
|
||||
available = {i.get("slug") for i in api.distributions()}
|
||||
if OS not in available:
|
||||
print(f"системы {OS} нет, доступны:", ", ".join(sorted(available)[:8]))
|
||||
sys.exit(1)
|
||||
|
||||
try:
|
||||
srv = api.create_server(size=size, image=OS, name=api.random_name(), region=REGION)
|
||||
except ValidationError as exc:
|
||||
print("платформа не приняла заказ:", exc)
|
||||
sys.exit(1)
|
||||
|
||||
info = api.wait_active(srv["id"])
|
||||
print(f"готово. сервер {info['id']}, адрес {RegCloud.ip_of(info)}")
|
||||
print("пароль root приходит на почту, либо задайте ssh-ключ при создании")
|
||||
Ссылка в новой задаче
Block a user