azkaban-developers

Run single server from IDEA (#1423) * Run single server from

9/7/2017 12:56:15 PM

Details

.gitignore 3(+2 -1)

diff --git a/.gitignore b/.gitignore
index 2f68112..ec34c0c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,7 +13,8 @@ Gemfile.lock
 vendor/
 **/velocity.log
 
-# temp directory is ignored so that it can be used to store temporary files such as local testing configurations.
+# local & temp directories are ignored so that they can be used to store temporary files such as local testing configurations.
+local/
 temp/
 
 # Intellij files
diff --git a/azkaban-common/src/main/java/azkaban/Constants.java b/azkaban-common/src/main/java/azkaban/Constants.java
index a1d2d3a..3ecaf78 100644
--- a/azkaban-common/src/main/java/azkaban/Constants.java
+++ b/azkaban-common/src/main/java/azkaban/Constants.java
@@ -37,6 +37,7 @@ public class Constants {
   public static final String AZKABAN_PRIVATE_PROPERTIES_FILE = "azkaban.private.properties";
   public static final String DEFAULT_CONF_PATH = "conf";
   public static final String AZKABAN_EXECUTOR_PORT_FILENAME = "executor.port";
+  public static final String AZKABAN_EXECUTOR_PORT_FILE = "executor.portfile";
 
   public static final String AZKABAN_SERVLET_CONTEXT_KEY = "azkaban_app";
 
diff --git a/azkaban-exec-server/src/main/java/azkaban/execapp/AzkabanExecutorServer.java b/azkaban-exec-server/src/main/java/azkaban/execapp/AzkabanExecutorServer.java
index 18e1a4d..49fa145 100644
--- a/azkaban-exec-server/src/main/java/azkaban/execapp/AzkabanExecutorServer.java
+++ b/azkaban-exec-server/src/main/java/azkaban/execapp/AzkabanExecutorServer.java
@@ -273,8 +273,10 @@ public class AzkabanExecutorServer {
 
   private void dumpPortToFile() throws IOException {
     // By default this should write to the working directory
+    final String portFile = this.props
+        .getString(Constants.AZKABAN_EXECUTOR_PORT_FILE, AZKABAN_EXECUTOR_PORT_FILENAME);
     try (BufferedWriter writer = Files
-        .newBufferedWriter(Paths.get(AZKABAN_EXECUTOR_PORT_FILENAME), StandardCharsets.UTF_8)) {
+        .newBufferedWriter(Paths.get(portFile), StandardCharsets.UTF_8)) {
       writer.write(String.valueOf(getPort()));
       writer.write("\n");
     } catch (final IOException e) {
diff --git a/azkaban-solo-server/src/main/java/azkaban/soloserver/AzkabanSingleServer.java b/azkaban-solo-server/src/main/java/azkaban/soloserver/AzkabanSingleServer.java
index 60f65f4..f920705 100644
--- a/azkaban-solo-server/src/main/java/azkaban/soloserver/AzkabanSingleServer.java
+++ b/azkaban-solo-server/src/main/java/azkaban/soloserver/AzkabanSingleServer.java
@@ -30,6 +30,9 @@ import azkaban.webapp.AzkabanWebServerModule;
 import com.google.inject.Guice;
 import javax.inject.Inject;
 import com.google.inject.Injector;
+import java.io.File;
+import java.io.IOException;
+import org.apache.commons.io.FileUtils;
 import org.apache.log4j.Logger;
 
 
@@ -47,9 +50,13 @@ public class AzkabanSingleServer {
     this.executor = executor;
   }
 
-  public static void main(final String[] args) throws Exception {
+  public static void main(String[] args) throws Exception {
     log.info("Starting Azkaban Server");
 
+    if (args.length == 0) {
+      args = prepareDefaultConf();
+    }
+
     final Props props = AzkabanServer.loadProps(args);
     if (props == null) {
       log.error("Properties not found. Need it to connect to the db.");
@@ -76,6 +83,20 @@ public class AzkabanSingleServer {
     injector.getInstance(AzkabanSingleServer.class).launch();
   }
 
+  /**
+   * To enable "run out of the box for testing".
+   */
+  private static String[] prepareDefaultConf() throws IOException {
+    final File templateFolder = new File("test/local-conf-templates");
+    final File localConfFolder = new File("local/conf");
+    if (!localConfFolder.exists()) {
+      FileUtils.copyDirectory(templateFolder, localConfFolder.getParentFile());
+      log.info("Copied local conf templates from " + templateFolder.getAbsolutePath());
+    }
+    log.info("Using conf at " + localConfFolder.getAbsolutePath());
+    return new String[]{"-conf", "local/conf"};
+  }
+
   private void launch() throws Exception {
     AzkabanWebServer.launch(this.webServer);
     log.info("Azkaban Web Server started...");
diff --git a/azkaban-solo-server/src/main/resources/log4j.properties b/azkaban-solo-server/src/main/resources/log4j.properties
index 2db62b2..6a04829 100644
--- a/azkaban-solo-server/src/main/resources/log4j.properties
+++ b/azkaban-solo-server/src/main/resources/log4j.properties
@@ -2,7 +2,7 @@ log4j.rootLogger=INFO, Console
 log4j.logger.azkaban=INFO, server
 log4j.appender.server=org.apache.log4j.RollingFileAppender
 log4j.appender.server.layout=org.apache.log4j.PatternLayout
-log4j.appender.server.File=azkaban-webserver.log
+log4j.appender.server.File=local/azkaban-webserver.log
 log4j.appender.server.layout.ConversionPattern=%d{yyyy/MM/dd HH:mm:ss.SSS Z} %p [%c{1}] [Azkaban] %m%n
 log4j.appender.server.MaxFileSize=102400MB
 log4j.appender.server.MaxBackupIndex=2
diff --git a/test/local-conf-templates/conf/azkaban.properties b/test/local-conf-templates/conf/azkaban.properties
new file mode 100644
index 0000000..5a7e7ee
--- /dev/null
+++ b/test/local-conf-templates/conf/azkaban.properties
@@ -0,0 +1,56 @@
+# Azkaban Personalization Settings
+azkaban.name=Local
+azkaban.label=My Local Azkaban
+azkaban.color=#FF3601
+web.resource.dir=azkaban-web-server/build/install/azkaban-web-server/web
+default.timezone.id=America/Los_Angeles
+# Azkaban UserManager class
+user.manager.class=azkaban.user.XmlUserManager
+user.manager.xml.file=azkaban-solo-server/src/main/resources/conf/azkaban-users.xml
+# Loader for projects
+executor.global.properties=azkaban-solo-server/src/main/resources/conf/global.properties
+azkaban.project.dir=local/projects
+azkaban.execution.dir=local/executions
+executor.portfile=local/executor.port
+# DB
+database.sql.scripts.dir=azkaban-db/src/main/sql
+database.check.version=true
+database.auto.update.tables=true
+#mysql
+#database.type=mysql
+#mysql.port=3306
+#mysql.host=localhost
+#mysql.database=test
+#mysql.numconnections=100
+#mysql.user=
+#mysql.password=
+# h2 db
+database.type=h2
+h2.path=local/h2
+h2.create.tables=true
+# load the commonprivate.properties
+azkaban.jobtype.plugin.dir=azkaban-solo-server/src/main/resources
+# Velocity dev mode
+#velocity.dev.mode=false
+velocity.dev.mode=true
+# Azkaban Jetty server properties. Ignored in tomcat
+jetty.use.ssl=false
+jetty.ssl.port=8043
+jetty.maxThreads=25
+jetty.port=8081
+# Azkaban Executor settings
+executor.port=12321
+executor.maxThreads=50
+executor.flow.threads=30
+# mail settings
+mail.sender=
+mail.host=
+job.failure.email=
+job.success.email=
+lockdown.create.projects=false
+# JMX stats
+jetty.connector.stats=true
+executor.connector.stats=true
+# uncomment to enable inmemory stats for azkaban
+executor.metric.reports=true
+executor.metric.milisecinterval.default=60000