BGPCEP-710: Create Network Topology Loader 12/65712/11
authorClaudio D. Gasparini <claudio.gasparini@pantheon.tech>
Wed, 15 Nov 2017 15:18:45 +0000 (16:18 +0100)
committerClaudio D. Gasparini <claudio.gasparini@pantheon.tech>
Thu, 30 Nov 2017 09:05:32 +0000 (10:05 +0100)
- Rework config loader
- Rename config-file examples
- Create config file example for pcep
- Dont use deployer for config loaders,
  use DS straight
- Remove no longer required Deployer interfaces

Change-Id: Id9beea9f321c01061fc65923b6a4838be30d7bb0
Signed-off-by: Claudio D. Gasparini <claudio.gasparini@pantheon.tech>
69 files changed:
bgp/bgp-artifacts/pom.xml
bgp/config-example/pom.xml
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/ProtocolsConfigFileProcessor.java [deleted file]
bgp/rib-impl/src/main/resources/org/opendaylight/blueprint/bgp-rib.xml
bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/ProtocolsConfigFileProcessorTest.java [deleted file]
bgp/topology-provider/pom.xml
bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/NetworkTopologyConfigFileProcessor.java [deleted file]
bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/config/BgpTopologyDeployerImpl.java
bgp/topology-provider/src/main/resources/org/opendaylight/blueprint/bgp-topology-provider.xml
bgp/topology-provider/src/test/java/org/opendaylight/bgpcep/bgp/topology/provider/NetworkTopologyConfigFileProcessorTest.java [deleted file]
bmp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/api/BmpDeployer.java [deleted file]
bmp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/config/BmpDeployerImpl.java
bmp/bmp-impl/src/main/resources/org/opendaylight/blueprint/bgp-bmp.xml
bmp/bmp-impl/src/test/java/org/opendaylight/protocol/bmp/impl/BmpMonitorConfigFileProcessorTest.java [deleted file]
config-loader/bmp-monitors-config-loader/pom.xml [new file with mode: 0644]
config-loader/bmp-monitors-config-loader/src/main/java/org/opendaylight/bgpcep/config/loader/bmp/BmpMonitorConfigFileProcessor.java [moved from bmp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/BmpMonitorConfigFileProcessor.java with 57% similarity]
config-loader/bmp-monitors-config-loader/src/main/resources/org/opendaylight/blueprint/bmp-config-loader.xml [new file with mode: 0644]
config-loader/bmp-monitors-config-loader/src/test/java/org/opendaylight/bgpcep/config/loader/bmp/BmpMonitorConfigFileProcessorTest.java [new file with mode: 0644]
config-loader/bmp-monitors-config-loader/src/test/resources/initial/odl-bmp-monitors-config.xml [new file with mode: 0644]
config-loader/config-loader-artifacts/pom.xml
config-loader/config-loader-impl/pom.xml
config-loader/config-loader-impl/src/main/java/org/opendaylight/bgpcep/config/loader/impl/ConfigLoaderImpl.java [moved from config-loader/config-loader-impl/src/main/java/org/opendaylight/protocol/bgp/config/loader/impl/ConfigLoaderImpl.java with 84% similarity]
config-loader/config-loader-impl/src/main/java/org/opendaylight/bgpcep/config/loader/impl/FileWatcher.java [moved from config-loader/config-loader-impl/src/main/java/org/opendaylight/protocol/bgp/config/loader/impl/FileWatcher.java with 91% similarity]
config-loader/config-loader-impl/src/main/java/org/opendaylight/bgpcep/config/loader/impl/FileWatcherImpl.java [moved from config-loader/config-loader-impl/src/main/java/org/opendaylight/protocol/bgp/config/loader/impl/BGPFileWatcher.java with 78% similarity]
config-loader/config-loader-impl/src/main/resources/org/opendaylight/blueprint/bgp-config-loader.xml [deleted file]
config-loader/config-loader-impl/src/main/resources/org/opendaylight/blueprint/config-loader-impl.xml [new file with mode: 0644]
config-loader/config-loader-impl/src/test/java/org/opendaylight/bgpcep/config/loader/impl/AbstractConfigLoader.java [moved from config-loader/config-loader-impl/src/test/java/org/opendaylight/protocol/bgp/config/loader/impl/AbstractConfigLoader.java with 68% similarity]
config-loader/config-loader-impl/src/test/java/org/opendaylight/bgpcep/config/loader/impl/ConfigLoaderImplTest.java [moved from config-loader/config-loader-impl/src/test/java/org/opendaylight/protocol/bgp/config/loader/impl/ConfigLoaderImplTest.java with 75% similarity]
config-loader/config-loader-impl/src/test/java/org/opendaylight/bgpcep/config/loader/impl/FileWatcherTest.java [moved from config-loader/config-loader-impl/src/test/java/org/opendaylight/protocol/bgp/config/loader/impl/BGPFileWatcherTest.java with 83% similarity]
config-loader/config-loader-spi/pom.xml
config-loader/config-loader-spi/src/main/java/org/opendaylight/bgpcep/config/loader/spi/ConfigFileProcessor.java [moved from config-loader/config-loader-spi/src/main/java/org/opendaylight/protocol/bgp/config/loader/spi/ConfigFileProcessor.java with 95% similarity]
config-loader/config-loader-spi/src/main/java/org/opendaylight/bgpcep/config/loader/spi/ConfigLoader.java [moved from config-loader/config-loader-spi/src/main/java/org/opendaylight/protocol/bgp/config/loader/spi/ConfigLoader.java with 94% similarity]
config-loader/pom.xml
config-loader/protocols-config-loader/pom.xml [new file with mode: 0644]
config-loader/protocols-config-loader/src/main/java/org/opendaylight/bgpcep/config/loader/protocols/ProtocolsConfigFileProcessor.java [new file with mode: 0644]
config-loader/protocols-config-loader/src/main/resources/org/opendaylight/blueprint/protocols-config-loader.xml [new file with mode: 0644]
config-loader/protocols-config-loader/src/test/java/org/opendaylight/bgpcep/config/loader/protocols/ProtocolsConfigFileProcessorTest.java [new file with mode: 0644]
config-loader/protocols-config-loader/src/test/resources/initial/protocols-config.xml [new file with mode: 0644]
config-loader/topology-config-loader/pom.xml [new file with mode: 0644]
config-loader/topology-config-loader/src/main/java/org/opendaylight/bgpcep/config/loader/topology/NetworkTopologyConfigFileProcessor.java [new file with mode: 0644]
config-loader/topology-config-loader/src/main/resources/org/opendaylight/blueprint/topology-config-loader.xml [new file with mode: 0644]
config-loader/topology-config-loader/src/test/java/org/opendaylight/bgpcep/config/loader/topology/NetworkTopologyConfigFileProcessorTest.java [new file with mode: 0644]
config-loader/topology-config-loader/src/test/resources/initial/network-topology-config.xml [new file with mode: 0644]
data-change-counter/src/main/java/org/opendaylight/protocol/data/change/counter/TopologyDataChangeCounterDeployer.java
distribution-karaf/pom.xml
features/bgp/features-bgp/pom.xml
features/bgp/odl-bgpcep-bgp-config-example/pom.xml
features/bgp/odl-bgpcep-bgp-config-example/src/main/feature/feature.xml
features/bgp/odl-bgpcep-bgp-rib-impl/pom.xml
features/bgp/odl-bgpcep-bgp-topology/pom.xml
features/bgp/odl-bgpcep-bgp/pom.xml
features/bmp/odl-bgpcep-bmp/pom.xml
features/config-loader/features-config-loader/pom.xml
features/config-loader/odl-bgpcep-bmp-config-loader/pom.xml [new file with mode: 0644]
features/config-loader/odl-bgpcep-config-loader-impl/pom.xml [new file with mode: 0644]
features/config-loader/odl-bgpcep-config-loader-spi/pom.xml [moved from features/config-loader/odl-bgpcep-config-loader/pom.xml with 84% similarity]
features/config-loader/odl-bgpcep-protocols-config-loader/pom.xml [new file with mode: 0644]
features/config-loader/odl-bgpcep-topology-config-loader/pom.xml [new file with mode: 0644]
features/config-loader/pom.xml
features/pcep/features-pcep/pom.xml
features/pcep/odl-bgpcep-pcep-config-example/pom.xml [new file with mode: 0644]
features/pcep/odl-bgpcep-pcep-config-example/src/main/feature/feature.xml [new file with mode: 0644]
features/pcep/odl-bgpcep-pcep/pom.xml
features/pcep/pom.xml
pcep/config-example/pom.xml [new file with mode: 0644]
pcep/config-example/src/main/resources/initial/network-topology-pcep-config.xml [new file with mode: 0644]
pcep/pcep-artifacts/pom.xml
pcep/pom.xml
pcep/topology/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/config/PCEPTopologyProviderUtil.java

