import static org.opendaylight.protocol.bgp.rib.impl.config.OpenConfigMappingUtil.APPLICATION_PEER_GROUP_NAME;
import static org.opendaylight.protocol.bgp.rib.impl.config.OpenConfigMappingUtil.APPLICATION_PEER_GROUP_NAME_OPT;
import static org.opendaylight.protocol.bgp.rib.impl.config.OpenConfigMappingUtil.getNeighborInstanceIdentifier;
-import static org.opendaylight.protocol.bgp.rib.impl.config.OpenConfigMappingUtil.getNeighborInstanceName;
import static org.opendaylight.protocol.bgp.rib.impl.config.OpenConfigMappingUtil.getRibInstanceName;
import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.MoreExecutors;
import com.google.common.util.concurrent.SettableFuture;
import java.util.ArrayList;
-import java.util.Dictionary;
import java.util.HashMap;
-import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import javax.annotation.Nonnull;
import javax.annotation.concurrent.GuardedBy;
import org.apache.commons.lang3.StringUtils;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
+import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
+import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
+import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeFactory;
import org.opendaylight.mdsal.common.api.CommitInfo;
+import org.opendaylight.mdsal.dom.api.DOMSchemaService;
import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService;
import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider;
import org.opendaylight.mdsal.singleton.common.api.ServiceGroupIdentifier;
+import org.opendaylight.protocol.bgp.openconfig.routing.policy.spi.BGPRibRoutingPolicyFactory;
import org.opendaylight.protocol.bgp.openconfig.spi.BGPTableTypeRegistryConsumer;
-import org.opendaylight.protocol.bgp.rib.impl.spi.InstanceType;
+import org.opendaylight.protocol.bgp.rib.impl.spi.BGPDispatcher;
+import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionConsumerContext;
import org.opendaylight.protocol.bgp.rib.spi.util.ClusterSingletonServiceRegistrationHelper;
import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.Config;
import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.Neighbor;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NeighborPeerGroupConfig;
import org.opendaylight.yangtools.yang.binding.DataObject;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceRegistration;
-import org.osgi.service.blueprint.container.BlueprintContainer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@GuardedBy("this")
private final Map<String, List<PeerBean>> peersGroups = new HashMap<>();
private final BGPTableTypeRegistryConsumer tableTypeRegistry;
- private final BlueprintContainer container;
- private final BundleContext bundleContext;
private final ServiceGroupIdentifier serviceGroupIdentifier;
private final AtomicBoolean instantiated = new AtomicBoolean(false);
private final PeerGroupConfigLoader peerGroupLoader;
private RibImpl ribImpl;
+ private final RIBExtensionConsumerContext ribExtensionContext;
+ private final BGPDispatcher dispatcher;
+ private final BGPRibRoutingPolicyFactory policyFactory;
+ private final BindingCodecTreeFactory codecFactory;
+ private final DOMDataBroker domBroker;
+ private final DataBroker dataBroker;
+ private final DOMSchemaService schemaService;
+ private final RpcProviderRegistry rpcRegistry;
BGPClusterSingletonService(
@Nonnull final PeerGroupConfigLoader peerGroupLoader,
@Nonnull final ClusterSingletonServiceProvider provider,
@Nonnull final BGPTableTypeRegistryConsumer tableTypeRegistry,
- @Nonnull final BlueprintContainer container,
- @Nonnull final BundleContext bundleContext,
- @Nonnull final InstanceIdentifier<Bgp> bgpIid) {
+ @Nonnull final InstanceIdentifier<Bgp> bgpIid,
+ @Nonnull final RIBExtensionConsumerContext ribExtensionContext,
+ @Nonnull final BGPDispatcher dispatcher,
+ @Nonnull final BGPRibRoutingPolicyFactory policyFactory,
+ @Nonnull final BindingCodecTreeFactory codecFactory,
+ @Nonnull final DOMDataBroker domBroker,
+ @Nonnull final DataBroker dataBroker,
+ @Nonnull final DOMSchemaService schemaService,
+ @Nonnull final RpcProviderRegistry rpcRegistry) {
this.peerGroupLoader = peerGroupLoader;
this.tableTypeRegistry = tableTypeRegistry;
- this.container = container;
- this.bundleContext = bundleContext;
this.bgpIid = bgpIid;
+ this.ribExtensionContext = ribExtensionContext;
+ this.dispatcher = dispatcher;
+ this.policyFactory = policyFactory;
+ this.codecFactory = codecFactory;
+ this.domBroker = domBroker;
+ this.dataBroker = dataBroker;
+ this.schemaService = schemaService;
+ this.rpcRegistry = rpcRegistry;
final String ribInstanceName = getRibInstanceName(bgpIid);
this.serviceGroupIdentifier = ServiceGroupIdentifier.create(ribInstanceName + "-service-group");
LOG.info("BGPClusterSingletonService {} registered", this.serviceGroupIdentifier.getValue());
private synchronized void onGlobalCreated(final Global global) {
LOG.debug("Creating RIB instance with configuration: {}", global);
- this.ribImpl = (RibImpl) this.container.getComponentInstance(InstanceType.RIB.getBeanName());
+ this.ribImpl = new RibImpl(ribExtensionContext, dispatcher, policyFactory, codecFactory, domBroker, dataBroker,
+ schemaService);
initiateRibInstance(global, this.ribImpl);
LOG.debug("RIB instance created: {}", this.ribImpl);
}
private synchronized void initiateRibInstance(final Global global, final RibImpl ribImpl) {
final String ribInstanceName = getRibInstanceName(this.bgpIid);
ribImpl.start(global, ribInstanceName, this.tableTypeRegistry);
- registerRibInstance(ribImpl, ribInstanceName);
if (this.instantiated.get()) {
this.ribImpl.instantiateServiceInstance();
}
return filtered;
}
- private synchronized void registerRibInstance(final RibImpl ribImpl, final String ribInstanceName) {
- final Dictionary<String, String> properties = new Hashtable<>();
- properties.put(InstanceType.RIB.getBeanName(), ribInstanceName);
- final ServiceRegistration<?> serviceRegistration = this.bundleContext.registerService(
- InstanceType.RIB.getServices(), ribImpl, properties);
- ribImpl.setServiceRegistration(serviceRegistration);
- }
-
@Override
public void close() {
LOG.info("BGPClusterSingletonService {} close", this.serviceGroupIdentifier.getValue());
LOG.debug("Creating Peer instance with configuration: {}", neighbor);
final PeerBean bgpPeer;
if (OpenConfigMappingUtil.isApplicationPeer(neighbor)) {
- bgpPeer = (PeerBean) this.container.getComponentInstance(InstanceType.APP_PEER.getBeanName());
+ bgpPeer = new AppPeer();
} else {
- bgpPeer = (PeerBean) this.container.getComponentInstance(InstanceType.PEER.getBeanName());
+ bgpPeer = new BgpPeer(this.rpcRegistry);
}
final InstanceIdentifier<Neighbor> neighborInstanceIdentifier =
getNeighborInstanceIdentifier(this.bgpIid, neighbor.key());
closePeer(bgpPeer);
}
- private synchronized void registerPeerInstance(final BgpPeer bgpPeer, final String peerInstanceName) {
- final Dictionary<String, String> properties = new Hashtable<>();
- properties.put(InstanceType.PEER.getBeanName(), peerInstanceName);
- final ServiceRegistration<?> serviceRegistration = this.bundleContext
- .registerService(InstanceType.PEER.getServices(), bgpPeer, properties);
- bgpPeer.setServiceRegistration(serviceRegistration);
- }
-
- private synchronized void registerAppPeerInstance(final AppPeer appPeer, final String peerInstanceName) {
- final Dictionary<String, String> properties = new Hashtable<>();
- properties.put(InstanceType.PEER.getBeanName(), peerInstanceName);
- final ServiceRegistration<?> serviceRegistration = this.bundleContext
- .registerService(InstanceType.APP_PEER.getServices(), appPeer, properties);
- appPeer.setServiceRegistration(serviceRegistration);
- }
-
private synchronized void initiatePeerInstance(final InstanceIdentifier<Neighbor> neighborIdentifier,
final Neighbor neighbor, final PeerBean bgpPeer) {
- final String peerInstanceName = getNeighborInstanceName(neighborIdentifier);
if (this.ribImpl != null) {
bgpPeer.start(this.ribImpl, neighbor, this.bgpIid, this.peerGroupLoader, this.tableTypeRegistry);
- if (bgpPeer instanceof BgpPeer) {
- registerPeerInstance((BgpPeer) bgpPeer, peerInstanceName);
- } else if (bgpPeer instanceof AppPeer) {
- registerAppPeerInstance((AppPeer) bgpPeer, peerInstanceName);
- }
}
if (this.instantiated.get()) {
bgpPeer.instantiateServiceInstance();