--- /dev/null
+/*
+ * Copyright (c) 2016 Pantheon Technologies s.r.o. 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.openflowjava.protocol.impl.clients;
+
+import static com.google.common.base.Preconditions.checkArgument;
+
+import javax.annotation.Nullable;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+
+import com.google.common.util.concurrent.FutureCallback;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.ListeningExecutorService;
+import com.google.common.util.concurrent.MoreExecutors;
+import io.netty.bootstrap.Bootstrap;
+import io.netty.channel.EventLoopGroup;
+import io.netty.channel.nio.NioEventLoopGroup;
+import net.sourceforge.argparse4j.ArgumentParsers;
+import net.sourceforge.argparse4j.annotation.Arg;
+import net.sourceforge.argparse4j.inf.ArgumentParser;
+import net.sourceforge.argparse4j.inf.ArgumentParserException;
+import org.slf4j.LoggerFactory;
+
+/**
+ * ControllerConnectionTestTool class, utilities for testing device's connect
+ * @author Jozef Bacigal
+ * Date: 4.3.2016.
+ */
+public class ControllerConnectionTestTool {
+
+ private static final org.slf4j.Logger LOG = LoggerFactory.getLogger(ControllerConnectionTestTool.class);
+
+ public static class Params {
+
+ @Arg(dest = "controller-ip")
+ public String controllerIP;
+
+ @Arg(dest = "devices-count")
+ public int deviceCount;
+
+ @Arg(dest = "ssl")
+ public boolean ssl;
+
+ @Arg(dest = "threads")
+ public int threads;
+
+ @Arg(dest = "port")
+ public int port;
+
+ @Arg(dest = "timeout")
+ public int timeout;
+
+ @Arg(dest = "freeze")
+ public int freeze;
+
+ @Arg(dest = "sleep")
+ public long sleep;
+
+ static ArgumentParser getParser() throws UnknownHostException {
+ final ArgumentParser parser = ArgumentParsers.newArgumentParser("openflowjava test-tool");
+
+ parser.description("Openflowjava switch -> controller connector simulator");
+
+ parser.addArgument("--device-count")
+ .type(Integer.class)
+ .setDefault(1)
+ .help("Number of simulated switches. Has to be more than 0")
+ .dest("devices-count");
+
+ parser.addArgument("--controller-ip")
+ .type(String.class)
+ .setDefault("127.0.0.1")
+ .help("ODL controller ip address")
+ .dest("controller-ip");
+
+ parser.addArgument("--ssl")
+ .type(Boolean.class)
+ .setDefault(false)
+ .help("Use secured connection")
+ .dest("ssl");
+
+ parser.addArgument("--threads")
+ .type(Integer.class)
+ .setDefault(1)
+ .help("Number of threads: MAX 1024")
+ .dest("threads");
+
+ parser.addArgument("--port")
+ .type(Integer.class)
+ .setDefault(6653)
+ .help("Connection port")
+ .dest("port");
+
+ parser.addArgument("--timeout")
+ .type(Integer.class)
+ .setDefault(60)
+ .help("Timeout in seconds")
+ .dest("timeout");
+
+ parser.addArgument("--scenarioTries")
+ .type(Integer.class)
+ .setDefault(3)
+ .help("Number of tries in scenario, while waiting for response")
+ .dest("freeze");
+
+ parser.addArgument("--timeBetweenScenario")
+ .type(Long.class)
+ .setDefault(100)
+ .help("Waiting time in milliseconds between tries.")
+ .dest("sleep");
+
+ return parser;
+ }
+
+ void validate() {
+ checkArgument(deviceCount > 0, "Switch count has to be > 0");
+ checkArgument(threads > 0 && threads < 1024, "Switch count has to be > 0 and < 1024");
+ }
+ }
+
+ public static void main(final String[] args) {
+
+ List<Callable<Boolean>> callableList = new ArrayList<>();
+ final EventLoopGroup workerGroup = new NioEventLoopGroup();
+
+ try {
+ final Params params = parseArgs(args, Params.getParser());
+ params.validate();
+
+ for(int loop=0;loop < params.deviceCount; loop++){
+
+ CallableClient cc = new CallableClient(
+ params.port,
+ params.ssl,
+ InetAddress.getByName(params.controllerIP),
+ "Switch no." + String.valueOf(loop),
+ new ScenarioHandler(ScenarioFactory.createHandshakeScenarioWithBarrier(), params.freeze, params.sleep),
+ new Bootstrap(),
+ workerGroup);
+
+ callableList.add(cc);
+
+ }
+
+ ExecutorService executorService = Executors.newFixedThreadPool(params.threads);
+ final ListeningExecutorService listeningExecutorService = MoreExecutors.listeningDecorator(executorService);
+
+ final List<ListenableFuture<Boolean>> listenableFutures = new ArrayList<>();
+ for (Callable<Boolean> booleanCallable : callableList) {
+ listenableFutures.add(listeningExecutorService.submit(booleanCallable));
+ }
+ final ListenableFuture<List<Boolean>> summaryFuture = Futures.successfulAsList(listenableFutures);
+ List<Boolean> booleanList = summaryFuture.get(params.timeout, TimeUnit.SECONDS);
+ Futures.addCallback(summaryFuture, new FutureCallback<List<Boolean>>() {
+ @Override
+ public void onSuccess(@Nullable final List<Boolean> booleanList) {
+ LOG.info("Tests finished");
+ workerGroup.shutdownGracefully();
+ LOG.info("Summary:");
+ int testsOK = 0;
+ int testFailure = 0;
+ for (Boolean aBoolean : booleanList) {
+ if (aBoolean) {
+ testsOK++;
+ } else {
+ testFailure++;
+ }
+ }
+ LOG.info("Tests OK: {}", testsOK);
+ LOG.info("Tests failure: {}", testFailure);
+ System.exit(0);
+ }
+
+ @Override
+ public void onFailure(final Throwable throwable) {
+ LOG.warn("Tests call failure");
+ workerGroup.shutdownGracefully();
+ System.exit(1);
+ }
+ });
+ } catch (Exception e) {
+ LOG.warn("Exception has been thrown: {}", e);
+ System.exit(1);
+ }
+ }
+
+ private static Params parseArgs(final String[] args, final ArgumentParser parser) throws ArgumentParserException {
+ final Params opt = new Params();
+ parser.parseArgs(args, opt);
+ return opt;
+ }
+
+
+}