FALCON-2214 Falcon extension registered without fully qualified hdfs …

…path

Author: Praveen Adlakha <adlakha.praveen@gmail.com>

Reviewers: @pallavi-rao

Closes #319 from PraveenAdlakha/2214 and squashes the following commits:

135ca8e [Praveen Adlakha] test cases fixed and merge conflict resolved
98e202d [Praveen Adlakha] FALCON-2214 Falcon extension registered without fully qualified hdfs path
diff --git a/extensions/src/main/java/org/apache/falcon/extensions/store/ExtensionStore.java b/extensions/src/main/java/org/apache/falcon/extensions/store/ExtensionStore.java
index 72d4493..8e4acbe 100644
--- a/extensions/src/main/java/org/apache/falcon/extensions/store/ExtensionStore.java
+++ b/extensions/src/main/java/org/apache/falcon/extensions/store/ExtensionStore.java
@@ -268,10 +268,22 @@
         }
     }
 
+    private void assertURI(String part, String value) throws ValidationException {
+        if (value == null) {
+            String msg = "Invalid Path supplied. " + part + " is missing. "
+                    + " Path must contain scheme, authority and path.";
+            LOG.error(msg);
+            throw new ValidationException(msg);
+        }
+    }
+
     public String registerExtension(final String extensionName, final String path, final String description,
                                     String extensionOwner) throws URISyntaxException, FalconException {
         Configuration conf = new Configuration();
         URI uri = new URI(path);
+        assertURI("Scheme", uri.getScheme());
+        assertURI("Authority", uri.getAuthority());
+        assertURI("Path", uri.getPath());
         conf.set("fs.defaultFS", uri.getScheme() + "://" + uri.getAuthority());
         FileSystem fileSystem = HadoopClientFactory.get().createFalconFileSystem(uri);
         try {
@@ -313,6 +325,7 @@
         } else {
             throw new ValidationException(extensionName + " already exists.");
         }
+        LOG.info("Extension :" + extensionName + " registered successfully.");
         return "Extension :" + extensionName + " registered successfully.";
     }
 
diff --git a/extensions/src/test/java/org/apache/falcon/extensions/store/ExtensionStoreTest.java b/extensions/src/test/java/org/apache/falcon/extensions/store/ExtensionStoreTest.java
index 773fea2..0835f38 100644
--- a/extensions/src/test/java/org/apache/falcon/extensions/store/ExtensionStoreTest.java
+++ b/extensions/src/test/java/org/apache/falcon/extensions/store/ExtensionStoreTest.java
@@ -104,6 +104,13 @@
         }
     }
 
+    @Test(expectedExceptions=ValidationException.class)
+    public void testFailureCaseRegisterExtensionForURL() throws IOException, URISyntaxException, FalconException{
+        store = ExtensionStore.get();
+        createLibs(EXTENSION_PATH);
+        store.registerExtension("test", EXTENSION_PATH, "test desc", "falconUser");
+    }
+
     @Test
     public void testRegisterExtension() throws IOException, URISyntaxException, FalconException {
         String extensionPath = EXTENSION_PATH + "testRegister";
diff --git a/unit/src/test/java/org/apache/falcon/unit/TestFalconUnit.java b/unit/src/test/java/org/apache/falcon/unit/TestFalconUnit.java
index b7a6e39..293bb23 100644
--- a/unit/src/test/java/org/apache/falcon/unit/TestFalconUnit.java
+++ b/unit/src/test/java/org/apache/falcon/unit/TestFalconUnit.java
@@ -30,10 +30,14 @@
 import org.apache.falcon.resource.InstancesResult;
 import org.apache.falcon.resource.InstancesSummaryResult;
 import org.apache.falcon.service.FalconJPAService;
+import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.FileStatus;
+import org.apache.hadoop.fs.FileSystem;
+import org.apache.hadoop.fs.LocalFileSystem;
 import org.apache.hadoop.fs.Path;
 import org.codehaus.jettison.json.JSONObject;
 import org.testng.Assert;
+import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
 import javax.persistence.EntityManager;
@@ -67,6 +71,16 @@
     private static final String SLEEP_WORKFLOW = "sleepWorkflow.xml";
     private static final String EXTENSION_PATH = "/projects/falcon/extension/testExtension";
     public static final String JARS_DIR = "file:///" + System.getProperty("user.dir") + "/src/test/resources";
+    private FileSystem fileSystem;
+
+    private static final String STORAGE_URL = "jail://global:00";
+
+    @BeforeClass
+    public void init() throws IOException{
+        Configuration conf = new Configuration();
+        conf.set("fs.defaultFS", STORAGE_URL);
+        fs.initialize(LocalFileSystem.getDefaultUri(conf), conf);
+    }
 
     @Test
     public void testProcessInstanceExecution() throws Exception {
@@ -407,7 +421,8 @@
         submitCluster();
         createExtensionPackage();
 
-        String result = registerExtension("testExtension", new Path(EXTENSION_PATH).toString(), "testExtension");
+        String result = registerExtension("testExtension", new Path(STORAGE_URL + EXTENSION_PATH).toString()
+                , "testExtension");
         Assert.assertEquals(result, "Extension :testExtension registered successfully.");
 
         result = unregisterExtension("testExtension");
@@ -420,7 +435,7 @@
         submitCluster();
         createExtensionPackage();
         String packageBuildLib = new Path(EXTENSION_PATH, "libs/build/").toString();
-        String result = registerExtension("testExtension", EXTENSION_PATH, "testExtension");
+        String result = registerExtension("testExtension", STORAGE_URL + EXTENSION_PATH, "testExtension");
         Assert.assertEquals(result, "Extension :testExtension registered successfully.");
 
         createDir(PROCESS_APP_PATH);