BUG-4197: BGP OpenConfig SPI 52/27952/10
authorMilos Fabian <milfabia@cisco.com>
Sat, 3 Oct 2015 00:18:28 +0000 (02:18 +0200)
committerGerrit Code Review <gerrit@opendaylight.org>
Thu, 29 Oct 2015 17:04:26 +0000 (17:04 +0000)
Defines the APIs to track a BGP configuration modules status changes and
BGP OpenConfig data writers consumed as a service injected by config subsystem into
BGP configuration module.
The goal is to react on changes in the BGP configuration module instances - the configuration
modules are mapped to the OpenConfig BGP data model instances and kept in a datastore.

Change-Id: Ic38d5049d4d7e2f51f05a0e44e28626fc48e7ab7
Signed-off-by: Milos Fabian <milfabia@cisco.com>
27 files changed:
artifacts/pom.xml
bgp/openconfig-spi/.project [new file with mode: 0644]
bgp/openconfig-spi/pom.xml [new file with mode: 0644]
bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/BGPConfigModuleTracker.java [new file with mode: 0644]
bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/BGPOpenConfigProvider.java [new file with mode: 0644]
bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/BGPOpenconfigMapper.java [new file with mode: 0644]
bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/InstanceConfiguration.java [new file with mode: 0644]
bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/InstanceConfigurationIdentifier.java [new file with mode: 0644]
bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/pojo/AbstractInstanceConfiguration.java [new file with mode: 0644]
bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/pojo/BGPAppPeerInstanceConfiguration.java [new file with mode: 0644]
bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/pojo/BGPPeerInstanceConfiguration.java [new file with mode: 0644]
bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/pojo/BGPRibInstanceConfiguration.java [new file with mode: 0644]
bgp/openconfig-spi/src/main/yang/odl-bgp-openconfig-spi-cfg.yang [new file with mode: 0644]
bgp/openconfig-spi/src/test/java/org/opendaylight/protocol/bgp/openconfig/spi/pojo/BGPAppPeerInstanceConfigurationTest.java [new file with mode: 0644]
bgp/openconfig-spi/src/test/java/org/opendaylight/protocol/bgp/openconfig/spi/pojo/BGPPeerInstanceConfigurationTest.java [new file with mode: 0644]
bgp/openconfig-spi/src/test/java/org/opendaylight/protocol/bgp/openconfig/spi/pojo/BGPRibInstanceConfigurationTest.java [new file with mode: 0644]
bgp/pom.xml
bgp/rib-impl/pom.xml
bgp/rib-impl/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPApplicationPeerModule.java
bgp/rib-impl/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPPeerModule.java
bgp/rib-impl/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/RIBImplModule.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/ApplicationPeer.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBImpl.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/spi/RIB.java
bgp/rib-impl/src/main/yang/odl-bgp-rib-impl-cfg.yang
features/bgp/pom.xml
features/bgp/src/main/features/features.xml

index ae0fff6716d795cd660e389d94977bbfd95fb04e..0e3d379eeadf908fd3504b01ab0fdde3511f040b 100644 (file)
                 <artifactId>bgp-openconfig-api</artifactId>
                 <version>${project.version}</version>
             </dependency>
+            <dependency>
+                <groupId>${project.groupId}</groupId>
+                <artifactId>bgp-openconfig-spi</artifactId>
+                <version>${project.version}</version>
+            </dependency>
             <dependency>
                 <groupId>${project.groupId}</groupId>
                 <artifactId>bgp-controller-config</artifactId>
