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.rev130715.AsNumber;
28 import org.opendaylight.yangtools.yang.common.Uint32;
30 final class Arguments implements ArgumentsInput {
31 private static final String PROGRAM_NAME = "BGP testing tool.";
32 private static final String ARG_PREFIX = "--";
33 private static final int DEFAULT_LOCAL_PORT = 0;
34 private static final int DEFAULT_REMOTE_PORT = 1790;
35 private static final InetAddress LOCALHOST = InetAddresses.forString("127.0.0.1");
36 private static final InetSocketAddress REMOTE_ADDRESS = new InetSocketAddress(LOCALHOST, DEFAULT_REMOTE_PORT);
37 private static final InetSocketAddress LOCAL_ADDRESS = new InetSocketAddress(LOCALHOST, DEFAULT_LOCAL_PORT);
38 private static final int INITIAL_HOLD_TIME = 90;
39 private static final String LOG_LEVEL = "log_level";
40 private static final String REMOTE_ADDRESS_PARAMETER = "remoteAddress";
41 private static final String REMOTE_ADDRESS_PARAMETER_HELP = "IP address of remote BGP peer, which the tool"
42 + " can accept or initiate connect to that address (based on the mode)";
43 private static final String LOCAL_ADDRESS_PARAMETER = "localAddress";
44 private static final String LOCAL_ADDRESS_PARAMETER_HELP = "IP address of BGP speakers which the tools simulates";
45 private static final String EXTENDED_COMMUNITIES_PARAMETER = "extended_communities";
46 private static final String EXTENDED_COMMUNITIES_PARAMETER_HELP = "Extended communities to be send. "
47 + "Format: x,x,x where x is each extended community from bgp-types.yang as "
48 + "as-4-generic-spec-extended-community, link-bandwidth-extended-community, ...";
49 private static final String ACTIVE_CONNECTION_PARAMETER = "active";
50 private static final String ACTIVE_CONNECTION_HELP = "Active initialization of the connection, by default false";
51 private static final String HOLD_TIMER_PARAMETER = "holdtimer";
52 private static final String INITIAL_HOLD_TIME_HELP = "In seconds, value of the desired holdtimer."
53 + " According to RFC4271, recommended value for deadtimer is 90 seconds(set by default)";
54 private static final String PREFIXES_PARAMETER = "prefixes";
55 private static final String PREFIXES_PARAMETER_HELP = "Number of prefixes to be sent";
56 private static final String MULTIPATH_PARAMETER = "multiPathSupport";
57 private static final String MULTIPATH_PARAMETER_HELP = "Active Multipart support";
58 private static final String AS_PARAMETER = "as";
59 private static final String AS_PARAMETER_HELP = "Value of AS in the initial open message";
60 private static final String SPEAKERS_COUNT = "speakersCount";
61 private static final String SPEAKERS_COUNT_HELP = "Number of simulated BGP speakers, when creating each speaker,"
62 + " use incremented local-address for binding";
63 private static final ArgumentParser ARGUMENT_PARSER = initializeArgumentParser();
64 private final Namespace parseArgs;
66 private Arguments(final Namespace parseArgs) {
67 this.parseArgs = parseArgs;
70 private interface ArgumentTypeTool<T> extends ArgumentType<T> {
72 default T convert(final ArgumentParser var1, final Argument var2, final String input)
73 throws ArgumentParserException {
74 return convert(input);
77 T convert(String input) throws ArgumentParserException;
80 static Arguments parseArguments(final String[] args) {
82 final Namespace namespace = ARGUMENT_PARSER.parseArgs(args);
83 return new Arguments(namespace);
84 } catch (final ArgumentParserException e) {
85 throw new IllegalArgumentException(e);
89 private static ArgumentParser initializeArgumentParser() {
90 final ArgumentParser parser = ArgumentParsers.newArgumentParser(PROGRAM_NAME);
92 parser.addArgument("-i", toArgName(ACTIVE_CONNECTION_PARAMETER)).type(Boolean.class)
93 .setDefault(false).help(ACTIVE_CONNECTION_HELP);
94 parser.addArgument("-ho", toArgName(HOLD_TIMER_PARAMETER)).type(Integer.class)
95 .setDefault(INITIAL_HOLD_TIME).help(INITIAL_HOLD_TIME_HELP);
96 parser.addArgument("-pr", toArgName(PREFIXES_PARAMETER)).type(Integer.class)
97 .setDefault(0).help(PREFIXES_PARAMETER_HELP);
98 parser.addArgument("-sc", toArgName(SPEAKERS_COUNT)).type(Integer.class)
99 .setDefault(0).help(SPEAKERS_COUNT_HELP);
100 parser.addArgument("-mp", toArgName(MULTIPATH_PARAMETER)).type(Boolean.class)
101 .setDefault(false).help(MULTIPATH_PARAMETER_HELP);
102 parser.addArgument("-" + AS_PARAMETER, toArgName(AS_PARAMETER))
103 .type((ArgumentTypeTool<AsNumber>) as -> new AsNumber(Uint32.valueOf(as)))
104 .setDefault(new AsNumber(Uint32.valueOf(64496))).help(AS_PARAMETER_HELP);
105 parser.addArgument("-ec", toArgName(EXTENDED_COMMUNITIES_PARAMETER))
106 .type((ArgumentTypeTool<List<String>>) extComInput ->
107 Arrays.asList(extComInput.split(","))).setDefault(Collections.emptyList())
108 .help(EXTENDED_COMMUNITIES_PARAMETER_HELP);
109 parser.addArgument("-ll", toArgName(LOG_LEVEL))
110 .type((ArgumentTypeTool<Level>) Level::toLevel).setDefault(Level.INFO).help("log levels");
111 parser.addArgument("-ra", toArgName(REMOTE_ADDRESS_PARAMETER))
112 .type((ArgumentTypeTool<List<InetSocketAddress>>) input ->
113 InetSocketAddressUtil.parseAddresses(input, DEFAULT_REMOTE_PORT))
114 .setDefault(Collections.singletonList(REMOTE_ADDRESS))
115 .help(REMOTE_ADDRESS_PARAMETER_HELP);
116 parser.addArgument("-la", toArgName(LOCAL_ADDRESS_PARAMETER))
117 .type((ArgumentTypeTool<InetSocketAddress>) input ->
118 getInetSocketAddress(input, DEFAULT_LOCAL_PORT))
119 .setDefault(LOCAL_ADDRESS).help(LOCAL_ADDRESS_PARAMETER_HELP);
124 private static String toArgName(final String dst) {
125 return ARG_PREFIX + dst;
129 public Level getLogLevel() {
130 return this.parseArgs.get(LOG_LEVEL);
134 return this.parseArgs.get("as");
137 InetSocketAddress getLocalAddresses() {
138 return this.parseArgs.get(LOCAL_ADDRESS_PARAMETER);
141 List<InetSocketAddress> getRemoteAddresses() {
142 return this.parseArgs.get(REMOTE_ADDRESS_PARAMETER);
145 int getNumberOfPrefixes() {
146 return this.parseArgs.get(PREFIXES_PARAMETER);
149 List<String> getExtendedCommunities() {
150 return this.parseArgs.get(EXTENDED_COMMUNITIES_PARAMETER);
154 return this.parseArgs.get(HOLD_TIMER_PARAMETER);
157 boolean getInitiateConnection() {
158 return this.parseArgs.get(ACTIVE_CONNECTION_PARAMETER);
161 boolean getMultiPathSupport() {
162 return this.parseArgs.get(MULTIPATH_PARAMETER);
165 int getSpeakerCount() {
166 return this.parseArgs.get(SPEAKERS_COUNT);