Bug 116 - Revisit SanityTest
[controller.git] / opendaylight / commons / controller-maven-plugin / src / main / java / org / opendaylight / controller / maven / plugin / StartControllerMojo.java
diff --git a/opendaylight/commons/controller-maven-plugin/src/main/java/org/opendaylight/controller/maven/plugin/StartControllerMojo.java b/opendaylight/commons/controller-maven-plugin/src/main/java/org/opendaylight/controller/maven/plugin/StartControllerMojo.java
new file mode 100644 (file)
index 0000000..0a3bee4
--- /dev/null
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.controller.maven.plugin;
+
+import java.net.MalformedURLException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugin.MojoFailureException;
+import org.apache.maven.plugins.annotations.LifecyclePhase;
+import org.apache.maven.plugins.annotations.Mojo;
+import org.apache.maven.plugins.annotations.Parameter;
+
+
+/**
+ * Starts the controller
+ */
+@Mojo( name = "run", defaultPhase = LifecyclePhase.PRE_INTEGRATION_TEST )
+public class StartControllerMojo extends AbstractControllerMojo {
+    public static final String REDIRECT_LOG = "controller.out";
+
+    /**
+     * The timeout value for starting the controller. Defaults to 60 secs
+     */
+    @Parameter(defaultValue = "60")
+    public int timeoutSecs = 60;
+
+    /**
+     * The startArgs for starting the controller
+     */
+    @Parameter(required = false)
+    protected List<String> startArgs = new ArrayList<String>();
+
+    /**
+     * The time to wait after successfully connecting to the controller and
+     * before returning from execution.
+     */
+    @Parameter(required = false)
+    protected int warmupTimeSecs = 10;
+
+
+    @Override
+    public void start() throws MojoExecutionException, MojoFailureException {
+        killControllers();
+        // if we can still connect to a controller, bail out
+        if (canConnect()) {
+            getLog().error("A controller is already running. Shutdown and retry.");
+            throw new MojoFailureException("Controller is already running.");
+        }
+        startArgs.add("-D" + CTRL_PROP);
+        Process process = invokeScript(startArgs, REDIRECT_LOG);
+        getLog().info("Controller starting... (waiting for open ports)");
+        try {
+            waitForListening(process);
+            getLog().info("Controller port open. Waiting for warmup: "
+                    + warmupTimeSecs);
+            Thread.sleep(warmupTimeSecs*1000);
+        } catch (Exception e) {
+            throw new MojoExecutionException(e.getMessage());
+        }
+        getLog().info("Controller started successfully.");
+    }
+
+    protected boolean waitForListening(Process process)
+            throws MalformedURLException, InterruptedException, MojoExecutionException
+    {
+        long timeElapsedMillis = 0L;
+        long sleepTimeMillis = 2000L; // 2 secs
+        long timeoutMillis = timeoutSecs * 1000;
+
+        while (timeElapsedMillis < timeoutMillis) {
+            long timeRemaining = timeoutMillis - timeElapsedMillis;
+            sleepTimeMillis *= 2;
+            long toSleep = (sleepTimeMillis > timeRemaining)
+                    ? timeRemaining : sleepTimeMillis;
+            Thread.sleep(toSleep);
+            timeElapsedMillis += toSleep;
+            if (canConnect()) {
+                return true;
+            }
+            if (!isControllerRunning()) {
+                throw new MojoExecutionException("Process seems to have exited prematurely.");
+            }
+        }
+        return false;
+    }
+}