Search in sources :

Example 1 with CatalogSchemaName

use of com.facebook.presto.common.CatalogSchemaName in project presto by prestodb.

the class RenameSchemaTask method execute.

@Override
public ListenableFuture<?> execute(RenameSchema statement, TransactionManager transactionManager, Metadata metadata, AccessControl accessControl, Session session, List<Expression> parameters, WarningCollector warningCollector) {
    CatalogSchemaName source = createCatalogSchemaName(session, statement, Optional.of(statement.getSource()));
    CatalogSchemaName target = new CatalogSchemaName(source.getCatalogName(), statement.getTarget().getValue());
    if (!metadata.schemaExists(session, source)) {
        throw new SemanticException(MISSING_SCHEMA, statement, "Schema '%s' does not exist", source);
    }
    if (metadata.schemaExists(session, target)) {
        throw new SemanticException(SCHEMA_ALREADY_EXISTS, statement, "Target schema '%s' already exists", target);
    }
    accessControl.checkCanRenameSchema(session.getRequiredTransactionId(), session.getIdentity(), session.getAccessControlContext(), source, statement.getTarget().getValue());
    metadata.renameSchema(session, source, statement.getTarget().getValue());
    return immediateFuture(null);
}
Also used : MetadataUtil.createCatalogSchemaName(com.facebook.presto.metadata.MetadataUtil.createCatalogSchemaName) CatalogSchemaName(com.facebook.presto.common.CatalogSchemaName) SemanticException(com.facebook.presto.sql.analyzer.SemanticException)

Example 2 with CatalogSchemaName

use of com.facebook.presto.common.CatalogSchemaName in project presto by prestodb.

the class CreateSchemaTask method execute.

@Override
public ListenableFuture<?> execute(CreateSchema statement, TransactionManager transactionManager, Metadata metadata, AccessControl accessControl, Session session, List<Expression> parameters, WarningCollector warningCollector) {
    CatalogSchemaName schema = createCatalogSchemaName(session, statement, Optional.of(statement.getSchemaName()));
    // TODO: validate that catalog exists
    accessControl.checkCanCreateSchema(session.getRequiredTransactionId(), session.getIdentity(), session.getAccessControlContext(), schema);
    if (metadata.schemaExists(session, schema)) {
        if (!statement.isNotExists()) {
            throw new SemanticException(SCHEMA_ALREADY_EXISTS, statement, "Schema '%s' already exists", schema);
        }
        return immediateFuture(null);
    }
    ConnectorId connectorId = metadata.getCatalogHandle(session, schema.getCatalogName()).orElseThrow(() -> new PrestoException(NOT_FOUND, "Catalog does not exist: " + schema.getCatalogName()));
    Map<String, Object> properties = metadata.getSchemaPropertyManager().getProperties(connectorId, schema.getCatalogName(), mapFromProperties(statement.getProperties()), session, metadata, parameters);
    metadata.createSchema(session, schema, properties);
    return immediateFuture(null);
}
Also used : MetadataUtil.createCatalogSchemaName(com.facebook.presto.metadata.MetadataUtil.createCatalogSchemaName) CatalogSchemaName(com.facebook.presto.common.CatalogSchemaName) PrestoException(com.facebook.presto.spi.PrestoException) SemanticException(com.facebook.presto.sql.analyzer.SemanticException) ConnectorId(com.facebook.presto.spi.ConnectorId)

Example 3 with CatalogSchemaName

use of com.facebook.presto.common.CatalogSchemaName in project presto by prestodb.

the class TestFileBasedSystemAccessControl method testSchemaRulesForCheckCanCreateSchema.

