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.SlotFilterBuilder.BinarySpecPredicate; import io.airlift.airship.coordinator.SlotFilterBuilder.ConfigSpecPredicate; import io.airlift.airship.coordinator.SlotFilterBuilder.HostPredicate; import io.airlift.airship.coordinator.SlotFilterBuilder.SlotUuidPredicate; import io.airlift.airship.coordinator.SlotFilterBuilder.StatePredicate; import io.airlift.airship.shared.Assignment; import io.airlift.airship.shared.MockUriInfo; import io.airlift.airship.shared.SlotStatus; import org.testng.annotations.Test; import java.net.URI; import java.util.Collections; import java.util.List; import java.util.UUID; import static io.airlift.airship.shared.AssignmentHelper.APPLE_ASSIGNMENT; import static io.airlift.airship.shared.SlotLifecycleState.RUNNING; 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; public class TestSlotFilterBuilder { private final SlotStatus status = SlotStatus.createSlotStatusWithExpectedState(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(), null, null, null); private Predicate<SlotStatus> buildFilter(String key, String value, List<UUID> uuids) { return SlotFilterBuilder.build(MockUriInfo.from("fake://localhost?" + key + "=" + value), true, uuids); } private Predicate<SlotStatus> buildFilter(String key, String value) { return buildFilter(key, value, Collections.<UUID>emptyList()); } @Test(expectedExceptions = InvalidSlotFilterException.class) public void testEmptyFilter() { SlotFilterBuilder.build(MockUriInfo.from("fake://localhost"), true, ImmutableList.<UUID>of()).apply(status); } @Test public void testAll() { assertTrue(SlotFilterBuilder.build(MockUriInfo.from("fake://localhost?all&state=unknown"), true, ImmutableList.<UUID>of()).apply(status)); assertTrue(SlotFilterBuilder.build(MockUriInfo.from("fake://localhost?all&state=running"), true, ImmutableList.<UUID>of()).apply(status)); assertTrue(SlotFilterBuilder.build(MockUriInfo.from("fake://localhost?all&host=host"), true, ImmutableList.<UUID>of()).apply(status)); } @Test public void testStateSpecPredicate() { assertTrue(new StatePredicate(UNKNOWN).apply(status)); assertTrue(buildFilter("state", "unknown").apply(status)); assertTrue(buildFilter("state", "u").apply(status)); assertTrue(buildFilter("state", "UnKnown").apply(status)); assertTrue(buildFilter("state", "U").apply(status)); assertFalse(new StatePredicate(RUNNING).apply(status)); assertFalse(buildFilter("state", "running").apply(status)); assertFalse(buildFilter("state", "r").apply(status)); assertFalse(buildFilter("!state", "unknown").apply(status)); assertFalse(buildFilter("!state", "u").apply(status)); assertFalse(buildFilter("!state", "UnKnown").apply(status)); assertFalse(buildFilter("!state", "U").apply(status)); assertTrue(buildFilter("!state", "running").apply(status)); assertTrue(buildFilter("!state", "r").apply(status)); } @Test public void testSlotUuidPredicate() { assertTrue(new SlotUuidPredicate(UUID.fromString("12345678-1234-1234-1234-123456789012")).apply(status)); assertTrue(buildFilter("uuid", "12345678-1234-1234-1234-123456789012", asList(UUID.fromString("12345678-1234-1234-1234-123456789012"))).apply(status)); assertFalse(new SlotUuidPredicate(UUID.fromString("00000000-0000-0000-0000-000000000000")).apply(status)); assertFalse(buildFilter("uuid", "00000000-0000-0000-0000-000000000000").apply(status)); assertFalse(buildFilter("!uuid", "12345678-1234-1234-1234-123456789012", asList(UUID.fromString("12345678-1234-1234-1234-123456789012"))).apply(status)); assertTrue(buildFilter("!uuid", "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)); 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)); assertTrue(buildFilter("!host", "10.1.2.3").apply(status)); } @Test public void testBinarySpecPredicate() { assertTrue(new BinarySpecPredicate("*").apply(status)); assertTrue(buildFilter("binary", "*").apply(status)); assertTrue(new BinarySpecPredicate("food.fruit:apple:1.0").apply(status)); assertTrue(buildFilter("binary", "food.fruit:apple:1.0").apply(status)); assertTrue(new BinarySpecPredicate("*apple*").apply(status)); assertTrue(buildFilter("binary", "*apple*").apply(status)); assertTrue(new BinarySpecPredicate("*:apple:1.0").apply(status)); assertTrue(buildFilter("binary", "*:apple:1.0").apply(status)); assertTrue(new BinarySpecPredicate("food.fruit:*:1.0").apply(status)); assertTrue(buildFilter("binary", "food.fruit:*:1.0").apply(status)); assertTrue(new BinarySpecPredicate("food.fruit:apple:*").apply(status)); assertTrue(buildFilter("binary", "food.fruit:apple:*").apply(status)); assertTrue(new BinarySpecPredicate("f*:a*:1.*").apply(status)); assertTrue(buildFilter("binary", "f*:a*:1.*").apply(status)); assertFalse(new BinarySpecPredicate("*banana*").apply(status)); assertFalse(buildFilter("binary", "*banana*").apply(status)); assertFalse(new BinarySpecPredicate("x:apple:1.0").apply(status)); assertFalse(buildFilter("binary", "x:apple:1.0").apply(status)); assertFalse(new BinarySpecPredicate("food.fruit:apple:zip:1.0").apply(status)); assertFalse(buildFilter("binary", "food.fruit:apple:zip:1.0").apply(status)); assertFalse(buildFilter("!binary", "*").apply(status)); assertFalse(buildFilter("!binary", "food.fruit:apple:1.0").apply(status)); assertFalse(buildFilter("!binary", "*apple*").apply(status)); assertFalse(buildFilter("!binary", "*:apple:1.0").apply(status)); assertFalse(buildFilter("!binary", "food.fruit:*:1.0").apply(status)); assertFalse(buildFilter("!binary", "food.fruit:apple:*").apply(status)); assertFalse(buildFilter("!binary", "f*:a*:1.*").apply(status)); assertTrue(buildFilter("!binary", "*banana*").apply(status)); assertTrue(buildFilter("!binary", "x:apple:1.0").apply(status)); assertTrue(buildFilter("!binary", "food.fruit:apple:zip:1.0").apply(status)); } @Test public void testFullBinarySpecPredicate() { SlotStatus status = createSlotStatus(UUID.randomUUID(), URI.create("fake://localhost"), URI.create("fake://localhost"), "instance", "/location", UNKNOWN, new Assignment("io.airlift:sample-server:tar.gz:distribution:0.35-SNAPSHOT", APPLE_ASSIGNMENT.getConfig()), "/install-path", ImmutableMap.<String, Integer>of()); assertTrue(new BinarySpecPredicate("*:*:*:*:*").apply(status)); assertTrue(buildFilter("binary", "*:*:*:*:*").apply(status)); assertTrue(new BinarySpecPredicate("io.airlift:sample-server:tar.gz:distribution:0.35-SNAPSHOT").apply(status)); assertTrue(buildFilter("binary", "io.airlift:sample-server:tar.gz:distribution:0.35-SNAPSHOT").apply(status)); assertTrue(new BinarySpecPredicate("*:sample-server:tar.gz:distribution:0.35-SNAPSHOT").apply(status)); assertTrue(buildFilter("binary", "*:sample-server:tar.gz:distribution:0.35-SNAPSHOT").apply(status)); assertTrue(new BinarySpecPredicate("io.airlift:*:tar.gz:distribution:0.35-SNAPSHOT").apply(status)); assertTrue(buildFilter("binary", "io.airlift:*:tar.gz:distribution:0.35-SNAPSHOT").apply(status)); assertTrue(new BinarySpecPredicate("io.airlift:sample-server:*:distribution:0.35-SNAPSHOT").apply(status)); assertTrue(buildFilter("binary", "io.airlift:sample-server:*:distribution:0.35-SNAPSHOT").apply(status)); assertTrue(new BinarySpecPredicate("io.airlift:sample-server:tar.gz:*:0.35-SNAPSHOT").apply(status)); assertTrue(buildFilter("binary", "io.airlift:sample-server:tar.gz:*:0.35-SNAPSHOT").apply(status)); assertTrue(new BinarySpecPredicate("io.airlift:sample-server:tar.gz:distribution:*").apply(status)); assertTrue(buildFilter("binary", "io.airlift:sample-server:tar.gz:distribution:*").apply(status)); assertTrue(new BinarySpecPredicate("i*:s*:t*:d*:0*").apply(status)); assertTrue(buildFilter("binary", "i*:s*:t*:d*:0*").apply(status)); assertFalse(new BinarySpecPredicate("io.airlift:sample-server:distribution:0.35-SNAPSHOT").apply(status)); assertFalse(buildFilter("binary", "io.airlift:sample-server:distribution:0.35-SNAPSHOT").apply(status)); assertFalse(buildFilter("!binary", "*:*:*:*:*").apply(status)); assertFalse(buildFilter("!binary", "io.airlift:sample-server:tar.gz:distribution:0.35-SNAPSHOT").apply(status)); assertFalse(buildFilter("!binary", "*:sample-server:tar.gz:distribution:0.35-SNAPSHOT").apply(status)); assertFalse(buildFilter("!binary", "io.airlift:*:tar.gz:distribution:0.35-SNAPSHOT").apply(status)); assertFalse(buildFilter("!binary", "io.airlift:sample-server:*:distribution:0.35-SNAPSHOT").apply(status)); assertFalse(buildFilter("!binary", "io.airlift:sample-server:tar.gz:*:0.35-SNAPSHOT").apply(status)); assertFalse(buildFilter("!binary", "io.airlift:sample-server:tar.gz:distribution:*").apply(status)); assertFalse(buildFilter("!binary", "i*:s*:t*:d*:0*").apply(status)); assertTrue(buildFilter("!binary", "io.airlift:sample-server:distribution:0.35-SNAPSHOT").apply(status)); } @Test public void testConfigSpecPredicate() { assertTrue(new ConfigSpecPredicate("@*:*").apply(status)); assertTrue(buildFilter("config", "@*:*").apply(status)); assertTrue(new ConfigSpecPredicate("@prod:apple:1.0").apply(status)); assertTrue(buildFilter("config", "@prod:apple:1.0").apply(status)); assertTrue(new ConfigSpecPredicate("@prod:apple:1.0").apply(status)); assertTrue(buildFilter("config", "@prod:apple:1.0").apply(status)); assertTrue(new ConfigSpecPredicate("@*:1.0").apply(status)); assertTrue(buildFilter("config", "@*:1.0").apply(status)); assertTrue(new ConfigSpecPredicate("@prod:apple:*").apply(status)); assertTrue(buildFilter("config", "@prod:apple:*").apply(status)); assertTrue(new ConfigSpecPredicate("@prod:a*:1.*").apply(status)); assertTrue(buildFilter("config", "@prod:a*:1.*").apply(status)); assertFalse(new ConfigSpecPredicate("@prod:apple:x:1.0").apply(status)); assertFalse(buildFilter("config", "@prod:apple:x:1.0").apply(status)); assertFalse(buildFilter("!config", "@*:*").apply(status)); assertFalse(buildFilter("!config", "@prod:apple:1.0").apply(status)); assertFalse(buildFilter("!config", "@prod:apple:1.0").apply(status)); assertFalse(buildFilter("!config", "@*:1.0").apply(status)); assertFalse(buildFilter("!config", "@prod:apple:*").apply(status)); assertFalse(buildFilter("!config", "@prod:a*:1.*").apply(status)); assertTrue(buildFilter("!config", "@prod:apple:x:1.0").apply(status)); } }