From 152ec1037001b867890aaaffe8a9e38a85b501b2 Mon Sep 17 00:00:00 2001 From: Maros Marsalek Date: Tue, 12 Apr 2016 16:19:31 +0200 Subject: HONEYCOMB-8: Fix netconf monitoring operational data provisioning Local storage for netconf monitoring was not wired with netconf northbound for vpp. Change-Id: I864614ffcbf7acf16eccc65ab58b9821b2682f93 Signed-off-by: Maros Marsalek --- v3po/data-impl/pom.xml | 13 + .../v3po/data/impl/OperationalDataTree.java | 43 ++- .../impl/rev160411/OperationalDataTreeModule.java | 2 +- v3po/data-impl/src/main/yang/data-impl.yang | 10 + .../v3po/data/impl/OperationalDataTreeTest.java | 18 +- v3po/impl/pom.xml | 12 + v3po/impl/src/main/config/default-config.xml | 71 +++++ v3po/impl/src/main/config/netconf-north-config.xml | 290 ++++++++++----------- .../rev141210/NetconfMonitoringReaderModule.java | 28 ++ .../NetconfMonitoringReaderModuleFactory.java | 13 + v3po/impl/src/main/yang/v3po-impl.yang | 21 ++ .../translate/util/read/BindingBrokerReader.java | 67 +++++ .../translate/util/read/NoopReaderCustomizer.java | 4 +- .../v3po/vppstate/BridgeDomainCustomizer.java | 7 + 14 files changed, 431 insertions(+), 168 deletions(-) create mode 100644 v3po/impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/v3po/impl/rev141210/NetconfMonitoringReaderModule.java create mode 100644 v3po/impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/v3po/impl/rev141210/NetconfMonitoringReaderModuleFactory.java create mode 100644 v3po/translate-utils/src/main/java/io/fd/honeycomb/v3po/translate/util/read/BindingBrokerReader.java (limited to 'v3po') diff --git a/v3po/data-impl/pom.xml b/v3po/data-impl/pom.xml index 954d25c30..1d716a6d9 100644 --- a/v3po/data-impl/pom.xml +++ b/v3po/data-impl/pom.xml @@ -54,6 +54,19 @@ 1.3.0-Beryllium + + + org.opendaylight.netconf + ietf-netconf-monitoring + 1.0.0-Beryllium + + + + org.opendaylight.netconf + ietf-netconf-monitoring-extension + 1.0.0-Beryllium + + junit diff --git a/v3po/data-impl/src/main/java/io/fd/honeycomb/v3po/data/impl/OperationalDataTree.java b/v3po/data-impl/src/main/java/io/fd/honeycomb/v3po/data/impl/OperationalDataTree.java index de737c729..5d3b00646 100644 --- a/v3po/data-impl/src/main/java/io/fd/honeycomb/v3po/data/impl/OperationalDataTree.java +++ b/v3po/data-impl/src/main/java/io/fd/honeycomb/v3po/data/impl/OperationalDataTree.java @@ -35,6 +35,10 @@ import java.util.Collection; import java.util.Map; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; +import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker; +import org.opendaylight.controller.md.sal.dom.api.DOMDataReadOnlyTransaction; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.NetconfState; import org.opendaylight.yangtools.binding.data.codec.api.BindingNormalizedNodeSerializer; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; @@ -64,17 +68,20 @@ public final class OperationalDataTree implements ReadableDataTree { private final BindingNormalizedNodeSerializer serializer; private final ReaderRegistry readerRegistry; private final SchemaContext globalContext; + private final DOMDataBroker netconfMonitoringDomDataBrokerDependency; /** * Creates operational data tree instance. - * - * @param serializer service for serialization between Java Binding Data representation and NormalizedNode + * @param serializer service for serialization between Java Binding Data representation and NormalizedNode * representation. * @param globalContext service for obtaining top level context data from all yang modules. * @param readerRegistry service responsible for translation between DataObjects and data provider. + * @param netconfMonitoringDomDataBrokerDependency */ public OperationalDataTree(@Nonnull BindingNormalizedNodeSerializer serializer, - @Nonnull final SchemaContext globalContext, @Nonnull ReaderRegistry readerRegistry) { + @Nonnull final SchemaContext globalContext, @Nonnull ReaderRegistry readerRegistry, + final DOMDataBroker netconfMonitoringDomDataBrokerDependency) { + this.netconfMonitoringDomDataBrokerDependency = netconfMonitoringDomDataBrokerDependency; this.globalContext = checkNotNull(globalContext, "globalContext should not be null"); this.serializer = checkNotNull(serializer, "serializer should not be null"); this.readerRegistry = checkNotNull(readerRegistry, "reader should not be null"); @@ -99,8 +106,14 @@ public final class OperationalDataTree implements ReadableDataTree { } private Optional> readNode(final YangInstanceIdentifier yangInstanceIdentifier, - final ReadContext ctx) - throws ReadFailedException { + final ReadContext ctx) throws ReadFailedException { + + // FIXME workaround for: https://git.opendaylight.org/gerrit/#/c/37499/ + if(yangInstanceIdentifier.getPathArguments().size() > 0 && + yangInstanceIdentifier.getPathArguments().get(0).getNodeType().equals(NetconfState.QNAME)) { + return readFromNetconfDs(yangInstanceIdentifier); + } + LOG.debug("OperationalDataTree.readNode(), yangInstanceIdentifier={}", yangInstanceIdentifier); final InstanceIdentifier path = serializer.fromYangInstanceIdentifier(yangInstanceIdentifier); checkNotNull(path, "Invalid instance identifier %s. Cannot create BA equivalent.", yangInstanceIdentifier); @@ -117,6 +130,19 @@ public final class OperationalDataTree implements ReadableDataTree { } } + // FIXME workaround for: https://git.opendaylight.org/gerrit/#/c/37499/ + private Optional> readFromNetconfDs(final YangInstanceIdentifier yangInstanceIdentifier) + throws ReadFailedException { + try(final DOMDataReadOnlyTransaction domDataReadOnlyTransaction = + netconfMonitoringDomDataBrokerDependency.newReadOnlyTransaction()) { + try { + return domDataReadOnlyTransaction.read(LogicalDatastoreType.OPERATIONAL, yangInstanceIdentifier).checkedGet(); + } catch (org.opendaylight.controller.md.sal.common.api.data.ReadFailedException e) { + throw new ReadFailedException(InstanceIdentifier.create(NetconfState.class), e); + } + } + } + private Optional> readRoot(final ReadContext ctx) throws ReadFailedException { LOG.debug("OperationalDataTree.readRoot()"); @@ -134,6 +160,13 @@ public final class OperationalDataTree implements ReadableDataTree { dataNodeBuilder.withChild((DataContainerChild) node); } + // FIXME workaround for: https://git.opendaylight.org/gerrit/#/c/37499/ + final Optional> normalizedNodeOptional = + readFromNetconfDs(YangInstanceIdentifier.builder().node(NetconfState.QNAME).build()); + if(normalizedNodeOptional.isPresent()) { + dataNodeBuilder.withChild((DataContainerChild) normalizedNodeOptional.get()); + } + return Optional.>of(dataNodeBuilder.build()); } diff --git a/v3po/data-impl/src/main/java/org/opendaylight/yang/gen/v1/urn/honeycomb/params/xml/ns/yang/data/impl/rev160411/OperationalDataTreeModule.java b/v3po/data-impl/src/main/java/org/opendaylight/yang/gen/v1/urn/honeycomb/params/xml/ns/yang/data/impl/rev160411/OperationalDataTreeModule.java index 24a1ca519..2fbba75fa 100644 --- a/v3po/data-impl/src/main/java/org/opendaylight/yang/gen/v1/urn/honeycomb/params/xml/ns/yang/data/impl/rev160411/OperationalDataTreeModule.java +++ b/v3po/data-impl/src/main/java/org/opendaylight/yang/gen/v1/urn/honeycomb/params/xml/ns/yang/data/impl/rev160411/OperationalDataTreeModule.java @@ -38,7 +38,7 @@ public class OperationalDataTreeModule extends LOG.debug("OperationalDataTreeModule.createInstance()"); return new CloseableOperationalDataTree( new OperationalDataTree(getSerializerDependency(), getSchemaServiceDependency().getGlobalContext(), - getReaderRegistryDependency())); + getReaderRegistryDependency(), getNetconfMonitoringDomDataBrokerDependency())); } private static final class CloseableOperationalDataTree implements ReadableDataTree, AutoCloseable { diff --git a/v3po/data-impl/src/main/yang/data-impl.yang b/v3po/data-impl/src/main/yang/data-impl.yang index 43201a084..5275e6556 100644 --- a/v3po/data-impl/src/main/yang/data-impl.yang +++ b/v3po/data-impl/src/main/yang/data-impl.yang @@ -121,6 +121,16 @@ module data-impl { } } + // FIXME workaround for: https://git.opendaylight.org/gerrit/#/c/37499/ + container netconf-monitoring-dom-data-broker { + uses config:service-ref { + refine type { + mandatory true; + config:required-identity dom:dom-async-data-broker; + } + } + } + } } } \ No newline at end of file diff --git a/v3po/data-impl/src/test/java/io/fd/honeycomb/v3po/data/impl/OperationalDataTreeTest.java b/v3po/data-impl/src/test/java/io/fd/honeycomb/v3po/data/impl/OperationalDataTreeTest.java index fbd512915..7e6abcdcd 100644 --- a/v3po/data-impl/src/test/java/io/fd/honeycomb/v3po/data/impl/OperationalDataTreeTest.java +++ b/v3po/data-impl/src/test/java/io/fd/honeycomb/v3po/data/impl/OperationalDataTreeTest.java @@ -34,15 +34,20 @@ import com.google.common.collect.Iterables; import com.google.common.collect.LinkedListMultimap; import com.google.common.collect.Multimap; import com.google.common.util.concurrent.CheckedFuture; +import com.google.common.util.concurrent.Futures; import io.fd.honeycomb.v3po.translate.read.ReadContext; import io.fd.honeycomb.v3po.translate.read.ReaderRegistry; +import java.util.Collections; import java.util.Map; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; +import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException; -import org.opendaylight.yangtools.binding.data.codec.api.BindingNormalizedNodeSerializer; +import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker; +import org.opendaylight.controller.md.sal.dom.api.DOMDataReadOnlyTransaction; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VppState; +import org.opendaylight.yangtools.binding.data.codec.api.BindingNormalizedNodeSerializer; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.common.QName; @@ -72,12 +77,20 @@ public class OperationalDataTreeTest { private DataSchemaNode schemaNode; @Mock private ReadContext readCtx; + @Mock + private DOMDataBroker netconfMonitoringBroker; + @Mock + private DOMDataReadOnlyTransaction domDataReadOnlyTransaction; @Before public void setUp() { initMocks(this); - operationalData = new OperationalDataTree(serializer, globalContext, reader); + operationalData = new OperationalDataTree(serializer, globalContext, reader, netconfMonitoringBroker); doReturn(schemaNode).when(globalContext).getDataChildByName(any(QName.class)); + + doReturn(domDataReadOnlyTransaction).when(netconfMonitoringBroker).newReadOnlyTransaction(); + doReturn(Futures.immediateCheckedFuture(Optional.absent())).when(domDataReadOnlyTransaction) + .read(any(LogicalDatastoreType.class), any(YangInstanceIdentifier.class)); } @Test @@ -85,6 +98,7 @@ public class OperationalDataTreeTest { final YangInstanceIdentifier yangId = mock(YangInstanceIdentifier.class); final YangInstanceIdentifier.PathArgument pArg = mock(YangInstanceIdentifier.PathArgument.class); doReturn(pArg).when(yangId).getLastPathArgument(); + doReturn(Collections.singletonList(pArg)).when(yangId).getPathArguments(); doReturn(QName.create("namespace", "2012-12-12", "local")).when(pArg).getNodeType(); doReturn(id).when(serializer).fromYangInstanceIdentifier(yangId); diff --git a/v3po/impl/pom.xml b/v3po/impl/pom.xml index c00c98396..afad4b8f2 100644 --- a/v3po/impl/pom.xml +++ b/v3po/impl/pom.xml @@ -54,6 +54,18 @@ vpp-cfg-init ${project.version} + + + org.opendaylight.netconf + ietf-netconf-monitoring + 1.0.0-Beryllium + + + org.opendaylight.netconf + ietf-netconf-monitoring-extension + 1.0.0-Beryllium + + io.fd.vpp diff --git a/v3po/impl/src/main/config/default-config.xml b/v3po/impl/src/main/config/default-config.xml index 518a6fa58..fac06e136 100644 --- a/v3po/impl/src/main/config/default-config.xml +++ b/v3po/impl/src/main/config/default-config.xml @@ -66,6 +66,48 @@ + + + prefix:inmemory-config-datastore-provider + netconf-config-store-service + + + dom:schema-service + yang-schema-service + + + + + prefix:inmemory-operational-datastore-provider + netconf-operational-store-service + + + dom:schema-service + yang-schema-service + + + + + prefix:dom-inmemory-data-broker + netconf-inmemory-data-broker + + + dom:schema-service + yang-schema-service + + + + config-dom-store-spi:config-dom-datastore + netconf-config-store-service + + + + operational-dom-store-spi:operational-dom-datastore + netconf-operational-store-service + + + + prefix:honeycomb-operational-data-tree @@ -82,6 +124,10 @@ prefix:honeycomb-reader-registry read-registry + + dom:dom-async-data-broker + netconf-inmemory-data-broker + @@ -212,6 +258,31 @@ + + + + config-dom-store-spi:config-dom-datastore + + netconf-config-store-service + /modules/module[type='inmemory-config-datastore-provider'][name='netconf-config-store-service'] + + + + operational-dom-store-spi:operational-dom-datastore + + netconf-operational-store-service + /modules/module[type='inmemory-operational-datastore-provider'][name='netconf-operational-store-service'] + + + + dom:dom-async-data-broker + + netconf-inmemory-data-broker + /modules/module[type='dom-inmemory-data-broker'][name='netconf-inmemory-data-broker'] + + + + dom:dom-async-data-broker diff --git a/v3po/impl/src/main/config/netconf-north-config.xml b/v3po/impl/src/main/config/netconf-north-config.xml index fc913fcb1..f7f0629d4 100644 --- a/v3po/impl/src/main/config/netconf-north-config.xml +++ b/v3po/impl/src/main/config/netconf-north-config.xml @@ -23,45 +23,7 @@ - - prefix:inmemory-config-datastore-provider - netconf-config-store-service - - - dom:schema-service - yang-schema-service - - - - - prefix:inmemory-operational-datastore-provider - netconf-operational-store-service - - - dom:schema-service - yang-schema-service - - - - - prefix:dom-inmemory-data-broker - netconf-inmemory-data-broker - - - dom:schema-service - yang-schema-service - - - config-dom-store-spi:config-dom-datastore - netconf-config-store-service - - - - operational-dom-store-spi:operational-dom-datastore - netconf-operational-store-service - - @@ -318,31 +280,41 @@ 7777 + + + prefix:netconf-monitoring-reader + netconf-monitoring-reader + + binding:binding-async-data-broker + netconf-binding-data-broker + + + + + + + + + + + + + - - - config-dom-store-spi:config-dom-datastore - - netconf-config-store-service - /modules/module[type='inmemory-config-datastore-provider'][name='netconf-config-store-service'] - - - - operational-dom-store-spi:operational-dom-datastore - - netconf-operational-store-service - /modules/module[type='inmemory-operational-datastore-provider'][name='netconf-operational-store-service'] - - - dom:dom-async-data-broker + prefix:honeycomb-reader - netconf-inmemory-data-broker - /modules/module[type='dom-inmemory-data-broker'][name='netconf-inmemory-data-broker'] + netconf-monitoring-reader + /modules/module[type='netconf-monitoring-reader'][name='netconf-monitoring-reader'] + + + binding:binding-async-data-broker @@ -359,108 +331,108 @@ - - - prefix:netconf-server-monitoring - - - vpp-server-monitor - /modules/module[type='netconf-server-monitoring-impl'][name='vpp-server-monitor'] - - - - - - prefix:netconf-northbound-mapper - - - netconf-vpp-mapper - /modules/module[type='netconf-mdsal-mapper'][name='netconf-vpp-mapper'] - - - - - prefix:netconf-northbound-mapper - - - vpp-mapper-aggregator - /modules/module[type='netconf-mapper-aggregator'][name='vpp-mapper-aggregator'] - - - - - prefix:netconf-mapper-registry - - - vpp-mapper-aggregator-registry - /modules/module[type='netconf-mapper-aggregator'][name='vpp-mapper-aggregator'] - - - - - prefix:netconf-server-dispatcher - - - netconf-vpp-server-dispatcher - - /modules/module[type='netconf-server-dispatcher-impl'][name='netconf-vpp-server-dispatcher'] - - - - - - prefix:netconf-northbound-mapper - - - netconf-vpp-notification-mapper - - /modules/module[type='netconf-mdsal-notification-mapper'][name='netconf-vpp-notification-mapper'] - - - - - - prefix:netconf-notification-collector - - - vpp-netconf-notification-manager - - /modules/module[type='netconf-notification-manager'][name='vpp-netconf-notification-manager'] - - - - - - prefix:netconf-notification-registry - - - vpp-netconf-notification-manager - - /modules/module[type='netconf-notification-manager'][name='vpp-netconf-notification-manager'] - - - - + + + prefix:netconf-server-monitoring + + + vpp-server-monitor + /modules/module[type='netconf-server-monitoring-impl'][name='vpp-server-monitor'] + + + + + + prefix:netconf-northbound-mapper + + + netconf-vpp-mapper + /modules/module[type='netconf-mdsal-mapper'][name='netconf-vpp-mapper'] + + + + + prefix:netconf-northbound-mapper + + + vpp-mapper-aggregator + /modules/module[type='netconf-mapper-aggregator'][name='vpp-mapper-aggregator'] + + + + + prefix:netconf-mapper-registry + + + vpp-mapper-aggregator-registry + /modules/module[type='netconf-mapper-aggregator'][name='vpp-mapper-aggregator'] + + + + + prefix:netconf-server-dispatcher + + + netconf-vpp-server-dispatcher + + /modules/module[type='netconf-server-dispatcher-impl'][name='netconf-vpp-server-dispatcher'] + + + + + + prefix:netconf-northbound-mapper + + + netconf-vpp-notification-mapper + + /modules/module[type='netconf-mdsal-notification-mapper'][name='netconf-vpp-notification-mapper'] + + + + + + prefix:netconf-notification-collector + + + vpp-netconf-notification-manager + + /modules/module[type='netconf-notification-manager'][name='vpp-netconf-notification-manager'] + + + + + + prefix:netconf-notification-registry + + + vpp-netconf-notification-manager + + /modules/module[type='netconf-notification-manager'][name='vpp-netconf-notification-manager'] + + + + - - - - urn:opendaylight:params:xml:ns:yang:v3po:impl?module=v3po-impl&revision=2014-12-10 - urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding?module=opendaylight-md-sal-binding&revision=2013-10-28 - urn:opendaylight:params:xml:ns:yang:controller:netconf:mdsal:mapper?module=netconf-mdsal-mapper&revision=2015-01-14 - - urn:opendaylight:params:xml:ns:yang:controller:netconf:mdsal:monitoring?module=netconf-mdsal-monitoring&revision=2015-02-18 - - urn:opendaylight:params:xml:ns:yang:controller:netconf:northbound:ssh?module=netconf-northbound-ssh&revision=2015-01-14 - urn:opendaylight:params:xml:ns:yang:controller:netconf:northbound:tcp?module=netconf-northbound-tcp&revision=2015-04-23 - - urn:opendaylight:params:xml:ns:yang:controller:config:netconf:northbound:impl?module=netconf-northbound-impl&revision=2015-01-12 - - - urn:opendaylight:params:xml:ns:yang:controller:threadpool:impl:scheduled?module=threadpool-impl-scheduled&revision=2013-12-01 - - - urn:opendaylight:params:xml:ns:yang:controller:netconf:mdsal:notification?module=netconf-mdsal-notification&revision=2015-08-03 - - + + + + urn:opendaylight:params:xml:ns:yang:v3po:impl?module=v3po-impl&revision=2014-12-10 + urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding?module=opendaylight-md-sal-binding&revision=2013-10-28 + urn:opendaylight:params:xml:ns:yang:controller:netconf:mdsal:mapper?module=netconf-mdsal-mapper&revision=2015-01-14 + + urn:opendaylight:params:xml:ns:yang:controller:netconf:mdsal:monitoring?module=netconf-mdsal-monitoring&revision=2015-02-18 + + urn:opendaylight:params:xml:ns:yang:controller:netconf:northbound:ssh?module=netconf-northbound-ssh&revision=2015-01-14 + urn:opendaylight:params:xml:ns:yang:controller:netconf:northbound:tcp?module=netconf-northbound-tcp&revision=2015-04-23 + + urn:opendaylight:params:xml:ns:yang:controller:config:netconf:northbound:impl?module=netconf-northbound-impl&revision=2015-01-12 + + + urn:opendaylight:params:xml:ns:yang:controller:threadpool:impl:scheduled?module=threadpool-impl-scheduled&revision=2013-12-01 + + + urn:opendaylight:params:xml:ns:yang:controller:netconf:mdsal:notification?module=netconf-mdsal-notification&revision=2015-08-03 + + diff --git a/v3po/impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/v3po/impl/rev141210/NetconfMonitoringReaderModule.java b/v3po/impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/v3po/impl/rev141210/NetconfMonitoringReaderModule.java new file mode 100644 index 000000000..feb7768a2 --- /dev/null +++ b/v3po/impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/v3po/impl/rev141210/NetconfMonitoringReaderModule.java @@ -0,0 +1,28 @@ +package org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.impl.rev141210; + +import io.fd.honeycomb.v3po.translate.util.read.BindingBrokerReader; +import io.fd.honeycomb.v3po.translate.util.read.CloseableReader; +import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.NetconfState; + +public class NetconfMonitoringReaderModule extends org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.impl.rev141210.AbstractNetconfMonitoringReaderModule { + public NetconfMonitoringReaderModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { + super(identifier, dependencyResolver); + } + + public NetconfMonitoringReaderModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.impl.rev141210.NetconfMonitoringReaderModule oldModule, java.lang.AutoCloseable oldInstance) { + super(identifier, dependencyResolver, oldModule, oldInstance); + } + + @Override + public void customValidation() { + // add custom validation form module attributes here. + } + + @Override + public java.lang.AutoCloseable createInstance() { + return new CloseableReader<>(new BindingBrokerReader<>(NetconfState.class, getNetconfMonitoringBindingBrokerDependency(), + LogicalDatastoreType.OPERATIONAL)); + } + +} diff --git a/v3po/impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/v3po/impl/rev141210/NetconfMonitoringReaderModuleFactory.java b/v3po/impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/v3po/impl/rev141210/NetconfMonitoringReaderModuleFactory.java new file mode 100644 index 000000000..b8b7bec63 --- /dev/null +++ b/v3po/impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/v3po/impl/rev141210/NetconfMonitoringReaderModuleFactory.java @@ -0,0 +1,13 @@ +/* +* Generated file +* +* Generated from: yang module name: v3po-impl yang module local name: netconf-monitoring-reader +* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator +* Generated at: Tue Apr 12 13:03:40 CEST 2016 +* +* Do not modify this file unless it is present under src/main directory +*/ +package org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.impl.rev141210; +public class NetconfMonitoringReaderModuleFactory extends org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.impl.rev141210.AbstractNetconfMonitoringReaderModuleFactory { + +} diff --git a/v3po/impl/src/main/yang/v3po-impl.yang b/v3po/impl/src/main/yang/v3po-impl.yang index d6fd25199..9509b02ec 100644 --- a/v3po/impl/src/main/yang/v3po-impl.yang +++ b/v3po/impl/src/main/yang/v3po-impl.yang @@ -127,4 +127,25 @@ module v3po-impl { } } + + identity netconf-monitoring-reader { + base config:module-type; + config:provided-service tapi:honeycomb-reader; + } + + augment "/config:modules/config:module/config:configuration" { + case netconf-monitoring-reader { + when "/config:modules/config:module/config:type = 'netconf-monitoring-reader'"; + + container netconf-monitoring-binding-broker { + uses config:service-ref { + refine type { + mandatory true; + config:required-identity md-sal-binding:binding-async-data-broker; + } + } + } + + } + } } diff --git a/v3po/translate-utils/src/main/java/io/fd/honeycomb/v3po/translate/util/read/BindingBrokerReader.java b/v3po/translate-utils/src/main/java/io/fd/honeycomb/v3po/translate/util/read/BindingBrokerReader.java new file mode 100644 index 000000000..58695cf8b --- /dev/null +++ b/v3po/translate-utils/src/main/java/io/fd/honeycomb/v3po/translate/util/read/BindingBrokerReader.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2016 Cisco and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.fd.honeycomb.v3po.translate.util.read; + +import com.google.common.base.Optional; +import com.google.common.util.concurrent.CheckedFuture; +import io.fd.honeycomb.v3po.translate.read.ReadContext; +import io.fd.honeycomb.v3po.translate.read.ReadFailedException; +import io.fd.honeycomb.v3po.translate.read.Reader; +import javax.annotation.Nonnull; +import org.opendaylight.controller.md.sal.binding.api.DataBroker; +import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction; +import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; +import org.opendaylight.yangtools.yang.binding.DataObject; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; + +/** + * Simple DataBroker backed reader allowing to delegate reads to different brokers + */ +public final class BindingBrokerReader implements Reader { + + private final InstanceIdentifier instanceIdentifier; + private final DataBroker dataBroker; + private final LogicalDatastoreType datastoreType; + + public BindingBrokerReader(final Class managedDataObjectType, final DataBroker dataBroker, + final LogicalDatastoreType datastoreType) { + this.dataBroker = dataBroker; + this.datastoreType = datastoreType; + this.instanceIdentifier = InstanceIdentifier.create(managedDataObjectType); + } + + @Nonnull + @Override + public Optional read(@Nonnull final InstanceIdentifier id, + @Nonnull final ReadContext ctx) throws ReadFailedException { + try (final ReadOnlyTransaction readOnlyTransaction = dataBroker.newReadOnlyTransaction()) { + final CheckedFuture, org.opendaylight.controller.md.sal.common.api.data.ReadFailedException> + read = readOnlyTransaction.read(datastoreType, id); + try { + return read.checkedGet(); + } catch (org.opendaylight.controller.md.sal.common.api.data.ReadFailedException e) { + throw new ReadFailedException(id, e); + } + } + } + + @Nonnull + @Override + public InstanceIdentifier getManagedDataObjectType() { + return instanceIdentifier; + } +} diff --git a/v3po/translate-utils/src/main/java/io/fd/honeycomb/v3po/translate/util/read/NoopReaderCustomizer.java b/v3po/translate-utils/src/main/java/io/fd/honeycomb/v3po/translate/util/read/NoopReaderCustomizer.java index 5ed033755..3b703da3f 100644 --- a/v3po/translate-utils/src/main/java/io/fd/honeycomb/v3po/translate/util/read/NoopReaderCustomizer.java +++ b/v3po/translate-utils/src/main/java/io/fd/honeycomb/v3po/translate/util/read/NoopReaderCustomizer.java @@ -17,6 +17,7 @@ package io.fd.honeycomb.v3po.translate.util.read; import io.fd.honeycomb.v3po.translate.Context; +import io.fd.honeycomb.v3po.translate.read.ReadFailedException; import io.fd.honeycomb.v3po.translate.spi.read.RootReaderCustomizer; import org.opendaylight.yangtools.concepts.Builder; import org.opendaylight.yangtools.yang.binding.DataObject; @@ -26,7 +27,8 @@ public abstract class NoopReaderCustomizer { @Override - public void readCurrentAttributes(InstanceIdentifier id, final B builder, final Context context) { + public void readCurrentAttributes(InstanceIdentifier id, final B builder, final Context context) throws + ReadFailedException { // Noop } } diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/v3po/translate/v3po/vppstate/BridgeDomainCustomizer.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/v3po/translate/v3po/vppstate/BridgeDomainCustomizer.java index 39f164e4b..e0c193f89 100644 --- a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/v3po/translate/v3po/vppstate/BridgeDomainCustomizer.java +++ b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/v3po/translate/v3po/vppstate/BridgeDomainCustomizer.java @@ -21,6 +21,7 @@ import io.fd.honeycomb.v3po.translate.spi.read.ListReaderCustomizer; import io.fd.honeycomb.v3po.translate.v3po.util.VppApiCustomizer; import io.fd.honeycomb.v3po.translate.Context; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import javax.annotation.Nonnull; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.PhysAddress; @@ -142,6 +143,12 @@ public final class BridgeDomainCustomizer extends VppApiCustomizer @Override public List getAllIds(@Nonnull final InstanceIdentifier id, @Nonnull final Context context) { final int[] bIds = getVppApi().bridgeDomainDump(-1); + + if(bIds == null) { + // No bridge domains + return Collections.emptyList(); + } + LOG.debug("vppstate.BridgeDomainCustomizer.getAllIds: bIds.length={}", bIds.length); final List allIds = new ArrayList<>(bIds.length); for (int bId : bIds) { -- cgit 1.2.3-korg