2 * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
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
9 package org.opendaylight.protocol.pcep.pcc.mock;
11 import com.google.common.base.Optional;
12 import com.google.common.collect.Lists;
13 import com.google.common.net.InetAddresses;
14 import io.netty.util.HashedWheelTimer;
15 import io.netty.util.Timer;
16 import java.math.BigInteger;
17 import java.net.InetAddress;
18 import java.net.InetSocketAddress;
19 import java.util.List;
20 import javax.annotation.Nonnull;
21 import javax.annotation.Nullable;
22 import org.opendaylight.protocol.concepts.KeyMapping;
23 import org.opendaylight.protocol.pcep.PCEPCapability;
24 import org.opendaylight.protocol.pcep.PCEPSessionNegotiatorFactory;
25 import org.opendaylight.protocol.pcep.ietf.initiated00.CrabbeInitiatedActivator;
26 import org.opendaylight.protocol.pcep.ietf.stateful07.StatefulActivator;
27 import org.opendaylight.protocol.pcep.impl.BasePCEPSessionProposalFactory;
28 import org.opendaylight.protocol.pcep.impl.DefaultPCEPSessionNegotiatorFactory;
29 import org.opendaylight.protocol.pcep.impl.PCEPSessionImpl;
30 import org.opendaylight.protocol.pcep.pcc.mock.api.PCCTunnelManager;
31 import org.opendaylight.protocol.pcep.pcc.mock.protocol.PCCDispatcherImpl;
32 import org.opendaylight.protocol.pcep.pcc.mock.protocol.PCCSessionListener;
33 import org.opendaylight.protocol.pcep.spi.PCEPExtensionProviderContext;
34 import org.opendaylight.protocol.pcep.spi.pojo.ServiceLoaderPCEPExtensionProviderContext;
35 import org.opendaylight.protocol.pcep.sync.optimizations.SyncOptimizationsActivator;
37 final class PCCsBuilder {
38 private final int lsps;
39 private final boolean pcError;
40 private final int pccCount;
41 private final InetSocketAddress localAddress;
42 private final List<InetSocketAddress> remoteAddress;
43 private final short keepAlive;
44 private final short deadTimer;
45 private final String password;
46 private final long reconnectTime;
47 private final int redelegationTimeout;
48 private final int stateTimeout;
49 private final PCEPCapability pcepCapabilities;
50 private final Timer timer = new HashedWheelTimer();
51 private PCCDispatcherImpl pccDispatcher;
53 PCCsBuilder(final int lsps, final boolean pcError, final int pccCount,
54 @Nonnull final InetSocketAddress localAddress, @Nonnull final List<InetSocketAddress> remoteAddress,
55 final short keepAlive, final short deadTimer, @Nullable final String password, final long reconnectTime,
56 final int redelegationTimeout, final int stateTimeout, @Nonnull final PCEPCapability pcepCapabilities) {
58 this.pcError = pcError;
59 this.pccCount = pccCount;
60 this.localAddress = localAddress;
61 this.remoteAddress = remoteAddress;
62 this.keepAlive = keepAlive;
63 this.deadTimer = deadTimer;
64 this.password = password;
65 this.reconnectTime = reconnectTime;
66 this.redelegationTimeout = redelegationTimeout;
67 this.stateTimeout = stateTimeout;
68 this.pcepCapabilities = pcepCapabilities;
72 void createPCCs(final BigInteger initialDBVersion, final Optional<TimerHandler> timerHandler) {
73 InetAddress currentAddress = this.localAddress.getAddress();
74 this.pccDispatcher = new PCCDispatcherImpl(ServiceLoaderPCEPExtensionProviderContext.getSingletonInstance()
75 .getMessageHandlerRegistry());
76 if (timerHandler.isPresent()) {
77 timerHandler.get().setPCCDispatcher(this.pccDispatcher);
79 for (int i = 0; i < this.pccCount; i++) {
80 final PCCTunnelManager tunnelManager = new PCCTunnelManagerImpl(this.lsps, currentAddress,
81 this.redelegationTimeout, this.stateTimeout, this.timer, timerHandler);
82 createPCC(new InetSocketAddress(currentAddress, this.localAddress.getPort()), tunnelManager,
84 currentAddress = InetAddresses.increment(currentAddress);
88 private void createPCC(@Nonnull final InetSocketAddress plocalAddress,
89 final PCCTunnelManager tunnelManager, final BigInteger initialDBVersion) {
90 final PCEPSessionNegotiatorFactory<PCEPSessionImpl> snf = getSessionNegotiatorFactory();
91 for (final InetSocketAddress pceAddress : this.remoteAddress) {
92 this.pccDispatcher.createClient(pceAddress, this.reconnectTime, () -> new PCCSessionListener(
93 this.remoteAddress.indexOf(pceAddress), tunnelManager, this.pcError), snf,
94 KeyMapping.getKeyMapping(pceAddress.getAddress(), this.password), plocalAddress, initialDBVersion);
98 private PCEPSessionNegotiatorFactory<PCEPSessionImpl> getSessionNegotiatorFactory() {
99 final List<PCEPCapability> capabilities = Lists.newArrayList(this.pcepCapabilities);
100 return new DefaultPCEPSessionNegotiatorFactory(new BasePCEPSessionProposalFactory(this.deadTimer,
101 this.keepAlive, capabilities), 0);
104 private static void startActivators() {
105 final PCCActivator pccActivator = new PCCActivator();
106 final StatefulActivator stateful = new StatefulActivator();
107 final SyncOptimizationsActivator optimizationsActivator = new SyncOptimizationsActivator();
108 final CrabbeInitiatedActivator activator = new CrabbeInitiatedActivator();
109 final PCEPExtensionProviderContext ctx = ServiceLoaderPCEPExtensionProviderContext.getSingletonInstance();
110 pccActivator.start(ctx);
112 optimizationsActivator.start(ctx);
113 activator.start(ctx);