BUG-5790: BGP Test tool
[bgpcep.git] / bgp / testtool / src / main / java / org / opendaylight / protocol / bgp / testtool / Arguments.java
1 /*
2  * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.protocol.bgp.testtool;
9
10 import static org.opendaylight.protocol.util.InetSocketAddressUtil.getInetSocketAddress;
11
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;
28
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;
63
64     private Arguments(final Namespace parseArgs) {
65         this.parseArgs = parseArgs;
66     }
67
68     private interface ArgumentTypeTool<T> extends ArgumentType<T> {
69         default T convert(ArgumentParser var1, Argument var2, String input) throws ArgumentParserException {
70             return convert(input);
71         }
72
73         T convert(String input) throws ArgumentParserException;
74     }
75
76     static Arguments parseArguments(final String[] args) {
77         try {
78             final Namespace namespace = ARGUMENT_PARSER.parseArgs(args);
79             return new Arguments(namespace);
80         } catch (final ArgumentParserException e) {
81             throw new IllegalArgumentException(e);
82         }
83     }
84
85     private static ArgumentParser initializeArgumentParser() {
86         final ArgumentParser parser = ArgumentParsers.newArgumentParser(PROGRAM_NAME);
87
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);
103         return parser;
104     }
105
106
107     private static String toArgName(final String dst) {
108         return ARG_PREFIX + dst;
109     }
110
111     @Override
112     public Level getLogLevel() {
113         return this.parseArgs.get(LOG_LEVEL);
114     }
115
116     AsNumber getAs() {
117         return this.parseArgs.get("as");
118     }
119
120     InetSocketAddress getLocalAddresses() {
121         return this.parseArgs.get(LOCAL_ADDRESS_PARAMETER);
122     }
123
124     List<InetSocketAddress> getRemoteAddresses() {
125         return this.parseArgs.get(REMOTE_ADDRESS_PARAMETER);
126     }
127
128     int getNumberOfPrefixes() {
129         return this.parseArgs.get(PREFIXES_PARAMETER);
130     }
131
132     List<String> getExtendedCommunities() {
133         return this.parseArgs.get(EXTENDED_COMMUNITIES_PARAMETER);
134     }
135
136     int getHoldTimer() {
137         return this.parseArgs.get(HOLD_TIMER_PARAMETER);
138     }
139
140     boolean getInitiateConnection() {
141         return this.parseArgs.get(ACTIVE_CONNECTION_PARAMETER);
142     }
143
144     boolean getMultiPathSupport() {
145         return this.parseArgs.get(MULTIPATH_PARAMETER);
146     }
147
148     int getSpeakerCount() {
149         return this.parseArgs.get(SPEAKERS_COUNT);
150     }
151 }