diff --git a/bgp/openconfig-spi/.project b/bgp/openconfig-spi/.project
new file mode 100644 (file)
index 0000000..0eeb7b3
--- /dev/null
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>bgp-openconfig-spi</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.jdt.core.javabuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.m2e.core.maven2Builder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.jdt.core.javanature</nature>
+               <nature>org.eclipse.m2e.core.maven2Nature</nature>
+       </natures>
+</projectDescription>
diff --git a/bgp/openconfig-spi/pom.xml b/bgp/openconfig-spi/pom.xml
new file mode 100644 (file)
index 0000000..4b865b1
--- /dev/null
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- vi: set et smarttab sw=4 tabstop=4: -->
+<!--
+ Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
+
+ This program and the accompanying materials are made available under the
+ terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ and is available at http://www.eclipse.org/legal/epl-v10.html
+-->
+
+<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">
+
+    <modelVersion>4.0.0</modelVersion>
+    <scm>
+        <connection>scm:git:ssh://git.opendaylight.org:29418/bgpcep.git</connection>
+        <developerConnection>scm:git:ssh://git.opendaylight.org:29418/bgpcep.git</developerConnection>
+        <url>https://wiki.opendaylight.org/view/BGP_LS_PCEP:Main</url>
+        <tag>HEAD</tag>
+    </scm>
+    <parent>
+        <groupId>org.opendaylight.bgpcep</groupId>
+        <artifactId>bgp-parent</artifactId>
+        <version>0.5.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>bgp-openconfig-spi</artifactId>
+    <description>BGP OPENCONFIG SPI</description>
+    <packaging>bundle</packaging>
+    <name>${project.artifactId}</name>
+    <prerequisites>
+        <maven>3.0.4</maven>
+    </prerequisites>
+
+    <dependencies>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>bgp-parser-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>bgp-rib-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.mdsal.model</groupId>
+            <artifactId>ietf-yang-types</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.mdsal</groupId>
+            <artifactId>yang-binding</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.yangtools</groupId>
+            <artifactId>yang-common</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>config-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.tcpmd5</groupId>
+            <artifactId>tcpmd5-api</artifactId>
+        </dependency>
+        <!-- test dependencies -->
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+        </dependency>
+    </dependencies>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.opendaylight.yangtools</groupId>
+                <artifactId>yang-maven-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <extensions>true</extensions>
+                <configuration>
+                    <instructions>
+                        <Bundle-Name>${project.groupId}.${project.artifactId}</Bundle-Name>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>
\ No newline at end of file
diff --git a/bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/BGPConfigModuleTracker.java b/bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/BGPConfigModuleTracker.java
new file mode 100644 (file)
index 0000000..bedc6b9
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.protocol.bgp.openconfig.spi;
+
+/**
+ * Provides hook methods for tracking the BGP configuration module instance life-cycle.
+ *
+ */
+public interface BGPConfigModuleTracker {
+
+    /**
+     * Provides an action when configuration module instance is created.
+     */
+    void onInstanceCreate();
+
+    /**
+     *  Provides an action when configuration module instance is closed.
+     */
+    void onInstanceClose();
+
+}
diff --git a/bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/BGPOpenConfigProvider.java b/bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/BGPOpenConfigProvider.java
new file mode 100644 (file)
index 0000000..374c3b1
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.protocol.bgp.openconfig.spi;
+
+/**
+ * Holds BGP OpenConfig configuration components mappers.
+ */
+public interface BGPOpenConfigProvider {
+
+    /**
+     * Return OpenConfig mapper for particular BGP InstanceConfiguration holder
+     * @param clazz The class type of a InstanceConfiguration to which the BGPOpenconfigMapper
+     * is binded.
+     * @return BGPOpenconfigMapper
+     */
+    <T extends InstanceConfiguration> BGPOpenconfigMapper<T> getOpenConfigMapper(Class<T> clazz);
+
+}
diff --git a/bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/BGPOpenconfigMapper.java b/bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/BGPOpenconfigMapper.java
new file mode 100644 (file)
index 0000000..563caaa
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.protocol.bgp.openconfig.spi;
+
+import javax.annotation.Nonnull;
+
+/**
+ * The BGPOpenconfigMapper provides operations for adding/removing of BGP OpenConfig
+ * components mapped to BGP configuration modules
+ *
+ * @param <T> The type of a BGP module configuration holder to which the mapper is binded
+ */
+public interface BGPOpenconfigMapper<T extends InstanceConfiguration> {
+
+    /**
+     * Add a new or replace an exiting configuration. The write operation is done in
+     * non-blocking fashion.
+     * @param instanceConfiguration An input configuration is mapped to OpenConfig API
+     * @throws NullPointerException when the instanceConfiguration is null
+     */
+    void writeConfiguration(@Nonnull T instanceConfiguration);
+
+    /**
+     * Remove an existing configuration identified by InstanceConfigurationIdentifier.
+     * @param instanceConfiguration an identifier of the configuration instance
+     * @throws NullPointerException when instanceConfiguration is null
+     */
+    void removeConfiguration(@Nonnull InstanceConfigurationIdentifier instanceConfiguration);
+
+}
diff --git a/bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/InstanceConfiguration.java b/bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/InstanceConfiguration.java
new file mode 100644 (file)
index 0000000..a4f247b
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.protocol.bgp.openconfig.spi;
+
+import org.opendaylight.yangtools.concepts.Identifiable;
+
+/**
+ * Common interface for all BGP configuration holders
+ *
+ */
+public interface InstanceConfiguration extends Identifiable<InstanceConfigurationIdentifier> {
+
+}
diff --git a/bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/InstanceConfigurationIdentifier.java b/bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/InstanceConfigurationIdentifier.java
new file mode 100644 (file)
index 0000000..d1b549b
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.protocol.bgp.openconfig.spi;
+
+import com.google.common.base.Preconditions;
+import java.util.Objects;
+import org.opendaylight.yangtools.concepts.Identifier;
+
+/**
+ * Identifier of an InstanceConfiguration
+ *
+ */
+public final class InstanceConfigurationIdentifier implements Identifier {
+
+    private static final long serialVersionUID = 1L;
+
+    private final String name;
+
+    public InstanceConfigurationIdentifier(final String name) {
+        this.name = Preconditions.checkNotNull(name);
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + Objects.hashCode(name);
+        return result;
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (!(obj instanceof InstanceConfiguration)) {
+            return false;
+        }
+        final InstanceConfigurationIdentifier other = (InstanceConfigurationIdentifier) obj;
+        if (!Objects.equals(name, other.name)) {
+            return false;
+        }
+        return true;
+    }
+
+
+
+}
diff --git a/bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/pojo/AbstractInstanceConfiguration.java b/bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/pojo/AbstractInstanceConfiguration.java
new file mode 100644 (file)
index 0000000..ab12008
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.protocol.bgp.openconfig.spi.pojo;
+
+import com.google.common.base.Preconditions;
+import org.opendaylight.protocol.bgp.openconfig.spi.InstanceConfiguration;
+import org.opendaylight.protocol.bgp.openconfig.spi.InstanceConfigurationIdentifier;
+
+abstract class AbstractInstanceConfiguration implements InstanceConfiguration {
+
+    private final InstanceConfigurationIdentifier identifier;
+
+    protected AbstractInstanceConfiguration(final InstanceConfigurationIdentifier identifier) {
+        this.identifier = Preconditions.checkNotNull(identifier);
+    }
+
+    @Override
+    public InstanceConfigurationIdentifier getIdentifier() {
+        return this.identifier;
+    }
+}
diff --git a/bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/pojo/BGPAppPeerInstanceConfiguration.java b/bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/pojo/BGPAppPeerInstanceConfiguration.java
new file mode 100644 (file)
index 0000000..749419f
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.protocol.bgp.openconfig.spi.pojo;
+
+import com.google.common.base.Preconditions;
+import org.opendaylight.protocol.bgp.openconfig.spi.InstanceConfigurationIdentifier;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
+
+/**
+ * POJO for holding BGP Application Peer module instance configuration
+ *
+ */
+public final class BGPAppPeerInstanceConfiguration extends AbstractInstanceConfiguration {
+
+    private final String appRibId;
+    private final Ipv4Address bgpId;
+
+    public BGPAppPeerInstanceConfiguration(final InstanceConfigurationIdentifier instanceName, final String appRibId, final Ipv4Address bgpId) {
+        super(instanceName);
+        this.appRibId = Preconditions.checkNotNull(appRibId);
+        this.bgpId = Preconditions.checkNotNull(bgpId);
+    }
+
+    public String getAppRibId() {
+        return appRibId;
+    }
+
+    public Ipv4Address getBgpId() {
+        return bgpId;
+    }
+
+}
diff --git a/bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/pojo/BGPPeerInstanceConfiguration.java b/bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/pojo/BGPPeerInstanceConfiguration.java
new file mode 100644 (file)
index 0000000..8d998e7
--- /dev/null
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.protocol.bgp.openconfig.spi.pojo;
+
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+import java.util.List;
+import org.opendaylight.protocol.bgp.openconfig.spi.InstanceConfigurationIdentifier;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.PortNumber;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.BgpTableType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.PeerRole;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.tcpmd5.cfg.rev140427.Rfc2385Key;
+
+/**
+ * POJO for holding BGP Peer module instance configuration
+ *
+ */
+public final class BGPPeerInstanceConfiguration extends AbstractInstanceConfiguration {
+
+    private final IpAddress host;
+    private final PortNumber port;
+    private final short holdTimer;
+    private final PeerRole peerRole;
+    private final boolean active;
+    private final List<BgpTableType> advertizedTables;
+    private final AsNumber asNumber;
+    private final Rfc2385Key password;
+
+    public BGPPeerInstanceConfiguration(final InstanceConfigurationIdentifier identifier, final IpAddress host, final PortNumber port, final short holdTimer, final PeerRole peerRole,
+            final boolean active, final List<BgpTableType> advertizedTables, final AsNumber asNumber, final Rfc2385Key password) {
+        super(identifier);
+        this.host = Preconditions.checkNotNull(host);
+        this.port = Preconditions.checkNotNull(port);
+        this.holdTimer = Preconditions.checkNotNull(holdTimer);
+        this.peerRole = Preconditions.checkNotNull(peerRole);
+        this.active = Preconditions.checkNotNull(active);
+        this.advertizedTables = Preconditions.checkNotNull(advertizedTables);
+        this.asNumber = Preconditions.checkNotNull(asNumber);
+        this.password = password;
+    }
+
+    public IpAddress getHost() {
+        return host;
+    }
+
+    public PortNumber getPort() {
+        return port;
+    }
+
+    public short getHoldTimer() {
+        return holdTimer;
+    }
+
+    public PeerRole getPeerRole() {
+        return peerRole;
+    }
+
+    public boolean isActive() {
+        return active;
+    }
+
+    public List<BgpTableType> getAdvertizedTables() {
+        return advertizedTables;
+    }
+
+    public AsNumber getAsNumber() {
+        return asNumber;
+    }
+
+    public Optional<Rfc2385Key> getPassword() {
+        return Optional.fromNullable(password);
+    }
+
+}
diff --git a/bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/pojo/BGPRibInstanceConfiguration.java b/bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/pojo/BGPRibInstanceConfiguration.java
new file mode 100644 (file)
index 0000000..0d5ea4a
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.protocol.bgp.openconfig.spi.pojo;
+
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+import java.util.List;
+import org.opendaylight.protocol.bgp.openconfig.spi.InstanceConfigurationIdentifier;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.BgpTableType;
+
+/**
+ * POJO for holding BGP RIB module instance configuration
+ *
+ */
+public final class BGPRibInstanceConfiguration extends AbstractInstanceConfiguration {
+
+    private final AsNumber localAs;
+    private final Ipv4Address bgpRibId;
+    private final Ipv4Address clusterId;
+    private final List<BgpTableType> tableTypes;
+
+    public BGPRibInstanceConfiguration(final InstanceConfigurationIdentifier identifier, final AsNumber localAs, final Ipv4Address bgpRibId,
+            final Ipv4Address clusterId, final List<BgpTableType> tableTypes) {
+        super(identifier);
+        this.localAs = Preconditions.checkNotNull(localAs);
+        this.bgpRibId = Preconditions.checkNotNull(bgpRibId);
+        this.clusterId = clusterId;
+        this.tableTypes = Preconditions.checkNotNull(tableTypes);
+    }
+
+    public AsNumber getLocalAs() {
+        return localAs;
+    }
+
+    public Ipv4Address getBgpRibId() {
+        return bgpRibId;
+    }
+
+    public Optional<Ipv4Address> getClusterId() {
+        return Optional.fromNullable(clusterId);
+    }
+
+    public List<BgpTableType> getTableTypes() {
+        return tableTypes;
+    }
+
+}
diff --git a/bgp/openconfig-spi/src/main/yang/odl-bgp-openconfig-spi-cfg.yang b/bgp/openconfig-spi/src/main/yang/odl-bgp-openconfig-spi-cfg.yang
new file mode 100644 (file)
index 0000000..5d47a34
--- /dev/null
@@ -0,0 +1,17 @@
+// Contents of "odl-bgp-openconfig-spi-cfg"
+module odl-bgp-openconfig-spi-cfg {
+    namespace "urn:opendaylight:params:xml:ns:yang:controller:bgp-openconfig-spi";
+    prefix "bgp-oc-spi";
+
+    import config { prefix config; revision-date 2013-04-05; }
+
+    revision 2015-09-25 {
+        description "Initial revision";
+    }
+
+    identity bgp-openconfig-provider {
+        base "config:service-type";
+        config:java-class "org.opendaylight.protocol.bgp.openconfig.spi.BGPOpenConfigProvider";
+    }
+
+}
\ No newline at end of file
diff --git a/bgp/openconfig-spi/src/test/java/org/opendaylight/protocol/bgp/openconfig/spi/pojo/BGPAppPeerInstanceConfigurationTest.java b/bgp/openconfig-spi/src/test/java/org/opendaylight/protocol/bgp/openconfig/spi/pojo/BGPAppPeerInstanceConfigurationTest.java
new file mode 100644 (file)
index 0000000..53a4a12
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.protocol.bgp.openconfig.spi.pojo;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.opendaylight.protocol.bgp.openconfig.spi.InstanceConfigurationIdentifier;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
+
+public class BGPAppPeerInstanceConfigurationTest {
+
+    private static final InstanceConfigurationIdentifier INSTANCE_NAME = new InstanceConfigurationIdentifier("instanceName");
+    private static final String RIB_ID = "ribId";
+    private static final Ipv4Address BGP_ID = new Ipv4Address("127.0.0.1");
+
+    private final BGPAppPeerInstanceConfiguration config = new BGPAppPeerInstanceConfiguration(INSTANCE_NAME, RIB_ID, BGP_ID);
+
+    @Test
+    public void testGetAppRibId() {
+        assertEquals(RIB_ID, config.getAppRibId());
+    }
+
+    @Test
+    public void testGetBgpId() {
+        assertEquals(BGP_ID, config.getBgpId());
+    }
+
+    @Test
+    public void testGetInstanceName() {
+        assertEquals(INSTANCE_NAME, config.getIdentifier());
+    }
+
+}
diff --git a/bgp/openconfig-spi/src/test/java/org/opendaylight/protocol/bgp/openconfig/spi/pojo/BGPPeerInstanceConfigurationTest.java b/bgp/openconfig-spi/src/test/java/org/opendaylight/protocol/bgp/openconfig/spi/pojo/BGPPeerInstanceConfigurationTest.java
new file mode 100644 (file)
index 0000000..a17a132
--- /dev/null
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.protocol.bgp.openconfig.spi.pojo;
+
+import static org.junit.Assert.assertEquals;
+
+import com.google.common.base.Optional;
+import java.util.Collections;
+import org.junit.Test;
+import org.opendaylight.protocol.bgp.openconfig.spi.InstanceConfigurationIdentifier;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.PortNumber;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.BgpTableType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.PeerRole;
+
+public class BGPPeerInstanceConfigurationTest {
+
+    private static final InstanceConfigurationIdentifier INSTANCE_NAME = new InstanceConfigurationIdentifier("instanceName");
+    private static final IpAddress HOST = new IpAddress(new Ipv4Address("127.0.0.1"));
+    private static final PortNumber PORT = new PortNumber(1234);
+    private static final short HOLD_TIMER = 180;
+    private static final AsNumber AS_NUMBER = new AsNumber(72L);
+
+    private final BGPPeerInstanceConfiguration config = new BGPPeerInstanceConfiguration(INSTANCE_NAME, HOST, PORT, HOLD_TIMER, PeerRole.Ibgp,
+            Boolean.FALSE, Collections.<BgpTableType>emptyList(), AS_NUMBER, null);
+
+    @Test
+    public final void testGetHost() {
+        assertEquals(HOST, config.getHost());
+    }
+
+    @Test
+    public final void testGetPort() {
+        assertEquals(PORT, config.getPort());
+    }
+
+    @Test
+    public final void testGetHoldTimer() {
+        assertEquals(HOLD_TIMER, config.getHoldTimer());
+    }
+
+    @Test
+    public final void testGetPeerRole() {
+        assertEquals(PeerRole.Ibgp, config.getPeerRole());
+    }
+
+    @Test
+    public final void testIsActive() {
+        assertEquals(Boolean.FALSE, config.isActive());
+    }
+
+    @Test
+    public final void testGetAdvertizedTables() {
+        assertEquals(Collections.EMPTY_LIST, config.getAdvertizedTables());
+    }
+
+    @Test
+    public final void testGetAsNumber() {
+        assertEquals(AS_NUMBER, config.getAsNumber());
+    }
+
+    @Test
+    public final void testGetPassword() {
+        assertEquals(Optional.absent(), config.getPassword());
+    }
+
+    @Test
+    public final void testGetInstanceName() {
+        assertEquals(INSTANCE_NAME, config.getIdentifier());
+    }
+
+}
diff --git a/bgp/openconfig-spi/src/test/java/org/opendaylight/protocol/bgp/openconfig/spi/pojo/BGPRibInstanceConfigurationTest.java b/bgp/openconfig-spi/src/test/java/org/opendaylight/protocol/bgp/openconfig/spi/pojo/BGPRibInstanceConfigurationTest.java
new file mode 100644 (file)
index 0000000..4fac1e3
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.protocol.bgp.openconfig.spi.pojo;
+
+import static org.junit.Assert.assertEquals;
+
+import com.google.common.base.Optional;
+import java.util.Collections;
+import org.junit.Test;
+import org.opendaylight.protocol.bgp.openconfig.spi.InstanceConfigurationIdentifier;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.BgpTableType;
+
+public class BGPRibInstanceConfigurationTest {
+
+    private static final InstanceConfigurationIdentifier INSTANCE_NAME = new InstanceConfigurationIdentifier("instanceName");
+    private static final Ipv4Address BGP_ID = new Ipv4Address("127.0.0.1");
+    private static final Ipv4Address CLUSTER_ID = new Ipv4Address("127.0.0.2");
+    private static final AsNumber AS_NUMBER = new AsNumber(72L);
+
+    private final BGPRibInstanceConfiguration config = new BGPRibInstanceConfiguration(INSTANCE_NAME, AS_NUMBER, BGP_ID, CLUSTER_ID,
+            Collections.<BgpTableType>emptyList());
+
+    @Test
+    public final void testGetLocalAs() {
+        assertEquals(AS_NUMBER, config.getLocalAs());
+    }
+
+    @Test
+    public final void testGetBgpRibId() {
+        assertEquals(BGP_ID, config.getBgpRibId());
+    }
+
+    @Test
+    public final void testGetClusterId() {
+        assertEquals(Optional.of(CLUSTER_ID), config.getClusterId());
+    }
+
+    @Test
+    public final void testGetTableTypes() {
+        assertEquals(Collections.EMPTY_LIST, config.getTableTypes());
+    }
+
+    @Test
+    public final void testGetInstanceName() {
+        assertEquals(INSTANCE_NAME, config.getIdentifier());
+    }
+
+}
index 8a5346f194497b838b15981b9b81dac2c90a675d..f7c06bb858ebac09d44f37e6e883711398f127b8 100644 (file)
@@ -51,5 +51,6 @@
         <module>bmp-impl</module>
         <module>controller-config</module>
         <module>openconfig-api</module>
