feat(lxc): create_lxc принимает пароль извне (задаётся пользователем)

This commit is contained in:
2026-08-09 22:10:18 +03:00
parent 5d7fcb0754
commit dea129b076
+7 -4
View File
@@ -26,7 +26,7 @@ def _client() -> ProxmoxAPI:
def gen_password(length: int = 14) -> str: def gen_password(length: int = 14) -> str:
"""Генерирует пароль из букв и цифр.""" """Генерирует пароль из букв и цифр (для VM-cloud-init, если пользователь не задал)."""
alphabet = string.ascii_letters + string.digits alphabet = string.ascii_letters + string.digits
return "".join(random.choice(alphabet) for _ in range(length)) return "".join(random.choice(alphabet) for _ in range(length))
@@ -57,6 +57,7 @@ def create_lxc(
new_vmid: int, new_vmid: int,
name: str, name: str,
template_volid: str, template_volid: str,
password: str,
cores: int, cores: int,
memory_mb: int, memory_mb: int,
disk_gb: int, disk_gb: int,
@@ -67,16 +68,18 @@ def create_lxc(
Шаги (каждый — отдельный запрос к Proxmox API): Шаги (каждый — отдельный запрос к Proxmox API):
1. Создаёт LXC через ``ostemplate`` (без запуска). 1. Создаёт LXC через ``ostemplate`` (без запуска).
2. Задаёт новый root-пароль через ``/passwd``. 2. Задаёт root-пароль через ``/passwd``.
3. Создаёт rootfs указанного размера через ``/resize``. 3. Создаёт rootfs указанного размера через ``/resize``.
4. Запускает контейнер через ``/status/start``. 4. Запускает контейнер через ``/status/start``.
``password`` приходит из формы (клиент задаёт сам) и сохраняется в БД
для одноразового показа в карточке инстанса.
LXC создаётся ТОЛЬКО из архивного шаблона (vztmpl на storage). LXC создаётся ТОЛЬКО из архивного шаблона (vztmpl на storage).
Клонирование существующего LXC по VMID не поддерживается. Клонирование существующего LXC по VMID не поддерживается.
""" """
node = node or settings.pve_node node = node or settings.pve_node
px = _client() px = _client()
password = gen_password()
# 1. Создаём LXC через ostemplate. start=0 — не запускаем, чтобы успеть # 1. Создаём LXC через ostemplate. start=0 — не запускаем, чтобы успеть
# задать пароль и диск нужного размера до старта. # задать пароль и диск нужного размера до старта.
@@ -94,7 +97,7 @@ def create_lxc(
) )
_wait_task(px, node, upid) _wait_task(px, node, upid)
# 2. Задаём новый root-пароль через отдельный endpoint /passwd. # 2. Задаём пароль через отдельный endpoint /passwd.
# Поле password в POST /lxc на некоторых версиях Proxmox игнорируется, # Поле password в POST /lxc на некоторых версиях Proxmox игнорируется,
# поэтому дублируем через /passwd — это идемпотентная операция. # поэтому дублируем через /passwd — это идемпотентная операция.
px.nodes(node).lxc(new_vmid).passwd.post(password=password) px.nodes(node).lxc(new_vmid).passwd.post(password=password)