<artifactId>bgp-config-example</artifactId>
<version>${project.version}</version>
<type>xml</type>
- <classifier>network-topology-initial-config</classifier>
+ <classifier>network-topology-bgp-initial-config</classifier>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifact>
<file>${project.build.directory}/classes/initial/network-topology-config.xml</file>
<type>xml</type>
- <classifier>network-topology-initial-config</classifier>
+ <classifier>network-topology-bgp-initial-config</classifier>
</artifact>
</artifacts>
</configuration>
+++ /dev/null
-/*
- * Copyright (c) 2016 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.rib.impl;
-
-import static java.util.Objects.requireNonNull;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import javax.annotation.Nonnull;
-import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer;
-import org.opendaylight.protocol.bgp.config.loader.spi.ConfigFileProcessor;
-import org.opendaylight.protocol.bgp.config.loader.spi.ConfigLoader;
-import org.opendaylight.protocol.bgp.rib.impl.spi.BgpDeployer;
-import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.Neighbor;
-import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.Bgp;
-import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.bgp.Global;
-import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.bgp.Neighbors;
-import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.NetworkInstances;
-import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.NetworkInstance;
-import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.Protocols;
-import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.protocols.Protocol;
-import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.protocols.ProtocolKey;
-import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.policy.types.rev151009.BGP;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.Protocol1;
-import org.opendaylight.yangtools.concepts.AbstractRegistration;
-import org.opendaylight.yangtools.yang.binding.DataObject;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
-import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
-import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
-import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
-import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
-
-public final class ProtocolsConfigFileProcessor implements ConfigFileProcessor, AutoCloseable {
- private final BindingNormalizedNodeSerializer bindingSerializer;
- private final BgpDeployer bgpDeployer;
- private final AbstractRegistration registration;
- private final InstanceIdentifier<Protocols> protocolsIID;
- private final YangInstanceIdentifier protocolYIId;
- private static final SchemaPath PROTOCOLS_SCHEMA_PATH = SchemaPath.create(true, NetworkInstances.QNAME, NetworkInstance.QNAME, Protocols.QNAME);
-
- public ProtocolsConfigFileProcessor(final ConfigLoader configLoader, final BgpDeployer bgpDeployer) {
- requireNonNull(configLoader);
- this.bgpDeployer = requireNonNull(bgpDeployer);
- this.protocolsIID = this.bgpDeployer.getInstanceIdentifier().child(Protocols.class);
- this.bindingSerializer = configLoader.getBindingNormalizedNodeSerializer();
- this.protocolYIId = this.bindingSerializer.toYangInstanceIdentifier(this.protocolsIID.child(Protocol.class));
- this.registration = configLoader.registerConfigFile(this);
- }
-
- @Override
- public SchemaPath getSchemaPath() {
- return PROTOCOLS_SCHEMA_PATH;
- }
-
- @Override
- public void loadConfiguration(@Nonnull final NormalizedNode<?, ?> dto) {
- final ContainerNode protocolsContainer = (ContainerNode) dto;
- final MapNode protocolList = (MapNode) protocolsContainer.getChild(protocolYIId.getLastPathArgument()).get();
- final Collection<MapEntryNode> protocolsCollection = protocolList.getValue();
- for (final MapEntryNode protocolEntry : protocolsCollection) {
- final Map.Entry<InstanceIdentifier<?>, DataObject> bi = this.bindingSerializer.fromNormalizedNode(this.protocolYIId, protocolEntry);
- if (bi != null) {
- notifyDeployer((Protocol) bi.getValue());
- }
- }
- }
-
- private void notifyDeployer(final Protocol protocol) {
- final Protocol1 bgp = protocol.getAugmentation(Protocol1.class);
- if (bgp != null) {
- final InstanceIdentifier<Bgp> bgpIID = this.protocolsIID.child(Protocol.class, new ProtocolKey(BGP.class, protocol.getName()))
- .augmentation(Protocol1.class).child(Bgp.class);
-
- final Global global = bgp.getBgp().getGlobal();
- if (global != null) {
- this.bgpDeployer.onGlobalModified(bgpIID, global, () -> this.bgpDeployer.writeConfiguration(global, bgpIID.child(Global.class)));
- }
-
- final Neighbors neighbors = bgp.getBgp().getNeighbors();
- if (neighbors != null) {
- final List<Neighbor> neighborsList = neighbors.getNeighbor();
- final InstanceIdentifier<Neighbors> neighborsIID = bgpIID.child(Neighbors.class);
- neighborsList.forEach(neighbor -> this.bgpDeployer.onNeighborModified(bgpIID, neighbor,
- () -> this.bgpDeployer.writeConfiguration(neighbor, neighborsIID.child(Neighbor.class, neighbor.getKey()))));
- }
- }
- }
-
- @Override
- public void close() throws Exception {
- this.registration.close();
- }
-}
<bean id="appPeer" class="org.opendaylight.protocol.bgp.rib.impl.config.AppPeer" scope="prototype"/>
- <reference id="bgpConfigLoader" interface="org.opendaylight.protocol.bgp.config.loader.spi.ConfigLoader"/>
-
- <bean id="protocolsInitialConfig" class="org.opendaylight.protocol.bgp.rib.impl.ProtocolsConfigFileProcessor"
- destroy-method="close">
- <argument ref="bgpConfigLoader"/>
- <argument ref="bgpDeployer"/>
- </bean>
-
<bean id="bgpStateCollector" class="org.opendaylight.protocol.bgp.rib.impl.state.BGPStateCollectorImpl"/>
<service ref="bgpStateCollector" interface="org.opendaylight.protocol.bgp.rib.spi.state.BGPStateConsumer"/>
+++ /dev/null
-/*
- * Copyright (c) 2016 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.rib.impl;
-
-import static junit.framework.TestCase.assertNotNull;
-import static org.junit.Assert.assertEquals;
-import static org.mockito.Matchers.any;
-import static org.mockito.Mockito.doNothing;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-
-import com.google.common.collect.Lists;
-import java.util.List;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.Mock;
-import org.opendaylight.mdsal.binding.generator.impl.ModuleInfoBackedContext;
-import org.opendaylight.protocol.bgp.config.loader.impl.AbstractConfigLoader;
-import org.opendaylight.protocol.bgp.rib.impl.spi.BgpDeployer;
-import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.NetworkInstances;
-import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.NetworkInstance;
-import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.NetworkInstanceKey;
-import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.Protocols;
-import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.protocols.Protocol;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.Protocol1;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.binding.util.BindingReflections;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
-
-public class ProtocolsConfigFileProcessorTest extends AbstractConfigLoader {
- private static final InstanceIdentifier<NetworkInstance> NETWORK_INSTANCE_IID =
- InstanceIdentifier.create(NetworkInstances.class)
- .child(NetworkInstance.class, new NetworkInstanceKey("GLOBAL"));
- @Mock
- private BgpDeployer bgpDeployer;
-
- @Override
- @Before
- public void setUp() throws Exception {
- super.setUp();
- doReturn(NETWORK_INSTANCE_IID).when(this.bgpDeployer).getInstanceIdentifier();
- doNothing().when(this.bgpDeployer).onGlobalModified(any(), any(), any());
- doNothing().when(this.bgpDeployer).onNeighborModified(any(), any(), any());
- }
-
- @Override
- protected void registerModules(final ModuleInfoBackedContext moduleInfoBackedContext) throws Exception {
- moduleInfoBackedContext.registerModuleInfo(BindingReflections.getModuleInfo(NetworkInstances.class));
- moduleInfoBackedContext.registerModuleInfo(BindingReflections.getModuleInfo(Protocols.class));
- moduleInfoBackedContext.registerModuleInfo(BindingReflections.getModuleInfo(Protocol.class));
- moduleInfoBackedContext.registerModuleInfo(BindingReflections.getModuleInfo(Protocol1.class));
- }
-
- @Override
- protected List<String> getYangModelsPaths() {
- final List<String> paths = Lists.newArrayList(
- "/META-INF/yang/openconfig-extensions.yang",
- "/META-INF/yang/bgp-openconfig-extensions.yang",
- "/META-INF/yang/ietf-interfaces.yang",
- "/META-INF/yang/openconfig-network-instance-types.yang",
- "/META-INF/yang/openconfig-interfaces.yang",
- "/META-INF/yang/openconfig-network-instance.yang",
- "/META-INF/yang/openconfig-routing-policy.yang",
- "/META-INF/yang/openconfig-policy-types.yang",
- "/META-INF/yang/openconfig-local-routing.yang",
- "/META-INF/yang/openconfig-bgp-operational.yang",
- "/META-INF/yang/openconfig-bgp-types.yang",
- "/META-INF/yang/openconfig-types.yang",
- "/META-INF/yang/openconfig-bgp-multiprotocol.yang",
- "/META-INF/yang/openconfig-bgp.yang",
- "/META-INF/yang/bgp-rib.yang",
- "/META-INF/yang/ietf-inet-types@2013-07-15.yang",
- "/META-INF/yang/bgp-message.yang",
- "/META-INF/yang/bgp-multiprotocol.yang",
- "/META-INF/yang/bgp-types.yang",
- "/META-INF/yang/network-concepts.yang",
- "/META-INF/yang/ieee754.yang",
- "/META-INF/yang/ietf-yang-types@2013-07-15.yang",
- "/META-INF/yang/yang-ext.yang"
- );
- return paths;
- }
-
- @Test
- public void configFileTest() throws Exception {
- assertNotNull(ClassLoader.getSystemClassLoader().getResource("initial/protocols-config.xml"));
- verify(this.bgpDeployer, never()).onGlobalModified(any(), any(), any());
- verify(this.bgpDeployer, never()).onNeighborModified(any(), any(), any());
-
- final ProtocolsConfigFileProcessor processor = new ProtocolsConfigFileProcessor(this.configLoader, this.bgpDeployer);
- assertEquals(SchemaPath.create(true, NetworkInstances.QNAME, NetworkInstance.QNAME, Protocols.QNAME), processor.getSchemaPath());
-
- verify(this.bgpDeployer).onGlobalModified(any(), any(), any());
- verify(this.bgpDeployer, times(2)).onNeighborModified(any(), any(), any());
- processor.close();
- }
-}
\ No newline at end of file
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</dependency>
- <dependency>
- <groupId>${project.groupId}</groupId>
- <artifactId>config-loader-spi</artifactId>
- </dependency>
<dependency>
<groupId>org.opendaylight.mdsal.model</groupId>
<artifactId>ietf-ted</artifactId>
<artifactId>testtool-util</artifactId>
<scope>test</scope>
</dependency>
- <dependency>
- <groupId>${project.groupId}</groupId>
- <artifactId>config-loader-impl</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>${project.groupId}</groupId>
- <artifactId>config-loader-impl</artifactId>
- <type>test-jar</type>
- <scope>test</scope>
- </dependency>
<dependency>
<groupId>org.opendaylight.controller</groupId>
<artifactId>config-manager</artifactId>
<artifactId>sal-dom-broker-config</artifactId>
<scope>test</scope>
</dependency>
- <dependency>
- <groupId>${project.groupId}</groupId>
- <artifactId>bgp-config-example</artifactId>
- <scope>test</scope>
- </dependency>
<!-- junit/mockito default -->
<dependency>
<groupId>org.mockito</groupId>
</dependency>
</dependencies>
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-remote-resources-plugin</artifactId>
- <configuration>
- <attachToMain>false</attachToMain>
- <resourceBundles>
- <resourceBundle>${project.groupId}:bgp-config-example:${project.version}</resourceBundle>
- </resourceBundles>
- </configuration>
- <executions>
- <execution>
- <phase>process-test-sources</phase>
- <goals>
- <goal>process</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
<scm>
<connection>scm:git:ssh://git.opendaylight.org:29418/bgpcep.git</connection>
<developerConnection>scm:git:ssh://git.opendaylight.org:29418/bgpcep.git</developerConnection>
+++ /dev/null
-/*
- * Copyright (c) 2016 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.bgpcep.bgp.topology.provider;
-
-import static java.util.Objects.requireNonNull;
-
-import java.util.Collection;
-import java.util.Map;
-import javax.annotation.Nonnull;
-import org.opendaylight.bgpcep.bgp.topology.provider.spi.BgpTopologyDeployer;
-import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer;
-import org.opendaylight.protocol.bgp.config.loader.spi.ConfigFileProcessor;
-import org.opendaylight.protocol.bgp.config.loader.spi.ConfigLoader;
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
-import org.opendaylight.yangtools.concepts.AbstractRegistration;
-import org.opendaylight.yangtools.yang.binding.DataObject;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
-import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
-import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
-import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
-import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
-
-public final class NetworkTopologyConfigFileProcessor implements ConfigFileProcessor, AutoCloseable {
- private static final SchemaPath TOPOLOGY_SCHEMA_PATH = SchemaPath.create(true, NetworkTopology.QNAME);
- private final BindingNormalizedNodeSerializer bindingSerializer;
- private final BgpTopologyDeployer deployer;
- private final AbstractRegistration registration;
- private final YangInstanceIdentifier topologyYii;
-
- public NetworkTopologyConfigFileProcessor(final ConfigLoader configLoader, final BgpTopologyDeployer deployer) {
- requireNonNull(configLoader);
- this.deployer = requireNonNull(deployer);
- this.bindingSerializer = configLoader.getBindingNormalizedNodeSerializer();
- this.topologyYii = this.bindingSerializer.toYangInstanceIdentifier(deployer.getInstanceIdentifier());
- this.registration = configLoader.registerConfigFile(this);
- }
-
- @Override
- public void close() throws Exception {
- this.registration.close();
- }
-
- @Nonnull
- @Override
- public SchemaPath getSchemaPath() {
- return TOPOLOGY_SCHEMA_PATH;
- }
-
- @Override
- public void loadConfiguration(@Nonnull final NormalizedNode<?, ?> dto) {
- final ContainerNode networkTopologyContainer = (ContainerNode) dto;
- final MapNode topologyList = (MapNode) networkTopologyContainer.getChild(
- topologyYii.getLastPathArgument()).get();
- final Collection<MapEntryNode> networkTopology = topologyList.getValue();
- for (final MapEntryNode topology : networkTopology) {
- final Map.Entry<InstanceIdentifier<?>, DataObject> bi = this.bindingSerializer.fromNormalizedNode(this.topologyYii , topology);
- if (bi != null) {
- this.deployer.createInstance((Topology) bi.getValue());
- }
- }
- }
-}
}
@Override
- public synchronized void close() throws Exception {
+ public synchronized void close() {
this.registration.close();
LOG.info("BGP topology deployer stopped.");
this.closed = true;
<bean id="linkstateTopologyProvider" class="org.opendaylight.bgpcep.bgp.topology.provider.config.LinkstateTopologyProvider" destroy-method="close">
<argument ref="bgpTopologyDeployer"/>
</bean>
-
- <reference id="bgpConfigLoader" interface="org.opendaylight.protocol.bgp.config.loader.spi.ConfigLoader"/>
-
- <bean id="topologyInitialConfig" class="org.opendaylight.bgpcep.bgp.topology.provider.NetworkTopologyConfigFileProcessor" destroy-method="close">
- <argument ref="bgpConfigLoader"/>
- <argument ref="bgpTopologyDeployer"/>
- </bean>
</blueprint>
\ No newline at end of file
+++ /dev/null
-/*
- * Copyright (c) 2016 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.bgpcep.bgp.topology.provider;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.mockito.Matchers.any;
-import static org.mockito.Mockito.doNothing;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-
-import com.google.common.collect.Lists;
-import java.util.List;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.Mock;
-import org.opendaylight.bgpcep.bgp.topology.provider.spi.BgpTopologyDeployer;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.mdsal.binding.generator.impl.ModuleInfoBackedContext;
-import org.opendaylight.protocol.bgp.config.loader.impl.AbstractConfigLoader;
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
-import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.binding.util.BindingReflections;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
-
-public class NetworkTopologyConfigFileProcessorTest extends AbstractConfigLoader {
-
- private static final InstanceIdentifier<Topology> TOPOLOGY_IID = InstanceIdentifier
- .create(NetworkTopology.class).child(Topology.class);
- @Mock
- private BgpTopologyDeployer bgpDeployer;
- @Mock
- private DataBroker dataBroker;
-
- @Override
- @Before
- public void setUp() throws Exception {
- super.setUp();
- doReturn(TOPOLOGY_IID).when(this.bgpDeployer).getInstanceIdentifier();
- doNothing().when(this.bgpDeployer).createInstance(any());
- doReturn(this.dataBroker).when(this.bgpDeployer).getDataBroker();
-
- }
-
- @Override
- protected void registerModules(final ModuleInfoBackedContext moduleInfoBackedContext) throws Exception {
- moduleInfoBackedContext.registerModuleInfo(BindingReflections.getModuleInfo(NetworkTopology.class));
- moduleInfoBackedContext.registerModuleInfo(BindingReflections.getModuleInfo(Topology.class));
- }
-
- @Override
- protected List<String> getYangModelsPaths() {
- final List<String> paths = Lists.newArrayList(
- "/META-INF/yang/network-topology@2013-10-21.yang",
- "/META-INF/yang/ietf-inet-types@2013-07-15.yang",
- "/META-INF/yang/odl-bgp-topology-types.yang",
- "/META-INF/yang/odl-bgp-topology-config.yang",
- "/META-INF/yang/bgp-rib.yang",
- "/META-INF/yang/bgp-multiprotocol.yang",
- "/META-INF/yang/bgp-types.yang",
- "/META-INF/yang/network-concepts.yang",
- "/META-INF/yang/ieee754.yang",
- "/META-INF/yang/bgp-message.yang",
- "/META-INF/yang/yang-ext.yang"
- );
- return paths;
- }
-
- @Test
- public void configFileTest() throws Exception {
- assertNotNull(ClassLoader.getSystemClassLoader().getResource("initial/network-topology-config.xml"));
- verify(this.bgpDeployer, never()).createInstance(any());
- final NetworkTopologyConfigFileProcessor processor =
- new NetworkTopologyConfigFileProcessor(this.configLoader, this.bgpDeployer);
- assertEquals(SchemaPath.create(true, NetworkTopology.QNAME), processor.getSchemaPath());
-
- verify(this.bgpDeployer, times(3)).createInstance(any());
- processor.close();
- }
-}
\ No newline at end of file
+++ /dev/null
-/*
- * Copyright (c) 2017 Pantheon Technologies s.r.o. 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.bmp.impl.api;
-
-import com.google.common.annotations.Beta;
-import javax.annotation.Nonnull;
-import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.monitor.config.rev170517.odl.bmp.monitors.BmpMonitorConfig;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.monitor.rev150512.MonitorId;
-
-@Beta
-public interface BmpDeployer {
- /**
- * Writes BmpMonitorConfig to Config DS
- *
- * @param bmpConfig containing bmp Monitor configuration
- */
- void writeBmpMonitor(@Nonnull BmpMonitorConfig bmpConfig) throws TransactionCommitFailedException;
-
- /**
- * Removes BmpMonitorConfig from Config DS
- *
- * @param monitorId Bmp monitor Id
- */
- void deleteBmpMonitor(@Nonnull MonitorId monitorId) throws TransactionCommitFailedException;
-}
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
+import java.util.concurrent.TimeUnit;
import javax.annotation.concurrent.GuardedBy;
import org.opendaylight.controller.md.sal.binding.api.ClusteredDataTreeChangeListener;
import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
import org.opendaylight.controller.md.sal.binding.api.DataObjectModification.ModificationType;
import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
-import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction;
import org.opendaylight.protocol.bmp.api.BmpDispatcher;
-import org.opendaylight.protocol.bmp.impl.api.BmpDeployer;
import org.opendaylight.protocol.bmp.impl.app.BmpMonitoringStationImpl;
import org.opendaylight.protocol.bmp.impl.spi.BmpMonitoringStation;
import org.opendaylight.protocol.util.Ipv4Util;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.monitor.config.rev170517.OdlBmpMonitors;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.monitor.config.rev170517.odl.bmp.monitors.BmpMonitorConfig;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.monitor.config.rev170517.odl.bmp.monitors.BmpMonitorConfigKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.monitor.config.rev170517.server.config.Server;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.monitor.rev150512.BmpMonitor;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.monitor.rev150512.MonitorId;
import org.opendaylight.yangtools.concepts.ListenerRegistration;
import org.opendaylight.yangtools.yang.binding.DataObject;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-public class BmpDeployerImpl implements BmpDeployer, ClusteredDataTreeChangeListener<OdlBmpMonitors>, AutoCloseable {
+public class BmpDeployerImpl implements ClusteredDataTreeChangeListener<OdlBmpMonitors>, AutoCloseable {
private static final Logger LOG = LoggerFactory.getLogger(BmpDeployerImpl.class);
+ private static final long TIMEOUT_NS = TimeUnit.SECONDS.toNanos(5);
private static final InstanceIdentifier<OdlBmpMonitors> ODL_BMP_MONITORS_IID =
- InstanceIdentifier.create(OdlBmpMonitors.class);
+ InstanceIdentifier.create(OdlBmpMonitors.class);
private static final YangInstanceIdentifier BMP_MONITOR_YII =
- YangInstanceIdentifier.of(BmpMonitor.QNAME);
+ YangInstanceIdentifier.of(BmpMonitor.QNAME);
private final static ContainerNode EMPTY_PARENT_NODE = Builders.containerBuilder().withNodeIdentifier(
- new NodeIdentifier(BmpMonitor.QNAME)).addChild(ImmutableNodes.mapNodeBuilder(Monitor.QNAME).build()).build();
+ new NodeIdentifier(BmpMonitor.QNAME)).addChild(ImmutableNodes.mapNodeBuilder(Monitor.QNAME).build()).build();
private final BmpDispatcher dispatcher;
@GuardedBy("this")
private final Map<MonitorId, BmpMonitoringStationImpl> bmpMonitorServices = new HashMap<>();
this.bmpDeployerDependencies = requireNonNull(bmpDeployerDependencies);
}
- public synchronized void register() {
+ public synchronized void init() {
final DOMDataWriteTransaction wTx = this.bmpDeployerDependencies.getDomDataBroker().newWriteOnlyTransaction();
wTx.merge(LogicalDatastoreType.OPERATIONAL, BMP_MONITOR_YII, EMPTY_PARENT_NODE);
wTx.submit();
public synchronized void onDataTreeChanged(final Collection<DataTreeModification<OdlBmpMonitors>> changes) {
final DataTreeModification<OdlBmpMonitors> dataTreeModification = Iterables.getOnlyElement(changes);
final Collection<DataObjectModification<? extends DataObject>> rootNode = dataTreeModification.getRootNode()
- .getModifiedChildren();
+ .getModifiedChildren();
if (rootNode.isEmpty()) {
return;
}
rootNode.forEach(dto -> handleModification((DataObjectModification<BmpMonitorConfig>) dto));
}
- private void handleModification(final DataObjectModification<BmpMonitorConfig> config) {
+ private synchronized void handleModification(final DataObjectModification<BmpMonitorConfig> config) {
final ModificationType modificationType = config.getModificationType();
LOG.trace("Bmp Monitor configuration has changed: {}, type modification {}", config, modificationType);
switch (modificationType) {
}
}
- private void updateBmpMonitor(final BmpMonitorConfig bmpConfig) {
+ private synchronized void updateBmpMonitor(final BmpMonitorConfig bmpConfig) {
final MonitorId monitorId = bmpConfig.getMonitorId();
final BmpMonitoringStationImpl oldService = this.bmpMonitorServices.remove(monitorId);
try {
if (oldService != null) {
- oldService.closeServiceInstance().get();
+ oldService.closeServiceInstance().get(TIMEOUT_NS, TimeUnit.NANOSECONDS);
oldService.close();
}
final InetSocketAddress inetAddress =
Ipv4Util.toInetSocketAddress(server.getBindingAddress(), server.getBindingPort());
final BmpMonitoringStationImpl monitor = new BmpMonitoringStationImpl(this.bmpDeployerDependencies,
- this.dispatcher, monitorId, inetAddress, bmpConfig.getMonitoredRouter());
+ this.dispatcher, monitorId, inetAddress, bmpConfig.getMonitoredRouter());
this.bmpMonitorServices.put(monitorId, monitor);
} catch (final Exception e) {
LOG.error("Failed to create Bmp Monitor {}.", monitorId, e);
}
- private void removeBmpMonitor(final MonitorId monitorId) {
+ private synchronized void removeBmpMonitor(final MonitorId monitorId) {
final BmpMonitoringStation service = this.bmpMonitorServices.remove(monitorId);
if (service != null) {
LOG.debug("Closing Bmp Monitor {}.", monitorId);
}
@Override
- public synchronized void writeBmpMonitor(final BmpMonitorConfig bmpConfig) throws TransactionCommitFailedException {
- final KeyedInstanceIdentifier<BmpMonitorConfig, BmpMonitorConfigKey> iid = ODL_BMP_MONITORS_IID
- .child(BmpMonitorConfig.class, bmpConfig.getKey());
-
- final WriteTransaction wTx = this.bmpDeployerDependencies.getDataBroker().newWriteOnlyTransaction();
- wTx.put(LogicalDatastoreType.CONFIGURATION, iid, bmpConfig, true);
- wTx.submit().checkedGet();
- }
-
- @Override
- public synchronized void deleteBmpMonitor(final MonitorId monitorId)
- throws TransactionCommitFailedException {
- final KeyedInstanceIdentifier<BmpMonitorConfig, BmpMonitorConfigKey> iid = ODL_BMP_MONITORS_IID
- .child(BmpMonitorConfig.class, new BmpMonitorConfigKey(monitorId));
-
- final WriteTransaction wTx = this.bmpDeployerDependencies.getDataBroker().newWriteOnlyTransaction();
- wTx.delete(LogicalDatastoreType.CONFIGURATION, iid);
- wTx.submit().checkedGet();
- }
-
- @Override
- public synchronized void close() throws Exception {
+ public synchronized void close() {
if (this.registration != null) {
this.registration.close();
}
</bean>
<bean id="bmpDeployer" class="org.opendaylight.protocol.bmp.impl.config.BmpDeployerImpl"
- init-method="register" destroy-method="close">
+ init-method="init" destroy-method="close">
<argument ref="bmpDispatcher"/>
<argument ref="bmpDeployerDependecies"/>
</bean>
-
- <service ref="bmpDeployer" interface="org.opendaylight.protocol.bmp.impl.api.BmpDeployer"/>
- <reference id="bgpConfigLoader" interface="org.opendaylight.protocol.bgp.config.loader.spi.ConfigLoader"/>
-
- <bean id="bmpConfigLoader" class="org.opendaylight.protocol.bmp.impl.BmpMonitorConfigFileProcessor"
- init-method="register" destroy-method="close">
- <argument ref="bgpConfigLoader"/>
- <argument ref="bmpDeployer"/>
- </bean>
</blueprint>
\ No newline at end of file
+++ /dev/null
-/*
- * Copyright (c) 2017 AT&T Intellectual Property. 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.bmp.impl;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.mockito.Matchers.any;
-import static org.mockito.Mockito.doNothing;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.verify;
-
-import com.google.common.collect.Lists;
-import java.util.List;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.Mock;
-import org.opendaylight.mdsal.binding.generator.impl.ModuleInfoBackedContext;
-import org.opendaylight.protocol.bgp.config.loader.impl.AbstractConfigLoader;
-import org.opendaylight.protocol.bmp.impl.api.BmpDeployer;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.monitor.config.rev170517.OdlBmpMonitors;
-import org.opendaylight.yangtools.yang.binding.util.BindingReflections;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
-
-public class BmpMonitorConfigFileProcessorTest extends AbstractConfigLoader {
- @Mock
- private BmpDeployer bmpDeployer;
-
- @Override
- @Before
- public void setUp() throws Exception {
- super.setUp();
- }
-
- @Override
- protected void registerModules(final ModuleInfoBackedContext moduleInfoBackedContext) throws Exception {
- moduleInfoBackedContext.registerModuleInfo(BindingReflections.getModuleInfo(OdlBmpMonitors.class));
-
- }
-
- @Override
- protected List<String> getYangModelsPaths() {
- final List<String> paths = Lists.newArrayList(
- "/META-INF/yang/odl-bmp-monitor-config.yang",
- "/META-INF/yang/ietf-inet-types@2013-07-15.yang",
- "/META-INF/yang/ietf-yang-types@2013-07-15.yang",
- "/META-INF/yang/bgp-rib.yang",
- "/META-INF/yang/bgp-multiprotocol.yang",
- "/META-INF/yang/bgp-types.yang",
- "/META-INF/yang/network-concepts.yang",
- "/META-INF/yang/ieee754.yang",
- "/META-INF/yang/bgp-message.yang",
- "/META-INF/yang/yang-ext.yang",
- "/META-INF/yang/bmp-monitor.yang",
- "/META-INF/yang/bmp-message.yang",
- "/META-INF/yang/rfc2385.yang"
- );
- return paths;
- }
-
- @Test
- public void configFileTest() throws Exception {
- assertNotNull(ClassLoader.getSystemClassLoader().getResource("initial/odl-bmp-monitors-config.xml"));
- verify(this.bmpDeployer, never()).writeBmpMonitor(any());
- doNothing().when(this.bmpDeployer).writeBmpMonitor(any());
- final BmpMonitorConfigFileProcessor processor =
- new BmpMonitorConfigFileProcessor(this.configLoader, this.bmpDeployer);
- processor.register();
- assertEquals(SchemaPath.create(true, OdlBmpMonitors.QNAME), processor.getSchemaPath());
-
- verify(this.bmpDeployer).writeBmpMonitor(any());
- processor.close();
- }
-}
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (c) 2017 AT&T Intellectual Property. 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>
+ <parent>
+ <groupId>org.opendaylight.bgpcep</groupId>
+ <artifactId>config-parent</artifactId>
+ <version>0.9.0-SNAPSHOT</version>
+ <relativePath>../../config-parent</relativePath>
+ </parent>
+
+ <artifactId>bmp-monitors-config-loader</artifactId>
+ <description>BGPCEP BMP Monitors configuration Loader</description>
+ <packaging>bundle</packaging>
+ <name>${project.artifactId}</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>config-loader-spi</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>bgp-bmp-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>config-loader-impl</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>config-loader-impl</artifactId>
+ <type>test-jar</type>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.mdsal</groupId>
+ <artifactId>mdsal-binding-dom-adapter</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal-binding-broker-impl</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal-binding-broker-impl</artifactId>
+ <type>test-jar</type>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>testtool-util</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <!-- junit/mockito default -->
+ <dependency>
+ <groupId>org.mockito</groupId>
+ <artifactId>mockito-core</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-checkstyle-plugin</artifactId>
+ <configuration>
+ <propertyExpansion>checkstyle.violationSeverity=error</propertyExpansion>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>findbugs-maven-plugin</artifactId>
+ <configuration>
+ <failOnError>true</failOnError>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+
+ <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>
+
+ <url>${odl.site.url}/${project.groupId}/${stream}/${project.artifactId}/</url>
+ <distributionManagement>
+ <site>
+ <id>opendaylight-site</id>
+ <url>${nexus.site.url}/${project.artifactId}/</url>
+ </site>
+ </distributionManagement>
+</project>
\ No newline at end of file
/*
- * Copyright (c) 2017 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017 AT&T Intellectual Property. 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.bmp.impl;
+package org.opendaylight.bgpcep.config.loader.bmp;
import static java.util.Objects.requireNonNull;
+import com.google.common.annotations.VisibleForTesting;
import java.util.Collection;
-import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.ExecutionException;
import javax.annotation.concurrent.GuardedBy;
-import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
+import org.opendaylight.bgpcep.config.loader.spi.ConfigFileProcessor;
+import org.opendaylight.bgpcep.config.loader.spi.ConfigLoader;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer;
-import org.opendaylight.protocol.bgp.config.loader.spi.ConfigFileProcessor;
-import org.opendaylight.protocol.bgp.config.loader.spi.ConfigLoader;
-import org.opendaylight.protocol.bmp.impl.api.BmpDeployer;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.monitor.config.rev170517.OdlBmpMonitors;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.monitor.config.rev170517.odl.bmp.monitors.BmpMonitorConfig;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.monitor.config.rev170517.odl.bmp.monitors.BmpMonitorConfigKey;
import org.opendaylight.yangtools.concepts.AbstractRegistration;
-import org.opendaylight.yangtools.yang.binding.DataObject;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
public final class BmpMonitorConfigFileProcessor implements ConfigFileProcessor, AutoCloseable {
+ @VisibleForTesting
+ static final InstanceIdentifier<OdlBmpMonitors> ODL_BMP_MONITORS_IID =
+ InstanceIdentifier.create(OdlBmpMonitors.class);
private static final Logger LOG = LoggerFactory.getLogger(BmpMonitorConfigFileProcessor.class);
-
private final SchemaPath bmpMonitorsSchemaPath = SchemaPath.create(true, OdlBmpMonitors.QNAME);
- private final BmpDeployer deployer;
private final BindingNormalizedNodeSerializer bindingSerializer;
private final YangInstanceIdentifier bmpMonitorsYii;
private final ConfigLoader configLoader;
+ private final DataBroker dataBroker;
@GuardedBy("this")
private AbstractRegistration registration;
- public BmpMonitorConfigFileProcessor(final ConfigLoader configLoader, final BmpDeployer deployer) {
+ public BmpMonitorConfigFileProcessor(final ConfigLoader configLoader, final DataBroker dataBroker) {
requireNonNull(configLoader);
- this.deployer = requireNonNull(deployer);
this.configLoader = requireNonNull(configLoader);
+ this.dataBroker = requireNonNull(dataBroker);
this.bindingSerializer = configLoader.getBindingNormalizedNodeSerializer();
this.bmpMonitorsYii = this.bindingSerializer.toYangInstanceIdentifier(
InstanceIdentifier.create(OdlBmpMonitors.class).child(BmpMonitorConfig.class));
}
- public synchronized void register() {
+ private static void processBmpMonitorConfig(final BmpMonitorConfig bmpConfig, final WriteTransaction wtx) {
+ final KeyedInstanceIdentifier<BmpMonitorConfig, BmpMonitorConfigKey> iid = ODL_BMP_MONITORS_IID
+ .child(BmpMonitorConfig.class, bmpConfig.getKey());
+
+ wtx.merge(LogicalDatastoreType.CONFIGURATION, iid, bmpConfig, true);
+ }
+
+ public synchronized void init() {
this.registration = this.configLoader.registerConfigFile(this);
+ LOG.info("BMP Config Loader service initiated");
}
@Override
public synchronized void close() {
- if(this.registration != null) {
+ if (this.registration != null) {
this.registration.close();
this.registration = null;
}
}
@Override
- public void loadConfiguration(final NormalizedNode<?, ?> dto) {
+ public synchronized void loadConfiguration(final NormalizedNode<?, ?> dto) {
final ContainerNode bmpMonitorsConfigsContainer = (ContainerNode) dto;
final MapNode monitorsList = (MapNode) bmpMonitorsConfigsContainer.getChild(
this.bmpMonitorsYii.getLastPathArgument()).orNull();
return;
}
final Collection<MapEntryNode> bmpMonitorConfig = monitorsList.getValue();
- for (final MapEntryNode topology : bmpMonitorConfig) {
- final Map.Entry<InstanceIdentifier<?>, DataObject> bi = this.bindingSerializer
- .fromNormalizedNode(this.bmpMonitorsYii, topology);
- if (bi != null) {
- final BmpMonitorConfig config = (BmpMonitorConfig) bi.getValue();
- try {
- this.deployer.writeBmpMonitor(config);
- } catch (final TransactionCommitFailedException e) {
- LOG.error("Failed to create BMP Monitor {}.", config, e);
- }
- }
+ final WriteTransaction wtx = this.dataBroker.newWriteOnlyTransaction();
+
+ bmpMonitorConfig.stream().map(topology -> this.bindingSerializer
+ .fromNormalizedNode(this.bmpMonitorsYii, topology))
+ .filter(Objects::nonNull)
+ .forEach(bi -> processBmpMonitorConfig((BmpMonitorConfig) bi.getValue(), wtx));
+
+ try {
+ wtx.submit().get();
+ } catch (final ExecutionException | InterruptedException e) {
+ LOG.warn("Failed to create Bmp config", e);
}
}
}
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (c) 2017 AT&T Intellectual Property. 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
+ -->
+
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+ xmlns:odl="http://opendaylight.org/xmlns/blueprint/v1.0.0">
+ <reference id="dataBroker" interface="org.opendaylight.controller.md.sal.binding.api.DataBroker"
+ odl:type="pingpong"/>
+ <reference id="configLoader" interface="org.opendaylight.bgpcep.config.loader.spi.ConfigLoader"/>
+
+ <bean id="bmpConfigFileProcessor"
+ class="org.opendaylight.bgpcep.config.loader.bmp.BmpMonitorConfigFileProcessor"
+ init-method="init"
+ destroy-method="close">
+ <argument ref="configLoader"/>
+ <argument ref="dataBroker"/>
+ </bean>
+</blueprint>
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright (c) 2017 AT&T Intellectual Property. 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.bgpcep.config.loader.bmp;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.opendaylight.bgpcep.config.loader.bmp.BmpMonitorConfigFileProcessor.ODL_BMP_MONITORS_IID;
+import static org.opendaylight.protocol.util.CheckUtil.checkNotPresentConfiguration;
+import static org.opendaylight.protocol.util.CheckUtil.checkPresentConfiguration;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.opendaylight.bgpcep.config.loader.impl.AbstractConfigLoader;
+import org.opendaylight.mdsal.binding.generator.impl.ModuleInfoBackedContext;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.monitor.config.rev170517.OdlBmpMonitors;
+import org.opendaylight.yangtools.yang.binding.util.BindingReflections;
+import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+
+public class BmpMonitorConfigFileProcessorTest extends AbstractConfigLoader {
+
+ @Override
+ @Before
+ public void setUp() throws Exception {
+ super.setUp();
+ }
+
+ @Override
+ protected void registerModules(final ModuleInfoBackedContext moduleInfoBackedContext) throws Exception {
+ moduleInfoBackedContext.registerModuleInfo(BindingReflections.getModuleInfo(OdlBmpMonitors.class));
+
+ }
+
+ @Test
+ public void configFileTest() throws Exception {
+ checkNotPresentConfiguration(getDataBroker(), ODL_BMP_MONITORS_IID);
+
+ assertNotNull(ClassLoader.getSystemClassLoader().getResource("initial/odl-bmp-monitors-config.xml"));
+ final BmpMonitorConfigFileProcessor processor = new BmpMonitorConfigFileProcessor(this.configLoader,
+ getDataBroker());
+ processor.init();
+ checkPresentConfiguration(getDataBroker(), ODL_BMP_MONITORS_IID);
+
+ assertEquals(SchemaPath.create(true, OdlBmpMonitors.QNAME),
+ processor.getSchemaPath());
+ processor.close();
+ }
+}
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (c) 2017 AT&T Intellectual Property. 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
+ -->
+<!--
+To enable active TCP connection, configure monitored-router with address, port and active flag.
+
+For TCP-MD5 note that if this option is configured, the monitored router(s) connecting here must
+have the same password configured, otherwise they will not be able to connect at all.
+-->
+<odl-bmp-monitors xmlns="urn:opendaylight:params:xml:ns:yang:bmp-monitor-config">
+ <bmp-monitor-config>
+ <monitor-id>example-bmp-monitor</monitor-id>
+ <server>
+ <binding-port>12345</binding-port>
+ <binding-address>0.0.0.0</binding-address>
+ </server>
+ </bmp-monitor-config>
+</odl-bmp-monitors>
\ No newline at end of file
<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
- <artifactId>odl-bgpcep-config-loader</artifactId>
+ <artifactId>odl-bgpcep-config-loader-impl</artifactId>
+ <classifier>features</classifier>
+ <type>xml</type>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>odl-bgpcep-config-loader-spi</artifactId>
+ <classifier>features</classifier>
+ <type>xml</type>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>odl-bgpcep-topology-config-loader</artifactId>
+ <classifier>features</classifier>
+ <type>xml</type>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>odl-bgpcep-protocols-config-loader</artifactId>
+ <classifier>features</classifier>
+ <type>xml</type>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>odl-bgpcep-bmp-config-loader</artifactId>
<classifier>features</classifier>
<type>xml</type>
<version>${project.version}</version>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>features-config-loader</artifactId>
+ <classifier>features</classifier>
+ <type>xml</type>
<version>${project.version}</version>
</dependency>
<dependency>
<artifactId>config-loader-impl</artifactId>
<version>${project.version}</version>
</dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>protocols-config-loader</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>topology-config-loader</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>bmp-monitors-config-loader</artifactId>
+ <version>${project.version}</version>
+ </dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>config-loader-impl</artifactId>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
+ <scope>test</scope>
</dependency>
<dependency>
<groupId>org.opendaylight.yangtools</groupId>
<artifactId>mockito-configuration</artifactId>
+ <scope>test</scope>
</dependency>
<dependency>
<groupId>org.opendaylight.mdsal</groupId>
<dependency>
<groupId>org.opendaylight.yangtools</groupId>
<artifactId>yang-test-util</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal-binding-broker-impl</artifactId>
+ <scope>test</scope>
+ <type>test-jar</type>
</dependency>
</dependencies>
<propertyExpansion>checkstyle.violationSeverity=error</propertyExpansion>
</configuration>
</plugin>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>findbugs-maven-plugin</artifactId>
+ <configuration>
+ <failOnError>true</failOnError>
+ </configuration>
+ </plugin>
</plugins>
</build>
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
-package org.opendaylight.protocol.bgp.config.loader.impl;
+package org.opendaylight.bgpcep.config.loader.impl;
import static java.util.Objects.requireNonNull;
import java.io.IOException;
import java.io.InputStream;
import java.net.URISyntaxException;
+import java.nio.file.ClosedWatchServiceException;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
+import org.opendaylight.bgpcep.config.loader.spi.ConfigFileProcessor;
+import org.opendaylight.bgpcep.config.loader.spi.ConfigLoader;
import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer;
-import org.opendaylight.protocol.bgp.config.loader.spi.ConfigFileProcessor;
-import org.opendaylight.protocol.bgp.config.loader.spi.ConfigLoader;
import org.opendaylight.yangtools.concepts.AbstractRegistration;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
private boolean closed = false;
public ConfigLoaderImpl(final SchemaContext schemaContext, final BindingNormalizedNodeSerializer bindingSerializer,
- final String path, final WatchService watchService) {
+ final FileWatcher fileWatcher) {
this.schemaContext = requireNonNull(schemaContext);
this.bindingSerializer = requireNonNull(bindingSerializer);
- this.path = requireNonNull(path);
- requireNonNull(watchService);
- this.watcherThread = new Thread(new ConfigLoaderImplRunnable(watchService));
+ this.path = requireNonNull(fileWatcher.getPathFile());
+ this.watcherThread = new Thread(new ConfigLoaderImplRunnable(requireNonNull(fileWatcher.getWatchService())));
+ }
+
+ public void init() {
this.watcherThread.start();
LOG.info("Config Loader service initiated");
}
final NormalizedNodeResult result = new NormalizedNodeResult();
final NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
- final InputStream resourceAsStream = new FileInputStream(new File(this.path, filename));
- final XMLInputFactory factory = XMLInputFactory.newInstance();
- final XMLStreamReader reader = factory.createXMLStreamReader(resourceAsStream);
-
- final SchemaNode schemaNode = SchemaContextUtil.findDataSchemaNode(this.schemaContext, config.getSchemaPath());
- final XmlParserStream xmlParser = XmlParserStream.create(streamWriter, this.schemaContext, schemaNode);
- xmlParser.parse(reader);
+ try (InputStream resourceAsStream = new FileInputStream(new File(this.path, filename))) {
+ final XMLInputFactory factory = XMLInputFactory.newInstance();
+ final XMLStreamReader reader = factory.createXMLStreamReader(resourceAsStream);
+
+ final SchemaNode schemaNode = SchemaContextUtil
+ .findDataSchemaNode(this.schemaContext, config.getSchemaPath());
+ final XmlParserStream xmlParser = XmlParserStream.create(streamWriter, this.schemaContext, schemaNode);
+ xmlParser.parse(reader);
+ resourceAsStream.close();
+ reader.close();
+ xmlParser.close();
+ }
return result.getResult();
}
final WatchKey key;
try {
key = watchService.take();
- } catch (final InterruptedException e) {
+ } catch (final InterruptedException | ClosedWatchServiceException e) {
if (!ConfigLoaderImpl.this.closed) {
LOG.warn(INTERRUPTED, e);
Thread.currentThread().interrupt();
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
-package org.opendaylight.protocol.bgp.config.loader.impl;
+package org.opendaylight.bgpcep.config.loader.impl;
import java.nio.file.WatchService;
import javax.annotation.Nonnull;
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
-package org.opendaylight.protocol.bgp.config.loader.impl;
+package org.opendaylight.bgpcep.config.loader.impl;
import static java.nio.file.StandardWatchEventKinds.ENTRY_CREATE;
import static java.nio.file.StandardWatchEventKinds.OVERFLOW;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-public final class BGPFileWatcher implements FileWatcher, AutoCloseable {
- private static final Logger LOG = LoggerFactory.getLogger(BGPFileWatcher.class);
+public final class FileWatcherImpl implements FileWatcher, AutoCloseable {
+ private static final Logger LOG = LoggerFactory.getLogger(FileWatcherImpl.class);
private static final String INTERRUPTED = "InterruptedException";
private static final String BGPCEP_CONFIG_FOLDER = "bgpcep";
private static final String DEFAULT_APP_CONFIG_FILE_PATH = "etc" + File.separator + "opendaylight"
private static final Path PATH = Paths.get(DEFAULT_APP_CONFIG_FILE_PATH);
private final WatchService watchService;
- public BGPFileWatcher() throws IOException {
+ public FileWatcherImpl() throws IOException {
+ this.watchService = FileSystems.getDefault().newWatchService();
final File file = new File(DEFAULT_APP_CONFIG_FILE_PATH);
if (!file.exists()) {
- file.mkdirs();
+ if (file.mkdirs()) {
+ return;
+ }
}
- this.watchService = FileSystems.getDefault().newWatchService();
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
try {
- BGPFileWatcher.this.watchService.close();
+ FileWatcherImpl.this.watchService.close();
} catch (final IOException e) {
LOG.warn(INTERRUPTED, e);
}
}));
PATH.register(this.watchService, OVERFLOW, ENTRY_CREATE);
+ LOG.info("File Watcher service initiated");
}
@Override
}
@Override
- public WatchService getWatchService() {
+ public synchronized WatchService getWatchService() {
return this.watchService;
}
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- ~ Copyright (c) 2016 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
- -->
-
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:odl="http://opendaylight.org/xmlns/blueprint/v1.0.0">
- <odl:static-reference id="domSchemaService" interface="org.opendaylight.mdsal.dom.api.DOMSchemaService"/>
- <odl:static-reference id="mappingCodec" interface="org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer"/>
-
- <bean id="bgpFileWatcher" class="org.opendaylight.protocol.bgp.config.loader.impl.BGPFileWatcher" destroy-method="close" />
-
- <bean id="bgpConfigLoader" class="org.opendaylight.protocol.bgp.config.loader.impl.ConfigLoaderImpl" destroy-method="close">
- <argument>
- <bean factory-ref="domSchemaService" factory-method="getGlobalContext"/>
- </argument>
- <argument ref="mappingCodec"/>
- <argument>
- <bean factory-ref="bgpFileWatcher" factory-method="getPathFile"/>
- </argument>
- <argument>
- <bean factory-ref="bgpFileWatcher" factory-method="getWatchService"/>
- </argument>
- </bean>
-
- <service ref="bgpConfigLoader" interface="org.opendaylight.protocol.bgp.config.loader.spi.ConfigLoader" odl:type="default"/>
-</blueprint>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+ xmlns:odl="http://opendaylight.org/xmlns/blueprint/v1.0.0">
+ <odl:static-reference id="domSchemaService" interface="org.opendaylight.mdsal.dom.api.DOMSchemaService"/>
+ <odl:static-reference id="mappingCodec"
+ interface="org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer"/>
+
+ <bean id="filewatcher" class="org.opendaylight.bgpcep.config.loader.impl.FileWatcherImpl"
+ destroy-method="close"/>
+
+ <bean id="configLoader" class="org.opendaylight.bgpcep.config.loader.impl.ConfigLoaderImpl"
+ init-method="init"
+ destroy-method="close">
+ <argument>
+ <bean factory-ref="domSchemaService" factory-method="getGlobalContext"/>
+ </argument>
+ <argument ref="mappingCodec"/>
+ <argument ref="filewatcher"/>
+ </bean>
+
+ <service ref="configLoader" interface="org.opendaylight.bgpcep.config.loader.spi.ConfigLoader"/>
+</blueprint>
\ No newline at end of file
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
-package org.opendaylight.protocol.bgp.config.loader.impl;
+package org.opendaylight.bgpcep.config.loader.impl;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doReturn;
-import java.io.InputStream;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.List;
import javassist.ClassPool;
import javax.annotation.concurrent.GuardedBy;
import org.junit.After;
-import org.junit.Assert;
import org.junit.Before;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+import org.opendaylight.bgpcep.config.loader.spi.ConfigFileProcessor;
+import org.opendaylight.controller.md.sal.binding.test.AbstractConcurrentDataBrokerTest;
import org.opendaylight.mdsal.binding.dom.adapter.BindingToNormalizedNodeCodec;
import org.opendaylight.mdsal.binding.dom.codec.gen.impl.StreamWriterGenerator;
import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry;
import org.opendaylight.mdsal.binding.generator.impl.GeneratedClassLoadingStrategy;
import org.opendaylight.mdsal.binding.generator.impl.ModuleInfoBackedContext;
import org.opendaylight.mdsal.binding.generator.util.JavassistUtils;
-import org.opendaylight.protocol.bgp.config.loader.spi.ConfigFileProcessor;
-import org.opendaylight.protocol.bgp.config.loader.spi.ConfigLoader;
import org.opendaylight.yangtools.yang.model.api.SchemaContext;
-import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
-public abstract class AbstractConfigLoader {
+public abstract class AbstractConfigLoader extends AbstractConcurrentDataBrokerTest {
@GuardedBy("this")
private final List<WatchEvent<?>> eventList = new ArrayList<>();
- protected BindingToNormalizedNodeCodec mappingService;
- protected ConfigLoader configLoader;
+ protected ConfigLoaderImpl configLoader;
@Mock
protected WatchService watchService;
@Mock
private WatchEvent<?> watchEvent;
@Mock
protected ConfigFileProcessor processor;
+ @Mock
+ private FileWatcher fileWatcher;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
- this.mappingService = new BindingToNormalizedNodeCodec(
+ final BindingToNormalizedNodeCodec mappingService = new BindingToNormalizedNodeCodec(
GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy(),
new BindingNormalizedNodeCodecRegistry(
StreamWriterGenerator.create(JavassistUtils.forClassPool(ClassPool.getDefault()))));
final ModuleInfoBackedContext moduleInfoBackedContext = ModuleInfoBackedContext.create();
registerModules(moduleInfoBackedContext);
- this.mappingService.onGlobalContextUpdated(moduleInfoBackedContext.tryToCreateSchemaContext().get());
+ mappingService.onGlobalContextUpdated(moduleInfoBackedContext.tryToCreateSchemaContext().get());
doAnswer(invocation -> true).when(this.watchKey).reset();
doReturn(this.eventList).when(this.watchKey).pollEvents();
doReturn(this.watchKey).when(this.watchService).take();
doReturn("watchKey").when(this.watchKey).toString();
doReturn("watchService").when(this.watchService).toString();
doReturn("watchEvent").when(this.watchEvent).toString();
+ doReturn(getResourceFolder()).when(this.fileWatcher).getPathFile();
+ doReturn(this.watchService).when(this.fileWatcher).getWatchService();
doAnswer(invocation -> {
clearEvent();
return null;
}).when(this.processor).loadConfiguration(any());
- final SchemaContext schemaContext = YangParserTestUtils.parseYangStreams(
- getFilesAsStreams(getYangModelsPaths()));
+ final SchemaContext schemaContext = getSchemaContext();
this.configLoader = new ConfigLoaderImpl(schemaContext,
- this.mappingService, getResourceFolder(), this.watchService);
+ mappingService, this.fileWatcher);
+ this.configLoader.init();
}
private synchronized void clearEvent() {
protected abstract void registerModules(ModuleInfoBackedContext moduleInfoBackedContext) throws Exception;
- protected abstract List<String> getYangModelsPaths();
-
- private static List<InputStream> getFilesAsStreams(final List<String> paths) {
- final List<InputStream> resources = new ArrayList<>();
- final List<String> failedToFind = new ArrayList<>();
- for (final String path : paths) {
- final InputStream is = ConfigLoaderImplTest.class.getResourceAsStream(path);
- if (is == null) {
- failedToFind.add(path);
- } else {
- resources.add(is);
- }
- }
- Assert.assertEquals("Some files were not found", Collections.emptyList(), failedToFind);
- return resources;
- }
-
protected synchronized void triggerEvent(final String filename) {
doReturn(filename).when(this.watchEvent).context();
this.eventList.add(this.watchEvent);
}
+
@After
public final void tearDown() throws Exception {
((ConfigLoaderImpl) this.configLoader).close();
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
-package org.opendaylight.protocol.bgp.config.loader.impl;
+package org.opendaylight.bgpcep.config.loader.impl;
import static org.junit.Assert.assertNotNull;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.timeout;
import static org.mockito.Mockito.verify;
-import com.google.common.collect.Lists;
-import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.opendaylight.mdsal.binding.generator.impl.ModuleInfoBackedContext;
moduleInfoBackedContext.registerModuleInfo(BindingReflections.getModuleInfo(NetworkInstances.class));
}
- @Override
- protected List<String> getYangModelsPaths() {
- final List<String> paths = Lists.newArrayList(
- "/META-INF/yang/ietf-interfaces.yang",
- "/META-INF/yang/openconfig-network-instance-types.yang",
- "/META-INF/yang/openconfig-interfaces.yang",
- "/META-INF/yang/openconfig-network-instance.yang",
- "/META-INF/yang/openconfig-routing-policy.yang",
- "/META-INF/yang/openconfig-policy-types.yang",
- "/META-INF/yang/openconfig-extensions.yang",
- "/META-INF/yang/openconfig-local-routing.yang",
- "/META-INF/yang/ietf-inet-types@2013-07-15.yang",
- "/META-INF/yang/ietf-yang-types@2013-07-15.yang"
- );
- return paths;
- }
-
@Test
public void configLoaderImplTest() throws Exception {
assertNotNull(ClassLoader.getSystemClassLoader().getResource("etc/opendaylight/bgpcep/protocols-config.xml"));
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
-package org.opendaylight.protocol.bgp.config.loader.impl;
+package org.opendaylight.bgpcep.config.loader.impl;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import java.io.File;
import org.junit.Test;
-public class BGPFileWatcherTest {
+public class FileWatcherTest {
private static final String PATH = "etc" + File.separator + "opendaylight" + File.separator
+ "bgpcep" + File.separator;
@Test
public void bgpFileWatcherTest() throws Exception {
- final BGPFileWatcher bgpFileWatcher = new BGPFileWatcher();
+ final FileWatcherImpl bgpFileWatcher = new FileWatcherImpl();
assertEquals(PATH, bgpFileWatcher.getPathFile());
assertNotNull(bgpFileWatcher.getWatchService());
bgpFileWatcher.close();
<dependencies>
<dependency>
<groupId>org.opendaylight.mdsal</groupId>
- <artifactId>mdsal-binding-dom-codec</artifactId>
+ <artifactId>mdsal-binding-generator-api</artifactId>
</dependency>
</dependencies>
<propertyExpansion>checkstyle.violationSeverity=error</propertyExpansion>
</configuration>
</plugin>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>findbugs-maven-plugin</artifactId>
+ <configuration>
+ <failOnError>true</failOnError>
+ </configuration>
+ </plugin>
</plugins>
</build>
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
-package org.opendaylight.protocol.bgp.config.loader.spi;
+package org.opendaylight.bgpcep.config.loader.spi;
import javax.annotation.Nonnull;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
-package org.opendaylight.protocol.bgp.config.loader.spi;
+package org.opendaylight.bgpcep.config.loader.spi;
import javax.annotation.Nonnull;
import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer;
<module>config-loader-artifacts</module>
<module>config-loader-spi</module>
<module>config-loader-impl</module>
+ <module>topology-config-loader</module>
+ <module>protocols-config-loader</module>
+ <module>bmp-monitors-config-loader</module>
</modules>
<!--
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (c) 2017 AT&T Intellectual Property. 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>
+ <parent>
+ <groupId>org.opendaylight.bgpcep</groupId>
+ <artifactId>config-parent</artifactId>
+ <version>0.9.0-SNAPSHOT</version>
+ <relativePath>../../config-parent</relativePath>
+ </parent>
+
+ <artifactId>protocols-config-loader</artifactId>
+ <description>BGPCEP Protocols configuration Loader</description>
+ <packaging>bundle</packaging>
+ <name>${project.artifactId}</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>config-loader-spi</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>bgp-openconfig-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>config-loader-impl</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>config-loader-impl</artifactId>
+ <type>test-jar</type>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.mdsal</groupId>
+ <artifactId>mdsal-binding-dom-adapter</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal-binding-broker-impl</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal-binding-broker-impl</artifactId>
+ <type>test-jar</type>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>testtool-util</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <!-- junit/mockito default -->
+ <dependency>
+ <groupId>org.mockito</groupId>
+ <artifactId>mockito-core</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-checkstyle-plugin</artifactId>
+ <configuration>
+ <propertyExpansion>checkstyle.violationSeverity=error</propertyExpansion>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>findbugs-maven-plugin</artifactId>
+ <configuration>
+ <failOnError>true</failOnError>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+
+ <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>
+
+ <url>${odl.site.url}/${project.groupId}/${stream}/${project.artifactId}/</url>
+ <distributionManagement>
+ <site>
+ <id>opendaylight-site</id>
+ <url>${nexus.site.url}/${project.artifactId}/</url>
+ </site>
+ </distributionManagement>
+</project>
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright (c) 2017 AT&T Intellectual Property. 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.bgpcep.config.loader.protocols;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.annotations.VisibleForTesting;
+import java.util.Collection;
+import java.util.Map;
+import java.util.concurrent.ExecutionException;
+import org.opendaylight.bgpcep.config.loader.spi.ConfigFileProcessor;
+import org.opendaylight.bgpcep.config.loader.spi.ConfigLoader;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.NetworkInstances;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.NetworkInstance;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.NetworkInstanceKey;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.Protocols;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.protocols.Protocol;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.protocols.ProtocolKey;
+import org.opendaylight.yangtools.concepts.AbstractRegistration;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
+import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
+import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
+import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
+import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public final class ProtocolsConfigFileProcessor implements ConfigFileProcessor, AutoCloseable {
+
+ @VisibleForTesting
+ static final InstanceIdentifier<Protocols> BGP_PROTOCOLS_IID =
+ InstanceIdentifier.create(NetworkInstances.class)
+ .child(NetworkInstance.class, new NetworkInstanceKey("global-bgp")).child(Protocols.class);
+ private static final Logger LOG = LoggerFactory.getLogger(ProtocolsConfigFileProcessor.class);
+ private static final SchemaPath PROTOCOLS_SCHEMA_PATH = SchemaPath
+ .create(true, NetworkInstances.QNAME, NetworkInstance.QNAME, Protocols.QNAME);
+ private final BindingNormalizedNodeSerializer bindingSerializer;
+ private final YangInstanceIdentifier protocolYIId;
+ private final DataBroker dataBroker;
+ private final ConfigLoader configLoader;
+ private AbstractRegistration registration;
+
+ public ProtocolsConfigFileProcessor(final ConfigLoader configLoader, final DataBroker dataBroker) {
+ requireNonNull(configLoader);
+ this.dataBroker = requireNonNull(dataBroker);
+ this.configLoader = requireNonNull(configLoader);
+ this.bindingSerializer = configLoader.getBindingNormalizedNodeSerializer();
+ this.protocolYIId = this.bindingSerializer
+ .toYangInstanceIdentifier(BGP_PROTOCOLS_IID.child(Protocol.class));
+ }
+
+ private static void processProtocol(final Protocol protocol, final WriteTransaction wtx) {
+ final KeyedInstanceIdentifier<Protocol, ProtocolKey> topologyIIdKeyed =
+ BGP_PROTOCOLS_IID.child(Protocol.class, protocol.getKey());
+ wtx.merge(LogicalDatastoreType.CONFIGURATION, topologyIIdKeyed, protocol, true);
+ }
+
+ public synchronized void init() {
+ this.registration = configLoader.registerConfigFile(this);
+ LOG.info("Protocols Loader service initiated");
+ }
+
+ @Override
+ public SchemaPath getSchemaPath() {
+ return PROTOCOLS_SCHEMA_PATH;
+ }
+
+ @Override
+ public synchronized void loadConfiguration(final NormalizedNode<?, ?> dto) {
+ final ContainerNode protocolsContainer = (ContainerNode) dto;
+ final MapNode protocolList = (MapNode) protocolsContainer.getChild(protocolYIId.getLastPathArgument()).get();
+ final Collection<MapEntryNode> protocolsCollection = protocolList.getValue();
+ final WriteTransaction wtx = this.dataBroker.newWriteOnlyTransaction();
+ for (final MapEntryNode protocolEntry : protocolsCollection) {
+ final Map.Entry<InstanceIdentifier<?>, DataObject> bi = this.bindingSerializer
+ .fromNormalizedNode(this.protocolYIId, protocolEntry);
+ if (bi != null) {
+ final Protocol protocol = (Protocol) bi.getValue();
+ processProtocol(protocol, wtx);
+ }
+ }
+ try {
+ wtx.submit().get();
+ } catch (final ExecutionException | InterruptedException e) {
+ LOG.warn("Failed to create Protocol", e);
+ }
+ }
+
+ @Override
+ public synchronized void close() {
+ if (this.registration != null) {
+ this.registration.close();
+ this.registration = null;
+ }
+ }
+}
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (c) 2017 AT&T Intellectual Property. 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
+ -->
+
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+ xmlns:odl="http://opendaylight.org/xmlns/blueprint/v1.0.0">
+ <reference id="configLoader" interface="org.opendaylight.bgpcep.config.loader.spi.ConfigLoader"/>
+ <reference id="dataBroker" interface="org.opendaylight.controller.md.sal.binding.api.DataBroker"
+ odl:type="pingpong"/>
+
+ <bean id="protocolsConfigLoader"
+ class="org.opendaylight.bgpcep.config.loader.protocols.ProtocolsConfigFileProcessor"
+ init-method="init"
+ destroy-method="close">
+ <argument ref="configLoader"/>
+ <argument ref="dataBroker"/>
+ </bean>
+</blueprint>
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright (c) 2017 AT&T Intellectual Property. 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.bgpcep.config.loader.protocols;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.opendaylight.bgpcep.config.loader.protocols.ProtocolsConfigFileProcessor.BGP_PROTOCOLS_IID;
+import static org.opendaylight.protocol.util.CheckUtil.checkNotPresentConfiguration;
+import static org.opendaylight.protocol.util.CheckUtil.checkPresentConfiguration;
+
+import org.junit.Test;
+import org.opendaylight.bgpcep.config.loader.impl.AbstractConfigLoader;
+import org.opendaylight.mdsal.binding.generator.impl.ModuleInfoBackedContext;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.NetworkInstances;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.NetworkInstance;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.Protocols;
+import org.opendaylight.yangtools.yang.binding.util.BindingReflections;
+import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+
+public class ProtocolsConfigFileProcessorTest extends AbstractConfigLoader {
+ @Override
+ protected void registerModules(final ModuleInfoBackedContext moduleInfoBackedContext) throws Exception {
+ moduleInfoBackedContext.registerModuleInfo(BindingReflections.getModuleInfo(NetworkInstance.class));
+ moduleInfoBackedContext.registerModuleInfo(BindingReflections.getModuleInfo(Protocols.class));
+ }
+
+ @Test
+ public void configFileTest() throws Exception {
+ checkNotPresentConfiguration(getDataBroker(), BGP_PROTOCOLS_IID);
+
+ assertNotNull(ClassLoader.getSystemClassLoader().getResource("initial/protocols-config.xml"));
+ final ProtocolsConfigFileProcessor processor = new ProtocolsConfigFileProcessor(this.configLoader,
+ getDataBroker());
+ processor.init();
+ checkPresentConfiguration(getDataBroker(), BGP_PROTOCOLS_IID);
+
+ assertEquals(SchemaPath.create(true, NetworkInstances.QNAME, NetworkInstance.QNAME, Protocols.QNAME),
+ processor.getSchemaPath());
+ processor.close();
+ }
+}
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?><!--
+ ~ Copyright (c) 2017 AT&T Intellectual Property. 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
+ -->
+<protocols xmlns="http://openconfig.net/yang/network-instance">
+ <protocol>
+ <name>example-bgp-rib</name>
+ <identifier xmlns:x="http://openconfig.net/yang/policy-types">x:BGP</identifier>
+ </protocol>
+</protocols>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (c) 2017 AT&T Intellectual Property. 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>
+ <parent>
+ <groupId>org.opendaylight.bgpcep</groupId>
+ <artifactId>config-parent</artifactId>
+ <version>0.9.0-SNAPSHOT</version>
+ <relativePath>../../config-parent</relativePath>
+ </parent>
+
+ <artifactId>topology-config-loader</artifactId>
+ <description>BGPCEP Topology Initial configuration Loader</description>
+ <packaging>bundle</packaging>
+ <name>${project.artifactId}</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>config-loader-spi</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.mdsal.model</groupId>
+ <artifactId>ietf-topology</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>config-loader-impl</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>config-loader-impl</artifactId>
+ <type>test-jar</type>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.mdsal</groupId>
+ <artifactId>mdsal-binding-dom-adapter</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal-binding-broker-impl</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal-binding-broker-impl</artifactId>
+ <type>test-jar</type>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>testtool-util</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <!-- junit/mockito default -->
+ <dependency>
+ <groupId>org.mockito</groupId>
+ <artifactId>mockito-core</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-checkstyle-plugin</artifactId>
+ <configuration>
+ <propertyExpansion>checkstyle.violationSeverity=error</propertyExpansion>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>findbugs-maven-plugin</artifactId>
+ <configuration>
+ <failOnError>true</failOnError>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+
+ <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>
+
+ <url>${odl.site.url}/${project.groupId}/${stream}/${project.artifactId}/</url>
+ <distributionManagement>
+ <site>
+ <id>opendaylight-site</id>
+ <url>${nexus.site.url}/${project.artifactId}/</url>
+ </site>
+ </distributionManagement>
+</project>
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright (c) 2017 AT&T Intellectual Property. 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.bgpcep.config.loader.topology;
+
+import static java.util.Objects.requireNonNull;
+
+import java.util.Collection;
+import java.util.Map;
+import java.util.concurrent.ExecutionException;
+import javax.annotation.Nonnull;
+import org.opendaylight.bgpcep.config.loader.spi.ConfigFileProcessor;
+import org.opendaylight.bgpcep.config.loader.spi.ConfigLoader;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
+import org.opendaylight.yangtools.concepts.AbstractRegistration;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
+import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
+import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
+import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
+import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public final class NetworkTopologyConfigFileProcessor implements ConfigFileProcessor, AutoCloseable {
+
+ private static final Logger LOG = LoggerFactory.getLogger(NetworkTopologyConfigFileProcessor.class);
+
+ private static final SchemaPath TOPOLOGY_SCHEMA_PATH = SchemaPath.create(true, NetworkTopology.QNAME);
+ private final BindingNormalizedNodeSerializer bindingSerializer;
+ private AbstractRegistration registration;
+ private final YangInstanceIdentifier topologyYii;
+ private static final InstanceIdentifier<Topology> TOPOLOGY_IID =
+ InstanceIdentifier.create(NetworkTopology.class).child(Topology.class);
+ private final DataBroker dataBroker;
+ private final ConfigLoader configLoader;
+
+ public NetworkTopologyConfigFileProcessor(final ConfigLoader configLoader, final DataBroker dataBroker) {
+ requireNonNull(configLoader);
+ this.dataBroker = requireNonNull(dataBroker);
+ this.configLoader = requireNonNull(configLoader);
+ this.bindingSerializer = configLoader.getBindingNormalizedNodeSerializer();
+ this.topologyYii = this.bindingSerializer.toYangInstanceIdentifier(TOPOLOGY_IID);
+ }
+
+ public synchronized void init() {
+ this.registration = this.configLoader.registerConfigFile(this);
+ LOG.info("Network Topology Loader service initiated");
+ }
+
+ @Override
+ public synchronized void close() {
+ if (this.registration != null) {
+ this.registration.close();
+ this.registration = null;
+ }
+ }
+
+ @Nonnull
+ @Override
+ public SchemaPath getSchemaPath() {
+ return TOPOLOGY_SCHEMA_PATH;
+ }
+
+ @Override
+ public synchronized void loadConfiguration(final NormalizedNode<?, ?> dto) {
+ final ContainerNode networkTopologyContainer = (ContainerNode) dto;
+ final MapNode topologyList = (MapNode) networkTopologyContainer.getChild(
+ this.topologyYii.getLastPathArgument()).get();
+ final Collection<MapEntryNode> networkTopology = topologyList.getValue();
+ if (networkTopology.isEmpty()) {
+ return;
+ }
+ final WriteTransaction wtx = this.dataBroker.newWriteOnlyTransaction();
+
+ for (final MapEntryNode topologyEntry : networkTopology) {
+ final Map.Entry<InstanceIdentifier<?>, DataObject> bi =
+ this.bindingSerializer.fromNormalizedNode(this.topologyYii, topologyEntry);
+ if (bi != null) {
+ processTopology((Topology) bi.getValue(), wtx);
+ }
+ }
+ try {
+ wtx.submit().get();
+ } catch (final ExecutionException | InterruptedException e) {
+ LOG.warn("Failed to create Network Topologies", e);
+ }
+ }
+
+ private static void processTopology(final Topology topology, final WriteTransaction wtx) {
+ LOG.info("Storing Topology {}", topology);
+ final KeyedInstanceIdentifier<Topology, TopologyKey> topologyIIdKeyed =
+ InstanceIdentifier.create(NetworkTopology.class).child(Topology.class, topology.getKey());
+ wtx.merge(LogicalDatastoreType.CONFIGURATION, topologyIIdKeyed, topology, true);
+ }
+}
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (c) 2017 AT&T Intellectual Property. 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
+ -->
+
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+ xmlns:odl="http://opendaylight.org/xmlns/blueprint/v1.0.0">
+ <reference id="dataBroker" interface="org.opendaylight.controller.md.sal.binding.api.DataBroker"
+ odl:type="pingpong"/>
+ <reference id="configLoader" interface="org.opendaylight.bgpcep.config.loader.spi.ConfigLoader"/>
+
+ <bean id="topologyConfigLoader"
+ class="org.opendaylight.bgpcep.config.loader.topology.NetworkTopologyConfigFileProcessor"
+ init-method="init"
+ destroy-method="close">
+ <argument ref="configLoader"/>
+ <argument ref="dataBroker"/>
+ </bean>
+</blueprint>
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright (c) 2017 AT&T Intellectual Property. 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.bgpcep.config.loader.topology;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.opendaylight.protocol.util.CheckUtil.checkNotPresentConfiguration;
+import static org.opendaylight.protocol.util.CheckUtil.checkPresentConfiguration;
+
+import org.junit.Test;
+import org.opendaylight.bgpcep.config.loader.impl.AbstractConfigLoader;
+import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
+import org.opendaylight.mdsal.binding.generator.impl.ModuleInfoBackedContext;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
+import org.opendaylight.yangtools.yang.binding.util.BindingReflections;
+import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+
+public class NetworkTopologyConfigFileProcessorTest extends AbstractConfigLoader {
+ @Override
+ protected void registerModules(final ModuleInfoBackedContext moduleInfoBackedContext) throws Exception {
+ moduleInfoBackedContext.registerModuleInfo(BindingReflections.getModuleInfo(NetworkTopology.class));
+ moduleInfoBackedContext.registerModuleInfo(BindingReflections.getModuleInfo(Topology.class));
+ }
+
+ @Test
+ public void configFileTest() throws ReadFailedException, InterruptedException {
+ final KeyedInstanceIdentifier<Topology, TopologyKey> topologyIIdKeyed =
+ InstanceIdentifier.create(NetworkTopology.class).child(Topology.class,
+ new TopologyKey(new TopologyId("topology-test")));
+ checkNotPresentConfiguration(getDataBroker(), topologyIIdKeyed);
+
+ assertNotNull(ClassLoader.getSystemClassLoader().getResource("initial/network-topology-config.xml"));
+ final NetworkTopologyConfigFileProcessor processor = new NetworkTopologyConfigFileProcessor(this.configLoader,
+ getDataBroker());
+ processor.init();
+ checkPresentConfiguration(getDataBroker(), topologyIIdKeyed);
+
+ assertEquals(SchemaPath.create(true, NetworkTopology.QNAME), processor.getSchemaPath());
+ processor.close();
+ }
+}
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?><!--
+ ~ Copyright (c) 2017 AT&T Intellectual Property. 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
+ -->
+<network-topology xmlns="urn:TBD:params:xml:ns:yang:network-topology">
+ <topology>
+ <topology-id>topology-test</topology-id>
+ </topology>
+</network-topology>
\ No newline at end of file
}
@Override
- public synchronized void close() throws Exception {
+ public synchronized void close() {
LOG.info("Closing Data change counter Deployer");
if (this.registration != null) {
<type>xml</type>
<scope>runtime</scope>
</dependency>
+ <dependency>
+ <groupId>org.opendaylight.bgpcep</groupId>
+ <artifactId>features-config-loader</artifactId>
+ <classifier>features</classifier>
+ <type>xml</type>
+ <scope>runtime</scope>
+ </dependency>
<dependency>
<groupId>org.opendaylight.netconf</groupId>
<artifactId>features-restconf</artifactId>
<type>xml</type>
<classifier>features</classifier>
</dependency>
- <dependency>
- <groupId>${project.groupId}</groupId>
- <artifactId>odl-bgpcep-config-loader</artifactId>
- <type>xml</type>
- <classifier>features</classifier>
- </dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>odl-bgpcep-bgp-openconfig-state</artifactId>
<groupId>${project.groupId}</groupId>
<artifactId>bgp-config-example</artifactId>
<type>xml</type>
- <classifier>network-topology-initial-config</classifier>
+ <classifier>network-topology-bgp-initial-config</classifier>
</dependency>
</dependencies>
xsi:schemaLocation="http://karaf.apache.org/xmlns/features/v1.2.0 http://karaf.apache.org/xmlns/features/v1.2.0">
<feature name="odl-bgpcep-bgp-config-example" version="${project.version}">
<configfile finalname="etc/opendaylight/bgpcep/protocols-config.xml">mvn:org.opendaylight.bgpcep/bgp-config-example/${project.version}/xml/bgp-initial-config</configfile>
- <configfile finalname="etc/opendaylight/bgpcep/network-topology-config.xml">mvn:org.opendaylight.bgpcep/bgp-config-example/${project.version}/xml/network-topology-initial-config</configfile>
+ <configfile finalname="etc/opendaylight/bgpcep/network-topology-bgp-config.xml">mvn:org.opendaylight.bgpcep/bgp-config-example/${project.version}/xml/network-topology-bgp-initial-config</configfile>
</feature>
</features>
\ No newline at end of file
<type>xml</type>
<classifier>features</classifier>
</dependency>
- <dependency>
- <groupId>${project.groupId}</groupId>
- <artifactId>odl-bgpcep-config-loader</artifactId>
- <type>xml</type>
- <classifier>features</classifier>
- </dependency>
<dependency>
<groupId>org.opendaylight.controller</groupId>
<artifactId>odl-mdsal-broker</artifactId>
<type>xml</type>
<classifier>features</classifier>
</dependency>
- <dependency>
- <groupId>${project.groupId}</groupId>
- <artifactId>odl-bgpcep-config-loader</artifactId>
- <type>xml</type>
- <classifier>features</classifier>
- </dependency>
<dependency>
<groupId>org.opendaylight.controller</groupId>
<artifactId>odl-mdsal-broker</artifactId>
<classifier>features</classifier>
<type>xml</type>
</dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>odl-bgpcep-protocols-config-loader</artifactId>
+ <type>xml</type>
+ <classifier>features</classifier>
+ </dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>odl-bgpcep-topology-config-loader</artifactId>
+ <type>xml</type>
+ <classifier>features</classifier>
+ </dependency>
</dependencies>
<!--
<type>xml</type>
<classifier>features</classifier>
</dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>odl-bgpcep-bmp-config-loader</artifactId>
+ <type>xml</type>
+ <classifier>features</classifier>
+ </dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>odl-bgpcep-bmp-config-example</artifactId>
<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
- <artifactId>odl-bgpcep-config-loader</artifactId>
+ <artifactId>odl-bgpcep-config-loader-impl</artifactId>
+ <type>xml</type>
+ <classifier>features</classifier>
+ </dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>odl-bgpcep-config-loader-spi</artifactId>
+ <type>xml</type>
+ <classifier>features</classifier>
+ </dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>odl-bgpcep-topology-config-loader</artifactId>
+ <type>xml</type>
+ <classifier>features</classifier>
+ </dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>odl-bgpcep-protocols-config-loader</artifactId>
+ <type>xml</type>
+ <classifier>features</classifier>
+ </dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>odl-bgpcep-bmp-config-loader</artifactId>
<type>xml</type>
<classifier>features</classifier>
</dependency>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (c) 2017 AT&T Intellectual Property. 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>
+ <parent>
+ <groupId>org.opendaylight.odlparent</groupId>
+ <artifactId>single-feature-parent</artifactId>
+ <version>2.0.5</version>
+ <relativePath/>
+ </parent>
+
+ <groupId>org.opendaylight.bgpcep</groupId>
+ <artifactId>odl-bgpcep-bmp-config-loader</artifactId>
+ <version>0.9.0-SNAPSHOT</version>
+ <packaging>feature</packaging>
+
+ <name>OpenDaylight :: BGPCEP :: BMP Config Loader</name>
+
+ <dependencyManagement>
+ <!-- ODL-BGP-ARTIFACTS -->
+ <dependencies>
+ <dependency>
+ <groupId>org.opendaylight.bgpcep</groupId>
+ <artifactId>bgpcep-artifacts</artifactId>
+ <version>${project.version}</version>
+ <type>pom</type>
+ <scope>import</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.bgpcep</groupId>
+ <artifactId>dependency-version-management</artifactId>
+ <version>${project.version}</version>
+ <type>pom</type>
+ <scope>import</scope>
+ </dependency>
+ </dependencies>
+ </dependencyManagement>
+
+ <dependencies>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>bmp-monitors-config-loader</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>odl-bgpcep-config-loader-impl</artifactId>
+ <classifier>features</classifier>
+ <type>xml</type>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>odl-mdsal-broker</artifactId>
+ <type>xml</type>
+ <classifier>features</classifier>
+ </dependency>
+ </dependencies>
+
+ <!--
+ Maven Site Configuration
+
+ The following configuration is necessary for maven-site-plugin to
+ correctly identify the correct deployment path for OpenDaylight Maven
+ sites.
+ -->
+ <url>${odl.site.url}/${project.groupId}/${stream}/${project.artifactId}/</url>
+
+ <distributionManagement>
+ <site>
+ <id>opendaylight-site</id>
+ <url>${nexus.site.url}/${project.artifactId}/</url>
+ </site>
+ </distributionManagement>
+</project>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (c) 2017 AT&T Intellectual Property.
+ ~ 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
+ -->
+<!-- vi: set et smarttab sw=4 tabstop=4: -->
+<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>
+ <parent>
+ <groupId>org.opendaylight.odlparent</groupId>
+ <artifactId>single-feature-parent</artifactId>
+ <version>2.0.5</version>
+ <relativePath/>
+ </parent>
+
+ <groupId>org.opendaylight.bgpcep</groupId>
+ <artifactId>odl-bgpcep-config-loader-impl</artifactId>
+ <version>0.9.0-SNAPSHOT</version>
+ <packaging>feature</packaging>
+
+ <name>OpenDaylight :: BGPCEP :: Config Loader Impl</name>
+
+ <dependencyManagement>
+ <!-- ODL-BGP-ARTIFACTS -->
+ <dependencies>
+ <dependency>
+ <groupId>org.opendaylight.bgpcep</groupId>
+ <artifactId>bgpcep-artifacts</artifactId>
+ <version>${project.version}</version>
+ <type>pom</type>
+ <scope>import</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.bgpcep</groupId>
+ <artifactId>dependency-version-management</artifactId>
+ <version>${project.version}</version>
+ <type>pom</type>
+ <scope>import</scope>
+ </dependency>
+ </dependencies>
+ </dependencyManagement>
+
+ <dependencies>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>config-loader-impl</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>odl-bgpcep-config-loader-spi</artifactId>
+ <classifier>features</classifier>
+ <type>xml</type>
+ </dependency>
+ </dependencies>
+
+ <!--
+ Maven Site Configuration
+
+ The following configuration is necessary for maven-site-plugin to
+ correctly identify the correct deployment path for OpenDaylight Maven
+ sites.
+ -->
+ <url>${odl.site.url}/${project.groupId}/${stream}/${project.artifactId}/</url>
+
+ <distributionManagement>
+ <site>
+ <id>opendaylight-site</id>
+ <url>${nexus.site.url}/${project.artifactId}/</url>
+ </site>
+ </distributionManagement>
+</project>
</parent>
<groupId>org.opendaylight.bgpcep</groupId>
- <artifactId>odl-bgpcep-config-loader</artifactId>
+ <artifactId>odl-bgpcep-config-loader-spi</artifactId>
<version>0.9.0-SNAPSHOT</version>
<packaging>feature</packaging>
- <name>OpenDaylight :: BGPCEP :: Config Loader</name>
+ <name>OpenDaylight :: BGPCEP :: SPI Config Loader</name>
<dependencyManagement>
<!-- ODL-BGP-ARTIFACTS -->
<groupId>${project.groupId}</groupId>
<artifactId>config-loader-spi</artifactId>
</dependency>
- <dependency>
- <groupId>${project.groupId}</groupId>
- <artifactId>config-loader-impl</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.mdsal</groupId>
- <artifactId>odl-mdsal-dom-api</artifactId>
- <type>xml</type>
- <classifier>features</classifier>
- </dependency>
<dependency>
<groupId>org.opendaylight.mdsal</groupId>
<artifactId>odl-mdsal-binding-runtime</artifactId>
<url>${nexus.site.url}/${project.artifactId}/</url>
</site>
</distributionManagement>
-</project>
+</project>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (c) 2017 AT&T Intellectual Property. 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>
+ <parent>
+ <groupId>org.opendaylight.odlparent</groupId>
+ <artifactId>single-feature-parent</artifactId>
+ <version>2.0.5</version>
+ <relativePath/>
+ </parent>
+
+ <groupId>org.opendaylight.bgpcep</groupId>
+ <artifactId>odl-bgpcep-protocols-config-loader</artifactId>
+ <version>0.9.0-SNAPSHOT</version>
+ <packaging>feature</packaging>
+
+ <name>OpenDaylight :: BGPCEP :: Protocols Config Loader</name>
+
+ <dependencyManagement>
+ <!-- ODL-BGP-ARTIFACTS -->
+ <dependencies>
+ <dependency>
+ <groupId>org.opendaylight.bgpcep</groupId>
+ <artifactId>bgpcep-artifacts</artifactId>
+ <version>${project.version}</version>
+ <type>pom</type>
+ <scope>import</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.bgpcep</groupId>
+ <artifactId>dependency-version-management</artifactId>
+ <version>${project.version}</version>
+ <type>pom</type>
+ <scope>import</scope>
+ </dependency>
+ </dependencies>
+ </dependencyManagement>
+
+ <dependencies>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>protocols-config-loader</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>odl-bgpcep-config-loader-impl</artifactId>
+ <classifier>features</classifier>
+ <type>xml</type>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>odl-mdsal-broker</artifactId>
+ <type>xml</type>
+ <classifier>features</classifier>
+ </dependency>
+ </dependencies>
+
+ <!--
+ Maven Site Configuration
+
+ The following configuration is necessary for maven-site-plugin to
+ correctly identify the correct deployment path for OpenDaylight Maven
+ sites.
+ -->
+ <url>${odl.site.url}/${project.groupId}/${stream}/${project.artifactId}/</url>
+
+ <distributionManagement>
+ <site>
+ <id>opendaylight-site</id>
+ <url>${nexus.site.url}/${project.artifactId}/</url>
+ </site>
+ </distributionManagement>
+</project>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (c) 2017 AT&T Intellectual Property. 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>
+ <parent>
+ <groupId>org.opendaylight.odlparent</groupId>
+ <artifactId>single-feature-parent</artifactId>
+ <version>2.0.5</version>
+ <relativePath/>
+ </parent>
+
+ <groupId>org.opendaylight.bgpcep</groupId>
+ <artifactId>odl-bgpcep-topology-config-loader</artifactId>
+ <version>0.9.0-SNAPSHOT</version>
+ <packaging>feature</packaging>
+
+ <name>OpenDaylight :: BGPCEP :: Topology Config Loader</name>
+
+ <dependencyManagement>
+ <!-- ODL-BGP-ARTIFACTS -->
+ <dependencies>
+ <dependency>
+ <groupId>org.opendaylight.bgpcep</groupId>
+ <artifactId>bgpcep-artifacts</artifactId>
+ <version>${project.version}</version>
+ <type>pom</type>
+ <scope>import</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.bgpcep</groupId>
+ <artifactId>dependency-version-management</artifactId>
+ <version>${project.version}</version>
+ <type>pom</type>
+ <scope>import</scope>
+ </dependency>
+ </dependencies>
+ </dependencyManagement>
+
+ <dependencies>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>topology-config-loader</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>odl-bgpcep-config-loader-impl</artifactId>
+ <classifier>features</classifier>
+ <type>xml</type>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>odl-mdsal-broker</artifactId>
+ <type>xml</type>
+ <classifier>features</classifier>
+ </dependency>
+ </dependencies>
+
+ <!--
+ Maven Site Configuration
+
+ The following configuration is necessary for maven-site-plugin to
+ correctly identify the correct deployment path for OpenDaylight Maven
+ sites.
+ -->
+ <url>${odl.site.url}/${project.groupId}/${stream}/${project.artifactId}/</url>
+
+ <distributionManagement>
+ <site>
+ <id>opendaylight-site</id>
+ <url>${nexus.site.url}/${project.artifactId}/</url>
+ </site>
+ </distributionManagement>
+</project>
\ No newline at end of file
<modules>
<module>features-config-loader</module>
- <module>odl-bgpcep-config-loader</module>
+ <module>odl-bgpcep-config-loader-spi</module>
+ <module>odl-bgpcep-config-loader-impl</module>
+ <module>odl-bgpcep-topology-config-loader</module>
+ <module>odl-bgpcep-protocols-config-loader</module>
+ <module>odl-bgpcep-bmp-config-loader</module>
</modules>
<!--
<type>xml</type>
<classifier>features</classifier>
</dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>odl-bgpcep-pcep-config-example</artifactId>
+ <type>xml</type>
+ <classifier>features</classifier>
+ </dependency>
</dependencies>
<!--
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (c) 2017 AT&T Intellectual Property. 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>
+ <parent>
+ <groupId>org.opendaylight.odlparent</groupId>
+ <artifactId>single-feature-parent</artifactId>
+ <version>2.0.5</version>
+ <relativePath/>
+ </parent>
+
+ <groupId>org.opendaylight.bgpcep</groupId>
+ <artifactId>odl-bgpcep-pcep-config-example</artifactId>
+ <version>0.9.0-SNAPSHOT</version>
+ <packaging>feature</packaging>
+
+ <name>OpenDaylight :: Pcep Configuration Example Files</name>
+
+ <dependencyManagement>
+ <!-- ODL-BGP-ARTIFACTS -->
+ <dependencies>
+ <dependency>
+ <groupId>org.opendaylight.bgpcep</groupId>
+ <artifactId>bgpcep-artifacts</artifactId>
+ <version>${project.version}</version>
+ <type>pom</type>
+ <scope>import</scope>
+ </dependency>
+ </dependencies>
+ </dependencyManagement>
+
+ <dependencies>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>pcep-config-example</artifactId>
+ <type>xml</type>
+ <classifier>network-topology-pcep-initial-config</classifier>
+ </dependency>
+ </dependencies>
+
+ <!--
+ Maven Site Configuration
+
+ The following configuration is necessary for maven-site-plugin to
+ correctly identify the correct deployment path for OpenDaylight Maven
+ sites.
+ -->
+ <url>${odl.site.url}/${project.groupId}/${stream}/${project.artifactId}/</url>
+
+ <distributionManagement>
+ <site>
+ <id>opendaylight-site</id>
+ <url>${nexus.site.url}/${project.artifactId}/</url>
+ </site>
+ </distributionManagement>
+</project>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (c) 2017 AT&T Intellectual Property. 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
+ -->
+<features name="odl-bgpcep-${project.version}" xmlns="http://karaf.apache.org/xmlns/features/v1.2.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://karaf.apache.org/xmlns/features/v1.2.0 http://karaf.apache.org/xmlns/features/v1.2.0">
+ <feature name="odl-bgpcep-pcep-config-example" version="${project.version}">
+ <configfile finalname="etc/opendaylight/bgpcep/network-topology-pcep-config.xml">mvn:org.opendaylight.bgpcep/pcep-config-example/${project.version}/xml/network-topology-pcep-initial-config</configfile>
+ </feature>
+</features>
\ No newline at end of file
<type>xml</type>
<classifier>features</classifier>
</dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>odl-bgpcep-topology-config-loader</artifactId>
+ <type>xml</type>
+ <classifier>features</classifier>
+ </dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>odl-bgpcep-pcep-config-example</artifactId>
+ <type>xml</type>
+ <classifier>features</classifier>
+ </dependency>
</dependencies>
<!--
Maven Site Configuration
<module>odl-bgpcep-pcep-segment-routing</module>
<module>odl-bgpcep-pcep-auto-bandwidth</module>
<module>odl-bgpcep-pcep-topology-stats</module>
+ <module>odl-bgpcep-pcep-config-example</module>
</modules>
<!--
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (c) 2017 AT&T Intellectual Property. 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>
+ <parent>
+ <groupId>org.opendaylight.odlparent</groupId>
+ <artifactId>odlparent</artifactId>
+ <version>2.0.5</version>
+ <relativePath/>
+ </parent>
+
+ <groupId>org.opendaylight.bgpcep</groupId>
+ <artifactId>pcep-config-example</artifactId>
+ <version>0.9.0-SNAPSHOT</version>
+ <packaging>jar</packaging>
+ <description>Configuration files example for PCEP protocol</description>
+ <name>${project.artifactId}</name>
+
+ <dependencyManagement>
+ <dependencies>
+ <dependency>
+ <groupId>org.opendaylight.bgpcep</groupId>
+ <artifactId>bgpcep-parent</artifactId>
+ <version>0.9.0-SNAPSHOT</version>
+ <type>pom</type>
+ <scope>import</scope>
+ </dependency>
+ </dependencies>
+ </dependencyManagement>
+
+ <build>
+ <plugins>
+ <plugin>
+ <artifactId>maven-remote-resources-plugin</artifactId>
+ <executions>
+ <execution>
+ <goals>
+ <goal>bundle</goal>
+ </goals>
+ </execution>
+ </executions>
+ <configuration>
+ <includes>
+ <include>**/network-topology-pcep-config.xml</include>
+ </includes>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>build-helper-maven-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>attach-artifacts</id>
+ <goals>
+ <goal>attach-artifact</goal>
+ </goals>
+ <phase>package</phase>
+ <configuration>
+ <artifacts>
+ <artifact>
+ <file>${project.build.directory}/classes/initial/network-topology-pcep-config.xml</file>
+ <type>xml</type>
+ <classifier>network-topology-pcep-initial-config</classifier>
+ </artifact>
+ </artifacts>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+
+ <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>
+
+ <url>${odl.site.url}/${project.groupId}/${stream}/${project.artifactId}/</url>
+ <distributionManagement>
+ <site>
+ <id>opendaylight-site</id>
+ <url>${nexus.site.url}/${project.artifactId}/</url>
+ </site>
+ </distributionManagement>
+</project>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (c) 2017 AT&T Intellectual Property.
+ ~ 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
+ -->
+<network-topology xmlns="urn:TBD:params:xml:ns:yang:network-topology">
+ <topology xmlns="urn:TBD:params:xml:ns:yang:network-topology">
+ <topology-id>pcep-topology</topology-id>
+ <topology-types>
+ <topology-pcep xmlns="urn:opendaylight:params:xml:ns:yang:topology:pcep"></topology-pcep>
+ </topology-types>
+ <session-config xmlns="urn:opendaylight:params:xml:ns:yang:topology:pcep:config">
+ <rpc-timeout>30</rpc-timeout>
+ <listen-address>0.0.0.0</listen-address>
+ <listen-port>4189</listen-port>
+ <dead-timer-value>120</dead-timer-value>
+ <keep-alive-timer-value>30</keep-alive-timer-value>
+ </session-config>
+ <node>
+ <node-id>43.43.43.43</node-id>
+ <session-config xmlns="urn:opendaylight:params:xml:ns:yang:topology:pcep:config">
+ <password>topsecret</password>
+ </session-config>
+ </node>
+ </topology>
+</network-topology>
\ No newline at end of file
<artifactId>pcep-topology-stats</artifactId>
<version>${project.version}</version>
</dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>pcep-config-example</artifactId>
+ <version>${project.version}</version>
+ <type>xml</type>
+ <classifier>network-topology-pcep-initial-config</classifier>
+ </dependency>
<!-- PCEP Features artifacts -->
<dependency>
<groupId>${project.groupId}</groupId>
<type>xml</type>
<version>${project.version}</version>
</dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>odl-bgpcep-pcep-config-example</artifactId>
+ <classifier>features</classifier>
+ <type>xml</type>
+ <version>${project.version}</version>
+ </dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>odl-bgpcep-pcep-topology-stats</artifactId>
<module>segment-routing</module>
<module>pcc-mock</module>
<module>auto-bandwidth-extension</module>
+ <module>config-example</module>
</modules>
<!--
return aug != null && aug.getTopologyPcep() != null;
}
- static void closeTopology(final PCEPTopologyProviderBean topology, final TopologyId topologyId) {
+ static void closeTopology(@Nullable final PCEPTopologyProviderBean topology, @Nonnull final TopologyId topologyId) {
if (topology != null) {
try {
topology.closeServiceInstance().get(TIMEOUT_NS, TimeUnit.NANOSECONDS);