This is an automated email from the ASF dual-hosted git repository.

cgivre pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/drill.git


The following commit(s) were added to refs/heads/master by this push:
     new c688b1f241 DRILL-8223: Refactor auth modes dropping DRILL_PROCESS and 
allowing credential providers everywhere (#2547)
c688b1f241 is described below

commit c688b1f241b5ac5bdd4f6a56ca3e1342bb2f76dd
Author: James Turton <[email protected]>
AuthorDate: Tue May 17 20:58:05 2022 +0200

    DRILL-8223: Refactor auth modes dropping DRILL_PROCESS and allowing 
credential providers everywhere (#2547)
    
    * Remove CredentialedStoragePluginConfig and drill_process auth mode.
    
    * Add a unit test of shared_user with no creds based on H2.
    
    * Fix compile errors.
---
 .../store/cassandra/CassandraStorageConfig.java    |   9 +-
 .../elasticsearch/ElasticsearchStorageConfig.java  |   9 +-
 .../exec/store/http/HttpStoragePluginConfig.java   |   4 +-
 .../http/TestUserTranslationInHttpPlugin.java      |   3 +-
 .../drill/exec/store/jdbc/JdbcStorageConfig.java   |   4 +-
 .../drill/exec/store/jdbc/JdbcStoragePlugin.java   |  20 ++-
 .../exec/store/jdbc/TestJdbcPluginWithH2IT.java    |  42 ++++-
 .../exec/store/mongo/MongoStoragePluginConfig.java |   4 +-
 .../store/phoenix/PhoenixStoragePluginConfig.java  |   9 +-
 .../exec/store/splunk/SplunkPluginConfig.java      |   4 +-
 .../exec/server/rest/CredentialResources.java      |  25 +--
 .../drill/exec/server/rest/OAuthRequests.java      | 174 +++++++++------------
 .../exec/server/rest/PluginConfigWrapper.java      |  26 +--
 .../drill/exec/store/dfs/FileSystemConfig.java     |   9 +-
 .../drill/exec/store/TestClassicLocator.java       |   2 -
 .../logical/CredentialedStoragePluginConfig.java   |  84 ----------
 .../drill/common/logical/StoragePluginConfig.java  |  99 +++++++++---
 17 files changed, 228 insertions(+), 299 deletions(-)

diff --git 
a/contrib/storage-cassandra/src/main/java/org/apache/drill/exec/store/cassandra/CassandraStorageConfig.java
 
b/contrib/storage-cassandra/src/main/java/org/apache/drill/exec/store/cassandra/CassandraStorageConfig.java
index d6a51cd9cc..ca1fc1c0cf 100644
--- 
a/contrib/storage-cassandra/src/main/java/org/apache/drill/exec/store/cassandra/CassandraStorageConfig.java
+++ 
b/contrib/storage-cassandra/src/main/java/org/apache/drill/exec/store/cassandra/CassandraStorageConfig.java
@@ -22,7 +22,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeName;
 
-import org.apache.drill.common.logical.CredentialedStoragePluginConfig;
+import org.apache.drill.common.logical.StoragePluginConfig;
 import org.apache.drill.exec.store.security.CredentialProviderUtils;
 import org.apache.drill.common.logical.security.CredentialsProvider;
 import org.apache.drill.exec.store.security.UsernamePasswordCredentials;
@@ -33,7 +33,7 @@ import java.util.Objects;
 import java.util.Optional;
 
 @JsonTypeName(CassandraStorageConfig.NAME)
-public class CassandraStorageConfig extends CredentialedStoragePluginConfig {
+public class CassandraStorageConfig extends StoragePluginConfig {
   public static final String NAME = "cassandra";
 
   private final String host;
@@ -110,9 +110,4 @@ public class CassandraStorageConfig extends 
CredentialedStoragePluginConfig {
   public int hashCode() {
     return Objects.hash(host, credentialsProvider);
   }
-
-  @Override
-  public CassandraStorageConfig updateCredentialProvider(CredentialsProvider 
credentialsProvider) {
-    return this;
-  }
 }
diff --git 
a/contrib/storage-elasticsearch/src/main/java/org/apache/drill/exec/store/elasticsearch/ElasticsearchStorageConfig.java
 
b/contrib/storage-elasticsearch/src/main/java/org/apache/drill/exec/store/elasticsearch/ElasticsearchStorageConfig.java
index c03f5255da..d0275ce2d0 100644
--- 
a/contrib/storage-elasticsearch/src/main/java/org/apache/drill/exec/store/elasticsearch/ElasticsearchStorageConfig.java
+++ 
b/contrib/storage-elasticsearch/src/main/java/org/apache/drill/exec/store/elasticsearch/ElasticsearchStorageConfig.java
@@ -24,7 +24,7 @@ import com.fasterxml.jackson.annotation.JsonTypeName;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.ObjectWriter;
-import org.apache.drill.common.logical.CredentialedStoragePluginConfig;
+import org.apache.drill.common.logical.StoragePluginConfig;
 import org.apache.drill.exec.store.security.CredentialProviderUtils;
 import org.apache.drill.common.logical.security.CredentialsProvider;
 import org.apache.drill.exec.store.security.UsernamePasswordCredentials;
@@ -36,7 +36,7 @@ import java.util.Objects;
 import java.util.Optional;
 
 @JsonTypeName(ElasticsearchStorageConfig.NAME)
-public class ElasticsearchStorageConfig extends 
CredentialedStoragePluginConfig {
+public class ElasticsearchStorageConfig extends StoragePluginConfig {
   public static final String NAME = "elastic";
 
   private static final ObjectWriter OBJECT_WRITER = new 
ObjectMapper().writerFor(List.class);
@@ -109,9 +109,4 @@ public class ElasticsearchStorageConfig extends 
CredentialedStoragePluginConfig
   public int hashCode() {
     return Objects.hash(hosts, credentialsProvider);
   }
-
-  @Override
-  public CredentialedStoragePluginConfig 
updateCredentialProvider(CredentialsProvider credentialsProvider) {
-    return this;
-  }
 }
diff --git 
a/contrib/storage-http/src/main/java/org/apache/drill/exec/store/http/HttpStoragePluginConfig.java
 
b/contrib/storage-http/src/main/java/org/apache/drill/exec/store/http/HttpStoragePluginConfig.java
index 75cb1937e1..c19b5b2821 100644
--- 
a/contrib/storage-http/src/main/java/org/apache/drill/exec/store/http/HttpStoragePluginConfig.java
+++ 
b/contrib/storage-http/src/main/java/org/apache/drill/exec/store/http/HttpStoragePluginConfig.java
@@ -21,7 +21,7 @@ import org.apache.drill.common.PlanStringBuilder;
 import org.apache.drill.common.exceptions.UserException;
 import org.apache.drill.common.logical.OAuthConfig;
 import org.apache.drill.common.map.CaseInsensitiveMap;
-import org.apache.drill.common.logical.CredentialedStoragePluginConfig;
+import org.apache.drill.common.logical.StoragePluginConfig;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnore;
@@ -42,7 +42,7 @@ import java.util.concurrent.TimeUnit;
 
 
 @JsonTypeName(HttpStoragePluginConfig.NAME)
-public class HttpStoragePluginConfig extends CredentialedStoragePluginConfig {
+public class HttpStoragePluginConfig extends StoragePluginConfig {
   private static final Logger logger = 
LoggerFactory.getLogger(HttpStoragePluginConfig.class);
   public static final String NAME = "http";
 
diff --git 
a/contrib/storage-http/src/test/java/org/apache/drill/exec/store/http/TestUserTranslationInHttpPlugin.java
 
b/contrib/storage-http/src/test/java/org/apache/drill/exec/store/http/TestUserTranslationInHttpPlugin.java
index 3b9af438a9..f4d20018d3 100644
--- 
a/contrib/storage-http/src/test/java/org/apache/drill/exec/store/http/TestUserTranslationInHttpPlugin.java
+++ 
b/contrib/storage-http/src/test/java/org/apache/drill/exec/store/http/TestUserTranslationInHttpPlugin.java
@@ -30,7 +30,6 @@ import org.apache.commons.io.FileUtils;
 import org.apache.commons.net.util.Base64;
 import org.apache.drill.common.config.DrillProperties;
 import org.apache.drill.common.exceptions.UserException;
-import org.apache.drill.common.logical.CredentialedStoragePluginConfig;
 import org.apache.drill.common.logical.OAuthConfig;
 import org.apache.drill.common.logical.StoragePluginConfig.AuthMode;
 import org.apache.drill.common.logical.security.CredentialsProvider;
@@ -172,7 +171,7 @@ public class TestUserTranslationInHttpPlugin extends 
ClusterTest {
     // First verify that the user has no credentials
     StoragePluginRegistry registry = cluster.storageRegistry();
     StoragePlugin plugin = registry.getPlugin("local");
-    PlainCredentialsProvider credentialsProvider = (PlainCredentialsProvider) 
((CredentialedStoragePluginConfig) plugin.getConfig()).getCredentialsProvider();
+    PlainCredentialsProvider credentialsProvider = (PlainCredentialsProvider) 
plugin.getConfig().getCredentialsProvider();
     Map<String, String> credentials = 
credentialsProvider.getCredentials(TEST_USER_1);
     assertNotNull(credentials);
     assertNull(credentials.get("username"));
diff --git 
a/contrib/storage-jdbc/src/main/java/org/apache/drill/exec/store/jdbc/JdbcStorageConfig.java
 
b/contrib/storage-jdbc/src/main/java/org/apache/drill/exec/store/jdbc/JdbcStorageConfig.java
index 0de6912b87..fb6a37b5ae 100644
--- 
a/contrib/storage-jdbc/src/main/java/org/apache/drill/exec/store/jdbc/JdbcStorageConfig.java
+++ 
b/contrib/storage-jdbc/src/main/java/org/apache/drill/exec/store/jdbc/JdbcStorageConfig.java
@@ -30,9 +30,9 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeName;
 import org.apache.drill.common.PlanStringBuilder;
 import org.apache.drill.common.exceptions.UserException;
-import org.apache.drill.common.logical.CredentialedStoragePluginConfig;
 import org.apache.drill.exec.proto.UserBitShared.UserCredentials;
 import org.apache.drill.exec.store.security.CredentialProviderUtils;
+import org.apache.drill.common.logical.StoragePluginConfig;
 import org.apache.drill.common.logical.security.CredentialsProvider;
 import org.apache.drill.exec.store.security.UsernamePasswordCredentials;
 import org.apache.drill.shaded.guava.com.google.common.base.Preconditions;
@@ -41,7 +41,7 @@ import org.slf4j.LoggerFactory;
 
 @JsonTypeName(JdbcStorageConfig.NAME)
 @JsonFilter("passwordFilter")
-public class JdbcStorageConfig extends CredentialedStoragePluginConfig {
+public class JdbcStorageConfig extends StoragePluginConfig {
 
   private static final Logger logger = 
LoggerFactory.getLogger(JdbcStorageConfig.class);
 
diff --git 
a/contrib/storage-jdbc/src/main/java/org/apache/drill/exec/store/jdbc/JdbcStoragePlugin.java
 
b/contrib/storage-jdbc/src/main/java/org/apache/drill/exec/store/jdbc/JdbcStoragePlugin.java
index 6caf9dd7ae..64d89ecb79 100644
--- 
a/contrib/storage-jdbc/src/main/java/org/apache/drill/exec/store/jdbc/JdbcStoragePlugin.java
+++ 
b/contrib/storage-jdbc/src/main/java/org/apache/drill/exec/store/jdbc/JdbcStoragePlugin.java
@@ -33,12 +33,14 @@ import org.apache.calcite.sql.SqlDialect;
 import org.apache.calcite.sql.SqlDialectFactoryImpl;
 import org.apache.drill.common.AutoCloseables;
 import org.apache.drill.common.exceptions.UserException;
+import org.apache.drill.common.logical.StoragePluginConfig.AuthMode;
 import org.apache.drill.exec.ops.OptimizerRulesContext;
 import org.apache.drill.exec.proto.UserBitShared.UserCredentials;
 import org.apache.drill.exec.server.DrillbitContext;
 import org.apache.drill.exec.store.AbstractStoragePlugin;
 import org.apache.drill.exec.store.SchemaConfig;
 import org.apache.drill.exec.store.security.UsernamePasswordCredentials;
+import org.apache.drill.exec.util.ImpersonationUtil;
 import 
org.apache.drill.shaded.guava.com.google.common.annotations.VisibleForTesting;
 import org.apache.drill.shaded.guava.com.google.common.collect.ImmutableSet;
 import org.slf4j.Logger;
@@ -83,19 +85,25 @@ public class JdbcStoragePlugin extends 
AbstractStoragePlugin {
   public Optional<DataSource> getDataSource(UserCredentials userCredentials) {
     Optional<UsernamePasswordCredentials> jdbcCreds = 
jdbcStorageConfig.getUsernamePasswordCredentials(userCredentials);
 
-    if (!jdbcCreds.isPresent()) {
-      logger.debug(
-        "There are no {} mode credentials in {} for query user {}",
-        jdbcStorageConfig.getAuthMode(),
+    if (!jdbcCreds.isPresent() && jdbcStorageConfig.getAuthMode() == 
AuthMode.USER_TRANSLATION) {
+      logger.info(
+        "There are no {} mode credentials in {} for query user {}, will not 
attempt to connect.",
+        AuthMode.USER_TRANSLATION,
         getName(),
         userCredentials.getUserName()
       );
       return Optional.<DataSource>empty();
     }
 
+    // Missing creds is valid under SHARED_USER (e.g. unsecured DBs, 
BigQuery's OAuth)
+    // and we fall back to using a key of Drillbit process username in this 
instance.
+    String dsKey = jdbcCreds.isPresent()
+      ? jdbcCreds.get().getUsername()
+      : ImpersonationUtil.getProcessUserName();
+
     return Optional.of(dataSources.computeIfAbsent(
-      jdbcCreds.get().getUsername(),
-      ds -> initDataSource(this.jdbcStorageConfig, jdbcCreds.get())
+      dsKey,
+      ds -> initDataSource(this.jdbcStorageConfig, jdbcCreds.orElse(null))
     ));
   }
 
diff --git 
a/contrib/storage-jdbc/src/test/java/org/apache/drill/exec/store/jdbc/TestJdbcPluginWithH2IT.java
 
b/contrib/storage-jdbc/src/test/java/org/apache/drill/exec/store/jdbc/TestJdbcPluginWithH2IT.java
index b097b4746a..4d9d4e97bd 100644
--- 
a/contrib/storage-jdbc/src/test/java/org/apache/drill/exec/store/jdbc/TestJdbcPluginWithH2IT.java
+++ 
b/contrib/storage-jdbc/src/test/java/org/apache/drill/exec/store/jdbc/TestJdbcPluginWithH2IT.java
@@ -55,6 +55,7 @@ public class TestJdbcPluginWithH2IT extends ClusterTest {
   private static final String TABLE_PATH = "jdbcmulti/";
   private static final String TABLE_NAME = String.format("%s.`%s`", 
StoragePluginTestUtils.DFS_PLUGIN_NAME, TABLE_PATH);
   private static TimeZone defaultTimeZone;
+  private static URL SCRIPT_FILE = 
TestJdbcPluginWithH2IT.class.getClassLoader().getResource("h2-test-data.sql");
 
   @BeforeClass
   public static void init() throws Exception {
@@ -66,10 +67,10 @@ public class TestJdbcPluginWithH2IT extends ClusterTest {
     dirTestWatcher.copyResourceToRoot(Paths.get(TABLE_PATH));
     Class.forName("org.h2.Driver");
     String connString = "jdbc:h2:" + 
dirTestWatcher.getTmpDir().getCanonicalPath();
-    URL scriptFile = 
TestJdbcPluginWithH2IT.class.getClassLoader().getResource("h2-test-data.sql");
-    assertNotNull("Script for test tables generation 'h2-test-data.sql' cannot 
be found in test resources", scriptFile);
+
+    assertNotNull("Script for test tables generation 'h2-test-data.sql' cannot 
be found in test resources", SCRIPT_FILE);
     try (Connection connection = DriverManager.getConnection(connString, 
"root", "root");
-         FileReader fileReader = new FileReader(scriptFile.getFile())) {
+         FileReader fileReader = new FileReader(SCRIPT_FILE.getFile())) {
       RunScript.execute(connection, fileReader);
     }
 
@@ -313,4 +314,39 @@ public class TestJdbcPluginWithH2IT extends ClusterTest {
         .include("mocked_enum")
         .match();
   }
+
+  @Test
+  public void testSharedUserNoCreds() throws Exception {
+    String connString = "jdbc:h2:" + 
dirTestWatcher.getTmpDir().getCanonicalPath() + "/noauth";
+    JdbcStorageConfig cfg = new JdbcStorageConfig(
+      "org.h2.Driver",
+        connString,
+        null,
+        null,
+        true,
+        false,
+        null,
+        null,
+        AuthMode.SHARED_USER.name(),
+        10000
+    );
+    cfg.setEnabled(true);
+    cluster.defineStoragePlugin("h2_noauth", cfg);
+
+    try (
+      Connection connection = DriverManager.getConnection(connString, null, 
null);
+      FileReader fileReader = new FileReader(SCRIPT_FILE.getFile())
+    ) {
+      RunScript.execute(connection, fileReader);
+    }
+
+    run("USE h2_noauth");
+    String sql = "SHOW TABLES";
+    testBuilder()
+      .sqlQuery(sql)
+      .unOrdered()
+      .baselineColumns("TABLE_SCHEMA", "TABLE_NAME")
+      .baselineValues("h2_noauth.noauth.drill_h2_test_1", "PERSON")
+      .go();
+  }
 }
diff --git 
a/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/MongoStoragePluginConfig.java
 
b/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/MongoStoragePluginConfig.java
index f80f1beadb..b9fc1758db 100644
--- 
a/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/MongoStoragePluginConfig.java
+++ 
b/contrib/storage-mongo/src/main/java/org/apache/drill/exec/store/mongo/MongoStoragePluginConfig.java
@@ -23,7 +23,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeName;
 import com.mongodb.ConnectionString;
 import org.apache.commons.lang3.ObjectUtils;
-import org.apache.drill.common.logical.CredentialedStoragePluginConfig;
+import org.apache.drill.common.logical.StoragePluginConfig;
 import org.apache.drill.common.logical.security.CredentialsProvider;
 import org.apache.drill.common.logical.security.PlainCredentialsProvider;
 
@@ -31,7 +31,7 @@ import java.util.List;
 import java.util.Objects;
 
 @JsonTypeName(MongoStoragePluginConfig.NAME)
-public class MongoStoragePluginConfig extends CredentialedStoragePluginConfig {
+public class MongoStoragePluginConfig extends StoragePluginConfig {
 
   public static final String NAME = "mongo";
 
diff --git 
a/contrib/storage-phoenix/src/main/java/org/apache/drill/exec/store/phoenix/PhoenixStoragePluginConfig.java
 
b/contrib/storage-phoenix/src/main/java/org/apache/drill/exec/store/phoenix/PhoenixStoragePluginConfig.java
index 6e73dc2b09..8a9e6a8950 100644
--- 
a/contrib/storage-phoenix/src/main/java/org/apache/drill/exec/store/phoenix/PhoenixStoragePluginConfig.java
+++ 
b/contrib/storage-phoenix/src/main/java/org/apache/drill/exec/store/phoenix/PhoenixStoragePluginConfig.java
@@ -24,7 +24,7 @@ import java.util.Optional;
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.drill.common.PlanStringBuilder;
-import org.apache.drill.common.logical.CredentialedStoragePluginConfig;
+import org.apache.drill.common.logical.StoragePluginConfig;
 import org.apache.drill.common.logical.security.CredentialsProvider;
 import org.apache.drill.exec.store.security.CredentialProviderUtils;
 import org.apache.drill.exec.store.security.UsernamePasswordCredentials;
@@ -35,7 +35,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeName;
 
 @JsonTypeName(PhoenixStoragePluginConfig.NAME)
-public class PhoenixStoragePluginConfig extends 
CredentialedStoragePluginConfig {
+public class PhoenixStoragePluginConfig extends StoragePluginConfig {
 
   public static final String NAME = "phoenix";
   public static final String THIN_DRIVER_CLASS = 
"org.apache.phoenix.queryserver.client.Driver";
@@ -147,9 +147,4 @@ public class PhoenixStoragePluginConfig extends 
CredentialedStoragePluginConfig
         .field("props", props)
         .toString();
   }
-
-  @Override
-  public PhoenixStoragePluginConfig 
updateCredentialProvider(CredentialsProvider credentialsProvider) {
-    return this;
-  }
 }
diff --git 
a/contrib/storage-splunk/src/main/java/org/apache/drill/exec/store/splunk/SplunkPluginConfig.java
 
b/contrib/storage-splunk/src/main/java/org/apache/drill/exec/store/splunk/SplunkPluginConfig.java
index 0734347b08..41d134a3f8 100644
--- 
a/contrib/storage-splunk/src/main/java/org/apache/drill/exec/store/splunk/SplunkPluginConfig.java
+++ 
b/contrib/storage-splunk/src/main/java/org/apache/drill/exec/store/splunk/SplunkPluginConfig.java
@@ -23,7 +23,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeName;
 import org.apache.drill.common.PlanStringBuilder;
-import org.apache.drill.common.logical.CredentialedStoragePluginConfig;
+import org.apache.drill.common.logical.StoragePluginConfig;
 import org.apache.drill.common.logical.security.CredentialsProvider;
 import org.apache.drill.common.logical.security.PlainCredentialsProvider;
 import org.apache.drill.exec.store.security.CredentialProviderUtils;
@@ -33,7 +33,7 @@ import java.util.Objects;
 import java.util.Optional;
 
 @JsonTypeName(SplunkPluginConfig.NAME)
-public class SplunkPluginConfig extends CredentialedStoragePluginConfig {
+public class SplunkPluginConfig extends StoragePluginConfig {
 
   public static final String NAME = "splunk";
   public static final int DISABLED_RECONNECT_RETRIES = 1;
diff --git 
a/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/CredentialResources.java
 
b/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/CredentialResources.java
index f50c07bd7d..3cfebd2fcd 100644
--- 
a/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/CredentialResources.java
+++ 
b/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/CredentialResources.java
@@ -20,7 +20,6 @@ package org.apache.drill.exec.server.rest;
 
 import io.swagger.v3.oas.annotations.ExternalDocumentation;
 import io.swagger.v3.oas.annotations.Operation;
-import org.apache.drill.common.logical.CredentialedStoragePluginConfig;
 import org.apache.drill.common.logical.StoragePluginConfig.AuthMode;
 import org.apache.drill.common.logical.StoragePluginConfig;
 import org.apache.drill.common.logical.security.CredentialsProvider;
@@ -156,14 +155,7 @@ public class CredentialResources {
     }
 
     // Get the config
-    StoragePluginConfig rawConfig = storage.getStoredConfig(pluginName);
-    if (!(rawConfig instanceof CredentialedStoragePluginConfig)) {
-      return Response.status(Status.INTERNAL_SERVER_ERROR)
-        .entity(message(pluginName + " does not support per user 
credentials."))
-        .build();
-    }
-
-    CredentialedStoragePluginConfig config = 
(CredentialedStoragePluginConfig)rawConfig;
+    StoragePluginConfig config = storage.getStoredConfig(pluginName);
 
     if (config.getAuthMode() != AuthMode.USER_TRANSLATION) {
       return Response.status(Status.INTERNAL_SERVER_ERROR)
@@ -177,7 +169,7 @@ public class CredentialResources {
 
     // Since the config classes are not accessible from java-exec, we have to 
serialize them,
     // replace the credential provider with the updated one, and update the 
storage plugin registry
-    CredentialedStoragePluginConfig newConfig = 
config.updateCredentialProvider(credentialProvider);
+    StoragePluginConfig newConfig = 
config.updateCredentialProvider(credentialProvider);
     newConfig.setEnabled(config.isEnabled());
 
     try {
@@ -210,26 +202,19 @@ public class CredentialResources {
     cleanPluginName = pluginName.trim();
     StoragePluginConfig config = storage.getStoredConfig(cleanPluginName);
 
-    if (!(config instanceof CredentialedStoragePluginConfig)) {
-      return Response.status(Status.INTERNAL_SERVER_ERROR)
-        .entity(message(cleanPluginName + " does not support user 
translation."))
-        .build();
-    }
-
     if (config.getAuthMode() != AuthMode.USER_TRANSLATION) {
       return Response.status(Status.INTERNAL_SERVER_ERROR)
         .entity(message(cleanPluginName + " does not have user translation 
enabled."))
         .build();
     }
 
-    CredentialedStoragePluginConfig credsConfig = 
(CredentialedStoragePluginConfig)config;
-    CredentialsProvider credentialProvider = 
credsConfig.getCredentialsProvider();
+    CredentialsProvider credentialProvider = config.getCredentialsProvider();
     credentialProvider.setUserCredentials(credentials.getUsername(), 
credentials.getPassword(), queryUser);
 
     // Since the config classes are not accessible from java-exec, we have to 
serialize them,
     // replace the credential provider with the updated one, and update the 
storage plugin registry
-    CredentialedStoragePluginConfig newConfig = 
credsConfig.updateCredentialProvider(credentialProvider);
-    newConfig.setEnabled(credsConfig.isEnabled());
+    StoragePluginConfig newConfig = 
config.updateCredentialProvider(credentialProvider);
+    newConfig.setEnabled(config.isEnabled());
 
     try {
       storage.validatedPut(cleanPluginName, newConfig);
diff --git 
a/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/OAuthRequests.java
 
b/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/OAuthRequests.java
index 6c817c8d28..5a32b11e76 100644
--- 
a/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/OAuthRequests.java
+++ 
b/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/OAuthRequests.java
@@ -21,7 +21,6 @@ package org.apache.drill.exec.server.rest;
 import okhttp3.OkHttpClient;
 import okhttp3.OkHttpClient.Builder;
 import okhttp3.Request;
-import org.apache.drill.common.logical.CredentialedStoragePluginConfig;
 import org.apache.drill.common.logical.StoragePluginConfig;
 import org.apache.drill.common.logical.StoragePluginConfig.AuthMode;
 import org.apache.drill.common.logical.security.CredentialsProvider;
@@ -63,23 +62,16 @@ public class OAuthRequests {
                                            UserAuthEnabled authEnabled,
                                            SecurityContext sc) {
     try {
-      if (storage.getPlugin(name).getConfig() instanceof 
CredentialedStoragePluginConfig) {
-        DrillbitContext context = ((AbstractStoragePlugin) 
storage.getPlugin(name)).getContext();
-        OAuthTokenProvider tokenProvider = context.getoAuthTokenProvider();
-        PersistentTokenTable tokenTable = 
tokenProvider.getOauthTokenRegistry(getQueryUser(storage.getPlugin(name).getConfig(),
 authEnabled, sc)).getTokenTable(name);
-
-        // Set the access token
-        tokenTable.setAccessToken(tokens.getAccessToken());
-
-        return Response.status(Status.OK)
-          .entity("Access tokens have been updated.")
-          .build();
-      } else {
-        logger.error("{} does not support OAuth2.0.  You can only add tokens 
to OAuth enabled plugins.", name);
-        return Response.status(Status.INTERNAL_SERVER_ERROR)
-          .entity(message("Unable to add tokens: %s", name))
-          .build();
-      }
+      DrillbitContext context = ((AbstractStoragePlugin) 
storage.getPlugin(name)).getContext();
+      OAuthTokenProvider tokenProvider = context.getoAuthTokenProvider();
+      PersistentTokenTable tokenTable = 
tokenProvider.getOauthTokenRegistry(getQueryUser(storage.getPlugin(name).getConfig(),
 authEnabled, sc)).getTokenTable(name);
+
+      // Set the access token
+      tokenTable.setAccessToken(tokens.getAccessToken());
+
+      return Response.status(Status.OK)
+        .entity("Access tokens have been updated.")
+        .build();
     } catch (PluginException e) {
       logger.error("Error when adding tokens to {}", name);
       return Response.status(Status.INTERNAL_SERVER_ERROR)
@@ -92,24 +84,17 @@ public class OAuthRequests {
                                             StoragePluginRegistry storage, 
UserAuthEnabled authEnabled,
                                             SecurityContext sc) {
     try {
-      if (storage.getPlugin(name).getConfig() instanceof 
CredentialedStoragePluginConfig) {
-        DrillbitContext context = ((AbstractStoragePlugin) 
storage.getPlugin(name)).getContext();
-        OAuthTokenProvider tokenProvider = context.getoAuthTokenProvider();
-        PersistentTokenTable tokenTable = tokenProvider.getOauthTokenRegistry(
-          getQueryUser(storage.getPlugin(name).getConfig(), authEnabled, 
sc)).getTokenTable(name);
-
-        // Set the access token
-        tokenTable.setRefreshToken(tokens.getRefreshToken());
-
-        return Response.status(Status.OK)
-          .entity("Refresh token have been updated.")
-          .build();
-      } else {
-        logger.error("{} is not a HTTP plugin. You can only add access tokens 
to HTTP plugins.", name);
-        return Response.status(Status.INTERNAL_SERVER_ERROR)
-          .entity(message("Unable to add tokens: %s", name))
-          .build();
-      }
+      DrillbitContext context = ((AbstractStoragePlugin) 
storage.getPlugin(name)).getContext();
+      OAuthTokenProvider tokenProvider = context.getoAuthTokenProvider();
+      PersistentTokenTable tokenTable = tokenProvider.getOauthTokenRegistry(
+        getQueryUser(storage.getPlugin(name).getConfig(), authEnabled, 
sc)).getTokenTable(name);
+
+      // Set the access token
+      tokenTable.setRefreshToken(tokens.getRefreshToken());
+
+      return Response.status(Status.OK)
+        .entity("Refresh token have been updated.")
+        .build();
     } catch (PluginException e) {
       logger.error("Error when adding tokens to {}", name);
       return Response.status(Status.INTERNAL_SERVER_ERROR)
@@ -121,26 +106,19 @@ public class OAuthRequests {
   public static Response updateOAuthTokens(String name, OAuthTokenContainer 
tokenContainer, StoragePluginRegistry storage,
                                            UserAuthEnabled authEnabled, 
SecurityContext sc) {
     try {
-      if (storage.getPlugin(name).getConfig() instanceof 
CredentialedStoragePluginConfig) {
-        DrillbitContext context = ((AbstractStoragePlugin) 
storage.getPlugin(name)).getContext();
-        OAuthTokenProvider tokenProvider = context.getoAuthTokenProvider();
-        PersistentTokenTable tokenTable = tokenProvider
-          
.getOauthTokenRegistry(getQueryUser(storage.getPlugin(name).getConfig(), 
authEnabled, sc))
-          .getTokenTable(name);
-
-        // Set the access and refresh token
-        tokenTable.setAccessToken(tokenContainer.getAccessToken());
-        tokenTable.setRefreshToken(tokenContainer.getRefreshToken());
-
-        return Response.status(Status.OK)
-          .entity("Access tokens have been updated.")
-          .build();
-      } else {
-        logger.error("{} is not a HTTP plugin. You can only add access tokens 
to HTTP plugins.", name);
-        return Response.status(Status.INTERNAL_SERVER_ERROR)
-          .entity(message("Unable to add tokens: %s", name))
-          .build();
-      }
+      DrillbitContext context = ((AbstractStoragePlugin) 
storage.getPlugin(name)).getContext();
+      OAuthTokenProvider tokenProvider = context.getoAuthTokenProvider();
+      PersistentTokenTable tokenTable = tokenProvider
+        
.getOauthTokenRegistry(getQueryUser(storage.getPlugin(name).getConfig(), 
authEnabled, sc))
+        .getTokenTable(name);
+
+      // Set the access and refresh token
+      tokenTable.setAccessToken(tokenContainer.getAccessToken());
+      tokenTable.setRefreshToken(tokenContainer.getRefreshToken());
+
+      return Response.status(Status.OK)
+        .entity("Access tokens have been updated.")
+        .build();
     } catch (PluginException e) {
       logger.error("Error when adding tokens to {}", name);
       return Response.status(Status.INTERNAL_SERVER_ERROR)
@@ -153,53 +131,45 @@ public class OAuthRequests {
                                          StoragePluginRegistry storage, 
UserAuthEnabled authEnabled,
                                          SecurityContext sc) {
     try {
-      if (storage.getPlugin(name).getConfig() instanceof 
CredentialedStoragePluginConfig) {
-        CredentialedStoragePluginConfig securedStoragePluginConfig = 
(CredentialedStoragePluginConfig) storage.getPlugin(name).getConfig();
-        CredentialsProvider credentialsProvider = 
securedStoragePluginConfig.getCredentialsProvider();
-        String callbackURL = request.getRequestURL().toString();
-
-        // Now exchange the authorization token for an access token
-        Builder builder = new OkHttpClient.Builder();
-        OkHttpClient client = builder.build();
-
-        Request accessTokenRequest = 
OAuthUtils.getAccessTokenRequest(credentialsProvider, code, callbackURL);
-        Map<String, String> updatedTokens = OAuthUtils.getOAuthTokens(client, 
accessTokenRequest);
-
-        // Add to token registry
-        // If USER_TRANSLATION is enabled, Drill will create a token table for 
each user.
-        TokenRegistry tokenRegistry = ((AbstractStoragePlugin) 
storage.getPlugin(name))
-          .getContext()
-          .getoAuthTokenProvider()
-          
.getOauthTokenRegistry(getQueryUser(storage.getPlugin(name).getConfig(), 
authEnabled, sc));
-
-        // Add a token registry table if none exists
-        tokenRegistry.createTokenTable(name);
-        PersistentTokenTable tokenTable = tokenRegistry.getTokenTable(name);
-
-        // Add tokens to persistent storage
-        
tokenTable.setAccessToken(updatedTokens.get(OAuthTokenCredentials.ACCESS_TOKEN));
-        
tokenTable.setRefreshToken(updatedTokens.get(OAuthTokenCredentials.REFRESH_TOKEN));
-
-        // Get success page
-        String successPage = null;
-        try (InputStream inputStream = 
Resource.newClassPathResource(OAUTH_SUCCESS_PAGE).getInputStream()) {
-          InputStreamReader reader = new InputStreamReader(inputStream, 
StandardCharsets.UTF_8);
-          BufferedReader bufferedReader = new BufferedReader(reader);
-          successPage = bufferedReader.lines()
-            .collect(Collectors.joining("\n"));
-          bufferedReader.close();
-          reader.close();
-        } catch (IOException e) {
-          return Response.status(Status.OK).entity("You may close this 
window.").build();
-        }
-
-        return Response.status(Status.OK).entity(successPage).build();
-      } else {
-        logger.error("{} is not a HTTP plugin. You can only add auth code to 
HTTP plugins.", name);
-        return Response.status(Status.INTERNAL_SERVER_ERROR)
-          .entity(message("Unable to add authorization code: %s", name))
-          .build();
+      CredentialsProvider credentialsProvider = 
storage.getPlugin(name).getConfig().getCredentialsProvider();
+      String callbackURL = request.getRequestURL().toString();
+
+      // Now exchange the authorization token for an access token
+      Builder builder = new OkHttpClient.Builder();
+      OkHttpClient client = builder.build();
+
+      Request accessTokenRequest = 
OAuthUtils.getAccessTokenRequest(credentialsProvider, code, callbackURL);
+      Map<String, String> updatedTokens = OAuthUtils.getOAuthTokens(client, 
accessTokenRequest);
+
+      // Add to token registry
+      // If USER_TRANSLATION is enabled, Drill will create a token table for 
each user.
+      TokenRegistry tokenRegistry = ((AbstractStoragePlugin) 
storage.getPlugin(name))
+        .getContext()
+        .getoAuthTokenProvider()
+        
.getOauthTokenRegistry(getQueryUser(storage.getPlugin(name).getConfig(), 
authEnabled, sc));
+
+      // Add a token registry table if none exists
+      tokenRegistry.createTokenTable(name);
+      PersistentTokenTable tokenTable = tokenRegistry.getTokenTable(name);
+
+      // Add tokens to persistent storage
+      
tokenTable.setAccessToken(updatedTokens.get(OAuthTokenCredentials.ACCESS_TOKEN));
+      
tokenTable.setRefreshToken(updatedTokens.get(OAuthTokenCredentials.REFRESH_TOKEN));
+
+      // Get success page
+      String successPage = null;
+      try (InputStream inputStream = 
Resource.newClassPathResource(OAUTH_SUCCESS_PAGE).getInputStream()) {
+        InputStreamReader reader = new InputStreamReader(inputStream, 
StandardCharsets.UTF_8);
+        BufferedReader bufferedReader = new BufferedReader(reader);
+        successPage = bufferedReader.lines()
+          .collect(Collectors.joining("\n"));
+        bufferedReader.close();
+        reader.close();
+      } catch (IOException e) {
+        return Response.status(Status.OK).entity("You may close this 
window.").build();
       }
+
+      return Response.status(Status.OK).entity(successPage).build();
     } catch (PluginException e) {
       logger.error("Error when adding auth token to {}", name);
       return Response.status(Status.INTERNAL_SERVER_ERROR)
diff --git 
a/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/PluginConfigWrapper.java
 
b/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/PluginConfigWrapper.java
index bbc87cda69..9ae34828ee 100644
--- 
a/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/PluginConfigWrapper.java
+++ 
b/exec/java-exec/src/main/java/org/apache/drill/exec/server/rest/PluginConfigWrapper.java
@@ -29,7 +29,6 @@ import javax.xml.bind.annotation.XmlRootElement;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.drill.common.exceptions.UserException;
-import org.apache.drill.common.logical.CredentialedStoragePluginConfig;
 import org.apache.drill.common.logical.OAuthConfig;
 import org.apache.drill.common.logical.StoragePluginConfig;
 import org.apache.drill.common.logical.security.CredentialsProvider;
@@ -66,12 +65,7 @@ public class PluginConfigWrapper {
 
   @JsonIgnore
   public String getUserName(String activeUser) {
-    if (!(config instanceof CredentialedStoragePluginConfig)) {
-      return null;
-    }
-
-    CredentialedStoragePluginConfig securedStoragePluginConfig = 
(CredentialedStoragePluginConfig) config;
-    CredentialsProvider credentialsProvider = 
securedStoragePluginConfig.getCredentialsProvider();
+    CredentialsProvider credentialsProvider = config.getCredentialsProvider();
     Optional<UsernamePasswordCredentials> credentials = new 
UsernamePasswordCredentials.Builder()
       .setCredentialsProvider(credentialsProvider)
       .setQueryUser(activeUser)
@@ -82,12 +76,7 @@ public class PluginConfigWrapper {
 
   @JsonIgnore
   public String getPassword(String activeUser) {
-    if (!(config instanceof CredentialedStoragePluginConfig)) {
-      return null;
-    }
-
-    CredentialedStoragePluginConfig securedStoragePluginConfig = 
(CredentialedStoragePluginConfig) config;
-    CredentialsProvider credentialsProvider = 
securedStoragePluginConfig.getCredentialsProvider();
+    CredentialsProvider credentialsProvider = config.getCredentialsProvider();
     Optional<UsernamePasswordCredentials> credentials = new 
UsernamePasswordCredentials.Builder()
       .setCredentialsProvider(credentialsProvider)
       .setQueryUser(activeUser)
@@ -110,11 +99,7 @@ public class PluginConfigWrapper {
    */
   @JsonIgnore
   public boolean isOauth() {
-    if (! (config instanceof CredentialedStoragePluginConfig)) {
-      return false;
-    }
-    CredentialedStoragePluginConfig securedStoragePluginConfig = 
(CredentialedStoragePluginConfig) config;
-    CredentialsProvider credentialsProvider = 
securedStoragePluginConfig.getCredentialsProvider();
+    CredentialsProvider credentialsProvider = config.getCredentialsProvider();
     if (credentialsProvider == null) {
       return false;
     }
@@ -128,8 +113,7 @@ public class PluginConfigWrapper {
 
   @JsonIgnore
   public String getClientID() {
-    CredentialedStoragePluginConfig securedStoragePluginConfig = 
(CredentialedStoragePluginConfig) config;
-    CredentialsProvider credentialsProvider = 
securedStoragePluginConfig.getCredentialsProvider();
+    CredentialsProvider credentialsProvider = config.getCredentialsProvider();
 
     return credentialsProvider.getCredentials().getOrDefault("clientID", "");
   }
@@ -150,7 +134,7 @@ public class PluginConfigWrapper {
     }
 
     String clientID = getClientID();
-    OAuthConfig oAuthConfig = 
((CredentialedStoragePluginConfig)config).oAuthConfig();
+    OAuthConfig oAuthConfig = config.oAuthConfig();
     String authorizationURI = oAuthConfig.getAuthorizationURL();
 
     StringBuilder finalUrlBuilder = new StringBuilder();
diff --git 
a/exec/java-exec/src/main/java/org/apache/drill/exec/store/dfs/FileSystemConfig.java
 
b/exec/java-exec/src/main/java/org/apache/drill/exec/store/dfs/FileSystemConfig.java
index 6fbba4196a..b8b784c859 100644
--- 
a/exec/java-exec/src/main/java/org/apache/drill/exec/store/dfs/FileSystemConfig.java
+++ 
b/exec/java-exec/src/main/java/org/apache/drill/exec/store/dfs/FileSystemConfig.java
@@ -34,7 +34,7 @@ import org.apache.drill.common.logical.FormatPluginConfig;
 
 import com.fasterxml.jackson.annotation.JsonTypeName;
 
-import org.apache.drill.common.logical.CredentialedStoragePluginConfig;
+import org.apache.drill.common.logical.StoragePluginConfig;
 import org.apache.drill.common.map.CaseInsensitiveMap;
 import org.apache.drill.common.logical.security.CredentialsProvider;
 import org.apache.drill.common.logical.security.PlainCredentialsProvider;
@@ -43,7 +43,7 @@ import 
org.apache.drill.shaded.guava.com.google.common.collect.ImmutableMap.Buil
 import org.apache.hadoop.fs.CommonConfigurationKeysPublic;
 
 @JsonTypeName(FileSystemConfig.NAME)
-public class FileSystemConfig extends CredentialedStoragePluginConfig {
+public class FileSystemConfig extends StoragePluginConfig {
   private static final List<String> FS_CREDENTIAL_KEYS =
       Arrays.asList(
           
CommonConfigurationKeysPublic.HADOOP_SECURITY_CREDENTIAL_PROVIDER_PATH,
@@ -182,9 +182,4 @@ public class FileSystemConfig extends 
CredentialedStoragePluginConfig {
     }
     return PlainCredentialsProvider.EMPTY_CREDENTIALS_PROVIDER;
   }
-
-  @Override
-  public FileSystemConfig updateCredentialProvider(CredentialsProvider 
credentialsProvider) {
-    return this;
-  }
 }
diff --git 
a/exec/java-exec/src/test/java/org/apache/drill/exec/store/TestClassicLocator.java
 
b/exec/java-exec/src/test/java/org/apache/drill/exec/store/TestClassicLocator.java
index a64e96f083..bd20c60e92 100644
--- 
a/exec/java-exec/src/test/java/org/apache/drill/exec/store/TestClassicLocator.java
+++ 
b/exec/java-exec/src/test/java/org/apache/drill/exec/store/TestClassicLocator.java
@@ -27,7 +27,6 @@ import java.util.Collections;
 import java.util.Set;
 
 import org.apache.drill.common.logical.StoragePluginConfig;
-import org.apache.drill.common.logical.CredentialedStoragePluginConfig;
 import org.apache.drill.exec.ExecConstants;
 import org.apache.drill.exec.planner.logical.StoragePlugins;
 import org.apache.drill.exec.store.dfs.FileSystemConfig;
@@ -63,7 +62,6 @@ public class TestClassicLocator extends 
BasePluginRegistryTest {
 
       // Abstract classes do not appear
       assertFalse(result.contains(StoragePluginConfig.class));
-      assertFalse(result.contains(CredentialedStoragePluginConfig.class));
 
       // The private plugin class does not appear
       assertFalse(result.contains(StoragePluginFixtureConfig.class));
diff --git 
a/logical/src/main/java/org/apache/drill/common/logical/CredentialedStoragePluginConfig.java
 
b/logical/src/main/java/org/apache/drill/common/logical/CredentialedStoragePluginConfig.java
deleted file mode 100644
index 587413220f..0000000000
--- 
a/logical/src/main/java/org/apache/drill/common/logical/CredentialedStoragePluginConfig.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * 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.common.logical;
-
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.annotation.JsonInclude.Include;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import org.apache.drill.common.logical.security.CredentialsProvider;
-import org.apache.drill.common.logical.security.PlainCredentialsProvider;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public abstract class CredentialedStoragePluginConfig extends 
StoragePluginConfig {
-
-  private static final Logger logger = 
LoggerFactory.getLogger(CredentialedStoragePluginConfig.class);
-  protected boolean directCredentials;
-  protected final CredentialsProvider credentialsProvider;
-  protected OAuthConfig oAuthConfig;
-
-  public CredentialedStoragePluginConfig() {
-    this(PlainCredentialsProvider.EMPTY_CREDENTIALS_PROVIDER,  true);
-  }
-
-  public CredentialedStoragePluginConfig(
-    CredentialsProvider credentialsProvider,
-    boolean directCredentials
-  ) {
-    // Default auth mode for credentialed storage plugins is shared user.
-    this(credentialsProvider, directCredentials, AuthMode.SHARED_USER);
-  }
-
-  public CredentialedStoragePluginConfig(
-    CredentialsProvider credentialsProvider,
-    boolean directCredentials,
-    AuthMode authMode
-  ) {
-    this.credentialsProvider = credentialsProvider;
-    this.directCredentials = directCredentials;
-    this.authMode = authMode;
-    this.oAuthConfig = null;
-  }
-
-  public CredentialedStoragePluginConfig(
-    CredentialsProvider credentialsProvider,
-    boolean directCredentials,
-    AuthMode authMode,
-    OAuthConfig oAuthConfig
-  ) {
-    this.credentialsProvider = credentialsProvider;
-    this.directCredentials = directCredentials;
-    this.authMode = authMode;
-    this.oAuthConfig = oAuthConfig;
-  }
-
-  public abstract CredentialedStoragePluginConfig 
updateCredentialProvider(CredentialsProvider credentialsProvider);
-
-  @JsonProperty("oAuthConfig")
-  @JsonInclude(Include.NON_NULL)
-  public OAuthConfig oAuthConfig() {
-    return oAuthConfig;
-  }
-
-  public CredentialsProvider getCredentialsProvider() {
-    if (directCredentials) {
-      return null;
-    }
-    return credentialsProvider;
-  }
-}
diff --git 
a/logical/src/main/java/org/apache/drill/common/logical/StoragePluginConfig.java
 
b/logical/src/main/java/org/apache/drill/common/logical/StoragePluginConfig.java
index b5c265e010..a93dbec7be 100644
--- 
a/logical/src/main/java/org/apache/drill/common/logical/StoragePluginConfig.java
+++ 
b/logical/src/main/java/org/apache/drill/common/logical/StoragePluginConfig.java
@@ -18,22 +18,64 @@
 package org.apache.drill.common.logical;
 
 
-import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonInclude.Include;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
 
+import org.apache.drill.common.exceptions.UserException;
+import org.apache.drill.common.logical.security.CredentialsProvider;
+import org.apache.drill.common.logical.security.PlainCredentialsProvider;
 import org.apache.drill.shaded.guava.com.google.common.base.Strings;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type")
 @JsonInclude(JsonInclude.Include.NON_DEFAULT)
 public abstract class StoragePluginConfig {
 
+  Logger logger = LoggerFactory.getLogger(StoragePluginConfig.class);
+
   // DO NOT include enabled status in equality and hash
   // comparisons; doing so will break the plugin registry.
   protected Boolean enabled;
+  protected final boolean directCredentials;
+  protected final CredentialsProvider credentialsProvider;
+  protected final AuthMode authMode;
+  protected OAuthConfig oAuthConfig;
+
+  public StoragePluginConfig() {
+    this(PlainCredentialsProvider.EMPTY_CREDENTIALS_PROVIDER,  true);
+  }
 
-  // The overridable default plugin auth mode is DRILL_PROCESS
-  protected AuthMode authMode = AuthMode.DRILL_PROCESS;
+  public StoragePluginConfig(
+    CredentialsProvider credentialsProvider,
+    boolean directCredentials
+  ) {
+    // The overridable default auth mode is shared user.
+    this(credentialsProvider, directCredentials, AuthMode.SHARED_USER);
+  }
+
+  public StoragePluginConfig(
+    CredentialsProvider credentialsProvider,
+    boolean directCredentials,
+    AuthMode authMode
+  ) {
+    this(credentialsProvider, directCredentials, authMode, null);
+  }
+
+  public StoragePluginConfig(
+    CredentialsProvider credentialsProvider,
+    boolean directCredentials,
+    AuthMode authMode,
+    OAuthConfig oAuthConfig
+  ) {
+    this.credentialsProvider = credentialsProvider;
+    this.directCredentials = directCredentials;
+    this.authMode = authMode;
+    this.oAuthConfig = oAuthConfig;
+  }
 
   /**
    * Check for enabled status of the plugin
@@ -48,14 +90,6 @@ public abstract class StoragePluginConfig {
     this.enabled = enabled;
   }
 
-  public AuthMode getAuthMode() {
-    return authMode;
-  }
-
-  public void setAuthMode(AuthMode authMode) {
-    this.authMode = authMode;
-  }
-
   /**
    * Allows to check whether the enabled status is present in config
    *
@@ -66,30 +100,49 @@ public abstract class StoragePluginConfig {
     return enabled != null;
   }
 
+  public String getValue(String key) {
+    return null;
+  }
+
+  public CredentialsProvider getCredentialsProvider() {
+    if (directCredentials) {
+      return null;
+    }
+    return credentialsProvider;
+  }
+
+  public StoragePluginConfig updateCredentialProvider(CredentialsProvider 
credentialsProvider) {
+    throw UserException.unsupportedError()
+      .message("%s does not support credential provider updates.", getClass())
+      .build(logger);
+  }
+
+  public AuthMode getAuthMode() {
+    return authMode;
+  }
+
+  @JsonProperty("oAuthConfig")
+  @JsonInclude(Include.NON_NULL)
+  public OAuthConfig oAuthConfig() {
+    return oAuthConfig;
+  }
+
   @Override
   public abstract boolean equals(Object o);
 
   @Override
   public abstract int hashCode();
 
-  public String getValue(String key) {
-    return null;
-  }
-
   /**
    * The standardised authentication modes that storage plugins may offer.
    */
   public enum AuthMode {
-    /**
-     * Default. Connects using the identity of the Drill cluster (OS user or
-     * service principal) if the external storage is aware of said identity,
-     * otherwise connects without authentication. Unaffected by the Drill
-     * query user's identity.
-     */
-    DRILL_PROCESS,
     /**
      * Connects using a single set of shared credentials stored in some
-     * credential provider.  Unaffected by the Drill query user's identity.
+     * credential provider. If no credentials are present, the plugin may
+     * connect with no credentials or make implicit use of the Drillbit's
+     * identity (e.g. OS process user). Unaffected by the Drill query user's
+     * identity.
      */
     SHARED_USER,
     /**

Reply via email to