Frank Kobzik has uploaded a new change for review. Change subject: core: Import/Export VM/Template with graphics dev ......................................................................
core: Import/Export VM/Template with graphics dev (backwards compatibility is preserved - when importing vm has no graphics device and some video device, compatible graphics device is added to a vm on import.) Change-Id: Id14f0265f9f24e09be68b500b69b3eb5ac838413 Signed-off-by: Frantisek Kobzik <fkob...@redhat.com> Bug-Url: https://bugzilla.redhat.com/1033547 --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/OvfUpdateProcessHelper.java M backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/ovf/OvfHardware.java M backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/ovf/OvfReader.java M backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/ovf/OvfTemplateWriter.java M backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/ovf/OvfVmWriter.java M backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/ovf/OvfWriter.java 7 files changed, 102 insertions(+), 9 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/56/35856/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmCommand.java index a8df3fd..5924038 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmCommand.java @@ -51,7 +51,9 @@ import org.ovirt.engine.core.common.businessentities.DiskImageBase; import org.ovirt.engine.core.common.businessentities.DiskImageDynamic; import org.ovirt.engine.core.common.businessentities.DiskInterface; +import org.ovirt.engine.core.common.businessentities.DisplayType; import org.ovirt.engine.core.common.businessentities.Entities; +import org.ovirt.engine.core.common.businessentities.GraphicsDevice; import org.ovirt.engine.core.common.businessentities.GraphicsType; import org.ovirt.engine.core.common.businessentities.ImageDbOperationScope; import org.ovirt.engine.core.common.businessentities.ImageOperation; @@ -66,6 +68,7 @@ import org.ovirt.engine.core.common.businessentities.VMStatus; import org.ovirt.engine.core.common.businessentities.VmDevice; import org.ovirt.engine.core.common.businessentities.VmDeviceGeneralType; +import org.ovirt.engine.core.common.businessentities.VmDeviceId; import org.ovirt.engine.core.common.businessentities.VmDynamic; import org.ovirt.engine.core.common.businessentities.VmStatic; import org.ovirt.engine.core.common.businessentities.VmStatistics; @@ -145,6 +148,64 @@ } } ensureDomainMap(imageList, parameters.getDestDomainId()); + updateGraphicsDevices(); + } + + /** + * Checks whether imported VM has Graphics devices. + * - If the VM has Video devices and no Graphics devices, this method + * adds compatible graphics device to devices map (This could mean + * the exported VM has been created when we didn't have Graphics + * devices). + * - If the VM has no Video devices, no Graphics devices are added + * (we assume headless VM). + */ + private void updateGraphicsDevices() { + List<VmDevice> videoDevs = getDevicesOfType(VmDeviceGeneralType.VIDEO); + boolean hasNoGraphics = getDevicesOfType(VmDeviceGeneralType.GRAPHICS).isEmpty(); + + if (!videoDevs.isEmpty() && hasNoGraphics) { + GraphicsDevice compatibleGraphics = getCompatibleGraphics(VmDeviceType.getByName(videoDevs.get(0).getDevice())); + + if (compatibleGraphics != null) { + getVm().getStaticData().getManagedDeviceMap().put(compatibleGraphics.getDeviceId(), compatibleGraphics); + } + } + } + + private List<VmDevice> getDevicesOfType(VmDeviceGeneralType type) { + List<VmDevice> devices = new ArrayList<>(); + + if (getVm() != null && getVm().getStaticData() != null && getVm().getStaticData().getManagedDeviceMap() != null) { + for (VmDevice vmDevice : getVm().getStaticData().getManagedDeviceMap().values()) { + if (vmDevice.getType() == type) { + devices.add(vmDevice); + } + } + } + return devices; + } + + private GraphicsDevice getCompatibleGraphics(VmDeviceType videoDeviceType) { + if (videoDeviceType == null) { + return null; + } + + GraphicsDevice graphicsDevice = null; + GraphicsType compatibleType = null; + + for (Pair<GraphicsType, DisplayType> graphicsDisplayPair : osRepository.getGraphicsAndDisplays().get(getVm().getStaticData().getOsId()).get(getVdsGroup().getcompatibility_version())) { + if (graphicsDisplayPair.getSecond().getDefaultVmDeviceType() == videoDeviceType) { + compatibleType = graphicsDisplayPair.getFirst(); + } + } + + if (compatibleType != null) { + graphicsDevice = new GraphicsDevice(compatibleType.getCorrespondingDeviceType()); + graphicsDevice.setId(new VmDeviceId(Guid.newGuid(), getVmId())); + } + + return graphicsDevice; } @Override @@ -499,10 +560,8 @@ Set<GraphicsType> getGraphicsTypesForVm() { Set<GraphicsType> graphicsTypes = new HashSet<>(); - for (VmDevice vmDevice : getVm().getManagedVmDeviceMap().values()) { - if (VmDeviceGeneralType.GRAPHICS == vmDevice.getType()) { - graphicsTypes.add(GraphicsType.fromVmDeviceType(VmDeviceType.valueOf(vmDevice.getDevice()))); - } + for (VmDevice graphics : getDevicesOfType(VmDeviceGeneralType.GRAPHICS)) { + graphicsTypes.add(GraphicsType.fromVmDeviceType(VmDeviceType.getByName(graphics.getDevice()))); } return graphicsTypes; diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/OvfUpdateProcessHelper.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/OvfUpdateProcessHelper.java index 63ddf2d..c3df197 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/OvfUpdateProcessHelper.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/OvfUpdateProcessHelper.java @@ -81,7 +81,7 @@ * Loads additional need vm data for it's ovf */ protected void loadVmData(VM vm) { - setManagedVideoDevices(vm.getStaticData()); + setGraphicsAndVideoDevices(vm.getStaticData()); if (vm.getInterfaces().isEmpty()) { vm.setInterfaces(getVmNetworkInterfaceDao().getAllForVm(vm.getId())); } @@ -95,15 +95,20 @@ } } - private void setManagedVideoDevices(VmBase vmBase) { + private void setGraphicsAndVideoDevices(VmBase vmBase) { + setManagedDevices(vmBase, VmDeviceGeneralType.VIDEO); + setManagedDevices(vmBase, VmDeviceGeneralType.GRAPHICS); + } + + private void setManagedDevices(VmBase vmBase, VmDeviceGeneralType type) { Map<Guid, VmDevice> managedDeviceMap = vmBase.getManagedDeviceMap(); if (managedDeviceMap == null) { - managedDeviceMap = new HashMap<Guid, VmDevice>(); + managedDeviceMap = new HashMap<>(); } List<VmDevice> devices = DbFacade.getInstance() .getVmDeviceDao() - .getVmDeviceByVmIdAndType(vmBase.getId(), VmDeviceGeneralType.VIDEO); + .getVmDeviceByVmIdAndType(vmBase.getId(), type); for (VmDevice device : devices) { managedDeviceMap.put(device.getDeviceId(), device); } @@ -128,7 +133,7 @@ * Loads additional need template data for it's ovf */ protected void loadTemplateData(VmTemplate template) { - setManagedVideoDevices(template); + setGraphicsAndVideoDevices(template); if (template.getInterfaces() == null || template.getInterfaces().isEmpty()) { template.setInterfaces(getVmNetworkInterfaceDao() .getAllForTemplate(template.getId())); diff --git a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/ovf/OvfHardware.java b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/ovf/OvfHardware.java index c39f615..4eead25 100644 --- a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/ovf/OvfHardware.java +++ b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/ovf/OvfHardware.java @@ -9,4 +9,5 @@ public static final String DiskImage = "17"; public static final String Monitor = "20"; public static final String USB = "23"; + public static final String Graphics = "26"; } diff --git a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/ovf/OvfReader.java b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/ovf/OvfReader.java index 8d6c0da..05b8364 100644 --- a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/ovf/OvfReader.java +++ b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/ovf/OvfReader.java @@ -356,6 +356,10 @@ readMonitorItem(node); break; + case OvfHardware.Graphics: + readManagedVmDevice(node, Guid.newGuid()); // so far graphics doesn't contain anything special + break; + case OvfHardware.CD: readCdItem(node); break; diff --git a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/ovf/OvfTemplateWriter.java b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/ovf/OvfTemplateWriter.java index 9db9203..723f19a 100644 --- a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/ovf/OvfTemplateWriter.java +++ b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/ovf/OvfTemplateWriter.java @@ -249,6 +249,8 @@ // monitors writeMonitors(_vmTemplate); + // graphics + writeGraphics(vmBase); // CD writeCd(_vmTemplate); // ummanged devices diff --git a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/ovf/OvfVmWriter.java b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/ovf/OvfVmWriter.java index 97bd737..9334879 100644 --- a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/ovf/OvfVmWriter.java +++ b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/ovf/OvfVmWriter.java @@ -336,6 +336,8 @@ // monitors writeMonitors(vmBase); + // graphics + writeGraphics(vmBase); // CD writeCd(vmBase); // ummanged devices diff --git a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/ovf/OvfWriter.java b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/ovf/OvfWriter.java index d224671..eb90db6 100644 --- a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/ovf/OvfWriter.java +++ b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/ovf/OvfWriter.java @@ -464,6 +464,26 @@ } } + protected void writeGraphics(VmBase vmBase) { + Collection<VmDevice> devices = vmBase.getManagedDeviceMap().values(); + for (VmDevice vmDevice : devices) { + if (vmDevice.getType() == VmDeviceGeneralType.GRAPHICS) { + _writer.WriteStartElement("Item"); + _writer.WriteStartElement(RASD_URI, "Caption"); + _writer.WriteRaw("Graphical Framebuffer"); + _writer.WriteEndElement(); + _writer.WriteStartElement(RASD_URI, "InstanceId"); + _writer.WriteRaw(vmDevice.getId().getDeviceId().toString()); + _writer.WriteEndElement(); + _writer.WriteStartElement(RASD_URI, "ResourceType"); + _writer.WriteRaw(OvfHardware.Graphics); + _writer.WriteEndElement(); + writeVmDeviceInfo(vmDevice); + _writer.WriteEndElement(); // item + } + } + } + protected void writeCd(VmBase vmBase) { Collection<VmDevice> devices = vmBase.getManagedDeviceMap().values(); for (VmDevice vmDevice : devices) { -- To view, visit http://gerrit.ovirt.org/35856 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Id14f0265f9f24e09be68b500b69b3eb5ac838413 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Frank Kobzik <fkob...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches