Bug-2167: Enable pcc-mock to be bindable to differnet source addresses.
[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 com.google.common.base.Preconditions;
12 import com.google.common.net.InetAddresses;
13 import io.netty.util.concurrent.DefaultPromise;
14 import io.netty.util.concurrent.GlobalEventExecutor;
15 import java.net.InetAddress;
16 import java.net.InetSocketAddress;
17 import java.net.UnknownHostException;
18 import java.util.concurrent.ExecutionException;
19 import org.opendaylight.protocol.framework.NeverReconnectStrategy;
20 import org.opendaylight.protocol.framework.SessionListenerFactory;
21 import org.opendaylight.protocol.framework.SessionNegotiatorFactory;
22 import org.opendaylight.protocol.pcep.PCEPSessionListener;
23 import org.opendaylight.protocol.pcep.ietf.stateful07.StatefulActivator;
24 import org.opendaylight.protocol.pcep.impl.DefaultPCEPSessionNegotiatorFactory;
25 import org.opendaylight.protocol.pcep.impl.PCEPHandlerFactory;
26 import org.opendaylight.protocol.pcep.impl.PCEPSessionImpl;
27 import org.opendaylight.protocol.pcep.spi.pojo.ServiceLoaderPCEPExtensionProviderContext;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Message;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.OpenBuilder;
30 import org.slf4j.Logger;
31 import org.slf4j.LoggerFactory;
32
33 public final class Main {
34
35     private static final Logger LOG = LoggerFactory.getLogger(Main.class);
36
37     private static final int DEFAULT_PORT = 4189;
38     private static final short DEFAULT_KEEP_ALIVE = 30;
39     private static final short DEFAULT_DEAD_TIMER = 120;
40     private static final int RECONNECT_STRATEGY_TIMEOUT = 2000;
41
42     public static void main(String[] args) throws InterruptedException, ExecutionException, UnknownHostException {
43
44         if (args.length < 2) {
45             LOG.info("Insufficient number of arguments {}.", args.length);
46             return;
47         }
48
49         InetAddress localAddress = InetAddress.getByName("127.0.0.1");
50         InetAddress remoteAddress = null;
51         int pccCount = 1;
52         int lsps = 1;
53         boolean pcError = false;
54
55         int argIdx = 0;
56         while (argIdx < args.length) {
57             if (args[argIdx].equals("--local-address")) {
58                 localAddress = InetAddress.getByName(args[argIdx + 1]);
59                 argIdx++;
60             } else if (args[argIdx].equals("--remote-address")) {
61                 remoteAddress = InetAddress.getByName(args[argIdx + 1]);
62                 argIdx++;
63             } else if (args[argIdx].equals("--pcc")) {
64                 pccCount = Integer.valueOf(args[argIdx + 1]);
65                 argIdx++;
66             } else if (args[argIdx].equals("--lsp")) {
67                 lsps = Integer.valueOf(args[argIdx + 1]);
68                 argIdx++;
69             } else if (args[argIdx].equals("--pcerr")) {
70                 pcError = true;
71                 argIdx++;
72             } else {
73                 LOG.warn("WARNING: Unrecognized argument: {}", args[argIdx]);
74             }
75             argIdx++;
76         }
77         Preconditions.checkState(remoteAddress != null, "Missing mandatory remote-address parameter.");
78         createPCCs(lsps, pcError, pccCount, localAddress, remoteAddress);
79     }
80
81     public static void createPCCs(final int lspsPerPcc, final boolean pcerr, final int pccCount,
82             final InetAddress localAddress, final InetAddress remoteAddress) throws InterruptedException, ExecutionException {
83         final SessionNegotiatorFactory<Message, PCEPSessionImpl, PCEPSessionListener> snf = new DefaultPCEPSessionNegotiatorFactory(
84                 new OpenBuilder().setKeepalive(DEFAULT_KEEP_ALIVE).setDeadTimer(DEFAULT_DEAD_TIMER).setSessionId((short) 0).build(), 0);
85
86         final StatefulActivator activator07 = new StatefulActivator();
87         final PCCActivator activator = new PCCActivator();
88         activator07.start(ServiceLoaderPCEPExtensionProviderContext.getSingletonInstance());
89         activator.start(ServiceLoaderPCEPExtensionProviderContext.getSingletonInstance());
90         final PCCMock<Message, PCEPSessionImpl, PCEPSessionListener> pcc = new PCCMock<>(snf, new PCEPHandlerFactory(
91                 ServiceLoaderPCEPExtensionProviderContext.getSingletonInstance().getMessageHandlerRegistry()),
92                 new DefaultPromise<PCEPSessionImpl>(GlobalEventExecutor.INSTANCE));
93
94         final InetAddress pceAddress = remoteAddress;
95         InetAddress currentAddress = localAddress;
96         int i = 0;
97         while (i < pccCount) {
98             final int pccNumber = i + 1;
99             final InetAddress pccAddress = currentAddress;
100             pcc.createClient(new InetSocketAddress(pccAddress, 0), new InetSocketAddress(pceAddress, DEFAULT_PORT),
101                     new NeverReconnectStrategy(GlobalEventExecutor.INSTANCE, RECONNECT_STRATEGY_TIMEOUT),
102                     new SessionListenerFactory<PCEPSessionListener>() {
103
104                         @Override
105                         public PCEPSessionListener getSessionListener() {
106                             return new SimpleSessionListener(lspsPerPcc, pcerr, pccNumber, pccAddress);
107                         }
108                     }).get();
109             i++;
110             currentAddress = InetAddresses.increment(currentAddress);
111         }
112     }
113
114 }