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