Dudi Maroshi has uploaded a new change for review.

Change subject: core: Pinning vm to multiple hosts - persistency
......................................................................

core: Pinning vm to multiple hosts - persistency

In order to suport pinning to multiple hosts.
First stage is to provide list of pinned hosts, while preserving the
current mechanisms for single host pinning.
1. We refactored the core entity VmBase, replace field
  private Guid dedicatedVmForVds with --> private ArrayList<Guid> 
dedicatedVmForVdsList;
  We want dedicatedVmForVdsList to be immutable.
  Preserve current functionality with (get/set)SingleDedicatedVmForVds methods
  Lay progamatic foundation for (get/set)MultipleDedicatedVmForVds methods
2. Create table and view
  prefered_hosts
  prefered_hosts_view
3. Create database stored procedure to mange prefered_hosts
  prefered_host_sp.sql

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

Change-Id: If358803c75a57f908152f8fc43e901bcc14b13d0
Signed-off-by: Dudi Maroshi <[email protected]>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmTemplateCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmTemplateCommand.java
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/UpdateVmTemplateCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmHandler.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmManagementCommandBase.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/snapshots/SnapshotsManager.java
M 
backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/UpdateVmCommandTest.java
M 
backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/VmManagementCommandBaseTest.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VM.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VmBase.java
M 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmBaseDaoDbFacade.java
M 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmsResource.java
M 
backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/VmMapper.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/OvfWriter.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/Cloner.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/vm/DedicatedVmForVdsUnitToVmBaseBuilder.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/vm/DedicatedVmForVdsVmBaseToVmBaseBuilder.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewPoolModelBehavior.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewVmModelBehavior.java
M 
frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/TemplateVmModelBehavior.java
M 
frontend/webadmin/modules/uicommonweb/src/test/java/org/ovirt/engine/ui/uicommonweb/models/vms/BaseVmListModelTest.java
M packaging/dbscripts/create_views.sql
A packaging/dbscripts/dedicated_hosts_sp.sql
A packaging/dbscripts/upgrade/03_06_1450_add_multiple_dedicated_hosts_to_vm.sql
27 files changed, 137 insertions(+), 49 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/19/41619/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmCommand.java
index bcb64b7..1ce7888 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmCommand.java
@@ -415,8 +415,8 @@
     }
 
     protected boolean hostToRunExist() {
-        if (getParameters().getVmStaticData().getDedicatedVmForVds() != null) {
-            if 
(DbFacade.getInstance().getVdsDao().get(getParameters().getVmStaticData().getDedicatedVmForVds())
 == null) {
+        if (getParameters().getVmStaticData().getSingleDedicatedVmForVds() != 
null) {
+            if 
(DbFacade.getInstance().getVdsDao().get(getParameters().getVmStaticData().getSingleDedicatedVmForVds())
 == null) {
                 
addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_HOST_NOT_EXIST);
                 return false;
             }
@@ -1027,7 +1027,7 @@
         List<VmNumaNode> numaNodes = 
getParameters().getVmStaticData().getvNumaNodeList();
         VmNumaNodeOperationParameters params = new 
VmNumaNodeOperationParameters(getVmId(), numaNodes);
         
params.setNumaTuneMode(getParameters().getVmStaticData().getNumaTuneMode());
-        
params.setDedicatedHost(getParameters().getVmStaticData().getDedicatedVmForVds());
+        
params.setDedicatedHost(getParameters().getVmStaticData().getSingleDedicatedVmForVds());
         
params.setMigrationSupport(getParameters().getVmStaticData().getMigrationSupport());
         if (numaNodes == null || numaNodes.isEmpty()) {
             return;
@@ -1283,7 +1283,7 @@
             }
 
             // host-specific parameters can be changed by administration role 
only
-            if (vmFromParams.getDedicatedVmForVds() != null || 
!StringUtils.isEmpty(vmFromParams.getCpuPinning())) {
+            if (vmFromParams.getSingleDedicatedVmForVds() != null || 
!StringUtils.isEmpty(vmFromParams.getCpuPinning())) {
                 permissionList.add(new PermissionSubject(getVdsGroupId(),
                         VdcObjectType.VdsGroups, 
ActionGroup.EDIT_ADMIN_VM_PROPERTIES));
             }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmTemplateCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmTemplateCommand.java
index d324f7f..f157a13 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmTemplateCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmTemplateCommand.java
@@ -668,7 +668,7 @@
                         getParameters().getMasterVm().getKernelUrl(),
                         getParameters().getMasterVm().getKernelParams(),
                         getParameters().getMasterVm().getQuotaId(),
-                        getParameters().getMasterVm().getDedicatedVmForVds(),
+                        
getParameters().getMasterVm().getSingleDedicatedVmForVds(),
                         getParameters().getMasterVm().getMigrationSupport(),
                         
getParameters().getMasterVm().isAllowConsoleReconnect(),
                         getParameters().getMasterVm().getIsoPath(),
@@ -889,7 +889,7 @@
                         getActionType().getActionGroup()));
 
                 // host-specific parameters can be changed by administration 
role only
-                if (getParameters().getMasterVm().getDedicatedVmForVds() != 
null ||
+                if (getParameters().getMasterVm().getSingleDedicatedVmForVds() 
!= null ||
                         
!StringUtils.isEmpty(getParameters().getMasterVm().getCpuPinning())) {
                     permissionCheckSubject.add(
                             new PermissionSubject(storagePoolId,
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmTemplateCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmTemplateCommand.java
index 8b0cc38..9a1d7e2 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmTemplateCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmTemplateCommand.java
@@ -400,7 +400,7 @@
 
         // if "run on host" field points to a non existent vds (in the current 
cluster) -> remove field and continue
         if(!VmHandler.validateDedicatedVdsExistOnSameCluster(getVmTemplate(), 
null)){
-            getVmTemplate().setDedicatedVmForVds(null);
+            getVmTemplate().setSingleDedicatedVmForVds(null);
         }
 
         getVmTemplate().setStatus(VmTemplateStatus.Locked);
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 dc83d92..ab58bc8 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
@@ -488,7 +488,7 @@
     }
 
     private void addAddtionalParams(VmNumaNodeOperationParameters params) {
-        
params.setDedicatedHost(getParameters().getVmStaticData().getDedicatedVmForVds());
+        
params.setDedicatedHost(getParameters().getVmStaticData().getSingleDedicatedVmForVds());
         
params.setNumaTuneMode(getParameters().getVmStaticData().getNumaTuneMode());
         
params.setMigrationSupport(getParameters().getVmStaticData().getMigrationSupport());
     }
@@ -822,8 +822,8 @@
 
     private boolean isDedicatedVmForVdsChanged() {
         return !(getVm().getDedicatedVmForVds() == null ?
-                getParameters().getVmStaticData().getDedicatedVmForVds() == 
null :
-                
getVm().getDedicatedVmForVds().equals(getParameters().getVmStaticData().getDedicatedVmForVds()));
+                getParameters().getVmStaticData().getSingleDedicatedVmForVds() 
== null :
+                
getVm().getDedicatedVmForVds().equals(getParameters().getVmStaticData().getSingleDedicatedVmForVds()));
     }
 
     private boolean isCpuPinningChanged() {
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmTemplateCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmTemplateCommand.java
index 771bc04..0a22ec9 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmTemplateCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmTemplateCommand.java
@@ -359,10 +359,10 @@
 
         if (getVmTemplate() != null && !isInstanceType() && 
!isBlankTemplate()) {
             // host-specific parameters can be changed by administration role 
only
-            if (!(getVmTemplate().getDedicatedVmForVds() == null ?
-                    getParameters().getVmTemplateData().getDedicatedVmForVds() 
== null :
-                    
getVmTemplate().getDedicatedVmForVds().equals(getParameters().getVmTemplateData()
-                            .getDedicatedVmForVds()))) {
+            if (!(getVmTemplate().getSingleDedicatedVmForVds() == null ?
+                    
getParameters().getVmTemplateData().getSingleDedicatedVmForVds() == null :
+                    
getVmTemplate().getSingleDedicatedVmForVds().equals(getParameters().getVmTemplateData()
+                            .getSingleDedicatedVmForVds()))) {
                 permissionList.add(
                         new 
PermissionSubject(getParameters().getVmTemplateId(),
                                 VdcObjectType.VmTemplate,
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmHandler.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmHandler.java
index 6ad2529..20228d4 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmHandler.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmHandler.java
@@ -1074,9 +1074,9 @@
      */
     public static boolean validateDedicatedVdsExistOnSameCluster(VmBase vm, 
ArrayList<String> canDoActionMessages) {
         boolean result = true;
-        if (vm.getDedicatedVmForVds() != null) {
+        if (vm.getSingleDedicatedVmForVds() != null) {
             // get dedicated host id
-            Guid vdsId = vm.getDedicatedVmForVds();
+            Guid vdsId = vm.getSingleDedicatedVmForVds();
             // get dedicated host, checks if exists and compare its cluster to 
the VM cluster
             VDS vds = DbFacade.getInstance().getVdsDao().get(vdsId);
             if (vds == null) {
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmManagementCommandBase.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmManagementCommandBase.java
index e5e46f7..e08699c 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmManagementCommandBase.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmManagementCommandBase.java
@@ -105,8 +105,8 @@
         VDS dedicatedVds = null;
 
         // can not check if no dedicated vds was configured
-        if (vmStatic.getDedicatedVmForVds() != null) {
-            dedicatedVds = getVds(vmStatic.getDedicatedVmForVds());
+        if (vmStatic.getSingleDedicatedVmForVds() != null) {
+            dedicatedVds = getVds(vmStatic.getSingleDedicatedVmForVds());
         } else {
             return 
failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_VM_CANNOT_BE_PINNED_TO_CPU_WITH_UNDEFINED_HOST);
         }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/snapshots/SnapshotsManager.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/snapshots/SnapshotsManager.java
index 961b5a6..8c4eff4 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/snapshots/SnapshotsManager.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/snapshots/SnapshotsManager.java
@@ -560,7 +560,7 @@
             }
             // if the required dedicated host is invalid -> use current VM 
dedicated host
             if 
(!VmHandler.validateDedicatedVdsExistOnSameCluster(vm.getStaticData(), null)) {
-                vm.setDedicatedVmForVds(oldVmStatic.getDedicatedVmForVds());
+                
vm.setDedicatedVmForVds(oldVmStatic.getSingleDedicatedVmForVds());
             }
             validateQuota(vm);
             return true;
diff --git 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/UpdateVmCommandTest.java
 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/UpdateVmCommandTest.java
index 51b8ec8..ed84318 100644
--- 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/UpdateVmCommandTest.java
+++ 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/UpdateVmCommandTest.java
@@ -227,7 +227,7 @@
         doReturn(vdsDAO).when(command).getVdsDAO();
         
doReturn(false).when(command).isDedicatedVdsExistOnSameCluster(any(VmBase.class),
 any(ArrayList.class));
 
-        vmStatic.setDedicatedVmForVds(Guid.newGuid());
+        vmStatic.setSingleDedicatedVmForVds(Guid.newGuid());
 
         assertFalse("canDoAction should have failed with invalid dedicated 
host.", command.canDoAction());
     }
@@ -242,7 +242,7 @@
         doReturn(vdsDAO).when(command).getVdsDAO();
         when(vdsDAO.get(any(Guid.class))).thenReturn(vds);
         
doReturn(true).when(command).isDedicatedVdsExistOnSameCluster(any(VmBase.class),
 any(ArrayList.class));
-        vmStatic.setDedicatedVmForVds(Guid.newGuid());
+        vmStatic.setSingleDedicatedVmForVds(Guid.newGuid());
 
         assertTrue("canDoAction should have passed.", command.canDoAction());
     }
diff --git 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/VmManagementCommandBaseTest.java
 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/VmManagementCommandBaseTest.java
index efa7b78..10d38fc 100644
--- 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/VmManagementCommandBaseTest.java
+++ 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/VmManagementCommandBaseTest.java
@@ -26,7 +26,7 @@
         VmStatic vmStatic = new VmStatic();
         vmStatic.setNumOfSockets(6);
         vmStatic.setCpuPerSocket(2);
-        vmStatic.setDedicatedVmForVds(null);
+        vmStatic.setSingleDedicatedVmForVds(null);
         Assert.assertFalse(test.isCpuPinningValid("0#0", vmStatic));
         Assert.assertFalse(test.getReturnValue()
                 .getCanDoActionMessages()
@@ -40,7 +40,7 @@
         VmStatic vmStatic = new VmStatic();
         vmStatic.setNumOfSockets(6);
         vmStatic.setCpuPerSocket(2);
-        vmStatic.setDedicatedVmForVds(Guid.Empty);
+        vmStatic.setSingleDedicatedVmForVds(Guid.Empty);
         final VDS dedicatedVds = new VDS();
         dedicatedVds.setCpuThreads(16);
         dedicatedVds.setOnlineCpus("0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15");
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VM.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VM.java
index f4f2345..bd1526b 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VM.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VM.java
@@ -350,11 +350,11 @@
     }
 
     public Guid getDedicatedVmForVds() {
-        return vmStatic.getDedicatedVmForVds();
+        return vmStatic.getSingleDedicatedVmForVds();
     }
 
     public void setDedicatedVmForVds(Guid value) {
-        vmStatic.setDedicatedVmForVds(value);
+        vmStatic.setSingleDedicatedVmForVds(value);
     }
 
     public Guid getVdsGroupId() {
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VmBase.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VmBase.java
index fcadb2e..b220e0c 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VmBase.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VmBase.java
@@ -329,7 +329,8 @@
     @CopyOnNewVersion
     @EditableOnVmStatusField
     @EditableOnTemplate
-    private Guid dedicatedVmForVds;
+    /* immutable list CopyOnWriteArrayList does not compile with GWT */
+    private /*CopyOnWrite*/ ArrayList<Guid> dedicatedVmForVdsList;
 
     @EditableOnVmStatusField
     @EditableOnTemplate
@@ -440,7 +441,7 @@
                 vmBase.getCreatedByUserId(),
                 vmBase.getMigrationSupport(),
                 vmBase.isAllowConsoleReconnect(),
-                vmBase.getDedicatedVmForVds(),
+                vmBase.getSingleDedicatedVmForVds(),
                 vmBase.getDefaultDisplayType(),
                 vmBase.getMigrationDowntime(),
                 vmBase.getVmInit(),
@@ -563,7 +564,7 @@
         setQuotaId(quotaId);
         this.migrationSupport = migrationSupport;
         this.allowConsoleReconnect = allowConsoleReconnect;
-        this.dedicatedVmForVds = dedicatedVmForVds;
+        this.dedicatedVmForVdsList = dedicatedVmForVdsList;
         this.migrationDowntime = migrationDowntime;
         this.vmInit = vmInit;
         this.serialNumberPolicy = serialNumberPolicy;
@@ -935,7 +936,7 @@
         result = prime * result + ((vmType == null) ? 0 : vmType.hashCode());
         result = prime * result + ((quotaId == null) ? 0 : quotaId.hashCode());
         result = prime * result + (allowConsoleReconnect ? 1231 : 1237);
-        result = prime * result + ((dedicatedVmForVds == null) ? 0 : 
dedicatedVmForVds.hashCode());
+        result = prime * result + ((dedicatedVmForVdsList == null) ? 0 : 
dedicatedVmForVdsList.hashCode());
         result = prime * result + ((migrationSupport == null) ? 0 : 
migrationSupport.hashCode());
         result = prime * result + ((tunnelMigration == null) ? 0 : 
tunnelMigration.hashCode());
         result = prime * result + ((vncKeyboardLayout == null) ? 0 : 
vncKeyboardLayout.hashCode());
@@ -1001,7 +1002,7 @@
                 && vmType == other.vmType
                 && ObjectUtils.objectsEqual(quotaId, other.quotaId)
                 && allowConsoleReconnect == other.allowConsoleReconnect
-                && ObjectUtils.objectsEqual(dedicatedVmForVds, 
other.dedicatedVmForVds)
+                && ObjectUtils.objectsEqual(dedicatedVmForVdsList, 
other.dedicatedVmForVdsList)
                 && migrationSupport == other.migrationSupport
                 && ObjectUtils.objectsEqual(tunnelMigration, 
other.tunnelMigration)
                 && ObjectUtils.objectsEqual(vncKeyboardLayout, 
other.vncKeyboardLayout)
@@ -1066,12 +1067,34 @@
         this.migrationSupport = migrationSupport;
     }
 
-    public Guid getDedicatedVmForVds() {
-        return dedicatedVmForVds;
+    public Guid getSingleDedicatedVmForVds() {
+        if (dedicatedVmForVdsList == null || dedicatedVmForVdsList.isEmpty()) {
+            return null;
+        }
+        return dedicatedVmForVdsList.get(0);
     }
 
-    public void setDedicatedVmForVds(Guid value) {
-        dedicatedVmForVds = value;
+    public void setSingleDedicatedVmForVds(Guid value) {
+        /* immutable list CopyOnWriteArrayList does not compile with GWT */
+        dedicatedVmForVdsList = new /* CopyOnWrite */ ArrayList<Guid>();
+        dedicatedVmForVdsList.add(value);
+    }
+
+    /**
+     * Get immutable list of dedicated hosts Guids.
+     *
+     * @return list of dedicated hosts Guids.
+     */
+    /* immutable list CopyOnWriteArrayList does not compile with GWT */
+    public /* CopyOnWrite */ ArrayList<Guid> getDedicatedVmForVdsList() {
+        return dedicatedVmForVdsList;
+    }
+
+    /**
+     * Set immutable list of dedicated hosts Guids.
+     */
+    public void setDedicatedVmForVdsList(List<Guid> hostGuidsList) {
+        dedicatedVmForVdsList.addAll(hostGuidsList);
     }
 
     public DisplayType getDefaultDisplayType() {
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmBaseDaoDbFacade.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmBaseDaoDbFacade.java
index 14e8dfa..b80055a 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmBaseDaoDbFacade.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmBaseDaoDbFacade.java
@@ -65,7 +65,7 @@
                 .addValue("kernel_params", entity.getKernelParams())
                 .addValue("quota_id", entity.getQuotaId())
                 .addValue("migration_support", 
entity.getMigrationSupport().getValue())
-                .addValue("dedicated_vm_for_vds", 
entity.getDedicatedVmForVds())
+                .addValue("dedicated_vm_for_vds", 
entity.getSingleDedicatedVmForVds())
                 .addValue("min_allocated_mem", entity.getMinAllocatedMem())
                 .addValue("is_run_and_pause", entity.isRunAndPause())
                 .addValue("created_by_user_id", entity.getCreatedByUserId())
@@ -136,7 +136,7 @@
             
entity.setSpiceFileTransferEnabled(rs.getBoolean("is_spice_file_transfer_enabled"));
             
entity.setSpiceCopyPasteEnabled(rs.getBoolean("is_spice_copy_paste_enabled"));
             
entity.setMigrationSupport(MigrationSupport.forValue(rs.getInt("migration_support")));
-            entity.setDedicatedVmForVds(getGuid(rs, "dedicated_vm_for_vds"));
+            entity.setSingleDedicatedVmForVds(getGuid(rs, 
"dedicated_vm_for_vds"));
             entity.setMinAllocatedMem(rs.getInt("min_allocated_mem"));
             entity.setQuotaId(getGuid(rs, "quota_id"));
             entity.setCpuProfileId(getGuid(rs, "cpu_profile_id"));
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmsResource.java
 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmsResource.java
index decbe84..4281148 100644
--- 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmsResource.java
+++ 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmsResource.java
@@ -153,7 +153,7 @@
                     if (vm.isSetPlacementPolicy() && 
vm.getPlacementPolicy().isSetHost()
                             && vm.getPlacementPolicy().getHost().isSetName()
                             && !vm.getPlacementPolicy().getHost().isSetId()) {
-                        
staticVm.setDedicatedVmForVds(asGuid(getHostId(vm.getPlacementPolicy().getHost().getName())));
+                        
staticVm.setSingleDedicatedVmForVds(asGuid(getHostId(vm.getPlacementPolicy().getHost().getName())));
                     }
                 } else {
                     vm.setPlacementPolicy(null);
diff --git 
a/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/VmMapper.java
 
b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/VmMapper.java
index 12acbbf..b7966c2 100644
--- 
a/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/VmMapper.java
+++ 
b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/VmMapper.java
@@ -209,7 +209,7 @@
             }
         }
         if (vm.isSetPlacementPolicy() && vm.getPlacementPolicy().isSetHost()) {
-            
staticVm.setDedicatedVmForVds(createGuidFromString(vm.getPlacementPolicy().getHost().getId()));
+            
staticVm.setSingleDedicatedVmForVds(createGuidFromString(vm.getPlacementPolicy().getHost().getId()));
         }
         if (vm.isSetMemoryPolicy() && vm.getMemoryPolicy().isSetGuaranteed()) {
             Long memGuaranteed = vm.getMemoryPolicy().getGuaranteed() / 
BYTES_PER_MB;
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 ea3c3af..8dd4fc5 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
@@ -665,7 +665,7 @@
         node = content.SelectSingleNode(OvfProperties.DEDICATED_VM_FOR_VDS);
         if (node != null) {
             if (StringUtils.isNotEmpty(node.innerText)) {
-                
vmBase.setDedicatedVmForVds(Guid.createGuidFromString(node.innerText));
+                
vmBase.setSingleDedicatedVmForVds(Guid.createGuidFromString(node.innerText));
             }
         }
 
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 12daabc..2d74ef1 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
@@ -365,9 +365,9 @@
             _writer.WriteEndElement();
         }
 
-        if (vmBase.getDedicatedVmForVds() != null) {
+        if (vmBase.getSingleDedicatedVmForVds() != null) {
             _writer.WriteStartElement(OvfProperties.DEDICATED_VM_FOR_VDS);
-            _writer.WriteRaw(String.valueOf(vmBase.getDedicatedVmForVds()));
+            
_writer.WriteRaw(String.valueOf(vmBase.getSingleDedicatedVmForVds()));
             _writer.WriteEndElement();
         }
 
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/Cloner.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/Cloner.java
index 76061ed..5f27d66 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/Cloner.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/Cloner.java
@@ -488,7 +488,7 @@
         obj.setAutoStartup(instance.isAutoStartup());
         obj.setCpuPerSocket(instance.getCpuPerSocket());
         obj.setCreationDate(instance.getCreationDate());
-        obj.setDedicatedVmForVds(instance.getDedicatedVmForVds());
+        obj.setSingleDedicatedVmForVds(instance.getSingleDedicatedVmForVds());
         obj.setDescription(instance.getDescription());
         obj.setComment(instance.getComment());
         obj.setCustomEmulatedMachine(instance.getCustomEmulatedMachine());
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/vm/DedicatedVmForVdsUnitToVmBaseBuilder.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/vm/DedicatedVmForVdsUnitToVmBaseBuilder.java
index 66f6267..b78b0e6 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/vm/DedicatedVmForVdsUnitToVmBaseBuilder.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/vm/DedicatedVmForVdsUnitToVmBaseBuilder.java
@@ -11,9 +11,9 @@
         // host migration configuration
         VDS defaultHost = model.getDefaultHost().getSelectedItem();
         if (model.getIsAutoAssign().getEntity()) {
-            vm.setDedicatedVmForVds(null);
+            vm.setSingleDedicatedVmForVds(null);
         } else {
-            vm.setDedicatedVmForVds(defaultHost.getId());
+            vm.setSingleDedicatedVmForVds(defaultHost.getId());
         }
     }
 }
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/vm/DedicatedVmForVdsVmBaseToVmBaseBuilder.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/vm/DedicatedVmForVdsVmBaseToVmBaseBuilder.java
index f5ed458..2b25903 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/vm/DedicatedVmForVdsVmBaseToVmBaseBuilder.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/builders/vm/DedicatedVmForVdsVmBaseToVmBaseBuilder.java
@@ -6,6 +6,6 @@
 public class DedicatedVmForVdsVmBaseToVmBaseBuilder extends 
BaseSyncBuilder<VmBase, VmBase> {
     @Override
     protected void build(VmBase source, VmBase destination) {
-        destination.setDedicatedVmForVds(source.getDedicatedVmForVds());
+        
destination.setSingleDedicatedVmForVds(source.getSingleDedicatedVmForVds());
     }
 }
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewPoolModelBehavior.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewPoolModelBehavior.java
index b85f4ef..b5ffe8e 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewPoolModelBehavior.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewPoolModelBehavior.java
@@ -86,7 +86,7 @@
         }
 
         setupWindowModelFrom(template);
-        doChangeDefautlHost(template.getDedicatedVmForVds());
+        doChangeDefautlHost(template.getSingleDedicatedVmForVds());
         updateRngDevice(template.getId());
         
getModel().getCustomPropertySheet().deserialize(template.getCustomProperties());
     }
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewVmModelBehavior.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewVmModelBehavior.java
index 79ae4bc..cf57525 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewVmModelBehavior.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/NewVmModelBehavior.java
@@ -101,7 +101,7 @@
             @Override
             public void finished(VmBase source, UnitVmModel destination) {
                 setSelectedOSType(template, 
getModel().getSelectedCluster().getArchitecture());
-                doChangeDefautlHost(template.getDedicatedVmForVds());
+                doChangeDefautlHost(template.getSingleDedicatedVmForVds());
 
                 getModel().getIsStateless().setEntity(template.isStateless());
                 
getModel().getIsRunAndPause().setEntity(template.isRunAndPause());
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/TemplateVmModelBehavior.java
 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/TemplateVmModelBehavior.java
index 2290767..acf1135 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/TemplateVmModelBehavior.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/TemplateVmModelBehavior.java
@@ -173,7 +173,7 @@
     protected void changeDefualtHost() {
         super.changeDefualtHost();
 
-        doChangeDefautlHost(template.getDedicatedVmForVds());
+        doChangeDefautlHost(template.getSingleDedicatedVmForVds());
     }
 
     public void buildModel(VmBase vmBase, 
BuilderExecutor.BuilderExecutionFinished<VmBase, UnitVmModel> callback) {
diff --git 
a/frontend/webadmin/modules/uicommonweb/src/test/java/org/ovirt/engine/ui/uicommonweb/models/vms/BaseVmListModelTest.java
 
b/frontend/webadmin/modules/uicommonweb/src/test/java/org/ovirt/engine/ui/uicommonweb/models/vms/BaseVmListModelTest.java
index 6fc5b81..1b0a954 100644
--- 
a/frontend/webadmin/modules/uicommonweb/src/test/java/org/ovirt/engine/ui/uicommonweb/models/vms/BaseVmListModelTest.java
+++ 
b/frontend/webadmin/modules/uicommonweb/src/test/java/org/ovirt/engine/ui/uicommonweb/models/vms/BaseVmListModelTest.java
@@ -176,7 +176,7 @@
         verifyBuiltKernelOptions(vm);
         verifyBuiltMigrationOptions(vm);
 
-        assertEquals(HOST_ID, vm.getDedicatedVmForVds());
+        assertEquals(HOST_ID, vm.getSingleDedicatedVmForVds());
         assertEquals(VM_NAME, vm.getName());
         assertEquals(USB_POLICY, vm.getUsbPolicy());
 
diff --git a/packaging/dbscripts/create_views.sql 
b/packaging/dbscripts/create_views.sql
index cf69998..be51dd6 100644
--- a/packaging/dbscripts/create_views.sql
+++ b/packaging/dbscripts/create_views.sql
@@ -3275,3 +3275,13 @@
     ON host_device.device_name = vm_device.device
     AND vm_static.dedicated_vm_for_vds = host_device.host_id
 WHERE vm_device.type = 'hostdev';
+-- Dedicated Hosts view
+CREATE
+OR REPLACE VIEW dedicated_hosts_view AS
+SELECT
+    vds_static.vds_name, 
+    dedicated_hosts.vds_id,
+    dedicated_hosts.vm_id
+FROM
+    dedicated_hosts
+INNER JOIN vds_static ON dedicated_hosts.vds_id = vds_static.vds_id;
diff --git a/packaging/dbscripts/dedicated_hosts_sp.sql 
b/packaging/dbscripts/dedicated_hosts_sp.sql
new file mode 100644
index 0000000..17a56dc
--- /dev/null
+++ b/packaging/dbscripts/dedicated_hosts_sp.sql
@@ -0,0 +1,33 @@
+Create or replace FUNCTION AddDedicatedHostToVm(v_vm_guid UUID, v_vds_guid 
UUID)
+RETURNS VOID
+   AS $procedure$
+BEGIN
+INSERT INTO dedicated_hosts(vm_id, vds_id)
+    VALUES(v_vm_guid, v_vds_guid);
+END; $procedure$
+LANGUAGE plpgsql;
+
+
+
+Create or replace FUNCTION RemoveDedicatedHostFromVm(v_vm_guid UUID, 
v_vds_guid UUID)
+RETURNS VOID
+AS $procedure$
+BEGIN
+    DELETE
+    FROM   dedicated_hosts
+    WHERE  vm_id = v_vm_guid and vds_id = v_vds_guid;
+END; $procedure$
+LANGUAGE plpgsql;
+
+
+
+Create or replace FUNCTION GetHostsDedictedToVmByVmId(v_vm_guid UUID) RETURNS 
SETOF dedicated_hosts_view STABLE
+   AS $procedure$
+BEGIN
+   RETURN QUERY
+      SELECT *
+      FROM dedicated_hosts_view
+      WHERE dedicated_hosts_view.vm_id = v_vm_guid;
+
+END; $procedure$
+LANGUAGE plpgsql;
diff --git 
a/packaging/dbscripts/upgrade/03_06_1450_add_multiple_dedicated_hosts_to_vm.sql 
b/packaging/dbscripts/upgrade/03_06_1450_add_multiple_dedicated_hosts_to_vm.sql
new file mode 100644
index 0000000..48321cb
--- /dev/null
+++ 
b/packaging/dbscripts/upgrade/03_06_1450_add_multiple_dedicated_hosts_to_vm.sql
@@ -0,0 +1,22 @@
+-- Add new tables for pinning multiple hosts to vm
+Create or replace FUNCTION __temp_add_multiple_dedicated_hosts_to_vm() returns 
void
+AS $procedure$
+BEGIN
+    -- dedicated_hosts nodes table
+    CREATE TABLE dedicated_hosts
+    (
+        vds_id UUID,
+        vm_id UUID,
+        CONSTRAINT fk_host FOREIGN KEY(vds_id) REFERENCES vds_static(vds_id) 
ON DELETE CASCADE,
+        CONSTRAINT fk_vm FOREIGN KEY(vm_id) REFERENCES vm_static(vm_guid) ON 
DELETE CASCADE
+    );
+
+    -- Create partial index for numa nodes
+    CREATE INDEX fk_host ON dedicated_hosts(vds_id);
+    CREATE INDEX fk_vm ON dedicated_hosts(vm_id);
+
+END; $procedure$
+LANGUAGE plpgsql;
+
+select __temp_add_multiple_dedicated_hosts_to_vm();
+drop function __temp_add_multiple_dedicated_hosts_to_vm();


-- 
To view, visit https://gerrit.ovirt.org/41619
To unsubscribe, visit https://gerrit.ovirt.org/settings

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

Reply via email to