package io.cattle.platform.allocator.constraint;
import io.cattle.platform.allocator.constraint.AffinityConstraintDefinition.AffinityOps;
import io.cattle.platform.allocator.dao.AllocatorDao;
import io.cattle.platform.allocator.service.AllocationCandidate;
import io.cattle.platform.core.constants.CommonStatesConstants;
import java.util.Map;
public class HostAffinityConstraint implements Constraint {
public static final String ENV_HEADER_AFFINITY_HOST_LABEL = "constraint:";
public static final String LABEL_HEADER_AFFINITY_HOST_LABEL = "io.rancher.scheduler.affinity:host_label";
AllocatorDao allocatorDao;
AffinityOps op;
String labelKey;
String labelValue;
// TODO: Might actually do an early lookup for host lists as an optimization
public HostAffinityConstraint(AffinityConstraintDefinition def, AllocatorDao allocatorDao) {
this.op = def.op;
this.labelKey = def.key;
this.labelValue = def.value;
this.allocatorDao = allocatorDao;
}
@Override
public boolean matches(AllocationCandidate candidate) {
if (candidate.getHost() == null) {
return false;
}
if (op == AffinityOps.SOFT_EQ || op == AffinityOps.EQ) {
Map<String, String[]> labelsForHost = allocatorDao.getLabelsForHost(candidate.getHost());
if (labelsForHost.get(labelKey) == null) { // key doesn't exist
return false;
}
String value = labelsForHost.get(labelKey)[0];
String hostLabelMapState = labelsForHost.get(labelKey)[1];
if (!labelValue.equals(value) || CommonStatesConstants.REMOVING.equals(hostLabelMapState)) {
return false;
}
} else {
Map<String, String[]> labelsForHost = allocatorDao.getLabelsForHost(candidate.getHost());
if (labelsForHost.get(labelKey) != null
&& labelValue.equals(labelsForHost.get(labelKey)[0])
&& (CommonStatesConstants.CREATING.equals(labelsForHost.get(labelKey)[1])
|| CommonStatesConstants.CREATED.equals(labelsForHost.get(labelKey)[1]))) {
return false;
}
}
return true;
}
@Override
public boolean isHardConstraint() {
return (op == AffinityOps.EQ || op == AffinityOps.NE);
}
@Override
public String toString() {
return String.format("needs host with label %s%s: %s", labelKey, op.getLabelSymbol(), labelValue);
}
}