From b1ec790662a3eca363e74c231f478711a7935524 Mon Sep 17 00:00:00 2001 From: Mingliang Liu Date: Thu, 23 Feb 2017 13:48:44 -0800 Subject: [PATCH] HADOOP-14091. AbstractFileSystem implementaion for 'wasbs' scheme. Contributed Varada Hemeswari. (cherry picked from commit 82607fce39151fc6ba5bced738088e2bc176dc77) --- .../org/apache/hadoop/fs/azure/Wasbs.java | 47 +++++++++++++++ .../fs/azure/TestWasbUriAndConfiguration.java | 57 +++++++++++++++++++ 2 files changed, 104 insertions(+) create mode 100644 hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azure/Wasbs.java diff --git a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azure/Wasbs.java b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azure/Wasbs.java new file mode 100644 index 00000000000..0b4a7824b58 --- /dev/null +++ b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azure/Wasbs.java @@ -0,0 +1,47 @@ +/** + * 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.azure; + +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; + +import org.apache.hadoop.classification.InterfaceAudience; +import org.apache.hadoop.classification.InterfaceStability; +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.fs.DelegateToFileSystem; + +/** + * WASB implementation of AbstractFileSystem for wasbs scheme. + * This impl delegates to the old FileSystem + */ +@InterfaceAudience.Public +@InterfaceStability.Evolving +public class Wasbs extends DelegateToFileSystem { + + Wasbs(final URI theUri, final Configuration conf) throws IOException, + URISyntaxException { + super(theUri, new NativeAzureFileSystem(), conf, "wasbs", false); + } + + @Override + public int getUriDefaultPort() { + return -1; + } +} diff --git a/hadoop-tools/hadoop-azure/src/test/java/org/apache/hadoop/fs/azure/TestWasbUriAndConfiguration.java b/hadoop-tools/hadoop-azure/src/test/java/org/apache/hadoop/fs/azure/TestWasbUriAndConfiguration.java index cd9d1d41dd1..42f5b999cab 100644 --- a/hadoop-tools/hadoop-azure/src/test/java/org/apache/hadoop/fs/azure/TestWasbUriAndConfiguration.java +++ b/hadoop-tools/hadoop-azure/src/test/java/org/apache/hadoop/fs/azure/TestWasbUriAndConfiguration.java @@ -45,6 +45,7 @@ import org.apache.hadoop.fs.AbstractFileSystem; import org.apache.hadoop.fs.FileContext; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; +import org.apache.hadoop.fs.UnsupportedFileSystemException; import org.apache.hadoop.fs.azure.AzureBlobStorageTestAccount.CreateOptions; import org.junit.After; import org.junit.Assert; @@ -458,6 +459,62 @@ public class TestWasbUriAndConfiguration { assertTrue(afs instanceof Wasb); assertEquals(-1, afs.getUri().getPort()); } finally { + testAccount.cleanup(); + FileSystem.closeAll(); + } + } + + /** + * Tests the cases when the scheme specified is 'wasbs'. + */ + @Test + public void testAbstractFileSystemImplementationForWasbsScheme() throws Exception { + try { + testAccount = AzureBlobStorageTestAccount.createMock(); + Configuration conf = testAccount.getFileSystem().getConf(); + String authority = testAccount.getFileSystem().getUri().getAuthority(); + URI defaultUri = new URI("wasbs", authority, null, null, null); + conf.set(FS_DEFAULT_NAME_KEY, defaultUri.toString()); + conf.set("fs.AbstractFileSystem.wasbs.impl", "org.apache.hadoop.fs.azure.Wasbs"); + conf.addResource("azure-test.xml"); + + FileSystem fs = FileSystem.get(conf); + assertTrue(fs instanceof NativeAzureFileSystem); + assertEquals("wasbs", fs.getScheme()); + + AbstractFileSystem afs = FileContext.getFileContext(conf) + .getDefaultFileSystem(); + assertTrue(afs instanceof Wasbs); + assertEquals(-1, afs.getUri().getPort()); + assertEquals("wasbs", afs.getUri().getScheme()); + } finally { + testAccount.cleanup(); + FileSystem.closeAll(); + } + } + + @Test + public void testNoAbstractFileSystemImplementationSpecifiedForWasbsScheme() throws Exception { + try { + testAccount = AzureBlobStorageTestAccount.createMock(); + Configuration conf = testAccount.getFileSystem().getConf(); + String authority = testAccount.getFileSystem().getUri().getAuthority(); + URI defaultUri = new URI("wasbs", authority, null, null, null); + conf.set(FS_DEFAULT_NAME_KEY, defaultUri.toString()); + + FileSystem fs = FileSystem.get(conf); + assertTrue(fs instanceof NativeAzureFileSystem); + assertEquals("wasbs", fs.getScheme()); + + // should throw if 'fs.AbstractFileSystem.wasbs.impl'' is not specified + try{ + FileContext.getFileContext(conf).getDefaultFileSystem(); + fail("Should've thrown."); + }catch(UnsupportedFileSystemException e){ + } + + } finally { + testAccount.cleanup(); FileSystem.closeAll(); } }