index 56e5b3ec1ec459ddb605fe0d93d38ae421aaf75b..82e404e61fa32b85b127124b156c2893be64628a 100644 (file)
                 <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>
index ae62fbb4ba6b785f35da84588bb55e01958e583b..362039dd18b9ad7c0108a40ff638c6c232525f83 100644 (file)
@@ -77,7 +77,7 @@
                                 <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>
diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/ProtocolsConfigFileProcessor.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/ProtocolsConfigFileProcessor.java
deleted file mode 100644 (file)
index 2892eb7..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * 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();
-    }
-}
index fc679007b5fa8106427a166a44e5883fd34fcc0d..0badd498a244186b6328ad43341f3a94262e3e7c 100644 (file)
 
   <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"/>
 
diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/ProtocolsConfigFileProcessorTest.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/ProtocolsConfigFileProcessorTest.java
deleted file mode 100644 (file)
index c71af53..0000000
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * 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
index c8d4481a860c6af83f93a2f7c97aea8d687ea556..050af3899cbe590eff703450504b0d35dacaabfd 100644 (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>
diff --git a/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/NetworkTopologyConfigFileProcessor.java b/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/NetworkTopologyConfigFileProcessor.java
deleted file mode 100644 (file)
index 94469d7..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * 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());
-            }
-        }
-    }
-}
index 3cb9a233546cf1f08977b641462f4a3770b43d69..2ef5c7c34905988a7d192a37ebef1b31752c9e37 100644 (file)
@@ -159,7 +159,7 @@ public final class BgpTopologyDeployerImpl implements AutoCloseable, ClusteredDa
     }
 
     @Override
