blob: d3966cb6ba18559e7edc611bc54e5f6885d5e67d [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.drill.alias;
import org.apache.drill.common.config.DrillProperties;
import org.apache.drill.common.exceptions.UserRemoteException;
import org.apache.drill.exec.ExecConstants;
import org.apache.drill.exec.alias.AliasRegistry;
import org.apache.drill.exec.rpc.user.security.testing.UserAuthenticatorTestImpl;
import org.apache.drill.test.ClientFixture;
import org.apache.drill.test.ClusterFixture;
import org.apache.drill.test.ClusterTest;
import org.hamcrest.MatcherAssert;
import org.junit.BeforeClass;
import org.junit.Test;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import static org.apache.drill.exec.rpc.user.security.testing.UserAuthenticatorTestImpl.ADMIN_GROUP;
import static org.apache.drill.exec.rpc.user.security.testing.UserAuthenticatorTestImpl.ADMIN_USER;
import static org.apache.drill.exec.rpc.user.security.testing.UserAuthenticatorTestImpl.ADMIN_USER_PASSWORD;
import static org.apache.drill.exec.rpc.user.security.testing.UserAuthenticatorTestImpl.PROCESS_USER;
import static org.apache.drill.exec.rpc.user.security.testing.UserAuthenticatorTestImpl.PROCESS_USER_PASSWORD;
import static org.apache.drill.exec.rpc.user.security.testing.UserAuthenticatorTestImpl.TEST_USER_1;
import static org.apache.drill.exec.rpc.user.security.testing.UserAuthenticatorTestImpl.TEST_USER_2;
import static org.apache.drill.exec.rpc.user.security.testing.UserAuthenticatorTestImpl.TEST_USER_2_PASSWORD;
import static org.hamcrest.CoreMatchers.containsString;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
public class TestAliasCommands extends ClusterTest {
private static AliasRegistry storageAliasesRegistry;
private static AliasRegistry tableAliasesRegistry;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
cluster = ClusterFixture.bareBuilder(dirTestWatcher)
.configProperty(ExecConstants.USER_AUTHENTICATION_ENABLED, true)
.configProperty(ExecConstants.IMPERSONATION_ENABLED, true)
.configProperty(ExecConstants.USER_AUTHENTICATOR_IMPL, UserAuthenticatorTestImpl.TYPE)
.configProperty(DrillProperties.USER, PROCESS_USER)
.configProperty(DrillProperties.PASSWORD, PROCESS_USER_PASSWORD)
.build();
ClientFixture admin = cluster.clientBuilder()
.property(DrillProperties.USER, PROCESS_USER)
.property(DrillProperties.PASSWORD, PROCESS_USER_PASSWORD)
.build();
admin.alterSystem(ExecConstants.ADMIN_USERS_KEY, ADMIN_USER + "," + PROCESS_USER);
admin.alterSystem(ExecConstants.ADMIN_USER_GROUPS_KEY, ADMIN_GROUP);
client = cluster.clientBuilder()
.property(DrillProperties.USER, ADMIN_USER)
.property(DrillProperties.PASSWORD, ADMIN_USER_PASSWORD)
.build();
storageAliasesRegistry = cluster.drillbit().getContext().getAliasRegistryProvider().getStorageAliasesRegistry();
tableAliasesRegistry = cluster.drillbit().getContext().getAliasRegistryProvider().getTableAliasesRegistry();
}
@Test
public void testCreateStoragePublicAlias() throws Exception {
try {
String sql = "CREATE PUBLIC ALIAS abc for storage dfs";
testBuilder()
.sqlQuery(sql)
.unOrdered()
.baselineColumns("ok", "summary")
.baselineValues(true, "Storage alias '`abc`' for '`dfs`' created successfully")
.go();
List<String> expectedAliases = Collections.singletonList("`abc`");
List<String> expectedValues = Collections.singletonList("`dfs`");
List<String> actualAliases = new ArrayList<>();
List<String> actualValues = new ArrayList<>();
storageAliasesRegistry.getPublicAliases().getAllAliases().forEachRemaining(entry -> {
actualAliases.add(entry.getKey());
actualValues.add(entry.getValue());
});
assertEquals(expectedAliases, actualAliases);
assertEquals(expectedValues, actualValues);
} finally {
storageAliasesRegistry.deletePublicAliases();
}
}
@Test
public void testCreateTablePublicAlias() throws Exception {
try {
String sql = "CREATE PUBLIC ALIAS tpch_lineitem for table cp.`tpch/lineitem.parquet`";
testBuilder()
.sqlQuery(sql)
.unOrdered()
.baselineColumns("ok", "summary")
.baselineValues(true, "Table alias '`tpch_lineitem`' for '`cp`.`default`.`tpch/lineitem.parquet`' created successfully")
.go();
List<String> expectedAliases = Collections.singletonList("`tpch_lineitem`");
List<String> expectedValues = Collections.singletonList("`cp`.`default`.`tpch/lineitem.parquet`");
List<String> actualAliases = new ArrayList<>();
List<String> actualValues = new ArrayList<>();
tableAliasesRegistry.getPublicAliases().getAllAliases().forEachRemaining(entry -> {
actualAliases.add(entry.getKey());
actualValues.add(entry.getValue());
});
assertEquals(expectedAliases, actualAliases);
assertEquals(expectedValues, actualValues);
} finally {
tableAliasesRegistry.deletePublicAliases();
}
}
@Test
public void testCreateDuplicatedStoragePublicAlias() throws Exception {
try {
String sql = "CREATE PUBLIC ALIAS abc for storage dfs";
testBuilder()
.sqlQuery(sql)
.unOrdered()
.baselineColumns("ok", "summary")
.baselineValues(true, "Storage alias '`abc`' for '`dfs`' created successfully")
.go();
queryBuilder().sql(sql).run();
fail();
} catch (UserRemoteException e) {
MatcherAssert.assertThat(e.getVerboseMessage(), containsString("VALIDATION ERROR: Alias with given name [`abc`] already exists"));
} finally {
storageAliasesRegistry.deletePublicAliases();
}
}
@Test
public void testCreateOrReplaceStoragePublicAlias() throws Exception {
try {
String sql = "CREATE OR REPLACE PUBLIC ALIAS abc for storage dfs";
testBuilder()
.sqlQuery(sql)
.unOrdered()
.baselineColumns("ok", "summary")
.baselineValues(true, "Storage alias '`abc`' for '`dfs`' created successfully")
.go();
testBuilder()
.sqlQuery(sql)
.unOrdered()
.baselineColumns("ok", "summary")
.baselineValues(true, "Storage alias '`abc`' for '`dfs`' created successfully")
.go();
List<String> expectedAliases = Collections.singletonList("`abc`");
List<String> expectedValues = Collections.singletonList("`dfs`");
List<String> actualAliases = new ArrayList<>();
List<String> actualValues = new ArrayList<>();
storageAliasesRegistry.getPublicAliases().getAllAliases().forEachRemaining(entry -> {
actualAliases.add(entry.getKey());
actualValues.add(entry.getValue());
});
assertEquals(expectedAliases, actualAliases);
assertEquals(expectedValues, actualValues);
} finally {
storageAliasesRegistry.deletePublicAliases();
}
}
@Test
public void testCreateAliasWithDisabledSupport() throws Exception {
try {
client.alterSystem(ExecConstants.ENABLE_ALIASES, false);
String sql = "CREATE OR REPLACE PUBLIC ALIAS abc for storage dfs";
queryBuilder().sql(sql).run();
fail();
} catch (UserRemoteException e) {
MatcherAssert.assertThat(e.getVerboseMessage(), containsString("Aliases support is disabled."));
} finally {
storageAliasesRegistry.deletePublicAliases();
client.resetSystem(ExecConstants.ENABLE_ALIASES);
}
}
@Test
public void testCreatePublicAliasWithNonAdminUser() throws Exception {
try {
ClientFixture client = cluster.clientBuilder()
.property(DrillProperties.USER, TEST_USER_2)
.property(DrillProperties.PASSWORD, TEST_USER_2_PASSWORD)
.build();
String sql = "CREATE OR REPLACE PUBLIC ALIAS abc for storage dfs";
client.queryBuilder().sql(sql).run();
fail();
} catch (UserRemoteException e) {
MatcherAssert.assertThat(e.getVerboseMessage(),
containsString("PERMISSION ERROR: Not authorized to perform operations on public aliases"));
} finally {
storageAliasesRegistry.deletePublicAliases();
}
}
@Test
public void testCreateUserStorageAliasWithPublic() throws Exception {
try {
String sql = "CREATE PUBLIC ALIAS abc for storage dfs AS USER 'user1'";
queryBuilder().sql(sql).run();
fail();
} catch (UserRemoteException e) {
MatcherAssert.assertThat(e.getVerboseMessage(), containsString("VALIDATION ERROR: Cannot create public alias for specific user"));
} finally {
storageAliasesRegistry.deletePublicAliases();
}
}
@Test
public void testCreatePublicAliasForNonExistingStorage() throws Exception {
try {
String sql = "CREATE PUBLIC ALIAS abc for storage non_existing_storage";
queryBuilder().sql(sql).run();
fail();
} catch (UserRemoteException e) {
MatcherAssert.assertThat(e.getVerboseMessage(),
containsString("VALIDATION ERROR: Schema [non_existing_storage] is not valid " +
"with respect to either root schema or current default schema"));
} finally {
storageAliasesRegistry.deletePublicAliases();
}
}
@Test
public void testCreatePublicAliasForNonExistingTable() throws Exception {
try {
String sql = "CREATE PUBLIC ALIAS abc FOR TABLE cp.`tpch/non_existing_table.parquet`";
queryBuilder().sql(sql).run();
fail();
} catch (UserRemoteException e) {
MatcherAssert.assertThat(e.getVerboseMessage(),
containsString("VALIDATION ERROR: No table with given name " +
"[tpch/non_existing_table.parquet] exists in schema [cp.default]"));
} finally {
storageAliasesRegistry.deletePublicAliases();
}
}
@Test
public void testDropStoragePublicAlias() throws Exception {
try {
storageAliasesRegistry.createPublicAliases();
storageAliasesRegistry.getPublicAliases().put("`abc`", "`cp`", true);
String sql = "DROP PUBLIC ALIAS abc FOR STORAGE";
testBuilder()
.sqlQuery(sql)
.unOrdered()
.baselineColumns("ok", "summary")
.baselineValues(true, "Storage alias '`abc`' dropped successfully")
.go();
storageAliasesRegistry.getPublicAliases().getAllAliases().forEachRemaining(entry -> fail());
} finally {
storageAliasesRegistry.deletePublicAliases();
}
}
@Test
public void testDropTablePublicAlias() throws Exception {
try {
tableAliasesRegistry.createPublicAliases();
tableAliasesRegistry.getPublicAliases().put("`tpch_lineitem`", "`cp`.`default`.`tpch/lineitem.parquet`", true);
String sql = "DROP PUBLIC ALIAS tpch_lineitem FOR TABLE";
testBuilder()
.sqlQuery(sql)
.unOrdered()
.baselineColumns("ok", "summary")
.baselineValues(true, "Table alias '`tpch_lineitem`' dropped successfully")
.go();
tableAliasesRegistry.getPublicAliases().getAllAliases().forEachRemaining(entry -> fail());
} finally {
tableAliasesRegistry.deletePublicAliases();
}
}
@Test
public void testDropStoragePublicAliasIfExists() throws Exception {
try {
storageAliasesRegistry.createPublicAliases();
storageAliasesRegistry.getPublicAliases().put("`abc`", "`cp`", true);
String sql = "DROP PUBLIC ALIAS IF EXISTS abc FOR STORAGE";
testBuilder()
.sqlQuery(sql)
.unOrdered()
.baselineColumns("ok", "summary")
.baselineValues(true, "Storage alias '`abc`' dropped successfully")
.go();
storageAliasesRegistry.getPublicAliases().getAllAliases().forEachRemaining(entry -> fail());
} finally {
storageAliasesRegistry.deletePublicAliases();
}
}
@Test
public void testDropAbsentStoragePublicAlias() throws Exception {
try {
String sql = "DROP PUBLIC ALIAS abc FOR STORAGE";
queryBuilder().sql(sql).run();
fail();
} catch (UserRemoteException e) {
MatcherAssert.assertThat(e.getVerboseMessage(),
containsString("VALIDATION ERROR: No alias found with given name [`abc`]"));
}
}
@Test
public void testDropAbsentStoragePublicAliasIfExists() throws Exception {
String sql = "DROP PUBLIC ALIAS IF EXISTS abc FOR STORAGE";
testBuilder()
.sqlQuery(sql)
.unOrdered()
.baselineColumns("ok", "summary")
.baselineValues(false, "No storage alias found with given name [`abc`]")
.go();
storageAliasesRegistry.getPublicAliases().getAllAliases().forEachRemaining(entry -> fail());
}
@Test
public void testDropUserStorageAliasWithPublic() throws Exception {
try {
String sql = "DROP PUBLIC ALIAS IF EXISTS abc FOR STORAGE AS USER 'user1'";
queryBuilder().sql(sql).run();
fail();
} catch (UserRemoteException e) {
MatcherAssert.assertThat(e.getVerboseMessage(), containsString("VALIDATION ERROR: Cannot drop public alias for specific user"));
} finally {
storageAliasesRegistry.deletePublicAliases();
}
}
@Test
public void testDropAliasWithDisabledSupport() throws Exception {
try {
client.alterSystem(ExecConstants.ENABLE_ALIASES, false);
String sql = "DROP PUBLIC ALIAS abc for storage";
queryBuilder().sql(sql).run();
fail();
} catch (UserRemoteException e) {
MatcherAssert.assertThat(e.getVerboseMessage(), containsString("Aliases support is disabled."));
} finally {
storageAliasesRegistry.deletePublicAliases();
client.resetSystem(ExecConstants.ENABLE_ALIASES);
}
}
@Test
public void testDropPublicAliasWithNonAdminUser() throws Exception {
try {
ClientFixture client = cluster.clientBuilder()
.property(DrillProperties.USER, TEST_USER_2)
.property(DrillProperties.PASSWORD, TEST_USER_2_PASSWORD)
.build();
String sql = "DROP PUBLIC ALIAS abc for storage";
client.queryBuilder().sql(sql).run();
fail();
} catch (UserRemoteException e) {
MatcherAssert.assertThat(e.getVerboseMessage(),
containsString("PERMISSION ERROR: Not authorized to perform operations on public aliases."));
} finally {
storageAliasesRegistry.deletePublicAliases();
}
}
@Test
public void testDropAllStoragePublicAliases() throws Exception {
try {
storageAliasesRegistry.createPublicAliases();
storageAliasesRegistry.getPublicAliases().put("`abc`", "`cp`", true);
String sql = "DROP ALL PUBLIC ALIASES FOR STORAGE";
testBuilder()
.sqlQuery(sql)
.unOrdered()
.baselineColumns("ok", "summary")
.baselineValues(true, "Storage aliases dropped successfully")
.go();
storageAliasesRegistry.getPublicAliases().getAllAliases().forEachRemaining(entry -> fail());
} finally {
storageAliasesRegistry.deletePublicAliases();
}
}
@Test
public void testDropAllTablePublicAliases() throws Exception {
try {
tableAliasesRegistry.createPublicAliases();
tableAliasesRegistry.getPublicAliases().put("`tpch_lineitem`", "`cp`.`default`.`tpch/lineitem.parquet`", true);
String sql = "DROP ALL PUBLIC ALIASES FOR TABLE";
testBuilder()
.sqlQuery(sql)
.unOrdered()
.baselineColumns("ok", "summary")
.baselineValues(true, "Table aliases dropped successfully")
.go();
tableAliasesRegistry.getPublicAliases().getAllAliases().forEachRemaining(entry -> fail());
} finally {
tableAliasesRegistry.deletePublicAliases();
}
}
@Test
public void testDropAllUserStorageAliasWithPublic() throws Exception {
try {
String sql = "DROP ALL PUBLIC ALIASES FOR STORAGE AS USER 'user1'";
queryBuilder().sql(sql).run();
fail();
} catch (UserRemoteException e) {
MatcherAssert.assertThat(e.getVerboseMessage(), containsString("VALIDATION ERROR: Cannot drop public aliases for specific user"));
} finally {
storageAliasesRegistry.deletePublicAliases();
}
}
@Test
public void testDropAllAliasesWithDisabledSupport() throws Exception {
try {
client.alterSystem(ExecConstants.ENABLE_ALIASES, false);
String sql = "DROP ALL PUBLIC ALIASES for storage";
queryBuilder().sql(sql).run();
fail();
} catch (UserRemoteException e) {
MatcherAssert.assertThat(e.getVerboseMessage(), containsString("Aliases support is disabled."));
} finally {
storageAliasesRegistry.deletePublicAliases();
client.resetSystem(ExecConstants.ENABLE_ALIASES);
}
}
@Test
public void testDropAllPublicAliasesWithNonAdminUser() throws Exception {
try {
ClientFixture client = cluster.clientBuilder()
.property(DrillProperties.USER, TEST_USER_2)
.property(DrillProperties.PASSWORD, TEST_USER_2_PASSWORD)
.build();
String sql = "DROP ALL PUBLIC ALIASES for storage";
client.queryBuilder().sql(sql).run();
fail();
} catch (UserRemoteException e) {
MatcherAssert.assertThat(e.getVerboseMessage(),
containsString("PERMISSION ERROR: Not authorized to perform operations on public aliases."));
} finally {
storageAliasesRegistry.deleteUserAliases(TEST_USER_2);
}
}
@Test
public void testCreateStorageUserAlias() throws Exception {
try {
ClientFixture client = cluster.clientBuilder()
.property(DrillProperties.USER, TEST_USER_2)
.property(DrillProperties.PASSWORD, TEST_USER_2_PASSWORD)
.build();
String sql = "CREATE ALIAS abc for storage dfs";
client.testBuilder()
.sqlQuery(sql)
.unOrdered()
.baselineColumns("ok", "summary")
.baselineValues(true, "Storage alias '`abc`' for '`dfs`' created successfully")
.go();
List<String> expectedAliases = Collections.singletonList("`abc`");
List<String> expectedValues = Collections.singletonList("`dfs`");
List<String> actualAliases = new ArrayList<>();
List<String> actualValues = new ArrayList<>();
storageAliasesRegistry.getUserAliases(TEST_USER_2).getAllAliases().forEachRemaining(entry -> {
actualAliases.add(entry.getKey());
actualValues.add(entry.getValue());
});
assertEquals(expectedAliases, actualAliases);
assertEquals(expectedValues, actualValues);
} finally {
storageAliasesRegistry.deleteUserAliases(TEST_USER_2);
}
}
@Test
public void testCreateTableUserAlias() throws Exception {
try {
ClientFixture client = cluster.clientBuilder()
.property(DrillProperties.USER, TEST_USER_2)
.property(DrillProperties.PASSWORD, TEST_USER_2_PASSWORD)
.build();
String sql = "CREATE ALIAS tpch_lineitem for table cp.`tpch/lineitem.parquet`";
client.testBuilder()
.sqlQuery(sql)
.unOrdered()
.baselineColumns("ok", "summary")
.baselineValues(true, "Table alias '`tpch_lineitem`' for '`cp`.`default`.`tpch/lineitem.parquet`' created successfully")
.go();
List<String> expectedAliases = Collections.singletonList("`tpch_lineitem`");
List<String> expectedValues = Collections.singletonList("`cp`.`default`.`tpch/lineitem.parquet`");
List<String> actualAliases = new ArrayList<>();
List<String> actualValues = new ArrayList<>();
tableAliasesRegistry.getUserAliases(TEST_USER_2).getAllAliases().forEachRemaining(entry -> {
actualAliases.add(entry.getKey());
actualValues.add(entry.getValue());
});
assertEquals(expectedAliases, actualAliases);
assertEquals(expectedValues, actualValues);
} finally {
tableAliasesRegistry.deleteUserAliases(TEST_USER_2);
}
}
@Test
public void testDropStorageUserAlias() throws Exception {
try {
ClientFixture client = cluster.clientBuilder()
.property(DrillProperties.USER, TEST_USER_2)
.property(DrillProperties.PASSWORD, TEST_USER_2_PASSWORD)
.build();
storageAliasesRegistry.createUserAliases(TEST_USER_2);
storageAliasesRegistry.getUserAliases(TEST_USER_2).put("`abc`", "`cp`", true);
String sql = "DROP ALIAS abc FOR STORAGE";
client.testBuilder()
.sqlQuery(sql)
.unOrdered()
.baselineColumns("ok", "summary")
.baselineValues(true, "Storage alias '`abc`' dropped successfully")
.go();
storageAliasesRegistry.getUserAliases(TEST_USER_2).getAllAliases().forEachRemaining(entry -> fail());
} finally {
storageAliasesRegistry.deleteUserAliases(TEST_USER_2);
}
}
@Test
public void testDropAllTableUserAliases() throws Exception {
try {
ClientFixture client = cluster.clientBuilder()
.property(DrillProperties.USER, TEST_USER_2)
.property(DrillProperties.PASSWORD, TEST_USER_2_PASSWORD)
.build();
tableAliasesRegistry.createUserAliases(TEST_USER_2);
tableAliasesRegistry.getUserAliases(TEST_USER_2).put("`tpch_lineitem`", "`cp`.`default`.`tpch/lineitem.parquet`", true);
String sql = "DROP ALL ALIASES FOR TABLE";
client.testBuilder()
.sqlQuery(sql)
.unOrdered()
.baselineColumns("ok", "summary")
.baselineValues(true, "Table aliases dropped successfully")
.go();
tableAliasesRegistry.getUserAliases(TEST_USER_2).getAllAliases().forEachRemaining(entry -> fail());
} finally {
tableAliasesRegistry.deleteUserAliases(TEST_USER_2);
}
}
@Test
public void testCreateTableAliasAsTheSameUser() throws Exception {
try {
ClientFixture client = cluster.clientBuilder()
.property(DrillProperties.USER, TEST_USER_2)
.property(DrillProperties.PASSWORD, TEST_USER_2_PASSWORD)
.build();
String sql = "CREATE ALIAS tpch_lineitem for table cp.`tpch/lineitem.parquet` AS USER '%s'";
client.testBuilder()
.sqlQuery(sql, TEST_USER_2)
.unOrdered()
.baselineColumns("ok", "summary")
.baselineValues(true, "Table alias '`tpch_lineitem`' for '`cp`.`default`.`tpch/lineitem.parquet`' created successfully")
.go();
List<String> expectedAliases = Collections.singletonList("`tpch_lineitem`");
List<String> expectedValues = Collections.singletonList("`cp`.`default`.`tpch/lineitem.parquet`");
List<String> actualAliases = new ArrayList<>();
List<String> actualValues = new ArrayList<>();
tableAliasesRegistry.getUserAliases(TEST_USER_2).getAllAliases().forEachRemaining(entry -> {
actualAliases.add(entry.getKey());
actualValues.add(entry.getValue());
});
assertEquals(expectedAliases, actualAliases);
assertEquals(expectedValues, actualValues);
} finally {
tableAliasesRegistry.deleteUserAliases(TEST_USER_2);
}
}
@Test
public void testAdminCreateTableAliasAsAnotherUser() throws Exception {
try {
String sql = "CREATE ALIAS tpch_lineitem for table cp.`tpch/lineitem.parquet` AS USER '%s'";
testBuilder()
.sqlQuery(sql, TEST_USER_2)
.unOrdered()
.baselineColumns("ok", "summary")
.baselineValues(true, "Table alias '`tpch_lineitem`' for '`cp`.`default`.`tpch/lineitem.parquet`' created successfully")
.go();
List<String> expectedAliases = Collections.singletonList("`tpch_lineitem`");
List<String> expectedValues = Collections.singletonList("`cp`.`default`.`tpch/lineitem.parquet`");
List<String> actualAliases = new ArrayList<>();
List<String> actualValues = new ArrayList<>();
tableAliasesRegistry.getUserAliases(TEST_USER_2).getAllAliases().forEachRemaining(entry -> {
actualAliases.add(entry.getKey());
actualValues.add(entry.getValue());
});
assertEquals(expectedAliases, actualAliases);
assertEquals(expectedValues, actualValues);
} finally {
tableAliasesRegistry.deleteUserAliases(TEST_USER_2);
}
}
@Test
public void testNonAdminCreateTableAliasAsAnotherUser() throws Exception {
try {
ClientFixture client = cluster.clientBuilder()
.property(DrillProperties.USER, TEST_USER_2)
.property(DrillProperties.PASSWORD, TEST_USER_2_PASSWORD)
.build();
String sql = "CREATE ALIAS tpch_lineitem for table cp.`tpch/lineitem.parquet` AS USER '%s'";
client.queryBuilder().sql(sql, TEST_USER_1).run();
fail();
} catch (UserRemoteException e) {
MatcherAssert.assertThat(e.getVerboseMessage(),
containsString("PERMISSION ERROR: Not authorized to perform operations on aliases for other users."));
} finally {
storageAliasesRegistry.deleteUserAliases(TEST_USER_1);
}
}
}