Repository: incubator-zeppelin
Updated Branches:
  refs/heads/master fff175f92 -> 86a1a1994


[ZEPPELIN-357] Add support for a configurable list of repo for dependencies

Make it configurable via `zeppelin.dep.additionalRemoteRepository`, with 
spark-packages default. This enables notebook to load dependencies with having 
to add spark-packages each time.

There is a fair bit of overlap between `DependencyResolver` and 
`DependencyContext`, but it appears in order for any custom repo available it 
needs to be in both components. We should discuss how best to address overlaps 
between the two components.

corneadoug
Leemoonsoo

Author: Felix Cheung <[email protected]>

Closes #368 from felixcheung/sparkpackage and squashes the following commits:

207ffb8 [Felix Cheung] Update test - spark-csv is actually on maven central.
dfdb07b [Felix Cheung] add test
eab697b [Felix Cheung] Make custom remote repo configurable


Project: http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/commit/86a1a199
Tree: http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/tree/86a1a199
Diff: http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/diff/86a1a199

Branch: refs/heads/master
Commit: 86a1a199453b3c347e2b4e731463fea1bc5940bd
Parents: fff175f
Author: Felix Cheung <[email protected]>
Authored: Sun Oct 25 17:01:18 2015 -0700
Committer: Lee moon soo <[email protected]>
Committed: Wed Oct 28 13:06:08 2015 +0100

----------------------------------------------------------------------
 .../apache/zeppelin/spark/DepInterpreter.java   |  6 +++-
 .../apache/zeppelin/spark/SparkInterpreter.java |  5 +++-
 .../org/apache/zeppelin/spark/dep/Booter.java   |  5 ++++
 .../zeppelin/spark/dep/DependencyContext.java   | 31 ++++++++++++++++----
 .../zeppelin/spark/dep/DependencyResolver.java  | 24 +++++++++++++--
 .../zeppelin/spark/DepInterpreterTest.java      |  7 +++++
 6 files changed, 68 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/86a1a199/spark/src/main/java/org/apache/zeppelin/spark/DepInterpreter.java