+        <module>openconfig-spi</module>
     </modules>
 </project>
index 68781453560550746e8a338f71a7cbaaf998a3c3..c1a569e2c9f59639495e88972a9b09246055215a 100644 (file)
             <groupId>org.opendaylight.controller</groupId>
             <artifactId>netty-timer-config</artifactId>
         </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>bgp-openconfig-spi</artifactId>
+        </dependency>
 
         <dependency>
             <groupId>org.osgi</groupId>
index 63351ecacd89e8555f419659423c5dab79a6a6aa..2000215d7c0134b748712bee535293859b3327e3 100644 (file)
@@ -7,9 +7,15 @@
  */
 package org.opendaylight.controller.config.yang.bgp.rib.impl;
 
+import com.google.common.base.Optional;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeChangeService;
 import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeIdentifier;
+import org.opendaylight.protocol.bgp.openconfig.spi.BGPConfigModuleTracker;
+import org.opendaylight.protocol.bgp.openconfig.spi.BGPOpenConfigProvider;
+import org.opendaylight.protocol.bgp.openconfig.spi.BGPOpenconfigMapper;
+import org.opendaylight.protocol.bgp.openconfig.spi.InstanceConfigurationIdentifier;
+import org.opendaylight.protocol.bgp.openconfig.spi.pojo.BGPAppPeerInstanceConfiguration;
 import org.opendaylight.protocol.bgp.rib.impl.ApplicationPeer;
 import org.opendaylight.protocol.bgp.rib.impl.RIBImpl;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.ApplicationRib;
