HONEYCOMB-363 - Bgp extension modules 86/8486/10
authorJan Srnicek <jsrnicek@cisco.com>
Mon, 9 Oct 2017 08:39:17 +0000 (10:39 +0200)
committerJan Srnicek <jsrnicek@cisco.com>
Mon, 9 Oct 2017 08:39:17 +0000 (10:39 +0200)
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>
39 files changed:
infra/bgp-distribution-test/src/test/resources/base-distro-test-modules/base-modules
infra/minimal-distribution/pom.xml
infra/northbound/bgp-extensions/asciidoc/Readme.adoc [new file with mode: 0644]
infra/northbound/bgp-extensions/evpn/asciidoc/Readme.adoc [new file with mode: 0644]
infra/northbound/bgp-extensions/evpn/pom.xml [new file with mode: 0644]
infra/northbound/bgp-extensions/evpn/src/main/java/io/fd/honeycomb/northbound/bgp/extension/EvpnModule.java [new file with mode: 0644]
infra/northbound/bgp-extensions/extension-common/asciidoc/Readme.adoc [new file with mode: 0644]
infra/northbound/bgp-extensions/extension-common/pom.xml [new file with mode: 0644]
infra/northbound/bgp-extensions/extension-common/src/main/java/io/fd/honeycomb/northbound/bgp/extension/AbstractBgpExtensionModule.java [new file with mode: 0644]
infra/northbound/bgp-extensions/extension-common/src/main/java/io/fd/honeycomb/northbound/bgp/extension/BGPExtensionConsumerContextProvider.java [moved from infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/BGPExtensionConsumerContextProvider.java with 97% similarity]
infra/northbound/bgp-extensions/extension-common/src/main/java/io/fd/honeycomb/northbound/bgp/extension/BGPTableTypeRegistryConsumerProvider.java [moved from infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/BGPTableTypeRegistryConsumerProvider.java with 96% similarity]
infra/northbound/bgp-extensions/extension-common/src/main/java/io/fd/honeycomb/northbound/bgp/extension/BgpExtensionModule.java [new file with mode: 0644]
infra/northbound/bgp-extensions/extension-common/src/main/java/io/fd/honeycomb/northbound/bgp/extension/CommonBgpExtensionsModule.java [new file with mode: 0644]
infra/northbound/bgp-extensions/extension-common/src/main/java/io/fd/honeycomb/northbound/bgp/extension/RIBExtensionConsumerContextProvider.java [moved from infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/RIBExtensionConsumerContextProvider.java with 80% similarity]
infra/northbound/bgp-extensions/inet/asciidoc/Readme.adoc [new file with mode: 0644]
infra/northbound/bgp-extensions/inet/pom.xml [new file with mode: 0644]
infra/northbound/bgp-extensions/inet/src/main/java/io/fd/honeycomb/northbound/bgp/extension/InetModule.java [new file with mode: 0644]
infra/northbound/bgp-extensions/inet/src/main/java/io/fd/honeycomb/northbound/bgp/extension/InetWriterFactory.java [new file with mode: 0644]
infra/northbound/bgp-extensions/l3-vpn-v4/asciidoc/Readme.adoc [new file with mode: 0644]
infra/northbound/bgp-extensions/l3-vpn-v4/pom.xml [new file with mode: 0644]
infra/northbound/bgp-extensions/l3-vpn-v4/src/main/java/io/fd/honeycomb/northbound/bgp/extension/L3VpnV4Module.java [new file with mode: 0644]
infra/northbound/bgp-extensions/l3-vpn-v6/asciidoc/Readme.adoc [new file with mode: 0644]
infra/northbound/bgp-extensions/l3-vpn-v6/pom.xml [new file with mode: 0644]
infra/northbound/bgp-extensions/l3-vpn-v6/src/main/java/io/fd/honeycomb/northbound/bgp/extension/L3VpnV6Module.java [new file with mode: 0644]
infra/northbound/bgp-extensions/labeled-unicast/asciidoc/Readme.adoc [new file with mode: 0644]
infra/northbound/bgp-extensions/labeled-unicast/pom.xml [new file with mode: 0644]
infra/northbound/bgp-extensions/labeled-unicast/src/main/java/io/fd/honeycomb/northbound/bgp/extension/LabeledUnicastModule.java [new file with mode: 0644]
infra/northbound/bgp-extensions/labeled-unicast/src/main/java/io/fd/honeycomb/northbound/bgp/extension/LabeledUnicastWriterFactory.java [new file with mode: 0644]
infra/northbound/bgp-extensions/linkstate/asciidoc/Readme.adoc [new file with mode: 0644]
infra/northbound/bgp-extensions/linkstate/pom.xml [new file with mode: 0644]
infra/northbound/bgp-extensions/linkstate/src/main/java/io/fd/honeycomb/northbound/bgp/extension/LinkstateModule.java [new file with mode: 0644]
infra/northbound/bgp-extensions/pom.xml [new file with mode: 0644]
infra/northbound/bgp/pom.xml
infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/ApplicationRibWriterFactory.java
infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/BgpExtensionsModule.java [deleted file]
infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/BgpRIBProvider.java
infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/BgpWritersModule.java
infra/northbound/pom.xml
release-notes/pom.xml

index 8d2ff2b..a2f69ff 100644 (file)
@@ -1,6 +1,12 @@
 io.fd.honeycomb.infra.bgp.BgpModule
 io.fd.honeycomb.infra.bgp.BgpReadersModule
 io.fd.honeycomb.infra.bgp.BgpWritersModule
+io.fd.honeycomb.northbound.bgp.extension.EvpnModule
+io.fd.honeycomb.northbound.bgp.extension.InetModule
+io.fd.honeycomb.northbound.bgp.extension.L3VpnV4Module
+io.fd.honeycomb.northbound.bgp.extension.L3VpnV6Module
+io.fd.honeycomb.northbound.bgp.extension.LabeledUnicastModule
+io.fd.honeycomb.northbound.bgp.extension.LinkstateModule
 io.fd.honeycomb.infra.distro.cfgattrs.CfgAttrsModule
 io.fd.honeycomb.infra.distro.data.ConfigAndOperationalPipelineModule
 io.fd.honeycomb.infra.distro.data.context.ContextPipelineModule
index 12fe869..ead6217 100644 (file)
             // io.fd.honeycomb.infra.bgp.BgpModule,
             // io.fd.honeycomb.infra.bgp.BgpReadersModule,
             // io.fd.honeycomb.infra.bgp.BgpWritersModule,
+            // io.fd.honeycomb.northbound.bgp.extension.EvpnModule,
+            // io.fd.honeycomb.northbound.bgp.extension.InetModule,
+            // io.fd.honeycomb.northbound.bgp.extension.L3VpnV4Module,
+            // io.fd.honeycomb.northbound.bgp.extension.L3VpnV6Module,
+            // io.fd.honeycomb.northbound.bgp.extension.LabeledUnicastModule,
+            // io.fd.honeycomb.northbound.bgp.extension.LinkstateModule,
             // io.fd.honeycomb.footprint.FootprintModule
         </distribution.modules>
     </properties>
             <artifactId>bgp</artifactId>
             <version>${project.version}</version>
         </dependency>
