HADOOP-16706. ITestClientUrlScheme fails for accounts which don't support HTTP
Adds a new service code to recognise accounts without HTTP support; catches that and considers such a responset a successful validation of the ability of the client to switch to http when the test parameters expect that. Contributed by Steve Loughran
This commit is contained in:
parent
7f35676f90
commit
e3bba5fa22
|
@ -46,6 +46,7 @@ public enum AzureServiceErrorCode {
|
||||||
EGRESS_OVER_ACCOUNT_LIMIT(null, HttpURLConnection.HTTP_UNAVAILABLE, "Egress is over the account limit."),
|
EGRESS_OVER_ACCOUNT_LIMIT(null, HttpURLConnection.HTTP_UNAVAILABLE, "Egress is over the account limit."),
|
||||||
INVALID_QUERY_PARAMETER_VALUE("InvalidQueryParameterValue", HttpURLConnection.HTTP_BAD_REQUEST, null),
|
INVALID_QUERY_PARAMETER_VALUE("InvalidQueryParameterValue", HttpURLConnection.HTTP_BAD_REQUEST, null),
|
||||||
AUTHORIZATION_PERMISSION_MISS_MATCH("AuthorizationPermissionMismatch", HttpURLConnection.HTTP_FORBIDDEN, null),
|
AUTHORIZATION_PERMISSION_MISS_MATCH("AuthorizationPermissionMismatch", HttpURLConnection.HTTP_FORBIDDEN, null),
|
||||||
|
ACCOUNT_REQUIRES_HTTPS("AccountRequiresHttps", HttpURLConnection.HTTP_BAD_REQUEST, null),
|
||||||
UNKNOWN(null, -1, null);
|
UNKNOWN(null, -1, null);
|
||||||
|
|
||||||
private final String errorCode;
|
private final String errorCode;
|
||||||
|
|
|
@ -29,6 +29,8 @@ import org.junit.runner.RunWith;
|
||||||
import org.junit.runners.Parameterized;
|
import org.junit.runners.Parameterized;
|
||||||
|
|
||||||
import org.apache.hadoop.conf.Configuration;
|
import org.apache.hadoop.conf.Configuration;
|
||||||
|
import org.apache.hadoop.fs.azurebfs.contracts.exceptions.AbfsRestOperationException;
|
||||||
|
import org.apache.hadoop.fs.azurebfs.contracts.services.AzureServiceErrorCode;
|
||||||
import org.apache.hadoop.fs.azurebfs.services.AbfsClient;
|
import org.apache.hadoop.fs.azurebfs.services.AbfsClient;
|
||||||
import org.apache.hadoop.fs.CommonConfigurationKeysPublic;
|
import org.apache.hadoop.fs.CommonConfigurationKeysPublic;
|
||||||
import org.apache.hadoop.fs.azurebfs.constants.FileSystemUriSchemes;
|
import org.apache.hadoop.fs.azurebfs.constants.FileSystemUriSchemes;
|
||||||
|
@ -81,8 +83,25 @@ public class ITestClientUrlScheme extends AbstractAbfsIntegrationTest{
|
||||||
Configuration config = getRawConfiguration();
|
Configuration config = getRawConfiguration();
|
||||||
config.set(CommonConfigurationKeysPublic.FS_DEFAULT_NAME_KEY, fsUrl.toString());
|
config.set(CommonConfigurationKeysPublic.FS_DEFAULT_NAME_KEY, fsUrl.toString());
|
||||||
config.setBoolean(FS_AZURE_ALWAYS_USE_HTTPS, alwaysUseHttps);
|
config.setBoolean(FS_AZURE_ALWAYS_USE_HTTPS, alwaysUseHttps);
|
||||||
|
// HTTP is enabled only when "abfs://XXX" is used and FS_AZURE_ALWAYS_USE_HTTPS
|
||||||
|
// is set as false, otherwise HTTPS should be used.
|
||||||
|
boolean expectHttpConnection = !useSecureScheme && !alwaysUseHttps;
|
||||||
|
|
||||||
AbfsClient client = this.getFileSystem(config).getAbfsClient();
|
AbfsClient client = null;
|
||||||
|
try {
|
||||||
|
client = this.getFileSystem(config).getAbfsClient();
|
||||||
|
} catch (AbfsRestOperationException e) {
|
||||||
|
if (AzureServiceErrorCode.ACCOUNT_REQUIRES_HTTPS.equals(e.getErrorCode())
|
||||||
|
&& expectHttpConnection) {
|
||||||
|
// if we get here, the error message was the account supports HTTPS only
|
||||||
|
// and this parameterized test is trying to create an HTTP one.
|
||||||
|
// we can implicitly infer that the scheme setup went through,
|
||||||
|
// otherwise it would not have been rejected at the far end
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Field baseUrlField = AbfsClient.class.
|
Field baseUrlField = AbfsClient.class.
|
||||||
getDeclaredField("baseUrl");
|
getDeclaredField("baseUrl");
|
||||||
|
@ -90,9 +109,7 @@ public class ITestClientUrlScheme extends AbstractAbfsIntegrationTest{
|
||||||
|
|
||||||
String url = ((URL) baseUrlField.get(client)).toString();
|
String url = ((URL) baseUrlField.get(client)).toString();
|
||||||
|
|
||||||
// HTTP is enabled only when "abfs://XXX" is used and FS_AZURE_ALWAYS_USE_HTTPS
|
if (expectHttpConnection) {
|
||||||
// is set as false, otherwise HTTPS should be used.
|
|
||||||
if (!useSecureScheme && !alwaysUseHttps) {
|
|
||||||
Assert.assertTrue(url.startsWith(FileSystemUriSchemes.HTTP_SCHEME));
|
Assert.assertTrue(url.startsWith(FileSystemUriSchemes.HTTP_SCHEME));
|
||||||
} else {
|
} else {
|
||||||
Assert.assertTrue(url.startsWith(FileSystemUriSchemes.HTTPS_SCHEME));
|
Assert.assertTrue(url.startsWith(FileSystemUriSchemes.HTTPS_SCHEME));
|
||||||
|
|
Loading…
Reference in New Issue