<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>
--- /dev/null
+<?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>
--- /dev/null
+<?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
--- /dev/null
+/*
+ * 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();
+
+}
--- /dev/null
+/*
+ * 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);
+
+}
--- /dev/null
+/*
+ * 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);
+
+}
--- /dev/null
+/*
+ * 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> {
+
+}
--- /dev/null
+/*
+ * 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;
+ }
+
+
+
+}
--- /dev/null
+/*
+ * 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;
+ }
+}
--- /dev/null
+/*
+ * 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;
+ }
+
+}
--- /dev/null
+/*
+ * 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);
+ }
+
+}
--- /dev/null
+/*
+ * 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;
+ }
+
+}
--- /dev/null
+// 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
--- /dev/null
+/*
+ * 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());
+ }
+
+}
--- /dev/null
+/*
+ * 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());
+ }
+
+}
--- /dev/null
+/*
+ * 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());
+ }
+
+}
<module>bmp-impl</module>
<module>controller-config</module>
<module>openconfig-api</module>
+ <module>openconfig-spi</module>
</modules>
</project>
<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>
*/
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;
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);
+ }
+ }
+
}
}
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;
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();
}
};
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);
+ }
+ }
+
+ }
+
}
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;
@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;
}
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 {
}
}
- 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);
+ }
+ }
+
+ }
}
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;
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();
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);
}
/**
this.writer.cleanTables(this.targetRib.getLocalTablesKeys());
this.chain.close();
this.writerChain.close();
+ if (this.moduleTracker != null) {
+ this.moduleTracker.onInstanceClose();
+ }
}
@Override
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;
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);
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);
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) {
LOG.warn("Could not close LocalRib reference: {}", locRib, e);
}
}
+ if (this.configModuleTracker != null) {
+ this.configModuleTracker.onInstanceClose();
+ }
}
@Override
public CodecsRegistry getCodecsRegistry() {
return this.codecsRegistry;
}
+
+ @Override
+ public Optional<BGPOpenConfigProvider> getOpenConfigProvider() {
+ return Optional.fromNullable(this.openConfigProvider);
+ }
}
*/
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;
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();
}
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.";
}
}
+ 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;
<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>
<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>