package io.cattle.platform.allocator.constraint;
import io.cattle.platform.allocator.constraint.AffinityConstraintDefinition.AffinityOps;
import io.cattle.platform.allocator.service.AllocationCandidate;
import io.cattle.platform.core.dao.InstanceDao;
import io.cattle.platform.core.model.Instance;
import io.cattle.platform.object.ObjectManager;
import java.util.List;
public class ContainerAffinityConstraint implements Constraint {
public static final String ENV_HEADER_AFFINITY_CONTAINER = "affinity:container";
public static final String LABEL_HEADER_AFFINITY_CONTAINER = "io.rancher.scheduler." + ENV_HEADER_AFFINITY_CONTAINER;
AffinityOps op;
String containerIdentifier;
ObjectManager objectManager;
InstanceDao instanceDao;
// TODO: Might actually do an early lookup for host lists as an optimization
public ContainerAffinityConstraint(AffinityConstraintDefinition affinityDef, ObjectManager objectManager, InstanceDao instanceDao) {
this.op = affinityDef.op;
this.containerIdentifier = affinityDef.value;
this.objectManager = objectManager;
this.instanceDao = instanceDao;
}
@Override
public boolean matches(AllocationCandidate candidate) {
if (candidate.getHost() == null) {
return false;
}
if (op == AffinityOps.SOFT_EQ || op == AffinityOps.EQ) {
List<? extends Instance> instances = instanceDao.getNonRemovedInstanceOn(candidate.getHost());
for (Instance instance : instances) {
if (containerIdentifier != null
&& (containerIdentifier.equalsIgnoreCase(instance.getName()) || containerIdentifier.equalsIgnoreCase(instance.getUuid()))) {
return true;
}
}
return false;
} else {
List<? extends Instance> instances = instanceDao.getNonRemovedInstanceOn(candidate.getHost());
for (Instance instance : instances) {
if (containerIdentifier != null && (containerIdentifier.equals(instance.getName()) || containerIdentifier.equals(instance.getUuid()))) {
return false;
}
}
return true;
}
}
@Override
public boolean isHardConstraint() {
return (op == AffinityOps.EQ || op == AffinityOps.NE);
}
@Override
public String toString() {
String hard = AffinityOps.EQ.equals(op) || AffinityOps.NE.equals(op) ? "must" : "should";
String with = AffinityOps.EQ.equals(op) || AffinityOps.SOFT_EQ.equals(op) ? "have" : "not have";
return String.format("host %s %s a container with name or uuid %s", hard, with, containerIdentifier);
}
}