@Test
public void testSchemaRulesForCheckCanCreateSchema() {
    TransactionManager transactionManager = createTestTransactionManager();
    AccessControlManager accessControlManager = newAccessControlManager(transactionManager, "file-based-system-access-schema.json");
    transaction(transactionManager, accessControlManager).execute(transactionId -> {
        accessControlManager.checkCanCreateSchema(transactionId, bob, context, new CatalogSchemaName("alice-catalog", "bob"));
        accessControlManager.checkCanCreateSchema(transactionId, bob, context, new CatalogSchemaName("bob-catalog", "bob"));
        accessControlManager.checkCanCreateSchema(transactionId, admin, context, new CatalogSchemaName("some-catalog", "some-schema"));
        accessControlManager.checkCanCreateSchema(transactionId, admin, context, new CatalogSchemaName("some-catalog", "bob"));
        accessControlManager.checkCanCreateSchema(transactionId, admin, context, new CatalogSchemaName("some-catalog", "alice"));
    });
    assertThrows(AccessDeniedException.class, () -> transaction(transactionManager, accessControlManager).execute(transactionId -> {
        accessControlManager.checkCanCreateSchema(transactionId, bob, context, new CatalogSchemaName("alice-catalog", "alice"));
    }));
    assertThrows(AccessDeniedException.class, () -> transaction(transactionManager, accessControlManager).execute(transactionId -> {
        accessControlManager.checkCanCreateSchema(transactionId, bob, context, new CatalogSchemaName("bob-catalog", "alice"));
    }));
    assertThrows(AccessDeniedException.class, () -> transaction(transactionManager, accessControlManager).execute(transactionId -> {
        accessControlManager.checkCanCreateSchema(transactionId, bob, context, new CatalogSchemaName("secret-catalog", "secret"));
    }));
    assertThrows(AccessDeniedException.class, () -> transaction(transactionManager, accessControlManager).execute(transactionId -> {
        accessControlManager.checkCanCreateSchema(transactionId, alice, context, new CatalogSchemaName("secret-catalog", "secret"));
    }));
    assertThrows(AccessDeniedException.class, () -> transaction(transactionManager, accessControlManager).execute(transactionId -> {
        accessControlManager.checkCanCreateSchema(transactionId, admin, context, new CatalogSchemaName("secret-catalog", "secret"));
    }));
    assertThrows(AccessDeniedException.class, () -> transaction(transactionManager, accessControlManager).execute(transactionId -> {
        accessControlManager.checkCanCreateSchema(transactionId, alice, context, new CatalogSchemaName("alice-catalog", "alice"));
    }));
}
Also used : SystemAccessControl(com.facebook.presto.spi.security.SystemAccessControl) InterfaceTestUtils.assertAllMethodsOverridden(com.facebook.presto.spi.testing.InterfaceTestUtils.assertAllMethodsOverridden) PrestoPrincipal(com.facebook.presto.spi.security.PrestoPrincipal) Assert.assertEquals(org.testng.Assert.assertEquals) Test(org.testng.annotations.Test) SECURITY_CONFIG_FILE(com.facebook.presto.plugin.base.security.FileBasedAccessControlConfig.SECURITY_CONFIG_FILE) AccessDeniedException(com.facebook.presto.spi.security.AccessDeniedException) SchemaTableName(com.facebook.presto.spi.SchemaTableName) Assertions.assertThatThrownBy(org.assertj.core.api.Assertions.assertThatThrownBy) Assert.assertThrows(org.testng.Assert.assertThrows) Identity(com.facebook.presto.spi.security.Identity) TransactionBuilder.transaction(com.facebook.presto.transaction.TransactionBuilder.transaction) QualifiedObjectName(com.facebook.presto.common.QualifiedObjectName) Thread.sleep(java.lang.Thread.sleep) TransactionManager(com.facebook.presto.transaction.TransactionManager) Files.newTemporaryFile(org.assertj.core.util.Files.newTemporaryFile) SECURITY_REFRESH_PERIOD(com.facebook.presto.plugin.base.security.FileBasedAccessControlConfig.SECURITY_REFRESH_PERIOD) USER(com.facebook.presto.spi.security.PrincipalType.USER) SELECT(com.facebook.presto.spi.security.Privilege.SELECT) ImmutableSet(com.google.common.collect.ImmutableSet) ImmutableMap(com.google.common.collect.ImmutableMap) KerberosPrincipal(javax.security.auth.kerberos.KerberosPrincipal) InMemoryTransactionManager.createTestTransactionManager(com.facebook.presto.transaction.InMemoryTransactionManager.createTestTransactionManager) AccessControlContext(com.facebook.presto.spi.security.AccessControlContext) Set(java.util.Set) File(java.io.File) QueryId(com.facebook.presto.spi.QueryId) Files.copy(com.google.common.io.Files.copy) Optional(java.util.Optional) CatalogSchemaName(com.facebook.presto.common.CatalogSchemaName) TransactionManager(com.facebook.presto.transaction.TransactionManager) InMemoryTransactionManager.createTestTransactionManager(com.facebook.presto.transaction.InMemoryTransactionManager.createTestTransactionManager) CatalogSchemaName(com.facebook.presto.common.CatalogSchemaName) Test(org.testng.annotations.Test)

