diff --git a/plugins/integrations/veeam-control-service/src/main/java/org/apache/cloudstack/veeam/adapter/ServerAdapter.java b/plugins/integrations/veeam-control-service/src/main/java/org/apache/cloudstack/veeam/adapter/ServerAdapter.java index d83c64504f5..530edf4cfa9 100644 --- a/plugins/integrations/veeam-control-service/src/main/java/org/apache/cloudstack/veeam/adapter/ServerAdapter.java +++ b/plugins/integrations/veeam-control-service/src/main/java/org/apache/cloudstack/veeam/adapter/ServerAdapter.java @@ -148,6 +148,8 @@ import com.cloud.network.dao.NetworkDao; import com.cloud.network.dao.NetworkVO; import com.cloud.offering.ServiceOffering; import com.cloud.org.Grouping; +import com.cloud.projects.Project; +import com.cloud.projects.ProjectService; import com.cloud.server.ResourceTag; import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.storage.Volume; @@ -164,6 +166,7 @@ import com.cloud.user.UserAccount; import com.cloud.uservm.UserVm; import com.cloud.utils.EnumUtils; import com.cloud.utils.Pair; +import com.cloud.utils.Ternary; import com.cloud.utils.component.ComponentContext; import com.cloud.utils.component.ManagerBase; import com.cloud.utils.exception.CloudRuntimeException; @@ -288,6 +291,9 @@ public class ServerAdapter extends ManagerBase { @Inject NetworkModel networkModel; + @Inject + ProjectService projectService; + protected static Tag getDummyTagByName(String name) { Tag tag = new Tag(); String id = UUID.nameUUIDFromBytes(String.format("veeam:%s", name.toLowerCase()).getBytes()).toString(); @@ -522,6 +528,28 @@ public class ServerAdapter extends ManagerBase { allContent); } + Ternary getVmOwner(Vm request) { + String accountUuid = request.getAccountId(); + if (StringUtils.isBlank(accountUuid)) { + return new Ternary<>(null, null, null); + } + Account account = accountService.getActiveAccountByUuid(accountUuid); + if (account == null) { + logger.warn("Account with ID {} not found, unable to determine owner for VM creation request", accountUuid); + return new Ternary<>(null, null, null); + } + Long projectId = null; + if (Account.Type.PROJECT.equals(account.getType())) { + Project project = projectService.findByProjectAccountId(account.getId()); + if (project == null) { + logger.warn("Project for {} not found, unable to determine owner for VM creation request", account); + return new Ternary<>(null, null, null); + } + projectId = project.getId(); + } + return new Ternary<>(account.getDomainId(), account.getAccountName(), projectId); + } + public Vm createInstance(Vm request) { if (request == null) { throw new InvalidParameterValueException("Request disk data is empty"); @@ -573,16 +601,29 @@ public class ServerAdapter extends ManagerBase { bootType = ApiConstants.BootType.UEFI; bootMode = ApiConstants.BootMode.SECURE; } + Ternary owner = getVmOwner(request); + String serviceOfferingUuid = null; + if (request.getCpuProfile() != null && StringUtils.isNotEmpty(request.getCpuProfile().getId())) { + serviceOfferingUuid = request.getCpuProfile().getId(); + } Pair serviceUserAccount = getServiceAccount(); CallContext ctx = CallContext.register(serviceUserAccount.first(), serviceUserAccount.second()); try { - return createInstance(zoneId, clusterId, name, displayName, cpu, memory, userdata, bootType, bootMode); + return createInstance(zoneId, clusterId, owner.first(), owner.second(), owner.third(), name, displayName, + serviceOfferingUuid, cpu, memory, userdata, bootType, bootMode); } finally { CallContext.unregister(); } } - protected ServiceOffering getServiceOfferingIdForVmCreation(long zoneId, int cpu, long memory) { + protected ServiceOffering getServiceOfferingIdForVmCreation(String serviceOfferingUuid, long zoneId, int cpu, long memory) { + if (StringUtils.isNotBlank(serviceOfferingUuid)) { + ServiceOffering offering = serviceOfferingDao.findByUuid(serviceOfferingUuid); + if (offering != null && !offering.isCustomized()) { + // ToDo: check offering is available in the specified zone and matches the requested cpu/memory if it's not a custom offering + return offering; + } + } ListServiceOfferingsCmd cmd = new ListServiceOfferingsCmd(); ComponentContext.inject(cmd); cmd.setZoneId(zoneId); @@ -597,9 +638,10 @@ public class ServerAdapter extends ManagerBase { return serviceOfferingDao.findByUuid(uuid); } - protected Vm createInstance(Long zoneId, Long clusterId, String name, String displayName, int cpu, long memory, - String userdata, ApiConstants.BootType bootType, ApiConstants.BootMode bootMode) { - ServiceOffering serviceOffering = getServiceOfferingIdForVmCreation(zoneId, cpu, memory); + protected Vm createInstance(Long zoneId, Long clusterId, Long domainId, String accountName, Long projectId, + String name, String displayName, String serviceOfferingUuid, int cpu, long memory, String userdata, + ApiConstants.BootType bootType, ApiConstants.BootMode bootMode) { + ServiceOffering serviceOffering = getServiceOfferingIdForVmCreation(serviceOfferingUuid, zoneId, cpu, memory); if (serviceOffering == null) { throw new CloudRuntimeException("No service offering found for VM creation with specified CPU and memory"); } @@ -608,6 +650,13 @@ public class ServerAdapter extends ManagerBase { ComponentContext.inject(cmd); cmd.setZoneId(zoneId); cmd.setClusterId(clusterId); + if (domainId != null && StringUtils.isNotEmpty(accountName)) { + cmd.setDomainId(domainId); + cmd.setAccountName(accountName); + } + if (projectId != null) { + cmd.setProjectId(projectId); + } cmd.setName(name); if (displayName != null) { cmd.setDisplayName(displayName); @@ -623,6 +672,7 @@ public class ServerAdapter extends ManagerBase { cmd.setBootMode(bootMode.toString()); } // ToDo: handle any other field? + // Handle custom offerings cmd.setHypervisor(Hypervisor.HypervisorType.KVM.name()); cmd.setBlankInstance(true); Map details = new HashMap<>(); @@ -1007,6 +1057,7 @@ public class ServerAdapter extends ManagerBase { if (Account.Type.PROJECT.equals(account.getType())) { cmd.setProjectId(account.getId()); } + cmd.setSkipNetwork(true); userVmService.moveVmToUser(cmd); } catch (ResourceAllocationException | CloudRuntimeException | ResourceUnavailableException | InsufficientCapacityException e) { diff --git a/plugins/integrations/veeam-control-service/src/main/java/org/apache/cloudstack/veeam/api/dto/OvfXmlUtil.java b/plugins/integrations/veeam-control-service/src/main/java/org/apache/cloudstack/veeam/api/dto/OvfXmlUtil.java index ebee1e242d6..8ca75a27485 100644 --- a/plugins/integrations/veeam-control-service/src/main/java/org/apache/cloudstack/veeam/api/dto/OvfXmlUtil.java +++ b/plugins/integrations/veeam-control-service/src/main/java/org/apache/cloudstack/veeam/api/dto/OvfXmlUtil.java @@ -180,13 +180,15 @@ public class OvfXmlUtil { sb.append("").append(vo.getAccountUuid()).append(""); sb.append("").append(vo.getDomainUuid()).append(""); sb.append("").append(escapeText(vo.getProjectUuid())).append(""); - sb.append("").append(vo.getServiceOfferingUuid()).append(""); + if (vm.getCpuProfile() != null && StringUtils.isNotBlank(vm.getCpuProfile().getId())) { + sb.append("").append(vm.getCpuProfile().getId()).append(""); + } sb.append(""); for (DiskAttachment da : diskAttachments(vm)) { if (da == null || da.getDisk() == null || StringUtils.isBlank(da.getDisk().getId())) { continue; } - final org.apache.cloudstack.veeam.api.dto.Disk d = da.getDisk(); + final Disk d = da.getDisk(); sb.append(""); sb.append("").append(escapeText(d.getId())).append(""); sb.append("").append(d.getDiskProfile().getId()).append(""); @@ -416,62 +418,105 @@ public class OvfXmlUtil { // Register namespace context for XPath xpath.setNamespaceContext(new OvfNamespaceContext()); + + Node contentNode = (Node) xpath.evaluate( + "//*[local-name()='Content']", + doc, + XPathConstants.NODE + ); + updateFromXmlContentNode(vm, contentNode, xpath); + Node hwSection = (Node) xpath.evaluate( "//*[local-name()='Section' and @*[local-name()='type']='ovf:VirtualHardwareSection_Type']", doc, XPathConstants.NODE ); + updateFromXmlHardwareSection(vm, hwSection, xpath); - if (hwSection != null) { - // Memory - NodeList memItems = (NodeList) xpath.evaluate( - ".//*[local-name()='Item'][*[local-name()='ResourceType' and text()='4']]", - hwSection, - XPathConstants.NODESET - ); - if (memItems != null && memItems.getLength() > 0) { - Node memItem = memItems.item(0); - String memStr = childText(memItem, "VirtualQuantity"); - if (StringUtils.isNotBlank(memStr)) { - vm.setMemory(memStr); - } - } - - // CPU - NodeList cpuItems = (NodeList) xpath.evaluate( - ".//*[local-name()='Item'][*[local-name()='ResourceType' and text()='3']]", - hwSection, - XPathConstants.NODESET - ); - if (cpuItems != null && cpuItems.getLength() > 0) { - Node cpuItem = cpuItems.item(0); - String socketsStr = childText(cpuItem, "num_of_sockets"); - String coresStr = childText(cpuItem, "cpu_per_socket"); - String threadsStr = childText(cpuItem, "threads_per_cpu"); - - if (vm.getCpu() == null) { - vm.setCpu(new Cpu()); - } - if (vm.getCpu().getTopology() == null) { - vm.getCpu().setTopology(new Topology()); - } - - if (StringUtils.isNotBlank(socketsStr)) { - vm.getCpu().getTopology().setSockets(socketsStr); - } - if (StringUtils.isNotBlank(coresStr)) { - vm.getCpu().getTopology().setCores(coresStr); - } - if (StringUtils.isNotBlank(threadsStr)) { - vm.getCpu().getTopology().setThreads(threadsStr); - } - } - } + Node metadataSection = (Node) xpath.evaluate( + "//*[local-name()='Section' and @*[local-name()='type']='ovf:CloudStackMetadata_Type']", + doc, + XPathConstants.NODE + ); + updateFromXmlCloudStackMetadataSection(vm, metadataSection, xpath); } catch (Exception e) { // Ignore parsing errors and keep original VM configuration } } + private static void updateFromXmlContentNode(Vm vm, Node contentNode, XPath xpath) { + if (contentNode == null) { + return; + } + String userId = xpathString(xpath, contentNode, "./*[local-name()='CreatedByUserId']/text()"); + if (StringUtils.isNotBlank(userId)) { + vm.setAccountId(userId); + } + String templateId = xpathString(xpath, contentNode, "./*[local-name()='TemplateId']/text()"); + if (StringUtils.isNotBlank(templateId)) { + vm.setTemplate(Ref.of("", templateId)); + } + } + + private static void updateFromXmlHardwareSection(Vm vm, Node hwSection, XPath xpath) throws XPathExpressionException { + if (hwSection == null) { + return; + } + // Memory + NodeList memItems = (NodeList) xpath.evaluate( + ".//*[local-name()='Item'][*[local-name()='ResourceType' and text()='4']]", + hwSection, + XPathConstants.NODESET + ); + if (memItems != null && memItems.getLength() > 0) { + Node memItem = memItems.item(0); + String memStr = childText(memItem, "VirtualQuantity"); + if (StringUtils.isNotBlank(memStr)) { + vm.setMemory(memStr); + } + } + + // CPU + NodeList cpuItems = (NodeList) xpath.evaluate( + ".//*[local-name()='Item'][*[local-name()='ResourceType' and text()='3']]", + hwSection, + XPathConstants.NODESET + ); + if (cpuItems != null && cpuItems.getLength() > 0) { + Node cpuItem = cpuItems.item(0); + String socketsStr = childText(cpuItem, "num_of_sockets"); + String coresStr = childText(cpuItem, "cpu_per_socket"); + String threadsStr = childText(cpuItem, "threads_per_cpu"); + + if (vm.getCpu() == null) { + vm.setCpu(new Cpu()); + } + if (vm.getCpu().getTopology() == null) { + vm.getCpu().setTopology(new Topology()); + } + + if (StringUtils.isNotBlank(socketsStr)) { + vm.getCpu().getTopology().setSockets(socketsStr); + } + if (StringUtils.isNotBlank(coresStr)) { + vm.getCpu().getTopology().setCores(coresStr); + } + if (StringUtils.isNotBlank(threadsStr)) { + vm.getCpu().getTopology().setThreads(threadsStr); + } + } + } + + private static void updateFromXmlCloudStackMetadataSection(Vm vm, Node metadataSection, XPath xpath) { + if (metadataSection == null) { + return; + } + String serviceOfferingId = xpathString(xpath, metadataSection, ".//*[local-name()='ServiceOfferingId']/text()"); + if (StringUtils.isNotBlank(serviceOfferingId)) { + vm.setCpuProfile(Ref.of("", serviceOfferingId)); + } + } + private static String xpathString(XPath xpath, Document doc, String expression) { try { String value = (String) xpath.evaluate(expression, doc, XPathConstants.STRING); @@ -481,6 +526,18 @@ public class OvfXmlUtil { } } + private static String xpathString(XPath xpath, Node node, String expression) { + if (node == null) { + return null; + } + try { + String value = (String) xpath.evaluate(expression, node, XPathConstants.STRING); + return StringUtils.isBlank(value) ? null : value.trim(); + } catch (XPathExpressionException e) { + return null; + } + } + private static String childText(Node parent, String localName) { if (parent == null || StringUtils.isBlank(localName)) { return null; diff --git a/plugins/integrations/veeam-control-service/src/main/java/org/apache/cloudstack/veeam/api/dto/Vm.java b/plugins/integrations/veeam-control-service/src/main/java/org/apache/cloudstack/veeam/api/dto/Vm.java index 227845a37b0..700124899dd 100644 --- a/plugins/integrations/veeam-control-service/src/main/java/org/apache/cloudstack/veeam/api/dto/Vm.java +++ b/plugins/integrations/veeam-control-service/src/main/java/org/apache/cloudstack/veeam/api/dto/Vm.java @@ -19,6 +19,7 @@ package org.apache.cloudstack.veeam.api.dto; import java.util.List; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; @@ -71,6 +72,9 @@ public final class Vm extends BaseDto { public EmptyElement timeZone = new EmptyElement(); public EmptyElement display = new EmptyElement(); + // CloudStack-specific fields + private String accountId; + public String getName() { return name; } @@ -279,6 +283,15 @@ public final class Vm extends BaseDto { this.cpuProfile = cpuProfile; } + @JsonIgnore + public String getAccountId() { + return accountId; + } + + public void setAccountId(String accountId) { + this.accountId = accountId; + } + @JsonInclude(JsonInclude.Include.NON_NULL) public static final class Bios { diff --git a/plugins/integrations/veeam-control-service/src/main/resources/test.xml b/plugins/integrations/veeam-control-service/src/main/resources/test.xml index 8d39bd42480..5af3b9be435 100644 --- a/plugins/integrations/veeam-control-service/src/main/resources/test.xml +++ b/plugins/integrations/veeam-control-service/src/main/resources/test.xml @@ -5,21 +5,39 @@ xmlns:vssd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_VirtualSystemSettingData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ovf:version="4.4.0.0"> - + List of networks + + +
List of Virtual Disks - + +
+
+ CloudStack specific metadata + + 644c6f0d-f6f9-11f0-9061-5254002b5a70 + 425cf134-f6f9-11f0-9061-5254002b5a70 + + 731da585-5259-46f3-bf2d-a71f62178acf + + + 5b08702c-3e4b-45fc-ba1c-425c54e69498 + 9468baee-f467-4806-9520-d313d7362694 + + +
- test-vm-abhisar - + adm-v10 + adm-v10 - 2026/01/07 13:37:09 - 2026/01/08 04:07:00 + 2026/02/26 05:36:58 + 2026/03/11 07:25:03 false guest_agent false @@ -30,12 +48,12 @@ 4.8 1 AUTO_RESUME - 1024 + 512 false false false 0 - c067a148-e4d5-11f0-98ce-00163e6c35f4 + 644c6f0d-f6f9-11f0-9061-5254002b5a70 0 false true @@ -48,32 +66,32 @@ - 4096 + 512 true false false - true + false 0 - Default - 00000000-0000-0000-0000-000000000000 - Blank + + e1a8db34-6eb4-41e0-97b8-898420437df8 + e1a8db34-6eb4-41e0-97b8-898420437df8 true 3 - 95e46398-e4d5-11f0-bb71-00163e6c35f4 + 00000000-0000-0000-0000-000000000000 2 false - 00000000-0000-0000-0000-000000000000 - Blank + e1a8db34-6eb4-41e0-97b8-898420437df8 + e1a8db34-6eb4-41e0-97b8-898420437df8 false - 2026/01/07 13:37:09 - 2026/01/07 13:38:03 + 2026/03/10 05:05:50 + 2026/02/26 05:36:58 0 -
+
Guest Operating System - other + linux
- 1 CPU, 1024 Memory + 1 CPU, 512 Memory ENGINE 4.4.0.0 @@ -85,49 +103,49 @@ 1 1 1 - 16 + 1 1 - 1024 MB of memory + 512 MB of memory Memory Size 2 4 MegaBytes - 1024 + 512 - test-vm-abhisar_Disk1 - 5cbc2ed5-de89-44a4-aa58-b7161f8afaf8 + ROOT-139 + 5b08702c-3e4b-45fc-ba1c-425c54e69498 17 - ddf18375-4c69-4ec5-8371-6dabc94e4e60/5cbc2ed5-de89-44a4-aa58-b7161f8afaf8 + 22e65515-04e6-374e-95e0-981dab9e7fe2/5b08702c-3e4b-45fc-ba1c-425c54e69498 00000000-0000-0000-0000-000000000000 - 00000000-0000-0000-0000-000000000000 + e1a8db34-6eb4-41e0-97b8-898420437df8 - 41609681-c92a-410a-bcc2-5b5e1305cdd1 - 91f4d826-e4d5-11f0-bd93-00163e6c35f4 - 2026/01/07 13:36:59 - 2026/01/07 13:53:36 - 2026/01/08 04:07:00 + 22e65515-04e6-374e-95e0-981dab9e7fe2 + 00000000-0000-0000-0000-000000000000 + 2026/02/26 05:36:58 + 2026/03/11 07:25:03 + 2026/03/11 07:25:03 disk disk {type=drive, bus=0, controller=0, target=0, unit=0} 1 true false - ua-ddf18375-4c69-4ec5-8371-6dabc94e4e60 + ua-22e65515-04e6-374e-95e0-981dab9e7fe2/5b08702c-3e4b-45fc-ba1c-425c54e69498 Ethernet adapter on [No Network] - 9a6f804d-b305-41db-b1b4-bdfd82c4b446 + 07e8e63c-13b5-4a01-9b41-6f97847d2534 10 3 - + Network-07e8e63c-13b5-4a01-9b41-6f97847d2534 true - nic1 - nic1 - 56:6f:9f:c0:00:07 + ExternalGuestNetworkGuru + ExternalGuestNetworkGuru + 02:01:00:dd:00:0c 10000 interface bridge @@ -135,7 +153,7 @@ 0 true false - ua-9a6f804d-b305-41db-b1b4-bdfd82c4b446 + ua-07e8e63c-13b5-4a01-9b41-6f97847d2534 USB Controller @@ -143,476 +161,20 @@ 23 DISABLED - - Graphical Controller - 0d4a490c-f9d7-45dd-8686-69d5bae218d6 - 20 - 1 - false - video - vga - {type=pci, slot=0x01, bus=0x00, domain=0x0000, function=0x0} - 0 - true - false - ua-0d4a490c-f9d7-45dd-8686-69d5bae218d6 - - 16384 - - - - Graphical Framebuffer - f62554f1-05fe-472e-a34b-9e6b980ad59f - 26 - graphics - vnc - - 0 - true - false - - - - CDROM - 9c38cc6a-9def-46f3-bf1c-2b3f4aa6b764 - 15 - disk - cdrom - {type=drive, bus=0, controller=0, target=0, unit=2} - 0 - true - true - ua-9c38cc6a-9def-46f3-bf1c-2b3f4aa6b764 - - - - 0 - a737450e-20b5-427e-a18b-85ec20683e31 - channel - unix - {type=virtio-serial, bus=0, controller=0, port=1} - 0 - true - false - channel0 - - - 0 - 1d3ba276-9e8d-4a16-9cdf-dfd25180b7bc - channel - unix - {type=virtio-serial, bus=0, controller=0, port=2} - 0 - true - false - channel1 - - - 0 - 8f21ce42-9499-4ded-88d4-04dff2fdc3ff - controller - pci - {type=pci, slot=0x02, bus=0x00, domain=0x0000, function=0x0, multifunction=on} - 0 - true - false - pci.1 - - 1 - pcie-root-port - - - - 0 - d1b9d421-1a57-469d-97fe-0682ad4594c3 - controller - pci - {type=pci, slot=0x02, bus=0x00, domain=0x0000, function=0x1} - 0 - true - false - pci.2 - - 2 - pcie-root-port - - - - 0 - 768c4772-eb7a-4f0f-85a7-2b94e20fe78c - controller - pci - {type=pci, slot=0x02, bus=0x00, domain=0x0000, function=0x2} - 0 - true - false - pci.3 - - 3 - pcie-root-port - - - - 0 - d20bae3b-f5d7-4131-b00a-3cf66f390434 - controller - pci - {type=pci, slot=0x02, bus=0x00, domain=0x0000, function=0x3} - 0 - true - false - pci.4 - - 4 - pcie-root-port - - - - 0 - 5887f3ad-c575-488e-9138-fca9c7064ae5 - controller - pci - {type=pci, slot=0x02, bus=0x00, domain=0x0000, function=0x4} - 0 - true - false - pci.5 - - 5 - pcie-root-port - - - - 0 - f880f086-227e-4e25-b2fc-8a3d13d1f1bd - controller - pci - {type=pci, slot=0x02, bus=0x00, domain=0x0000, function=0x5} - 0 - true - false - pci.6 - - 6 - pcie-root-port - - - - 0 - d64f62a0-6176-482b-8d24-f82fb32b8f12 - controller - pci - {type=pci, slot=0x02, bus=0x00, domain=0x0000, function=0x6} - 0 - true - false - pci.7 - - 7 - pcie-root-port - - - - 0 - 1544f32e-1e94-4e10-b198-7c5e95ab280d - controller - pci - {type=pci, slot=0x02, bus=0x00, domain=0x0000, function=0x7} - 0 - true - false - pci.8 - - 8 - pcie-root-port - - - - 0 - 7dd5080f-8c04-4593-8c6a-1dc5cd6c3e3e - controller - pci - {type=pci, slot=0x03, bus=0x00, domain=0x0000, function=0x0, multifunction=on} - 0 - true - false - pci.9 - - 9 - pcie-root-port - - - - 0 - 4dab4257-2729-482c-b4e1-6a3c05161153 - controller - pci - {type=pci, slot=0x03, bus=0x00, domain=0x0000, function=0x1} - 0 - true - false - pci.10 - - 10 - pcie-root-port - - - - 0 - 99effa2f-2963-4abd-9eab-1cbe8e913ca4 - controller - pci - {type=pci, slot=0x03, bus=0x00, domain=0x0000, function=0x2} - 0 - true - false - pci.11 - - 11 - pcie-root-port - - - - 0 - 2a376983-897b-4396-be32-89f2a9ca7d22 - controller - pci - {type=pci, slot=0x03, bus=0x00, domain=0x0000, function=0x3} - 0 - true - false - pci.12 - - 12 - pcie-root-port - - - - 0 - 2e763d82-4475-4268-bc0a-07c915ec19c8 - controller - pci - {type=pci, slot=0x03, bus=0x00, domain=0x0000, function=0x4} - 0 - true - false - pci.13 - - 13 - pcie-root-port - - - - 0 - ef39155f-760e-4374-afb9-ff05cc8b9609 - controller - pci - {type=pci, slot=0x03, bus=0x00, domain=0x0000, function=0x5} - 0 - true - false - pci.14 - - 14 - pcie-root-port - - - - 0 - 74be06f0-84b6-472e-a054-486343f66084 - controller - pci - {type=pci, slot=0x03, bus=0x00, domain=0x0000, function=0x6} - 0 - true - false - pci.15 - - 15 - pcie-root-port - - - - 0 - c68db43a-fa3a-4689-941d-b477d2676d27 - controller - pci - {type=pci, slot=0x03, bus=0x00, domain=0x0000, function=0x7} - 0 - true - false - pci.16 - - 16 - pcie-root-port - - - - 0 - d11cbe26-ee82-4e15-b8eb-2aa7b285d00d - controller - pci - {type=pci, slot=0x04, bus=0x00, domain=0x0000, function=0x0, multifunction=on} - 0 - true - false - pci.17 - - 17 - pcie-root-port - - - - 0 - c2ef6c73-f633-41c1-8736-7e9c8d748ac2 - controller - pci - {type=pci, slot=0x04, bus=0x00, domain=0x0000, function=0x1} - 0 - true - false - pci.18 - - 18 - pcie-root-port - - - - 0 - 5944d260-08c3-4f12-aa22-1e9ac76ae6c0 - controller - pci - {type=pci, slot=0x04, bus=0x00, domain=0x0000, function=0x2} - 0 - true - false - pci.19 - - 19 - pcie-root-port - - - - 0 - 8c7ad6aa-ac22-4d98-86b7-45f3a13c98da - controller - pci - {type=pci, slot=0x04, bus=0x00, domain=0x0000, function=0x3} - 0 - true - false - pci.20 - - 20 - pcie-root-port - - - - 0 - dc1cfae5-682d-4bb5-a53e-d604852e62cd - controller - pci - {type=pci, slot=0x04, bus=0x00, domain=0x0000, function=0x4} - 0 - true - false - pci.21 - - 21 - pcie-root-port - - - - 0 - 6117753b-8ce6-4568-8e09-c8b686396334 - controller - sata - {type=pci, slot=0x1f, bus=0x00, domain=0x0000, function=0x2} - 0 - true - false - ide - - 0 - - - - 0 - 17976687-41f8-4f7c-97f5-a76a282c40e4 - controller - virtio-serial - {type=pci, slot=0x00, bus=0x03, domain=0x0000, function=0x0} - 0 - true - false - ua-17976687-41f8-4f7c-97f5-a76a282c40e4 - - - 0 - 97f6991c-e4d5-11f0-9b4a-00163e6c35f4 + a41e097e-329a-3be5-a9e8-9bc112fe5fac rng virtio {type=pci, slot=0x00, bus=0x06, domain=0x0000, function=0x0} 0 true false - ua-97f6991c-e4d5-11f0-9b4a-00163e6c35f4 + urandom - - 0 - 0eb75625-9891-4b03-9541-c58c43c323b2 - controller - virtio-scsi - {type=pci, slot=0x00, bus=0x02, domain=0x0000, function=0x0} - 0 - true - false - ua-0eb75625-9891-4b03-9541-c58c43c323b2 - - - - - - 0 - 59536909-bac6-4202-b2ad-d84a22a41013 - balloon - memballoon - {type=pci, slot=0x00, bus=0x05, domain=0x0000, function=0x0} - 0 - true - true - ua-59536909-bac6-4202-b2ad-d84a22a41013 - - virtio - - - - 0 - e95647b0-4bb2-4ccb-b867-cbde06311038 - controller - usb - {type=pci, slot=0x00, bus=0x04, domain=0x0000, function=0x0} - 0 - true - false - ua-e95647b0-4bb2-4ccb-b867-cbde06311038 - - 0 - qemu-xhci - - -
-
- - ACTIVE - Active VM - 2026/01/07 13:37:09 -
- \ No newline at end of file +