----------------------------------------------------------------------
diff --git a/spark/src/main/java/org/apache/zeppelin/spark/DepInterpreter.java 
b/spark/src/main/java/org/apache/zeppelin/spark/DepInterpreter.java
index 16bd0f0..c4614bf 100644
--- a/spark/src/main/java/org/apache/zeppelin/spark/DepInterpreter.java
+++ b/spark/src/main/java/org/apache/zeppelin/spark/DepInterpreter.java
@@ -68,6 +68,9 @@ public class DepInterpreter extends Interpreter {
         DepInterpreter.class.getName(),
         new InterpreterPropertyBuilder()
             .add("zeppelin.dep.localrepo", "local-repo", "local repository for 
dependency loader")
+            .add("zeppelin.dep.additionalRemoteRepository",
+                
"spark-packages,http://dl.bintray.com/spark-packages/maven,false;";,
+                "A list of 'id,remote-repository-URL,is-snapshot;' for each 
remote repository.")
             .build());
 
   }
@@ -146,7 +149,8 @@ public class DepInterpreter extends Interpreter {
     intp.setContextClassLoader();
     intp.initializeSynchronous();
 
-    depc = new DependencyContext(getProperty("zeppelin.dep.localrepo"));
+    depc = new DependencyContext(getProperty("zeppelin.dep.localrepo"),
+                                 
getProperty("zeppelin.dep.additionalRemoteRepository"));
     completor = new SparkJLineCompletion(intp);
 
     intp.interpret("@transient var _binder = new java.util.HashMap[String, 
Object]()");

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/86a1a199/spark/src/main/java/org/apache/zeppelin/spark/SparkInterpreter.java
----------------------------------------------------------------------
diff --git 
a/spark/src/main/java/org/apache/zeppelin/spark/SparkInterpreter.java 
b/spark/src/main/java/org/apache/zeppelin/spark/SparkInterpreter.java
index a2e31fb..77d4986 100644
--- a/spark/src/main/java/org/apache/zeppelin/spark/SparkInterpreter.java
+++ b/spark/src/main/java/org/apache/zeppelin/spark/SparkInterpreter.java
@@ -228,7 +228,10 @@ public class SparkInterpreter extends Interpreter {
 
   public DependencyResolver getDependencyResolver() {
     if (dep == null) {
-      dep = new DependencyResolver(intp, sc, 
getProperty("zeppelin.dep.localrepo"));
+      dep = new DependencyResolver(intp,
+                                   sc,
+                                   getProperty("zeppelin.dep.localrepo"),
+                                   
getProperty("zeppelin.dep.additionalRemoteRepository"));
     }
     return dep;
   }

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/86a1a199/spark/src/main/java/org/apache/zeppelin/spark/dep/Booter.java
----------------------------------------------------------------------
diff --git a/spark/src/main/java/org/apache/zeppelin/spark/dep/Booter.java 
b/spark/src/main/java/org/apache/zeppelin/spark/dep/Booter.java
index 0533804..ece39c3 100644
--- a/spark/src/main/java/org/apache/zeppelin/spark/dep/Booter.java
+++ b/spark/src/main/java/org/apache/zeppelin/spark/dep/Booter.java
@@ -67,4 +67,9 @@ public class Booter {
   public static RemoteRepository newCentralRepository() {
     return new RemoteRepository("central", "default", 
"http://repo1.maven.org/maven2/";);
   }
+
+  public static RemoteRepository newLocalRepository() {
+    return new RemoteRepository("local",
+        "default", "file://" + System.getProperty("user.home") + 
"/.m2/repository");
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/86a1a199/spark/src/main/java/org/apache/zeppelin/spark/dep/DependencyContext.java
----------------------------------------------------------------------
diff --git 
a/spark/src/main/java/org/apache/zeppelin/spark/dep/DependencyContext.java 
b/spark/src/main/java/org/apache/zeppelin/spark/dep/DependencyContext.java
index f0fd313..0f465f1 100644
--- a/spark/src/main/java/org/apache/zeppelin/spark/dep/DependencyContext.java
+++ b/spark/src/main/java/org/apache/zeppelin/spark/dep/DependencyContext.java
@@ -49,13 +49,13 @@ public class DependencyContext {
   List<File> filesDist = new LinkedList<File>();
   private RepositorySystem system = Booter.newRepositorySystem();
   private RepositorySystemSession session;
-  private RemoteRepository mavenCentral = new RemoteRepository("central",
-      "default", "http://repo1.maven.org/maven2/";);
-  private RemoteRepository mavenLocal = new RemoteRepository("local",
-      "default", "file://" + System.getProperty("user.home") + 
"/.m2/repository");
+  private RemoteRepository mavenCentral = Booter.newCentralRepository();
+  private RemoteRepository mavenLocal = Booter.newLocalRepository();
+  private List<RemoteRepository> additionalRepos = new 
LinkedList<RemoteRepository>();
 
-  public DependencyContext(String localRepoPath) {
+  public DependencyContext(String localRepoPath, String 
additionalRemoteRepository) {
     session =  Booter.newRepositorySystemSession(system, localRepoPath);
+    addRepoFromProperty(additionalRemoteRepository);
   }
 
   public Dependency load(String lib) {
@@ -82,6 +82,24 @@ public class DependencyContext {
     filesDist = new LinkedList<File>();
   }
 
+  private void addRepoFromProperty(String listOfRepo) {
+    if (listOfRepo != null) {
+      String[] repos = listOfRepo.split(";");
+      for (String repo : repos) {
+        String[] parts = repo.split(",");
+        if (parts.length == 3) {
+          String id = parts[0].trim();
+          String url = parts[1].trim();
+          boolean isSnapshot = Boolean.parseBoolean(parts[2].trim());
+          if (id.length() > 1 && url.length() > 1) {
+            RemoteRepository rr = new RemoteRepository(id, "default", url);
+            rr.setPolicy(isSnapshot, null);
+            additionalRepos.add(rr);
+          }
+        }
+      }
+    }
+  }
 
   /**
    * fetch all artifacts
@@ -129,6 +147,9 @@ public class DependencyContext {
 
     collectRequest.addRepository(mavenCentral);
     collectRequest.addRepository(mavenLocal);
+    for (RemoteRepository repo : additionalRepos) {
+      collectRequest.addRepository(repo);
+    }
     for (Repository repo : repositories) {
       RemoteRepository rr = new RemoteRepository(repo.getName(), "default", 
repo.getUrl());
       rr.setPolicy(repo.isSnapshot(), null);

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/86a1a199/spark/src/main/java/org/apache/zeppelin/spark/dep/DependencyResolver.java
----------------------------------------------------------------------
diff --git 
a/spark/src/main/java/org/apache/zeppelin/spark/dep/DependencyResolver.java 
b/spark/src/main/java/org/apache/zeppelin/spark/dep/DependencyResolver.java
index 0702948..0a30530 100644
--- a/spark/src/main/java/org/apache/zeppelin/spark/dep/DependencyResolver.java
+++ b/spark/src/main/java/org/apache/zeppelin/spark/dep/DependencyResolver.java
@@ -83,14 +83,15 @@ public class DependencyResolver {
                                                     
"org.apache.zeppelin:zeppelin-spark",
                                                     
"org.apache.zeppelin:zeppelin-server"};
 
-  public DependencyResolver(SparkIMain intp, SparkContext sc, String 
localRepoPath) {
+  public DependencyResolver(SparkIMain intp, SparkContext sc, String 
localRepoPath,
+                            String additionalRemoteRepository) {
     this.intp = intp;
     this.global = intp.global();
     this.sc = sc;
     session = Booter.newRepositorySystemSession(system, localRepoPath);
     repos.add(Booter.newCentralRepository()); // add maven central
-    repos.add(new RemoteRepository("local", "default", "file://"
-        + System.getProperty("user.home") + "/.m2/repository"));
+    repos.add(Booter.newLocalRepository());
+    addRepoFromProperty(additionalRemoteRepository);
   }
 
   public void addRepo(String id, String url, boolean snapshot) {
@@ -116,6 +117,23 @@ public class DependencyResolver {
     return null;
   }
 
+  private void addRepoFromProperty(String listOfRepo) {
+    if (listOfRepo != null) {
+      String[] repos = listOfRepo.split(";");
+      for (String repo : repos) {
+        String[] parts = repo.split(",");
+        if (parts.length == 3) {
+          String id = parts[0].trim();
+          String url = parts[1].trim();
+          boolean isSnapshot = Boolean.parseBoolean(parts[2].trim());
+          if (id.length() > 1 && url.length() > 1) {
+            addRepo(id, url, isSnapshot);
+          }
+        }
+      }
+    }
+  }
+
   private void updateCompilerClassPath(URL[] urls) throws 
IllegalAccessException,
       IllegalArgumentException, InvocationTargetException {
 

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/86a1a199/spark/src/test/java/org/apache/zeppelin/spark/DepInterpreterTest.java
----------------------------------------------------------------------
diff --git 
a/spark/src/test/java/org/apache/zeppelin/spark/DepInterpreterTest.java 
b/spark/src/test/java/org/apache/zeppelin/spark/DepInterpreterTest.java
index 6adaa14..efa8fae 100644
--- a/spark/src/test/java/org/apache/zeppelin/spark/DepInterpreterTest.java
+++ b/spark/src/test/java/org/apache/zeppelin/spark/DepInterpreterTest.java
@@ -90,5 +90,12 @@ public class DepInterpreterTest {
 
     assertEquals(1, dep.getDependencyContext().getFiles().size());
     assertEquals(1, dep.getDependencyContext().getFilesDist().size());
+
+    // Add a test for the spark-packages repo - default in 
additionalRemoteRepository
+    ret = dep.interpret("z.load(\"amplab:spark-indexedrdd:0.3\")", context);
+    assertEquals(Code.SUCCESS, ret.code());
+
+    // Reset at the end of the test
+    dep.getDependencyContext().reset();
   }
 }

Reply via email to