Example 4 with CatalogSchemaName

use of com.facebook.presto.common.CatalogSchemaName in project presto by prestodb.

the class TestFileBasedSystemAccessControl method testSchemaRulesForCheckCanDropSchema.

@Test
public void testSchemaRulesForCheckCanDropSchema() {
    TransactionManager transactionManager = createTestTransactionManager();
    AccessControlManager accessControlManager = newAccessControlManager(transactionManager, "file-based-system-access-schema.json");
    transaction(transactionManager, accessControlManager).execute(transactionId -> {
        accessControlManager.checkCanDropSchema(transactionId, bob, context, new CatalogSchemaName("alice-catalog", "bob"));
        accessControlManager.checkCanDropSchema(transactionId, bob, context, new CatalogSchemaName("bob-catalog", "bob"));
        accessControlManager.checkCanDropSchema(transactionId, admin, context, new CatalogSchemaName("some-catalog", "bob"));
        accessControlManager.checkCanDropSchema(transactionId, admin, context, new CatalogSchemaName("some-catalog", "alice"));
        accessControlManager.checkCanDropSchema(transactionId, admin, context, new CatalogSchemaName("some-catalog", "some-schema"));
    });
    assertThrows(AccessDeniedException.class, () -> transaction(transactionManager, accessControlManager).execute(transactionId -> {
        accessControlManager.checkCanDropSchema(transactionId, bob, context, new CatalogSchemaName("alice-catalog", "alice"));
    }));
    assertThrows(AccessDeniedException.class, () -> transaction(transactionManager, accessControlManager).execute(transactionId -> {
        accessControlManager.checkCanDropSchema(transactionId, bob, context, new CatalogSchemaName("bob-catalog", "alice"));
    }));
    assertThrows(AccessDeniedException.class, () -> transaction(transactionManager, accessControlManager).execute(transactionId -> {
        accessControlManager.checkCanDropSchema(transactionId, bob, context, new CatalogSchemaName("secret-catalog", "secret"));
    }));
    assertThrows(AccessDeniedException.class, () -> transaction(transactionManager, accessControlManager).execute(transactionId -> {
        accessControlManager.checkCanDropSchema(transactionId, alice, context, new CatalogSchemaName("secret-catalog", "secret"));
    }));
    assertThrows(AccessDeniedException.class, () -> transaction(transactionManager, accessControlManager).execute(transactionId -> {
        accessControlManager.checkCanDropSchema(transactionId, admin, context, new CatalogSchemaName("secret-catalog", "secret"));
    }));
    assertThrows(AccessDeniedException.class, () -> transaction(transactionManager, accessControlManager).execute(transactionId -> {
        accessControlManager.checkCanDropSchema(transactionId, alice, context, new CatalogSchemaName("alice-catalog", "alice"));
    }));
}
Also used : SystemAccessControl(com.facebook.presto.spi.security.SystemAccessControl) InterfaceTestUtils.assertAllMethodsOverridden(com.facebook.presto.spi.testing.InterfaceTestUtils.assertAllMethodsOverridden) PrestoPrincipal(com.facebook.presto.spi.security.PrestoPrincipal) Assert.assertEquals(org.testng.Assert.assertEquals) Test(org.testng.annotations.Test) SECURITY_CONFIG_FILE(com.facebook.presto.plugin.base.security.FileBasedAccessControlConfig.SECURITY_CONFIG_FILE) AccessDeniedException(com.facebook.presto.spi.security.AccessDeniedException) SchemaTableName(com.facebook.presto.spi.SchemaTableName) Assertions.assertThatThrownBy(org.assertj.core.api.Assertions.assertThatThrownBy) Assert.assertThrows(org.testng.Assert.assertThrows) Identity(com.facebook.presto.spi.security.Identity) TransactionBuilder.transaction(com.facebook.presto.transaction.TransactionBuilder.transaction) QualifiedObjectName(com.facebook.presto.common.QualifiedObjectName) Thread.sleep(java.lang.Thread.sleep) TransactionManager(com.facebook.presto.transaction.TransactionManager) Files.newTemporaryFile(org.assertj.core.util.Files.newTemporaryFile) SECURITY_REFRESH_PERIOD(com.facebook.presto.plugin.base.security.FileBasedAccessControlConfig.SECURITY_REFRESH_PERIOD) USER(com.facebook.presto.spi.security.PrincipalType.USER) SELECT(com.facebook.presto.spi.security.Privilege.SELECT) ImmutableSet(com.google.common.collect.ImmutableSet) ImmutableMap(com.google.common.collect.ImmutableMap) KerberosPrincipal(javax.security.auth.kerberos.KerberosPrincipal) InMemoryTransactionManager.createTestTransactionManager(com.facebook.presto.transaction.InMemoryTransactionManager.createTestTransactionManager) AccessControlContext(com.facebook.presto.spi.security.AccessControlContext) Set(java.util.Set) File(java.io.File) QueryId(com.facebook.presto.spi.QueryId) Files.copy(com.google.common.io.Files.copy) Optional(java.util.Optional) CatalogSchemaName(com.facebook.presto.common.CatalogSchemaName) TransactionManager(com.facebook.presto.transaction.TransactionManager) InMemoryTransactionManager.createTestTransactionManager(com.facebook.presto.transaction.InMemoryTransactionManager.createTestTransactionManager) CatalogSchemaName(com.facebook.presto.common.CatalogSchemaName) Test(org.testng.annotations.Test)

