X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=bgp%2Frib-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fprotocol%2Fbgp%2Frib%2Fimpl%2Fconfig%2FRibImpl.java;h=18d9e1552d507cdd78d74c6d0d8bcb5e04d102be;hb=60fcf81022ccffc609ee489014b7c89a155a048e;hp=fe2bd8aba863141ccec04dbb45e546c899fd3e8d;hpb=e0ef1ee6ca1e66e96a8adb5e0e96b330326c8f11;p=bgpcep.git diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/RibImpl.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/RibImpl.java index fe2bd8aba8..18d9e1552d 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/RibImpl.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/RibImpl.java @@ -5,87 +5,69 @@ * 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 schemaContextRegistration; - private List afiSafi; + private Collection afiSafi; private AsNumber asNumber; - private Ipv4Address routerId; + private Ipv4AddressNoZone routerId; private ClusterIdentifier clusterId; @@ -93,33 +75,28 @@ public final class RibImpl implements RIB, BGPRIBStateConsumer, AutoCloseable { 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 globalAfiSafi = getAfiSafiWithDefault(global.getAfiSafis(), true); + final Collection 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()) @@ -152,8 +129,8 @@ public final class RibImpl implements RIB, BGPRIBStateConsumer, AutoCloseable { } @Override - public DOMTransactionChain createPeerChain(final TransactionChainListener listener) { - return this.ribImpl.createPeerChain(listener); + public DOMTransactionChain createPeerDOMChain(final DOMTransactionChainListener listener) { + return this.ribImpl.createPeerDOMChain(listener); } @Override @@ -181,50 +158,21 @@ public final class RibImpl implements RIB, BGPRIBStateConsumer, AutoCloseable { return this.ribImpl.getService(); } - ListenableFuture closeServiceInstance() { + FluentFuture 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 getLocalTablesKeys() { @@ -255,41 +203,36 @@ public final class RibImpl implements RIB, BGPRIBStateConsumer, AutoCloseable { 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 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(); } @@ -300,17 +243,7 @@ public final class RibImpl implements RIB, BGPRIBStateConsumer, AutoCloseable { } @Override - public Optional getAttributes( - RIBSupport ribSupport, - NodeIdentifierWithPredicates routeIdentifier, NormalizedNode route) { - return this.ribImpl.getAttributes(ribSupport, routeIdentifier, route); - } - - @Override - public Optional toNormalizedNodeAttribute( - final RIBSupport ribSupport, - final NodeIdentifierWithPredicates routeIdentifier, - final Optional attributes) { - return this.ribImpl.toNormalizedNodeAttribute(ribSupport, routeIdentifier, attributes); + public void refreshTable(final TablesKey tk, final PeerId peerId) { + this.ribImpl.refreshTable(tk, peerId); } }