diff --git a/api/src/main/java/com/cloud/vm/VmDetailConstants.java b/api/src/main/java/com/cloud/vm/VmDetailConstants.java index 512506e739c..bf43940c0a0 100644 --- a/api/src/main/java/com/cloud/vm/VmDetailConstants.java +++ b/api/src/main/java/com/cloud/vm/VmDetailConstants.java @@ -40,6 +40,10 @@ public interface VmDetailConstants { String KVM_VNC_PORT = "kvm.vnc.port"; String KVM_VNC_ADDRESS = "kvm.vnc.address"; + // KVM specific, custom virtual GPU hardware + String VIDEO_HARDWARE = "video.hardware"; + String VIDEO_RAM = "video.ram"; + // Mac OSX guest specific (internal) String SMC_PRESENT = "smc.present"; String FIRMWARE = "firmware"; diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java index 4b0b2b17609..46763a151f9 100644 --- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java @@ -2427,7 +2427,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv devices.addDevice(createChannelDef(vmTO)); devices.addDevice(createWatchDogDef()); - devices.addDevice(createVideoDef()); + devices.addDevice(createVideoDef(vmTO)); devices.addDevice(createConsoleDef()); devices.addDevice(createGraphicDef(vmTO)); devices.addDevice(createTabletInputDef()); @@ -2488,8 +2488,20 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv return new ConsoleDef(PTY, null, null, (short)0); } - protected VideoDef createVideoDef() { - return new VideoDef(_videoHw, _videoRam); + protected VideoDef createVideoDef(VirtualMachineTO vmTO) { + Map details = vmTO.getDetails(); + String videoHw = _videoHw; + int videoRam = _videoRam; + if (details != null) { + if (details.containsKey(VmDetailConstants.VIDEO_HARDWARE)) { + videoHw = details.get(VmDetailConstants.VIDEO_HARDWARE); + } + if (details.containsKey(VmDetailConstants.VIDEO_RAM)) { + String value = details.get(VmDetailConstants.VIDEO_RAM); + videoRam = NumbersUtil.parseInt(value, videoRam); + } + } + return new VideoDef(videoHw, videoRam); } protected RngDef createRngDef() { diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java index 78d17444523..d8b1d4e289a 100644 --- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java @@ -1624,9 +1624,13 @@ public class LibvirtVMDef { @Override public String toString() { StringBuilder videoBuilder = new StringBuilder(); - if (_videoModel != null && !_videoModel.isEmpty() && _videoRam != 0){ + if (_videoModel != null && !_videoModel.isEmpty()){ videoBuilder.append("\n"); return videoBuilder.toString(); } diff --git a/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResourceTest.java b/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResourceTest.java index 27399eadf8e..c744299b345 100644 --- a/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResourceTest.java +++ b/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResourceTest.java @@ -627,7 +627,7 @@ public class LibvirtComputingResourceTest { libvirtComputingResourceSpy._videoRam = 200; libvirtComputingResourceSpy._videoHw = "vGPU"; - VideoDef videoDef = libvirtComputingResourceSpy.createVideoDef(); + VideoDef videoDef = libvirtComputingResourceSpy.createVideoDef(to); Document domainDoc = parse(videoDef.toString()); assertXpath(domainDoc, "/video/model/@type", "vGPU"); assertXpath(domainDoc, "/video/model/@vram", "200"); diff --git a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java index 7c5a4864b3e..1a4446b807e 100644 --- a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java +++ b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java @@ -3879,6 +3879,8 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q if (HypervisorType.KVM.equals(hypervisorType)) { options.put(VmDetailConstants.ROOT_DISK_CONTROLLER, Arrays.asList("osdefault", "ide", "scsi", "virtio")); + options.put(VmDetailConstants.VIDEO_HARDWARE, Arrays.asList("cirrus", "vga", "qxl", "virtio")); + options.put(VmDetailConstants.VIDEO_RAM, Collections.emptyList()); } if (HypervisorType.VMware.equals(hypervisorType)) {