Example 5 with CatalogSchemaName

use of com.facebook.presto.common.CatalogSchemaName in project presto by prestodb.

the class DropSchemaTask method execute.

@Override
public ListenableFuture<?> execute(DropSchema statement, TransactionManager transactionManager, Metadata metadata, AccessControl accessControl, Session session, List<Expression> parameters, WarningCollector warningCollector) {
    if (statement.isCascade()) {
        throw new PrestoException(NOT_SUPPORTED, "CASCADE is not yet supported for DROP SCHEMA");
    }
    CatalogSchemaName schema = createCatalogSchemaName(session, statement, Optional.of(statement.getSchemaName()));
    if (!metadata.schemaExists(session, schema)) {
        if (!statement.isExists()) {
            throw new SemanticException(MISSING_SCHEMA, statement, "Schema '%s' does not exist", schema);
        }
        return immediateFuture(null);
    }
    accessControl.checkCanDropSchema(session.getRequiredTransactionId(), session.getIdentity(), session.getAccessControlContext(), schema);
    metadata.dropSchema(session, schema);
    return immediateFuture(null);
}
Also used : MetadataUtil.createCatalogSchemaName(com.facebook.presto.metadata.MetadataUtil.createCatalogSchemaName) CatalogSchemaName(com.facebook.presto.common.CatalogSchemaName) PrestoException(com.facebook.presto.spi.PrestoException) SemanticException(com.facebook.presto.sql.analyzer.SemanticException)

Aggregations

CatalogSchemaName (com.facebook.presto.common.CatalogSchemaName)7 QualifiedObjectName (com.facebook.presto.common.QualifiedObjectName)4 QueryId (com.facebook.presto.spi.QueryId)4 SchemaTableName (com.facebook.presto.spi.SchemaTableName)4 AccessControlContext (com.facebook.presto.spi.security.AccessControlContext)4 AccessDeniedException (com.facebook.presto.spi.security.AccessDeniedException)4 Identity (com.facebook.presto.spi.security.Identity)4 InMemoryTransactionManager.createTestTransactionManager (com.facebook.presto.transaction.InMemoryTransactionManager.createTestTransactionManager)4 TransactionManager (com.facebook.presto.transaction.TransactionManager)4 Test (org.testng.annotations.Test)4 MetadataUtil.createCatalogSchemaName (com.facebook.presto.metadata.MetadataUtil.createCatalogSchemaName)3 SECURITY_CONFIG_FILE (com.facebook.presto.plugin.base.security.FileBasedAccessControlConfig.SECURITY_CONFIG_FILE)3 SECURITY_REFRESH_PERIOD (com.facebook.presto.plugin.base.security.FileBasedAccessControlConfig.SECURITY_REFRESH_PERIOD)3 PrestoPrincipal (com.facebook.presto.spi.security.PrestoPrincipal)3 USER (com.facebook.presto.spi.security.PrincipalType.USER)3 SELECT (com.facebook.presto.spi.security.Privilege.SELECT)3 SystemAccessControl (com.facebook.presto.spi.security.SystemAccessControl)3 InterfaceTestUtils.assertAllMethodsOverridden (com.facebook.presto.spi.testing.InterfaceTestUtils.assertAllMethodsOverridden)3 SemanticException (com.facebook.presto.sql.analyzer.SemanticException)3 TransactionBuilder.transaction (com.facebook.presto.transaction.TransactionBuilder.transaction)3