@@ -41,6 +47,36 @@ public class BGPApplicationPeerModule extends org.opendaylight.controller.config
     public java.lang.AutoCloseable createInstance() {
         final YangInstanceIdentifier id = YangInstanceIdentifier.builder().node(ApplicationRib.QNAME).nodeWithKey(ApplicationRib.QNAME, APP_ID_QNAME, getApplicationRibId().getValue()).node(Tables.QNAME).node(Tables.QNAME).build();
         final DOMDataTreeChangeService service = (DOMDataTreeChangeService) getDataBrokerDependency().getSupportedExtensions().get(DOMDataTreeChangeService.class);
-        return service.registerDataTreeChangeListener(new DOMDataTreeIdentifier(LogicalDatastoreType.CONFIGURATION, id), new ApplicationPeer(getApplicationRibId(), getBgpPeerId(), (RIBImpl) getTargetRibDependency()));
+        return service.registerDataTreeChangeListener(new DOMDataTreeIdentifier(LogicalDatastoreType.CONFIGURATION, id), new ApplicationPeer(getApplicationRibId(), getBgpPeerId(), (RIBImpl) getTargetRibDependency(), new AppPeerModuleTracker(getTargetRibDependency().getOpenConfigProvider())));
+    }
+
+    private final class AppPeerModuleTracker implements BGPConfigModuleTracker {
+
+        private final BGPOpenconfigMapper<BGPAppPeerInstanceConfiguration> appProvider;
+        private final InstanceConfigurationIdentifier identifier;
+
+        public AppPeerModuleTracker(final Optional<BGPOpenConfigProvider> openConfigProvider) {
+            if (openConfigProvider.isPresent()) {
+                appProvider = openConfigProvider.get().getOpenConfigMapper(BGPAppPeerInstanceConfiguration.class);
+            } else {
+                appProvider = null;
+            }
+            identifier = new InstanceConfigurationIdentifier(getIdentifier().getInstanceName());
+        }
+
+        @Override
+        public void onInstanceCreate() {
+            if (appProvider != null) {
+                appProvider.writeConfiguration(new BGPAppPeerInstanceConfiguration(identifier, getApplicationRibId().getValue(), getBgpPeerId()));
+            }
+        }
+
+        @Override
+        public void onInstanceClose() {
+            if (appProvider != null) {
+                appProvider.removeConfiguration(identifier);
+            }
+        }
+
     }
 }
