package io.airlift.airship.cli; import com.google.common.base.Predicate; import com.google.common.collect.Lists; import io.airlift.airline.Option; import io.airlift.airship.coordinator.AgentFilterBuilder; import io.airlift.airship.shared.AgentStatus; import io.airlift.airship.shared.Assignment; import io.airlift.airship.shared.HttpUriBuilder; import io.airlift.airship.shared.Repository; import java.net.URI; import java.util.List; import java.util.UUID; import static com.google.common.collect.Lists.newArrayList; public class AgentFilter { @Option(name = {"-u", "--uuid"}, description = "Select agent with the given UUID") public final List<String> uuid = newArrayList(); @Option(name = {"-U", "--not-uuid"}, description = "Excludes agent with the given UUID") public final List<String> notUuid = newArrayList(); @Option(name = {"-h", "--host"}, description = "Select agent on the given host or ip") public final List<String> host = newArrayList(); @Option(name = {"-H", "--not-host"}, description = "Excludes agent on the given host or ip") public final List<String> notHost = newArrayList(); @Option(name = {"-m", "--machine"}, description = "Select agent on the given machine") public final List<String> machine = newArrayList(); @Option(name = {"-M", "--not-machine"}, description = "Excludes agent on the given machine") public final List<String> notMachine = newArrayList(); @Option(name = {"--slot-uuid"}, description = "Select agent agent a slot the given UUID") public final List<String> slotUuid = newArrayList(); @Option(name = {"--not-slot-uuid"}, description = "Exclude agent containing a slot the given UUID") public final List<String> notSlotUuid = newArrayList(); @Option(name = {"-s", "--state"}, description = "Select 'online', 'offline' or 'provisioning' agents") public final List<String> state = newArrayList(); @Option(name = {"-S", "--not-state"}, description = "Exclude 'online', 'offline' or 'provisioning' agents") public final List<String> notState = newArrayList(); @Option(name = "--all", description = "Select all agents") public boolean selectAll; // assignable filters can not be set via the CLI public final List<Assignment> assignableFilters = Lists.newArrayList(); public Predicate<AgentStatus> toAgentPredicate(List<String> allAgentUuids, List<UUID> allSlotUuids, boolean allowDuplicateInstallationsOnAnAgent, Repository repository) { return createFilterBuilder().build(allAgentUuids, allSlotUuids, allowDuplicateInstallationsOnAnAgent, repository); } public URI toUri(URI baseUri) { return createFilterBuilder().buildUri(baseUri); } public URI toUri(HttpUriBuilder uriBuilder) { return createFilterBuilder().buildUri(uriBuilder); } private AgentFilterBuilder createFilterBuilder() { AgentFilterBuilder agentFilterBuilder = AgentFilterBuilder.builder(); for (String id : uuid) { agentFilterBuilder.addUuidFilter(id); } for (String hostGlob : host) { agentFilterBuilder.addHostGlobFilter(hostGlob); } for (String machineGlob : machine) { agentFilterBuilder.addMachineGlobFilter(machineGlob); } for (String stateFilter : state) { agentFilterBuilder.addStateFilter(stateFilter); } for (String slotUuidGlob : slotUuid) { agentFilterBuilder.addSlotUuidGlobFilter(slotUuidGlob); } for (Assignment assignment : assignableFilters) { agentFilterBuilder.addAssignableFilter(assignment); } if (selectAll) { agentFilterBuilder.selectAll(); } return agentFilterBuilder; } @Override public String toString() { final StringBuilder sb = new StringBuilder(); sb.append("AgentFilter"); sb.append("{uuid=").append(uuid); sb.append(", host=").append(host); sb.append(", machine=").append(machine); sb.append(", slotUuid=").append(slotUuid); sb.append(", state=").append(state); sb.append(", assignableFilters=").append(assignableFilters); sb.append(", selectAll=").append(selectAll); sb.append('}'); return sb.toString(); } }