TestStaticSelector.java
/*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.facebook.presto.resourceGroups;
import com.facebook.presto.resourceGroups.SelectorResourceEstimate.Range;
import com.facebook.presto.spi.resourceGroups.ResourceGroupId;
import com.facebook.presto.spi.resourceGroups.SelectionContext;
import com.facebook.presto.spi.resourceGroups.SelectionCriteria;
import com.facebook.presto.spi.session.ResourceEstimates;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import io.airlift.units.DataSize;
import io.airlift.units.Duration;
import org.testng.annotations.Test;
import java.util.Optional;
import java.util.Set;
import java.util.regex.Pattern;
import static org.testng.Assert.assertEquals;
public class TestStaticSelector
{
private static final ResourceEstimates EMPTY_RESOURCE_ESTIMATES = new ResourceEstimates(Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty());
@Test
public void testUserRegex()
{
ResourceGroupId resourceGroupId = new ResourceGroupId(new ResourceGroupId("global"), "foo");
StaticSelector selector = new StaticSelector(
Optional.of(Pattern.compile("user.*")),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.empty(),
new ResourceGroupIdTemplate("global.foo"));
assertEquals(selector.match(newSelectionCriteria("userA", null, ImmutableSet.of("tag1"), EMPTY_RESOURCE_ESTIMATES)).map(SelectionContext::getResourceGroupId), Optional.of(resourceGroupId));
assertEquals(selector.match(newSelectionCriteria("userB", "source", ImmutableSet.of(), EMPTY_RESOURCE_ESTIMATES)).map(SelectionContext::getResourceGroupId), Optional.of(resourceGroupId));
assertEquals(selector.match(newSelectionCriteria("A.user", null, ImmutableSet.of("tag1"), EMPTY_RESOURCE_ESTIMATES)), Optional.empty());
}
@Test
public void testSourceRegex()
{
ResourceGroupId resourceGroupId = new ResourceGroupId(new ResourceGroupId("global"), "foo");
StaticSelector selector = new StaticSelector(
Optional.empty(),
Optional.of(Pattern.compile(".*source.*")),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.empty(),
new ResourceGroupIdTemplate("global.foo"));
assertEquals(selector.match(newSelectionCriteria("userA", null, ImmutableSet.of("tag1"), EMPTY_RESOURCE_ESTIMATES)), Optional.empty());
assertEquals(selector.match(newSelectionCriteria("userB", "source", ImmutableSet.of(), EMPTY_RESOURCE_ESTIMATES)).map(SelectionContext::getResourceGroupId), Optional.of(resourceGroupId));
assertEquals(selector.match(newSelectionCriteria("A.user", "a source b", ImmutableSet.of("tag1"), EMPTY_RESOURCE_ESTIMATES)).map(SelectionContext::getResourceGroupId), Optional.of(resourceGroupId));
}
@Test
public void testClientTags()
{
ResourceGroupId resourceGroupId = new ResourceGroupId(new ResourceGroupId("global"), "foo");
StaticSelector selector = new StaticSelector(
Optional.empty(),
Optional.empty(),
Optional.of(ImmutableList.of("tag1", "tag2")),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.empty(),
new ResourceGroupIdTemplate("global.foo"));
assertEquals(selector.match(newSelectionCriteria("userA", null, ImmutableSet.of("tag1", "tag2"), EMPTY_RESOURCE_ESTIMATES)).map(SelectionContext::getResourceGroupId), Optional.of(resourceGroupId));
assertEquals(selector.match(newSelectionCriteria("userB", "source", ImmutableSet.of(), EMPTY_RESOURCE_ESTIMATES)), Optional.empty());
assertEquals(selector.match(newSelectionCriteria("A.user", "a source b", ImmutableSet.of("tag1"), EMPTY_RESOURCE_ESTIMATES)), Optional.empty());
assertEquals(selector.match(newSelectionCriteria("A.user", "a source b", ImmutableSet.of("tag1", "tag2", "tag3"), EMPTY_RESOURCE_ESTIMATES)).map(SelectionContext::getResourceGroupId), Optional.of(resourceGroupId));
}
@Test
public void testSchema()
{
ResourceGroupId resourceGroupId = new ResourceGroupId(new ResourceGroupId("global"), "schema1");
StaticSelector selector = new StaticSelector(
Optional.empty(),
Optional.empty(),
Optional.of(ImmutableList.of()),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.of("schema1"),
Optional.empty(),
new ResourceGroupIdTemplate("global.${SCHEMA}"));
assertEquals(selector.match(newSelectionCriteria("userA", null, "schema1", ImmutableSet.of(), EMPTY_RESOURCE_ESTIMATES)).map(SelectionContext::getResourceGroupId), Optional.of(resourceGroupId));
assertEquals(selector.match(newSelectionCriteria("userB", "source", "schema2", ImmutableSet.of(), EMPTY_RESOURCE_ESTIMATES)), Optional.empty());
assertEquals(selector.match(newSelectionCriteria("userA", null, "schema1", ImmutableSet.of("tag1"), EMPTY_RESOURCE_ESTIMATES)).map(SelectionContext::getResourceGroupId), Optional.of(resourceGroupId));
}
@Test
public void testSelectorResourceEstimate()
{
ResourceGroupId resourceGroupId = new ResourceGroupId(new ResourceGroupId("global"), "foo");
StaticSelector smallQuerySelector = new StaticSelector(
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.of(new SelectorResourceEstimate(
Optional.of(new Range<>(
Optional.empty(),
Optional.of(Duration.valueOf("5m")))),
Optional.empty(),
Optional.of(new Range<>(
Optional.empty(),
Optional.of(DataSize.valueOf("500MB")))))),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.empty(),
new ResourceGroupIdTemplate("global.foo"));
assertEquals(
smallQuerySelector.match(
newSelectionCriteria(
"userA",
null,
ImmutableSet.of("tag1", "tag2"),
new ResourceEstimates(
Optional.of(Duration.valueOf("4m")),
Optional.empty(),
Optional.of(DataSize.valueOf("400MB")),
Optional.empty())))
.map(SelectionContext::getResourceGroupId),
Optional.of(resourceGroupId));
assertEquals(
smallQuerySelector.match(
newSelectionCriteria(
"A.user",
"a source b",
ImmutableSet.of("tag1"),
new ResourceEstimates(
Optional.of(Duration.valueOf("4m")),
Optional.empty(),
Optional.of(DataSize.valueOf("600MB")),
Optional.empty())))
.map(SelectionContext::getResourceGroupId),
Optional.empty());
assertEquals(
smallQuerySelector.match(
newSelectionCriteria(
"userB",
"source",
ImmutableSet.of(),
new ResourceEstimates(
Optional.of(Duration.valueOf("4m")),
Optional.empty(),
Optional.empty(),
Optional.empty())))
.map(SelectionContext::getResourceGroupId),
Optional.empty());
StaticSelector largeQuerySelector = new StaticSelector(
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.of(new SelectorResourceEstimate(
Optional.empty(),
Optional.empty(),
Optional.of(new Range<>(
Optional.of(DataSize.valueOf("5TB")),
Optional.empty())))),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.empty(),
new ResourceGroupIdTemplate("global.foo"));
assertEquals(
largeQuerySelector.match(
newSelectionCriteria(
"userA",
null,
ImmutableSet.of("tag1", "tag2"),
new ResourceEstimates(
Optional.of(Duration.valueOf("100h")),
Optional.empty(),
Optional.of(DataSize.valueOf("4TB")),
Optional.empty())))
.map(SelectionContext::getResourceGroupId),
Optional.empty());
assertEquals(
largeQuerySelector.match(
newSelectionCriteria(
"A.user",
"a source b",
ImmutableSet.of("tag1"),
new ResourceEstimates(
Optional.empty(),
Optional.empty(),
Optional.of(DataSize.valueOf("6TB")),
Optional.empty())))
.map(SelectionContext::getResourceGroupId),
Optional.of(resourceGroupId));
assertEquals(
largeQuerySelector.match(
newSelectionCriteria(
"userB",
"source",
ImmutableSet.of(),
new ResourceEstimates(
Optional.of(Duration.valueOf("1s")),
Optional.of(Duration.valueOf("1s")),
Optional.of(DataSize.valueOf("6TB")),
Optional.empty())))
.map(SelectionContext::getResourceGroupId),
Optional.of(resourceGroupId));
}
@Test
public void testClientInfoRegex()
{
ResourceGroupId resourceGroupId = new ResourceGroupId(new ResourceGroupId("global"), "foo");
StaticSelector selector = new StaticSelector(
Optional.of(Pattern.compile("user.*")),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.of(Pattern.compile("client1.*")),
Optional.empty(),
Optional.empty(),
new ResourceGroupIdTemplate("global.foo"));
assertEquals(selector.match(newSelectionCriteria("userA", null, ImmutableSet.of("tag1"), EMPTY_RESOURCE_ESTIMATES, Optional.of("client123"))).map(SelectionContext::getResourceGroupId), Optional.of(resourceGroupId));
assertEquals(selector.match(newSelectionCriteria("userB", "source", ImmutableSet.of(), EMPTY_RESOURCE_ESTIMATES, Optional.of("client1"))).map(SelectionContext::getResourceGroupId), Optional.of(resourceGroupId));
assertEquals(selector.match(newSelectionCriteria("userA", null, ImmutableSet.of("tag1"), EMPTY_RESOURCE_ESTIMATES, Optional.of("A.client123"))), Optional.empty());
}
@Test
public void testSourcePrincipalRegex()
{
ResourceGroupId resourceGroupId = new ResourceGroupId(new ResourceGroupId("global"), "foo");
String princiaplRegex = ".*test:principal.*";
String principal = "test:principal";
StaticSelector selector = new StaticSelector(
Optional.empty(),
Optional.of(Pattern.compile(".*source.*")),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.empty(),
Optional.of(Pattern.compile(princiaplRegex)),
new ResourceGroupIdTemplate("global.foo"));
assertEquals(selector.match(newSelectionCriteria("userA", null, "", EMPTY_RESOURCE_ESTIMATES)), Optional.empty());
assertEquals(selector.match(newSelectionCriteria("userB", "source", principal, EMPTY_RESOURCE_ESTIMATES)).map(SelectionContext::getResourceGroupId), Optional.of(resourceGroupId));
assertEquals(selector.match(newSelectionCriteria("A.user", "a source b", "a " + principal + " b", EMPTY_RESOURCE_ESTIMATES)).map(SelectionContext::getResourceGroupId), Optional.of(resourceGroupId));
}
private SelectionCriteria newSelectionCriteria(String user, String source, Set<String> tags, ResourceEstimates resourceEstimates)
{
return new SelectionCriteria(true, user, Optional.ofNullable(source), tags, resourceEstimates, Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty());
}
private SelectionCriteria newSelectionCriteria(String user, String source, Set<String> tags, ResourceEstimates resourceEstimates, Optional<String> clientInfo)
{
return new SelectionCriteria(true, user, Optional.ofNullable(source), tags, resourceEstimates, Optional.empty(), clientInfo, Optional.empty(), Optional.empty());
}
private SelectionCriteria newSelectionCriteria(String user, String source, String schema, Set<String> tags, ResourceEstimates resourceEstimates)
{
return new SelectionCriteria(true, user, Optional.ofNullable(source), tags, resourceEstimates, Optional.empty(), Optional.empty(), Optional.of(schema), Optional.empty());
}
private SelectionCriteria newSelectionCriteria(String user, String source, String principal, ResourceEstimates resourceEstimates)
{
return new SelectionCriteria(true, user, Optional.ofNullable(source), ImmutableSet.of(), resourceEstimates, Optional.empty(), Optional.empty(), Optional.empty(), Optional.of(principal));
}
}