2 * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.protocol.bgp.testtool;
10 import static org.opendaylight.protocol.util.InetSocketAddressUtil.getInetSocketAddress;
12 import ch.qos.logback.classic.Level;
13 import com.google.common.net.InetAddresses;
14 import java.net.InetAddress;
15 import java.net.InetSocketAddress;
16 import java.util.Arrays;
17 import java.util.Collections;
18 import java.util.List;
19 import net.sourceforge.argparse4j.ArgumentParsers;
20 import net.sourceforge.argparse4j.inf.Argument;
21 import net.sourceforge.argparse4j.inf.ArgumentParser;
22 import net.sourceforge.argparse4j.inf.ArgumentParserException;
23 import net.sourceforge.argparse4j.inf.ArgumentType;
24 import net.sourceforge.argparse4j.inf.Namespace;
25 import org.opendaylight.protocol.util.ArgumentsInput;
26 import org.opendaylight.protocol.util.InetSocketAddressUtil;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber;
29 final class Arguments implements ArgumentsInput {
30 private static final String PROGRAM_NAME = "BGP testing tool.";
31 private static final String ARG_PREFIX = "--";
32 private static final int DEFAULT_LOCAL_PORT = 0;
33 private static final int DEFAULT_REMOTE_PORT = 1790;
34 private static final InetAddress LOCALHOST = InetAddresses.forString("127.0.0.1");
35 private static final InetSocketAddress REMOTE_ADDRESS = new InetSocketAddress(LOCALHOST, DEFAULT_REMOTE_PORT);
36 private static final InetSocketAddress LOCAL_ADDRESS = new InetSocketAddress(LOCALHOST, DEFAULT_LOCAL_PORT);
37 private static final int INITIAL_HOLD_TIME = 90;
38 private static final String LOG_LEVEL = "log_level";
39 private static final String REMOTE_ADDRESS_PARAMETER = "remoteAddress";
40 private static final String REMOTE_ADDRESS_PARAMETER_HELP = "IP address of remote BGP peer, which the tool can accept or initiate connect to that " +
41 "address (based on the mode)";
42 private static final String LOCAL_ADDRESS_PARAMETER = "localAddress";
43 private static final String LOCAL_ADDRESS_PARAMETER_HELP = "IP address of BGP speakers which the tools simulates";
44 private static final String EXTENDED_COMMUNITIES_PARAMETER = "extended_communities";
45 private static final String EXTENDED_COMMUNITIES_PARAMETER_HELP = "Extended communities to be send. Format: x,x,x where x is each extended " +
46 "community from bgp-types.yang as as-4-generic-spec-extended-community, link-bandwidth-extended-community, ...";
47 private static final String ACTIVE_CONNECTION_PARAMETER = "active";
48 private static final String ACTIVE_CONNECTION_HELP = "Active initialization of the connection, by default false";
49 private static final String HOLD_TIMER_PARAMETER = "holdtimer";
50 private static final String INITIAL_HOLD_TIME_HELP = "In seconds, value of the desired holdtimer. According to RFC4271, recommended value for " +
51 "deadtimer is 90 seconds(set by default)";
52 private static final String PREFIXES_PARAMETER = "prefixes";
53 private static final String PREFIXES_PARAMETER_HELP = "Number of prefixes to be sent";
54 private static final String MULTIPATH_PARAMETER = "multiPathSupport";
55 private static final String MULTIPATH_PARAMETER_HELP = "Active Multipart support";
56 private static final String AS_PARAMETER = "as";
57 private static final String AS_PARAMETER_HELP = "Value of AS in the initial open message";
58 private static final String SPEAKERS_COUNT = "speakersCount";
59 private static final String SPEAKERS_COUNT_HELP = "Number of simulated BGP speakers, when creating each speaker, use incremented " +
60 "local-address for binding";
61 private static final ArgumentParser ARGUMENT_PARSER = initializeArgumentParser();
62 private final Namespace parseArgs;
64 private Arguments(final Namespace parseArgs) {
65 this.parseArgs = parseArgs;
68 private interface ArgumentTypeTool<T> extends ArgumentType<T> {
69 default T convert(ArgumentParser var1, Argument var2, String input) throws ArgumentParserException {
70 return convert(input);
73 T convert(String input) throws ArgumentParserException;
76 static Arguments parseArguments(final String[] args) {
78 final Namespace namespace = ARGUMENT_PARSER.parseArgs(args);
79 return new Arguments(namespace);
80 } catch (final ArgumentParserException e) {
81 throw new IllegalArgumentException(e);
85 private static ArgumentParser initializeArgumentParser() {
86 final ArgumentParser parser = ArgumentParsers.newArgumentParser(PROGRAM_NAME);
88 parser.addArgument("-i", toArgName(ACTIVE_CONNECTION_PARAMETER)).type(Boolean.class).setDefault(false).help(ACTIVE_CONNECTION_HELP);
89 parser.addArgument("-ho", toArgName(HOLD_TIMER_PARAMETER)).type(Integer.class).setDefault(INITIAL_HOLD_TIME).help(INITIAL_HOLD_TIME_HELP);
90 parser.addArgument("-pr", toArgName(PREFIXES_PARAMETER)).type(Integer.class).setDefault(0).help(PREFIXES_PARAMETER_HELP);
91 parser.addArgument("-sc", toArgName(SPEAKERS_COUNT)).type(Integer.class).setDefault(0).help(SPEAKERS_COUNT_HELP);
92 parser.addArgument("-mp", toArgName(MULTIPATH_PARAMETER)).type(Boolean.class).setDefault(false).help(MULTIPATH_PARAMETER_HELP);
93 parser.addArgument("-" + AS_PARAMETER, toArgName(AS_PARAMETER)).type((ArgumentTypeTool<AsNumber>) as -> new AsNumber(Long.valueOf(as)))
94 .setDefault(new AsNumber(64496L)).help(AS_PARAMETER_HELP);
95 parser.addArgument("-ec", toArgName(EXTENDED_COMMUNITIES_PARAMETER)).type((ArgumentTypeTool<List<String>>) extComInput ->
96 Arrays.asList(extComInput.split(","))).setDefault(Collections.emptyList()).help(EXTENDED_COMMUNITIES_PARAMETER_HELP);
97 parser.addArgument("-ll", toArgName(LOG_LEVEL)).type((ArgumentTypeTool<Level>) Level::toLevel).setDefault(Level.INFO).help("log levels");
98 parser.addArgument("-ra", toArgName(REMOTE_ADDRESS_PARAMETER)).type((ArgumentTypeTool<List<InetSocketAddress>>) input ->
99 InetSocketAddressUtil.parseAddresses(input, DEFAULT_REMOTE_PORT)).setDefault(Collections.singletonList(REMOTE_ADDRESS))
100 .help(REMOTE_ADDRESS_PARAMETER_HELP);
101 parser.addArgument("-la", toArgName(LOCAL_ADDRESS_PARAMETER)).type((ArgumentTypeTool<InetSocketAddress>) input ->
102 getInetSocketAddress(input, DEFAULT_LOCAL_PORT)).setDefault(LOCAL_ADDRESS).help(LOCAL_ADDRESS_PARAMETER_HELP);
107 private static String toArgName(final String dst) {
108 return ARG_PREFIX + dst;
112 public Level getLogLevel() {
113 return this.parseArgs.get(LOG_LEVEL);
117 return this.parseArgs.get("as");
120 InetSocketAddress getLocalAddresses() {
121 return this.parseArgs.get(LOCAL_ADDRESS_PARAMETER);
124 List<InetSocketAddress> getRemoteAddresses() {
125 return this.parseArgs.get(REMOTE_ADDRESS_PARAMETER);
128 int getNumberOfPrefixes() {
129 return this.parseArgs.get(PREFIXES_PARAMETER);
132 List<String> getExtendedCommunities() {
133 return this.parseArgs.get(EXTENDED_COMMUNITIES_PARAMETER);
137 return this.parseArgs.get(HOLD_TIMER_PARAMETER);
140 boolean getInitiateConnection() {
141 return this.parseArgs.get(ACTIVE_CONNECTION_PARAMETER);
144 boolean getMultiPathSupport() {
145 return this.parseArgs.get(MULTIPATH_PARAMETER);
148 int getSpeakerCount() {
149 return this.parseArgs.get(SPEAKERS_COUNT);