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.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.compat.Version; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @SchedulingUnit( guid = "3e4a7d54-9e7f-11e5-8994-feff819cdc9f", name = "Compatibility-Version", type = PolicyUnitType.FILTER, description = "Runs VMs only on hosts with a proper compatibility-version support" ) public class CompatibilityVersionFilterPolicyUnit extends PolicyUnitImpl { private static final Logger log = LoggerFactory.getLogger(CompatibilityVersionFilterPolicyUnit.class); public CompatibilityVersionFilterPolicyUnit(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) { // get required compatibility version Version vmCustomCompatibilityVersion = vm.getCustomCompatibilityVersion(); if (vmCustomCompatibilityVersion == null) { // use cluster default - all hosts are valid return hosts; } // find compatible hosts List<VDS> hostsToRunOn = new ArrayList<>(); for (VDS host : hosts) { if (host.getSupportedClusterVersionsSet().contains(vmCustomCompatibilityVersion)) { hostsToRunOn.add(host); log.debug("Host {} wasn't filtered out as it supports the VM required compatibility version({})", host.getName(), vmCustomCompatibilityVersion); } else { log.debug( "Host {} was filtered out as it doesn't support the VM required compatibility-version ({}). Host supported compatibility-versions are: {}.", host.getName(), vmCustomCompatibilityVersion, host.getSupportedClusterLevels()); messages.addMessage(host.getId(), String.format("$vmCompatibilityVersions %1$s", vmCustomCompatibilityVersion)); messages.addMessage(host.getId(), String.format("$hostCompatibilityVersions %1$s", host.getSupportedClusterLevels())); messages.addMessage(host.getId(), EngineMessage.VAR__DETAIL__UNSUPPORTED_COMPATIBILITY_VERSION.toString()); } } return hostsToRunOn; } }