+
+        <!-- Bgp extension modules -->
+        <dependency>
+            <groupId>io.fd.honeycomb.northbound.bgp</groupId>
+            <artifactId>extension-common</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>io.fd.honeycomb.northbound.bgp</groupId>
+            <artifactId>evpn</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>io.fd.honeycomb.northbound.bgp</groupId>
+            <artifactId>inet</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>io.fd.honeycomb.northbound.bgp</groupId>
+            <artifactId>l3-vpn-v4</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>io.fd.honeycomb.northbound.bgp</groupId>
+            <artifactId>l3-vpn-v6</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>io.fd.honeycomb.northbound.bgp</groupId>
+            <artifactId>linkstate</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>io.fd.honeycomb.northbound.bgp</groupId>
+            <artifactId>labeled-unicast</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <!-- Footprint api -->
         <dependency>
             <groupId>io.fd.honeycomb.footprint</groupId>
             <artifactId>impl</artifactId>
diff --git a/infra/northbound/bgp-extensions/asciidoc/Readme.adoc b/infra/northbound/bgp-extensions/asciidoc/Readme.adoc
new file mode 100644 (file)
index 0000000..32f5c99
--- /dev/null
@@ -0,0 +1,5 @@
+= bgp-extensions
+
+Contains extension modules for all BGP extensions.
+Each extension can be enabled separately by including its Module class in startup modules
+configuration.
diff --git a/infra/northbound/bgp-extensions/evpn/asciidoc/Readme.adoc b/infra/northbound/bgp-extensions/evpn/asciidoc/Readme.adoc
new file mode 100644 (file)
index 0000000..b822cb7
--- /dev/null
@@ -0,0 +1,10 @@
+= Evpn
+
+Configure http://docs.opendaylight.org/en/${project-odl-branch}/user-guide/bgp-user-guide.html#evpn-family[Evpn] extension for ODL BGP
+
+Handles following table types:
+
+* L2VpnEvpn
+
+Enable by including EpvnModule in /opt/honeycomb/modules configuration
+
diff --git a/infra/northbound/bgp-extensions/evpn/pom.xml b/infra/northbound/bgp-extensions/evpn/pom.xml
new file mode 100644 (file)
index 0000000..d42447c
--- /dev/null
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ 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.
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>impl-parent</artifactId>
+        <groupId>io.fd.honeycomb.common</groupId>
+        <version>1.18.01-SNAPSHOT</version>
+        <relativePath>../../../../common/impl-parent</relativePath>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>io.fd.honeycomb.northbound.bgp</groupId>
+    <artifactId>evpn</artifactId>
+    <version>1.18.01-SNAPSHOT</version>
+
+    <dependencies>
+        <dependency>
+            <groupId>io.fd.honeycomb.northbound.bgp</groupId>
+            <artifactId>extension-common</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.bgpcep</groupId>
+            <artifactId>bgp-evpn</artifactId>
+            <version>${bgpcep.version}</version>
+        </dependency>
+    </dependencies>
+
+</project>
\ No newline at end of file
diff --git a/infra/northbound/bgp-extensions/evpn/src/main/java/io/fd/honeycomb/northbound/bgp/extension/EvpnModule.java b/infra/northbound/bgp-extensions/evpn/src/main/java/io/fd/honeycomb/northbound/bgp/extension/EvpnModule.java
new file mode 100644 (file)
index 0000000..a04fa68
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+ * 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.northbound.bgp.extension;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.inject.Provider;
+import io.fd.honeycomb.translate.write.WriterFactory;
+import org.opendaylight.protocol.bgp.evpn.impl.BGPActivator;
+import org.opendaylight.protocol.bgp.evpn.impl.RIBActivator;
+import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionProviderActivator;
+import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionProviderActivator;
+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.types.rev151009.L2VPNEVPN;
+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.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Collections;
+import java.util.Set;
+
+import static io.fd.honeycomb.northbound.bgp.extension.AbstractBgpExtensionModule.TableTypeRegistration.tableType;
+
+public class EvpnModule extends AbstractBgpExtensionModule {
+
+    private static final Logger LOG = LoggerFactory.getLogger(EvpnModule.class);
+
+    @Override
+    public Set<Class<? extends RIBExtensionProviderActivator>> getRibActivators() {
+        return ImmutableSet.of(RIBActivator.class);
+    }
+
+    @Override
+    public Set<Class<? extends BGPExtensionProviderActivator>> getExtensionActivators() {
+        return ImmutableSet.of(BGPActivator.class);
+    }
+
+    @Override
+    public Set<TableTypeRegistration> getTableTypes() {
+        return ImmutableSet.of(tableType(L2vpnAddressFamily.class, EvpnSubsequentAddressFamily.class, L2VPNEVPN.class));
+    }
+
+    @Override
+    public Set<Class<? extends Provider<AfiSafi>>> getAfiSafiTypeProviders() {
+        return Collections.emptySet();
+    }
+
+    @Override
+    public Set<Class<? extends WriterFactory>> getApplicationRibWriters() {
+        //TODO - HONEYCOMB-359 - use wildcaded subtree writer
+        return Collections.emptySet();
+    }
+
+    @Override
+    public Logger getLogger() {
+        return LOG;
+    }
+}
diff --git a/infra/northbound/bgp-extensions/extension-common/asciidoc/Readme.adoc b/infra/northbound/bgp-extensions/extension-common/asciidoc/Readme.adoc
new file mode 100644 (file)
index 0000000..2969ad3
--- /dev/null
@@ -0,0 +1,5 @@
+= extension-common
+
+Contains common features used by BGP extension modules.
+
+To create new BGP extension module, use parent class *AbstractBgpExtensionModule*
\ No newline at end of file
diff --git a/infra/northbound/bgp-extensions/extension-common/pom.xml b/infra/northbound/bgp-extensions/extension-common/pom.xml
new file mode 100644 (file)
index 0000000..b6ea4cc
--- /dev/null
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ 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.
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>impl-parent</artifactId>
+        <groupId>io.fd.honeycomb.common</groupId>
+        <version>1.18.01-SNAPSHOT</version>
+        <relativePath>../../../../common/impl-parent</relativePath>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>io.fd.honeycomb.northbound.bgp</groupId>
+    <artifactId>extension-common</artifactId>
+    <version>1.18.01-SNAPSHOT</version>
+
+    <dependencies>
+        <!-- DI-->
+        <dependency>
+            <groupId>com.google.inject</groupId>
+            <artifactId>guice</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.bgpcep</groupId>
+            <artifactId>bgp-rib-spi</artifactId>
+            <version>${bgpcep.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.bgpcep</groupId>
+            <artifactId>bgp-openconfig-api</artifactId>
+            <version>${bgpcep.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.bgpcep</groupId>
+            <artifactId>bgp-openconfig-spi</artifactId>
+            <version>${bgpcep.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.code.findbugs</groupId>
+            <artifactId>jsr305</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.fd.honeycomb</groupId>
+            <artifactId>binding-init</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.inject.extensions</groupId>
+            <artifactId>guice-multibindings</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.fd.honeycomb</groupId>
+            <artifactId>cfg-init</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.bgpcep</groupId>
+            <artifactId>bgp-parser-impl</artifactId>
+            <version>${bgpcep.version}</version>
+        </dependency>
+    </dependencies>
+
+</project>
\ No newline at end of file
diff --git a/infra/northbound/bgp-extensions/extension-common/src/main/java/io/fd/honeycomb/northbound/bgp/extension/AbstractBgpExtensionModule.java b/infra/northbound/bgp-extensions/extension-common/src/main/java/io/fd/honeycomb/northbound/bgp/extension/AbstractBgpExtensionModule.java
new file mode 100644 (file)
index 0000000..caab1a8
--- /dev/null
@@ -0,0 +1,130 @@
+/*
+ * 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.northbound.bgp.extension;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.Singleton;
+import com.google.inject.multibindings.Multibinder;
+import io.fd.honeycomb.translate.write.WriterFactory;
+import org.opendaylight.protocol.bgp.openconfig.spi.BGPTableTypeRegistryConsumer;
+import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionProviderActivator;
+import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionProviderActivator;
+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.types.rev151009.AfiSafiType;
+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.AddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.SubsequentAddressFamily;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.slf4j.Logger;
+
+import javax.annotation.Nonnull;
+
+/**
+ * General blueprint for any module that wants to bind new BGP extension
+ */
+public abstract class AbstractBgpExtensionModule extends AbstractModule implements BgpExtensionModule {
+
+    public static final InstanceIdentifier<Tables> TABLES_IID = InstanceIdentifier.create(ApplicationRib.class).child(Tables.class);
+
+    @Override
+    protected void configure() {
+        bindRibActivators();
+        bindExtensionActivators();
+        bindTableTypes();
+        bindAfiSafis();
+        bindApplicationRibWriters();
+        bind(BGPTableTypeRegistryConsumer.class).toProvider(BGPTableTypeRegistryConsumerProvider.class)
+                .in(Singleton.class);
+
+        configureAlso();
+
+        // TODO(HONEYCOMB-395): should all afi-safis use the same send-max value?
+    }
+
+    protected abstract Logger getLogger();
+
+    private void bindAfiSafis() {
+        final Multibinder<AfiSafi> afiSafiBinder = Multibinder.newSetBinder(binder(), AfiSafi.class);
+        getAfiSafiTypeProviders().stream()
+                .peek(aClass -> getLogger().debug("Binding afi {}", aClass))
+                .forEach(providerClass -> afiSafiBinder.addBinding().toProvider(providerClass));
+    }
+
+    private void bindRibActivators() {
+        final Multibinder<RIBExtensionProviderActivator> ribBinder = Multibinder.newSetBinder(binder(),
+                RIBExtensionProviderActivator.class);
+        getRibActivators().stream()
+                .peek(aClass -> getLogger().debug("Binding RIB activator {}", aClass))
+                .forEach(activator -> ribBinder.addBinding().to(activator));
+    }
+
+    private void bindExtensionActivators() {
+        final Multibinder<BGPExtensionProviderActivator> extensionsBinder = Multibinder.newSetBinder(binder(),
+                BGPExtensionProviderActivator.class);
+        getExtensionActivators().stream()
+                .peek(aClass -> getLogger().debug("Binding Extension activator {}", aClass))
+                .forEach(activator -> extensionsBinder.addBinding().to(activator));
+    }
+
+    private void bindTableTypes() {
+        final Multibinder<BGPTableTypeRegistryConsumerProvider.BGPTableType> tableTypeBinder =
+                Multibinder.newSetBinder(binder(), BGPTableTypeRegistryConsumerProvider.BGPTableType.class);
+        getTableTypes().stream()
+                .peek(tableTypeRegistration -> getLogger().debug("Binding table type {}", tableTypeRegistration))
+                .forEach(registration -> tableTypeBinder.addBinding()
+                        .toInstance(provider -> provider.registerBGPTableType(registration.addressFamily, registration.subsequentAddressFamily, registration.afiSafiType)));
+    }
+
+    private void bindApplicationRibWriters() {
+        final Multibinder<WriterFactory> applicationRibWritersBinder = Multibinder.newSetBinder(binder(), WriterFactory.class);
+
+        getApplicationRibWriters().stream()
+                .peek(aClass -> getLogger().debug("Binding writer factory {}", aClass))
+                .forEach(aClass -> applicationRibWritersBinder.addBinding().to(aClass));
+    }
+
+    static final class TableTypeRegistration {
+        private final Class<? extends AddressFamily> addressFamily;
+        private final Class<? extends SubsequentAddressFamily> subsequentAddressFamily;
+        private final Class<? extends AfiSafiType> afiSafiType;
+
+        private TableTypeRegistration(final Class<? extends AddressFamily> addressFamily,
+                                      final Class<? extends SubsequentAddressFamily> subsequentAddressFamily,
+                                      final Class<? extends AfiSafiType> afiSafiType) {
+            this.addressFamily = addressFamily;
+            this.subsequentAddressFamily = subsequentAddressFamily;
+            this.afiSafiType = afiSafiType;
+        }
+
+        static TableTypeRegistration tableType(@Nonnull final Class<? extends AddressFamily> addressFamily,
+                                                      @Nonnull final Class<? extends SubsequentAddressFamily> subsequentAddressFamily,
+                                                      @Nonnull final Class<? extends AfiSafiType> afiSafiType) {
+            return new TableTypeRegistration(addressFamily, subsequentAddressFamily, afiSafiType);
+        }
+
+        @Override
+        public String toString() {
+            return "TableTypeRegistration{" +
+                    "addressFamily=" + addressFamily +
+                    ", subsequentAddressFamily=" + subsequentAddressFamily +
+                    ", afiSafiType=" + afiSafiType +
+                    '}';
+        }
+    }
+
+}
  * limitations under the License.
  */
 
-package io.fd.honeycomb.infra.bgp;
+package io.fd.honeycomb.northbound.bgp.extension;
 
 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;
@@ -29,6 +27,9 @@ import org.opendaylight.protocol.bgp.parser.spi.pojo.SimpleBGPExtensionProviderC
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.ArrayList;
+import java.util.Set;
+
 final class BGPExtensionConsumerContextProvider extends ProviderTrait<BGPExtensionConsumerContext> {
     private static final Logger LOG = LoggerFactory.getLogger(BGPExtensionConsumerContextProvider.class);
 
  * limitations under the License.
  */
 
-package io.fd.honeycomb.infra.bgp;
+package io.fd.honeycomb.northbound.bgp.extension;
 
 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;
 
+import java.util.Set;
+
 final class BGPTableTypeRegistryConsumerProvider extends ProviderTrait<BGPTableTypeRegistryConsumer> {
     @Inject
     private Set<BGPTableType> tableTypes;
diff --git a/infra/northbound/bgp-extensions/extension-common/src/main/java/io/fd/honeycomb/northbound/bgp/extension/BgpExtensionModule.java b/infra/northbound/bgp-extensions/extension-common/src/main/java/io/fd/honeycomb/northbound/bgp/extension/BgpExtensionModule.java
new file mode 100644 (file)
index 0000000..10d4398
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+ * 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.northbound.bgp.extension;
+
+import com.google.inject.Provider;
+import io.fd.honeycomb.translate.write.WriterFactory;
+import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionProviderActivator;
+import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionProviderActivator;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafi;
+
+import java.util.Set;
+
+/**
+ * Interface to define all bindings that BGP extension module should expose
+ */
+public interface BgpExtensionModule {
+
+    /**
+     * RIB activator/s for module
+     */
+    Set<Class<? extends RIBExtensionProviderActivator>> getRibActivators();
+
+    /**
+     * Extension activator/s for module
+     */
+    Set<Class<? extends BGPExtensionProviderActivator>> getExtensionActivators();
+
+    /**
+     * Supported table types
+     */
+    Set<AbstractBgpExtensionModule.TableTypeRegistration> getTableTypes();
+
+    /**
+     * Supported afi's
+     */
+    Set<Class<? extends Provider<AfiSafi>>> getAfiSafiTypeProviders();
+
+    /**
+     * Returns {@code WriterFactory} that binds all nodes that extension is handling
+     */
+    Set<Class<? extends WriterFactory>> getApplicationRibWriters();
+
+    /**
+     * Any additional bindings that are needed
+     */
+    default void configureAlso() {
+        //NOOP - override to add additional configuration
+    }
+}
diff --git a/infra/northbound/bgp-extensions/extension-common/src/main/java/io/fd/honeycomb/northbound/bgp/extension/CommonBgpExtensionsModule.java b/infra/northbound/bgp-extensions/extension-common/src/main/java/io/fd/honeycomb/northbound/bgp/extension/CommonBgpExtensionsModule.java
new file mode 100644 (file)
index 0000000..e5406dd
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * 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.northbound.bgp.extension;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.Singleton;
+import com.google.inject.multibindings.Multibinder;
+import org.opendaylight.protocol.bgp.parser.impl.BGPActivator;
+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.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Registers BGP extensions provided by ODL implementation.
+ * TODO(HONEYCOMB-378): add support for flowspec (requires some special initialization)
+ */
+public final class CommonBgpExtensionsModule extends AbstractModule {
+    private static final Logger LOG = LoggerFactory.getLogger(CommonBgpExtensionsModule.class);
+
+    protected void configure() {
+        LOG.debug("Initializing CommonBgpExtensionsModule");
+        // 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
+        bind(RIBExtensionConsumerContext.class).toProvider(RIBExtensionConsumerContextProvider.class).in(Singleton.class);
+        bind(BGPExtensionConsumerContext.class).toProvider(BGPExtensionConsumerContextProvider.class).in(Singleton.class);
+        Multibinder.newSetBinder(binder(), BGPExtensionProviderActivator.class).addBinding().to(BGPActivator.class);
+    }
+}
  * limitations under the License.
  */
 
-package io.fd.honeycomb.infra.bgp;
+package io.fd.honeycomb.northbound.bgp.extension;
 
 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.opendaylight.protocol.bgp.rib.spi.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.ArrayList;
+import java.util.Set;
+
 public class RIBExtensionConsumerContextProvider extends ProviderTrait<RIBExtensionConsumerContext> {
     private static final Logger LOG = LoggerFactory.getLogger(RIBExtensionConsumerContextProvider.class);
     @Inject
diff --git a/infra/northbound/bgp-extensions/inet/asciidoc/Readme.adoc b/infra/northbound/bgp-extensions/inet/asciidoc/Readme.adoc
new file mode 100644 (file)
index 0000000..dbc32d9
--- /dev/null
@@ -0,0 +1,11 @@
+= Inet
+
+Configure http://docs.opendaylight.org/en/${project-odl-branch}/user-guide/bgp-user-guide.html#evpn-family[Inet] extension for ODL BGP
+
+Handles following table types:
+
+* Ipv4Unicast
+* Ipv6Unicast
+
+Enable by including InetModule in /opt/honeycomb/modules configuration
+
diff --git a/infra/northbound/bgp-extensions/inet/pom.xml b/infra/northbound/bgp-extensions/inet/pom.xml
new file mode 100644 (file)
index 0000000..cc62cb9
--- /dev/null
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ 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.
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>impl-parent</artifactId>
+        <groupId>io.fd.honeycomb.common</groupId>
+        <version>1.18.01-SNAPSHOT</version>
+        <relativePath>../../../../common/impl-parent</relativePath>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>io.fd.honeycomb.northbound.bgp</groupId>
+    <artifactId>inet</artifactId>
+    <version>1.18.01-SNAPSHOT</version>
+
+    <dependencies>
+        <dependency>
+            <groupId>io.fd.honeycomb.northbound.bgp</groupId>
+            <artifactId>extension-common</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.bgpcep</groupId>
+            <artifactId>bgp-inet</artifactId>
+            <version>${bgpcep.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.fd.honeycomb.northbound</groupId>
+            <artifactId>bgp</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+    </dependencies>
+</project>
\ No newline at end of file
diff --git a/infra/northbound/bgp-extensions/inet/src/main/java/io/fd/honeycomb/northbound/bgp/extension/InetModule.java b/infra/northbound/bgp-extensions/inet/src/main/java/io/fd/honeycomb/northbound/bgp/extension/InetModule.java
new file mode 100644 (file)
index 0000000..477d0ec
--- /dev/null
@@ -0,0 +1,111 @@
+/*
+ * 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.northbound.bgp.extension;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import io.fd.honeycomb.infra.bgp.BgpConfiguration;
+import io.fd.honeycomb.translate.write.WriterFactory;
+import org.opendaylight.protocol.bgp.inet.BGPActivator;
+import org.opendaylight.protocol.bgp.inet.RIBActivator;
+import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionProviderActivator;
+import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionProviderActivator;
+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.IPV4UNICAST;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.IPV6UNICAST;
+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.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.UnicastSubsequentAddressFamily;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Set;
+
+import static io.fd.honeycomb.northbound.bgp.extension.AbstractBgpExtensionModule.TableTypeRegistration.tableType;
+
+public class InetModule extends AbstractBgpExtensionModule {
+
+    private static final Logger LOG = LoggerFactory.getLogger(InetModule.class);
+
+    @Override
+    public Set<Class<? extends RIBExtensionProviderActivator>> getRibActivators() {
+        return ImmutableSet.of(RIBActivator.class);
+    }
+
+    @Override
+    public Set<Class<? extends BGPExtensionProviderActivator>> getExtensionActivators() {
+        return ImmutableSet.of(BGPActivator.class);
+    }
+
+    @Override
+    public Set<TableTypeRegistration> getTableTypes() {
+        return ImmutableSet.of(
+                tableType(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class, IPV4UNICAST.class),
+                tableType(Ipv6AddressFamily.class, UnicastSubsequentAddressFamily.class, IPV6UNICAST.class));
+    }
+
+    @Override
+    public Set<Class<? extends Provider<AfiSafi>>> getAfiSafiTypeProviders() {
+        return ImmutableSet.of(
+                V4UnicastTableTypeProvider.class,
+                V6UnicastTableTypeProvider.class);
+    }
+
+    @Override
+    public Set<Class<? extends WriterFactory>> getApplicationRibWriters() {
+        return ImmutableSet.of(InetWriterFactory.class);
+    }
+
+    @Override
+    public Logger getLogger() {
+        return LOG;
+    }
+
+    private static class V4UnicastTableTypeProvider implements Provider<AfiSafi> {
+
+        @Inject
+        private BgpConfiguration cfg;
+
+        @Override
+        public AfiSafi get() {
+            return new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.class)
+                    .addAugmentation(AfiSafi2.class,
+                            new AfiSafi2Builder().setReceive(cfg.isBgpMultiplePathsEnabled())
+                                    .setSendMax(cfg.bgpSendMaxMaths.get().shortValue()).build())
+                    .build();
+        }
+    }
+
+    private static class V6UnicastTableTypeProvider implements Provider<AfiSafi> {
+
+        @Inject
+        private BgpConfiguration cfg;
+
+        @Override
+        public AfiSafi get() {
+            return new AfiSafiBuilder().setAfiSafiName(IPV6UNICAST.class)
+                    .addAugmentation(AfiSafi2.class,
+                            new AfiSafi2Builder().setReceive(cfg.isBgpMultiplePathsEnabled())
+                                    .setSendMax(cfg.bgpSendMaxMaths.get().shortValue()).build())
+                    .build();
+        }
+    }
+}
diff --git a/infra/northbound/bgp-extensions/inet/src/main/java/io/fd/honeycomb/northbound/bgp/extension/InetWriterFactory.java b/infra/northbound/bgp-extensions/inet/src/main/java/io/fd/honeycomb/northbound/bgp/extension/InetWriterFactory.java
new file mode 100644 (file)
index 0000000..de61c8d
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * 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.northbound.bgp.extension;
+
+import com.google.common.collect.Sets;
+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.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.types.rev130919.next.hop.c.next.hop.ipv4.next.hop._case.Ipv4NextHop;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+
+import javax.annotation.Nonnull;
+
+import static io.fd.honeycomb.northbound.bgp.extension.AbstractBgpExtensionModule.TABLES_IID;
+
+public class InetWriterFactory implements WriterFactory {
+
+    private static final InstanceIdentifier<Ipv4Routes> IPV4_ROUTES_IID = TABLES_IID.child((Class) Ipv4Routes.class);
+
+    @Inject
+    @Named("honeycomb-bgp")
+    private DataBroker dataBroker;
+
+    @Override
+    public void init(@Nonnull ModifiableWriterRegistryBuilder registry) {
+        final InstanceIdentifier<Ipv4Routes> subtreeIid = InstanceIdentifier.create(Ipv4Routes.class);
+
+        //TODO - HONEYCOMB-359 - use wildcarded subtree writer
+        registry.subtreeAdd(
+                Sets.newHashSet(
+                        subtreeIid.child(Ipv4Route.class),
+                        subtreeIid.child(Ipv4Route.class).child(Attributes.class),
+                        subtreeIid.child(Ipv4Route.class).child(Attributes.class).child(Origin.class),
+                        subtreeIid.child(Ipv4Route.class).child(Attributes.class).child(LocalPref.class),
+                        subtreeIid.child(Ipv4Route.class).child(Attributes.class).child(Ipv4NextHop.class)),
+                new BindingBrokerWriter<>(IPV4_ROUTES_IID, dataBroker)
+        );
+    }
+}
diff --git a/infra/northbound/bgp-extensions/l3-vpn-v4/asciidoc/Readme.adoc b/infra/northbound/bgp-extensions/l3-vpn-v4/asciidoc/Readme.adoc
new file mode 100644 (file)
index 0000000..10ddee8
--- /dev/null
@@ -0,0 +1,9 @@
+= L3-vpn-v4
+
+Configure v4 part of  http://docs.opendaylight.org/en/${project-odl-branch}/user-guide/bgp-user-guide.html#ip-l3vpn-family[L3Vpn] extension for ODL BGP
+
+Handles following table types:
+
+* L3VpnIpv4Unicast
+
+Enable by including L3VpnV4Module in /opt/honeycomb/modules configuration
\ No newline at end of file
diff --git a/infra/northbound/bgp-extensions/l3-vpn-v4/pom.xml b/infra/northbound/bgp-extensions/l3-vpn-v4/pom.xml
new file mode 100644 (file)
index 0000000..b88125e
--- /dev/null
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ 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.
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>impl-parent</artifactId>
+        <groupId>io.fd.honeycomb.common</groupId>
+        <version>1.18.01-SNAPSHOT</version>
+        <relativePath>../../../../common/impl-parent</relativePath>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>io.fd.honeycomb.northbound.bgp</groupId>
+    <artifactId>l3-vpn-v4</artifactId>
+    <version>1.18.01-SNAPSHOT</version>
+
+    <dependencies>
+        <dependency>
+            <groupId>io.fd.honeycomb.northbound.bgp</groupId>
+            <artifactId>extension-common</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.bgpcep</groupId>
+            <artifactId>bgp-l3vpn</artifactId>
+            <version>${bgpcep.version}</version>
+        </dependency>
+    </dependencies>
+
+</project>
\ No newline at end of file
diff --git a/infra/northbound/bgp-extensions/l3-vpn-v4/src/main/java/io/fd/honeycomb/northbound/bgp/extension/L3VpnV4Module.java b/infra/northbound/bgp-extensions/l3-vpn-v4/src/main/java/io/fd/honeycomb/northbound/bgp/extension/L3VpnV4Module.java
new file mode 100644 (file)
index 0000000..777b4ad
--- /dev/null
@@ -0,0 +1,74 @@
+/*
+ * 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.northbound.bgp.extension;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.inject.Provider;
+import io.fd.honeycomb.translate.write.WriterFactory;
+import org.opendaylight.protocol.bgp.l3vpn.ipv4.BgpIpv4Activator;
+import org.opendaylight.protocol.bgp.l3vpn.ipv4.RibIpv4Activator;
+import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionProviderActivator;
+import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionProviderActivator;
+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.types.rev151009.L3VPNIPV4UNICAST;
+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.MplsLabeledVpnSubsequentAddressFamily;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Collections;
+import java.util.Set;
+
+import static io.fd.honeycomb.northbound.bgp.extension.AbstractBgpExtensionModule.TableTypeRegistration.tableType;
+
+public class L3VpnV4Module extends AbstractBgpExtensionModule {
+
+    private static final Logger LOG = LoggerFactory.getLogger(L3VpnV4Module.class);
+
+    @Override
+    public Set<Class<? extends RIBExtensionProviderActivator>> getRibActivators() {
+        return ImmutableSet.of(RibIpv4Activator.class);
+    }
+
+    @Override
+    public Set<Class<? extends BGPExtensionProviderActivator>> getExtensionActivators() {
+        return ImmutableSet.of(BgpIpv4Activator.class);
+    }
+
+    @Override
+    public Set<TableTypeRegistration> getTableTypes() {
+        return ImmutableSet.of(
+                tableType(
+                        Ipv4AddressFamily.class, MplsLabeledVpnSubsequentAddressFamily.class, L3VPNIPV4UNICAST.class));
+    }
+
+    @Override
+    public Set<Class<? extends Provider<AfiSafi>>> getAfiSafiTypeProviders() {
+        return Collections.emptySet();
+    }
+
+    @Override
+    public Set<Class<? extends WriterFactory>> getApplicationRibWriters() {
+        //TODO - HONEYCOMB-359 - use wildcarded subtree writer
+        return Collections.emptySet();
+    }
+
+    @Override
+    public Logger getLogger() {
+        return LOG;
+    }
+}
diff --git a/infra/northbound/bgp-extensions/l3-vpn-v6/asciidoc/Readme.adoc b/infra/northbound/bgp-extensions/l3-vpn-v6/asciidoc/Readme.adoc
new file mode 100644 (file)
index 0000000..b63cda9
--- /dev/null
@@ -0,0 +1,9 @@
+= L3-vpn-v6
+
+Configure v6 part of http://docs.opendaylight.org/en/${project-odl-branch}/user-guide/bgp-user-guide.html#ip-l3vpn-family[L3Vpn] extension for ODL BGP
+
+Handles following table types:
+
+* L3VpnIpv6Unicast
+
+Enable by including L3VpnV6Module in /opt/honeycomb/modules configuration
\ No newline at end of file
diff --git a/infra/northbound/bgp-extensions/l3-vpn-v6/pom.xml b/infra/northbound/bgp-extensions/l3-vpn-v6/pom.xml
new file mode 100644 (file)
index 0000000..ee6f675
--- /dev/null
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ 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.
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>impl-parent</artifactId>
+        <groupId>io.fd.honeycomb.common</groupId>
+        <version>1.18.01-SNAPSHOT</version>
+        <relativePath>../../../../common/impl-parent</relativePath>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>io.fd.honeycomb.northbound.bgp</groupId>
+    <artifactId>l3-vpn-v6</artifactId>
+    <version>1.18.01-SNAPSHOT</version>
+
+    <dependencies>
+        <dependency>
+            <groupId>io.fd.honeycomb.northbound.bgp</groupId>
+            <artifactId>extension-common</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.bgpcep</groupId>
+            <artifactId>bgp-l3vpn</artifactId>
+            <version>${bgpcep.version}</version>
+        </dependency>
+    </dependencies>
+
+</project>
\ No newline at end of file
diff --git a/infra/northbound/bgp-extensions/l3-vpn-v6/src/main/java/io/fd/honeycomb/northbound/bgp/extension/L3VpnV6Module.java b/infra/northbound/bgp-extensions/l3-vpn-v6/src/main/java/io/fd/honeycomb/northbound/bgp/extension/L3VpnV6Module.java
new file mode 100644 (file)
index 0000000..7125774
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * 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.northbound.bgp.extension;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.inject.Provider;
+import io.fd.honeycomb.translate.write.WriterFactory;
+import org.opendaylight.protocol.bgp.l3vpn.ipv6.BgpIpv6Activator;
+import org.opendaylight.protocol.bgp.l3vpn.ipv6.RibIpv6Activator;
+import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionProviderActivator;
+import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionProviderActivator;
+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.types.rev151009.L3VPNIPV6UNICAST;
+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.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Collections;
+import java.util.Set;
+
+import static io.fd.honeycomb.northbound.bgp.extension.AbstractBgpExtensionModule.TableTypeRegistration.tableType;
+
+public class L3VpnV6Module extends AbstractBgpExtensionModule {
+
+    private static final Logger LOG = LoggerFactory.getLogger(L3VpnV6Module.class);
+
+    @Override
+    public Set<Class<? extends RIBExtensionProviderActivator>> getRibActivators() {
+        return ImmutableSet.of(RibIpv6Activator.class);
+    }
+
+    @Override
+    public Set<Class<? extends BGPExtensionProviderActivator>> getExtensionActivators() {
+        return ImmutableSet.of(BgpIpv6Activator.class);
+    }
+
+    @Override
+    public Set<TableTypeRegistration> getTableTypes() {
+        return ImmutableSet.of(
+                tableType(
+                        Ipv6AddressFamily.class,
+                        MplsLabeledVpnSubsequentAddressFamily.class,
+                        L3VPNIPV6UNICAST.class));
+    }
+
+    @Override
+    public Set<Class<? extends Provider<AfiSafi>>> getAfiSafiTypeProviders() {
+        return Collections.emptySet();
+    }
+
+    @Override
+    public Set<Class<? extends WriterFactory>> getApplicationRibWriters() {
+        //TODO - HONEYCOMB-359 - use wildcarded subtree writer
+        return Collections.emptySet();
+    }
+
+    @Override
+    public Logger getLogger() {
+        return LOG;
+    }
+}
diff --git a/infra/northbound/bgp-extensions/labeled-unicast/asciidoc/Readme.adoc b/infra/northbound/bgp-extensions/labeled-unicast/asciidoc/Readme.adoc
new file mode 100644 (file)
index 0000000..831c8d0
--- /dev/null
@@ -0,0 +1,10 @@
+= Labeled-unicast
+
+Configure http://docs.opendaylight.org/en/${project-odl-branch}/user-guide/bgp-user-guide.html#ip-labeled-unicast-family[LabeledUnicast] extension for ODL BGP
+
+Handles following table types:
+
+* Ipv4LabeledUnicast
+* Ipv6LabeledUnicast
+
+Enable by including LabeledUnicastModule in /opt/honeycomb/modules configuration
\ No newline at end of file
diff --git a/infra/northbound/bgp-extensions/labeled-unicast/pom.xml b/infra/northbound/bgp-extensions/labeled-unicast/pom.xml
new file mode 100644 (file)
index 0000000..8719e22
--- /dev/null
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ 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.
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>impl-parent</artifactId>
+        <groupId>io.fd.honeycomb.common</groupId>
+        <version>1.18.01-SNAPSHOT</version>
+        <relativePath>../../../../common/impl-parent</relativePath>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>io.fd.honeycomb.northbound.bgp</groupId>
+    <artifactId>labeled-unicast</artifactId>
+    <version>1.18.01-SNAPSHOT</version>
+    <dependencies>
+        <dependency>
+            <groupId>io.fd.honeycomb.northbound.bgp</groupId>
+            <artifactId>extension-common</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.bgpcep</groupId>
+            <artifactId>bgp-labeled-unicast</artifactId>
+            <version>${bgpcep.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.fd.honeycomb.northbound</groupId>
+            <artifactId>bgp</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+    </dependencies>
+
+</project>
\ No newline at end of file
diff --git a/infra/northbound/bgp-extensions/labeled-unicast/src/main/java/io/fd/honeycomb/northbound/bgp/extension/LabeledUnicastModule.java b/infra/northbound/bgp-extensions/labeled-unicast/src/main/java/io/fd/honeycomb/northbound/bgp/extension/LabeledUnicastModule.java
new file mode 100644 (file)
index 0000000..fd32c54
--- /dev/null
@@ -0,0 +1,111 @@
+/*
+ * 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.northbound.bgp.extension;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import io.fd.honeycomb.infra.bgp.BgpConfiguration;
+import io.fd.honeycomb.translate.write.WriterFactory;
+import org.opendaylight.protocol.bgp.labeled.unicast.BGPActivator;
+import org.opendaylight.protocol.bgp.labeled.unicast.RIBActivator;
+import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionProviderActivator;
+import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionProviderActivator;
+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.IPV6LABELLEDUNICAST;
+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.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.types.rev130919.Ipv4AddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv6AddressFamily;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Set;
+
+import static io.fd.honeycomb.northbound.bgp.extension.AbstractBgpExtensionModule.TableTypeRegistration.tableType;
+
+public class LabeledUnicastModule extends AbstractBgpExtensionModule {
+
+    private static final Logger LOG = LoggerFactory.getLogger(LabeledUnicastModule.class);
+
+
+    @Override
+    public Set<Class<? extends RIBExtensionProviderActivator>> getRibActivators() {
+        return ImmutableSet.of(RIBActivator.class);
+    }
+
+    @Override
+    public Set<Class<? extends BGPExtensionProviderActivator>> getExtensionActivators() {
+        return ImmutableSet.of(BGPActivator.class);
+    }
+
+    @Override
+    public Set<TableTypeRegistration> getTableTypes() {
+        return ImmutableSet.of(
+                tableType(Ipv4AddressFamily.class, LabeledUnicastSubsequentAddressFamily.class, IPV4LABELLEDUNICAST.class),
+                tableType(Ipv6AddressFamily.class, LabeledUnicastSubsequentAddressFamily.class, IPV6LABELLEDUNICAST.class)
+        );
+    }
+
+    @Override
+    public Set<Class<? extends Provider<AfiSafi>>> getAfiSafiTypeProviders() {
+        return ImmutableSet.of(
+                V6LabeledUnicastTableTypeProvider.class,
+                V4LabeledUnicastTableTypeProvider.class);
+    }
+
+    @Override
+    public Set<Class<? extends WriterFactory>> getApplicationRibWriters() {
+        return ImmutableSet.of(LabeledUnicastWriterFactory.class);
+    }
+
+    @Override
+    public Logger getLogger() {
+        return LOG;
+    }
+
+    private static class V4LabeledUnicastTableTypeProvider implements Provider<AfiSafi> {
+        @Inject
+        private BgpConfiguration cfg;
+
+        @Override
+        public AfiSafi get() {
+            return new AfiSafiBuilder().setAfiSafiName(IPV4LABELLEDUNICAST.class)
+                    .addAugmentation(AfiSafi2.class,
+                            new AfiSafi2Builder().setReceive(cfg.isBgpMultiplePathsEnabled())
+                                    .setSendMax(cfg.bgpSendMaxMaths.get().shortValue()).build())
+                    .build();
+        }
+    }
+
+    private static class V6LabeledUnicastTableTypeProvider implements Provider<AfiSafi> {
+        @Inject
+        private BgpConfiguration cfg;
+
+        @Override
+        public AfiSafi get() {
+            return new AfiSafiBuilder().setAfiSafiName(IPV6LABELLEDUNICAST.class)
+                    .addAugmentation(AfiSafi2.class,
+                            new AfiSafi2Builder().setReceive(cfg.isBgpMultiplePathsEnabled())
+                                    .setSendMax(cfg.bgpSendMaxMaths.get().shortValue()).build())
+                    .build();
+        }
+    }
+}
diff --git a/infra/northbound/bgp-extensions/labeled-unicast/src/main/java/io/fd/honeycomb/northbound/bgp/extension/LabeledUnicastWriterFactory.java b/infra/northbound/bgp-extensions/labeled-unicast/src/main/java/io/fd/honeycomb/northbound/bgp/extension/LabeledUnicastWriterFactory.java
new file mode 100644 (file)
index 0000000..c1ccaba
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+ * 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.northbound.bgp.extension;
+
+import com.google.common.collect.Sets;
+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.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.types.rev130919.next.hop.c.next.hop.ipv4.next.hop._case.Ipv4NextHop;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+
+import javax.annotation.Nonnull;
+
+import static io.fd.honeycomb.northbound.bgp.extension.AbstractBgpExtensionModule.TABLES_IID;
+
+
+public class LabeledUnicastWriterFactory implements WriterFactory {
+
+    private static final InstanceIdentifier<LabeledUnicastRoutes> LABELED_UNICAST_ROUTES_IID = TABLES_IID.child((Class) LabeledUnicastRoutes.class);
+
+    @Inject
+    @Named("honeycomb-bgp")
+    private DataBroker dataBroker;
+
+    @Override
+    public void init(@Nonnull ModifiableWriterRegistryBuilder registry) {
+        final InstanceIdentifier<LabeledUnicastRoutes> subtreeIid = InstanceIdentifier.create(LabeledUnicastRoutes.class);
+
+        //TODO - HONEYCOMB-359 - use wildcarded subtree writer
+        registry.subtreeAdd(
+                Sets.newHashSet(
+                        subtreeIid.child(LabeledUnicastRoute.class),
+                        subtreeIid.child(LabeledUnicastRoute.class).child(Attributes.class),
+                        subtreeIid.child(LabeledUnicastRoute.class).child(Attributes.class).child(Origin.class),
+                        subtreeIid.child(LabeledUnicastRoute.class).child(Attributes.class).child(LocalPref.class),
+                        subtreeIid.child(LabeledUnicastRoute.class).child(Attributes.class).child(Ipv4NextHop.class),
+                        subtreeIid.child(LabeledUnicastRoute.class).child(LabelStack.class)
+                ),
+                new BindingBrokerWriter<>(LABELED_UNICAST_ROUTES_IID, dataBroker));
+    }
+}
diff --git a/infra/northbound/bgp-extensions/linkstate/asciidoc/Readme.adoc b/infra/northbound/bgp-extensions/linkstate/asciidoc/Readme.adoc
new file mode 100644 (file)
index 0000000..30b77cd
--- /dev/null
@@ -0,0 +1,9 @@
+= Linkstate
+
+Configure http://docs.opendaylight.org/en/${project-odl-branch}/user-guide/bgp-user-guide.html#link-state-family[Linkstate] extension for ODL BGP
+
+Handles following table types:
+
+* Linkstate
+
+Enable by including LinkstateModule in /opt/honeycomb/modules configuration
\ No newline at end of file
diff --git a/infra/northbound/bgp-extensions/linkstate/pom.xml b/infra/northbound/bgp-extensions/linkstate/pom.xml
new file mode 100644 (file)
index 0000000..0a674fa
--- /dev/null
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ 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.
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>impl-parent</artifactId>
+        <groupId>io.fd.honeycomb.common</groupId>
+        <version>1.18.01-SNAPSHOT</version>
+        <relativePath>../../../../common/impl-parent</relativePath>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>io.fd.honeycomb.northbound.bgp</groupId>
+    <artifactId>linkstate</artifactId>
+    <version>1.18.01-SNAPSHOT</version>
+    <dependencies>
+        <dependency>
+            <groupId>io.fd.honeycomb.northbound.bgp</groupId>
+            <artifactId>extension-common</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.bgpcep</groupId>
+            <artifactId>bgp-linkstate</artifactId>
+            <version>${bgpcep.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.fd.honeycomb.northbound</groupId>
+            <artifactId>bgp</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+    </dependencies>
+
+</project>
\ No newline at end of file
diff --git a/infra/northbound/bgp-extensions/linkstate/src/main/java/io/fd/honeycomb/northbound/bgp/extension/LinkstateModule.java b/infra/northbound/bgp-extensions/linkstate/src/main/java/io/fd/honeycomb/northbound/bgp/extension/LinkstateModule.java
new file mode 100644 (file)
index 0000000..6221172
--- /dev/null
@@ -0,0 +1,93 @@
+/*
+ * 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.northbound.bgp.extension;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import io.fd.honeycomb.infra.bgp.BgpConfiguration;
+import io.fd.honeycomb.translate.write.WriterFactory;
+import org.opendaylight.protocol.bgp.linkstate.impl.BGPActivator;
+import org.opendaylight.protocol.bgp.linkstate.impl.RIBActivator;
+import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionProviderActivator;
+import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionProviderActivator;
+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.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.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.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Collections;
+import java.util.Set;
+
+import static io.fd.honeycomb.northbound.bgp.extension.AbstractBgpExtensionModule.TableTypeRegistration.tableType;
+
+public class LinkstateModule extends AbstractBgpExtensionModule {
+
+    private static final Logger LOG = LoggerFactory.getLogger(LinkstateModule.class);
+
+    @Override
+    public Set<Class<? extends RIBExtensionProviderActivator>> getRibActivators() {
+        return ImmutableSet.of(RIBActivator.class);
+    }
+
+    @Override
+    public Set<Class<? extends BGPExtensionProviderActivator>> getExtensionActivators() {
+        return ImmutableSet.of(BGPActivator.class);
+    }
+
+    @Override
+    public Set<TableTypeRegistration> getTableTypes() {
+        return ImmutableSet.of(
+                tableType(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class, LINKSTATE.class));
+    }
+
+    @Override
+    public Set<Class<? extends Provider<AfiSafi>>> getAfiSafiTypeProviders() {
+        return ImmutableSet.of(LinkstateAfiSafiProvider.class);
+    }
+
+    @Override
+    public Set<Class<? extends WriterFactory>> getApplicationRibWriters() {
+        //TODO - HONEYCOMB-359 - use wildcarded subtree writer
+        return Collections.emptySet();
+    }
+
+    @Override
+    public Logger getLogger() {
+        return LOG;
+    }
+
+    private static class LinkstateAfiSafiProvider implements Provider<AfiSafi> {
+
+        @Inject
+        private BgpConfiguration cfg;
+
+        @Override
+        public AfiSafi get() {
+            return new AfiSafiBuilder().setAfiSafiName(LINKSTATE.class)
+                    .addAugmentation(AfiSafi2.class,
+                            new AfiSafi2Builder().setReceive(cfg.isBgpMultiplePathsEnabled())
+                                    .setSendMax(cfg.bgpSendMaxMaths.get().shortValue()).build())
+                    .build();
+        }
+    }
+}
diff --git a/infra/northbound/bgp-extensions/pom.xml b/infra/northbound/bgp-extensions/pom.xml
new file mode 100644 (file)
index 0000000..fa770c0
--- /dev/null
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ 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.
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>honeycomb-parent</artifactId>
+        <groupId>io.fd.honeycomb.common</groupId>
+        <version>1.18.01-SNAPSHOT</version>
+        <relativePath>../../../common/honeycomb-parent</relativePath>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>io.fd.honeycomb.northbound.bgp</groupId>
+    <artifactId>bgp-extensions</artifactId>
+    <version>1.18.01-SNAPSHOT</version>
+    <modules>
+        <module>evpn</module>
+        <module>inet</module>
+        <module>l3-vpn-v4</module>
+        <module>l3-vpn-v6</module>
+        <module>labeled-unicast</module>
+        <module>linkstate</module>
+        <module>extension-common</module>
+    </modules>
+    <packaging>pom</packaging>
+
+</project>
\ No newline at end of file
index 1a18e7c..66d08e7 100644 (file)
             <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>
             <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
index 104a859..02f1788 100644 (file)
 
 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/BgpExtensionsModule.java b/infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/BgpExtensionsModule.java
deleted file mode 100644 (file)
index 4f9ab7a..0000000
+++ /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);
-    }
-}
index 5663b7c..06444ae 100644 (file)
 
 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)
index c58afc0..fca58b6 100644 (file)
@@ -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);
index d0fe161..d7528fd 100644 (file)
@@ -35,6 +35,7 @@
         <module>bgp</module>
         <module>restconf</module>
         <module>netconf</module>
+        <module>bgp-extensions</module>
     </modules>
 
 </project>
\ No newline at end of file
index 5bc64c1..ba01721 100644 (file)
@@ -80,6 +80,7 @@
                 <project-version-in-jira>11004</project-version-in-jira>
                 <project-branch>master</project-branch>
                 <project-git-web>https://git.fd.io/cgit/honeycomb/tree</project-git-web>
+                <project-odl-branch>stable-carbon</project-odl-branch>
               </attributes>
             </configuration>
           </execution>