index 620d67e074c92029be8ed0d187976b5623867633..b36bae53f1cb171466f539d362a3763277ace0b9 100644 (file)
@@ -25,6 +25,11 @@ import java.net.InetSocketAddress;
 import java.util.ArrayList;
 import java.util.List;
 import org.opendaylight.controller.config.api.JmxAttributeValidationException;
+import org.opendaylight.protocol.bgp.openconfig.spi.BGPConfigModuleTracker;
+import org.opendaylight.protocol.bgp.openconfig.spi.BGPOpenConfigProvider;
+import org.opendaylight.protocol.bgp.openconfig.spi.BGPOpenconfigMapper;
+import org.opendaylight.protocol.bgp.openconfig.spi.InstanceConfigurationIdentifier;
+import org.opendaylight.protocol.bgp.openconfig.spi.pojo.BGPPeerInstanceConfiguration;
 import org.opendaylight.protocol.bgp.rib.impl.BGPPeer;
 import org.opendaylight.protocol.bgp.rib.impl.StrictBGPPeerRegistry;
 import org.opendaylight.protocol.bgp.rib.impl.spi.BGPPeerRegistry;
@@ -127,11 +132,15 @@ public final class BGPPeerModule extends org.opendaylight.controller.config.yang
 
         getPeerRegistryBackwards().addPeer(getHostWithoutValue(), bgpClientPeer, prefs);
 
