BUG-5790: BGP Test tool
[bgpcep.git] / bgp / bmp-mock / src / main / java / org / opendaylight / protocol / bmp / mock / BmpMockArguments.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
9 package org.opendaylight.protocol.bmp.mock;
10
11 import static org.opendaylight.protocol.util.InetSocketAddressUtil.getInetSocketAddress;
12
13 import ch.qos.logback.classic.Level;
14 import com.google.common.net.InetAddresses;
15 import java.net.InetAddress;
16 import java.net.InetSocketAddress;
17 import net.sourceforge.argparse4j.ArgumentParsers;
18 import net.sourceforge.argparse4j.impl.Arguments;
19 import net.sourceforge.argparse4j.inf.Argument;
20 import net.sourceforge.argparse4j.inf.ArgumentParser;
21 import net.sourceforge.argparse4j.inf.ArgumentParserException;
22 import net.sourceforge.argparse4j.inf.ArgumentType;
23 import net.sourceforge.argparse4j.inf.Namespace;
24 import org.opendaylight.protocol.util.ArgumentsInput;
25
26 public final class BmpMockArguments implements ArgumentsInput {
27
28     private static final int DEFAULT_LOCAL_PORT = 0;
29     private static final int DEFAULT_REMOTE_PORT = 12345;
30     private static final InetAddress LOCALHOST = InetAddresses.forString("127.0.0.1");
31
32     private static final InetSocketAddress REMOTE_ADDRESS = new InetSocketAddress(LOCALHOST, DEFAULT_REMOTE_PORT);
33     private static final InetSocketAddress LOCAL_ADDRESS = new InetSocketAddress(LOCALHOST, DEFAULT_LOCAL_PORT);
34
35     private static final String PROGRAM_NAME = "BGP Monitoring Protocol testing tool.";
36     private static final String ARG_PREFIX = "--";
37     private static final String ROUTERS_COUNT_DST = "routers_count";
38     private static final String PEERS_COUNT_DST = "peers_count";
39     private static final String PRE_POLICY_ROUTES_COUNT_DST = "pre_policy_routes";
40     private static final String POST_POLICY_ROUTES_COUNT_DST = "post_policy_routes";
41     private static final String LOCAL_ADDRESS_DST = "local_address";
42     private static final String REMOTE_ADDRESS_DST = "remote_address";
43     private static final String LOG_LEVEL_DST = "log_level";
44     // when set to true, the mock will operate as a server listening for incoming active monitoring request
45     private static final String PASSIVE_MODE_DST = "passive";
46
47     private static final ArgumentParser ARGUMENT_PARSER = initializeArgumentParser();
48
49     private final Namespace parseArgs;
50
51     private BmpMockArguments(final Namespace parseArgs) {
52         this.parseArgs = parseArgs;
53     }
54
55     public static BmpMockArguments parseArguments(final String[] args) {
56         try {
57             final Namespace namespace = ARGUMENT_PARSER.parseArgs(args);
58             return new BmpMockArguments(namespace);
59         } catch (final ArgumentParserException e) {
60             throw new IllegalArgumentException(e);
61         }
62     }
63
64     public int getRoutersCount() {
65         return this.parseArgs.getInt(ROUTERS_COUNT_DST);
66     }
67
68     public int getPeersCount() {
69         return this.parseArgs.getInt(PEERS_COUNT_DST);
70     }
71
72     public int getPrePolicyRoutesCount() {
73         return this.parseArgs.getInt(PRE_POLICY_ROUTES_COUNT_DST);
74     }
75
76     public int getPostPolicyRoutesCount() {
77         return this.parseArgs.getInt(POST_POLICY_ROUTES_COUNT_DST);
78     }
79
80     public InetSocketAddress getLocalAddress() {
81         return this.parseArgs.get(LOCAL_ADDRESS_DST);
82     }
83
84     public InetSocketAddress getRemoteAddress() {
85         return this.parseArgs.get(REMOTE_ADDRESS_DST);
86     }
87
88     @Override
89     public Level getLogLevel() {
90         return this.parseArgs.get(LOG_LEVEL_DST);
91     }
92
93     public boolean isOnPassiveMode() {
94         return this.parseArgs.get(PASSIVE_MODE_DST);
95     }
96
97     private static ArgumentParser initializeArgumentParser() {
98         final ArgumentParser parser = ArgumentParsers.newArgumentParser(PROGRAM_NAME);
99         parser.addArgument(toArgName(ROUTERS_COUNT_DST)).type(Integer.class).setDefault(1);
100         parser.addArgument(toArgName(PEERS_COUNT_DST)).type(Integer.class).setDefault(0);
101         parser.addArgument(toArgName(PRE_POLICY_ROUTES_COUNT_DST)).type(Integer.class).setDefault(0);
102         parser.addArgument(toArgName(POST_POLICY_ROUTES_COUNT_DST)).type(Integer.class).setDefault(0);
103         parser.addArgument(toArgName(PASSIVE_MODE_DST)).action(Arguments.storeTrue());
104         parser.addArgument(toArgName(LOCAL_ADDRESS_DST)).type(new ArgumentType<InetSocketAddress>() {
105             @Override
106             public InetSocketAddress convert(final ArgumentParser parser, final Argument arg, final String value)
107                     throws ArgumentParserException {
108                 return getInetSocketAddress(value, DEFAULT_LOCAL_PORT);
109             }
110         }).setDefault(LOCAL_ADDRESS);
111         parser.addArgument(toArgName(REMOTE_ADDRESS_DST)).type(new ArgumentType<InetSocketAddress>() {
112             @Override
113             public InetSocketAddress convert(final ArgumentParser parser, final Argument arg, final String value)
114                     throws ArgumentParserException {
115                 return getInetSocketAddress(value, DEFAULT_REMOTE_PORT);
116             }
117         }).setDefault(REMOTE_ADDRESS);
118         parser.addArgument(toArgName(LOG_LEVEL_DST)).type(new ArgumentType<Level>(){
119             @Override
120             public Level convert(final ArgumentParser parser, final Argument arg, final String value) throws ArgumentParserException {
121                 return Level.toLevel(value);
122             }}).setDefault(Level.INFO);
123         return parser;
124     }
125
126     private static String toArgName(final String dst) {
127         return ARG_PREFIX + dst;
128     }
129 }