+ * 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.hadoop.fs.azurebfs; + +import java.io.IOException; +import java.util.Date; + +import org.junit.Test; + +import org.apache.commons.lang3.StringUtils; +import org.apache.hadoop.fs.azurebfs.oauth2.AccessTokenProvider; +import org.apache.hadoop.fs.azurebfs.oauth2.AzureADToken; +import org.apache.hadoop.fs.azurebfs.oauth2.MsiTokenProvider; + +import static org.junit.Assume.assumeThat; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.not; +import static org.hamcrest.Matchers.isEmptyOrNullString; +import static org.hamcrest.Matchers.isEmptyString; + +import static org.apache.hadoop.fs.azurebfs.constants.AuthConfigurations.DEFAULT_FS_AZURE_ACCOUNT_OAUTH_MSI_AUTHORITY; +import static org.apache.hadoop.fs.azurebfs.constants.AuthConfigurations.DEFAULT_FS_AZURE_ACCOUNT_OAUTH_MSI_ENDPOINT; +import static org.apache.hadoop.fs.azurebfs.constants.ConfigurationKeys.FS_AZURE_ACCOUNT_OAUTH_CLIENT_ID; +import static org.apache.hadoop.fs.azurebfs.constants.ConfigurationKeys.FS_AZURE_ACCOUNT_OAUTH_MSI_AUTHORITY; +import static org.apache.hadoop.fs.azurebfs.constants.ConfigurationKeys.FS_AZURE_ACCOUNT_OAUTH_MSI_ENDPOINT; +import static org.apache.hadoop.fs.azurebfs.constants.ConfigurationKeys.FS_AZURE_ACCOUNT_OAUTH_MSI_TENANT; + +/** + * Test MsiTokenProvider. + */ +public final class ITestAbfsMsiTokenProvider + extends AbstractAbfsIntegrationTest { + + public ITestAbfsMsiTokenProvider() throws Exception { + super(); + } + + @Test + public void test() throws IOException { + AbfsConfiguration conf = getConfiguration(); + assumeThat(conf.get(FS_AZURE_ACCOUNT_OAUTH_MSI_ENDPOINT), + not(isEmptyOrNullString())); + assumeThat(conf.get(FS_AZURE_ACCOUNT_OAUTH_MSI_TENANT), + not(isEmptyOrNullString())); + assumeThat(conf.get(FS_AZURE_ACCOUNT_OAUTH_CLIENT_ID), + not(isEmptyOrNullString())); + assumeThat(conf.get(FS_AZURE_ACCOUNT_OAUTH_MSI_AUTHORITY), + not(isEmptyOrNullString())); + + String tenantGuid = conf + .getPasswordString(FS_AZURE_ACCOUNT_OAUTH_MSI_TENANT); + String clientId = conf.getPasswordString(FS_AZURE_ACCOUNT_OAUTH_CLIENT_ID); + String authEndpoint = getTrimmedPasswordString(conf, + FS_AZURE_ACCOUNT_OAUTH_MSI_ENDPOINT, + DEFAULT_FS_AZURE_ACCOUNT_OAUTH_MSI_ENDPOINT); + String authority = getTrimmedPasswordString(conf, + FS_AZURE_ACCOUNT_OAUTH_MSI_AUTHORITY, + DEFAULT_FS_AZURE_ACCOUNT_OAUTH_MSI_AUTHORITY); + AccessTokenProvider tokenProvider = new MsiTokenProvider(authEndpoint, + tenantGuid, clientId, authority); + + AzureADToken token = null; + token = tokenProvider.getToken(); + assertThat(token.getAccessToken(), not(isEmptyString())); + assertThat(token.getExpiry().after(new Date()), is(true)); + } + + private String getTrimmedPasswordString(AbfsConfiguration conf, String key, + String defaultValue) throws IOException { + String value = conf.getPasswordString(key); + if (StringUtils.isBlank(value)) { + value = defaultValue; + } + return value.trim(); + } + +} diff --git a/hadoop-tools/hadoop-azure/src/test/java/org/apache/hadoop/fs/azurebfs/ITestAzureBlobFileSystemCheckAccess.java b/hadoop-tools/hadoop-azure/src/test/java/org/apache/hadoop/fs/azurebfs/ITestAzureBlobFileSystemCheckAccess.java index d1f9ec7fd70..393eff4b0a2 100644 --- a/hadoop-tools/hadoop-azure/src/test/java/org/apache/hadoop/fs/azurebfs/ITestAzureBlobFileSystemCheckAccess.java +++ b/hadoop-tools/hadoop-azure/src/test/java/org/apache/hadoop/fs/azurebfs/ITestAzureBlobFileSystemCheckAccess.java @@ -54,7 +54,7 @@ public class ITestAzureBlobFileSystemCheckAccess private static final String TEST_FOLDER_PATH = "CheckAccessTestFolder"; private final FileSystem superUserFs; - private final FileSystem testUserFs; + private FileSystem testUserFs; private final String testUserGuid; private final boolean isCheckAccessEnabled; private final boolean isHNSEnabled; @@ -64,13 +64,15 @@ public ITestAzureBlobFileSystemCheckAccess() throws Exception { this.superUserFs = getFileSystem(); testUserGuid = getConfiguration() .get(FS_AZURE_BLOB_FS_CHECKACCESS_TEST_USER_GUID); - this.testUserFs = getTestUserFs(); this.isCheckAccessEnabled = getConfiguration().isCheckAccessEnabled(); this.isHNSEnabled = getConfiguration() .getBoolean(FS_AZURE_TEST_NAMESPACE_ENABLED_ACCOUNT, false); } - private FileSystem getTestUserFs() throws Exception { + private void setTestUserFs() throws Exception { + if (this.testUserFs != null) { + return; + } String orgClientId = getConfiguration().get(FS_AZURE_BLOB_FS_CLIENT_ID); String orgClientSecret = getConfiguration() .get(FS_AZURE_BLOB_FS_CLIENT_SECRET); @@ -89,7 +91,7 @@ private FileSystem getTestUserFs() throws Exception { getRawConfiguration() .setBoolean(AZURE_CREATE_REMOTE_FILESYSTEM_DURING_INITIALIZATION, orgCreateFileSystemDurungInit); - return fs; + this.testUserFs = fs; } @Test(expected = IllegalArgumentException.class) @@ -112,6 +114,7 @@ public void testCheckAccessForFileWithNullFsAction() throws Exception { @Test(expected = FileNotFoundException.class) public void testCheckAccessForNonExistentFile() throws Exception { assumeHNSAndCheckAccessEnabled(); + setTestUserFs(); Path nonExistentFile = setupTestDirectoryAndUserAccess( "/nonExistentFile1.txt", FsAction.ALL); superUserFs.delete(nonExistentFile, true); @@ -155,12 +158,16 @@ public void testCheckAccessForAccountWithoutNS() throws Exception { Assume.assumeFalse(FS_AZURE_TEST_NAMESPACE_ENABLED_ACCOUNT + " is true", getConfiguration() .getBoolean(FS_AZURE_TEST_NAMESPACE_ENABLED_ACCOUNT, true)); + Assume.assumeTrue(FS_AZURE_ENABLE_CHECK_ACCESS + " is false", + isCheckAccessEnabled); + setTestUserFs(); testUserFs.access(new Path("/"), FsAction.READ); } @Test public void testFsActionNONE() throws Exception { assumeHNSAndCheckAccessEnabled(); + setTestUserFs(); Path testFilePath = setupTestDirectoryAndUserAccess("/test2.txt", FsAction.NONE); assertInaccessible(testFilePath, FsAction.EXECUTE); @@ -175,6 +182,7 @@ public void testFsActionNONE() throws Exception { @Test public void testFsActionEXECUTE() throws Exception { assumeHNSAndCheckAccessEnabled(); + setTestUserFs(); Path testFilePath = setupTestDirectoryAndUserAccess("/test3.txt", FsAction.EXECUTE); assertAccessible(testFilePath, FsAction.EXECUTE); @@ -190,6 +198,7 @@ public void testFsActionEXECUTE() throws Exception { @Test public void testFsActionREAD() throws Exception { assumeHNSAndCheckAccessEnabled(); + setTestUserFs(); Path testFilePath = setupTestDirectoryAndUserAccess("/test4.txt", FsAction.READ); assertAccessible(testFilePath, FsAction.READ); @@ -205,6 +214,7 @@ public void testFsActionREAD() throws Exception { @Test public void testFsActionWRITE() throws Exception { assumeHNSAndCheckAccessEnabled(); + setTestUserFs(); Path testFilePath = setupTestDirectoryAndUserAccess("/test5.txt", FsAction.WRITE); assertAccessible(testFilePath, FsAction.WRITE); @@ -220,6 +230,7 @@ public void testFsActionWRITE() throws Exception { @Test public void testFsActionREADEXECUTE() throws Exception { assumeHNSAndCheckAccessEnabled(); + setTestUserFs(); Path testFilePath = setupTestDirectoryAndUserAccess("/test6.txt", FsAction.READ_EXECUTE); assertAccessible(testFilePath, FsAction.EXECUTE); @@ -235,6 +246,7 @@ public void testFsActionREADEXECUTE() throws Exception { @Test public void testFsActionWRITEEXECUTE() throws Exception { assumeHNSAndCheckAccessEnabled(); + setTestUserFs(); Path testFilePath = setupTestDirectoryAndUserAccess("/test7.txt", FsAction.WRITE_EXECUTE); assertAccessible(testFilePath, FsAction.EXECUTE); @@ -250,6 +262,7 @@ public void testFsActionWRITEEXECUTE() throws Exception { @Test public void testFsActionALL() throws Exception { assumeHNSAndCheckAccessEnabled(); + setTestUserFs(); Path testFilePath = setupTestDirectoryAndUserAccess("/test8.txt", FsAction.ALL); assertAccessible(testFilePath, FsAction.EXECUTE);