+        final BGPPeerModuleTracker moduleTracker = new BGPPeerModuleTracker(r.getOpenConfigProvider());
+        moduleTracker.onInstanceCreate();
+
         final CloseableNoEx peerCloseable = new CloseableNoEx() {
             @Override
             public void close() {
                 bgpClientPeer.close();
                 getPeerRegistryBackwards().removePeer(getHostWithoutValue());
+                moduleTracker.onInstanceClose();
             }
         };
 
@@ -234,4 +243,36 @@ public final class BGPPeerModule extends org.opendaylight.controller.config.yang
         return null;
     }
 
+    private final class BGPPeerModuleTracker implements BGPConfigModuleTracker {
+
+        private final BGPOpenconfigMapper<BGPPeerInstanceConfiguration> neighborProvider;
+        private final InstanceConfigurationIdentifier identifier;
+
+        public BGPPeerModuleTracker(final Optional<BGPOpenConfigProvider> openconfigProvider) {
+            if (openconfigProvider.isPresent()) {
+                neighborProvider = openconfigProvider.get().getOpenConfigMapper(BGPPeerInstanceConfiguration.class);
+            } else {
+                neighborProvider = null;
+            }
+            identifier = new InstanceConfigurationIdentifier(getIdentifier().getInstanceName());
+        }
+
+        @Override
+        public void onInstanceCreate() {
+            if (neighborProvider != null) {
+                neighborProvider.writeConfiguration(new BGPPeerInstanceConfiguration(identifier,
+                        getHostWithoutValue(), getPort(), getHoldtimer(), getPeerRole(), getInitiateConnection(),
+                        getAdvertizedTableDependency(), getAsOrDefault(getRibDependency()), getPassword()));
+            }
+        }
+
+        @Override
+        public void onInstanceClose() {
+            if (neighborProvider != null) {
+                neighborProvider.removeConfiguration(identifier);
+            }
+        }
+
+    }
+
 }
index 5af710176062ed96ccd02a99312b33df8b1c5748..4c331a1090d7ed5ca9e7985be0dfba16aa652529 100644 (file)
@@ -20,6 +20,10 @@ import java.util.Hashtable;
 import org.opendaylight.controller.config.api.JmxAttributeValidationException;
 import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
 import org.opendaylight.controller.sal.core.api.model.SchemaService;
+import org.opendaylight.protocol.bgp.openconfig.spi.BGPConfigModuleTracker;
+import org.opendaylight.protocol.bgp.openconfig.spi.BGPOpenconfigMapper;
+import org.opendaylight.protocol.bgp.openconfig.spi.InstanceConfigurationIdentifier;
+import org.opendaylight.protocol.bgp.openconfig.spi.pojo.BGPRibInstanceConfiguration;
 import org.opendaylight.protocol.bgp.rib.impl.RIBImpl;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber;
 import org.opendaylight.yangtools.sal.binding.generator.impl.GeneratedClassLoadingStrategy;
@@ -58,9 +62,11 @@ public final class RIBImplModule extends org.opendaylight.controller.config.yang
 
     @Override
     public java.lang.AutoCloseable createInstance() {
-        RIBImpl rib = new RIBImpl(getRibId(), new AsNumber(getLocalAs()), getBgpRibId(), getClusterId(), getExtensionsDependency(),
+        final AsNumber asNumber = new AsNumber(getLocalAs());
+        final RIBImpl rib = new RIBImpl(getRibId(), asNumber, getBgpRibId(), getClusterId(), getExtensionsDependency(),
             getBgpDispatcherDependency(), getTcpReconnectStrategyDependency(), getCodecTreeFactoryDependency(), getSessionReconnectStrategyDependency(),
-            getDataProviderDependency(), getDomDataProviderDependency(), getLocalTableDependency(), classLoadingStrategy());
+            getDataProviderDependency(), getDomDataProviderDependency(), getLocalTableDependency(), classLoadingStrategy(),
+            new RIBImplModuleTracker(getGlobalWriter()), getOpenconfigProviderDependency());
         registerSchemaContextListener(rib);
         return rib;
     }
@@ -69,8 +75,8 @@ public final class RIBImplModule extends org.opendaylight.controller.config.yang
         return getExtensionsDependency().getClassLoadingStrategy();
     }
 
