package io.cattle.platform.allocator.constraint; import static io.cattle.platform.core.model.tables.PortTable.*; import io.cattle.platform.allocator.dao.AllocatorDao; import io.cattle.platform.allocator.exception.FailedToAllocate; 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.core.model.Port; import io.cattle.platform.object.ObjectManager; import java.util.HashSet; import java.util.List; import java.util.Set; import javax.inject.Inject; public class PortsConstraintProvider implements AllocationConstraintsProvider { @Inject AllocatorDao allocatorDao; @Inject ObjectManager objectManager; @Override public void appendConstraints(AllocationAttempt attempt, AllocationLog log, List<Constraint> constraints) { Set<String> duplicatePorts = new HashSet<String>(); boolean checkForDupes = attempt.getInstances().size() > 1; for (Instance instance : attempt.getInstances()) { List<Port> ports = objectManager.find(Port.class, PORT.INSTANCE_ID, instance.getId(), PORT.REMOVED, null); if (checkForDupes) { for (Port port : ports) { String p = String.format("%s/%s", port.getPublicPort(), port.getProtocol()); if (!duplicatePorts.add(p)) { throw new FailedToAllocate(String.format("Port %s requested more than once.", p)); } } } if (ports.size() > 0) { constraints.add(new PortsConstraint(instance.getId(), ports)); } } } @Override public boolean isCritical() { return false; } }