Bug-2208: pcc-mock support tunnel initiate and remove
[bgpcep.git] / pcep / pcc-mock / src / main / java / org / opendaylight / protocol / pcep / pcc / mock / Main.java
1 /*
2  * Copyright (c) 2014 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.pcep.pcc.mock;
10
11 import ch.qos.logback.classic.Level;
12 import ch.qos.logback.classic.LoggerContext;
13 import com.google.common.base.Charsets;
14 import com.google.common.base.Function;
15 import com.google.common.base.Predicate;
16 import com.google.common.collect.Iterables;
17 import com.google.common.collect.Lists;
18 import com.google.common.net.HostAndPort;
19 import com.google.common.net.InetAddresses;
20 import io.netty.util.concurrent.GlobalEventExecutor;
21 import java.net.InetAddress;
22 import java.net.InetSocketAddress;
23 import java.net.UnknownHostException;
24 import java.util.Arrays;
25 import java.util.List;
26 import java.util.concurrent.ExecutionException;
27 import org.opendaylight.protocol.framework.ReconnectImmediatelyStrategy;
28 import org.opendaylight.protocol.framework.SessionListenerFactory;
29 import org.opendaylight.protocol.framework.SessionNegotiatorFactory;
30 import org.opendaylight.protocol.pcep.PCEPSessionListener;
31 import org.opendaylight.protocol.pcep.ietf.initiated00.CrabbeInitiatedActivator;
32 import org.opendaylight.protocol.pcep.ietf.stateful07.StatefulActivator;
33 import org.opendaylight.protocol.pcep.impl.DefaultPCEPSessionNegotiatorFactory;
34 import org.opendaylight.protocol.pcep.impl.PCEPSessionImpl;
35 import org.opendaylight.protocol.pcep.spi.PCEPExtensionProviderContext;
36 import org.opendaylight.protocol.pcep.spi.pojo.ServiceLoaderPCEPExtensionProviderContext;
37 import org.opendaylight.tcpmd5.api.KeyMapping;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.Stateful1;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.Stateful1Builder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.Tlvs1;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.Tlvs1Builder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.stateful.capability.tlv.StatefulBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Message;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.Open;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.OpenBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.open.TlvsBuilder;
47 import org.slf4j.Logger;
48 import org.slf4j.LoggerFactory;
49
50 public final class Main {
51
52     private static final Logger LOG = LoggerFactory.getLogger(Main.class);
53
54     private static final int DEFAULT_REMOTE_PORT = 4189;
55     private static final int DEFAULT_LOCAL_PORT = 0;
56     private static final short DEFAULT_KEEP_ALIVE = 30;
57     private static final short DEFAULT_DEAD_TIMER = 120;
58     private static final int RECONNECT_STRATEGY_TIMEOUT = 2000;
59     private static final InetAddress LOCALHOST = InetAddresses.forString("127.0.0.1");
60
61     private Main() { }
62
63     public static void main(final String[] args) throws InterruptedException, ExecutionException, UnknownHostException {
64         InetSocketAddress localAddress = new InetSocketAddress(LOCALHOST, DEFAULT_LOCAL_PORT);
65         List<InetSocketAddress> remoteAddress = Lists.newArrayList(new InetSocketAddress(LOCALHOST, DEFAULT_REMOTE_PORT));
66         int pccCount = 1;
67         int lsps = 1;
68         boolean pcError = false;
69         final LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
70         short ka = DEFAULT_KEEP_ALIVE;
71         short dt = DEFAULT_DEAD_TIMER;
72         String password = null;
73
74         getRootLogger(lc).setLevel(ch.qos.logback.classic.Level.INFO);
75         int argIdx = 0;
76         while (argIdx < args.length) {
77             if (args[argIdx].equals("--local-address")) {
78                 localAddress = getInetSocketAddress(args[++argIdx], DEFAULT_LOCAL_PORT);
79             } else if (args[argIdx].equals("--remote-address")) {
80                 remoteAddress = parseAddresses(args[++argIdx], DEFAULT_REMOTE_PORT);
81             } else if (args[argIdx].equals("--pcc")) {
82                 pccCount = Integer.valueOf(args[++argIdx]);
83             } else if (args[argIdx].equals("--lsp")) {
84                 lsps = Integer.valueOf(args[++argIdx]);
85             } else if (args[argIdx].equals("--pcerr")) {
86                 pcError = true;
87             } else if (args[argIdx].equals("--log-level")) {
88                 getRootLogger(lc).setLevel(Level.toLevel(args[++argIdx], ch.qos.logback.classic.Level.INFO));
89             } else if (args[argIdx].equals("--keepalive") || args[argIdx].equals("-ka")) {
90                 ka = Short.valueOf(args[++argIdx]);
91             } else if (args[argIdx].equals("--deadtimer") || args[argIdx].equals("-d")) {
92                 dt = Short.valueOf(args[++argIdx]);
93             } else if (args[argIdx].equals("--password")) {
94                 password = args[++argIdx];
95             } else {
96                 LOG.warn("WARNING: Unrecognized argument: {}", args[argIdx]);
97             }
98             argIdx++;
99         }
100         createPCCs(lsps, pcError, pccCount, localAddress, remoteAddress, ka, dt, password);
101     }
102
103     public static void createPCCs(final int lspsPerPcc, final boolean pcerr, final int pccCount,
104             final InetSocketAddress localAddress, final List<InetSocketAddress> remoteAddress, final short keepalive, final short deadtimer,
105             final String password) throws InterruptedException, ExecutionException {
106         startActivators();
107         InetAddress currentAddress = localAddress.getAddress();
108         final Open openMessage = getOpenMessage(keepalive, deadtimer);
109         final PCCDispatcher pccDispatcher = new PCCDispatcher(ServiceLoaderPCEPExtensionProviderContext.getSingletonInstance().getMessageHandlerRegistry(),
110                 getSessionNegotiatorFactory(openMessage));
111         for (int i = 0; i < pccCount; i++) {
112             createPCC(lspsPerPcc, pcerr, new InetSocketAddress(currentAddress, localAddress.getPort()),
113                     remoteAddress, openMessage, pccDispatcher, password);
114             currentAddress = InetAddresses.increment(currentAddress);
115         }
116     }
117
118     private static void createPCC(final int lspsPerPcc, final boolean pcerr, final InetSocketAddress localAddress,
119             final List<InetSocketAddress> remoteAddress, final Open openMessage, final PCCDispatcher pccDispatcher,
120             final String password) throws InterruptedException, ExecutionException {
121         final SessionNegotiatorFactory<Message, PCEPSessionImpl, PCEPSessionListener> snf = getSessionNegotiatorFactory(openMessage);
122         for (final InetSocketAddress pceAddress : remoteAddress) {
123             pccDispatcher.createClient(localAddress, pceAddress, new ReconnectImmediatelyStrategy(GlobalEventExecutor.INSTANCE, RECONNECT_STRATEGY_TIMEOUT), new SessionListenerFactory<PCEPSessionListener>() {
124                 @Override
125                 public PCEPSessionListener getSessionListener() {
126                     return new SimpleSessionListener(lspsPerPcc, pcerr, localAddress.getAddress());
127                 }
128             }, snf, getKeyMapping(pceAddress.getAddress(), password));
129         }
130     }
131
132     private static SessionNegotiatorFactory<Message, PCEPSessionImpl, PCEPSessionListener> getSessionNegotiatorFactory(final Open openMessage) {
133         return new DefaultPCEPSessionNegotiatorFactory(openMessage, 0);
134     }
135
136     private static ch.qos.logback.classic.Logger getRootLogger(final LoggerContext lc) {
137         return Iterables.find(lc.getLoggerList(), new Predicate<Logger>() {
138             @Override
139             public boolean apply(final Logger input) {
140                 return (input != null) ? input.getName().equals(Logger.ROOT_LOGGER_NAME) : false;
141             }
142         });
143     }
144
145     private static List<InetSocketAddress> parseAddresses(final String address, final int defaultPort) {
146         return Lists.transform(Arrays.asList(address.split(",")), new Function<String, InetSocketAddress>() {
147             @Override
148             public InetSocketAddress apply(final String input) {
149                 return getInetSocketAddress(input, defaultPort);
150             }
151         });
152     }
153
154     private static InetSocketAddress getInetSocketAddress(final String hostPortString, final int defaultPort) {
155         final HostAndPort hostAndPort = HostAndPort.fromString(hostPortString).withDefaultPort(defaultPort);
156         return new InetSocketAddress(hostAndPort.getHostText(), hostAndPort.getPort());
157     }
158
159     private static KeyMapping getKeyMapping(final InetAddress inetAddress, final String password) {
160         if (password != null) {
161             final KeyMapping keyMapping = new KeyMapping();
162             keyMapping.put(inetAddress, password.getBytes(Charsets.US_ASCII));
163             return keyMapping;
164         }
165         return null;
166     }
167
168     private static Open getOpenMessage(final short keepalive, final short deadtimer) {
169         final Tlvs1 tlvs1 = new Tlvs1Builder().setStateful(new StatefulBuilder().addAugmentation(Stateful1.class,
170                 new Stateful1Builder().setInitiation(true).build()).setLspUpdateCapability(true).build()).build();
171         return new OpenBuilder().setTlvs(new TlvsBuilder().addAugmentation(Tlvs1.class, tlvs1).build())
172                 .setKeepalive(keepalive).setDeadTimer(deadtimer).setSessionId((short) 0).build();
173     }
174
175     private static void startActivators() {
176         final PCCActivator pccActivator = new PCCActivator();
177         final StatefulActivator stateful = new StatefulActivator();
178         final CrabbeInitiatedActivator activator = new CrabbeInitiatedActivator();
179         final PCEPExtensionProviderContext ctx = ServiceLoaderPCEPExtensionProviderContext.getSingletonInstance();
180         pccActivator.start(ctx);
181         stateful.start(ctx);
182         activator.start(ctx);
183     }
184
185 }