package io.cattle.platform.allocator.constraint;
import io.cattle.platform.allocator.service.AllocationAttempt;
import io.cattle.platform.allocator.service.AllocationLog;
import io.cattle.platform.core.model.Instance;
import io.cattle.platform.docker.constants.DockerInstanceConstants;
import io.cattle.platform.json.JsonMapper;
import io.cattle.platform.object.util.DataAccessor;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.inject.Inject;
public class VolumesFromConstraintProvider extends CollocationChecker implements AllocationConstraintsProvider {
@Inject
JsonMapper jsonMapper;
@Override
public void appendConstraints(AllocationAttempt attempt, AllocationLog log, List<Constraint> constraints) {
for (Instance instance : attempt.getInstances()) {
@SuppressWarnings("unchecked")
Set<Integer> intDataVolumesFrom = DataAccessor.fields(instance).withKey(DockerInstanceConstants.FIELD_VOLUMES_FROM).as(jsonMapper, Set.class);
if (intDataVolumesFrom != null && !intDataVolumesFrom.isEmpty()) {
Set<Long> dataVolumesFrom = new HashSet<>();
for (Integer i : intDataVolumesFrom) {
dataVolumesFrom.add(i.longValue());
}
Map<Long, Set<Long>> hostsToInstances = checkAndGetCollocatedInstanceHosts(dataVolumesFrom, attempt.getInstances());
for (Map.Entry<Long, Set<Long>> hostToInstances : hostsToInstances.entrySet()) {
constraints.add(new CollocationConstraint(hostToInstances.getKey(), hostToInstances.getValue()));
}
}
}
}
@Override
public boolean isCritical() {
return false;
}
}