83cbfe361eec9cdf6c8bcf447072e7382a0174ad
[bgpcep.git] / pcep / topology / topology-provider / src / main / java / org / opendaylight / bgpcep / pcep / topology / provider / config / PCEPTopologyProviderBean.java
1 /*
2  * Copyright (c) 2017 Pantheon Technologies s.r.o. 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.bgpcep.pcep.topology.provider.config;
9
10 import static com.google.common.base.Preconditions.checkState;
11 import static java.util.Objects.requireNonNull;
12
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;
29
30 final class PCEPTopologyProviderBean implements PCEPTopologyProviderDependencies, AutoCloseable {
31     private static final Logger LOG = LoggerFactory.getLogger(PCEPTopologyProviderBean.class);
32
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;
39     @GuardedBy("this")
40     private PCEPTopologyProviderSingleton pcepTopoProviderCSS;
41
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);
55
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");
62         }
63     }
64
65     synchronized FluentFuture<? extends CommitInfo> closeServiceInstance() {
66         if (pcepTopoProviderCSS != null) {
67             return pcepTopoProviderCSS.closeServiceInstance();
68         }
69         return CommitInfo.emptyFluentFuture();
70     }
71
72     @Override
73     public synchronized void close() throws Exception {
74         if (pcepTopoProviderCSS != null) {
75             pcepTopoProviderCSS.close();
76             pcepTopoProviderCSS = null;
77         }
78     }
79
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);
85         try {
86             pcepTopoProviderCSS = new PCEPTopologyProviderSingleton(configDependencies, this, instructionScheduler,
87                 cssp, bundleContext);
88         } catch (final Exception e) {
89             LOG.debug("Failed to create PCEPTopologyProvider {}", configDependencies.getTopologyId().getValue(), e);
90         }
91     }
92
93     @Override
94     public PCEPDispatcher getPCEPDispatcher() {
95         return pcepDispatcher;
96     }
97
98     @Override
99     public RpcProviderService getRpcProviderRegistry() {
100         return rpcProviderRegistry;
101     }
102
103     @Override
104     public DataBroker getDataBroker() {
105         return dataBroker;
106     }
107
108     @Override
109     public TopologySessionListenerFactory getTopologySessionListenerFactory() {
110         return sessionListenerFactory;
111     }
112
113     @Override
114     public TopologySessionStatsRegistry getStateRegistry() {
115         return stateRegistry;
116     }
117
118     @Override
119     public PceServerProvider getPceServerProvider() {
120         return pceServerProvider;
121     }
122 }