YANG revision dates mass-update
[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.rev130715.AsNumber;
28 import org.opendaylight.yangtools.yang.common.Uint32;
29
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;
65
66     private Arguments(final Namespace parseArgs) {
67         this.parseArgs = parseArgs;
68     }
69
70     private interface ArgumentTypeTool<T> extends ArgumentType<T> {
71         @Override
72         default T convert(final ArgumentParser var1, final Argument var2, final String input)
73                 throws ArgumentParserException {
74             return convert(input);
75         }
76
77         T convert(String input) throws ArgumentParserException;
78     }
79
80     static Arguments parseArguments(final String[] args) {
81         try {
82             final Namespace namespace = ARGUMENT_PARSER.parseArgs(args);
83             return new Arguments(namespace);
84         } catch (final ArgumentParserException e) {
85             throw new IllegalArgumentException(e);
86         }
87     }
88
89     private static ArgumentParser initializeArgumentParser() {
90         final ArgumentParser parser = ArgumentParsers.newArgumentParser(PROGRAM_NAME);
91
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);
120         return parser;
121     }
122
123
124     private static String toArgName(final String dst) {
125         return ARG_PREFIX + dst;
126     }
127
128     @Override
129     public Level getLogLevel() {
130         return this.parseArgs.get(LOG_LEVEL);
131     }
132
133     AsNumber getAs() {
134         return this.parseArgs.get("as");
135     }
136
137     InetSocketAddress getLocalAddresses() {
138         return this.parseArgs.get(LOCAL_ADDRESS_PARAMETER);
139     }
140
141     List<InetSocketAddress> getRemoteAddresses() {
142         return this.parseArgs.get(REMOTE_ADDRESS_PARAMETER);
143     }
144
145     int getNumberOfPrefixes() {
146         return this.parseArgs.get(PREFIXES_PARAMETER);
147     }
148
149     List<String> getExtendedCommunities() {
150         return this.parseArgs.get(EXTENDED_COMMUNITIES_PARAMETER);
151     }
152
153     int getHoldTimer() {
154         return this.parseArgs.get(HOLD_TIMER_PARAMETER);
155     }
156
157     boolean getInitiateConnection() {
158         return this.parseArgs.get(ACTIVE_CONNECTION_PARAMETER);
159     }
160
161     boolean getMultiPathSupport() {
162         return this.parseArgs.get(MULTIPATH_PARAMETER);
163     }
164
165     int getSpeakerCount() {
166         return this.parseArgs.get(SPEAKERS_COUNT);
167     }
168 }