package io.cattle.platform.allocator.constraint; import io.cattle.platform.allocator.service.AllocationAttempt; import io.cattle.platform.allocator.service.AllocationLog; import io.cattle.platform.allocator.service.AllocationHelper; import io.cattle.platform.core.constants.InstanceConstants; import io.cattle.platform.core.model.Instance; import io.cattle.platform.json.JsonMapper; import io.cattle.platform.object.util.DataAccessor; import java.util.List; import java.util.Map; import javax.inject.Inject; /** * Future optimization: For hard constraints, we might be able to update the DB query to do * the lookup. * * @author sonchang * */ public class AffinityConstraintsProvider implements AllocationConstraintsProvider { @Inject JsonMapper jsonMapper; @Inject AllocationHelper allocationHelper; @SuppressWarnings("rawtypes") @Override public void appendConstraints(AllocationAttempt attempt, AllocationLog log, List<Constraint> constraints) { for (Instance instance : attempt.getInstances()) { Map env = DataAccessor.fields(instance).withKey(InstanceConstants.FIELD_ENVIRONMENT).as(jsonMapper, Map.class); // TODO: hack for now. assuming all affinity:constraint specs are just found in the key List<Constraint> affinityConstraintsFromEnv = allocationHelper.extractConstraintsFromEnv(env); for (Constraint constraint : affinityConstraintsFromEnv) { constraints.add(constraint); } // Currently, intentionally duplicating code to be explicit Map labels = DataAccessor.fields(instance).withKey(InstanceConstants.FIELD_LABELS).as(jsonMapper, Map.class); List<Constraint> affinityConstraintsFromLabels = allocationHelper.extractConstraintsFromLabels(labels, instance); for (Constraint constraint : affinityConstraintsFromLabels) { constraints.add(constraint); } } } @Override public boolean isCritical() { return false; } }