Promote MessageRegistry to pcep-api
[bgpcep.git] / pcep / pcc-mock / src / main / java / org / opendaylight / protocol / pcep / pcc / mock / PCCsBuilder.java
1 /*
2  * Copyright (c) 2015 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.pcep.pcc.mock;
9
10 import static java.util.Objects.requireNonNull;
11
12 import com.google.common.net.InetAddresses;
13 import io.netty.util.HashedWheelTimer;
14 import io.netty.util.Timer;
15 import java.net.InetAddress;
16 import java.net.InetSocketAddress;
17 import java.util.List;
18 import java.util.Optional;
19 import org.eclipse.jdt.annotation.NonNull;
20 import org.eclipse.jdt.annotation.Nullable;
21 import org.opendaylight.protocol.concepts.KeyMapping;
22 import org.opendaylight.protocol.pcep.MessageRegistry;
23 import org.opendaylight.protocol.pcep.PCEPCapability;
24 import org.opendaylight.protocol.pcep.PCEPSessionNegotiatorFactory;
25 import org.opendaylight.protocol.pcep.impl.BasePCEPSessionProposalFactory;
26 import org.opendaylight.protocol.pcep.impl.DefaultPCEPSessionNegotiatorFactory;
27 import org.opendaylight.protocol.pcep.pcc.mock.api.PCCTunnelManager;
28 import org.opendaylight.protocol.pcep.pcc.mock.protocol.MockPcepSessionErrorPolicy;
29 import org.opendaylight.protocol.pcep.pcc.mock.protocol.PCCDispatcherImpl;
30 import org.opendaylight.protocol.pcep.pcc.mock.protocol.PCCSessionListener;
31 import org.opendaylight.protocol.pcep.spi.pojo.DefaultPCEPExtensionConsumerContext;
32 import org.opendaylight.yangtools.yang.common.Uint64;
33 import org.opendaylight.yangtools.yang.common.Uint8;
34
35 final class PCCsBuilder {
36     private final int lsps;
37     private final boolean pcError;
38     private final int pccCount;
39     private final InetSocketAddress localAddress;
40     private final List<InetSocketAddress> remoteAddress;
41     private final Uint8 keepAlive;
42     private final Uint8 deadTimer;
43     private final String password;
44     private final long reconnectTime;
45     private final int redelegationTimeout;
46     private final int stateTimeout;
47     private final PCEPCapability pcepCapabilities;
48     private final Timer timer = new HashedWheelTimer();
49     private final MessageRegistry registry;
50
51     PCCsBuilder(final int lsps, final boolean pcError, final int pccCount,
52             final @NonNull InetSocketAddress localAddress, final @NonNull List<InetSocketAddress> remoteAddress,
53             final @NonNull Uint8 keepAlive, final @NonNull Uint8 deadTimer, final @Nullable String password,
54             final long reconnectTime, final int redelegationTimeout, final int stateTimeout,
55             final @NonNull PCEPCapability pcepCapabilities) {
56         this.lsps = lsps;
57         this.pcError = pcError;
58         this.pccCount = pccCount;
59         this.localAddress = localAddress;
60         this.remoteAddress = remoteAddress;
61         this.keepAlive = requireNonNull(keepAlive);
62         this.deadTimer = requireNonNull(deadTimer);
63         this.password = password;
64         this.reconnectTime = reconnectTime;
65         this.redelegationTimeout = redelegationTimeout;
66         this.stateTimeout = stateTimeout;
67         this.pcepCapabilities = pcepCapabilities;
68
69         registry = new DefaultPCEPExtensionConsumerContext().getMessageHandlerRegistry();
70     }
71
72     void createPCCs(final Uint64 initialDBVersion, final Optional<TimerHandler> timerHandler) {
73         InetAddress currentAddress = localAddress.getAddress();
74         PCCDispatcherImpl pccDispatcher = new PCCDispatcherImpl(registry);
75
76         if (timerHandler.isPresent()) {
77             timerHandler.get().setPCCDispatcher(pccDispatcher);
78         }
79         for (int i = 0; i < pccCount; i++) {
80             final PCCTunnelManager tunnelManager = new PCCTunnelManagerImpl(lsps, currentAddress,
81                 redelegationTimeout, stateTimeout, timer, timerHandler);
82             createPCC(pccDispatcher, new InetSocketAddress(currentAddress, localAddress.getPort()), tunnelManager,
83                 initialDBVersion);
84             currentAddress = InetAddresses.increment(currentAddress);
85         }
86     }
87
88     private void createPCC(final PCCDispatcherImpl pccDispatcher, final @NonNull InetSocketAddress plocalAddress,
89             final PCCTunnelManager tunnelManager, final Uint64 initialDBVersion) {
90         final PCEPSessionNegotiatorFactory snf = getSessionNegotiatorFactory();
91         for (final InetSocketAddress pceAddress : remoteAddress) {
92             pccDispatcher.createClient(pceAddress, reconnectTime,
93                 () -> new PCCSessionListener(remoteAddress.indexOf(pceAddress), tunnelManager, pcError), snf,
94                     password == null ? KeyMapping.of() : KeyMapping.of(pceAddress.getAddress(), password),
95                         plocalAddress, initialDBVersion);
96         }
97     }
98
99     private PCEPSessionNegotiatorFactory getSessionNegotiatorFactory() {
100         return new DefaultPCEPSessionNegotiatorFactory(new BasePCEPSessionProposalFactory(deadTimer,
101             keepAlive, List.of(pcepCapabilities)), MockPcepSessionErrorPolicy.ZERO);
102     }
103 }