package org.ovirt.engine.core.bll.scheduling.policyunits; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.ovirt.engine.core.bll.scheduling.PolicyUnitImpl; import org.ovirt.engine.core.bll.scheduling.SchedulingUnit; import org.ovirt.engine.core.bll.scheduling.pending.PendingResourceManager; import org.ovirt.engine.core.common.businessentities.Cluster; import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.VdsDynamic; import org.ovirt.engine.core.common.errors.EngineMessage; import org.ovirt.engine.core.common.scheduling.PerHostMessages; import org.ovirt.engine.core.common.scheduling.PolicyUnit; import org.ovirt.engine.core.common.scheduling.PolicyUnitType; import org.ovirt.engine.core.utils.OS; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @SchedulingUnit( guid = "84e6ddee-ab0d-42dd-82f0-c298889db567", name = "InClusterUpgrade", description = "Filter out all hosts which run an older OS version than the host the vm is currently running on.", type = PolicyUnitType.FILTER ) public class InClusterUpgradeFilterPolicyUnit extends PolicyUnitImpl { private static final Logger log = LoggerFactory.getLogger(CpuLevelFilterPolicyUnit.class); public InClusterUpgradeFilterPolicyUnit(PolicyUnit policyUnit, PendingResourceManager pendingResourceManager) { super(policyUnit, pendingResourceManager); } @Override public List<VDS> filter(Cluster cluster, List<VDS> hosts, VM vm, Map<String, String> parameters, PerHostMessages messages) { final VdsDynamic sourceHost = getLastHost(vm); if (sourceHost == null) { return hosts; } final OS lastHostOs = OS.fromPackageVersionString(sourceHost.getHostOs()); if (!lastHostOs.isValid()) { log.debug("Source host {} does not provide a valid and complete OS identifier. Found {}.", sourceHost.getId(), sourceHost.getHostOs()); return hosts; } final List<VDS> notOlderHosts = new ArrayList(); for (VDS host : hosts) { final OS hostOs = OS.fromPackageVersionString(host.getHostOs()); if (!hostOs.isValid()) { log.debug("Host {} does not provide a valid OS identifier. Found {}.", host.getId(), host.getHostOs()); messages.addMessage(host.getId(), EngineMessage.VAR__DETAIL__INVALID_OS.name()); messages.addMessage(host.getId(), String.format("$os %1$s", host.getHostOs())); } else if (!hostOs.isSameOsFamily(lastHostOs)) { log.debug("Host {} does not run the same operating system. Expected {}, found {}", host.getId(), lastHostOs.getName(), hostOs.getName()); messages.addMessage(host.getId(), EngineMessage.VAR__DETAIL__WRONG_OS.name()); messages.addMessage(host.getId(), String.format("$expected %1$s", lastHostOs.getName())); messages.addMessage(host.getId(), String.format("$found %1$s", hostOs.getName())); } else if (hostOs.isOlderThan(lastHostOs) && !hostOs.isSameMajorVersion(lastHostOs)) { log.debug("Host {} runs a too old OS version. Found {}", host.getId(), host.getHostOs()); messages.addMessage(host.getId(), EngineMessage.VAR__DETAIL__OLD_OS.name()); messages.addMessage(host.getId(), String.format("$found %1$s", hostOs.getName())); } else { notOlderHosts.add(host); } } return notOlderHosts; } }