package org.openslx.libvirt.capabilities; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.fail; import java.math.BigInteger; import java.util.List; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.core.config.Configurator; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.openslx.libvirt.capabilities.cpu.Cpu; import org.openslx.libvirt.capabilities.cpu.Feature; import org.openslx.libvirt.capabilities.cpu.Pages; import org.openslx.libvirt.capabilities.guest.Domain; import org.openslx.libvirt.capabilities.guest.Guest; import org.openslx.libvirt.capabilities.guest.Machine; import org.openslx.libvirt.domain.Domain.OsType; import org.openslx.libvirt.domain.Domain.Type; import org.openslx.libvirt.xml.LibvirtXmlDocumentException; import org.openslx.libvirt.xml.LibvirtXmlSerializationException; import org.openslx.libvirt.xml.LibvirtXmlTestResources; import org.openslx.libvirt.xml.LibvirtXmlValidationException; public class CapabilitiesTest { @BeforeAll public static void setUp() { // disable logging with log4j Configurator.setRootLevel( Level.OFF ); } private Capabilities newCapabilitiesInstance( String xmlFileName ) { Capabilities caps = null; try { caps = new Capabilities( LibvirtXmlTestResources.getLibvirtXmlFile( xmlFileName ) ); } catch ( LibvirtXmlDocumentException | LibvirtXmlSerializationException | LibvirtXmlValidationException e ) { final String errorMsg = new String( "Cannot prepare requested Libvirt capabilities XML file from the resources folder" ); fail( errorMsg ); } return caps; } @Test @DisplayName( "Get host UUID from libvirt XML capabilities file" ) public void testGetHostUuid() { final Capabilities caps = this.newCapabilitiesInstance( "qemu-kvm_capabilities_default.xml" ); assertEquals( "9b2f12af-1fba-444c-b72b-9cbc43fb3ca5", caps.getHostUuid() ); } @Test @DisplayName( "Get host CPU from libvirt XML capabilities file" ) public void testGetHostCpu() { final Capabilities caps = this.newCapabilitiesInstance( "qemu-kvm_capabilities_default.xml" ); final Cpu hostCpu = caps.getHostCpu(); assertNotNull( hostCpu ); assertEquals( "x86_64", hostCpu.getArch() ); assertEquals( "Skylake-Client-IBRS", hostCpu.getModel() ); assertEquals( "Intel", hostCpu.getVendor() ); assertEquals( 1, hostCpu.getTopologySockets() ); assertEquals( 1, hostCpu.getTopologyDies() ); assertEquals( 4, hostCpu.getTopologyCores() ); assertEquals( 1, hostCpu.getTopologyThreads() ); } @Test @DisplayName( "Get non-existent host CPU from libvirt XML capabilities file" ) public void testGetHostCpuNonExistent() { final Capabilities caps = this.newCapabilitiesInstance( "qemu-kvm_capabilities_no-cpu.xml" ); final Cpu hostCpu = caps.getHostCpu(); assertNull( hostCpu ); } @Test @DisplayName( "Get host CPU features from libvirt XML capabilities file" ) public void testGetHostCpuFeatures() { final Capabilities caps = this.newCapabilitiesInstance( "qemu-kvm_capabilities_default.xml" ); final Cpu hostCpu = caps.getHostCpu(); assertNotNull( hostCpu ); final List hostCpuFeatures = hostCpu.getFeatures(); assertNotNull( hostCpuFeatures ); assertEquals( 25, hostCpuFeatures.size() ); final Feature hostCpuFeature = hostCpuFeatures.get( 9 ); assertNotNull( hostCpuFeature ); assertEquals( "vmx", hostCpuFeature.getName() ); } @Test @DisplayName( "Get empty host CPU features from libvirt XML capabilities file" ) public void testGetHostCpuFeaturesEmpty() { final Capabilities caps = this.newCapabilitiesInstance( "qemu-kvm_capabilities_no-cpu-features.xml" ); final Cpu hostCpu = caps.getHostCpu(); assertNotNull( hostCpu ); final List hostCpuFeatures = hostCpu.getFeatures(); assertNotNull( hostCpuFeatures ); assertEquals( 0, hostCpuFeatures.size() ); } @Test @DisplayName( "Get host CPU pages from libvirt XML capabilities file" ) public void testGetHostCpuPages() { final Capabilities caps = this.newCapabilitiesInstance( "qemu-kvm_capabilities_default.xml" ); final Cpu hostCpu = caps.getHostCpu(); assertNotNull( hostCpu ); final List hostCpuPages = hostCpu.getPages(); assertNotNull( hostCpuPages ); assertEquals( 3, hostCpuPages.size() ); final Pages hostCpuPage = hostCpuPages.get( 2 ); assertNotNull( hostCpuPage ); assertEquals( new BigInteger( "1073741824" ).toString(), hostCpuPage.getSize().toString() ); } @Test @DisplayName( "Get empty host CPU pages from libvirt XML capabilities file" ) public void testGetHostCpuPagesEmpty() { final Capabilities caps = this.newCapabilitiesInstance( "qemu-kvm_capabilities_no-cpu-pages.xml" ); final Cpu hostCpu = caps.getHostCpu(); assertNotNull( hostCpu ); final List hostCpuPages = hostCpu.getPages(); assertNotNull( hostCpuPages ); assertEquals( 0, hostCpuPages.size() ); } @Test @DisplayName( "Get host IOMMU support from libvirt XML capabilities file" ) public void testGetHostIommuSupport() { final Capabilities caps = this.newCapabilitiesInstance( "qemu-kvm_capabilities_default.xml" ); assertEquals( true, caps.hasHostIommuSupport() ); } @Test @DisplayName( "Get non-existent host IOMMU support from libvirt XML capabilities file" ) public void testGetHostIommuSupportNonExistent() { final Capabilities caps = this.newCapabilitiesInstance( "qemu-kvm_capabilities_no-iommu.xml" ); assertEquals( false, caps.hasHostIommuSupport() ); } @Test @DisplayName( "Get guests from libvirt XML capabilities file" ) public void testGetGuests() { final Capabilities caps = this.newCapabilitiesInstance( "qemu-kvm_capabilities_default.xml" ); final List guests = caps.getGuests(); assertNotNull( guests ); assertEquals( 26, guests.size() ); final Guest guest = guests.get( 3 ); assertNotNull( guest ); assertEquals( OsType.HVM.toString(), guest.getOsType().toString() ); assertEquals( "aarch64", guest.getArchName() ); assertEquals( 64, guest.getArchWordSize() ); assertEquals( "/usr/bin/qemu-system-aarch64", guest.getArchEmulator() ); } @Test @DisplayName( "Get empty guests from libvirt XML capabilities file" ) public void testGetGuestsEmpty() { final Capabilities caps = this.newCapabilitiesInstance( "qemu-kvm_capabilities_no-guests.xml" ); final List guests = caps.getGuests(); assertNotNull( guests ); assertEquals( 0, guests.size() ); } @Test @DisplayName( "Get guest machines from libvirt XML capabilities file" ) public void testGetGuestMachines() { final Capabilities caps = this.newCapabilitiesInstance( "qemu-kvm_capabilities_default.xml" ); final List guests = caps.getGuests(); assertNotNull( guests ); assertEquals( 26, guests.size() ); final Guest guest = guests.get( 3 ); assertNotNull( guest ); final List guestMachines = guest.getArchMachines(); assertNotNull( guestMachines ); assertEquals( 89, guestMachines.size() ); final Machine guestMachine = guestMachines.get( 5 ); assertNotNull( guestMachine ); assertNull( guestMachine.getCanonicalMachine() ); assertEquals( 2, guestMachine.getMaxCpus() ); assertEquals( "nuri", guestMachine.getName() ); } @Test @DisplayName( "Get empty guest machines from libvirt XML capabilities file" ) public void testGetGuestMachinesEmpty() { final Capabilities caps = this.newCapabilitiesInstance( "qemu-kvm_capabilities_no-guest-machines.xml" ); final List guests = caps.getGuests(); assertNotNull( guests ); assertEquals( 26, guests.size() ); final Guest guest = guests.get( 3 ); assertNotNull( guest ); final List guestMachines = guest.getArchMachines(); assertNotNull( guestMachines ); assertEquals( 0, guestMachines.size() ); } @Test @DisplayName( "Get canonical guest machine from libvirt XML capabilities file" ) public void testGetGuestMachineCanonical() { final Capabilities caps = this.newCapabilitiesInstance( "qemu-kvm_capabilities_default.xml" ); final List guests = caps.getGuests(); assertNotNull( guests ); assertEquals( 26, guests.size() ); final Guest guest = guests.get( 3 ); assertNotNull( guest ); final List guestMachines = guest.getArchMachines(); assertNotNull( guestMachines ); assertEquals( 89, guestMachines.size() ); final Machine guestMachine = guestMachines.get( 29 ); assertNotNull( guestMachine ); assertEquals( "virt-5.2", guestMachine.getCanonicalMachine() ); assertEquals( 512, guestMachine.getMaxCpus() ); assertEquals( "virt", guestMachine.getName() ); } @Test @DisplayName( "Get guest machine domains from libvirt XML capabilities file" ) public void testGetGuestMachineDomains() { final Capabilities caps = this.newCapabilitiesInstance( "qemu-kvm_capabilities_default.xml" ); final List guests = caps.getGuests(); assertNotNull( guests ); assertEquals( 26, guests.size() ); final Guest guest = guests.get( 5 ); assertNotNull( guest ); final List guestDomains = guest.getArchDomains(); assertNotNull( guestDomains ); assertEquals( 2, guestDomains.size() ); final Domain guestDomain = guestDomains.get( 1 ); assertNotNull( guestDomain ); assertEquals( Type.KVM, guestDomain.getType() ); } @Test @DisplayName( "Get empty guest machine domains from libvirt XML capabilities file" ) public void testGetGuestMachineDomainsEmpty() { final Capabilities caps = this.newCapabilitiesInstance( "qemu-kvm_capabilities_no-guest-machines.xml" ); final List guests = caps.getGuests(); assertNotNull( guests ); assertEquals( 26, guests.size() ); final Guest guest = guests.get( 3 ); assertNotNull( guest ); final List guestDomains = guest.getArchDomains(); assertNotNull( guestDomains ); assertEquals( 0, guestDomains.size() ); } }