From: Claudio D. Gasparini Date: Wed, 15 Nov 2017 15:18:45 +0000 (+0100) Subject: BGPCEP-710: Create Network Topology Loader X-Git-Tag: release/oxygen~109 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=fec33f202838499e11b0523efa437cfa2decee71;p=bgpcep.git BGPCEP-710: Create Network Topology Loader - 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 --- diff --git a/bgp/bgp-artifacts/pom.xml b/bgp/bgp-artifacts/pom.xml index 56e5b3ec1e..82e404e61f 100644 --- a/bgp/bgp-artifacts/pom.xml +++ b/bgp/bgp-artifacts/pom.xml @@ -195,7 +195,7 @@ bgp-config-example ${project.version} xml - network-topology-initial-config + network-topology-bgp-initial-config ${project.groupId} diff --git a/bgp/config-example/pom.xml b/bgp/config-example/pom.xml index ae62fbb4ba..362039dd18 100644 --- a/bgp/config-example/pom.xml +++ b/bgp/config-example/pom.xml @@ -77,7 +77,7 @@ ${project.build.directory}/classes/initial/network-topology-config.xml xml - network-topology-initial-config + network-topology-bgp-initial-config 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 index 2892eb7051..0000000000 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/ProtocolsConfigFileProcessor.java +++ /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 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 protocolsCollection = protocolList.getValue(); - for (final MapEntryNode protocolEntry : protocolsCollection) { - final Map.Entry, 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 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 neighborsList = neighbors.getNeighbor(); - final InstanceIdentifier 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(); - } -} diff --git a/bgp/rib-impl/src/main/resources/org/opendaylight/blueprint/bgp-rib.xml b/bgp/rib-impl/src/main/resources/org/opendaylight/blueprint/bgp-rib.xml index fc679007b5..0badd498a2 100644 --- a/bgp/rib-impl/src/main/resources/org/opendaylight/blueprint/bgp-rib.xml +++ b/bgp/rib-impl/src/main/resources/org/opendaylight/blueprint/bgp-rib.xml @@ -75,14 +75,6 @@ - - - - - - - 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 index c71af5395e..0000000000 --- a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/ProtocolsConfigFileProcessorTest.java +++ /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 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 getYangModelsPaths() { - final List 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 diff --git a/bgp/topology-provider/pom.xml b/bgp/topology-provider/pom.xml index c8d4481a86..050af3899c 100644 --- a/bgp/topology-provider/pom.xml +++ b/bgp/topology-provider/pom.xml @@ -92,10 +92,6 @@ com.google.guava guava - - ${project.groupId} - config-loader-spi - org.opendaylight.mdsal.model ietf-ted @@ -150,17 +146,6 @@ testtool-util test - - ${project.groupId} - config-loader-impl - test - - - ${project.groupId} - config-loader-impl - test-jar - test - org.opendaylight.controller config-manager @@ -202,11 +187,6 @@ sal-dom-broker-config test - - ${project.groupId} - bgp-config-example - test - org.mockito @@ -238,28 +218,6 @@ - - - - org.apache.maven.plugins - maven-remote-resources-plugin - - false - - ${project.groupId}:bgp-config-example:${project.version} - - - - - process-test-sources - - process - - - - - - scm:git:ssh://git.opendaylight.org:29418/bgpcep.git scm:git:ssh://git.opendaylight.org:29418/bgpcep.git 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 index 94469d74fb..0000000000 --- a/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/NetworkTopologyConfigFileProcessor.java +++ /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 networkTopology = topologyList.getValue(); - for (final MapEntryNode topology : networkTopology) { - final Map.Entry, DataObject> bi = this.bindingSerializer.fromNormalizedNode(this.topologyYii , topology); - if (bi != null) { - this.deployer.createInstance((Topology) bi.getValue()); - } - } - } -} diff --git a/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/config/BgpTopologyDeployerImpl.java b/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/config/BgpTopologyDeployerImpl.java index 3cb9a23354..2ef5c7c349 100644 --- a/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/config/BgpTopologyDeployerImpl.java +++ b/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/config/BgpTopologyDeployerImpl.java @@ -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; diff --git a/bgp/topology-provider/src/main/resources/org/opendaylight/blueprint/bgp-topology-provider.xml b/bgp/topology-provider/src/main/resources/org/opendaylight/blueprint/bgp-topology-provider.xml index a33123d618..55ff1dc903 100644 --- a/bgp/topology-provider/src/main/resources/org/opendaylight/blueprint/bgp-topology-provider.xml +++ b/bgp/topology-provider/src/main/resources/org/opendaylight/blueprint/bgp-topology-provider.xml @@ -24,11 +24,4 @@ - - - - - - - \ 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 index 8c8b03020e..0000000000 --- a/bgp/topology-provider/src/test/java/org/opendaylight/bgpcep/bgp/topology/provider/NetworkTopologyConfigFileProcessorTest.java +++ /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_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 getYangModelsPaths() { - final List 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 index 2eea47c82c..0000000000 --- a/bmp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/api/BmpDeployer.java +++ /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; -} diff --git a/bmp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/config/BmpDeployerImpl.java b/bmp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/config/BmpDeployerImpl.java index 0e45269891..5744621d7d 100644 --- a/bmp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/config/BmpDeployerImpl.java +++ b/bmp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/config/BmpDeployerImpl.java @@ -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, AutoCloseable { +public class BmpDeployerImpl implements ClusteredDataTreeChangeListener, AutoCloseable { private static final Logger LOG = LoggerFactory.getLogger(BmpDeployerImpl.class); + private static final long TIMEOUT_NS = TimeUnit.SECONDS.toNanos(5); private static final InstanceIdentifier 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 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> changes) { final DataTreeModification dataTreeModification = Iterables.getOnlyElement(changes); final Collection> rootNode = dataTreeModification.getRootNode() - .getModifiedChildren(); + .getModifiedChildren(); if (rootNode.isEmpty()) { return; } rootNode.forEach(dto -> handleModification((DataObjectModification) dto)); } - private void handleModification(final DataObjectModification config) { + private synchronized void handleModification(final DataObjectModification 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 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 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(); } diff --git a/bmp/bmp-impl/src/main/resources/org/opendaylight/blueprint/bgp-bmp.xml b/bmp/bmp-impl/src/main/resources/org/opendaylight/blueprint/bgp-bmp.xml index a0fd7c2244..cd45ccdaca 100644 --- a/bmp/bmp-impl/src/main/resources/org/opendaylight/blueprint/bgp-bmp.xml +++ b/bmp/bmp-impl/src/main/resources/org/opendaylight/blueprint/bgp-bmp.xml @@ -46,17 +46,8 @@ + init-method="init" destroy-method="close"> - - - - - - - - \ 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 index e69ef6d0b9..0000000000 --- a/bmp/bmp-impl/src/test/java/org/opendaylight/protocol/bmp/impl/BmpMonitorConfigFileProcessorTest.java +++ /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 getYangModelsPaths() { - final List 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 index 0000000000..6fd82403b7 --- /dev/null +++ b/config-loader/bmp-monitors-config-loader/pom.xml @@ -0,0 +1,113 @@ + + + + + + 4.0.0 + + org.opendaylight.bgpcep + config-parent + 0.9.0-SNAPSHOT + ../../config-parent + + + bmp-monitors-config-loader + BGPCEP BMP Monitors configuration Loader + bundle + ${project.artifactId} + + + + ${project.groupId} + config-loader-spi + + + ${project.groupId} + bgp-bmp-api + + + ${project.groupId} + config-loader-impl + test + + + ${project.groupId} + config-loader-impl + test-jar + test + + + org.opendaylight.mdsal + mdsal-binding-dom-adapter + test + + + org.opendaylight.controller + sal-binding-broker-impl + test + + + org.opendaylight.controller + sal-binding-broker-impl + test-jar + test + + + ${project.groupId} + testtool-util + test + + + + org.mockito + mockito-core + test + + + junit + junit + + + + + + + org.apache.maven.plugins + maven-checkstyle-plugin + + checkstyle.violationSeverity=error + + + + org.codehaus.mojo + findbugs-maven-plugin + + true + + + + + + + scm:git:ssh://git.opendaylight.org:29418/bgpcep.git + scm:git:ssh://git.opendaylight.org:29418/bgpcep.git + https://wiki.opendaylight.org/view/BGP_LS_PCEP:Main + HEAD + + + ${odl.site.url}/${project.groupId}/${stream}/${project.artifactId}/ + + + opendaylight-site + ${nexus.site.url}/${project.artifactId}/ + + + \ No newline at end of file diff --git a/bmp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/BmpMonitorConfigFileProcessor.java b/config-loader/bmp-monitors-config-loader/src/main/java/org/opendaylight/bgpcep/config/loader/bmp/BmpMonitorConfigFileProcessor.java similarity index 57% rename from bmp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/BmpMonitorConfigFileProcessor.java rename to config-loader/bmp-monitors-config-loader/src/main/java/org/opendaylight/bgpcep/config/loader/bmp/BmpMonitorConfigFileProcessor.java index 2356be186f..ec17eea6a5 100644 --- a/bmp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/BmpMonitorConfigFileProcessor.java +++ b/config-loader/bmp-monitors-config-loader/src/main/java/org/opendaylight/bgpcep/config/loader/bmp/BmpMonitorConfigFileProcessor.java @@ -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 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 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 bmpMonitorConfig = monitorsList.getValue(); - for (final MapEntryNode topology : bmpMonitorConfig) { - final Map.Entry, 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 index 0000000000..5484aae035 --- /dev/null +++ b/config-loader/bmp-monitors-config-loader/src/main/resources/org/opendaylight/blueprint/bmp-config-loader.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + \ 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 index 0000000000..9bc1c8031f --- /dev/null +++ b/config-loader/bmp-monitors-config-loader/src/test/java/org/opendaylight/bgpcep/config/loader/bmp/BmpMonitorConfigFileProcessorTest.java @@ -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 index 0000000000..b07ad42fc8 --- /dev/null +++ b/config-loader/bmp-monitors-config-loader/src/test/resources/initial/odl-bmp-monitors-config.xml @@ -0,0 +1,23 @@ + + + + + + example-bmp-monitor + + 12345 + 0.0.0.0 + + + \ No newline at end of file diff --git a/config-loader/config-loader-artifacts/pom.xml b/config-loader/config-loader-artifacts/pom.xml index 3fb1d58229..9e400fc0c1 100644 --- a/config-loader/config-loader-artifacts/pom.xml +++ b/config-loader/config-loader-artifacts/pom.xml @@ -28,7 +28,35 @@ ${project.groupId} - odl-bgpcep-config-loader + odl-bgpcep-config-loader-impl + features + xml + ${project.version} + + + ${project.groupId} + odl-bgpcep-config-loader-spi + features + xml + ${project.version} + + + ${project.groupId} + odl-bgpcep-topology-config-loader + features + xml + ${project.version} + + + ${project.groupId} + odl-bgpcep-protocols-config-loader + features + xml + ${project.version} + + + ${project.groupId} + odl-bgpcep-bmp-config-loader features xml ${project.version} @@ -36,6 +64,8 @@ ${project.groupId} features-config-loader + features + xml ${project.version} @@ -48,6 +78,21 @@ config-loader-impl ${project.version} + + ${project.groupId} + protocols-config-loader + ${project.version} + + + ${project.groupId} + topology-config-loader + ${project.version} + + + ${project.groupId} + bmp-monitors-config-loader + ${project.version} + ${project.groupId} config-loader-impl diff --git a/config-loader/config-loader-impl/pom.xml b/config-loader/config-loader-impl/pom.xml index db0d09d3b0..4b061d7d15 100644 --- a/config-loader/config-loader-impl/pom.xml +++ b/config-loader/config-loader-impl/pom.xml @@ -65,10 +65,12 @@ org.mockito mockito-core + test org.opendaylight.yangtools mockito-configuration + test org.opendaylight.mdsal @@ -78,6 +80,13 @@ org.opendaylight.yangtools yang-test-util + test + + + org.opendaylight.controller + sal-binding-broker-impl + test + test-jar @@ -102,6 +111,13 @@ checkstyle.violationSeverity=error + + org.codehaus.mojo + findbugs-maven-plugin + + true + + diff --git a/config-loader/config-loader-impl/src/main/java/org/opendaylight/protocol/bgp/config/loader/impl/ConfigLoaderImpl.java b/config-loader/config-loader-impl/src/main/java/org/opendaylight/bgpcep/config/loader/impl/ConfigLoaderImpl.java similarity index 84% rename from config-loader/config-loader-impl/src/main/java/org/opendaylight/protocol/bgp/config/loader/impl/ConfigLoaderImpl.java rename to config-loader/config-loader-impl/src/main/java/org/opendaylight/bgpcep/config/loader/impl/ConfigLoaderImpl.java index aa579a3817..41cf706534 100644 --- a/config-loader/config-loader-impl/src/main/java/org/opendaylight/protocol/bgp/config/loader/impl/ConfigLoaderImpl.java +++ b/config-loader/config-loader-impl/src/main/java/org/opendaylight/bgpcep/config/loader/impl/ConfigLoaderImpl.java @@ -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(); diff --git a/config-loader/config-loader-impl/src/main/java/org/opendaylight/protocol/bgp/config/loader/impl/FileWatcher.java b/config-loader/config-loader-impl/src/main/java/org/opendaylight/bgpcep/config/loader/impl/FileWatcher.java 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 ac52d663b1..b53029d3bf 100644 --- a/config-loader/config-loader-impl/src/main/java/org/opendaylight/protocol/bgp/config/loader/impl/FileWatcher.java +++ b/config-loader/config-loader-impl/src/main/java/org/opendaylight/bgpcep/config/loader/impl/FileWatcher.java @@ -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; diff --git a/config-loader/config-loader-impl/src/main/java/org/opendaylight/protocol/bgp/config/loader/impl/BGPFileWatcher.java b/config-loader/config-loader-impl/src/main/java/org/opendaylight/bgpcep/config/loader/impl/FileWatcherImpl.java similarity index 78% rename from config-loader/config-loader-impl/src/main/java/org/opendaylight/protocol/bgp/config/loader/impl/BGPFileWatcher.java rename to config-loader/config-loader-impl/src/main/java/org/opendaylight/bgpcep/config/loader/impl/FileWatcherImpl.java index 810cd714c9..6811b4a826 100644 --- a/config-loader/config-loader-impl/src/main/java/org/opendaylight/protocol/bgp/config/loader/impl/BGPFileWatcher.java +++ b/config-loader/config-loader-impl/src/main/java/org/opendaylight/bgpcep/config/loader/impl/FileWatcherImpl.java @@ -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 index 6febae33d3..0000000000 --- a/config-loader/config-loader-impl/src/main/resources/org/opendaylight/blueprint/bgp-config-loader.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ 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 index 0000000000..d700fe26c9 --- /dev/null +++ b/config-loader/config-loader-impl/src/main/resources/org/opendaylight/blueprint/config-loader-impl.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/config-loader/config-loader-impl/src/test/java/org/opendaylight/protocol/bgp/config/loader/impl/AbstractConfigLoader.java b/config-loader/config-loader-impl/src/test/java/org/opendaylight/bgpcep/config/loader/impl/AbstractConfigLoader.java similarity index 68% rename from config-loader/config-loader-impl/src/test/java/org/opendaylight/protocol/bgp/config/loader/impl/AbstractConfigLoader.java rename to config-loader/config-loader-impl/src/test/java/org/opendaylight/bgpcep/config/loader/impl/AbstractConfigLoader.java index 619b2d1b01..032e94a56a 100644 --- a/config-loader/config-loader-impl/src/test/java/org/opendaylight/protocol/bgp/config/loader/impl/AbstractConfigLoader.java +++ b/config-loader/config-loader-impl/src/test/java/org/opendaylight/bgpcep/config/loader/impl/AbstractConfigLoader.java @@ -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> 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 getYangModelsPaths(); - - private static List getFilesAsStreams(final List paths) { - final List resources = new ArrayList<>(); - final List 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(); diff --git a/config-loader/config-loader-impl/src/test/java/org/opendaylight/protocol/bgp/config/loader/impl/ConfigLoaderImplTest.java b/config-loader/config-loader-impl/src/test/java/org/opendaylight/bgpcep/config/loader/impl/ConfigLoaderImplTest.java similarity index 75% rename from config-loader/config-loader-impl/src/test/java/org/opendaylight/protocol/bgp/config/loader/impl/ConfigLoaderImplTest.java rename to config-loader/config-loader-impl/src/test/java/org/opendaylight/bgpcep/config/loader/impl/ConfigLoaderImplTest.java index da3d891656..981c9553a3 100644 --- a/config-loader/config-loader-impl/src/test/java/org/opendaylight/protocol/bgp/config/loader/impl/ConfigLoaderImplTest.java +++ b/config-loader/config-loader-impl/src/test/java/org/opendaylight/bgpcep/config/loader/impl/ConfigLoaderImplTest.java @@ -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 getYangModelsPaths() { - final List 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")); diff --git a/config-loader/config-loader-impl/src/test/java/org/opendaylight/protocol/bgp/config/loader/impl/BGPFileWatcherTest.java b/config-loader/config-loader-impl/src/test/java/org/opendaylight/bgpcep/config/loader/impl/FileWatcherTest.java similarity index 83% rename from config-loader/config-loader-impl/src/test/java/org/opendaylight/protocol/bgp/config/loader/impl/BGPFileWatcherTest.java rename to config-loader/config-loader-impl/src/test/java/org/opendaylight/bgpcep/config/loader/impl/FileWatcherTest.java index 2dcf26b2ba..9d8047e12d 100644 --- a/config-loader/config-loader-impl/src/test/java/org/opendaylight/protocol/bgp/config/loader/impl/BGPFileWatcherTest.java +++ b/config-loader/config-loader-impl/src/test/java/org/opendaylight/bgpcep/config/loader/impl/FileWatcherTest.java @@ -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(); diff --git a/config-loader/config-loader-spi/pom.xml b/config-loader/config-loader-spi/pom.xml index 0b62390b08..270753ca3d 100644 --- a/config-loader/config-loader-spi/pom.xml +++ b/config-loader/config-loader-spi/pom.xml @@ -25,7 +25,7 @@ org.opendaylight.mdsal - mdsal-binding-dom-codec + mdsal-binding-generator-api @@ -38,6 +38,13 @@ checkstyle.violationSeverity=error + + org.codehaus.mojo + findbugs-maven-plugin + + true + + diff --git a/config-loader/config-loader-spi/src/main/java/org/opendaylight/protocol/bgp/config/loader/spi/ConfigFileProcessor.java b/config-loader/config-loader-spi/src/main/java/org/opendaylight/bgpcep/config/loader/spi/ConfigFileProcessor.java similarity index 95% rename from config-loader/config-loader-spi/src/main/java/org/opendaylight/protocol/bgp/config/loader/spi/ConfigFileProcessor.java rename to config-loader/config-loader-spi/src/main/java/org/opendaylight/bgpcep/config/loader/spi/ConfigFileProcessor.java index b81cff29c6..0fae168400 100644 --- a/config-loader/config-loader-spi/src/main/java/org/opendaylight/protocol/bgp/config/loader/spi/ConfigFileProcessor.java +++ b/config-loader/config-loader-spi/src/main/java/org/opendaylight/bgpcep/config/loader/spi/ConfigFileProcessor.java @@ -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; diff --git a/config-loader/config-loader-spi/src/main/java/org/opendaylight/protocol/bgp/config/loader/spi/ConfigLoader.java b/config-loader/config-loader-spi/src/main/java/org/opendaylight/bgpcep/config/loader/spi/ConfigLoader.java 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 2c733c0411..b6b8720e49 100644 --- a/config-loader/config-loader-spi/src/main/java/org/opendaylight/protocol/bgp/config/loader/spi/ConfigLoader.java +++ b/config-loader/config-loader-spi/src/main/java/org/opendaylight/bgpcep/config/loader/spi/ConfigLoader.java @@ -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; diff --git a/config-loader/pom.xml b/config-loader/pom.xml index 95c5c99ec7..f4bd2ef28e 100644 --- a/config-loader/pom.xml +++ b/config-loader/pom.xml @@ -34,6 +34,9 @@ config-loader-artifacts config-loader-spi config-loader-impl + topology-config-loader + protocols-config-loader + bmp-monitors-config-loader + + + + 4.0.0 + + org.opendaylight.bgpcep + config-parent + 0.9.0-SNAPSHOT + ../../config-parent + + + protocols-config-loader + BGPCEP Protocols configuration Loader + bundle + ${project.artifactId} + + + + ${project.groupId} + config-loader-spi + + + ${project.groupId} + bgp-openconfig-api + + + ${project.groupId} + config-loader-impl + test + + + ${project.groupId} + config-loader-impl + test-jar + test + + + org.opendaylight.mdsal + mdsal-binding-dom-adapter + test + + + org.opendaylight.controller + sal-binding-broker-impl + test + + + org.opendaylight.controller + sal-binding-broker-impl + test-jar + test + + + ${project.groupId} + testtool-util + test + + + + org.mockito + mockito-core + test + + + junit + junit + test + + + + + + + org.apache.maven.plugins + maven-checkstyle-plugin + + checkstyle.violationSeverity=error + + + + org.codehaus.mojo + findbugs-maven-plugin + + true + + + + + + + scm:git:ssh://git.opendaylight.org:29418/bgpcep.git + scm:git:ssh://git.opendaylight.org:29418/bgpcep.git + https://wiki.opendaylight.org/view/BGP_LS_PCEP:Main + HEAD + + + ${odl.site.url}/${project.groupId}/${stream}/${project.artifactId}/ + + + opendaylight-site + ${nexus.site.url}/${project.artifactId}/ + + + \ 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 index 0000000000..8edd561238 --- /dev/null +++ b/config-loader/protocols-config-loader/src/main/java/org/opendaylight/bgpcep/config/loader/protocols/ProtocolsConfigFileProcessor.java @@ -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 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 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 protocolsCollection = protocolList.getValue(); + final WriteTransaction wtx = this.dataBroker.newWriteOnlyTransaction(); + for (final MapEntryNode protocolEntry : protocolsCollection) { + final Map.Entry, 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 index 0000000000..56601caa64 --- /dev/null +++ b/config-loader/protocols-config-loader/src/main/resources/org/opendaylight/blueprint/protocols-config-loader.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + \ 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 index 0000000000..3ea30e1eb9 --- /dev/null +++ b/config-loader/protocols-config-loader/src/test/java/org/opendaylight/bgpcep/config/loader/protocols/ProtocolsConfigFileProcessorTest.java @@ -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 index 0000000000..a3dadb065a --- /dev/null +++ b/config-loader/protocols-config-loader/src/test/resources/initial/protocols-config.xml @@ -0,0 +1,13 @@ + + + + example-bgp-rib + x:BGP + + \ 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 index 0000000000..90b3503bf0 --- /dev/null +++ b/config-loader/topology-config-loader/pom.xml @@ -0,0 +1,114 @@ + + + + + + 4.0.0 + + org.opendaylight.bgpcep + config-parent + 0.9.0-SNAPSHOT + ../../config-parent + + + topology-config-loader + BGPCEP Topology Initial configuration Loader + bundle + ${project.artifactId} + + + + ${project.groupId} + config-loader-spi + + + org.opendaylight.mdsal.model + ietf-topology + + + ${project.groupId} + config-loader-impl + test + + + ${project.groupId} + config-loader-impl + test-jar + test + + + org.opendaylight.mdsal + mdsal-binding-dom-adapter + test + + + org.opendaylight.controller + sal-binding-broker-impl + test + + + org.opendaylight.controller + sal-binding-broker-impl + test-jar + test + + + ${project.groupId} + testtool-util + test + + + + org.mockito + mockito-core + test + + + junit + junit + test + + + + + + + org.apache.maven.plugins + maven-checkstyle-plugin + + checkstyle.violationSeverity=error + + + + org.codehaus.mojo + findbugs-maven-plugin + + true + + + + + + + scm:git:ssh://git.opendaylight.org:29418/bgpcep.git + scm:git:ssh://git.opendaylight.org:29418/bgpcep.git + https://wiki.opendaylight.org/view/BGP_LS_PCEP:Main + HEAD + + + ${odl.site.url}/${project.groupId}/${stream}/${project.artifactId}/ + + + opendaylight-site + ${nexus.site.url}/${project.artifactId}/ + + + \ 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 index 0000000000..fb187fe61e --- /dev/null +++ b/config-loader/topology-config-loader/src/main/java/org/opendaylight/bgpcep/config/loader/topology/NetworkTopologyConfigFileProcessor.java @@ -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_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 networkTopology = topologyList.getValue(); + if (networkTopology.isEmpty()) { + return; + } + final WriteTransaction wtx = this.dataBroker.newWriteOnlyTransaction(); + + for (final MapEntryNode topologyEntry : networkTopology) { + final Map.Entry, 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 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 index 0000000000..12aec0a438 --- /dev/null +++ b/config-loader/topology-config-loader/src/main/resources/org/opendaylight/blueprint/topology-config-loader.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + \ 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 index 0000000000..be12de595d --- /dev/null +++ b/config-loader/topology-config-loader/src/test/java/org/opendaylight/bgpcep/config/loader/topology/NetworkTopologyConfigFileProcessorTest.java @@ -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 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 index 0000000000..62fbe1b096 --- /dev/null +++ b/config-loader/topology-config-loader/src/test/resources/initial/network-topology-config.xml @@ -0,0 +1,12 @@ + + + + topology-test + + \ No newline at end of file diff --git a/data-change-counter/src/main/java/org/opendaylight/protocol/data/change/counter/TopologyDataChangeCounterDeployer.java b/data-change-counter/src/main/java/org/opendaylight/protocol/data/change/counter/TopologyDataChangeCounterDeployer.java index 2ae8da0501..2760db3505 100644 --- a/data-change-counter/src/main/java/org/opendaylight/protocol/data/change/counter/TopologyDataChangeCounterDeployer.java +++ b/data-change-counter/src/main/java/org/opendaylight/protocol/data/change/counter/TopologyDataChangeCounterDeployer.java @@ -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) { diff --git a/distribution-karaf/pom.xml b/distribution-karaf/pom.xml index 6111acf14a..647521817d 100644 --- a/distribution-karaf/pom.xml +++ b/distribution-karaf/pom.xml @@ -83,6 +83,13 @@ xml runtime + + org.opendaylight.bgpcep + features-config-loader + features + xml + runtime + org.opendaylight.netconf features-restconf diff --git a/features/bgp/features-bgp/pom.xml b/features/bgp/features-bgp/pom.xml index 39bf5c65d9..0e1d9bc292 100644 --- a/features/bgp/features-bgp/pom.xml +++ b/features/bgp/features-bgp/pom.xml @@ -137,12 +137,6 @@ xml features - - ${project.groupId} - odl-bgpcep-config-loader - xml - features - ${project.groupId} odl-bgpcep-bgp-openconfig-state diff --git a/features/bgp/odl-bgpcep-bgp-config-example/pom.xml b/features/bgp/odl-bgpcep-bgp-config-example/pom.xml index 32934bd13f..85850c31da 100644 --- a/features/bgp/odl-bgpcep-bgp-config-example/pom.xml +++ b/features/bgp/odl-bgpcep-bgp-config-example/pom.xml @@ -41,7 +41,7 @@ ${project.groupId} bgp-config-example xml - network-topology-initial-config + network-topology-bgp-initial-config diff --git a/features/bgp/odl-bgpcep-bgp-config-example/src/main/feature/feature.xml b/features/bgp/odl-bgpcep-bgp-config-example/src/main/feature/feature.xml index 90832b6bd8..71dc3754ff 100644 --- a/features/bgp/odl-bgpcep-bgp-config-example/src/main/feature/feature.xml +++ b/features/bgp/odl-bgpcep-bgp-config-example/src/main/feature/feature.xml @@ -12,6 +12,6 @@ xsi:schemaLocation="http://karaf.apache.org/xmlns/features/v1.2.0 http://karaf.apache.org/xmlns/features/v1.2.0"> mvn:org.opendaylight.bgpcep/bgp-config-example/${project.version}/xml/bgp-initial-config - mvn:org.opendaylight.bgpcep/bgp-config-example/${project.version}/xml/network-topology-initial-config + mvn:org.opendaylight.bgpcep/bgp-config-example/${project.version}/xml/network-topology-bgp-initial-config \ No newline at end of file diff --git a/features/bgp/odl-bgpcep-bgp-rib-impl/pom.xml b/features/bgp/odl-bgpcep-bgp-rib-impl/pom.xml index 40df75de89..982d883740 100644 --- a/features/bgp/odl-bgpcep-bgp-rib-impl/pom.xml +++ b/features/bgp/odl-bgpcep-bgp-rib-impl/pom.xml @@ -78,12 +78,6 @@ xml features - - ${project.groupId} - odl-bgpcep-config-loader - xml - features - org.opendaylight.controller odl-mdsal-broker diff --git a/features/bgp/odl-bgpcep-bgp-topology/pom.xml b/features/bgp/odl-bgpcep-bgp-topology/pom.xml index 5922107c0a..209beb8f43 100644 --- a/features/bgp/odl-bgpcep-bgp-topology/pom.xml +++ b/features/bgp/odl-bgpcep-bgp-topology/pom.xml @@ -60,12 +60,6 @@ xml features - - ${project.groupId} - odl-bgpcep-config-loader - xml - features - org.opendaylight.controller odl-mdsal-broker diff --git a/features/bgp/odl-bgpcep-bgp/pom.xml b/features/bgp/odl-bgpcep-bgp/pom.xml index b09c9544e2..a53b1b30f7 100644 --- a/features/bgp/odl-bgpcep-bgp/pom.xml +++ b/features/bgp/odl-bgpcep-bgp/pom.xml @@ -115,6 +115,18 @@ features xml + + ${project.groupId} + odl-bgpcep-protocols-config-loader + xml + features + + + ${project.groupId} + odl-bgpcep-topology-config-loader + xml + features + + + 4.0.0 + + org.opendaylight.odlparent + single-feature-parent + 2.0.5 + + + + org.opendaylight.bgpcep + odl-bgpcep-bmp-config-loader + 0.9.0-SNAPSHOT + feature + + OpenDaylight :: BGPCEP :: BMP Config Loader + + + + + + org.opendaylight.bgpcep + bgpcep-artifacts + ${project.version} + pom + import + + + org.opendaylight.bgpcep + dependency-version-management + ${project.version} + pom + import + + + + + + + ${project.groupId} + bmp-monitors-config-loader + + + ${project.groupId} + odl-bgpcep-config-loader-impl + features + xml + + + org.opendaylight.controller + odl-mdsal-broker + xml + features + + + + + ${odl.site.url}/${project.groupId}/${stream}/${project.artifactId}/ + + + + opendaylight-site + ${nexus.site.url}/${project.artifactId}/ + + + \ 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 index 0000000000..ff52199141 --- /dev/null +++ b/features/config-loader/odl-bgpcep-config-loader-impl/pom.xml @@ -0,0 +1,76 @@ + + + + + 4.0.0 + + org.opendaylight.odlparent + single-feature-parent + 2.0.5 + + + + org.opendaylight.bgpcep + odl-bgpcep-config-loader-impl + 0.9.0-SNAPSHOT + feature + + OpenDaylight :: BGPCEP :: Config Loader Impl + + + + + + org.opendaylight.bgpcep + bgpcep-artifacts + ${project.version} + pom + import + + + org.opendaylight.bgpcep + dependency-version-management + ${project.version} + pom + import + + + + + + + ${project.groupId} + config-loader-impl + + + ${project.groupId} + odl-bgpcep-config-loader-spi + features + xml + + + + + ${odl.site.url}/${project.groupId}/${stream}/${project.artifactId}/ + + + + opendaylight-site + ${nexus.site.url}/${project.artifactId}/ + + + diff --git a/features/config-loader/odl-bgpcep-config-loader/pom.xml b/features/config-loader/odl-bgpcep-config-loader-spi/pom.xml 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 10739ca327..c2497fdc57 100644 --- a/features/config-loader/odl-bgpcep-config-loader/pom.xml +++ b/features/config-loader/odl-bgpcep-config-loader-spi/pom.xml @@ -19,11 +19,11 @@ org.opendaylight.bgpcep - odl-bgpcep-config-loader + odl-bgpcep-config-loader-spi 0.9.0-SNAPSHOT feature - OpenDaylight :: BGPCEP :: Config Loader + OpenDaylight :: BGPCEP :: SPI Config Loader @@ -50,16 +50,6 @@ ${project.groupId} config-loader-spi - - ${project.groupId} - config-loader-impl - - - org.opendaylight.mdsal - odl-mdsal-dom-api - xml - features - org.opendaylight.mdsal odl-mdsal-binding-runtime @@ -83,4 +73,4 @@ ${nexus.site.url}/${project.artifactId}/ - + \ 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 index 0000000000..dfa1febe84 --- /dev/null +++ b/features/config-loader/odl-bgpcep-protocols-config-loader/pom.xml @@ -0,0 +1,81 @@ + + + + 4.0.0 + + org.opendaylight.odlparent + single-feature-parent + 2.0.5 + + + + org.opendaylight.bgpcep + odl-bgpcep-protocols-config-loader + 0.9.0-SNAPSHOT + feature + + OpenDaylight :: BGPCEP :: Protocols Config Loader + + + + + + org.opendaylight.bgpcep + bgpcep-artifacts + ${project.version} + pom + import + + + org.opendaylight.bgpcep + dependency-version-management + ${project.version} + pom + import + + + + + + + ${project.groupId} + protocols-config-loader + + + ${project.groupId} + odl-bgpcep-config-loader-impl + features + xml + + + org.opendaylight.controller + odl-mdsal-broker + xml + features + + + + + ${odl.site.url}/${project.groupId}/${stream}/${project.artifactId}/ + + + + opendaylight-site + ${nexus.site.url}/${project.artifactId}/ + + + \ 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 index 0000000000..0441778940 --- /dev/null +++ b/features/config-loader/odl-bgpcep-topology-config-loader/pom.xml @@ -0,0 +1,81 @@ + + + + 4.0.0 + + org.opendaylight.odlparent + single-feature-parent + 2.0.5 + + + + org.opendaylight.bgpcep + odl-bgpcep-topology-config-loader + 0.9.0-SNAPSHOT + feature + + OpenDaylight :: BGPCEP :: Topology Config Loader + + + + + + org.opendaylight.bgpcep + bgpcep-artifacts + ${project.version} + pom + import + + + org.opendaylight.bgpcep + dependency-version-management + ${project.version} + pom + import + + + + + + + ${project.groupId} + topology-config-loader + + + ${project.groupId} + odl-bgpcep-config-loader-impl + features + xml + + + org.opendaylight.controller + odl-mdsal-broker + xml + features + + + + + ${odl.site.url}/${project.groupId}/${stream}/${project.artifactId}/ + + + + opendaylight-site + ${nexus.site.url}/${project.artifactId}/ + + + \ No newline at end of file diff --git a/features/config-loader/pom.xml b/features/config-loader/pom.xml index e7ce9ea0ec..91d1143c20 100644 --- a/features/config-loader/pom.xml +++ b/features/config-loader/pom.xml @@ -24,7 +24,11 @@ features-config-loader - odl-bgpcep-config-loader + odl-bgpcep-config-loader-spi + odl-bgpcep-config-loader-impl + odl-bgpcep-topology-config-loader + odl-bgpcep-protocols-config-loader + odl-bgpcep-bmp-config-loader + + 4.0.0 + + org.opendaylight.odlparent + single-feature-parent + 2.0.5 + + + + org.opendaylight.bgpcep + odl-bgpcep-pcep-config-example + 0.9.0-SNAPSHOT + feature + + OpenDaylight :: Pcep Configuration Example Files + + + + + + org.opendaylight.bgpcep + bgpcep-artifacts + ${project.version} + pom + import + + + + + + + ${project.groupId} + pcep-config-example + xml + network-topology-pcep-initial-config + + + + + ${odl.site.url}/${project.groupId}/${stream}/${project.artifactId}/ + + + + opendaylight-site + ${nexus.site.url}/${project.artifactId}/ + + + 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 index 0000000000..e0b7af03ba --- /dev/null +++ b/features/pcep/odl-bgpcep-pcep-config-example/src/main/feature/feature.xml @@ -0,0 +1,15 @@ + + + + + mvn:org.opendaylight.bgpcep/pcep-config-example/${project.version}/xml/network-topology-pcep-initial-config + + \ No newline at end of file diff --git a/features/pcep/odl-bgpcep-pcep/pom.xml b/features/pcep/odl-bgpcep-pcep/pom.xml index 814a9d6c59..d43de2c159 100644 --- a/features/pcep/odl-bgpcep-pcep/pom.xml +++ b/features/pcep/odl-bgpcep-pcep/pom.xml @@ -97,6 +97,18 @@ xml features + + ${project.groupId} + odl-bgpcep-topology-config-loader + xml + features + + + ${project.groupId} + odl-bgpcep-pcep-config-example + xml + features + + + + 4.0.0 + + org.opendaylight.odlparent + odlparent + 2.0.5 + + + + org.opendaylight.bgpcep + pcep-config-example + 0.9.0-SNAPSHOT + jar + Configuration files example for PCEP protocol + ${project.artifactId} + + + + + org.opendaylight.bgpcep + bgpcep-parent + 0.9.0-SNAPSHOT + pom + import + + + + + + + + maven-remote-resources-plugin + + + + bundle + + + + + + **/network-topology-pcep-config.xml + + + + + org.codehaus.mojo + build-helper-maven-plugin + + + attach-artifacts + + attach-artifact + + package + + + + ${project.build.directory}/classes/initial/network-topology-pcep-config.xml + xml + network-topology-pcep-initial-config + + + + + + + + + + + scm:git:ssh://git.opendaylight.org:29418/bgpcep.git + scm:git:ssh://git.opendaylight.org:29418/bgpcep.git + https://wiki.opendaylight.org/view/BGP_LS_PCEP:Main + HEAD + + + ${odl.site.url}/${project.groupId}/${stream}/${project.artifactId}/ + + + opendaylight-site + ${nexus.site.url}/${project.artifactId}/ + + + \ 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 index 0000000000..9b7cdcaa44 --- /dev/null +++ b/pcep/config-example/src/main/resources/initial/network-topology-pcep-config.xml @@ -0,0 +1,29 @@ + + + + + pcep-topology + + + + + 30 + 0.0.0.0 + 4189 + 120 + 30 + + + 43.43.43.43 + + topsecret + + + + \ No newline at end of file diff --git a/pcep/pcep-artifacts/pom.xml b/pcep/pcep-artifacts/pom.xml index be9cf90460..536faf52f4 100644 --- a/pcep/pcep-artifacts/pom.xml +++ b/pcep/pcep-artifacts/pom.xml @@ -122,6 +122,13 @@ pcep-topology-stats ${project.version} + + ${project.groupId} + pcep-config-example + ${project.version} + xml + network-topology-pcep-initial-config + ${project.groupId} @@ -200,6 +207,13 @@ xml ${project.version} + + ${project.groupId} + odl-bgpcep-pcep-config-example + features + xml + ${project.version} + ${project.groupId} odl-bgpcep-pcep-topology-stats diff --git a/pcep/pom.xml b/pcep/pom.xml index 9d47a009be..e632fea99a 100644 --- a/pcep/pom.xml +++ b/pcep/pom.xml @@ -45,6 +45,7 @@ segment-routing pcc-mock auto-bandwidth-extension + config-example