-    public synchronized void close() throws Exception {
+    public synchronized void close() {
         this.registration.close();
         LOG.info("BGP topology deployer stopped.");
         this.closed = true;
index a33123d6182bf662e981cd1a184be6a7fc7bd865..55ff1dc903ca55d3fbb410a55428bacd476021ec 100644 (file)
   <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
diff --git a/bgp/topology-provider/src/test/java/org/opendaylight/bgpcep/bgp/topology/provider/NetworkTopologyConfigFileProcessorTest.java b/bgp/topology-provider/src/test/java/org/opendaylight/bgpcep/bgp/topology/provider/NetworkTopologyConfigFileProcessorTest.java
deleted file mode 100644 (file)
index 8c8b030..0000000
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * 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
diff --git a/bmp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/api/BmpDeployer.java b/bmp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/api/BmpDeployer.java
deleted file mode 100644 (file)
index 2eea47c..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * 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;
-}
index 0e452698915779056c5919b4276b3eba6d5ad4e8..5744621d7d8a2b98e4e59ed9204d297f7b5d95c6 100644 (file)
@@ -14,24 +14,21 @@ import java.net.InetSocketAddress;
 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;
@@ -39,7 +36,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.moni
 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;
@@ -48,15 +44,16 @@ import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
 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<>();
@@ -69,7 +66,7 @@ public class BmpDeployerImpl implements BmpDeployer, ClusteredDataTreeChangeList
         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();
@@ -81,14 +78,14 @@ public class BmpDeployerImpl implements BmpDeployer, ClusteredDataTreeChangeList
     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) {
@@ -104,12 +101,12 @@ public class BmpDeployerImpl implements BmpDeployer, ClusteredDataTreeChangeList
         }
     }
 
-    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();
             }
 
@@ -117,7 +114,7 @@ public class BmpDeployerImpl implements BmpDeployer, ClusteredDataTreeChangeList
             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);
@@ -125,7 +122,7 @@ public class BmpDeployerImpl implements BmpDeployer, ClusteredDataTreeChangeList
 
     }
 
-    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);
@@ -138,28 +135,7 @@ public class BmpDeployerImpl implements BmpDeployer, ClusteredDataTreeChangeList
     }
 
     @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();
         }
