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

Reply via email to