Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
import javax.inject.Inject;
import javax.naming.ConfigurationException;

import com.cloud.resource.ResourceState;
import org.apache.cloudstack.affinity.AffinityGroupDomainMapVO;
import org.apache.cloudstack.affinity.AffinityGroupProcessor;
import org.apache.cloudstack.affinity.AffinityGroupService;
Expand Down Expand Up @@ -378,16 +379,8 @@ public DeployDestination planDeployment(VirtualMachineProfile vmProfile, Deploym
planner = getDeploymentPlannerByName(plannerName);
}

Host lastHost = null;

String considerLastHostStr = (String)vmProfile.getParameter(VirtualMachineProfile.Param.ConsiderLastHost);
boolean considerLastHost = vm.getLastHostId() != null && haVmTag == null &&
(considerLastHostStr == null || Boolean.TRUE.toString().equalsIgnoreCase(considerLastHostStr));
if (considerLastHost) {
HostVO host = _hostDao.findById(vm.getLastHostId());
logger.debug("This VM has last host_id specified, trying to choose the same host: " + host);
lastHost = host;

Host lastHost = checkDeployInVmLastHost(vmProfile, vm);
if (lastHost != null) {
DeployDestination deployDestination = deployInVmLastHost(vmProfile, plan, avoids, planner, vm, dc, offering, cpuRequested, ramRequested, volumesRequireEncryption);
if (deployDestination != null) {
return deployDestination;
Expand Down Expand Up @@ -456,6 +449,31 @@ public DeployDestination planDeployment(VirtualMachineProfile vmProfile, Deploym
return dest;
}

private Host checkDeployInVmLastHost(VirtualMachineProfile vmProfile, VirtualMachine vm) {
String considerLastHostStr = (String)vmProfile.getParameter(VirtualMachineProfile.Param.ConsiderLastHost);
String haVmTag = (String)vmProfile.getParameter(VirtualMachineProfile.Param.HaTag);
boolean considerLastHost = vm.getLastHostId() != null && haVmTag == null &&
(considerLastHostStr == null || Boolean.TRUE.toString().equalsIgnoreCase(considerLastHostStr));
Comment thread
DaanHoogland marked this conversation as resolved.
Outdated
Comment thread
DaanHoogland marked this conversation as resolved.
Outdated
if (!considerLastHost) {
return null;
}

logger.debug("This VM has last host_id: {}", vm.getLastHostId());
HostVO lastHost = _hostDao.findById(vm.getLastHostId());
if (lastHost == null) {
logger.debug("Unable to deploy VM {} in the last host, last host doesn't exist", vm.getName());
return null;
}

logger.debug("VM's last host is {}, trying to choose the same host if it is not in maintenance, error or degraded state", lastHost);
if (lastHost.isInMaintenanceStates() || Arrays.asList(ResourceState.Error, ResourceState.Degraded).contains(lastHost.getResourceState())) {
logger.debug("Unable to deploy VM {} in the last host, last host {} is in {} state", vm.getName(), lastHost.getName(), lastHost.getResourceState());
return null;
}

Comment thread
DaanHoogland marked this conversation as resolved.
Outdated
return lastHost;
}

private void avoidDifferentArchResources(VirtualMachineProfile vmProfile, DataCenter dc, ExcludeList avoids) {
VirtualMachineTemplate template = vmProfile.getTemplate();
for (CPU.CPUArch arch : clusterArchTypes) {
Expand Down Expand Up @@ -1474,7 +1492,7 @@ private Pair<Boolean, Boolean> findVMStorageRequirements(VirtualMachineProfile v

protected Pair<Host, Map<Volume, StoragePool>> findPotentialDeploymentResources(List<Host> suitableHosts, Map<Volume, List<StoragePool>> suitableVolumeStoragePools,
ExcludeList avoid, PlannerResourceUsage resourceUsageRequired, List<Volume> readyAndReusedVolumes, List<Long> preferredHosts, VirtualMachine vm) {
logger.debug("Trying to find a potenial host and associated storage pools from the suitable host/pool lists for this VM");
logger.debug("Trying to find a potential host and associated storage pools from the suitable host/pool lists for this VM");

boolean hostCanAccessPool = false;
boolean haveEnoughSpace = false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -833,7 +833,7 @@ public Long migrate(final HaWorkVO work) {
if (checkAndCancelWorkIfNeeded(work)) {
return null;
}
logger.info("Migration attempt: for VM {}from host {}. Starting attempt: {}/{} times.", vm, srcHost, 1 + work.getTimesTried(), _maxRetries);
logger.info("Migration attempt: for {} from {}. Starting attempt: {}/{} times.", vm, srcHost, 1 + work.getTimesTried(), _maxRetries);

if (VirtualMachine.State.Stopped.equals(vm.getState())) {
logger.info(String.format("vm %s is Stopped, skipping migrate.", vm));
Expand All @@ -843,8 +843,6 @@ public Long migrate(final HaWorkVO work) {
logger.info(String.format("VM %s is running on a different host %s, skipping migration", vm, vm.getHostId()));
return null;
}
logger.info("Migration attempt: for VM " + vm.getUuid() + "from host id " + srcHostId +
". Starting attempt: " + (1 + work.getTimesTried()) + "/" + _maxRetries + " times.");

try {
work.setStep(Step.Migrating);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1417,7 +1417,7 @@ private boolean doMaintain(final long hostId) {
throw new CloudRuntimeException("There are active VMs using the host's local storage pool. Please stop all VMs on this host that use local storage.");
}
} else {
logger.info("Maintenance: scheduling migration of VM {} from host {}", vm, host);
logger.info("Maintenance: scheduling migration of {} from {}", vm, host);
_haMgr.scheduleMigration(vm, HighAvailabilityManager.ReasonType.HostMaintenance);
}
}
Expand Down
Loading