* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
-
package org.opendaylight.protocol.bgp.rib.impl.config;
import static org.opendaylight.protocol.bgp.rib.impl.config.OpenConfigMappingUtil.getAfiSafiWithDefault;
-import static org.opendaylight.protocol.bgp.rib.impl.config.OpenConfigMappingUtil.getClusterIdentifier;
+import static org.opendaylight.protocol.bgp.rib.impl.config.OpenConfigMappingUtil.getGlobalClusterIdentifier;
import static org.opendaylight.protocol.bgp.rib.impl.config.OpenConfigMappingUtil.toTableTypes;
import com.google.common.base.Preconditions;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
-import java.util.List;
+import com.google.common.util.concurrent.FluentFuture;
+import java.util.Collection;
import java.util.Map;
-import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
-import org.opendaylight.controller.md.sal.common.api.data.TransactionChainListener;
-import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
-import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeChangeService;
-import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain;
-import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeFactory;
-import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer;
-import org.opendaylight.mdsal.dom.api.DOMSchemaService;
+import org.opendaylight.mdsal.common.api.CommitInfo;
+import org.opendaylight.mdsal.dom.api.DOMDataBroker;
+import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeService;
+import org.opendaylight.mdsal.dom.api.DOMTransactionChain;
+import org.opendaylight.mdsal.dom.api.DOMTransactionChainListener;
import org.opendaylight.protocol.bgp.mode.api.PathSelectionMode;
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.BGPPeerTrackerImpl;
-import org.opendaylight.protocol.bgp.rib.impl.CodecsRegistryImpl;
import org.opendaylight.protocol.bgp.rib.impl.RIBImpl;
import org.opendaylight.protocol.bgp.rib.impl.spi.BGPDispatcher;
import org.opendaylight.protocol.bgp.rib.impl.spi.CodecsRegistry;
-import org.opendaylight.protocol.bgp.rib.impl.spi.ImportPolicyPeerTracker;
import org.opendaylight.protocol.bgp.rib.impl.spi.RIB;
import org.opendaylight.protocol.bgp.rib.impl.spi.RIBSupportContextRegistry;
import org.opendaylight.protocol.bgp.rib.spi.BGPPeerTracker;
-import org.opendaylight.protocol.bgp.rib.spi.ExportPolicyPeerTracker;
import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionConsumerContext;
-import org.opendaylight.protocol.bgp.rib.spi.RIBSupport;
import org.opendaylight.protocol.bgp.rib.spi.policy.BGPRibRoutingPolicy;
-import org.opendaylight.protocol.bgp.rib.spi.state.BGPRIBState;
-import org.opendaylight.protocol.bgp.rib.spi.state.BGPRIBStateConsumer;
+import org.opendaylight.protocol.bgp.rib.spi.state.BGPRibState;
+import org.opendaylight.protocol.bgp.rib.spi.state.BGPRibStateConsumer;
import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafi;
import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.global.base.Config;
import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.bgp.Global;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.AsNumber;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IetfInetUtil;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev171207.path.attributes.Attributes;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev171207.BgpTableType;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev171207.RibId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev171207.bgp.rib.Rib;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev171207.bgp.rib.RibKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev171207.rib.TablesKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.BgpId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.ClusterIdentifier;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4AddressNoZone;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.BgpTableType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.PeerId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.RibId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.bgp.rib.Rib;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.bgp.rib.RibKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.rib.TablesKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.BgpId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.ClusterIdentifier;
import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
-import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
-import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
-import org.opendaylight.yangtools.yang.model.api.SchemaContextListener;
-import org.osgi.framework.ServiceRegistration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-public final class RibImpl implements RIB, BGPRIBStateConsumer, AutoCloseable {
+public final class RibImpl implements RIB, BGPRibStateConsumer, AutoCloseable {
private static final Logger LOG = LoggerFactory.getLogger(RibImpl.class);
private final RIBExtensionConsumerContext extensions;
private final BGPDispatcher dispatcher;
- private final BindingCodecTreeFactory codecTreeFactory;
+ private final CodecsRegistry codecsRegistry;
private final DOMDataBroker domBroker;
- private final DOMSchemaService domSchemaService;
private final BGPRibRoutingPolicyFactory policyProvider;
- private final BindingNormalizedNodeSerializer bindingSerializer;
private RIBImpl ribImpl;
- private ServiceRegistration<?> serviceRegistration;
- private ListenerRegistration<SchemaContextListener> schemaContextRegistration;
- private List<AfiSafi> afiSafi;
+ private Collection<AfiSafi> afiSafi;
private AsNumber asNumber;
- private Ipv4Address routerId;
+ private Ipv4AddressNoZone routerId;
private ClusterIdentifier clusterId;
final RIBExtensionConsumerContext contextProvider,
final BGPDispatcher dispatcher,
final BGPRibRoutingPolicyFactory policyProvider,
- final BindingCodecTreeFactory codecTreeFactory,
- final DOMDataBroker domBroker,
- final DOMSchemaService domSchemaService,
- final BindingNormalizedNodeSerializer bindingSerializer
+ final CodecsRegistry codecsRegistry,
+ final DOMDataBroker domBroker
) {
this.extensions = contextProvider;
this.dispatcher = dispatcher;
- this.codecTreeFactory = codecTreeFactory;
+ this.codecsRegistry = codecsRegistry;
this.domBroker = domBroker;
- this.domSchemaService = domSchemaService;
this.policyProvider = policyProvider;
- this.bindingSerializer = bindingSerializer;
}
void start(final Global global, final String instanceName, final BGPTableTypeRegistryConsumer tableTypeRegistry) {
Preconditions.checkState(this.ribImpl == null,
"Previous instance %s was not closed.", this);
this.ribImpl = createRib(global, instanceName, tableTypeRegistry);
- this.schemaContextRegistration = this.domSchemaService.registerSchemaContextListener(this.ribImpl);
}
Boolean isGlobalEqual(final Global global) {
- final List<AfiSafi> globalAfiSafi = getAfiSafiWithDefault(global.getAfiSafis(), true);
+ final Collection<AfiSafi> globalAfiSafi = getAfiSafiWithDefault(global.getAfiSafis(), true).values();
final Config globalConfig = global.getConfig();
final AsNumber globalAs = globalConfig.getAs();
final Ipv4Address globalRouterId = global.getConfig().getRouterId();
- final ClusterIdentifier globalClusterId = getClusterIdentifier(globalConfig);
+ final ClusterIdentifier globalClusterId = getGlobalClusterIdentifier(globalConfig);
return this.afiSafi.containsAll(globalAfiSafi) && globalAfiSafi.containsAll(this.afiSafi)
&& globalAs.equals(this.asNumber)
&& globalRouterId.getValue().equals(this.routerId.getValue())
}
@Override
- public DOMTransactionChain createPeerChain(final TransactionChainListener listener) {
- return this.ribImpl.createPeerChain(listener);
+ public DOMTransactionChain createPeerDOMChain(final DOMTransactionChainListener listener) {
+ return this.ribImpl.createPeerDOMChain(listener);
}
@Override
return this.ribImpl.getService();
}
- ListenableFuture<Void> closeServiceInstance() {
+ FluentFuture<? extends CommitInfo> closeServiceInstance() {
if (this.ribImpl != null) {
return this.ribImpl.closeServiceInstance();
}
- return Futures.immediateFuture(null);
+ return CommitInfo.emptyFluentFuture();
}
@Override
public void close() {
if (this.ribImpl != null) {
- try {
- this.ribImpl.close();
- } catch (final Exception e) {
- LOG.warn("Failed to close {} rib instance", this, e);
- }
+ this.ribImpl.close();
this.ribImpl = null;
}
- if (this.schemaContextRegistration != null) {
- this.schemaContextRegistration.close();
- this.schemaContextRegistration = null;
- }
- if (this.serviceRegistration != null) {
- try {
- this.serviceRegistration.unregister();
- } catch (final IllegalStateException e) {
- LOG.warn("Failed to unregister {} service instance", this, e);
- }
- this.serviceRegistration = null;
- }
}
- void setServiceRegistration(final ServiceRegistration<?> serviceRegistration) {
- this.serviceRegistration = serviceRegistration;
- }
-
- @Override
- public ImportPolicyPeerTracker getImportPolicyPeerTracker() {
- return this.ribImpl.getImportPolicyPeerTracker();
- }
-
- @Override
- public ExportPolicyPeerTracker getExportPolicyPeerTracker(final TablesKey tablesKey) {
- return this.ribImpl.getExportPolicyPeerTracker(tablesKey);
- }
@Override
public Set<TablesKey> getLocalTablesKeys() {
final Global global,
final String bgpInstanceName,
final BGPTableTypeRegistryConsumer tableTypeRegistry) {
- this.afiSafi = getAfiSafiWithDefault(global.getAfiSafis(), true);
+ this.afiSafi = getAfiSafiWithDefault(global.getAfiSafis(), true).values();
final Config globalConfig = global.getConfig();
this.asNumber = globalConfig.getAs();
- this.routerId = globalConfig.getRouterId();
- this.clusterId = getClusterIdentifier(globalConfig);
- final BGPPeerTrackerImpl peerTracker = new BGPPeerTrackerImpl();
+ this.routerId = IetfInetUtil.INSTANCE.ipv4AddressNoZoneFor(globalConfig.getRouterId());
+ this.clusterId = getGlobalClusterIdentifier(globalConfig);
final Map<TablesKey, PathSelectionMode> pathSelectionModes = OpenConfigMappingUtil
- .toPathSelectionMode(this.afiSafi, tableTypeRegistry, peerTracker).entrySet()
+ .toPathSelectionMode(this.afiSafi, tableTypeRegistry).entrySet()
.stream()
.collect(Collectors.toMap(entry ->
new TablesKey(entry.getKey().getAfi(), entry.getKey().getSafi()), Map.Entry::getValue));
- final BGPRibRoutingPolicy ribPolicy = this.policyProvider.buildBGPRibPolicy(this.asNumber.getValue(),
+ final BGPRibRoutingPolicy ribPolicy = this.policyProvider.buildBGPRibPolicy(this.asNumber.getValue().toJava(),
this.routerId, this.clusterId, RoutingPolicyUtil.getApplyPolicy(global.getApplyPolicy()));
- final CodecsRegistryImpl codecsRegistry = CodecsRegistryImpl.create(codecTreeFactory,
- this.extensions.getClassLoadingStrategy());
return new RIBImpl(
+ tableTypeRegistry,
new RibId(bgpInstanceName),
this.asNumber,
new BgpId(this.routerId),
- this.clusterId,
this.extensions,
this.dispatcher,
codecsRegistry,
this.domBroker,
ribPolicy,
- peerTracker,
toTableTypes(this.afiSafi, tableTypeRegistry),
- pathSelectionModes,
- this.bindingSerializer);
+ pathSelectionModes);
}
@Override
- public BGPRIBState getRIBState() {
+ public BGPRibState getRIBState() {
return this.ribImpl.getRIBState();
}
}
@Override
- public Optional<Attributes> getAttributes(
- RIBSupport ribSupport,
- NodeIdentifierWithPredicates routeIdentifier, NormalizedNode<?, ?> route) {
- return this.ribImpl.getAttributes(ribSupport, routeIdentifier, route);
- }
-
- @Override
- public Optional<ContainerNode> toNormalizedNodeAttribute(
- final RIBSupport ribSupport,
- final NodeIdentifierWithPredicates routeIdentifier,
- final Optional<Attributes> attributes) {
- return this.ribImpl.toNormalizedNodeAttribute(ribSupport, routeIdentifier, attributes);
+ public void refreshTable(final TablesKey tk, final PeerId peerId) {
+ this.ribImpl.refreshTable(tk, peerId);
}
}