Gilad Chaplik has uploaded a new change for review.

Change subject: core: shceduling: destination host isn't guaranteed
......................................................................

core: shceduling: destination host isn't guaranteed

when migrating VM to a specific host, or running once VM on
a specific host, and the specified host isn't suitable for running the VM,
another host could be selected. this patch fixes that, and
the operation would fail.

Change-Id: I6894c0d8d42bd57026ccc36b52d9d266add14384
Bug-Url: https://bugzilla.redhat.com/999630
Signed-off-by: Gilad Chaplik <[email protected]>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MigrateVmCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MigrateVmToServerCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmOnceCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmPoolCommandBase.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/RunVmValidator.java
M 
backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/RunVmCommandTest.java
7 files changed, 41 insertions(+), 3 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/70/19970/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MigrateVmCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MigrateVmCommand.java
index aff7f7c..149a69a 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MigrateVmCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MigrateVmCommand.java
@@ -92,7 +92,7 @@
                 SchedulingManager.getInstance().schedule(getVdsGroup(),
                         getVm(),
                         getVdsBlackList(),
-                        getParameters().getInitialHosts(),
+                        getVdsWhiteList(),
                         destVds == null ? null : destVds.getId(),
                         new ArrayList<String>(),
                         new VdsFreeMemoryChecker(this));
@@ -389,4 +389,10 @@
         }
         return blackList;
     }
+
+    // initial hosts list picked for scheduling, currently
+    // passed by load balancing process.
+    protected List<Guid> getVdsWhiteList() {
+        return getParameters().getInitialHosts();
+    }
 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MigrateVmToServerCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MigrateVmToServerCommand.java
index eae49ce..680e7a1 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MigrateVmToServerCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MigrateVmToServerCommand.java
@@ -1,5 +1,8 @@
 package org.ovirt.engine.core.bll;
 
+import java.util.Arrays;
+import java.util.List;
+
 import org.ovirt.engine.core.common.action.MigrateVmToServerParameters;
 import org.ovirt.engine.core.common.businessentities.VDS;
 import org.ovirt.engine.core.common.businessentities.VM;
@@ -51,4 +54,9 @@
         determineMigrationFailureForAuditLog();
         log();
     }
+
+    @Override
+    protected List<Guid> getVdsWhiteList() {
+        return Arrays.asList(getVdsDestinationId());
+    }
 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommand.java
index 17f074a..1c3023d 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommand.java
@@ -661,7 +661,7 @@
                 SchedulingManager.getInstance().schedule(getVdsGroup(),
                         getVm(),
                         getRunVdssList(),
-                        null,
+                        getVdsWhiteList(),
                         destinationVds == null ? null : destinationVds.getId(),
                         new ArrayList<String>(),
                         new VdsFreeMemoryChecker(this));
@@ -792,6 +792,7 @@
                 getParameters().getFloppyPath(),
                 getParameters().getRunAsStateless(),
                 getRunVdssList(),
+                getVdsWhiteList(),
                 getDestinationVds() != null ? getDestinationVds().getId() : 
null,
                 getVdsGroup())) {
             return false;
@@ -1085,4 +1086,9 @@
             super.reportCompleted();
         }
     }
+
+    // initial white list (null == all hosts)
+    protected List<Guid> getVdsWhiteList() {
+        return null;
+    }
 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmOnceCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmOnceCommand.java
index 1ee287b..2079a2d 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmOnceCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmOnceCommand.java
@@ -1,6 +1,7 @@
 package org.ovirt.engine.core.bll;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 
 import org.ovirt.engine.core.bll.job.ExecutionContext;
@@ -13,9 +14,11 @@
 import org.ovirt.engine.core.common.action.RunVmParams;
 import org.ovirt.engine.core.common.action.SysPrepParams;
 import org.ovirt.engine.core.common.businessentities.DiskImage;
+import org.ovirt.engine.core.common.businessentities.VDS;
 import org.ovirt.engine.core.common.businessentities.VMStatus;
 import org.ovirt.engine.core.common.errors.VdcBllMessages;
 import org.ovirt.engine.core.common.vdscommands.CreateVmVDSCommandParameters;
+import org.ovirt.engine.core.compat.Guid;
 
 @NonTransactiveCommandAttribute
 public class RunVmOnceCommand<T extends RunVmOnceParams> extends 
RunVmCommand<T> implements QuotaStorageDependent {
@@ -105,4 +108,13 @@
         }
         return list;
     }
+
+    @Override
+    protected List<Guid> getVdsWhiteList() {
+        VDS destinationVds = getDestinationVds();
+        if (destinationVds != null) {
+            return Arrays.asList(destinationVds.getId());
+        }
+        return super.getVdsWhiteList();
+    }
 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmPoolCommandBase.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmPoolCommandBase.java
index f15b454..b2521a7 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmPoolCommandBase.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmPoolCommandBase.java
@@ -239,6 +239,7 @@
                 runVmParams.getRunAsStateless(),
                 new ArrayList<Guid>(),
                 null,
+                null,
                 vdsGroup);
     }
 
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/RunVmValidator.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/RunVmValidator.java
index f0ec12b..e2f6070 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/RunVmValidator.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/RunVmValidator.java
@@ -309,6 +309,7 @@
 
     /**
      * A general method for run vm validations. used in runVmCommand and in 
VmPoolCommandBase
+     *
      * @param vm
      * @param messages
      * @param vmDisks
@@ -321,6 +322,8 @@
      * @param vdsSelector
      * @param vdsBlackList
      *            - hosts that we already tried to run on
+     * @param vdsWhiteList
+     *            - initial host list, mainly runOnSpecificHost 
(runOnce/migrateToHost)
      * @return
      */
     public boolean canRunVm(VM vm,
@@ -333,6 +336,7 @@
             String floppyPath,
             Boolean runAsStateless,
             List<Guid> vdsBlackList,
+            List<Guid> vdsWhiteList,
             Guid destVds,
             VDSGroup vdsGroup) {
 
@@ -357,7 +361,7 @@
         }
 
         if (!SchedulingManager.getInstance().canSchedule(
-                vdsGroup, vm, vdsBlackList, null, destVds, messages)) {
+                vdsGroup, vm, vdsBlackList, vdsWhiteList, destVds, messages)) {
             return false;
         }
 
diff --git 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/RunVmCommandTest.java
 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/RunVmCommandTest.java
index 391c41d..82cf634 100644
--- 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/RunVmCommandTest.java
+++ 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/RunVmCommandTest.java
@@ -371,6 +371,7 @@
                 anyString(),
                 anyBoolean(),
                 Matchers.anyListOf(Guid.class),
+                Matchers.anyListOf(Guid.class),
                 any(Guid.class),
                 any(VDSGroup.class))).thenReturn(true);
         doReturn(runVmValidator).when(command).getRunVmValidator();


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

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

Reply via email to