- Added template typing so approved templates can represent either QEMU VMs or LXC containers.
- Added LXC template discovery from Proxmox storage `vztmpl` content in the admin template manager. - Added live LXC container provisioning through the Proxmox API with configurable rootfs storage and optional DHCP bridge. - Routed start, stop, delete, expiration, status, and IP refresh operations through typed Proxmox VM/LXC API paths. - Added Proxmox tags to newly created VMs and containers, including a sanitized per-user tag for easier PVE administration. - Updated the admin and portal UI to show VM versus LXC template/deployment types and generic Proxmox resource IDs. - Added schema upgrades for template provisioning type, LXC template references, and deployment resource type. - Documented LXC setup, storage permissions, and the new Proxmox settings.
This commit is contained in:
@@ -10,7 +10,10 @@ final class SPP_Mock_Proxmox_Client implements SPP_Proxmox_Client
|
||||
{
|
||||
return [
|
||||
[
|
||||
'provisioningType' => 'qemu',
|
||||
'vmId' => 9001,
|
||||
'templateRef' => '',
|
||||
'storage' => '',
|
||||
'name' => 'Turnkey PBX Test Appliance',
|
||||
'cpuCores' => 2,
|
||||
'memoryMb' => 2048,
|
||||
@@ -18,7 +21,10 @@ final class SPP_Mock_Proxmox_Client implements SPP_Proxmox_Client
|
||||
'status' => 'stopped',
|
||||
],
|
||||
[
|
||||
'provisioningType' => 'qemu',
|
||||
'vmId' => 9002,
|
||||
'templateRef' => '',
|
||||
'storage' => '',
|
||||
'name' => 'Windows Support Client',
|
||||
'cpuCores' => 4,
|
||||
'memoryMb' => 8192,
|
||||
@@ -26,51 +32,80 @@ final class SPP_Mock_Proxmox_Client implements SPP_Proxmox_Client
|
||||
'status' => 'stopped',
|
||||
],
|
||||
[
|
||||
'provisioningType' => 'qemu',
|
||||
'vmId' => 9003,
|
||||
'templateRef' => '',
|
||||
'storage' => '',
|
||||
'name' => 'Linux Utility VM',
|
||||
'cpuCores' => 2,
|
||||
'memoryMb' => 2048,
|
||||
'diskGb' => 32,
|
||||
'status' => 'stopped',
|
||||
],
|
||||
[
|
||||
'provisioningType' => 'lxc',
|
||||
'vmId' => 0,
|
||||
'templateRef' => 'local:vztmpl/debian-12-standard_12.7-1_amd64.tar.zst',
|
||||
'storage' => 'local',
|
||||
'name' => 'debian-12-standard',
|
||||
'cpuCores' => 1,
|
||||
'memoryMb' => 1024,
|
||||
'diskGb' => 8,
|
||||
'status' => 'available',
|
||||
],
|
||||
[
|
||||
'provisioningType' => 'lxc',
|
||||
'vmId' => 0,
|
||||
'templateRef' => 'local:vztmpl/ubuntu-24.04-standard_24.04-2_amd64.tar.zst',
|
||||
'storage' => 'local',
|
||||
'name' => 'ubuntu-24.04-standard',
|
||||
'cpuCores' => 1,
|
||||
'memoryMb' => 1024,
|
||||
'diskGb' => 8,
|
||||
'status' => 'available',
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
public function clone_vm(array $input): array
|
||||
public function provision_instance(array $input): array
|
||||
{
|
||||
$next_id = (int) get_option('spp_mock_next_vm_id', 10000);
|
||||
update_option('spp_mock_next_vm_id', $next_id + 1, false);
|
||||
update_option('spp_mock_vm_status_' . $next_id, 'stopped', false);
|
||||
update_option('spp_mock_vm_type_' . $next_id, $this->normalise_type((string) ($input['provisioning_type'] ?? 'qemu')), false);
|
||||
update_option('spp_mock_vm_tags_' . $next_id, is_array($input['tags'] ?? null) ? array_values($input['tags']) : [], false);
|
||||
update_option('spp_mock_vm_ips_' . $next_id, [sprintf('192.0.2.%d', (($next_id - 10000) % 200) + 10)], false);
|
||||
|
||||
return ['vm_id' => $next_id];
|
||||
}
|
||||
|
||||
public function start_vm(int $vm_id): void
|
||||
public function start_instance(string $type, int $vm_id): void
|
||||
{
|
||||
$this->ensure_vm($vm_id);
|
||||
update_option('spp_mock_vm_status_' . $vm_id, 'running', false);
|
||||
}
|
||||
|
||||
public function stop_vm(int $vm_id): void
|
||||
public function stop_instance(string $type, int $vm_id): void
|
||||
{
|
||||
$this->ensure_vm($vm_id);
|
||||
update_option('spp_mock_vm_status_' . $vm_id, 'stopped', false);
|
||||
}
|
||||
|
||||
public function delete_vm(int $vm_id): void
|
||||
public function delete_instance(string $type, int $vm_id): void
|
||||
{
|
||||
$this->ensure_vm($vm_id);
|
||||
delete_option('spp_mock_vm_status_' . $vm_id);
|
||||
delete_option('spp_mock_vm_type_' . $vm_id);
|
||||
delete_option('spp_mock_vm_tags_' . $vm_id);
|
||||
delete_option('spp_mock_vm_ips_' . $vm_id);
|
||||
}
|
||||
|
||||
public function get_status(int $vm_id): string
|
||||
public function get_status(string $type, int $vm_id): string
|
||||
{
|
||||
return (string) get_option('spp_mock_vm_status_' . $vm_id, 'unknown');
|
||||
}
|
||||
|
||||
public function get_ip_addresses(int $vm_id): array
|
||||
public function get_ip_addresses(string $type, int $vm_id): array
|
||||
{
|
||||
$ips = get_option('spp_mock_vm_ips_' . $vm_id, []);
|
||||
|
||||
@@ -80,7 +115,12 @@ final class SPP_Mock_Proxmox_Client implements SPP_Proxmox_Client
|
||||
private function ensure_vm(int $vm_id): void
|
||||
{
|
||||
if (get_option('spp_mock_vm_status_' . $vm_id, null) === null) {
|
||||
throw new RuntimeException('Mock Proxmox VM does not exist.');
|
||||
throw new RuntimeException('Mock Proxmox resource does not exist.');
|
||||
}
|
||||
}
|
||||
|
||||
private function normalise_type(string $type): string
|
||||
{
|
||||
return strtolower($type) === 'lxc' ? 'lxc' : 'qemu';
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user