# Compute Node Agent library В этом репозитории развивается базовая библиотека для взаимодействия с libvirt и выполнения операций с виртуальными машинами. Фокус на QEMU/KVM. # Зависимости (версии из APT репозитория Debian 12): - `python3-lxml` 4.9.2 - `python3-docopt` 0.6.2 - `python3-libvirt` 9.0.0 Минимальная поддерживаемая версия Python — `3.11`, потому, что можем. # Утилиты - `na-vmctl` virsh на минималках. Выполняет базовые операции с VM, установку и миграцию и т.п. - `na-vmexec`. Обёртка для вызова QEMU guest agent на машинах, больше нчего уметь не должна. - `na-volctl`. Предполагается здесь оставить всю работу с дисками. Не реализована. # API Кодовая база растёт, необходимо автоматически генерировать документацию, в README её больше не будет. В структуре проекта сейчас бардак, многое будет переосмыслено и переделано позже. Основная цель на текущем этапе — получить минимально работающий код, с помощью которого возможно выполнить установку виртуальной машины и как-то управлять ею. Есть набор классов, предоставляющих собой интерфейсы для взаимодействия с виртуальными машинами, стораджами, дисками и т.п. Датаклассы описывают сущности и имеют метод `to_xml()` для получения XML конфига для `libvirt`. Смысл датакласса в том, чтобы иметь один объект, содержащий в себе нормальные легкочитаемые аттрибуты и XML описание сущности одновременно. # TODO - [x] Установка ВМ (всратый вариант) - [x] Конструктор XML (базовый) - [x] Автоматический выбор модели процессора - [x] Метод создания дисков - [x] Дефайн, запуск и автостарт ВМ - [x] Работа со StoragePool - [x] Создание блочных устройств - [x] Подключение/отключение устройств - [x] Метод install() - [ ] Выбор между SeaBIOS/UEFI - [ ] Выбор модели процессора - [ ] Установка ВМ (нормальный вариант) - [x] Управление дисками - [x] Локальные qcow2 - [ ] ZVOL - [ ] Сетевые диски - [ ] Живой ресайз файловой системы (?) - [x] Удаление ВМ - [x] Изменение CPU - [ ] Полноценный hotplug - [x] Изменение RAM - [ ] Полноценный hotplug - [ ] Миграция ВМ между нодами - [x] Работа с qemu-ga - [x] Управление питанием - [x] Вкл/выкл автостарт ВМ - [ ] Статистика потребления ресурсов - [ ] Получение инфомрации из/о ВМ - [ ] SSH-ключи - [ ] Сеть - [ ] Создание снапшотов - [ ] Поддержка выделения гарантированной доли CPU # Заметки ### Что там с LXC? Можно добавить поддержку LXC, но только после реализации основного функционала для QEMU/KVM. ### Будущее этой библиотеки Нужно задействовать билиотеку [libosinfo](https://libosinfo.org/) для получения информации об операционных системах. См. [How to populate Libosinfo DataBase](https://wiki.libvirt.org/HowToPopulateLibosinfoDB.html). ### Failover В перспективе для ВМ с сетевыми дисками возможно организовать Failover решение — ВМ будет автоматически запускаться на другой ноде из пула при отключении оригинальной ноды. Технически это можно реализовать как создание ВМ с аналогичными характеристиками на другой ноде с подключением к тому же самому сетевому диску. Сразу нужно отметить, что для реализации: - Нужно где-то хранить и регулярно обновлять информацию о конфигурации ВМ для воссоздания ВМ - Нужно иметь "плавающие адреса", чтобы переключить трафик на новую ноду - Необходимо выполнять failover по чётким критериям: нода полностью недоступна более X времени, маунт сетевого диска отвалился и т.п. - Как быть с целостностью данных на сетевом диске? При аварии на ноде, данные могли быть повреждены, тогда failover на тот же диск ничего не даст. - Сетевой диск должен быть зарезервирован средствами распределённой ФС