import { test, expect } from '@playwright/test'; import { BASE_URL } from '../../helpers/auth'; import { markManual, markPartial, markWrite } from '../../helpers/manual'; import { attachWriteResult } from '../../helpers/writeResult'; const REPO_URL = process.env.REPO_URL ?? `${BASE_URL}/downloads`; test.describe('core-virtualization', () => { test('core-virtualization-write-supported_hypervisors_deployment', async ({ page }, testInfo) => { testInfo.annotations.push({ type: 'automationStatus', description: 'automated' }); markWrite(); testInfo.annotations.push({ type: 'description', description: 'Record the list of supported hypervisors and their deployment methods from official documentation' }); const captured: Record = {}; await test.step('Navigate to download / compatibility portal', async () => { await page.goto(REPO_URL); captured['url'] = page.url(); }); await test.step('Extract hypervisor entries from the page', async () => { const items = await page.locator('td, li, .hypervisor-item, .platform-item').allTextContents(); const hypervisors = items.filter((t) => /vmware|vsphere|hyper-v|hyperv|kvm|proxmox|xen|virtualbox|nutanix/i.test(t), ); captured['hypervisors'] = hypervisors; captured['count'] = hypervisors.length; }); await test.step('Attach hypervisor list to report', async () => { await attachWriteResult(testInfo, captured, 'hypervisors'); }); expect(captured['count']).toBeGreaterThan(0); }); test('core-virtualization-write-guest_agent_integration', async ({ page }, testInfo) => { testInfo.annotations.push({ type: 'automationStatus', description: 'manual' }); markWrite(); markManual('Requires direct access to hypervisor console (VMware vCenter, Hyper-V Manager, KVM virsh) to inspect guest agent status; not accessible via web admin portal'); testInfo.annotations.push({ type: 'description', description: 'Record guest agent integration status and version for each supported hypervisor' }); // Manual steps: // 1. For VMware: open vCenter → VM → Summary → VMware Tools status. // 2. For Hyper-V: open Hyper-V Manager → VM → Integration Services. // 3. For KVM/QEMU: run `virsh qemu-agent-command '{"execute":"guest-info"}'`. // 4. For each hypervisor, record: agent version, status (running/stopped), capabilities. // 5. Attach findings to this test. }); test('core-virtualization-write-resource_allocation_vcpu_vram_vdisk', async ({ page }, testInfo) => { testInfo.annotations.push({ type: 'automationStatus', description: 'manual' }); markWrite(); markManual('Hypervisor management plane access required (vCenter API, Hyper-V WMI, libvirt) to read vCPU/vRAM/vDisk allocations; these are not exposed in the PBX admin portal'); testInfo.annotations.push({ type: 'description', description: 'Record vCPU, vRAM, and vDisk resource allocation for each supported deployment template' }); // Manual steps: // 1. Open the OVA/OVF template or deployment documentation. // 2. For each supported size (Small/Medium/Large/XL), record: vCPUs, RAM (GB), Disk (GB). // 3. Cross-reference with minimum requirements in the Installation Guide. // 4. Verify live VM allocations match the template using hypervisor console. // 5. Record findings in the test report. }); test('core-virtualization-write-virtual_networking_configuration', async ({ page }, testInfo) => { testInfo.annotations.push({ type: 'automationStatus', description: 'manual' }); markWrite(); markManual('Virtual switch and VLAN configuration lives in the hypervisor management plane (VMware DVS, Hyper-V Virtual Switch, OVS on KVM); not accessible via PBX admin portal'); testInfo.annotations.push({ type: 'description', description: 'Record virtual networking configuration: virtual switches, VLANs, NIC assignments' }); // Manual steps: // 1. In the hypervisor, inspect the virtual switch assigned to the PBX VM. // 2. Record: vSwitch name, uplink adapter, MTU, VLAN tagging mode. // 3. Verify the PBX NIC is on the correct port group / VLAN. // 4. Check that management and voice VLANs are separated if applicable. // 5. Record configuration in this test's findings. }); test('core-virtualization-check-live_migration_and_active_call_preservation', async ({ page }, testInfo) => { testInfo.annotations.push({ type: 'automationStatus', description: 'manual' }); testInfo.annotations.push({ type: 'testType', description: 'check' }); markManual('Requires HA infrastructure with ≥ 2 hypervisor hosts, active SIP call sessions during migration, and simultaneous call-state monitoring; cannot be performed by Playwright'); testInfo.annotations.push({ type: 'description', description: 'Verify VM live migration (vMotion / Live Migration) preserves active calls without interruption' }); // Manual steps: // 1. Establish 5+ active SIP calls between extensions. // 2. Trigger live migration of the PBX VM to a second hypervisor host. // 3. Monitor active calls in the PBX portal during migration. // 4. Verify: zero call drops, no audio interruption > 200 ms, migration completes < 30 s. // 5. Record migration duration and call preservation result. }); test('core-virtualization-check-snapshot_backup_restore_and_consistency', async ({ page }, testInfo) => { testInfo.annotations.push({ type: 'automationStatus', description: 'partial' }); testInfo.annotations.push({ type: 'testType', description: 'check' }); markPartial('Post-restore consistency checks (admin portal loads, config intact, services running) can be automated; the snapshot/restore operation itself requires hypervisor API or manual action'); testInfo.annotations.push({ type: 'description', description: 'Verify VM snapshot and restore operations maintain full system consistency' }); // TODO_MANUAL: Use hypervisor API or console to create a VM snapshot, modify config, // then restore the snapshot before running the automated steps below. await test.step('Navigate to admin portal after restore and verify it loads', async () => { await page.goto(BASE_URL, { waitUntil: 'domcontentloaded' }); await expect(page.locator('body')).toBeVisible(); }); await test.step('Verify no error banners are displayed after restore', async () => { await expect(page.locator('.alert-danger, .error, [class*="error"]').first()).toHaveCount(0); }); await test.step('Verify core services are shown as running in the dashboard', async () => { await page.goto(`${BASE_URL}/admin/dashboard`); await expect(page.locator('body')).not.toContainText(/stopped|offline|unavailable/i); }); }); test('core-virtualization-check-hypervisor_level_high_availability', async ({ page }, testInfo) => { testInfo.annotations.push({ type: 'automationStatus', description: 'manual' }); testInfo.annotations.push({ type: 'testType', description: 'check' }); markManual('Requires physical HA cluster with multiple hypervisor hosts; host failure must be simulated manually (power off host, network isolation); not achievable via Playwright'); testInfo.annotations.push({ type: 'description', description: 'Verify hypervisor-level HA (VMware HA, Hyper-V Failover Cluster) restarts the PBX VM after a host failure' }); // Manual steps: // 1. Confirm HA is enabled on the cluster hosting the PBX VM. // 2. Note the current host where the PBX VM is running. // 3. Simulate host failure (power off host or isolate network). // 4. Measure time to VM restart on a surviving host. // 5. Verify PBX admin portal becomes accessible within the defined RTO (e.g., < 5 min). // 6. Record: failover time, target host, any lost registrations. }); test('core-virtualization-write-storage_thin_vs_thick_provisioning', async ({ page }, testInfo) => { testInfo.annotations.push({ type: 'automationStatus', description: 'manual' }); markWrite(); markManual('Storage provisioning details (thin/thick/lazy-zeroed) are visible only in the hypervisor storage management interface; not exposed in the PBX admin portal'); testInfo.annotations.push({ type: 'description', description: 'Record storage provisioning type (thin vs thick) and observed performance implications for each supported hypervisor' }); // Manual steps: // 1. In vCenter/Hyper-V/KVM, open the PBX VM disk properties. // 2. Record: provisioning type, allocated size, used size. // 3. Run a disk I/O benchmark (fio) on both thin and thick provisioned deployments. // 4. Record: sequential read/write IOPS, latency (ms). // 5. Document recommended provisioning type based on findings. }); });