-    private void registerSchemaContextListener(RIBImpl rib) {
-        DOMDataBroker domBroker = getDomDataProviderDependency();
+    private void registerSchemaContextListener(final RIBImpl rib) {
+        final DOMDataBroker domBroker = getDomDataProviderDependency();
         if(domBroker instanceof SchemaService) {
             ((SchemaService) domBroker).registerSchemaContextListener(rib);
         } else {
@@ -80,7 +86,41 @@ public final class RIBImplModule extends org.opendaylight.controller.config.yang
         }
     }
 
-    public void setBundleContext(BundleContext bundleContext) {
+    public void setBundleContext(final BundleContext bundleContext) {
         this.bundleContext = bundleContext;
     }
+
+    private BGPOpenconfigMapper<BGPRibInstanceConfiguration> getGlobalWriter() {
+        if (getOpenconfigProviderDependency() != null) {
+            return getOpenconfigProviderDependency().getOpenConfigMapper(BGPRibInstanceConfiguration.class);
+        }
+        return null;
+    }
+
+    private final class RIBImplModuleTracker implements BGPConfigModuleTracker {
+
+        private final BGPOpenconfigMapper<BGPRibInstanceConfiguration> globalWriter;
+        private final InstanceConfigurationIdentifier identifier;
+
+        public RIBImplModuleTracker(final BGPOpenconfigMapper<BGPRibInstanceConfiguration> globalWriter) {
+            this.globalWriter = globalWriter;
+            this.identifier = new InstanceConfigurationIdentifier(getIdentifier().getInstanceName());
+        }
+
+        @Override
+        public void onInstanceCreate() {
+            if (globalWriter != null) {
+                globalWriter.writeConfiguration(new BGPRibInstanceConfiguration(identifier,
+                        new AsNumber(getLocalAs()), getBgpRibId(), getClusterId(), getLocalTableDependency()));
+            }
+        }
+
+        @Override
+        public void onInstanceClose() {
+            if (globalWriter != null) {
+                globalWriter.removeConfiguration(identifier);
+            }
+        }
+
+    }
 }
index d0234cb4300553eab823bcb5a90dcb5479d76d17..3e4a149791231a59233054d9e0b19b729e00ea77 100644 (file)
@@ -19,6 +19,7 @@ import org.opendaylight.controller.md.sal.common.api.data.TransactionChainListen
 import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeChangeListener;
 import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction;
 import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain;
+import org.opendaylight.protocol.bgp.openconfig.spi.BGPConfigModuleTracker;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.ApplicationRibId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.PeerRole;
@@ -57,10 +58,11 @@ public class ApplicationPeer implements AutoCloseable, org.opendaylight.protocol
     private final YangInstanceIdentifier adjRibsInId;
     private final DOMTransactionChain chain;
     private final DOMTransactionChain writerChain;
+    private final BGPConfigModuleTracker moduleTracker;
 
     private AdjRibInWriter writer;
 
-    public ApplicationPeer(final ApplicationRibId applicationRibId, final Ipv4Address ipAddress, final RIBImpl targetRib) {
+    public ApplicationPeer(final ApplicationRibId applicationRibId, final Ipv4Address ipAddress, final RIBImpl targetRib, final BGPConfigModuleTracker moduleTracker) {
         this.name = applicationRibId.getValue().toString();
         this.targetRib = Preconditions.checkNotNull(targetRib);
         this.rawIdentifier = InetAddresses.forString(ipAddress.getValue()).getAddress();
@@ -71,6 +73,14 @@ public class ApplicationPeer implements AutoCloseable, org.opendaylight.protocol
         this.writer = AdjRibInWriter.create(this.targetRib.getYangRibId(), PeerRole.Internal, this.writerChain);
         // FIXME: set to true, once it's fixed how to skip advertising routes back to AppPeer
         this.writer = this.writer.transform(RouterIds.createPeerId(ipAddress), this.targetRib.getRibSupportContext(), this.targetRib.getLocalTablesKeys(), false);
+        this.moduleTracker = moduleTracker;
+        if (moduleTracker != null) {
+            moduleTracker.onInstanceCreate();
+        }
+    }
+
+    public ApplicationPeer(final ApplicationRibId applicationRibId, final Ipv4Address bgpPeerId, final RIBImpl targetRibDependency) {
+        this(applicationRibId, bgpPeerId, targetRibDependency, null);
     }
 
     /**
@@ -171,6 +181,9 @@ public class ApplicationPeer implements AutoCloseable, org.opendaylight.protocol
         this.writer.cleanTables(this.targetRib.getLocalTablesKeys());
         this.chain.close();
         this.writerChain.close();
+        if (this.moduleTracker != null) {
+            this.moduleTracker.onInstanceClose();
+        }
     }
 
     @Override
index 645bacf49f9c435be74a3288dbc45f604cca8d7b..c8c7405b6d08590c7c1cea59b52c1b522554bcf9 100644 (file)
@@ -33,6 +33,8 @@ import org.opendaylight.controller.md.sal.dom.api.DOMDataBrokerExtension;
 import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeChangeService;
 import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction;
 import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain;
+import org.opendaylight.protocol.bgp.openconfig.spi.BGPConfigModuleTracker;
+import org.opendaylight.protocol.bgp.openconfig.spi.BGPOpenConfigProvider;
 import org.opendaylight.protocol.bgp.rib.DefaultRibReference;
 import org.opendaylight.protocol.bgp.rib.impl.spi.BGPDispatcher;
 import org.opendaylight.protocol.bgp.rib.impl.spi.CodecsRegistry;
@@ -101,10 +103,13 @@ public final class RIBImpl extends DefaultRibReference implements AutoCloseable,
     private final EffectiveRibInWriter efWriter;
     private final DOMDataBrokerExtension service;
     private final List<LocRibWriter> locRibs = new ArrayList<>();
+    private final BGPConfigModuleTracker configModuleTracker;
+    private final BGPOpenConfigProvider openConfigProvider;
 
     public RIBImpl(final RibId ribId, final AsNumber localAs, final Ipv4Address localBgpId, final Ipv4Address clusterId, final RIBExtensionConsumerContext extensions,
         final BGPDispatcher dispatcher, final ReconnectStrategyFactory tcpStrategyFactory, final BindingCodecTreeFactory codecFactory,
-        final ReconnectStrategyFactory sessionStrategyFactory, final DataBroker dps, final DOMDataBroker domDataBroker, final List<BgpTableType> localTables, final GeneratedClassLoadingStrategy classStrategy) {
+        final ReconnectStrategyFactory sessionStrategyFactory, final DataBroker dps, final DOMDataBroker domDataBroker, final List<BgpTableType> localTables,
+        final GeneratedClassLoadingStrategy classStrategy, final BGPConfigModuleTracker moduleTracker, final BGPOpenConfigProvider openConfigProvider) {
         super(InstanceIdentifier.create(BgpRib.class).child(Rib.class, new RibKey(Preconditions.checkNotNull(ribId))));
         this.domChain = domDataBroker.createTransactionChain(this);
         this.localAs = Preconditions.checkNotNull(localAs);
@@ -120,6 +125,8 @@ public final class RIBImpl extends DefaultRibReference implements AutoCloseable,
         this.codecsRegistry = CodecsRegistryImpl.create(codecFactory, classStrategy);
         this.ribContextRegistry = RIBSupportContextRegistryImpl.create(extensions, this.codecsRegistry);
         this.yangRibId = YangInstanceIdentifier.builder().node(BgpRib.QNAME).node(Rib.QNAME).nodeWithKey(Rib.QNAME, RIB_ID_QNAME, ribId.getValue()).build();
+        this.configModuleTracker = moduleTracker;
+        this.openConfigProvider = openConfigProvider;
 
         LOG.debug("Instantiating RIB table {} at {}", ribId, this.yangRibId);
 
@@ -160,6 +167,18 @@ public final class RIBImpl extends DefaultRibReference implements AutoCloseable,
             this.localTablesKeys.add(key);
             startLocRib(key, pd);
         }
+
+        if (this.configModuleTracker != null) {
+            this.configModuleTracker.onInstanceCreate();
+        }
+    }
+
+    public RIBImpl(final RibId ribId, final AsNumber localAs, final Ipv4Address localBgpId, final Ipv4Address clusterId, final RIBExtensionConsumerContext extensions,
+            final BGPDispatcher dispatcher, final ReconnectStrategyFactory tcpStrategyFactory, final BindingCodecTreeFactory codecFactory,
+            final ReconnectStrategyFactory sessionStrategyFactory, final DataBroker dps, final DOMDataBroker domDataBroker, final List<BgpTableType> localTables,
+            final GeneratedClassLoadingStrategy classStrategy) {
+        this(ribId, localAs, localBgpId, clusterId, extensions, dispatcher, tcpStrategyFactory, codecFactory, sessionStrategyFactory,
+                dps, domDataBroker, localTables, classStrategy, null, null);
     }
 
     private void startLocRib(final TablesKey key, final PolicyDatabase pd) {
@@ -213,6 +232,9 @@ public final class RIBImpl extends DefaultRibReference implements AutoCloseable,
                 LOG.warn("Could not close LocalRib reference: {}", locRib, e);
             }
         }
+        if (this.configModuleTracker != null) {
+            this.configModuleTracker.onInstanceClose();
+        }
     }
 
     @Override
@@ -322,4 +344,9 @@ public final class RIBImpl extends DefaultRibReference implements AutoCloseable,
     public CodecsRegistry getCodecsRegistry() {
         return this.codecsRegistry;
     }
+
+    @Override
+    public Optional<BGPOpenConfigProvider> getOpenConfigProvider() {
+        return Optional.fromNullable(this.openConfigProvider);
+    }
 }
index 83fc0931d318e47b4628f004259ee3b883c8d0dd..d5fabf6a4877a6545ed57ee077bf491c45acfff9 100644 (file)
@@ -7,10 +7,12 @@
  */
 package org.opendaylight.protocol.bgp.rib.impl.spi;
 
+import com.google.common.base.Optional;
 import java.util.Set;
 import javax.annotation.Nonnull;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionChainListener;
 import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain;
+import org.opendaylight.protocol.bgp.openconfig.spi.BGPOpenConfigProvider;
 import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionConsumerContext;
 import org.opendaylight.protocol.framework.ReconnectStrategyFactory;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber;
@@ -75,4 +77,12 @@ public interface RIB {
     YangInstanceIdentifier getYangRibId();
 
     CodecsRegistry getCodecsRegistry();
+
+    /**
+     * Optionally returns OpenConfigProvider, which brings an access to
+     * BGP OpenConfig mappers.
+     * @return An Optional of BGPOpenConfigProvider or Absent if provider is
+     * not available.
+     */
+    Optional<BGPOpenConfigProvider> getOpenConfigProvider();
 }
index 1e6b47f1b9b494aad205f81a562f11c615184f10..bd9eeb71d35dba4916cef3d7553c56b5611c327e 100644 (file)
@@ -19,6 +19,7 @@ module odl-bgp-rib-impl-cfg {
     import odl-tcpmd5-cfg { prefix tcpmd5; revision-date 2014-04-27; }
     import odl-tcpmd5-netty-cfg { prefix tcpmd5n; revision-date 2014-04-27; }
     import rpc-context { prefix rpcx; revision-date 2013-06-17; }
+    import odl-bgp-openconfig-spi-cfg { prefix bgp-oc-spi; revision-date 2015-09-25; }
 
     organization "Cisco Systems, Inc.";
 
@@ -661,6 +662,15 @@ module odl-bgp-rib-impl-cfg {
                 }
             }
 
+            container openconfig-provider {
+                uses config:service-ref {
+                    refine type {
+                        mandatory false;
+                        config:required-identity bgp-oc-spi:bgp-openconfig-provider;
+                    }
+                }
+            }
+
             leaf local-as {
                 description "Our local AS number. Needed by best selection path attribute.";
                 type uint32;
index 0484f630a97b9d3b8c56fceb76a97c2cf7b2d5b8..eb24c57c47b523f756aa74c6b54b1e9eac34bec1 100644 (file)
           <groupId>${project.groupId}</groupId>
           <artifactId>bgp-topology-provider</artifactId>
       </dependency>
+      <dependency>
+          <groupId>${project.groupId}</groupId>
+          <artifactId>bgp-openconfig-spi</artifactId>
+      </dependency>
       <dependency>
           <groupId>${project.groupId}</groupId>
           <artifactId>concepts</artifactId>
index c5badef84dc356c0dc9f225d3de98e5f7d0d0ab2..13f43ff160ab89d336ae34cf3eb33c915595a27b 100644 (file)
         <feature version='${mdsal.version}'>odl-mdsal-broker</feature>
         <feature version='${project.version}'>odl-bgpcep-bgp-linkstate</feature>
         <feature version='${project.version}'>odl-bgpcep-bgp-rib-api</feature>
+        <bundle>mvn:org.opendaylight.bgpcep/bgp-openconfig-spi/{{VERSION}}</bundle>
         <bundle>mvn:org.opendaylight.bgpcep/bgp-rib-impl/{{VERSION}}</bundle>
     </feature>