diff options
author | Jan Srnicek <jsrnicek@cisco.com> | 2017-10-09 10:39:17 +0200 |
---|---|---|
committer | Jan Srnicek <jsrnicek@cisco.com> | 2017-10-09 10:39:17 +0200 |
commit | 2bca3b4a54e1b0a5206c7be14262e35753700d13 (patch) | |
tree | 7d4199802e65c0bbd21f4b4d3f89a12d7c9b94ba /infra/northbound/bgp | |
parent | 88f40ecade3b99675982be81a1774690a0977765 (diff) |
HONEYCOMB-363 - Bgp extension modules
Provides maven modules per bgp extension.
Defines common configuration that can be used to define new
extensions(AbstractBgpExtensionModule).
Change-Id: I1c8ff65b6f9aa5474026f4bdf42476bd0559208e
Signed-off-by: Jan Srnicek <jsrnicek@cisco.com>
Diffstat (limited to 'infra/northbound/bgp')
8 files changed, 37 insertions, 354 deletions
diff --git a/infra/northbound/bgp/pom.xml b/infra/northbound/bgp/pom.xml index 1a18e7c69..66d08e739 100644 --- a/infra/northbound/bgp/pom.xml +++ b/infra/northbound/bgp/pom.xml @@ -79,28 +79,6 @@ <artifactId>bgp-rib-impl</artifactId> </dependency> - <!-- ODL BGP extensions --> - <dependency> - <groupId>org.opendaylight.bgpcep</groupId> - <artifactId>bgp-evpn</artifactId> - </dependency> - <dependency> - <groupId>org.opendaylight.bgpcep</groupId> - <artifactId>bgp-inet</artifactId> - </dependency> - <dependency> - <groupId>org.opendaylight.bgpcep</groupId> - <artifactId>bgp-labeled-unicast</artifactId> - </dependency> - <dependency> - <groupId>org.opendaylight.bgpcep</groupId> - <artifactId>bgp-linkstate</artifactId> - </dependency> - <dependency> - <groupId>org.opendaylight.bgpcep</groupId> - <artifactId>bgp-l3vpn</artifactId> - </dependency> - <!-- test dependencies --> <dependency> <groupId>junit</groupId> @@ -112,6 +90,21 @@ <artifactId>mockito-core</artifactId> <scope>test</scope> </dependency> + <dependency> + <groupId>com.google.inject.extensions</groupId> + <artifactId>guice-testlib</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>io.fd.honeycomb.northbound.bgp</groupId> + <artifactId>extension-common</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>org.opendaylight.bgpcep</groupId> + <artifactId>rsvp-api</artifactId> + <version>${bgpcep.version}</version> + </dependency> </dependencies> </project>
\ No newline at end of file diff --git a/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/ApplicationRibWriterFactory.java b/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/ApplicationRibWriterFactory.java index 104a85922..02f1788f3 100644 --- a/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/ApplicationRibWriterFactory.java +++ b/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/ApplicationRibWriterFactory.java @@ -16,24 +16,15 @@ package io.fd.honeycomb.infra.bgp; -import com.google.common.collect.Sets; +import com.google.common.collect.ImmutableSet; import com.google.inject.Inject; import com.google.inject.name.Named; import io.fd.honeycomb.translate.util.write.BindingBrokerWriter; import io.fd.honeycomb.translate.write.WriterFactory; import io.fd.honeycomb.translate.write.registry.ModifiableWriterRegistryBuilder; import org.opendaylight.controller.md.sal.binding.api.DataBroker; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.ipv4.routes.Ipv4Routes; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.ipv4.routes.ipv4.routes.Ipv4Route; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.labeled.unicast.rev150525.labeled.unicast.LabelStack; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.labeled.unicast.rev150525.labeled.unicast.routes.LabeledUnicastRoutes; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.labeled.unicast.rev150525.labeled.unicast.routes.list.LabeledUnicastRoute; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.Attributes; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.LocalPref; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.Origin; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.ApplicationRib; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.Tables; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.ipv4.next.hop._case.Ipv4NextHop; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; /** @@ -41,21 +32,19 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; * Uses BindingBrokerWriter to write routes via dedicated broker that, unlike * {@link io.fd.honeycomb.data.impl.DataBroker DataBroker}, supports tx chains and DOMDataChangeListener registration * extensively used by ODL's bgp. - * + * <p> * As a bonus BGP routes persisted and available for read via RESTCONF/NETCONF. */ final class ApplicationRibWriterFactory implements WriterFactory { + @Inject @Named(BgpModule.HONEYCOMB_BGP) private DataBroker dataBroker; private static final InstanceIdentifier<ApplicationRib> AR_IID = - InstanceIdentifier.create(ApplicationRib.class); + InstanceIdentifier.create(ApplicationRib.class); private static final InstanceIdentifier<Tables> TABLES_IID = AR_IID.child(Tables.class); - private static final InstanceIdentifier<Ipv4Routes> IPV4_ROUTES_IID = TABLES_IID.child((Class) Ipv4Routes.class); - private static final InstanceIdentifier<Ipv4Route> IPV4_ROUTE_IID = IPV4_ROUTES_IID.child(Ipv4Route.class); - private static final InstanceIdentifier<LabeledUnicastRoutes> LABELED_UNICAST_ROUTES_IID = TABLES_IID.child((Class) LabeledUnicastRoutes.class); - private static final InstanceIdentifier<LabeledUnicastRoute> LABELED_UNICAST_ROUTE_IID = LABELED_UNICAST_ROUTES_IID.child(LabeledUnicastRoute.class); + // TODO (HONEYCOMB-359): // BGP models are huge, we need some kind of wildcarded subtree writer, that works for whole subtree. @@ -66,24 +55,7 @@ final class ApplicationRibWriterFactory implements WriterFactory { // 2) alternative is to compute all child nodes during initialization (might introduce some footprint penalty). @Override public void init(final ModifiableWriterRegistryBuilder registry) { - registry.subtreeAdd( - Sets.newHashSet( - TABLES_IID, - IPV4_ROUTES_IID, - IPV4_ROUTES_IID.child(Ipv4Route.class), - IPV4_ROUTE_IID.child(Attributes.class), - IPV4_ROUTE_IID.child(Attributes.class).child(Origin.class), - IPV4_ROUTE_IID.child(Attributes.class).child(LocalPref.class), - IPV4_ROUTE_IID.child(Attributes.class).child(Ipv4NextHop.class), - LABELED_UNICAST_ROUTES_IID, - LABELED_UNICAST_ROUTE_IID, - LABELED_UNICAST_ROUTE_IID.child(Attributes.class), - LABELED_UNICAST_ROUTE_IID.child(Attributes.class).child(Origin.class), - LABELED_UNICAST_ROUTE_IID.child(Attributes.class).child(LocalPref.class), - LABELED_UNICAST_ROUTE_IID.child(Attributes.class).child(Ipv4NextHop.class), - LABELED_UNICAST_ROUTE_IID.child(LabelStack.class) - ), - new BindingBrokerWriter<>(InstanceIdentifier.create(ApplicationRib.class), dataBroker) + registry.subtreeAdd(ImmutableSet.of(TABLES_IID), new BindingBrokerWriter<>(InstanceIdentifier.create(ApplicationRib.class), dataBroker) ); } } diff --git a/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/BGPExtensionConsumerContextProvider.java b/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/BGPExtensionConsumerContextProvider.java deleted file mode 100644 index 1bb0c5a1b..000000000 --- a/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/BGPExtensionConsumerContextProvider.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2017 Cisco and/or its affiliates. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.fd.honeycomb.infra.bgp; - -import com.google.inject.Inject; -import io.fd.honeycomb.binding.init.ProviderTrait; -import io.fd.honeycomb.data.init.ShutdownHandler; -import java.util.ArrayList; -import java.util.Set; -import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionConsumerContext; -import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionProviderActivator; -import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionProviderContext; -import org.opendaylight.protocol.bgp.parser.spi.pojo.SimpleBGPExtensionProviderContext; -import org.opendaylight.protocol.bgp.parser.spi.pojo.SimpleBGPExtensionProviderContextActivator; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -final class BGPExtensionConsumerContextProvider extends ProviderTrait<BGPExtensionConsumerContext> { - private static final Logger LOG = LoggerFactory.getLogger(BGPExtensionConsumerContextProvider.class); - - @Inject - private Set<BGPExtensionProviderActivator> activators; - - @Inject - private ShutdownHandler shutdownHandler; - - @Override - protected BGPExtensionConsumerContext create() { - final BGPExtensionProviderContext ctx = new SimpleBGPExtensionProviderContext(); - final SimpleBGPExtensionProviderContextActivator activator = - new SimpleBGPExtensionProviderContextActivator(ctx, new ArrayList<>(activators)); - LOG.debug("Starting BGPExtensionConsumerContext with activators: {}", activators); - activator.start(); - shutdownHandler.register("bgp-extension-context-activator", activator); - return ctx; - } -} diff --git a/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/BGPTableTypeRegistryConsumerProvider.java b/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/BGPTableTypeRegistryConsumerProvider.java deleted file mode 100644 index 06ef5ea7a..000000000 --- a/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/BGPTableTypeRegistryConsumerProvider.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) 2017 Cisco and/or its affiliates. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.fd.honeycomb.infra.bgp; - -import com.google.inject.Inject; -import io.fd.honeycomb.binding.init.ProviderTrait; -import java.util.Set; -import org.opendaylight.protocol.bgp.openconfig.spi.BGPTableTypeRegistryConsumer; -import org.opendaylight.protocol.bgp.openconfig.spi.SimpleBGPTableTypeRegistryProvider; - -final class BGPTableTypeRegistryConsumerProvider extends ProviderTrait<BGPTableTypeRegistryConsumer> { - @Inject - private Set<BGPTableType> tableTypes; - - @Override - protected BGPTableTypeRegistryConsumer create() { - final SimpleBGPTableTypeRegistryProvider registry = new SimpleBGPTableTypeRegistryProvider(); - tableTypes.stream().forEach(tableType -> tableType.register(registry)); - return registry; - } - - interface BGPTableType { - void register(SimpleBGPTableTypeRegistryProvider registry); - } -} diff --git a/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/BgpExtensionsModule.java b/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/BgpExtensionsModule.java deleted file mode 100644 index 4f9ab7a61..000000000 --- a/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/BgpExtensionsModule.java +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright (c) 2017 Cisco and/or its affiliates. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.fd.honeycomb.infra.bgp; - -import com.google.inject.AbstractModule; -import com.google.inject.Singleton; -import com.google.inject.multibindings.Multibinder; -import org.opendaylight.protocol.bgp.openconfig.spi.BGPTableTypeRegistryConsumer; -import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionConsumerContext; -import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionProviderActivator; -import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionConsumerContext; -import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionProviderActivator; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.IPV4LABELLEDUNICAST; -import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.IPV4UNICAST; -import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.IPV6LABELLEDUNICAST; -import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.IPV6UNICAST; -import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.L2VPNEVPN; -import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.L3VPNIPV4UNICAST; -import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.L3VPNIPV6UNICAST; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.EvpnSubsequentAddressFamily; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.evpn.rev160321.L2vpnAddressFamily; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.labeled.unicast.rev150525.LabeledUnicastSubsequentAddressFamily; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.LinkstateAddressFamily; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.LinkstateSubsequentAddressFamily; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.LINKSTATE; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv4AddressFamily; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv6AddressFamily; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.MplsLabeledVpnSubsequentAddressFamily; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.UnicastSubsequentAddressFamily; - -/** - * Registers BGP extensions provided by ODL implementation. - * TODO(HONEYCOMB-363): create module per BGP extension - * TODO(HONEYCOMB-378): add support for flowspec (requires some special initialization) - */ -final class BgpExtensionsModule extends AbstractModule { - private static final Logger LOG = LoggerFactory.getLogger(BgpExtensionsModule.class); - - protected void configure() { - LOG.debug("Initializing BgpExtensionsModule"); - // This should be part of BgpModule, but that one is Private and Multibinders + private BASE_MODULES - // do not work together, that's why there's a dedicated module here - // https://github.com/google/guice/issues/906 - configureRIBExtensions(); - configureBGPExtensions(); - configureTableTypes(); - } - - private void configureRIBExtensions() { - final Multibinder<RIBExtensionProviderActivator> ribExtensionBinder = Multibinder.newSetBinder(binder(), - RIBExtensionProviderActivator.class); - ribExtensionBinder.addBinding().to(org.opendaylight.protocol.bgp.evpn.impl.RIBActivator.class); - ribExtensionBinder.addBinding().to(org.opendaylight.protocol.bgp.inet.RIBActivator.class); - ribExtensionBinder.addBinding().to(org.opendaylight.protocol.bgp.labeled.unicast.RIBActivator.class); - ribExtensionBinder.addBinding().to(org.opendaylight.protocol.bgp.linkstate.impl.RIBActivator.class); - ribExtensionBinder.addBinding().to(org.opendaylight.protocol.bgp.l3vpn.ipv4.RibIpv4Activator.class); - ribExtensionBinder.addBinding().to(org.opendaylight.protocol.bgp.l3vpn.ipv6.RibIpv6Activator.class); - bind(RIBExtensionConsumerContext.class).toProvider(RIBExtensionConsumerContextProvider.class) - .in(Singleton.class); - } - - private void configureBGPExtensions() { - final Multibinder<BGPExtensionProviderActivator> bgpExtensionBinder = Multibinder.newSetBinder(binder(), - BGPExtensionProviderActivator.class); - bgpExtensionBinder.addBinding().to(org.opendaylight.protocol.bgp.parser.impl.BGPActivator.class); - bgpExtensionBinder.addBinding().to(org.opendaylight.protocol.bgp.evpn.impl.BGPActivator.class); - bgpExtensionBinder.addBinding().to(org.opendaylight.protocol.bgp.inet.BGPActivator.class); - bgpExtensionBinder.addBinding().to(org.opendaylight.protocol.bgp.labeled.unicast.BGPActivator.class); - bgpExtensionBinder.addBinding().to(org.opendaylight.protocol.bgp.linkstate.impl.BGPActivator.class); - bgpExtensionBinder.addBinding().to(org.opendaylight.protocol.bgp.l3vpn.ipv4.BgpIpv4Activator.class); - bgpExtensionBinder.addBinding().to(org.opendaylight.protocol.bgp.l3vpn.ipv6.BgpIpv6Activator.class); - bind(BGPExtensionConsumerContext.class).toProvider(BGPExtensionConsumerContextProvider.class) - .in(Singleton.class); - } - - private void configureTableTypes() { - final Multibinder<BGPTableTypeRegistryConsumerProvider.BGPTableType> tableTypeBinder = - Multibinder.newSetBinder(binder(), - BGPTableTypeRegistryConsumerProvider.BGPTableType.class); - - tableTypeBinder.addBinding().toInstance(provider -> provider - .registerBGPTableType(L2vpnAddressFamily.class, EvpnSubsequentAddressFamily.class, L2VPNEVPN.class)); - - tableTypeBinder.addBinding().toInstance(provider -> provider - .registerBGPTableType(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class, IPV4UNICAST.class)); - tableTypeBinder.addBinding().toInstance(provider -> provider - .registerBGPTableType(Ipv6AddressFamily.class, UnicastSubsequentAddressFamily.class, IPV6UNICAST.class)); - - tableTypeBinder.addBinding().toInstance(provider -> provider - .registerBGPTableType(Ipv4AddressFamily.class, MplsLabeledVpnSubsequentAddressFamily.class, - L3VPNIPV4UNICAST.class)); - tableTypeBinder.addBinding().toInstance(provider -> provider - .registerBGPTableType(Ipv6AddressFamily.class, MplsLabeledVpnSubsequentAddressFamily.class, - L3VPNIPV6UNICAST.class)); - - tableTypeBinder.addBinding().toInstance(provider -> provider - .registerBGPTableType(Ipv4AddressFamily.class, LabeledUnicastSubsequentAddressFamily.class, - IPV4LABELLEDUNICAST.class)); - tableTypeBinder.addBinding().toInstance(provider -> provider - .registerBGPTableType(Ipv6AddressFamily.class, LabeledUnicastSubsequentAddressFamily.class, - IPV6LABELLEDUNICAST.class)); - - tableTypeBinder.addBinding().toInstance(provider -> provider - .registerBGPTableType(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class, - LINKSTATE.class)); - - bind(BGPTableTypeRegistryConsumer.class).toProvider(BGPTableTypeRegistryConsumerProvider.class) - .in(Singleton.class); - } -} diff --git a/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/BgpRIBProvider.java b/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/BgpRIBProvider.java index 5663b7c4d..06444ae5b 100644 --- a/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/BgpRIBProvider.java +++ b/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/BgpRIBProvider.java @@ -16,15 +16,9 @@ package io.fd.honeycomb.infra.bgp; -import static org.opendaylight.protocol.bgp.rib.impl.config.OpenConfigMappingUtil.toTableTypes; - -import com.google.common.collect.ImmutableList; import com.google.inject.Inject; import io.fd.honeycomb.binding.init.ProviderTrait; import io.fd.honeycomb.data.init.ShutdownHandler; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; import org.opendaylight.controller.md.sal.binding.impl.BindingToNormalizedNodeCodec; import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker; import org.opendaylight.controller.md.sal.dom.broker.impl.PingPongDataBroker; @@ -40,14 +34,8 @@ import org.opendaylight.protocol.bgp.rib.impl.spi.BGPDispatcher; import org.opendaylight.protocol.bgp.rib.impl.spi.RIB; import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionConsumerContext; 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.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafiBuilder; -import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.IPV4LABELLEDUNICAST; -import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.IPV4UNICAST; 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.Ipv4Address; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi2; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi2Builder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.LINKSTATE; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.RibId; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.TablesKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.BgpId; @@ -55,6 +43,13 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.type import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.ArrayList; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import static org.opendaylight.protocol.bgp.rib.impl.config.OpenConfigMappingUtil.toTableTypes; + final class BgpRIBProvider extends ProviderTrait<RIB> { private static final Logger LOG = LoggerFactory.getLogger(BgpRIBProvider.class); @@ -74,6 +69,8 @@ final class BgpRIBProvider extends ProviderTrait<RIB> { private SchemaService schemaService; @Inject private ShutdownHandler shutdownHandler; + @Inject + private Set<AfiSafi> configuredAfiSafis; @Override protected RIB create() { @@ -83,25 +80,10 @@ final class BgpRIBProvider extends ProviderTrait<RIB> { LOG.debug("Creating BGP RIB: routerId={}, asNumber={}", routerId, asNumber); // TODO(HONEYCOMB-395): should all afi-safis use the same send-max value? // TODO(HONEYCOMB-363): configure other BGP Multiprotocol extensions: - final List<AfiSafi> afiSafi = ImmutableList.of( - new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.class) - .addAugmentation(AfiSafi2.class, - new AfiSafi2Builder().setReceive(cfg.isBgpMultiplePathsEnabled()) - .setSendMax(cfg.bgpSendMaxMaths.get().shortValue()).build()) - .build(), - new AfiSafiBuilder().setAfiSafiName(IPV4LABELLEDUNICAST.class) - .addAugmentation(AfiSafi2.class, - new AfiSafi2Builder().setReceive(cfg.isBgpMultiplePathsEnabled()) - .setSendMax(cfg.bgpSendMaxMaths.get().shortValue()).build()) - .build(), - new AfiSafiBuilder().setAfiSafiName(LINKSTATE.class) - .addAugmentation(AfiSafi2.class, - new AfiSafi2Builder().setReceive(cfg.isBgpMultiplePathsEnabled()) - .setSendMax(cfg.bgpSendMaxMaths.get().shortValue()).build()) - .build() - ); + + final ArrayList<AfiSafi> afiSafiList = new ArrayList<>(configuredAfiSafis); final Map<TablesKey, PathSelectionMode> pathSelectionModes = - OpenConfigMappingUtil.toPathSelectionMode(afiSafi, tableTypeRegistry) + OpenConfigMappingUtil.toPathSelectionMode(afiSafiList, tableTypeRegistry) .entrySet().stream().collect(Collectors.toMap(entry -> new TablesKey(entry.getKey().getAfi(), entry.getKey().getSafi()), Map.Entry::getValue)); // based on org.opendaylight.protocol.bgp.rib.impl.config.RibImpl.createRib @@ -109,7 +91,7 @@ final class BgpRIBProvider extends ProviderTrait<RIB> { final RIBImpl rib = new RIBImpl(new NoopClusterSingletonServiceProvider(), new RibId(cfg.bgpProtocolInstanceName.get()), asNumber, new BgpId(routerId), clusterId, extensions, dispatcher, codec, - pingPongDataBroker, toTableTypes(afiSafi, tableTypeRegistry), pathSelectionModes, + pingPongDataBroker, toTableTypes(afiSafiList, tableTypeRegistry), pathSelectionModes, extensions.getClassLoadingStrategy(), null); // required for proper RIB's CodecRegistry initialization (based on RIBImpl.start) diff --git a/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/BgpWritersModule.java b/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/BgpWritersModule.java index c58afc067..fca58b6f2 100644 --- a/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/BgpWritersModule.java +++ b/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/BgpWritersModule.java @@ -20,6 +20,7 @@ import com.google.inject.AbstractModule; import com.google.inject.Singleton; import com.google.inject.multibindings.Multibinder; import io.fd.honeycomb.infra.bgp.neighbors.BgpPeerWriterFactory; +import io.fd.honeycomb.northbound.bgp.extension.CommonBgpExtensionsModule; import io.fd.honeycomb.translate.write.WriterFactory; import org.opendaylight.protocol.bgp.rib.impl.StrictBGPPeerRegistry; import org.opendaylight.protocol.bgp.rib.impl.spi.BGPPeerRegistry; @@ -42,8 +43,8 @@ public final class BgpWritersModule extends AbstractModule { // Configure peer registry bind(BGPPeerRegistry.class).toInstance(StrictBGPPeerRegistry.instance()); - // install extensions module (hidden from HC user until HONEYCOMB-363 is fixed): - install(new BgpExtensionsModule()); + // install common binding for extensions + install(new CommonBgpExtensionsModule()); final Multibinder<WriterFactory> binder = Multibinder.newSetBinder(binder(), WriterFactory.class); binder.addBinding().to(ApplicationRibWriterFactory.class).in(Singleton.class); diff --git a/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/RIBExtensionConsumerContextProvider.java b/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/RIBExtensionConsumerContextProvider.java deleted file mode 100644 index 07ab86992..000000000 --- a/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/RIBExtensionConsumerContextProvider.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (c) 2017 Cisco and/or its affiliates. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.fd.honeycomb.infra.bgp; - -import com.google.inject.Inject; -import io.fd.honeycomb.binding.init.ProviderTrait; -import io.fd.honeycomb.data.init.ShutdownHandler; -import java.util.ArrayList; -import java.util.Set; -import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionConsumerContext; -import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionProviderActivator; -import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionProviderContext; -import org.opendaylight.protocol.bgp.rib.spi.SimpleRIBExtensionProviderContext; -import org.opendaylight.protocol.bgp.rib.spi.SimpleRIBExtensionProviderContextActivator; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class RIBExtensionConsumerContextProvider extends ProviderTrait<RIBExtensionConsumerContext> { - private static final Logger LOG = LoggerFactory.getLogger(RIBExtensionConsumerContextProvider.class); - @Inject - private Set<RIBExtensionProviderActivator> activators; - @Inject - private ShutdownHandler shutdownHandler; - - @Override - protected RIBExtensionConsumerContext create() { - final RIBExtensionProviderContext ctx = new SimpleRIBExtensionProviderContext(); - final SimpleRIBExtensionProviderContextActivator activator = - new SimpleRIBExtensionProviderContextActivator(ctx, new ArrayList<>(activators)); - LOG.debug("Starting RIBExtensionConsumerContext with activators: {}", activators); - activator.start(); - shutdownHandler.register("rib-extension-consumer-context-activator", activator); - return ctx; - } -} |