2 * Copyright (c) 2017 Pantheon Technologies s.r.o. 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
8 package org.opendaylight.bgpcep.pcep.topology.provider.config;
10 import static com.google.common.base.Preconditions.checkState;
11 import static java.util.Objects.requireNonNull;
13 import com.google.common.util.concurrent.FluentFuture;
14 import java.util.List;
15 import org.checkerframework.checker.lock.qual.GuardedBy;
16 import org.opendaylight.bgpcep.pcep.server.PceServerProvider;
17 import org.opendaylight.bgpcep.pcep.topology.provider.TopologySessionListenerFactory;
18 import org.opendaylight.bgpcep.pcep.topology.spi.stats.TopologySessionStatsRegistry;
19 import org.opendaylight.bgpcep.programming.spi.InstructionScheduler;
20 import org.opendaylight.mdsal.binding.api.DataBroker;
21 import org.opendaylight.mdsal.binding.api.RpcProviderService;
22 import org.opendaylight.mdsal.common.api.CommitInfo;
23 import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider;
24 import org.opendaylight.protocol.pcep.PCEPCapability;
25 import org.opendaylight.protocol.pcep.PCEPDispatcher;
26 import org.osgi.framework.BundleContext;
27 import org.slf4j.Logger;
28 import org.slf4j.LoggerFactory;
30 final class PCEPTopologyProviderBean implements PCEPTopologyProviderDependencies, AutoCloseable {
31 private static final Logger LOG = LoggerFactory.getLogger(PCEPTopologyProviderBean.class);
33 private final PCEPDispatcher pcepDispatcher;
34 private final DataBroker dataBroker;
35 private final TopologySessionListenerFactory sessionListenerFactory;
36 private final RpcProviderService rpcProviderRegistry;
37 private final TopologySessionStatsRegistry stateRegistry;
38 private final PceServerProvider pceServerProvider;
40 private PCEPTopologyProviderSingleton pcepTopoProviderCSS;
42 PCEPTopologyProviderBean(
43 final DataBroker dataBroker,
44 final PCEPDispatcher pcepDispatcher,
45 final RpcProviderService rpcProviderRegistry,
46 final TopologySessionListenerFactory sessionListenerFactory,
47 final TopologySessionStatsRegistry stateRegistry,
48 final PceServerProvider pceServerProvider) {
49 this.pcepDispatcher = requireNonNull(pcepDispatcher);
50 this.dataBroker = requireNonNull(dataBroker);
51 this.sessionListenerFactory = requireNonNull(sessionListenerFactory);
52 this.rpcProviderRegistry = requireNonNull(rpcProviderRegistry);
53 this.stateRegistry = requireNonNull(stateRegistry);
54 this.pceServerProvider = requireNonNull(pceServerProvider);
56 // FIXME: this check should happen before we attempt anything
57 final List<PCEPCapability> capabilities = pcepDispatcher.getPCEPSessionNegotiatorFactory()
58 .getPCEPSessionProposalFactory().getCapabilities();
59 if (!capabilities.stream().anyMatch(PCEPCapability::isStateful)) {
60 throw new IllegalStateException(
61 "Stateful capability not defined, aborting PCEP Topology Deployer instantiation");
65 synchronized FluentFuture<? extends CommitInfo> closeServiceInstance() {
66 if (pcepTopoProviderCSS != null) {
67 return pcepTopoProviderCSS.closeServiceInstance();
69 return CommitInfo.emptyFluentFuture();
73 public synchronized void close() throws Exception {
74 if (pcepTopoProviderCSS != null) {
75 pcepTopoProviderCSS.close();
76 pcepTopoProviderCSS = null;
80 @SuppressWarnings("checkstyle:IllegalCatch")
81 synchronized void start(final ClusterSingletonServiceProvider cssp,
82 final PCEPTopologyConfiguration configDependencies, final InstructionScheduler instructionScheduler,
83 final BundleContext bundleContext) {
84 checkState(pcepTopoProviderCSS == null, "Previous instance %s was not closed.", this);
86 pcepTopoProviderCSS = new PCEPTopologyProviderSingleton(configDependencies, this, instructionScheduler,
88 } catch (final Exception e) {
89 LOG.debug("Failed to create PCEPTopologyProvider {}", configDependencies.getTopologyId().getValue(), e);
94 public PCEPDispatcher getPCEPDispatcher() {
95 return pcepDispatcher;
99 public RpcProviderService getRpcProviderRegistry() {
100 return rpcProviderRegistry;
104 public DataBroker getDataBroker() {
109 public TopologySessionListenerFactory getTopologySessionListenerFactory() {
110 return sessionListenerFactory;
114 public TopologySessionStatsRegistry getStateRegistry() {
115 return stateRegistry;
119 public PceServerProvider getPceServerProvider() {
120 return pceServerProvider;