X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=netconf%2Ftools%2Fnetconf-testtool%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fnetconf%2Ftest%2Ftool%2FScaleUtil.java;h=c8929e5132741974efe851d5eeacf2edd7565825;hb=47c1b8e3d9835d336c79d6b4ca4e61417a05039e;hp=a8040f95eedb4f90c1ba3e0cef5062130cf84486;hpb=d8db8a97bba3567b6fbaa82c14f3424fea19ef5d;p=netconf.git diff --git a/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/ScaleUtil.java b/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/ScaleUtil.java index a8040f95ee..c8929e5132 100644 --- a/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/ScaleUtil.java +++ b/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/ScaleUtil.java @@ -9,16 +9,13 @@ package org.opendaylight.netconf.test.tool; import ch.qos.logback.classic.Level; -import ch.qos.logback.classic.LoggerContext; -import ch.qos.logback.classic.util.ContextInitializer; -import ch.qos.logback.core.joran.spi.JoranException; -import ch.qos.logback.core.util.StatusPrinter; import com.google.common.base.Stopwatch; import com.google.common.io.CharStreams; import com.ning.http.client.AsyncHttpClient; import com.ning.http.client.AsyncHttpClientConfig.Builder; import com.ning.http.client.Request; import com.ning.http.client.Response; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.io.BufferedReader; import java.io.File; import java.io.IOException; @@ -34,25 +31,28 @@ import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import java.util.regex.Pattern; -import net.sourceforge.argparse4j.inf.ArgumentParser; -import net.sourceforge.argparse4j.inf.ArgumentParserException; +import org.opendaylight.netconf.test.tool.config.Configuration; +import org.opendaylight.netconf.test.tool.config.ConfigurationBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class ScaleUtil { - private static Logger RESULTS_LOG ; - private static final ScheduledExecutorService executor = new LoggingWrapperExecutor(4); +@SuppressFBWarnings({"DM_EXIT", "DM_DEFAULT_ENCODING"}) +public final class ScaleUtil { + private static final ScheduledExecutorService EXECUTOR = new LoggingWrapperExecutor(4); + private static final Semaphore SEMAPHORE = new Semaphore(0); + private static final Stopwatch STOPWATCH = Stopwatch.createUnstarted(); - private static final int deviceStep = 1000; - private static final long retryDelay = 10l; - private static final long timeout = 20l; + private static final long TIMEOUT = 20L; + private static final long RETRY_DELAY = 10L; + private static final int DEVICE_STEP = 1000; - private static final Stopwatch stopwatch = Stopwatch.createUnstarted(); - - private static ScheduledFuture timeoutGuardFuture; private static ch.qos.logback.classic.Logger root; - private static final Semaphore semaphore = new Semaphore(0); + private static Logger resultsLog; + + private ScaleUtil() { + } + @SuppressWarnings("checkstyle:illegalCatch") public static void main(final String[] args) { final TesttoolParameters params = TesttoolParameters.parseArgs(args, TesttoolParameters.getParser()); @@ -64,23 +64,29 @@ public class ScaleUtil { while (true) { root.warn("Starting scale test with {} devices", params.deviceCount); - timeoutGuardFuture = executor.schedule(new TimeoutGuard(), timeout, TimeUnit.MINUTES); - final NetconfDeviceSimulator netconfDeviceSimulator = new NetconfDeviceSimulator(); + final ScheduledFuture timeoutGuardFuture = EXECUTOR.schedule(new TimeoutGuard(), TIMEOUT, TimeUnit.MINUTES); + final Configuration configuration = new ConfigurationBuilder().from(params).build(); + final NetconfDeviceSimulator netconfDeviceSimulator = new NetconfDeviceSimulator(configuration); try { - final List openDevices = netconfDeviceSimulator.start(params); + final List openDevices = netconfDeviceSimulator.start(); if (openDevices.size() == 0) { root.error("Failed to start any simulated devices, exiting..."); System.exit(1); } - if (params.distroFolder != null) { - final Main.ConfigGenerator configGenerator = new Main.ConfigGenerator(params.distroFolder, openDevices); - final List generated = configGenerator.generate( - params.ssh, params.generateConfigBatchSize, - params.generateConfigsTimeout, params.generateConfigsAddress, - params.devicesPerPort); - configGenerator.updateFeatureFile(generated); - configGenerator.changeLoadOrder(); + + if (params.distroFolder == null) { + root.error("Distro folder is not set, exiting..."); + System.exit(1); } + + final Main.ConfigGenerator configGenerator = new Main.ConfigGenerator( + params.distroFolder, openDevices); + final List generated = configGenerator.generate( + params.ssh, params.generateConfigBatchSize, + params.generateConfigsTimeout, params.generateConfigsAddress, + params.devicesPerPort); + configGenerator.updateFeatureFile(generated); + configGenerator.changeLoadOrder(); } catch (final Exception e) { root.error("Unhandled exception", e); netconfDeviceSimulator.close(); @@ -94,17 +100,21 @@ public class ScaleUtil { do { final Process exec = runtime.exec(params.distroFolder.getAbsolutePath() + "/bin/status"); try { - Thread.sleep(2000l); + Thread.sleep(2000L); } catch (InterruptedException e) { root.warn("Failed to sleep", e); } status = CharStreams.toString(new BufferedReader(new InputStreamReader(exec.getInputStream()))); root.warn("Current status: {}", status); } while (!status.startsWith("Running ...")); - root.warn("Doing feature install {}", params.distroFolder.getAbsolutePath() + "/bin/client -u karaf feature:install odl-restconf-noauth odl-netconf-connector-all"); - final Process featureInstall = runtime.exec(params.distroFolder.getAbsolutePath() + "/bin/client -u karaf feature:install odl-restconf-noauth odl-netconf-connector-all"); - root.warn(CharStreams.toString(new BufferedReader(new InputStreamReader(featureInstall.getInputStream())))); - root.warn(CharStreams.toString(new BufferedReader(new InputStreamReader(featureInstall.getErrorStream())))); + root.warn("Doing feature install {}", params.distroFolder.getAbsolutePath() + + "/bin/client -u karaf feature:install odl-restconf-noauth odl-netconf-connector-all"); + final Process featureInstall = runtime.exec(params.distroFolder.getAbsolutePath() + + "/bin/client -u karaf feature:install odl-restconf-noauth odl-netconf-connector-all"); + root.warn( + CharStreams.toString(new BufferedReader(new InputStreamReader(featureInstall.getInputStream())))); + root.warn( + CharStreams.toString(new BufferedReader(new InputStreamReader(featureInstall.getErrorStream())))); } catch (IOException e) { root.warn("Failed to start karaf", e); @@ -112,21 +122,22 @@ public class ScaleUtil { } root.warn("Karaf started, starting stopwatch"); - stopwatch.start(); + STOPWATCH.start(); try { - executor.schedule(new ScaleVerifyCallable(netconfDeviceSimulator, params.deviceCount), retryDelay, TimeUnit.SECONDS); + EXECUTOR.schedule( + new ScaleVerifyCallable(netconfDeviceSimulator, params.deviceCount), RETRY_DELAY, TimeUnit.SECONDS); root.warn("First callable scheduled"); - semaphore.acquire(); + SEMAPHORE.acquire(); root.warn("semaphore released"); } catch (InterruptedException e) { throw new RuntimeException(e); } timeoutGuardFuture.cancel(false); - params.deviceCount += deviceStep; + params.deviceCount += DEVICE_STEP; netconfDeviceSimulator.close(); - stopwatch.reset(); + STOPWATCH.reset(); cleanup(runtime, params); } @@ -137,7 +148,7 @@ public class ScaleUtil { root = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); root.setLevel(params.debug ? Level.DEBUG : Level.INFO); - RESULTS_LOG = LoggerFactory.getLogger("results"); + resultsLog = LoggerFactory.getLogger("results"); } private static void cleanup(final Runtime runtime, final TesttoolParameters params) { @@ -151,54 +162,45 @@ public class ScaleUtil { } } - private static void stopKaraf(final Runtime runtime, final TesttoolParameters params) throws IOException, InterruptedException { + private static void stopKaraf(final Runtime runtime, final TesttoolParameters params) + throws IOException, InterruptedException { root.info("Stopping karaf and sleeping for 10 sec.."); String controllerPid = ""; do { - final Process pgrep = runtime.exec("pgrep -f org.apache.karaf.main.Main"); controllerPid = CharStreams.toString(new BufferedReader(new InputStreamReader(pgrep.getInputStream()))); root.warn(controllerPid); runtime.exec("kill -9 " + controllerPid); - Thread.sleep(10000l); + Thread.sleep(10000L); } while (!controllerPid.isEmpty()); deleteFolder(new File(params.distroFolder.getAbsoluteFile() + "/data")); } private static void deleteFolder(File folder) { File[] files = folder.listFiles(); - if(files!=null) { //some JVMs return null for empty dirs - for(File f: files) { - if(f.isDirectory()) { + if (files != null) { //some JVMs return null for empty dirs + for (File f : files) { + if (f.isDirectory()) { deleteFolder(f); } else { - f.delete(); + if (!f.delete()) { + root.warn("Failed to delete {}", f); + } } } } - folder.delete(); - } - - private static TesttoolParameters parseArgs(final String[] args, final ArgumentParser parser) { - final TesttoolParameters parameters = new TesttoolParameters(); - try { - parser.parseArgs(args, parameters); - return parameters; - } catch (ArgumentParserException e) { - parser.handleError(e); + if (!folder.delete()) { + root.warn("Failed to delete {}", folder); } - - System.exit(1); - return null; } private static class ScaleVerifyCallable implements Callable { - private static final Logger LOG = LoggerFactory.getLogger(ScaleVerifyCallable.class); - private static final String RESTCONF_URL = "http://127.0.0.1:8181/restconf/operational/network-topology:network-topology/topology/topology-netconf/"; + private static final String RESTCONF_URL + = "http://127.0.0.1:8181/restconf/operational/network-topology:network-topology/topology/topology-netconf/"; private static final Pattern PATTERN = Pattern.compile("connected"); private final AsyncHttpClient asyncHttpClient = new AsyncHttpClient(new Builder() @@ -210,7 +212,7 @@ public class ScaleUtil { private final int deviceCount; private final Request request; - public ScaleVerifyCallable(final NetconfDeviceSimulator simulator, final int deviceCount) { + ScaleVerifyCallable(final NetconfDeviceSimulator simulator, final int deviceCount) { LOG.info("New callable created"); this.simulator = simulator; this.deviceCount = deviceCount; @@ -228,7 +230,7 @@ public class ScaleUtil { if (response.getStatusCode() != 200 && response.getStatusCode() != 204) { LOG.warn("Request failed, status code: {}", response.getStatusCode() + response.getStatusText()); - executor.schedule(new ScaleVerifyCallable(simulator, deviceCount), retryDelay, TimeUnit.SECONDS); + EXECUTOR.schedule(new ScaleVerifyCallable(simulator, deviceCount), RETRY_DELAY, TimeUnit.SECONDS); } else { final String body = response.getResponseBody(); final Matcher matcher = PATTERN.matcher(body); @@ -236,36 +238,37 @@ public class ScaleUtil { while (matcher.find()) { count++; } - RESULTS_LOG.info("Currently connected devices : {} out of {}, time elapsed: {}", count, deviceCount + 1, stopwatch); + resultsLog.info("Currently connected devices : {} out of {}, time elapsed: {}", + count, deviceCount + 1, STOPWATCH); if (count != deviceCount + 1) { - executor.schedule(new ScaleVerifyCallable(simulator, deviceCount), retryDelay, TimeUnit.SECONDS); + EXECUTOR.schedule( + new ScaleVerifyCallable(simulator, deviceCount), RETRY_DELAY, TimeUnit.SECONDS); } else { - stopwatch.stop(); - RESULTS_LOG.info("All devices connected in {}", stopwatch); - semaphore.release(); + STOPWATCH.stop(); + resultsLog.info("All devices connected in {}", STOPWATCH); + SEMAPHORE.release(); } } } catch (ConnectException | ExecutionException e) { LOG.warn("Failed to connect to Restconf, is the controller running?", e); - executor.schedule(new ScaleVerifyCallable(simulator, deviceCount), retryDelay, TimeUnit.SECONDS); + EXECUTOR.schedule(new ScaleVerifyCallable(simulator, deviceCount), RETRY_DELAY, TimeUnit.SECONDS); } return null; } } private static class TimeoutGuard implements Callable { - @Override public Object call() throws Exception { - RESULTS_LOG.warn("Timeout for scale test reached after: {} ..aborting", stopwatch); - root.warn("Timeout for scale test reached after: {} ..aborting", stopwatch); + resultsLog.warn("Timeout for scale test reached after: {} ..aborting", STOPWATCH); + root.warn("Timeout for scale test reached after: {} ..aborting", STOPWATCH); System.exit(0); return null; } } + @SuppressWarnings("checkstyle:illegalCatch") public static class LoggingWrapperExecutor extends ScheduledThreadPoolExecutor { - public LoggingWrapperExecutor(int corePoolSize) { super(corePoolSize); } @@ -279,11 +282,10 @@ public class ScaleUtil { return new LogOnExceptionCallable(callable); } - private class LogOnExceptionCallable implements Callable { - private Callable theCallable; + private static class LogOnExceptionCallable implements Callable { + private final Callable theCallable; - public LogOnExceptionCallable(Callable theCallable) { - super(); + LogOnExceptionCallable(Callable theCallable) { this.theCallable = theCallable; }