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%2FMain.java;h=89a03dbab05331947b7d01d009e368422b7967ff;hb=4a8d27bf03c0088b9c571422cb39753d058f6b5a;hp=4e6c2a327a6192af8bbb10576279bd3cad87b998;hpb=b7e50e0f8090ada7b0113e1cb56cb21b44e7a3fe;p=netconf.git diff --git a/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/Main.java b/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/Main.java index 4e6c2a327a..89a03dbab0 100644 --- a/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/Main.java +++ b/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/Main.java @@ -5,48 +5,36 @@ * 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.netconf.test.tool; -import static com.google.common.base.Preconditions.checkNotNull; - import ch.qos.logback.classic.Level; -import com.google.common.base.Preconditions; import com.google.common.base.Stopwatch; import com.google.common.collect.Lists; -import com.google.common.io.ByteStreams; -import com.google.common.io.CharStreams; -import com.google.common.io.Files; -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; +import com.google.common.math.IntMath; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; +import java.math.RoundingMode; import java.util.List; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; -import javax.xml.bind.JAXBException; -import org.apache.karaf.features.internal.model.ConfigFile; -import org.apache.karaf.features.internal.model.Feature; -import org.apache.karaf.features.internal.model.Features; -import org.apache.karaf.features.internal.model.JaxbUtil; +import java.util.stream.Collectors; import org.opendaylight.netconf.test.tool.config.Configuration; import org.opendaylight.netconf.test.tool.config.ConfigurationBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - +@SuppressFBWarnings("DM_DEFAULT_ENCODING") public final class Main { private static final Logger LOG = LoggerFactory.getLogger(Main.class); + private Main() { + // hidden on purpose + } + @SuppressWarnings("checkstyle:IllegalCatch") + @SuppressFBWarnings({"UW_UNCOND_WAIT", "WA_NOT_IN_LOOP"}) public static void main(final String[] args) { final TesttoolParameters params = TesttoolParameters.parseArgs(args, TesttoolParameters.getParser()); params.validate(); @@ -63,43 +51,30 @@ public final class Main { LOG.error("Failed to start any simulated devices, exiting..."); System.exit(1); } - if (params.controllerDestination != null) { - final ArrayList> allThreadsPayloads = params - .getThreadsPayloads(openDevices); - final ArrayList executions = new ArrayList<>(); - for (ArrayList payloads : allThreadsPayloads) { - executions.add(new Execution(params, payloads)); - } + //if ODL controller ip is not set NETCONF devices will be started, but not registered at the controller + if (params.controllerIp != null) { + final List executionThreads = divideDevicesForThreads(openDevices, params); final ExecutorService executorService = Executors.newFixedThreadPool(params.threadAmount); final Stopwatch time = Stopwatch.createStarted(); - List> futures = executorService.invokeAll(executions, params.timeOut, TimeUnit.SECONDS); + final List> futures = executorService.invokeAll(executionThreads, + params.timeOut, TimeUnit.SECONDS); int threadNum = 0; - for (Future future : futures) { + for (final Future future : futures) { threadNum++; if (future.isCancelled()) { - LOG.info("{}. thread timed out.",threadNum); + LOG.info("{}. thread timed out.", threadNum); } else { try { future.get(); - } catch (final ExecutionException e) { + } catch (final ExecutionException | InterruptedException e) { LOG.info("{}. thread failed.", threadNum, e); } } } time.stop(); - LOG.info("Time spent with configuration of devices: {}.",time); - } - - if (params.distroFolder != null) { - final ConfigGenerator configGenerator = new ConfigGenerator(params.distroFolder, openDevices); - final List generated = configGenerator.generate( - params.ssh, params.generateConfigBatchSize, - params.generateConfigsTimeout, params.generateConfigsAddress, - params.devicesPerPort); - configGenerator.updateFeatureFile(generated); - configGenerator.changeLoadOrder(); + LOG.info("Time spent with configuration of devices: {}.", time); } - } catch (final Exception e) { + } catch (final RuntimeException | InterruptedException e) { LOG.error("Unhandled exception", e); netconfDeviceSimulator.close(); System.exit(1); @@ -110,181 +85,16 @@ public final class Main { try { netconfDeviceSimulator.wait(); } catch (final InterruptedException e) { - throw new RuntimeException(e); + throw new IllegalStateException("Interrupted while waiting", e); } } } - static class ConfigGenerator { - public static final String NETCONF_CONNECTOR_XML = "/99-netconf-connector-simulated.xml"; - public static final String SIM_DEVICE_SUFFIX = "-sim-device"; - - private static final String SIM_DEVICE_CFG_PREFIX = "simulated-devices_"; - private static final String ETC_KARAF_PATH = "etc/"; - private static final String ETC_OPENDAYLIGHT_KARAF_PATH = ETC_KARAF_PATH + "opendaylight/karaf/"; - - public static final String NETCONF_CONNECTOR_ALL_FEATURE = "odl-netconf-connector-all"; - private static final String ORG_OPS4J_PAX_URL_MVN_CFG = "org.ops4j.pax.url.mvn.cfg"; - - private final File configDir; - private final List openDevices; - private final List ncFeatureFiles; - private final File etcDir; - private final File loadOrderCfgFile; - - ConfigGenerator(final File directory, final List openDevices) { - this.configDir = new File(directory, ETC_OPENDAYLIGHT_KARAF_PATH); - this.etcDir = new File(directory, ETC_KARAF_PATH); - this.loadOrderCfgFile = new File(etcDir, ORG_OPS4J_PAX_URL_MVN_CFG); - this.ncFeatureFiles = getFeatureFile(directory, "features-netconf-connector", "xml"); - this.openDevices = openDevices; - } - - public List generate(final boolean useSsh, final int batchSize, - final int generateConfigsTimeout, final String address, - final int devicesPerPort) { - if (!configDir.exists()) { - Preconditions.checkState(configDir.mkdirs(), "Unable to create directory " + configDir); - } - - for (final File file : configDir.listFiles(pathname -> - !pathname.isDirectory() && pathname.getName().startsWith(SIM_DEVICE_CFG_PREFIX))) { - Preconditions.checkState(file.delete(), "Unable to clean previous generated file %s", file); - } - - try (InputStream stream = Main.class.getResourceAsStream(NETCONF_CONNECTOR_XML)) { - checkNotNull(stream, "Cannot load %s", NETCONF_CONNECTOR_XML); - String configBlueprint = CharStreams.toString(new InputStreamReader(stream, StandardCharsets.UTF_8)); - - final String before = configBlueprint.substring(0, configBlueprint.indexOf("")); - final String middleBlueprint = configBlueprint.substring( - configBlueprint.indexOf(""), configBlueprint.indexOf("")); - final String after = configBlueprint.substring( - configBlueprint.indexOf("") + "".length()); - - int connectorCount = 0; - Integer batchStart = null; - StringBuilder builder = new StringBuilder(); - builder.append(before); - - final List generatedConfigs = Lists.newArrayList(); - - for (final Integer openDevice : openDevices) { - if (batchStart == null) { - batchStart = openDevice; - } - - for (int i = 0; i < devicesPerPort; i++) { - final String name = String.valueOf(openDevice) - + SIM_DEVICE_SUFFIX + (i == 0 ? "" : "-" + String.valueOf(i)); - String configContent = String.format( - middleBlueprint, name, address, String.valueOf(openDevice), String.valueOf(!useSsh)); - configContent = String.format( - "%s%s%d%s\n%s\n", configContent, "", - generateConfigsTimeout, "", ""); - - builder.append(configContent); - connectorCount++; - if (connectorCount == batchSize) { - builder.append(after); - final File to = new File( - configDir, String.format(SIM_DEVICE_CFG_PREFIX + "%d-%d.xml", batchStart, openDevice)); - generatedConfigs.add(to); - Files.write(builder.toString(), to, StandardCharsets.UTF_8); - connectorCount = 0; - builder = new StringBuilder(); - builder.append(before); - batchStart = null; - } - } - } - - // Write remaining - if (connectorCount != 0) { - builder.append(after); - final File to = new File(configDir, String.format( - SIM_DEVICE_CFG_PREFIX + "%d-%d.xml", batchStart, openDevices.get(openDevices.size() - 1))); - generatedConfigs.add(to); - Files.write(builder.toString(), to, StandardCharsets.UTF_8); - } - - LOG.info("Config files generated in {}", configDir); - return generatedConfigs; - } catch (final IOException e) { - throw new RuntimeException("Unable to generate config files", e); - } - } - - public void updateFeatureFile(final List generated) { - for (final File fileFeatures : ncFeatureFiles) { - try { - final Features f = JaxbUtil.unmarshal(fileFeatures.toURI().toString(), false); - - for (final Feature feature : f.getFeature()) { - if (NETCONF_CONNECTOR_ALL_FEATURE.equals(feature.getName())) { - //Clean all previously generated configFiles - feature.getConfigfile().clear(); - - //Create new configFiles - for (final File gen : generated) { - final ConfigFile cf = new ConfigFile(); - - final String generatedName = ETC_OPENDAYLIGHT_KARAF_PATH + gen.getName(); - - cf.setFinalname(generatedName); - cf.setLocation("file:" + generatedName); - - feature.getConfigfile().add(cf); - } - } - } - JaxbUtil.marshal(f, new FileWriter(fileFeatures)); - LOG.info("Feature file {} updated", fileFeatures); - } catch (JAXBException | IOException e) { - throw new RuntimeException(e); - } - } - } - - private static List getFeatureFile(final File distroFolder, final String featureName, - final String suffix) { - checkExistingDir(distroFolder, String.format("Folder %s does not exist", distroFolder)); - - final File systemDir = checkExistingDir(new File(distroFolder, "system"), - String.format("Folder %s does not contain a karaf distro, folder system is missing", distroFolder)); - - //check if beryllium path exists, if it doesnt check for lithium and fail/succeed after - File netconfConnectorFeaturesParentDir = new File(systemDir, "org/opendaylight/netconf/" + featureName); - if (!netconfConnectorFeaturesParentDir.exists() || !netconfConnectorFeaturesParentDir.isDirectory()) { - netconfConnectorFeaturesParentDir = checkExistingDir(new File(systemDir, - "org/opendaylight/controller/" + featureName), - String.format("Karaf distro in %s does not contain netconf-connector features", distroFolder)); - } - - // Find newest version for features - final File newestVersionDir = Collections.max( - Lists.newArrayList(netconfConnectorFeaturesParentDir.listFiles(File::isDirectory)), - Comparator.comparing(File::getName)); - - return Lists.newArrayList(newestVersionDir.listFiles( - pathname -> pathname.getName().contains(featureName) - && Files.getFileExtension(pathname.getName()).equals(suffix))); - } - - private static File checkExistingDir(final File folder, final String msg) { - Preconditions.checkArgument(folder.exists(), msg); - Preconditions.checkArgument(folder.isDirectory(), msg); - return folder; - } - - public void changeLoadOrder() { - try { - Files.write(ByteStreams.toByteArray(getClass().getResourceAsStream( - "/" + ORG_OPS4J_PAX_URL_MVN_CFG)), loadOrderCfgFile); - LOG.info("Load order changed to prefer local bundles/features by rewriting file {}", loadOrderCfgFile); - } catch (IOException e) { - throw new RuntimeException("Unable to rewrite features file " + loadOrderCfgFile, e); - } - } + private static List divideDevicesForThreads(final List openDevices, + final TesttoolParameters params) { + final int devicesPerThread = IntMath.divide(openDevices.size(), params.threadAmount, RoundingMode.UP); + return Lists.partition(openDevices, devicesPerThread).stream() + .map(t -> new Execution(t, params)) + .collect(Collectors.toList()); } }