diff --git a/api/src/com/cloud/deploy/HAPlanner.java b/api/src/com/cloud/deploy/HAPlanner.java
new file mode 100644
index 00000000000..aeb5083c522
--- /dev/null
+++ b/api/src/com/cloud/deploy/HAPlanner.java
@@ -0,0 +1,21 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package com.cloud.deploy;
+
+
+public interface HAPlanner extends DeploymentPlanner {
+}
\ No newline at end of file
diff --git a/client/pom.xml b/client/pom.xml
index a15a409a33c..0bff4389e6b 100644
--- a/client/pom.xml
+++ b/client/pom.xml
@@ -176,6 +176,11 @@
cloud-plugin-planner-user-dispersing
${project.version}
+
+ org.apache.cloudstack
+ cloud-plugin-planner-skip-heurestics
+ ${project.version}
+
org.apache.cloudstack
cloud-plugin-planner-user-concentrated-pod
diff --git a/core/resources/META-INF/cloudstack/core/spring-core-registry-core-context.xml b/core/resources/META-INF/cloudstack/core/spring-core-registry-core-context.xml
index be11a1f711f..5e799c06483 100644
--- a/core/resources/META-INF/cloudstack/core/spring-core-registry-core-context.xml
+++ b/core/resources/META-INF/cloudstack/core/spring-core-registry-core-context.xml
@@ -77,6 +77,11 @@
+
+
+
+
diff --git a/core/resources/META-INF/cloudstack/planner/spring-core-lifecycle-planner-context-inheritable.xml b/core/resources/META-INF/cloudstack/planner/spring-core-lifecycle-planner-context-inheritable.xml
index 715f86d9c28..80779e43466 100644
--- a/core/resources/META-INF/cloudstack/planner/spring-core-lifecycle-planner-context-inheritable.xml
+++ b/core/resources/META-INF/cloudstack/planner/spring-core-lifecycle-planner-context-inheritable.xml
@@ -38,4 +38,9 @@
value="org.apache.cloudstack.affinity.AffinityGroupProcessor" />
+
+
+
+
+
diff --git a/engine/api/src/com/cloud/vm/VirtualMachineManager.java b/engine/api/src/com/cloud/vm/VirtualMachineManager.java
index 30991fe466f..d18212643d8 100644
--- a/engine/api/src/com/cloud/vm/VirtualMachineManager.java
+++ b/engine/api/src/com/cloud/vm/VirtualMachineManager.java
@@ -103,19 +103,22 @@ public interface VirtualMachineManager extends Manager {
boolean stateTransitTo(VirtualMachine vm, VirtualMachine.Event e, Long hostId) throws NoTransitionException;
- void advanceStart(String vmUuid, Map params) throws InsufficientCapacityException, ResourceUnavailableException,
+ void advanceStart(String vmUuid, Map params, DeploymentPlanner planner) throws InsufficientCapacityException, ResourceUnavailableException,
ConcurrentOperationException, OperationTimedoutException;
- void advanceStart(String vmUuid, Map params, DeploymentPlan planToDeploy) throws InsufficientCapacityException,
+ void advanceStart(String vmUuid, Map params, DeploymentPlan planToDeploy, DeploymentPlanner planner) throws InsufficientCapacityException,
ResourceUnavailableException, ConcurrentOperationException, OperationTimedoutException;
+ void orchestrateStart(String vmUuid, Map params, DeploymentPlan planToDeploy, DeploymentPlanner planner) throws InsufficientCapacityException,
+ ResourceUnavailableException, ConcurrentOperationException, OperationTimedoutException;
+
void advanceStop(String vmUuid, boolean cleanupEvenIfUnableToStop) throws ResourceUnavailableException, OperationTimedoutException, ConcurrentOperationException;
void advanceExpunge(String vmUuid) throws ResourceUnavailableException, OperationTimedoutException, ConcurrentOperationException;
void destroy(String vmUuid) throws AgentUnavailableException, OperationTimedoutException, ConcurrentOperationException;
- void migrateAway(String vmUuid, long hostId) throws InsufficientServerCapacityException;
+ void migrateAway(String vmUuid, long hostId, DeploymentPlanner planner) throws InsufficientServerCapacityException;
void migrate(String vmUuid, long srcHostId, DeployDestination dest) throws ResourceUnavailableException, ConcurrentOperationException;
diff --git a/engine/components-api/src/com/cloud/deploy/DeploymentPlanningManager.java b/engine/components-api/src/com/cloud/deploy/DeploymentPlanningManager.java
index 7dde8158bb1..4fa05346219 100644
--- a/engine/components-api/src/com/cloud/deploy/DeploymentPlanningManager.java
+++ b/engine/components-api/src/com/cloud/deploy/DeploymentPlanningManager.java
@@ -40,7 +40,7 @@ public interface DeploymentPlanningManager extends Manager {
*
*/
DeployDestination planDeployment(VirtualMachineProfile vmProfile, DeploymentPlan plan,
- ExcludeList avoids) throws InsufficientServerCapacityException, AffinityConflictException;
+ ExcludeList avoids, DeploymentPlanner planner) throws InsufficientServerCapacityException, AffinityConflictException;
String finalizeReservation(DeployDestination plannedDestination,
VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoids)
diff --git a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
index 124ae81b265..e9d3a3916de 100755
--- a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -42,6 +42,7 @@ import javax.naming.ConfigurationException;
import org.apache.log4j.Logger;
+import com.cloud.deploy.DeploymentPlanner;
import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao;
import org.apache.cloudstack.context.CallContext;
import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
@@ -555,7 +556,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
@Override
public void start(String vmUuid, Map params, DeploymentPlan planToDeploy) {
try {
- advanceStart(vmUuid, params, planToDeploy);
+ advanceStart(vmUuid, params, planToDeploy, null);
} catch (ConcurrentOperationException e) {
throw new CloudRuntimeException("Unable to start a VM due to concurrent operation", e).add(VirtualMachine.class, vmUuid);
} catch (InsufficientCapacityException e) {
@@ -696,20 +697,20 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
}
@Override
- public void advanceStart(String vmUuid, Map params)
+ public void advanceStart(String vmUuid, Map params, DeploymentPlanner planner)
throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException {
- advanceStart(vmUuid, params, null);
+ advanceStart(vmUuid, params, null, planner);
}
@Override
- public void advanceStart(String vmUuid, Map params, DeploymentPlan planToDeploy) throws InsufficientCapacityException,
+ public void advanceStart(String vmUuid, Map params, DeploymentPlan planToDeploy, DeploymentPlanner planner) throws InsufficientCapacityException,
ConcurrentOperationException, ResourceUnavailableException {
AsyncJobExecutionContext jobContext = AsyncJobExecutionContext.getCurrentExecutionContext();
if (!VmJobEnabled.value() || jobContext.isJobDispatchedBy(VmWorkConstants.VM_WORK_JOB_DISPATCHER)) {
// avoid re-entrance
- orchestrateStart(vmUuid, params, planToDeploy);
+ orchestrateStart(vmUuid, params, planToDeploy, planner);
} else {
Outcome outcome = startVmThroughJobQueue(vmUuid, params, planToDeploy);
@@ -731,9 +732,11 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
}
}
- private void orchestrateStart(String vmUuid, Map params, DeploymentPlan planToDeploy) throws InsufficientCapacityException,
- ConcurrentOperationException, ResourceUnavailableException {
+ @Override
+ public void orchestrateStart(String vmUuid, Map params, DeploymentPlan planToDeploy, DeploymentPlanner planner)
+ throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException {
+
CallContext cctxt = CallContext.current();
Account account = cctxt.getCallingAccount();
User caller = cctxt.getCallingUser();
@@ -848,7 +851,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
VirtualMachineProfileImpl vmProfile = new VirtualMachineProfileImpl(vm, template, offering, owner, params);
DeployDestination dest = null;
try {
- dest = _dpMgr.planDeployment(vmProfile, plan, avoids);
+ dest = _dpMgr.planDeployment(vmProfile, plan, avoids, planner);
} catch (AffinityConflictException e2) {
s_logger.warn("Unable to create deployment, affinity rules associted to the VM conflict", e2);
throw new CloudRuntimeException("Unable to create deployment, affinity rules associted to the VM conflict");
@@ -2035,7 +2038,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
}
@Override
- public void migrateAway(String vmUuid, long srcHostId) throws InsufficientServerCapacityException {
+ public void migrateAway(String vmUuid, long srcHostId, DeploymentPlanner planner) throws InsufficientServerCapacityException {
VMInstanceVO vm = _vmDao.findByUuid(vmUuid);
if (vm == null) {
s_logger.debug("Unable to find a VM for " + vmUuid);
@@ -2068,7 +2071,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
while (true) {
try {
- dest = _dpMgr.planDeployment(profile, plan, excludes);
+ dest = _dpMgr.planDeployment(profile, plan, excludes, planner);
} catch (AffinityConflictException e2) {
s_logger.warn("Unable to create deployment, affinity rules associted to the VM conflict", e2);
throw new CloudRuntimeException("Unable to create deployment, affinity rules associted to the VM conflict");
@@ -3390,7 +3393,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
DeployDestination dest = null;
try {
- dest = _dpMgr.planDeployment(profile, plan, excludes);
+ dest = _dpMgr.planDeployment(profile, plan, excludes, null);
} catch (AffinityConflictException e2) {
s_logger.warn("Unable to create deployment, affinity rules associted to the VM conflict", e2);
throw new CloudRuntimeException("Unable to create deployment, affinity rules associted to the VM conflict");
@@ -4714,7 +4717,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
assert (vm != null);
if (work instanceof VmWorkStart) {
VmWorkStart workStart = (VmWorkStart)work;
- orchestrateStart(vm.getUuid(), workStart.getParams(), workStart.getPlan());
+ orchestrateStart(vm.getUuid(), workStart.getParams(), workStart.getPlan(), null);
return new Pair(JobInfo.Status.SUCCEEDED, null);
} else if (work instanceof VmWorkStop) {
VmWorkStop workStop = (VmWorkStop)work;
diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VMEntityManagerImpl.java b/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VMEntityManagerImpl.java
index fdccf89b4cb..bdb7323dc8b 100755
--- a/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VMEntityManagerImpl.java
+++ b/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VMEntityManagerImpl.java
@@ -185,7 +185,7 @@ public class VMEntityManagerImpl implements VMEntityManager {
while (true) {
DeployDestination dest = null;
try {
- dest = _dpMgr.planDeployment(vmProfile, plan, exclude);
+ dest = _dpMgr.planDeployment(vmProfile, plan, exclude, null);
} catch (AffinityConflictException e) {
throw new CloudRuntimeException(
"Unable to create deployment, affinity rules associted to the VM conflict");
diff --git a/plugins/ha-planners/skip-heurestics/pom.xml b/plugins/ha-planners/skip-heurestics/pom.xml
new file mode 100644
index 00000000000..dc7a3604733
--- /dev/null
+++ b/plugins/ha-planners/skip-heurestics/pom.xml
@@ -0,0 +1,29 @@
+
+
+ 4.0.0
+ cloud-plugin-planner-skip-heurestics
+ Apache CloudStack Plugin - Skip Heurestics Planner
+
+ org.apache.cloudstack
+ cloudstack-plugins
+ 4.3.0-SNAPSHOT
+ ../../pom.xml
+
+
diff --git a/plugins/ha-planners/skip-heurestics/resources/META-INF/cloudstack/skip-heurestics/module.properties b/plugins/ha-planners/skip-heurestics/resources/META-INF/cloudstack/skip-heurestics/module.properties
new file mode 100644
index 00000000000..dfe0641ba4a
--- /dev/null
+++ b/plugins/ha-planners/skip-heurestics/resources/META-INF/cloudstack/skip-heurestics/module.properties
@@ -0,0 +1,18 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+name=skip-heurestics
+parent=planner
diff --git a/plugins/ha-planners/skip-heurestics/resources/META-INF/cloudstack/skip-heurestics/spring-skip-heurestics-context.xml b/plugins/ha-planners/skip-heurestics/resources/META-INF/cloudstack/skip-heurestics/spring-skip-heurestics-context.xml
new file mode 100644
index 00000000000..93a015874af
--- /dev/null
+++ b/plugins/ha-planners/skip-heurestics/resources/META-INF/cloudstack/skip-heurestics/spring-skip-heurestics-context.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/plugins/ha-planners/skip-heurestics/src/com/cloud/deploy/SkipHeuresticsPlanner.java b/plugins/ha-planners/skip-heurestics/src/com/cloud/deploy/SkipHeuresticsPlanner.java
new file mode 100644
index 00000000000..b67d112f825
--- /dev/null
+++ b/plugins/ha-planners/skip-heurestics/src/com/cloud/deploy/SkipHeuresticsPlanner.java
@@ -0,0 +1,61 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package com.cloud.deploy;
+
+import com.cloud.vm.VirtualMachineProfile;
+import org.apache.log4j.Logger;
+
+
+import javax.ejb.Local;
+import javax.naming.ConfigurationException;
+import java.util.List;
+import java.util.Map;
+
+@Local(value=HAPlanner.class)
+public class SkipHeuresticsPlanner extends FirstFitPlanner implements HAPlanner {
+ private static final Logger s_logger = Logger.getLogger(SkipHeuresticsPlanner.class);
+
+
+ /**
+ * This method should remove the clusters crossing capacity threshold
+ * to avoid further vm allocation on it.
+ *
+ * In case of HA, we shouldn't consider this threshold as we have reserved the capacity for such emergencies.
+ */
+ @Override
+ protected void removeClustersCrossingThreshold(List clusterListForVmAllocation, ExcludeList avoid,
+ VirtualMachineProfile vmProfile, DeploymentPlan plan){
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Deploying vm during HA process, so skipping disable threshold check");
+ }
+ return;
+ }
+
+ @Override
+ public boolean canHandle(VirtualMachineProfile vm, DeploymentPlan plan, ExcludeList avoid) {
+ return true;
+ }
+
+ @Override
+ public boolean configure(String name, Map params) throws ConfigurationException {
+ super.configure(name, params);
+
+ return true;
+
+ }
+
+}
\ No newline at end of file
diff --git a/plugins/pom.xml b/plugins/pom.xml
index d0817a2ddc8..87a7f8faf29 100755
--- a/plugins/pom.xml
+++ b/plugins/pom.xml
@@ -32,6 +32,7 @@
deployment-planners/user-concentrated-pod
deployment-planners/user-dispersing
deployment-planners/implicit-dedication
+ ha-planners/skip-heurestics
host-allocators/random
dedicated-resources
hypervisors/ovm
diff --git a/server/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml b/server/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml
index 2fe76baa6d0..31f31cd972a 100644
--- a/server/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml
+++ b/server/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml
@@ -65,6 +65,7 @@
+
diff --git a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java
index e82aabaeddc..c5517c5a07a 100755
--- a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java
+++ b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java
@@ -551,7 +551,7 @@ VirtualMachineGuru, SystemVmLoadScanHandler, ResourceStateAdapter {
}
if (proxy.getState() == VirtualMachine.State.Stopped) {
- _itMgr.advanceStart(proxy.getUuid(), null);
+ _itMgr.advanceStart(proxy.getUuid(), null, null);
proxy = _consoleProxyDao.findById(proxy.getId());
}
diff --git a/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java b/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java
index 65759e0c3b4..a41f5ee4100 100644
--- a/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java
+++ b/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java
@@ -212,7 +212,7 @@ public class DeploymentPlanningManagerImpl extends ManagerBase implements Deploy
@Override
public DeployDestination planDeployment(VirtualMachineProfile vmProfile,
- DeploymentPlan plan, ExcludeList avoids) throws InsufficientServerCapacityException,
+ DeploymentPlan plan, ExcludeList avoids, DeploymentPlanner planner) throws InsufficientServerCapacityException,
AffinityConflictException {
// call affinitygroup chain
@@ -247,19 +247,21 @@ public class DeploymentPlanningManagerImpl extends ManagerBase implements Deploy
ServiceOffering offering = vmProfile.getServiceOffering();
- String plannerName = offering.getDeploymentPlanner();
- if (plannerName == null) {
- if (vm.getHypervisorType() == HypervisorType.BareMetal) {
- plannerName = "BareMetalPlanner";
- } else {
- plannerName = _configDao.getValue(Config.VmDeploymentPlanner.key());
+ if(planner == null){
+ String plannerName = offering.getDeploymentPlanner();
+ if (plannerName == null) {
+ if (vm.getHypervisorType() == HypervisorType.BareMetal) {
+ plannerName = "BareMetalPlanner";
+ } else {
+ plannerName = _configDao.getValue(Config.VmDeploymentPlanner.key());
+ }
}
- }
- DeploymentPlanner planner = null;
- for (DeploymentPlanner plannerInList : _planners) {
- if (plannerName.equals(plannerInList.getName())) {
- planner = plannerInList;
- break;
+
+ for (DeploymentPlanner plannerInList : _planners) {
+ if (plannerName.equals(plannerInList.getName())) {
+ planner = plannerInList;
+ break;
+ }
}
}
diff --git a/server/src/com/cloud/deploy/FirstFitPlanner.java b/server/src/com/cloud/deploy/FirstFitPlanner.java
index 3707d3d9065..e5348949c90 100755
--- a/server/src/com/cloud/deploy/FirstFitPlanner.java
+++ b/server/src/com/cloud/deploy/FirstFitPlanner.java
@@ -266,7 +266,14 @@ public class FirstFitPlanner extends PlannerBase implements DeploymentClusterPla
return capacityList;
}
- private void removeClustersCrossingThreshold(List clusterListForVmAllocation, ExcludeList avoid,
+ /**
+ * This method should remove the clusters crossing capacity threshold to avoid further vm allocation on it.
+ * @param clusterListForVmAllocation
+ * @param avoid
+ * @param vmProfile
+ * @param plan
+ */
+ protected void removeClustersCrossingThreshold(List clusterListForVmAllocation, ExcludeList avoid,
VirtualMachineProfile vmProfile, DeploymentPlan plan) {
List capacityList = getCapacitiesForCheckingThreshold();
diff --git a/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java b/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java
index d6b9ff38b8c..54ca0aa8751 100755
--- a/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java
+++ b/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java
@@ -29,6 +29,7 @@ import javax.ejb.Local;
import javax.inject.Inject;
import javax.naming.ConfigurationException;
+import com.cloud.deploy.HAPlanner;
import org.apache.cloudstack.engine.orchestration.service.VolumeOrchestrationService;
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
import org.apache.cloudstack.managed.context.ManagedContext;
@@ -136,7 +137,17 @@ public class HighAvailabilityManagerImpl extends ManagerBase implements HighAvai
this._fenceBuilders = _fenceBuilders;
}
- @Inject
+ List _haPlanners;
+ public List getHaPlanners() {
+ return _haPlanners;
+ }
+
+ public void setHaPlanners(List _haPlanners) {
+ this._haPlanners = _haPlanners;
+ }
+
+
+ @Inject
AgentManager _agentMgr;
@Inject
AlertManager _alertMgr;
@@ -539,9 +550,19 @@ public class HighAvailabilityManagerImpl extends ManagerBase implements HighAvai
if (_haTag != null) {
params.put(VirtualMachineProfile.Param.HaTag, _haTag);
}
- _itMgr.advanceStart(vm.getUuid(), params);
-
+
+ // First try starting the vm with its original planner, if it doesn't succeed send HAPlanner as its an emergency.
+ _itMgr.advanceStart(vm.getUuid(), params, null);
VMInstanceVO started = _instanceDao.findById(vm.getId());
+ if (started != null && started.getState() == VirtualMachine.State.Running) {
+ s_logger.info("VM is now restarted: " + vmId + " on " + started.getHostId());
+ return null;
+ }else {
+ s_logger.warn("Failed to deploy vm " + vmId + " with original planner, sending HAPlanner");
+ _itMgr.advanceStart(vm.getUuid(), params, _haPlanners.get(0));
+ }
+
+ started = _instanceDao.findById(vm.getId());
if (started != null && started.getState() == VirtualMachine.State.Running) {
s_logger.info("VM is now restarted: " + vmId + " on " + started.getHostId());
return null;
@@ -582,8 +603,14 @@ public class HighAvailabilityManagerImpl extends ManagerBase implements HighAvai
_haDao.update(work.getId(), work);
VMInstanceVO vm = _instanceDao.findById(vmId);
-
- _itMgr.migrateAway(vm.getUuid(), srcHostId);
+ // First try starting the vm with its original planner, if it doesn't succeed send HAPlanner as its an emergency.
+ boolean result = false;
+ try {
+ _itMgr.migrateAway(vm.getUuid(), srcHostId, null);
+ }catch (InsufficientServerCapacityException e) {
+ s_logger.warn("Failed to deploy vm " + vmId + " with original planner, sending HAPlanner");
+ _itMgr.migrateAway(vm.getUuid(), srcHostId, _haPlanners.get(0));
+ }
return null;
} catch (InsufficientServerCapacityException e) {
s_logger.warn("Insufficient capacity for migrating a VM.");
diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
index ca01831c25b..7d9805b0689 100755
--- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
+++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
@@ -2664,7 +2664,7 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
ConcurrentOperationException, ResourceUnavailableException {
s_logger.debug("Starting router " + router);
try {
- _itMgr.advanceStart(router.getUuid(), params, planToDeploy);
+ _itMgr.advanceStart(router.getUuid(), params, planToDeploy, null);
} catch (OperationTimedoutException e) {
throw new ResourceUnavailableException("Starting router " + router + " failed! " + e.toString(), DataCenter.class, router.getDataCenterId());
}
@@ -3433,9 +3433,9 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
}
protected boolean sendCommandsToRouter(final VirtualRouter router, Commands cmds) throws AgentUnavailableException {
- if(!checkRouterVersion(router)){
+ /*if(!checkRouterVersion(router)){
throw new CloudRuntimeException("Router requires upgrade. Unable to send command to router:" + router.getId());
- }
+ }*/
Answer[] answers = null;
try {
answers = _agentMgr.send(router.getHostId(), cmds);
diff --git a/server/src/com/cloud/storage/StoragePoolAutomationImpl.java b/server/src/com/cloud/storage/StoragePoolAutomationImpl.java
index f0f6eaf8073..2c11e73b9ce 100644
--- a/server/src/com/cloud/storage/StoragePoolAutomationImpl.java
+++ b/server/src/com/cloud/storage/StoragePoolAutomationImpl.java
@@ -242,7 +242,7 @@ public class StoragePoolAutomationImpl implements StoragePoolAutomation {
if (restart) {
- vmMgr.advanceStart(consoleProxy.getUuid(), null);
+ vmMgr.advanceStart(consoleProxy.getUuid(), null, null);
// update work status
work.setStartedAfterMaintenance(true);
_storagePoolWorkDao.update(work.getId(), work);
@@ -269,7 +269,7 @@ public class StoragePoolAutomationImpl implements StoragePoolAutomation {
_storagePoolWorkDao.update(work.getId(), work);
if (restart) {
- vmMgr.advanceStart(secStrgVm.getUuid(), null);
+ vmMgr.advanceStart(secStrgVm.getUuid(), null, null);
// update work status
work.setStartedAfterMaintenance(true);
_storagePoolWorkDao.update(work.getId(), work);
@@ -287,7 +287,7 @@ public class StoragePoolAutomationImpl implements StoragePoolAutomation {
_storagePoolWorkDao.update(work.getId(), work);
if (restart) {
- vmMgr.advanceStart(domR.getUuid(), null);
+ vmMgr.advanceStart(domR.getUuid(), null, null);
// update work status
work.setStartedAfterMaintenance(true);
_storagePoolWorkDao.update(work.getId(), work);
@@ -365,7 +365,7 @@ public class StoragePoolAutomationImpl implements StoragePoolAutomation {
ConsoleProxyVO consoleProxy = _consoleProxyDao
.findById(vmInstance.getId());
- vmMgr.advanceStart(consoleProxy.getUuid(), null);
+ vmMgr.advanceStart(consoleProxy.getUuid(), null, null);
// update work queue
work.setStartedAfterMaintenance(true);
_storagePoolWorkDao.update(work.getId(), work);
@@ -376,7 +376,7 @@ public class StoragePoolAutomationImpl implements StoragePoolAutomation {
VirtualMachine.Type.SecondaryStorageVm)) {
SecondaryStorageVmVO ssVm = _secStrgDao.findById(vmInstance
.getId());
- vmMgr.advanceStart(ssVm.getUuid(), null);
+ vmMgr.advanceStart(ssVm.getUuid(), null, null);
// update work queue
work.setStartedAfterMaintenance(true);
_storagePoolWorkDao.update(work.getId(), work);
@@ -386,7 +386,7 @@ public class StoragePoolAutomationImpl implements StoragePoolAutomation {
if (vmInstance.getType().equals(
VirtualMachine.Type.DomainRouter)) {
DomainRouterVO domR = _domrDao.findById(vmInstance.getId());
- vmMgr.advanceStart(domR.getUuid(), null);
+ vmMgr.advanceStart(domR.getUuid(), null, null);
// update work queue
work.setStartedAfterMaintenance(true);
_storagePoolWorkDao.update(work.getId(), work);
@@ -396,7 +396,7 @@ public class StoragePoolAutomationImpl implements StoragePoolAutomation {
if (vmInstance.getType().equals(VirtualMachine.Type.User)) {
UserVmVO userVm = userVmDao.findById(vmInstance.getId());
- vmMgr.advanceStart(userVm.getUuid(), null); // update work queue
+ vmMgr.advanceStart(userVm.getUuid(), null, null); // update work queue
work.setStartedAfterMaintenance(true);
_storagePoolWorkDao.update(work.getId(), work);
}
diff --git a/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java b/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java
index 7743dca827e..fb44b800d42 100755
--- a/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java
+++ b/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java
@@ -258,7 +258,7 @@ public class SecondaryStorageManagerImpl extends ManagerBase implements Secondar
public SecondaryStorageVmVO startSecStorageVm(long secStorageVmId) {
try {
SecondaryStorageVmVO secStorageVm = _secStorageVmDao.findById(secStorageVmId);
- _itMgr.advanceStart(secStorageVm.getUuid(), null);
+ _itMgr.advanceStart(secStorageVm.getUuid(), null, null);
return _secStorageVmDao.findById(secStorageVm.getId());
} catch (StorageUnavailableException e) {
s_logger.warn("Exception while trying to start secondary storage vm", e);
diff --git a/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java b/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java
index 3e6d7f96010..a35a27d2ddd 100644
--- a/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java
+++ b/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java
@@ -428,7 +428,7 @@ public class VMSnapshotManagerImpl extends ManagerBase implements VMSnapshotMana
// start or stop VM first, if revert from stopped state to running state, or from running to stopped
if(userVm.getState() == VirtualMachine.State.Stopped && vmSnapshotVo.getType() == VMSnapshot.Type.DiskAndMemory){
try {
- _itMgr.advanceStart(userVm.getUuid(), new HashMap());
+ _itMgr.advanceStart(userVm.getUuid(), new HashMap(), null);
vm = _userVMDao.findById(userVm.getId());
hostId = vm.getHostId();
} catch (Exception e) {
diff --git a/server/test/com/cloud/vm/DeploymentPlanningManagerImplTest.java b/server/test/com/cloud/vm/DeploymentPlanningManagerImplTest.java
index 0f343a5ea59..08e472af041 100644
--- a/server/test/com/cloud/vm/DeploymentPlanningManagerImplTest.java
+++ b/server/test/com/cloud/vm/DeploymentPlanningManagerImplTest.java
@@ -41,7 +41,7 @@ import com.cloud.dc.ClusterVO;
import com.cloud.dc.DataCenterVO;
import com.cloud.dc.dao.ClusterDao;
import com.cloud.dc.dao.DataCenterDao;
-import com.cloud.dc.dao.DedicatedResourceDao;
+import com.cloud.dc.dao.DedicatedResourceDao;
import com.cloud.dc.dao.HostPodDao;
import com.cloud.deploy.DataCenterDeployment;
import com.cloud.deploy.DeployDestination;
@@ -120,9 +120,9 @@ public class DeploymentPlanningManagerImplTest {
@Inject
ClusterDao _clusterDao;
- @Inject
- DedicatedResourceDao _dedicatedDao;
-
+ @Inject
+ DedicatedResourceDao _dedicatedDao;
+
private static long domainId = 5L;
private static long dataCenterId = 1L;
@@ -167,7 +167,7 @@ public class DeploymentPlanningManagerImplTest {
DataCenterDeployment plan = new DataCenterDeployment(dataCenterId);
Mockito.when(avoids.shouldAvoid((DataCenterVO) Mockito.anyObject())).thenReturn(true);
- DeployDestination dest = _dpm.planDeployment(vmProfile, plan, avoids);
+ DeployDestination dest = _dpm.planDeployment(vmProfile, plan, avoids, null);
assertNull("DataCenter is in avoid set, destination should be null! ", dest);
}
@@ -182,7 +182,7 @@ public class DeploymentPlanningManagerImplTest {
Mockito.when(avoids.shouldAvoid((DataCenterVO) Mockito.anyObject())).thenReturn(false);
Mockito.when(_planner.canHandle(vmProfile, plan, avoids)).thenReturn(false);
- DeployDestination dest = _dpm.planDeployment(vmProfile, plan, avoids);
+ DeployDestination dest = _dpm.planDeployment(vmProfile, plan, avoids, null);
assertNull("Planner cannot handle, destination should be null! ", dest);
}
@@ -197,7 +197,7 @@ public class DeploymentPlanningManagerImplTest {
Mockito.when(_planner.canHandle(vmProfile, plan, avoids)).thenReturn(true);
Mockito.when(((DeploymentClusterPlanner) _planner).orderClusters(vmProfile, plan, avoids)).thenReturn(null);
- DeployDestination dest = _dpm.planDeployment(vmProfile, plan, avoids);
+ DeployDestination dest = _dpm.planDeployment(vmProfile, plan, avoids, null);
assertNull("Planner cannot handle, destination should be null! ", dest);
}
@@ -262,11 +262,11 @@ public class DeploymentPlanningManagerImplTest {
}
@Bean
- public DedicatedResourceDao dedicatedResourceDao() {
- return Mockito.mock(DedicatedResourceDao.class);
- }
-
- @Bean
+ public DedicatedResourceDao dedicatedResourceDao() {
+ return Mockito.mock(DedicatedResourceDao.class);
+ }
+
+ @Bean
public GuestOSDao guestOSDao() {
return Mockito.mock(GuestOSDao.class);
}