package io.airlift.airship.coordinator; import com.google.common.base.Predicate; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import io.airlift.airship.coordinator.AgentFilterBuilder.AssignablePredicate; import io.airlift.airship.coordinator.AgentFilterBuilder.HostPredicate; import io.airlift.airship.coordinator.AgentFilterBuilder.MachinePredicate; import io.airlift.airship.coordinator.AgentFilterBuilder.SlotUuidPredicate; import io.airlift.airship.coordinator.AgentFilterBuilder.StatePredicate; import io.airlift.airship.coordinator.AgentFilterBuilder.UuidPredicate; import io.airlift.airship.shared.AgentStatus; import io.airlift.airship.shared.MockUriInfo; import io.airlift.airship.shared.Repository; import io.airlift.airship.shared.SlotStatus; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import java.net.URI; import java.util.List; import java.util.UUID; import static io.airlift.airship.shared.AgentLifecycleState.OFFLINE; import static io.airlift.airship.shared.AgentLifecycleState.ONLINE; import static io.airlift.airship.shared.AssignmentHelper.APPLE_ASSIGNMENT; import static io.airlift.airship.shared.AssignmentHelper.BANANA_ASSIGNMENT; import static io.airlift.airship.shared.SlotLifecycleState.UNKNOWN; import static io.airlift.airship.shared.SlotStatus.createSlotStatus; import static java.util.Arrays.asList; import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertTrue; import static org.testng.Assert.fail; public class TestAgentFilterBuilder { private AgentStatus status; @BeforeMethod public void setUp() throws Exception { status = new AgentStatus("agent-id", ONLINE, "instance-id", URI.create("internal://10.0.0.1"), URI.create("external://localhost"), "/unknown/location", "instance.type", ImmutableList.<SlotStatus>of(createSlotStatus(UUID.fromString("12345678-1234-1234-1234-123456789012"), URI.create("fake://localhost"), URI.create("fake://localhost"), "instance", "/location", UNKNOWN, APPLE_ASSIGNMENT, "/install-path", ImmutableMap.<String, Integer>of())), ImmutableMap.<String, Integer>of( "memory", 2048, "cpu", 4)); } private Predicate<AgentStatus> buildFilter(String key, String value, List<String> agentUuids, List<UUID> slotUuids) { return AgentFilterBuilder.build(MockUriInfo.from("fake://localhost?" + key + "=" + value), agentUuids, slotUuids); } private Predicate<AgentStatus> buildFilter(String key, String value) { return buildFilter(key, value, ImmutableList.<String>of(), ImmutableList.<UUID>of()); } private Predicate<AgentStatus> buildFilter(String key, String value, boolean allowDuplicateInstallationsOnAnAgent, Repository repository) { return AgentFilterBuilder.build(MockUriInfo.from("fake://localhost?" + key + "=" + value), ImmutableList.<String>of(), ImmutableList.<UUID>of(), allowDuplicateInstallationsOnAnAgent, repository); } @Test public void testAll() { assertTrue(AgentFilterBuilder.build(MockUriInfo.from("fake://localhost?all&state=online"), ImmutableList.<String>of(), ImmutableList.<UUID>of()).apply(status)); assertTrue(AgentFilterBuilder.build(MockUriInfo.from("fake://localhost?all&state=offline"), ImmutableList.<String>of(), ImmutableList.<UUID>of()).apply(status)); assertTrue(AgentFilterBuilder.build(MockUriInfo.from("fake://localhost?all&host=host"), ImmutableList.<String>of(), ImmutableList.<UUID>of()).apply(status)); } @Test public void testUuidPredicate() { assertTrue(new UuidPredicate("agent-id", ImmutableList.<String>of("agent-id", "apple")).apply(status)); assertTrue(buildFilter("uuid", "agent-id", ImmutableList.<String>of("agent-id", "apple"), ImmutableList.<UUID>of()).apply(status)); assertTrue(new UuidPredicate("age", ImmutableList.<String>of("agent-id", "apple")).apply(status)); assertTrue(buildFilter("uuid", "age", ImmutableList.<String>of("agent-id", "apple"), ImmutableList.<UUID>of()).apply(status)); assertFalse(new UuidPredicate("unknown", ImmutableList.<String>of("agent-id", "apple")).apply(status)); assertFalse(buildFilter("uuid", "unknown", ImmutableList.<String>of("agent-id", "apple"), ImmutableList.<UUID>of()).apply(status)); try { new UuidPredicate("a", ImmutableList.<String>of("agent-id", "apple")).apply(status); fail("expected IllegalArgumentException"); } catch (IllegalArgumentException expected) { assertTrue(expected.getMessage().toLowerCase().contains("ambiguous expansion")); } try { buildFilter("uuid", "a", ImmutableList.<String>of("agent-id", "apple"), ImmutableList.<UUID>of()).apply(status); fail("expected IllegalArgumentException"); } catch (IllegalArgumentException expected) { assertTrue(expected.getMessage().toLowerCase().contains("ambiguous expansion")); } assertFalse(buildFilter("!uuid", "agent-id", ImmutableList.<String>of("agent-id", "apple"), ImmutableList.<UUID>of()).apply(status)); assertFalse(buildFilter("!uuid", "age", ImmutableList.<String>of("agent-id", "apple"), ImmutableList.<UUID>of()).apply(status)); assertTrue(buildFilter("!uuid", "unknown", ImmutableList.<String>of("agent-id", "apple"), ImmutableList.<UUID>of()).apply(status)); try { buildFilter("!uuid", "a", ImmutableList.<String>of("agent-id", "apple"), ImmutableList.<UUID>of()).apply(status); fail("expected IllegalArgumentException"); } catch (IllegalArgumentException expected) { assertTrue(expected.getMessage().toLowerCase().contains("ambiguous expansion")); } } @Test public void testStateSpecPredicate() { assertTrue(new StatePredicate(ONLINE).apply(status)); assertTrue(buildFilter("state", "online").apply(status)); assertFalse(new StatePredicate(OFFLINE).apply(status)); assertFalse(buildFilter("state", "offline").apply(status)); assertFalse(buildFilter("!state", "online").apply(status)); assertTrue(buildFilter("!state", "offline").apply(status)); } @Test public void testSlotUuidPredicate() { assertTrue(new SlotUuidPredicate(UUID.fromString("12345678-1234-1234-1234-123456789012")).apply(status)); assertTrue(buildFilter("slotUuid", "12345678-1234-1234-1234-123456789012", ImmutableList.<String>of(), asList(UUID.fromString("12345678-1234-1234-1234-123456789012"))).apply(status)); assertFalse(new SlotUuidPredicate(UUID.fromString("00000000-0000-0000-0000-000000000000")).apply(status)); assertFalse(buildFilter("slotUuid", "00000000-0000-0000-0000-000000000000").apply(status)); assertFalse(buildFilter("!slotUuid", "12345678-1234-1234-1234-123456789012", ImmutableList.<String>of(), asList(UUID.fromString("12345678-1234-1234-1234-123456789012"))).apply(status)); assertTrue(buildFilter("!slotUuid", "00000000-0000-0000-0000-000000000000").apply(status)); } @Test public void testHostSpecPredicate() { assertTrue(new HostPredicate("localhost").apply(status)); assertTrue(buildFilter("host", "localhost").apply(status)); assertTrue(new HostPredicate("LOCALHOST").apply(status)); assertTrue(buildFilter("host", "LOCALHOST").apply(status)); assertTrue(new HostPredicate("LocalHost").apply(status)); assertTrue(buildFilter("host", "LocalHost").apply(status)); assertTrue(new HostPredicate("local*").apply(status)); assertTrue(buildFilter("host", "local*").apply(status)); assertTrue(new HostPredicate("LocAL*").apply(status)); assertTrue(buildFilter("host", "LocAL*").apply(status)); assertFalse(new HostPredicate("foo").apply(status)); assertFalse(buildFilter("host", "foo").apply(status)); assertTrue(new HostPredicate("127.0.0.1").apply(status)); assertTrue(buildFilter("host", "127.0.0.1").apply(status)); assertTrue(new HostPredicate("10.0.0.1").apply(status)); assertTrue(buildFilter("host", "10.0.0.1").apply(status)); assertFalse(new HostPredicate("10.1.2.3").apply(status)); assertFalse(buildFilter("host", "10.1.2.3").apply(status)); assertFalse(buildFilter("!host", "localhost").apply(status)); assertFalse(buildFilter("!host", "LOCALHOST").apply(status)); assertFalse(buildFilter("!host", "LocalHost").apply(status)); assertFalse(buildFilter("!host", "local*").apply(status)); assertFalse(buildFilter("!host", "LocAL*").apply(status)); assertTrue(buildFilter("!host", "foo").apply(status)); assertFalse(buildFilter("!host", "127.0.0.1").apply(status)); assertFalse(buildFilter("!host", "10.0.0.1").apply(status)); assertTrue(buildFilter("!host", "10.1.2.3").apply(status)); } @Test public void testMachineSpecPredicate() { assertTrue(new MachinePredicate("instance-id").apply(status)); assertTrue(buildFilter("machine", "instance-id").apply(status)); assertTrue(new MachinePredicate("inst*").apply(status)); assertTrue(buildFilter("machine", "inst*").apply(status)); assertFalse(new MachinePredicate("INSTANCE-ID").apply(status)); assertFalse(buildFilter("machine", "INSTANCE-ID").apply(status)); assertFalse(new MachinePredicate("INST*").apply(status)); assertFalse(buildFilter("machine", "INST*").apply(status)); assertFalse(buildFilter("!machine", "instance-id").apply(status)); assertFalse(buildFilter("!machine", "inst*").apply(status)); assertTrue(buildFilter("!machine", "INSTANCE-ID").apply(status)); assertTrue(buildFilter("!machine", "INST*").apply(status)); } @Test public void testAssignablePredicate() throws Exception { TestingMavenRepository repository = new TestingMavenRepository(); try { assertTrue(new AssignablePredicate(BANANA_ASSIGNMENT, true, repository).apply(status)); assertTrue(buildFilter("assignable", BANANA_ASSIGNMENT.getBinary() + BANANA_ASSIGNMENT.getConfig(), true, repository).apply(status)); assertTrue(new AssignablePredicate(BANANA_ASSIGNMENT, false, repository).apply(status)); assertTrue(buildFilter("assignable", BANANA_ASSIGNMENT.getBinary() + BANANA_ASSIGNMENT.getConfig(), false, repository).apply(status)); assertTrue(new AssignablePredicate(APPLE_ASSIGNMENT, true, repository).apply(status)); assertTrue(buildFilter("assignable", APPLE_ASSIGNMENT.getBinary() + APPLE_ASSIGNMENT.getConfig(), true, repository).apply(status)); assertFalse(new AssignablePredicate(APPLE_ASSIGNMENT, false, repository).apply(status)); assertFalse(buildFilter("assignable", APPLE_ASSIGNMENT.getBinary() + APPLE_ASSIGNMENT.getConfig(), false, repository).apply(status)); SlotStatus slot = createSlotStatus( UUID.fromString("99999999-1234-1234-1234-123456789012"), URI.create("fake://localhost"), URI.create("fake://localhost"), "instance", "/location", UNKNOWN, APPLE_ASSIGNMENT, "/install-path", ImmutableMap.<String, Integer>of( "memory", 2048, "cpu", 4 )); status = status.changeSlotStatus(slot); assertFalse(new AssignablePredicate(BANANA_ASSIGNMENT, true, repository).apply(status)); assertFalse(buildFilter("assignable", BANANA_ASSIGNMENT.getBinary() + BANANA_ASSIGNMENT.getConfig(), true, repository).apply(status)); slot = createSlotStatus( slot.getId(), slot.getSelf(), slot.getExternalUri(), slot.getInstanceId(), slot.getLocation(), UNKNOWN, null, slot.getInstallPath(), slot.getResources()); status = status.changeSlotStatus(slot); assertFalse(new AssignablePredicate(BANANA_ASSIGNMENT, false, repository).apply(status)); assertFalse(buildFilter("assignable", BANANA_ASSIGNMENT.getBinary() + BANANA_ASSIGNMENT.getConfig(), false, repository).apply(status)); } finally { repository.destroy(); } } @Test public void testNullFields() { status = new AgentStatus("agent-id", ONLINE, null, null, null, null, null, ImmutableList.<SlotStatus>of(createSlotStatus(UUID.randomUUID(), null, null, null, "/location", UNKNOWN, null, null, ImmutableMap.<String, Integer>of())), ImmutableMap.<String, Integer>of()); assertTrue(new UuidPredicate("agent-id", asList("agent-id", null)).apply(status)); assertTrue(buildFilter("uuid", "agent-id", asList("agent-id", null), ImmutableList.<UUID>of()).apply(status)); assertFalse(new HostPredicate("localhost").apply(status)); assertFalse(buildFilter("host", "localhost").apply(status)); assertFalse(new MachinePredicate("instance-id").apply(status)); assertFalse(buildFilter("machine", "instance-id").apply(status)); } }