Omer Frenkel has uploaded a new change for review.

Change subject: core: refresh audio device for desktop on OS change (#867331)
......................................................................

core: refresh audio device for desktop on OS change (#867331)

https://bugzilla.redhat.com/show_bug.cgi?id=867331

when updating desktop vm OS, audio device might need to be changed,
according to config (DesktopAudioDeviceType)

this patch add logic to replace audio device on vm OS change.

Change-Id: Ic2f12f32661fc5276ca7417f48ebb949daf9bf5e
Signed-off-by: Omer Frenkel <[email protected]>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/utils/VmDeviceUtils.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VmInfoBuilderBase.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VmOldInfoBuilder.java
4 files changed, 37 insertions(+), 11 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/47/8747/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmCommand.java
index f583726..94867dc 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmCommand.java
@@ -9,10 +9,10 @@
 
 import org.apache.commons.codec.binary.Base64;
 import org.apache.commons.lang.StringUtils;
+import org.ovirt.engine.core.bll.quota.Quotable;
+import org.ovirt.engine.core.bll.utils.PermissionSubject;
 import org.ovirt.engine.core.bll.utils.VmDeviceUtils;
 import org.ovirt.engine.core.common.AuditLogType;
-import org.ovirt.engine.core.bll.utils.PermissionSubject;
-import org.ovirt.engine.core.bll.quota.Quotable;
 import org.ovirt.engine.core.common.VdcObjectType;
 import org.ovirt.engine.core.common.action.VmManagementParametersBase;
 import org.ovirt.engine.core.common.businessentities.ActionGroup;
@@ -69,16 +69,16 @@
 
     @Override
     protected void executeVmCommand() {
-        VmStatic oldVmStatic = getVm().getStaticData();
+        VM oldVm = getVm();
         VmStatic newVmStatic = getParameters().getVmStaticData();
-        newVmStatic.setcreation_date(oldVmStatic.getcreation_date());
+        newVmStatic.setcreation_date(oldVm.getStaticData().getcreation_date());
         if (newVmStatic.getcreation_date().equals(DateTime.getMinValue())) {
             newVmStatic.setcreation_date(new Date());
         }
         UpdateVmNetworks();
         getVmStaticDAO().update(newVmStatic);
         updateVmPayload();
-        VmDeviceUtils.updateVmDevices(getParameters(), oldVmStatic);
+        VmDeviceUtils.updateVmDevices(getParameters(), oldVm);
         if (((Boolean) runVdsCommand(VDSCommandType.IsValid,
                 new 
IrsBaseVDSCommandParameters(getVm().getstorage_pool_id())).getReturnValue())) {
 
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/utils/VmDeviceUtils.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/utils/VmDeviceUtils.java
index ec12901..94efffb 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/utils/VmDeviceUtils.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/utils/VmDeviceUtils.java
@@ -47,7 +47,8 @@
     /**
      * Update the vm devices according to changes made in vm static for 
existing VM
      */
-    public static void updateVmDevices(VmManagementParametersBase params, 
VmBase oldVmBase) {
+    public static void updateVmDevices(VmManagementParametersBase params, VM 
oldVm) {
+        VmBase oldVmBase = oldVm.getStaticData();
         VmBase entity = params.getVmStaticData();
         if (entity != null) {
             updateCdInVmDevice(oldVmBase, entity);
@@ -78,6 +79,30 @@
             }
             updateUSBSlots(oldVmBase, entity);
             updateMemoryBalloon(oldVmBase, entity, params.isBalloonEnabled());
+
+            updateAudioDevice(oldVm, entity);
+        }
+    }
+
+    private static void updateAudioDevice(VM oldVm, VmBase newVmBase) {
+        // for desktop, if the os type has changed, recreate Audio devices
+        if (newVmBase.getvm_type() == VmType.Desktop && oldVm.getos() != 
newVmBase.getos()) {
+            Guid vmId = oldVm.getId();
+            // remove any old sound device
+            List<VmDevice> list =
+                    DbFacade.getInstance()
+                            .getVmDeviceDao()
+                            .getVmDeviceByVmIdAndType(vmId, 
VmDeviceType.SOUND.getName());
+            removeNumberOfDevices(list, list.size());
+
+            // create new device
+            String soundDevice = VmInfoBuilderBase.getSoundDevice(newVmBase, 
oldVm.getvds_group_compatibility_version());
+            addManagedDevice(new VmDeviceId(Guid.NewGuid(), vmId),
+                    VmDeviceType.SOUND,
+                    VmDeviceType.getSoundDeviceType(soundDevice),
+                    new HashMap<String, Object>(),
+                    true,
+                    true);
         }
     }
 
@@ -195,7 +220,7 @@
             if (vmBase.getvm_type() == VmType.Desktop) {
                 List<VmDevice> list = 
DbFacade.getInstance().getVmDeviceDao().getVmDeviceByVmIdAndType(vmBase.getId(),
 VmDeviceType.SOUND.getName());
                 if (list.size() == 0) {
-                    String soundDevice = VmInfoBuilderBase.getSoundDevice(vm);
+                    String soundDevice = 
VmInfoBuilderBase.getSoundDevice(vm.getStaticData(), 
vm.getvds_group_compatibility_version());
                     addManagedDevice(new VmDeviceId(Guid.NewGuid(), 
vmBase.getId()),
                             VmDeviceType.SOUND,
                             VmDeviceType.getSoundDeviceType(soundDevice),
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VmInfoBuilderBase.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VmInfoBuilderBase.java
index 0865fd8..be6e356 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VmInfoBuilderBase.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VmInfoBuilderBase.java
@@ -14,11 +14,13 @@
 import org.ovirt.engine.core.common.businessentities.Network;
 import org.ovirt.engine.core.common.businessentities.VM;
 import org.ovirt.engine.core.common.businessentities.VMStatus;
+import org.ovirt.engine.core.common.businessentities.VmBase;
 import org.ovirt.engine.core.common.businessentities.VmType;
 import org.ovirt.engine.core.common.businessentities.network_cluster;
 import org.ovirt.engine.core.common.config.Config;
 import org.ovirt.engine.core.common.config.ConfigValues;
 import org.ovirt.engine.core.compat.TimeZoneInfo;
+import org.ovirt.engine.core.compat.Version;
 import org.ovirt.engine.core.compat.WindowsJavaTimezoneMapping;
 import org.ovirt.engine.core.dal.comparators.DiskImageByBootComparator;
 import org.ovirt.engine.core.dal.comparators.DiskImageByDiskAliasComparator;
@@ -197,7 +199,7 @@
      *            The VM
      * @return String, the sound card device type
      */
-    public static String getSoundDevice(VM vm) {
+    public static String getSoundDevice(VmBase vm, Version 
compatibilityVersion) {
         final String OS_REGEX = "^.*%1s,([^,]*).*$";
         final String DEFAULT_TYPE = "default";
         String ret = DEFAULT_TYPE;
@@ -205,8 +207,7 @@
         if (vm.getvm_type() == VmType.Desktop) {
 
             String soundDeviceTypeConfig = Config.<String> GetValue(
-                    ConfigValues.DesktopAudioDeviceType, vm
-                            .getvds_group_compatibility_version().toString());
+                    ConfigValues.DesktopAudioDeviceType, 
compatibilityVersion.toString());
             String vmOS = vm.getos().name();
 
             Pattern regexPattern = Pattern.compile(String
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VmOldInfoBuilder.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VmOldInfoBuilder.java
index 5dce40a..06bfbe8 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VmOldInfoBuilder.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VmOldInfoBuilder.java
@@ -195,7 +195,7 @@
     @Override
     protected void buildVmSoundDevices() {
         if (vm.getvm_type() == VmType.Desktop) {
-            createInfo.add(VdsProperties.soundDevice, getSoundDevice(vm));
+            createInfo.add(VdsProperties.soundDevice, 
getSoundDevice(vm.getStaticData(), vm.getvds_group_compatibility_version()));
         }
     }
 


--
To view, visit http://gerrit.ovirt.org/8747
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ic2f12f32661fc5276ca7417f48ebb949daf9bf5e
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Omer Frenkel <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to