diff --git a/hadoop-tools/hadoop-azure/.gitignore b/hadoop-tools/hadoop-azure/.gitignore index 0e17efaa1e..522210137e 100644 --- a/hadoop-tools/hadoop-azure/.gitignore +++ b/hadoop-tools/hadoop-azure/.gitignore @@ -1,5 +1,6 @@ .checkstyle bin/ -src/test/resources/combinationConfigFiles src/test/resources/abfs-combination-test-configs.xml dev-support/testlogs +src/test/resources/accountSettings/* +!src/test/resources/accountSettings/accountName_settings.xml.template diff --git a/hadoop-tools/hadoop-azure/dev-support/testrun-scripts/runtests.sh b/hadoop-tools/hadoop-azure/dev-support/testrun-scripts/runtests.sh index 25d9593d57..400d0a2383 100755 --- a/hadoop-tools/hadoop-azure/dev-support/testrun-scripts/runtests.sh +++ b/hadoop-tools/hadoop-azure/dev-support/testrun-scripts/runtests.sh @@ -2,7 +2,7 @@ # shellcheck disable=SC2034 # unused variables are global in nature and used in testsupport.sh - +test set -eo pipefail # Licensed to the Apache Software Foundation (ASF) under one or more @@ -22,36 +22,154 @@ set -eo pipefail # shellcheck disable=SC1091 . dev-support/testrun-scripts/testsupport.sh +init -begin +resourceDir=src/test/resources/ +logdir=dev-support/testlogs/ +azureTestXml=azure-auth-keys.xml +azureTestXmlPath=$resourceDir$azureTestXml +processCount=8 -### ADD THE TEST COMBINATIONS BELOW. DO NOT EDIT THE ABOVE LINES. -### THE SCRIPT REQUIRES THE FOLLOWING UTILITIES xmlstarlet AND pcregrep. +## SECTION: TEST COMBINATION METHODS +runHNSOAuthTest() +{ + accountName=$(xmlstarlet sel -t -v '//property[name = "fs.azure.hnsTestAccountName"]/value' -n $azureTestXmlPath) + PROPERTIES=("fs.azure.account.auth.type") + VALUES=("OAuth") + triggerRun "HNS-OAuth" "$accountName" "$runTest" $processCount "$cleanUpTestContainers" +} -combination=HNS-OAuth -properties=("fs.azure.abfs.account.name" "fs.azure.test.namespace.enabled" -"fs.azure.account.auth.type") -values=("{account name}.dfs.core.windows.net" "true" "OAuth") -generateconfigs +runHNSSharedKeyTest() +{ + accountName=$(xmlstarlet sel -t -v '//property[name = "fs.azure.hnsTestAccountName"]/value' -n $azureTestXmlPath) + PROPERTIES=("fs.azure.account.auth.type") + VALUES=("SharedKey") + triggerRun "HNS-SharedKey" "$accountName" "$runTest" $processCount "$cleanUpTestContainers" +} -combination=AppendBlob-HNS-OAuth -properties=("fs.azure.abfs.account.name" "fs.azure.test.namespace.enabled" -"fs.azure.account.auth.type" "fs.azure.test.appendblob.enabled") -values=("{account name}.dfs.core.windows.net" "true" "OAuth" "true") -generateconfigs +runNonHNSSharedKeyTest() +{ + accountName=$(xmlstarlet sel -t -v '//property[name = "fs.azure.nonHnsTestAccountName"]/value' -n $azureTestXmlPath) + PROPERTIES=("fs.azure.account.auth.type") + VALUES=("SharedKey") + triggerRun "NonHNS-SharedKey" "$accountName" "$runTest" $processCount "$cleanUpTestContainers" +} -combination=HNS-SharedKey -properties=("fs.azure.abfs.account.name" "fs.azure.test.namespace.enabled" "fs.azure.account.auth.type") -values=("{account name}.dfs.core.windows.net" "true" "SharedKey") -generateconfigs +runAppendBlobHNSOAuthTest() +{ + accountName=$(xmlstarlet sel -t -v '//property[name = "fs.azure.hnsTestAccountName"]/value' -n $azureTestXmlPath) + PROPERTIES=("fs.azure.account.auth.type" "fs.azure.test.appendblob.enabled") + VALUES=("OAuth" "true") + triggerRun "AppendBlob-HNS-OAuth" "$accountName" "$runTest" $processCount "$cleanUpTestContainers" +} -combination=NonHNS-SharedKey -properties=("fs.azure.abfs.account.name" "fs.azure.test.namespace.enabled" "fs.azure.account.auth.type") -values=("{account name}.dfs.core.windows.net" "false" "SharedKey") -generateconfigs +runTest=false +cleanUpTestContainers=false +echo 'Ensure below are complete before running script:' +echo '1. Account specific settings file is present.' +echo ' Copy accountName_settings.xml.template to accountName_settings.xml' +echo ' where accountName in copied file name should be the test account name without domain' +echo ' (accountName_settings.xml.template is present in src/test/resources/accountName_settings' +echo ' folder. New account settings file to be added to same folder.)' +echo ' Follow instructions in the template to populate settings correctly for the account' +echo '2. In azure-auth-keys.xml, update properties fs.azure.hnsTestAccountName and fs.azure.nonHnsTestAccountName' +echo ' where accountNames should be the test account names without domain' +echo ' ' +echo ' ' +echo 'Choose action:' +echo '[Note - SET_ACTIVE_TEST_CONFIG will help activate the config for IDE/single test class runs]' +select scriptMode in SET_ACTIVE_TEST_CONFIG RUN_TEST CLEAN_UP_OLD_TEST_CONTAINERS SET_OR_CHANGE_TEST_ACCOUNT PRINT_LOG4J_LOG_PATHS_FROM_LAST_RUN +do + case $scriptMode in + SET_ACTIVE_TEST_CONFIG) + runTest=false + break + ;; + RUN_TEST) + runTest=true + read -r -p "Enter parallel test run process count [default - 8]: " processCount + processCount=${processCount:-8} + break + ;; + CLEAN_UP_OLD_TEST_CONTAINERS) + runTest=false + cleanUpTestContainers=true + break + ;; + SET_OR_CHANGE_TEST_ACCOUNT) + runTest=false + cleanUpTestContainers=false + accountSettingsFile="src/test/resources/azure-auth-keys.xml" + if [[ ! -f "$accountSettingsFile" ]]; + then + logOutput "No settings present. Creating new settings file ($accountSettingsFile) from template" + cp src/test/resources/azure-auth-keys.xml.template $accountSettingsFile + fi + vi $accountSettingsFile + exit 0 + break + ;; + PRINT_LOG4J_LOG_PATHS_FROM_LAST_RUN) + runTest=false + cleanUpTestContainers=false + logFilePaths=/tmp/logPaths + find target/ -name "*output.txt" > $logFilePaths + logOutput "$(cat $logFilePaths)" + rm $logFilePaths + exit 0 + break + ;; + *) logOutput "ERROR: Invalid selection" + ;; + esac +done -### DO NOT EDIT THE LINES BELOW. +## SECTION: COMBINATION DEFINITIONS AND TRIGGER -runtests "$@" +echo ' ' +echo 'Set the active test combination to run the action:' +select combo in HNS-OAuth HNS-SharedKey nonHNS-SharedKey AppendBlob-HNS-OAuth AllCombinationsTestRun Quit +do + case $combo in + HNS-OAuth) + runHNSOAuthTest + break + ;; + HNS-SharedKey) + runHNSSharedKeyTest + break + ;; + nonHNS-SharedKey) + runNonHNSSharedKeyTest + break + ;; + AppendBlob-HNS-OAuth) + runAppendBlobHNSOAuthTest + break + ;; + AllCombinationsTestRun) + if [ $runTest == false ] + then + logOutput "ERROR: Invalid selection for SET_ACTIVE_TEST_CONFIG. This is applicable only for RUN_TEST." + break + fi + runHNSOAuthTest + runHNSSharedKeyTest + runNonHNSSharedKeyTest + runAppendBlobHNSOAuthTest ## Keep this as the last run scenario always + break + ;; + Quit) + exit 0 + ;; + *) logOutput "ERROR: Invalid selection" + ;; + esac +done + +if [ $runTest == true ] +then + printAggregate +fi diff --git a/hadoop-tools/hadoop-azure/dev-support/testrun-scripts/testsupport.sh b/hadoop-tools/hadoop-azure/dev-support/testrun-scripts/testsupport.sh index 1b118ae1e8..28f96edd27 100644 --- a/hadoop-tools/hadoop-azure/dev-support/testrun-scripts/testsupport.sh +++ b/hadoop-tools/hadoop-azure/dev-support/testrun-scripts/testsupport.sh @@ -15,117 +15,88 @@ # See the License for the specific language governing permissions and # limitations under the License. -testresourcesdir=src/test/resources -combconfsdir=$testresourcesdir/combinationConfigFiles -combtestfile=$testresourcesdir/abfs-combination-test-configs.xml +resourceDir=src/test/resources/ +accountSettingsFolderName=accountSettings +combtestfile=$resourceDir +combtestfile+=abfs-combination-test-configs.xml +logdir=dev-support/testlogs/ -logdir=dev-support/testlogs testresultsregex="Results:(\n|.)*?Tests run:" -testresultsfilename= -starttime= -threadcount= -defaultthreadcount=8 +accountConfigFileSuffix="_settings.xml" +testOutputLogFolder=$logdir +testlogfilename=combinationTestLogFile -properties= -values= +fullRunStartTime=$(date +%s) +STARTTIME=$(date +%s) +ENDTIME=$(date +%s) -validate() { - if [ -z "$threadcount" ] ; then - threadcount=$defaultthreadcount - fi - numberegex='^[0-9]+$' - if ! [[ $threadcount =~ $numberegex ]] ; then - echo "Exiting. The script param (threadcount) should be a number" - exit -1 - fi - if [ -z "$combination" ]; then - echo "Exiting. combination cannot be empty" - exit -1 - fi - propertiessize=${#properties[@]} - valuessize=${#values[@]} - if [ "$propertiessize" -lt 1 ] || [ "$valuessize" -lt 1 ] || [ "$propertiessize" -ne "$valuessize" ]; then - echo "Exiting. Both properties and values arrays has to be populated and of same size. Please check for combination $combination" - exit -1 - fi - - for filename in "${combinations[@]}"; do - if [[ ! -f "$combconfsdir/$filename.xml" ]]; then - echo "Exiting. Combination config file ($combconfsdir/$combination.xml) does not exist." - exit -1 - fi - done -} - -checkdependencies() { - if ! [ "$(command -v pcregrep)" ]; then - echo "Exiting. pcregrep is required to run the script." - exit -1 - fi - if ! [ "$(command -v xmlstarlet)" ]; then - echo "Exiting. xmlstarlet is required to run the script." - exit -1 - fi -} - -cleancombinationconfigs() { - rm -rf $combconfsdir - mkdir -p $combconfsdir -} - -generateconfigs() { - combconffile="$combconfsdir/$combination.xml" - rm -rf "$combconffile" - cat > "$combconffile" << ENDOFFILE - - - -ENDOFFILE - - propertiessize=${#properties[@]} - valuessize=${#values[@]} - if [ "$propertiessize" -ne "$valuessize" ]; then - echo "Exiting. Number of properties and values differ for $combination" - exit -1 - fi - for ((i = 0; i < propertiessize; i++)); do - key=${properties[$i]} - val=${values[$i]} - changeconf "$key" "$val" - done - formatxml "$combconffile" -} - -formatxml() { - xmlstarlet fo -s 2 "$1" > "$1.tmp" - mv "$1.tmp" "$1" -} - -setactiveconf() { - if [[ ! -f "$combconfsdir/$combination.xml" ]]; then - echo "Exiting. Combination config file ($combconfsdir/$combination.xml) does not exist." - exit -1 +outputFormatOn="\033[0;95m" +outputFormatOff="\033[0m" + +triggerRun() +{ + echo ' ' + combination=$1 + accountName=$2 + runTest=$3 + processcount=$4 + cleanUpTestContainers=$5 + + if [ -z "$accountName" ]; then + logOutput "ERROR: Test account not configured. Re-run the script and choose SET_OR_CHANGE_TEST_ACCOUNT to configure the test account." + exit 1; fi + accountConfigFile=$accountSettingsFolderName/$accountName$accountConfigFileSuffix rm -rf $combtestfile cat > $combtestfile << ENDOFFILE ENDOFFILE + propertiessize=${#PROPERTIES[@]} + valuessize=${#VALUES[@]} + if [ "$propertiessize" -ne "$valuessize" ]; then + logOutput "Exiting. Number of properties and values differ for $combination" + exit 1 + fi + for ((i = 0; i < propertiessize; i++)); do + key=${PROPERTIES[$i]} + val=${VALUES[$i]} + echo "Combination specific property setting: [ key=$key , value=$val ]" + changeconf "$key" "$val" + done + formatxml "$combtestfile" xmlstarlet ed -P -L -s /configuration -t elem -n include -v "" $combtestfile - xmlstarlet ed -P -L -i /configuration/include -t attr -n href -v "combinationConfigFiles/$combination.xml" $combtestfile + xmlstarlet ed -P -L -i /configuration/include -t attr -n href -v "$accountConfigFile" $combtestfile xmlstarlet ed -P -L -i /configuration/include -t attr -n xmlns -v "http://www.w3.org/2001/XInclude" $combtestfile formatxml $combtestfile -} + echo ' ' + echo "Activated [$combtestfile] - for account: $accountName for combination $combination" + testlogfilename="$testOutputLogFolder/Test-Logs-$combination.txt" + touch "$testlogfilename" -changeconf() { - xmlstarlet ed -P -L -d "/configuration/property[name='$1']" "$combconffile" - xmlstarlet ed -P -L -s /configuration -t elem -n propertyTMP -v "" -s /configuration/propertyTMP -t elem -n name -v "$1" -r /configuration/propertyTMP -v property "$combconffile" - if ! xmlstarlet ed -P -L -s "/configuration/property[name='$1']" -t elem -n value -v "$2" "$combconffile" + if [ "$runTest" == true ] then - echo "Exiting. Changing config property failed." - exit -1 + STARTTIME=$(date +%s) + echo "Running test for combination $combination on account $accountName [ProcessCount=$processcount]" + logOutput "Test run report can be seen in $testlogfilename" + mvn -T 1C -Dparallel-tests=abfs -Dscale -DtestsThreadCount="$processcount" verify >> "$testlogfilename" || true + ENDTIME=$(date +%s) + summary fi + + if [ "$cleanUpTestContainers" == true ] + then + mvn test -Dtest=org.apache.hadoop.fs.azurebfs.utils.CleanupTestContainers >> "$testlogfilename" || true + if grep -q "There are test failures" "$testlogfilename"; + then logOutput "ERROR: All test containers could not be deleted. Detailed error cause in $testlogfilename" + pcregrep -M "$testresultsregex" "$testlogfilename" + exit 0 + fi + + logOutput "Delete test containers - complete. Test run logs in - $testlogfilename" + fi + } summary() { @@ -134,17 +105,42 @@ summary() { echo "$combination" echo "========================" pcregrep -M "$testresultsregex" "$testlogfilename" - } >> "$testresultsfilename" + } >> "$aggregatedTestResult" printf "\n----- Test results -----\n" pcregrep -M "$testresultsregex" "$testlogfilename" - secondstaken=$((ENDTIME - STARTTIME)) mins=$((secondstaken / 60)) secs=$((secondstaken % 60)) printf "\nTime taken: %s mins %s secs.\n" "$mins" "$secs" - echo "Find test logs for the combination ($combination) in: $testlogfilename" - echo "Find consolidated test results in: $testresultsfilename" - echo "----------" + echo "Find test result for the combination ($combination) in: $testlogfilename" + logOutput "Consolidated test result is saved in: $aggregatedTestResult" + echo "------------------------" +} + +checkdependencies() { + if ! [ "$(command -v pcregrep)" ]; then + logOutput "Exiting. pcregrep is required to run the script." + exit 1 + fi + if ! [ "$(command -v xmlstarlet)" ]; then + logOutput "Exiting. xmlstarlet is required to run the script." + exit 1 + fi +} + +formatxml() { + xmlstarlet fo -s 2 "$1" > "$1.tmp" + mv "$1.tmp" "$1" +} + +changeconf() { + xmlstarlet ed -P -L -d "/configuration/property[name='$1']" "$combtestfile" + xmlstarlet ed -P -L -s /configuration -t elem -n propertyTMP -v "" -s /configuration/propertyTMP -t elem -n name -v "$1" -r /configuration/propertyTMP -v property "$combtestfile" + if ! xmlstarlet ed -P -L -s "/configuration/property[name='$1']" -t elem -n value -v "$2" "$combtestfile" + then + logOutput "Exiting. Changing config property failed." + exit 1 + fi } init() { @@ -153,89 +149,24 @@ init() { then echo "" echo "Exiting. Build failed." - exit -1 - fi - starttime=$(date +"%Y-%m-%d_%H-%M-%S") - mkdir -p "$logdir" - testresultsfilename="$logdir/$starttime/Test-Results.txt" - if [[ -z "$combinations" ]]; then - combinations=( $( ls $combconfsdir/*.xml )) - fi -} - -runtests() { - parseoptions "$@" - validate - if [ -z "$starttime" ]; then - init - fi - shopt -s nullglob - for combconffile in "${combinations[@]}"; do - STARTTIME=$(date +%s) - combination=$(basename "$combconffile" .xml) - mkdir -p "$logdir/$starttime" - testlogfilename="$logdir/$starttime/Test-Logs-$combination.txt" - printf "\nRunning the combination: %s..." "$combination" - setactiveconf - mvn -T 1C -Dparallel-tests=abfs -Dscale -DtestsThreadCount=$threadcount verify >> "$testlogfilename" || true - ENDTIME=$(date +%s) - summary - done -} - -begin() { - cleancombinationconfigs -} - -parseoptions() { -runactivate=0 -runtests=0 - while getopts ":c:a:t:" option; do - case "${option}" in - a) - if [[ "$runactivate" -eq "1" ]]; then - echo "-a Option is not multivalued" - exit 1 - fi - runactivate=1 - combination=$(basename "$OPTARG" .xml) - ;; - c) - runtests=1 - combination=$(basename "$OPTARG" .xml) - combinations+=("$combination") - ;; - t) - threadcount=$OPTARG - ;; - *|?|h) - if [[ -z "$combinations" ]]; then - combinations=( $( ls $combconfsdir/*.xml )) - fi - combstr="" - for combconffile in "${combinations[@]}"; do - combname=$(basename "$combconffile" .xml) - combstr="${combname}, ${combstr}" - done - combstr=${combstr:0:-2} - - echo "Usage: $0 [-n] [-a COMBINATION_NAME] [-c COMBINATION_NAME] [-t THREAD_COUNT]" - echo "" - echo "Where:" - echo " -a COMBINATION_NAME Specify the combination name which needs to be activated." - echo " Configured combinations: ${combstr}" - echo " -c COMBINATION_NAME Specify the combination name for test runs" - echo " -t THREAD_COUNT Specify the thread count" - exit 1 - ;; - esac - done - if [[ "$runactivate" -eq "1" && "$runtests" -eq "1" ]]; then - echo "Both activate (-a option) and test run combinations (-c option) cannot be specified together" exit 1 fi - if [[ "$runactivate" -eq "1" ]]; then - setactiveconf - exit 0 - fi + starttime=$(date +"%Y-%m-%d_%H-%M-%S") + testOutputLogFolder+=$starttime + mkdir -p "$testOutputLogFolder" + aggregatedTestResult="$testOutputLogFolder/Test-Results.txt" + } + + printAggregate() { + echo :::: AGGREGATED TEST RESULT :::: + cat "$aggregatedTestResult" + fullRunEndTime=$(date +%s) + fullRunTimeInSecs=$((fullRunEndTime - fullRunStartTime)) + mins=$((fullRunTimeInSecs / 60)) + secs=$((fullRunTimeInSecs % 60)) + printf "\nTime taken: %s mins %s secs.\n" "$mins" "$secs" + } + +logOutput() { + echo -e "$outputFormatOn" "$1" "$outputFormatOff" } diff --git a/hadoop-tools/hadoop-azure/src/site/markdown/testing_azure.md b/hadoop-tools/hadoop-azure/src/site/markdown/testing_azure.md index 933f86be3e..e256fbef54 100644 --- a/hadoop-tools/hadoop-azure/src/site/markdown/testing_azure.md +++ b/hadoop-tools/hadoop-azure/src/site/markdown/testing_azure.md @@ -602,26 +602,76 @@ various test combinations, it will: 2. Run tests for all combinations 3. Summarize results across all the test combination runs. -As a pre-requisite step, fill config values for test accounts and credentials -needed for authentication in `src/test/resources/azure-auth-keys.xml.template` -and rename as `src/test/resources/azure-auth-keys.xml`. +Below are the pre-requiste steps to follow: +1. Copy -**To add a new test combination:** Templates for mandatory test combinations -for PR validation are present in `dev-support/testrun-scripts/runtests.sh`. -If a new one needs to be added, add a combination set within -`dev-support/testrun-scripts/runtests.sh` similar to the ones already defined -and -1. Provide a new combination name -2. Update properties and values array which need to be effective for the test -combination -3. Call generateconfigs + ./src/test/resources/azure-auth-keys.xml.template + TO + ./src/test/resources/azure-auth-keys.xml + Update account names that should be used in the test run for HNS and non-HNS + combinations in the 2 properties present in the xml (account name should be + without domain part), namely + + fs.azure.hnsTestAccountName + fs.azure.nonHnsTestAccountName + azure-auth-keys.xml is listed in .gitignore, so any accidental account name leak is prevented. + +``` +XInclude is supported, so for extra security secrets may be +kept out of the source tree then referenced through an an XInclude element: + + +``` + +2. Create account config files (one config file per account) in folder: + + ./src/test/resources/accountSettings/ + Follow the instruction in the start of the template file + + accountName_settings.xml.template + within accountSettings folder while creating account config file. + New files created in folder accountSettings is listed in .gitignore to + prevent accidental cred leaks. **To run PR validation:** Running command -* `dev-support/testrun-scripts/runtests.sh` will generate configurations for -each of the combinations defined and run tests for all the combinations. -* `dev-support/testrun-scripts/runtests.sh -c {combinationname}` Specific -combinations can be provided with -c option. If combinations are provided -with -c option, tests for only those combinations will be run. +* `dev-support/testrun-scripts/runtests.sh` will prompt as below: +```bash +Choose action: +[Note - SET_ACTIVE_TEST_CONFIG will help activate the config for IDE/single test class runs] +1) SET_ACTIVE_TEST_CONFIG 4) SET_OR_CHANGE_TEST_ACCOUNT +2) RUN_TEST 5) PRINT_LOG4J_LOG_PATHS_FROM_LAST_RUN +3) CLEAN_UP_OLD_TEST_CONTAINERS +#? 2 +``` +Enter 1: for setting active combination for IDE test run/single mvn test class runs. + +Enter 2: for choosing the combination to choose for mvn full test suite. + +Enter 3: For clean-up of any abruptly ending test leaving auto generated test +container on the account. + +Enter 4: To create/modify the config file that decides the account to use for specific test combination. + +Enter 5: To print the log4j paths the last test runs. + +On next prompt, current list of combinations to choose are provided. +Sample for Run_TEST action: +```bash +Enter parallel test run process count [default - 8]: 4 +Set the active test combination to run the action: +1) HNS-OAuth 3) nonHNS-SharedKey 5) AllCombinationsTestRun +2) HNS-SharedKey 4) AppendBlob-HNS-OAuth 6) Quit +#? 1 + +Combination specific property setting: [ key=fs.azure.account.auth.type , value=OAuth ] + +Activated [src/test/resources/abfs-combination-test-configs.xml] - for account: snvijayacontracttest for combination HNS-OAuth +Running test for combination HNS-OAuth on account snvijayacontracttest [ProcessCount=4] +Test run report can be seen in dev-support/testlogs/2022-10-07_05-23-22/Test-Logs-HNS-OAuth.txt +```` + +Provide the option for the action chosen first. **Test logs:** Test runs will create a folder within dev-support/testlogs to save the test logs. Folder name will be the test start timestamp. The mvn verify @@ -632,25 +682,18 @@ consolidated results of all the combination runs will be saved into a file as Test-Results.log in the same folder. When run for PR validation, the consolidated test results needs to be pasted into the PR comment section. -**To generate config for use in IDE:** Running command with -a (activate) option -`dev-support/testrun-scripts/runtests.sh -a {combination name}` will update -the effective config relevant for the specific test combination. Hence the same -config files used by the mvn test runs can be used for IDE without any manual -updates needed within config file. +**To add a new test combination:** Templates for mandatory test combinations +for PR validation are present in `dev-support/testrun-scripts/runtests.sh`. +If a new one needs to be added, add a combination to +`dev-support/testrun-scripts/runtests.sh`. +(Refer to current active combinations within +`SECTION: COMBINATION DEFINITIONS AND TRIGGER` and +`SECTION: TEST COMBINATION METHODS` in the script). -**Other command line options:** -* -a Specify the combination name which needs to be -activated. This is to be used to generate config for use in IDE. -* -c Specify the combination name for test runs. If this -config is specified, tests for only the specified combinations will run. All -combinations of tests will be running if this config is not specified. -* -t ABFS mvn tests are run in parallel mode. Tests by default -are run with 8 thread count. It can be changed by providing -t +**Test Configuration Details:** -In order to test ABFS, please add the following configuration to your -`src/test/resources/azure-auth-keys.xml` file. Note that the ABFS tests include -compatibility tests which require WASB credentials, in addition to the ABFS -credentials. + Note that the ABFS tests include compatibility tests which require WASB + credentials, in addition to the ABFS credentials. ```xml diff --git a/hadoop-tools/hadoop-azure/src/test/java/org/apache/hadoop/fs/azurebfs/utils/CleanupTestContainers.java b/hadoop-tools/hadoop-azure/src/test/java/org/apache/hadoop/fs/azurebfs/utils/CleanupTestContainers.java new file mode 100644 index 0000000000..b8272319ab --- /dev/null +++ b/hadoop-tools/hadoop-azure/src/test/java/org/apache/hadoop/fs/azurebfs/utils/CleanupTestContainers.java @@ -0,0 +1,74 @@ +/* + * 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.hadoop.fs.azurebfs.utils; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.microsoft.azure.storage.CloudStorageAccount; +import com.microsoft.azure.storage.blob.CloudBlobClient; +import com.microsoft.azure.storage.blob.CloudBlobContainer; +import com.microsoft.azure.storage.StorageCredentials; +import com.microsoft.azure.storage.StorageCredentialsAccountAndKey; + +import org.apache.hadoop.fs.azurebfs.AbstractAbfsIntegrationTest; +import org.apache.hadoop.fs.azurebfs.AbfsConfiguration; + +/** + * This looks like a test, but it is really a command to invoke to + * clean up containers created in other test runs. + * + */ +public class CleanupTestContainers extends AbstractAbfsIntegrationTest { + private static final Logger LOG = LoggerFactory.getLogger(CleanupTestContainers.class); + private static final String CONTAINER_PREFIX = "abfs-testcontainer-"; + + public CleanupTestContainers() throws Exception { + } + + @org.junit.Test + public void testDeleteContainers() throws Throwable { + int count = 0; + AbfsConfiguration abfsConfig = getAbfsStore(getFileSystem()).getAbfsConfiguration(); + String accountName = abfsConfig.getAccountName().split("\\.")[0]; + LOG.debug("Deleting test containers in account - {}", abfsConfig.getAccountName()); + + String accountKey = abfsConfig.getStorageAccountKey(); + if ((accountKey == null) || (accountKey.isEmpty())) { + LOG.debug("Clean up not possible. Account ket not present in config"); + } + final StorageCredentials credentials; + credentials = new StorageCredentialsAccountAndKey( + accountName, accountKey); + CloudStorageAccount storageAccount = new CloudStorageAccount(credentials, true); + CloudBlobClient blobClient = storageAccount.createCloudBlobClient(); + Iterable containers + = blobClient.listContainers(CONTAINER_PREFIX); + for (CloudBlobContainer container : containers) { + LOG.info("Container {} URI {}", + container.getName(), + container.getUri()); + if (container.deleteIfExists()) { + count++; + LOG.info("Current deleted test containers count - #{}", count); + } + } + LOG.info("Summary: Deleted {} test containers", count); + } +} diff --git a/hadoop-tools/hadoop-azure/src/test/resources/accountSettings/accountName_settings.xml.template b/hadoop-tools/hadoop-azure/src/test/resources/accountSettings/accountName_settings.xml.template new file mode 100644 index 0000000000..062b2f4bf3 --- /dev/null +++ b/hadoop-tools/hadoop-azure/src/test/resources/accountSettings/accountName_settings.xml.template @@ -0,0 +1,185 @@ + + + + + + + + fs.azure.abfs.account.name + ACCOUNTNAME.dfs.core.windows.net + + + fs.contract.test.fs.abfs + abfs://CONTAINER_NAME@ACCOUNTNAME.dfs.core.windows.net + + + fs.contract.test.fs.abfss + abfss://CONTAINER_NAME@ACCOUNTNAME.dfs.core.windows.net + + + fs.contract.test.fs.wasb + wasb://CONTAINER_NAME@ACCOUNTNAME.blob.core.windows.net + + + fs.azure.wasb.account.name + ACCOUNTNAME.blob.core.windows.net + + + fs.azure.scale.test.enabled + true + + + fs.azure.test.namespace.enabled.ACCOUNTNAME.dfs.core.windows.net + IS_NAMESPACE_ENABLED + + + fs.azure.test.namespace.enabled + IS_NAMESPACE_ENABLED + + + fs.azure.account.hns.enabled.ACCOUNTNAME.dfs.core.windows.net + IS_NAMESPACE_ENABLED + + + fs.azure.account.hns.enabled + IS_NAMESPACE_ENABLED + + + fs.azure.account.key.ACCOUNTNAME.dfs.core.windows.net + ACCOUNT_KEY + + + fs.azure.account.key.ACCOUNTNAME.blob.core.windows.net + ACCOUNT_KEY + + + fs.azure.account.key.ACCOUNTNAME.dfs.core.windows.net + ACCOUNT_KEY + + + fs.azure.account.key.ACCOUNTNAME.blob.core.windows.net + ACCOUNT_KEY + + + + + fs.azure.account.oauth2.client.endpoint.ACCOUNTNAME.dfs.core.windows.net + https://login.microsoftonline.com/SUPERUSER_TENANT_ID/oauth2/token + + + fs.azure.account.oauth2.client.endpoint + https://login.microsoftonline.com/SUPERUSER_TENANT_ID/oauth2/token + + + fs.azure.account.oauth.provider.type.ACCOUNTNAME.dfs.core.windows.net + org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider + + + fs.azure.account.oauth.provider.type + org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider + + + fs.azure.account.oauth2.client.id.ACCOUNTNAME.dfs.core.windows.net + SUPERUSER_CLIENT_ID + + + fs.azure.account.oauth2.client.id + SUPERUSER_CLIENT_ID + + + fs.azure.account.oauth2.client.secret.ACCOUNTNAME.dfs.core.windows.net + SUPERUSER_CLIENT_SECRET + + + fs.azure.account.oauth2.client.secret + SUPERUSER_CLIENT_SECRET + + + + + fs.azure.enable.check.access + true + + + fs.azure.account.test.oauth2.client.id + NO_RBAC_USER_CLIENT_ID + + + fs.azure.account.test.oauth2.client.secret + NO_RBAC_USER_CLIENT_SECRET + + + fs.azure.check.access.testuser.guid + NO_RBAC_USER_OID + + + + + fs.azure.account.oauth2.contributor.client.id + CONTRIBUTOR_RBAC_USER_CLIENT_ID + + + fs.azure.account.oauth2.contributor.client.secret + CONTRIBUTOR_RBAC_USER_CLIENT_SECRET + + + + + fs.azure.account.oauth2.reader.client.id + READER_RBAC_USER_CLIENT_ID + + + fs.azure.account.oauth2.reader.client.secret + READER_RBAC_USER_CLIENT_ID + + diff --git a/hadoop-tools/hadoop-azure/src/test/resources/azure-auth-keys.xml.template b/hadoop-tools/hadoop-azure/src/test/resources/azure-auth-keys.xml.template index 12dbbfab47..636816551d 100644 --- a/hadoop-tools/hadoop-azure/src/test/resources/azure-auth-keys.xml.template +++ b/hadoop-tools/hadoop-azure/src/test/resources/azure-auth-keys.xml.template @@ -14,162 +14,16 @@ --> - - - - - - - fs.azure.account.auth.type - SharedKey - - - - - - fs.azure.account.key.{ABFS_ACCOUNT_NAME}.dfs.core.windows.net - {ACCOUNT_ACCESS_KEY} - Account access key - - - - fs.azure.account.oauth.provider.type.{ABFS_ACCOUNT_NAME}.dfs.core.windows.net - - org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider - OAuth token provider implementation class - - - - fs.azure.account.oauth2.client.endpoint.{ABFS_ACCOUNT_NAME}.dfs.core.windows.net - - https://login.microsoftonline.com/{TENANTID}/oauth2/token - Token end point, this can be found through Azure portal - - - - - fs.azure.account.oauth2.client.id.{ABFS_ACCOUNT_NAME}.dfs.core.windows.net - - {client id} - AAD client id. - - - - fs.azure.account.oauth2.client.secret.{ABFS_ACCOUNT_NAME}.dfs.core.windows.net - - {client secret} - AAD client secret - - - - - fs.contract.test.fs.abfs - abfs://{CONTAINER_NAME}@{ACCOUNT_NAME}.dfs.core.windows.net - - - fs.contract.test.fs.abfss - abfss://{CONTAINER_NAME}@{ACCOUNT_NAME}.dfs.core.windows.net - - - - - fs.azure.wasb.account.name - {WASB_ACCOUNT_NAME}.blob.core.windows.net - - - fs.azure.account.key.{WASB_ACCOUNT_NAME}.blob.core.windows.net - WASB account key - - - fs.contract.test.fs.wasb - wasb://{WASB_FILESYSTEM}@{WASB_ACCOUNT_NAME}.blob.core.windows.net - - - - - - fs.azure.account.oauth2.contributor.client.id - {Client id of SP with RBAC Storage Blob Data Contributor} - - - fs.azure.account.oauth2.contributor.client.secret - {Client secret of SP with RBAC Storage Blob Data Contributor} - - - fs.azure.account.oauth2.reader.client.id - {Client id of SP with RBAC Storage Blob Data Reader} - - - fs.azure.account.oauth2.reader.client.secret - {Client secret of SP with RBAC Storage Blob Data Reader} - - - - + - fs.azure.account.test.oauth2.client.id - {client id} - The client id(app id) for the app created on step 1 - - - - fs.azure.account.test.oauth2.client.secret - {client secret} - -The client secret(application's secret) for the app created on step 1 - - - - fs.azure.check.access.testuser.guid - {guid} - The guid fetched on step 2 - - - fs.azure.account.oauth2.client.endpoint.{account name}.dfs.core -.windows.net - https://login.microsoftonline.com/{TENANTID}/oauth2/token - -Token end point. This can be found through Azure portal. As part of CheckAccess -test cases. The access will be tested for an FS instance created with the -above mentioned client credentials. So this configuration is necessary to -create the test FS instance. - + fs.azure.hnsTestAccountName + - - fs.azure.test.appendblob.enabled - false - If made true, tests will be running under the assumption that - append blob is enabled and the root directory and contract test root - directory will be part of the append blob directories. Should be false for - non-HNS accounts. - + fs.azure.nonHnsTestAccountName + diff --git a/hadoop-tools/hadoop-azure/src/test/resources/azure-test.xml b/hadoop-tools/hadoop-azure/src/test/resources/azure-test.xml index 24ffeb5d10..6730021974 100644 --- a/hadoop-tools/hadoop-azure/src/test/resources/azure-test.xml +++ b/hadoop-tools/hadoop-azure/src/test/resources/azure-test.xml @@ -28,11 +28,8 @@ false - - fs.azure.test.namespace.enabled - true - - + + fs.azure.abfs.latency.track false @@ -43,9 +40,6 @@ true - - - fs.azure.user.agent.prefix @@ -59,7 +53,40 @@ STORE THE CONFIGURATION PROPERTIES WITHIN IT. TO PREVENT ACCIDENTAL LEAKS OF YOUR STORAGE ACCOUNT CREDENTIALS, THIS FILE IS LISTED IN .gitignore TO PREVENT YOU FROM INCLUDING - IT IN PATCHES OR COMMITS. --> + IT IN PATCHES OR COMMITS. + + TEST SCRIPT RUNS: + ================ + FOR EASIER TEST RUNS, TEST RUNS FOR VARIOUS COMBINATIONS CAN BE + TRIGGERED OVER SCRIPT: + ./dev-support/testrun-scripts/runtests.sh + (FROM hadoop-azure ROOT PROJECT PATH) + + TO USE THE TEST SCRIPT, + 1. COPY + ./src/test/resources/azure-auth-keys.xml.template + TO + ./src/test/resources/azure-auth-keys.xml + UPDATE ACCOUNT NAMES THAT SHOULD BE USED IN THE TEST RUN + FOR HNS AND NON-HNS COMBINATIONS IN THE 2 PROPERTIES + PRESENT IN THE XML, NAMELY + fs.azure.hnsTestAccountName and + fs.azure.nonHnsTestAccountName + (ACCOUNT NAME SHOULD BE WITHOUT DOMAIN) + + azure-auth-keys.xml IS LISTED IN .gitignore, SO ANY + ACCIDENTAL ACCOUNT NAME LEAK IS PREVENTED. + + 2. CREATE ACCOUNT CONFIG FILES (ONE CONFIG FILE + PER ACCOUNT) IN FOLDER: + ./src/test/resources/accountSettings/ + + FOLLOW INSTRUCTIONS IN THE START OF THE TEMPLATE FILE + accountName_settings.xml.template + WITHIN accountSettings FOLDER WHILE CREATING ACCOUNT CONFIG FILE. + + NEW FILES CREATED IN FOLDER accountSettings IS LISTED IN .gitignore + TO PREVENT ACCIDENTAL CRED LEAKS. -->