index a0fd7c22444aad621912f42214a0aaee5ba0ac2c..cd45ccdaca45a5a715aaac491ec12a1d5e5abde1 100644 (file)
   </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
diff --git a/bmp/bmp-impl/src/test/java/org/opendaylight/protocol/bmp/impl/BmpMonitorConfigFileProcessorTest.java b/bmp/bmp-impl/src/test/java/org/opendaylight/protocol/bmp/impl/BmpMonitorConfigFileProcessorTest.java
deleted file mode 100644 (file)
index e69ef6d..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * 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
diff --git a/config-loader/bmp-monitors-config-loader/pom.xml b/config-loader/bmp-monitors-config-loader/pom.xml
new file mode 100644 (file)
index 0000000..6fd8240
--- /dev/null
@@ -0,0 +1,113 @@
+<?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
@@ -1,27 +1,31 @@
 /*
- * 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;
@@ -33,32 +37,42 @@ import org.slf4j.LoggerFactory;
 
 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;
         }
@@ -70,7 +84,7 @@ public final class BmpMonitorConfigFileProcessor implements ConfigFileProcessor,
     }
 
     @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();
@@ -78,17 +92,17 @@ public final class BmpMonitorConfigFileProcessor implements ConfigFileProcessor,
             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);
         }
     }
 }
diff --git a/config-loader/bmp-monitors-config-loader/src/main/resources/org/opendaylight/blueprint/bmp-config-loader.xml b/config-loader/bmp-monitors-config-loader/src/main/resources/org/opendaylight/blueprint/bmp-config-loader.xml
new file mode 100644 (file)
index 0000000..5484aae
--- /dev/null
@@ -0,0 +1,23 @@
+<?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
diff --git a/config-loader/bmp-monitors-config-loader/src/test/java/org/opendaylight/bgpcep/config/loader/bmp/BmpMonitorConfigFileProcessorTest.java b/config-loader/bmp-monitors-config-loader/src/test/java/org/opendaylight/bgpcep/config/loader/bmp/BmpMonitorConfigFileProcessorTest.java
new file mode 100644 (file)
index 0000000..9bc1c80
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * 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
diff --git a/config-loader/bmp-monitors-config-loader/src/test/resources/initial/odl-bmp-monitors-config.xml b/config-loader/bmp-monitors-config-loader/src/test/resources/initial/odl-bmp-monitors-config.xml
new file mode 100644 (file)
index 0000000..b07ad42
--- /dev/null
@@ -0,0 +1,23 @@
+<?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
index 3fb1d58229a0ce23fb05f52bd03de3cdf3851c2f..9e400fc0c1f29fde24cccef2424e738e20f2f1a2 100644 (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>
@@ -36,6 +64,8 @@
             <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>
index db0d09d3b0436aeda4f4db75b6d194f4dc1182ba..4b061d7d15eabf09705d869bcd03a0cc912ffd57 100644 (file)
         <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>
 
@@ -6,7 +6,7 @@
  * 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;
 
@@ -15,6 +15,7 @@ import java.io.FileInputStream;
 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;
@@ -26,9 +27,9 @@ import javax.xml.parsers.ParserConfigurationException;
 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;
@@ -57,12 +58,14 @@ public final class ConfigLoaderImpl implements ConfigLoader, AutoCloseable {
     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");
     }
@@ -85,13 +88,18 @@ public final class ConfigLoaderImpl implements ConfigLoader, AutoCloseable {
         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();
     }
@@ -154,7 +162,7 @@ public final class ConfigLoaderImpl implements ConfigLoader, AutoCloseable {
             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();
similarity index 91%
rename from config-loader/config-loader-impl/src/main/java/org/opendaylight/protocol/bgp/config/loader/impl/FileWatcher.java
rename to config-loader/config-loader-impl/src/main/java/org/opendaylight/bgpcep/config/loader/impl/FileWatcher.java
index ac52d663b1fc4c806edf1cc24383bf7b5175fce3..b53029d3bf8c83c31835ce84a4f39b9772ba8100 100644 (file)
@@ -6,7 +6,7 @@
  * 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;
@@ -6,7 +6,7 @@
  * 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;
@@ -20,8 +20,8 @@ import java.nio.file.WatchService;
 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"
@@ -29,21 +29,24 @@ public final class BGPFileWatcher implements FileWatcher, AutoCloseable {
     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
@@ -52,7 +55,7 @@ public final class BGPFileWatcher implements FileWatcher, AutoCloseable {
     }
 
     @Override
-    public WatchService getWatchService() {
+    public synchronized WatchService getWatchService() {
         return this.watchService;
     }
 
diff --git a/config-loader/config-loader-impl/src/main/resources/org/opendaylight/blueprint/bgp-config-loader.xml b/config-loader/config-loader-impl/src/main/resources/org/opendaylight/blueprint/bgp-config-loader.xml
deleted file mode 100644 (file)
index 6febae3..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-<?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
diff --git a/config-loader/config-loader-impl/src/main/resources/org/opendaylight/blueprint/config-loader-impl.xml b/config-loader/config-loader-impl/src/main/resources/org/opendaylight/blueprint/config-loader-impl.xml
new file mode 100644 (file)
index 0000000..d700fe2
--- /dev/null
@@ -0,0 +1,22 @@
+<?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
@@ -6,42 +6,37 @@
  * 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
@@ -50,31 +45,35 @@ public abstract class AbstractConfigLoader {
     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() {
@@ -87,28 +86,12 @@ public abstract class AbstractConfigLoader {
 
     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();
@@ -6,7 +6,7 @@
  * 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;
@@ -14,8 +14,6 @@ import static org.mockito.Mockito.doReturn;
 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;
@@ -47,23 +45,6 @@ public class ConfigLoaderImplTest extends AbstractConfigLoader {
         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"));
@@ -6,7 +6,7 @@
  * 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;
@@ -14,13 +14,13 @@ 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();
index 0b62390b0818eafae2bbd16cc4169882b9b6023e..270753ca3d4d93c82f8b9593805fabd7a833ef9c 100644 (file)
@@ -25,7 +25,7 @@
     <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>
 
@@ -6,7 +6,7 @@
  * 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;
similarity index 94%
rename from config-loader/config-loader-spi/src/main/java/org/opendaylight/protocol/bgp/config/loader/spi/ConfigLoader.java
rename to config-loader/config-loader-spi/src/main/java/org/opendaylight/bgpcep/config/loader/spi/ConfigLoader.java
index 2c733c04113e83b113976917ce012f3e9da10bb3..b6b8720e49e7d1187d9700980501d0edd5ce535d 100644 (file)
@@ -6,7 +6,7 @@
  * 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;
index 95c5c99ec789da3ad5cd42311d4f7448511a43d4..f4bd2ef28e94c35c249131eba5514d1fd56cbbf2 100644 (file)
@@ -34,6 +34,9 @@
         <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>
 
     <!--
diff --git a/config-loader/protocols-config-loader/pom.xml b/config-loader/protocols-config-loader/pom.xml
new file mode 100644 (file)
index 0000000..c4d89f7
--- /dev/null
@@ -0,0 +1,114 @@
+<?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
diff --git a/config-loader/protocols-config-loader/src/main/java/org/opendaylight/bgpcep/config/loader/protocols/ProtocolsConfigFileProcessor.java b/config-loader/protocols-config-loader/src/main/java/org/opendaylight/bgpcep/config/loader/protocols/ProtocolsConfigFileProcessor.java
new file mode 100644 (file)
index 0000000..8edd561
--- /dev/null
@@ -0,0 +1,110 @@
+/*
+ * 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;
+        }
+    }
+}
diff --git a/config-loader/protocols-config-loader/src/main/resources/org/opendaylight/blueprint/protocols-config-loader.xml b/config-loader/protocols-config-loader/src/main/resources/org/opendaylight/blueprint/protocols-config-loader.xml
new file mode 100644 (file)
index 0000000..56601ca
--- /dev/null
@@ -0,0 +1,23 @@
+<?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
diff --git a/config-loader/protocols-config-loader/src/test/java/org/opendaylight/bgpcep/config/loader/protocols/ProtocolsConfigFileProcessorTest.java b/config-loader/protocols-config-loader/src/test/java/org/opendaylight/bgpcep/config/loader/protocols/ProtocolsConfigFileProcessorTest.java
new file mode 100644 (file)
index 0000000..3ea30e1
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * 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
diff --git a/config-loader/protocols-config-loader/src/test/resources/initial/protocols-config.xml b/config-loader/protocols-config-loader/src/test/resources/initial/protocols-config.xml
new file mode 100644 (file)
index 0000000..a3dadb0
--- /dev/null
@@ -0,0 +1,13 @@
+<?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
diff --git a/config-loader/topology-config-loader/pom.xml b/config-loader/topology-config-loader/pom.xml
new file mode 100644 (file)
index 0000000..90b3503
--- /dev/null
@@ -0,0 +1,114 @@
+<?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
diff --git a/config-loader/topology-config-loader/src/main/java/org/opendaylight/bgpcep/config/loader/topology/NetworkTopologyConfigFileProcessor.java b/config-loader/topology-config-loader/src/main/java/org/opendaylight/bgpcep/config/loader/topology/NetworkTopologyConfigFileProcessor.java
new file mode 100644 (file)
index 0000000..fb187fe
--- /dev/null
@@ -0,0 +1,110 @@
+/*
+ * 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);
+    }
+}
diff --git a/config-loader/topology-config-loader/src/main/resources/org/opendaylight/blueprint/topology-config-loader.xml b/config-loader/topology-config-loader/src/main/resources/org/opendaylight/blueprint/topology-config-loader.xml
new file mode 100644 (file)
index 0000000..12aec0a
--- /dev/null
@@ -0,0 +1,23 @@
+<?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
diff --git a/config-loader/topology-config-loader/src/test/java/org/opendaylight/bgpcep/config/loader/topology/NetworkTopologyConfigFileProcessorTest.java b/config-loader/topology-config-loader/src/test/java/org/opendaylight/bgpcep/config/loader/topology/NetworkTopologyConfigFileProcessorTest.java
new file mode 100644 (file)
index 0000000..be12de5
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * 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
diff --git a/config-loader/topology-config-loader/src/test/resources/initial/network-topology-config.xml b/config-loader/topology-config-loader/src/test/resources/initial/network-topology-config.xml
new file mode 100644 (file)
index 0000000..62fbe1b
--- /dev/null
@@ -0,0 +1,12 @@
+<?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
index 2ae8da05018aa1be7f7c6ceaa09c91b19203e1dc..2760db350562b4784b2d35ffa503ca85097e51e9 100644 (file)
@@ -81,7 +81,7 @@ public class TopologyDataChangeCounterDeployer implements DataTreeChangeListener
     }
 
     @Override
-    public synchronized void close() throws Exception {
+    public synchronized void close() {
         LOG.info("Closing Data change counter Deployer");
 
         if (this.registration != null) {
index 6111acf14a35ca8527046004a3dd68a5b44609d1..647521817d340fbe59bc60b2fc38dedf383eaab9 100644 (file)
       <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>
index 39bf5c65d9923a4b85591eaeb97c7ca4f668dcd5..0e1d9bc292dc2d2866cbc3c3e86973a7508c6218 100644 (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>${project.groupId}</groupId>
             <artifactId>odl-bgpcep-bgp-openconfig-state</artifactId>
index 32934bd13fb33b31ff2efa80230ad8c7c934724b..85850c31dad82a5de9790ddafd7d8de7ca30aa21 100644 (file)
@@ -41,7 +41,7 @@
             <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>
 
index 90832b6bd8b55f53e206d753b5c002668e12bfc1..71dc3754ffbcaf8d186b63506fee1c33caea5bfa 100644 (file)
@@ -12,6 +12,6 @@
           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
index 40df75de891eb3beecc2c1e15da3cb756003f198..982d883740edc0932de77b6e77c545ccac206b2a 100644 (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>
index 5922107c0a38700b4caa8a8255513e76b7c88d17..209beb8f431c1053cdb82bad6d7997bc3d62063f 100644 (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>
index b09c9544e2f854c754d5d4f4665d48d2b097f0fd..a53b1b30f74d470cf793368e32fde5cfa5ef5d2a 100644 (file)
             <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>
 
     <!--
index bb69a2b18915c72249e7b7ed9413435f46c19771..20eb52a69b8a54b60445e5181af169ad4a4aeb3f 100644 (file)
             <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>
index bf276670cf69248078a6bdd765c832cd6bbe9703..d72be1af70a9d5ee9b41bf0fe7bfed7b44856720 100644 (file)
     <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>
diff --git a/features/config-loader/odl-bgpcep-bmp-config-loader/pom.xml b/features/config-loader/odl-bgpcep-bmp-config-loader/pom.xml
new file mode 100644 (file)
index 0000000..4994363
--- /dev/null
@@ -0,0 +1,81 @@
+<?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
diff --git a/features/config-loader/odl-bgpcep-config-loader-impl/pom.xml b/features/config-loader/odl-bgpcep-config-loader-impl/pom.xml
new file mode 100644 (file)
index 0000000..ff52199
--- /dev/null
@@ -0,0 +1,76 @@
+<?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>
similarity index 84%
rename from features/config-loader/odl-bgpcep-config-loader/pom.xml
rename to features/config-loader/odl-bgpcep-config-loader-spi/pom.xml
index 10739ca327da2a23f7346406e3d7d22da179d349..c2497fdc5788beb0613be8e1abfd1590f694a3d3 100644 (file)
     </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>
@@ -83,4 +73,4 @@
             <url>${nexus.site.url}/${project.artifactId}/</url>
         </site>
     </distributionManagement>
-</project>
+</project>
\ No newline at end of file
diff --git a/features/config-loader/odl-bgpcep-protocols-config-loader/pom.xml b/features/config-loader/odl-bgpcep-protocols-config-loader/pom.xml
new file mode 100644 (file)
index 0000000..dfa1feb
--- /dev/null
@@ -0,0 +1,81 @@
+<?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
diff --git a/features/config-loader/odl-bgpcep-topology-config-loader/pom.xml b/features/config-loader/odl-bgpcep-topology-config-loader/pom.xml
new file mode 100644 (file)
index 0000000..0441778
--- /dev/null
@@ -0,0 +1,81 @@
+<?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
index e7ce9ea0ec3222c66f515fd31f856045d51843a9..91d1143c20db849a17af1320643f1f8a26cf2897 100644 (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>
 
     <!--
index 63c9859eed8be818820eb7629c508262103d2d68..eaed02fac7376a1eb472d25b7ce9a139031355a6 100644 (file)
             <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>
 
     <!--
diff --git a/features/pcep/odl-bgpcep-pcep-config-example/pom.xml b/features/pcep/odl-bgpcep-pcep-config-example/pom.xml
new file mode 100644 (file)
index 0000000..5dde12a
--- /dev/null
@@ -0,0 +1,64 @@
+<?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>
diff --git a/features/pcep/odl-bgpcep-pcep-config-example/src/main/feature/feature.xml b/features/pcep/odl-bgpcep-pcep-config-example/src/main/feature/feature.xml
new file mode 100644 (file)
index 0000000..e0b7af0
--- /dev/null
@@ -0,0 +1,15 @@
+<?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
index 814a9d6c59881b0138ac3c036f3e33f25feede60..d43de2c1591d657c7dba7a5d9d5d2f035be61f79 100644 (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
index 3cff415f5b96b8ac1c3d7901ae8eb1dc118c681c..1ed9a0d727a7fdc73e70d7d916e65530aaed611b 100644 (file)
@@ -38,6 +38,7 @@
         <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>
 
     <!--
diff --git a/pcep/config-example/pom.xml b/pcep/config-example/pom.xml
new file mode 100644 (file)
index 0000000..614ea88
--- /dev/null
@@ -0,0 +1,96 @@
+<?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
diff --git a/pcep/config-example/src/main/resources/initial/network-topology-pcep-config.xml b/pcep/config-example/src/main/resources/initial/network-topology-pcep-config.xml
new file mode 100644 (file)
index 0000000..9b7cdca
--- /dev/null
@@ -0,0 +1,29 @@
+<?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
index be9cf904609c6c3fca8345658ff68da1ac9aa1e2..536faf52f413d207796e3c0360e0724bbf9bc536 100644 (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>
index 9d47a009be6c28244bec54d7495fbd5d54231cdb..e632fea99abd8e77afe03215026f84dab8a36920 100644 (file)
@@ -45,6 +45,7 @@
         <module>segment-routing</module>
         <module>pcc-mock</module>
         <module>auto-bandwidth-extension</module>
+        <module>config-example</module>
     </modules>
 
   <!--
index d89242977d87e63faa16ea70a2379cc48aeb5102..888d2836c94e2125091694a51ec57ecc512f25ba 100644 (file)
@@ -69,7 +69,7 @@ final class PCEPTopologyProviderUtil {
         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);