Disconnect bgp-rib-impl from global event loop groups
[bgpcep.git] / bgp / testtool / src / main / java / org / opendaylight / protocol / bgp / testtool / BGPTestTool.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.bgp.testtool.BGPPeerBuilder.createPeer;
11
12 import com.google.common.collect.Lists;
13 import com.google.common.net.InetAddresses;
14 import java.net.InetAddress;
15 import java.net.InetSocketAddress;
16 import java.util.ArrayList;
17 import java.util.HashMap;
18 import java.util.List;
19 import java.util.Map;
20 import java.util.ServiceLoader;
21 import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionConsumerContext;
22 import org.opendaylight.protocol.bgp.rib.impl.BGPDispatcherImpl;
23 import org.opendaylight.protocol.bgp.rib.impl.BGPNettyGroups;
24 import org.opendaylight.protocol.bgp.rib.impl.StrictBGPPeerRegistry;
25 import org.opendaylight.protocol.bgp.rib.impl.spi.BGPDispatcher;
26 import org.opendaylight.protocol.bgp.rib.spi.BGPSessionListener;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.AsNumber;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev200120.EvpnSubsequentAddressFamily;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev200120.L2vpnAddressFamily;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.l3vpn.mcast.rev180417.McastMplsLabeledVpnSubsequentAddressFamily;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.LinkstateAddressFamily;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.LinkstateSubsequentAddressFamily;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev200120.open.message.BgpParameters;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev200120.open.message.BgpParametersBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev200120.open.message.bgp.parameters.OptionalCapabilities;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev200120.open.message.bgp.parameters.OptionalCapabilitiesBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev200120.open.message.bgp.parameters.optional.capabilities.CParametersBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev200120.open.message.bgp.parameters.optional.capabilities.c.parameters.As4BytesCapabilityBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.CParameters1Builder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.SendReceive;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.mp.capabilities.AddPathCapabilityBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.mp.capabilities.MultiprotocolCapabilityBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.mp.capabilities.add.path.capability.AddressFamiliesBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.route.target.constrain.rev180618.RouteTargetConstrainSubsequentAddressFamily;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.AddressFamily;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.Ipv4AddressFamily;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.Ipv6AddressFamily;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.MplsLabeledVpnSubsequentAddressFamily;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.SubsequentAddressFamily;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.UnicastSubsequentAddressFamily;
51
52 final class BGPTestTool {
53     private final Map<String, BGPSessionListener> listeners = new HashMap<>();
54
55     void start(final Arguments arguments) {
56         final BGPDispatcher dispatcher = initializeActivator();
57
58         final ArrayList<OptionalCapabilities> optCap = Lists.newArrayList(createMPCapability(Ipv4AddressFamily.VALUE,
59                 UnicastSubsequentAddressFamily.VALUE),
60             createMPCapability(LinkstateAddressFamily.VALUE, LinkstateSubsequentAddressFamily.VALUE),
61             createMPCapability(Ipv4AddressFamily.VALUE, MplsLabeledVpnSubsequentAddressFamily.VALUE),
62             createMPCapability(Ipv6AddressFamily.VALUE, MplsLabeledVpnSubsequentAddressFamily.VALUE),
63             createMPCapability(Ipv4AddressFamily.VALUE, McastMplsLabeledVpnSubsequentAddressFamily.VALUE),
64             createMPCapability(Ipv6AddressFamily.VALUE, McastMplsLabeledVpnSubsequentAddressFamily.VALUE),
65             createMPCapability(L2vpnAddressFamily.VALUE, EvpnSubsequentAddressFamily.VALUE),
66             createMPCapability(Ipv4AddressFamily.VALUE, RouteTargetConstrainSubsequentAddressFamily.VALUE),
67                 createAs4BytesMPCapability(arguments.getAs()));
68         if (arguments.getMultiPathSupport()) {
69             optCap.add(createAddPathCapability());
70         }
71         final BgpParameters bgpParameters = createBgpParameters(optCap);
72
73         final InetSocketAddress localAddress = arguments.getLocalAddresses();
74         final int port = localAddress.getPort();
75         InetAddress address = localAddress.getAddress();
76         int numberOfSpeakers = arguments.getSpeakerCount();
77         do {
78             final BGPSessionListener sessionListener = new TestingListener(arguments.getNumberOfPrefixes(),
79                     arguments.getExtendedCommunities(),
80                 arguments.getMultiPathSupport());
81             listeners.put(address.getHostAddress(), sessionListener);
82             createPeer(dispatcher, arguments, new InetSocketAddress(address, port), sessionListener, bgpParameters);
83             numberOfSpeakers--;
84             address = InetAddresses.increment(address);
85         } while (numberOfSpeakers > 0);
86     }
87
88     private static BGPDispatcher initializeActivator() {
89         return new BGPDispatcherImpl(ServiceLoader.load(BGPExtensionConsumerContext.class).findFirst().orElseThrow(),
90             new BGPNettyGroups(), new StrictBGPPeerRegistry());
91     }
92
93     private static OptionalCapabilities createMPCapability(final AddressFamily afi,
94             final SubsequentAddressFamily safi) {
95         return new OptionalCapabilitiesBuilder()
96                 .setCParameters(new CParametersBuilder()
97                     .addAugmentation(new CParameters1Builder()
98                         .setMultiprotocolCapability(new MultiprotocolCapabilityBuilder()
99                             .setAfi(afi)
100                             .setSafi(safi)
101                             .build())
102                         .build())
103                     .build())
104                 .build();
105     }
106
107     private static OptionalCapabilities createAs4BytesMPCapability(final AsNumber as) {
108         return new OptionalCapabilitiesBuilder().setCParameters(new CParametersBuilder()
109             .setAs4BytesCapability(new As4BytesCapabilityBuilder().setAsNumber(as).build()).build()).build();
110     }
111
112     private static BgpParameters createBgpParameters(final List<OptionalCapabilities> optionalCapabilities) {
113         return new BgpParametersBuilder().setOptionalCapabilities(optionalCapabilities).build();
114     }
115
116     private static OptionalCapabilities createAddPathCapability() {
117         return new OptionalCapabilitiesBuilder()
118                 .setCParameters(new CParametersBuilder()
119                     .addAugmentation(new CParameters1Builder()
120                         .setAddPathCapability(new AddPathCapabilityBuilder()
121                             .setAddressFamilies(Lists.newArrayList(new AddressFamiliesBuilder()
122                                 .setAfi(Ipv4AddressFamily.VALUE)
123                                 .setSafi(UnicastSubsequentAddressFamily.VALUE)
124                                 .setSendReceive(SendReceive.Both)
125                                 .build()))
126                             .build())
127                         .build())
128                     .build())
129                 .build();
130     }
131
132     void printCount(final String localAddress) {
133         final BGPSessionListener listener = listeners.get(localAddress);
134         if (listener != null) {
135             ((TestingListener) listener).printCount(localAddress);
136         }
137     }
138 }