| /* |
| * 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.JsonFormat; |
| 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 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) |
| @JsonFormat(with = JsonFormat.Feature.ACCEPT_CASE_INSENSITIVE_PROPERTIES) |
| 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); |
| } |
| |
| 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 |
| * |
| * @return true, when enabled. False, when disabled or status is absent |
| */ |
| public boolean isEnabled() { |
| return enabled != null && enabled; |
| } |
| |
| public void setEnabled(Boolean enabled) { |
| this.enabled = enabled; |
| } |
| |
| /** |
| * Allows to check whether the enabled status is present in config |
| * |
| * @return true if enabled status is present, false otherwise |
| */ |
| @JsonIgnore |
| public boolean isEnabledStatusPresent() { |
| 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(); |
| |
| /** |
| * The standardised authentication modes that storage plugins may offer. |
| */ |
| public enum AuthMode { |
| /** |
| * Connects using a single set of shared credentials stored in some |
| * 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, |
| /** |
| * Depending on the plugin, connects using one of the two modes above then |
| * instructs the external storage to set the identity on the connection |
| * to that of the Drill query user. User identity in the external system |
| * will match the Drill query user's identity. |
| */ |
| USER_IMPERSONATION, |
| /** |
| * Connects with stored credentials looked up for (translated from) |
| * the Drill query user. User identity in the external system will be |
| * a function of the Drill query user's identity (1-1 or *-1) . |
| */ |
| USER_TRANSLATION; |
| |
| public static AuthMode parseOrDefault(String authMode, AuthMode defavlt) { |
| return !Strings.isNullOrEmpty(authMode) ? AuthMode.valueOf(authMode.toUpperCase()) : defavlt; |
| } |
| } |
| } |