HONEYCOMB-34: Config tree initialization using binding data broker
authorMarek Gradzki <[email protected]>
Mon, 11 Apr 2016 19:23:57 +0000 (21:23 +0200)
committerMarek Gradzki <[email protected]>
Tue, 12 Apr 2016 09:05:25 +0000 (11:05 +0200)
Change-Id: I070aca2cc35dd10ea5bde19c8cbf4cad1c50f468
Signed-off-by: Marek Gradzki <[email protected]>
26 files changed:
v3po/data-api/src/main/java/io/fd/honeycomb/v3po/data/ModifiableDataTree.java
v3po/data-impl/src/main/java/io/fd/honeycomb/v3po/data/impl/ConfigDataTree.java
v3po/data-impl/src/main/java/org/opendaylight/yang/gen/v1/urn/honeycomb/params/xml/ns/yang/data/impl/rev160411/ConfigDataTreeModule.java
v3po/data-impl/src/main/java/org/opendaylight/yang/gen/v1/urn/honeycomb/params/xml/ns/yang/data/impl/rev160411/InMemoryConfigDataTreeModule.java [new file with mode: 0644]
v3po/data-impl/src/main/java/org/opendaylight/yang/gen/v1/urn/honeycomb/params/xml/ns/yang/data/impl/rev160411/InMemoryConfigDataTreeModuleFactory.java [new file with mode: 0644]
v3po/data-impl/src/main/java/org/opendaylight/yang/gen/v1/urn/honeycomb/params/xml/ns/yang/data/impl/rev160411/OperationalDataTreeModule.java
v3po/data-impl/src/main/yang/data-impl.yang
v3po/impl/src/main/config/default-config.xml
v3po/impl/src/main/java/io/fd/honeycomb/v3po/impl/V3poProvider.java
v3po/impl/src/main/java/io/fd/honeycomb/v3po/impl/VppDataBrokerInitializationProvider.java
v3po/impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/v3po/impl/rev141210/DataBrokerModule.java
v3po/impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/v3po/impl/rev141210/V3poModule.java
v3po/impl/src/main/yang/v3po-impl.yang
v3po/impl/src/test/java/io/fd/honeycomb/v3po/impl/data/VppDataBrokerInitializationProviderTest.java
v3po/impl/src/test/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/v3po/impl/rev141210/V3poModuleTest.java
v3po/translate-utils/src/main/java/io/fd/honeycomb/v3po/translate/util/write/CloseableWriterRegistry.java [new file with mode: 0644]
v3po/translate-utils/src/main/java/io/fd/honeycomb/v3po/translate/util/write/NoopWriterRegistry.java [new file with mode: 0644]
v3po/translate-utils/src/main/java/org/opendaylight/yang/gen/v1/urn/honeycomb/params/xml/ns/yang/translate/utils/rev160406/DelegatingWriterRegistryModule.java
v3po/translate-utils/src/main/java/org/opendaylight/yang/gen/v1/urn/honeycomb/params/xml/ns/yang/translate/utils/rev160406/NoopWriterRegistryModule.java [new file with mode: 0644]
v3po/translate-utils/src/main/java/org/opendaylight/yang/gen/v1/urn/honeycomb/params/xml/ns/yang/translate/utils/rev160406/NoopWriterRegistryModuleFactory.java [new file with mode: 0644]
v3po/translate-utils/src/main/yang/translate-utils.yang
v3po/vpp-cfg-init/src/main/java/io/fd/honeycomb/v3po/vpp/data/init/AbstractDataTreeConverter.java
v3po/vpp-cfg-init/src/main/java/io/fd/honeycomb/v3po/vpp/data/init/VppInitializer.java
v3po/vpp-cfg-init/src/main/java/org/opendaylight/yang/gen/v1/urn/honeycomb/params/xml/ns/yang/vpp/data/init/rev160407/VppConfigurationInitializerModule.java
v3po/vpp-cfg-init/src/main/yang/vpp-cfg-init.yang
v3po/vpp-cfg-init/src/test/java/io/fd/honeycomb/v3po/vpp/data/init/InitializerRegistryImplTest.java

index a3b5c9c..8b21ddf 100644 (file)
@@ -35,14 +35,6 @@ public interface ModifiableDataTree {
      */
     void modify(final DataTreeModification modification) throws DataValidationFailedException, TranslationException;
 
-    /**
-     * Initializes data tree using supplied modification.
-     *
-     * @param modification data tree modification
-     * @throws DataValidationFailedException if modification data is not valid
-     */
-    void initialize(final DataTreeModification modification) throws DataValidationFailedException;
-
     /**
      * Creates read-only snapshot of a ModifiableDataTree.
      *
index b90a57a..ab4cf64 100644 (file)
@@ -137,14 +137,6 @@ public final class ConfigDataTree implements ModifiableDataTree {
         dataTree.commit(candidate);
     }
 
-    @Override
-    public void initialize(final DataTreeModification modification) throws DataValidationFailedException {
-        LOG.debug("ConfigDataTree.initialize");
-        dataTree.validate(modification);
-        final DataTreeCandidate candidate = dataTree.prepare(modification);
-        dataTree.commit(candidate);
-    }
-
     private Map<InstanceIdentifier<?>, DataObject> extractNetconfData(
             final Optional<NormalizedNode<?, ?>> parentOptional) {
         if (parentOptional.isPresent()) {
index 19267b1..86a3f9d 100644 (file)
@@ -4,11 +4,8 @@ import io.fd.honeycomb.v3po.data.DataTreeSnapshot;
 import io.fd.honeycomb.v3po.data.ModifiableDataTree;
 import io.fd.honeycomb.v3po.data.impl.ConfigDataTree;
 import io.fd.honeycomb.v3po.translate.TranslationException;
-import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTree;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeModification;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataValidationFailedException;
-import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType;
-import org.opendaylight.yangtools.yang.data.impl.schema.tree.InMemoryDataTreeFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -36,11 +33,9 @@ public class ConfigDataTreeModule extends
 
     @Override
     public java.lang.AutoCloseable createInstance() {
-        LOG.info("ConfigDataTreeModule.createInstance()");
-        final DataTree dataTree = InMemoryDataTreeFactory.getInstance().create(TreeType.CONFIGURATION);
-        dataTree.setSchemaContext(getSchemaServiceDependency().getGlobalContext());
+        LOG.debug("ConfigDataTreeModule.createInstance()");
         return new CloseableConfigDataTree(
-                new ConfigDataTree(getSerializerDependency(), dataTree, getWriterRegistryDependency()));
+                new ConfigDataTree(getSerializerDependency(), getDataTreeDependency(), getWriterRegistryDependency()));
     }
 
     private static final class CloseableConfigDataTree implements ModifiableDataTree, AutoCloseable {
@@ -53,7 +48,7 @@ public class ConfigDataTreeModule extends
 
         @Override
         public void close() throws Exception {
-            LOG.info("CloseableConfigDataTree.close()");
+            LOG.debug("CloseableConfigDataTree.close()");
             // NOP
         }
 
@@ -64,12 +59,6 @@ public class ConfigDataTreeModule extends
             delegate.modify(modification);
         }
 
-        @Override
-        public void initialize(final DataTreeModification modification) throws DataValidationFailedException {
-            LOG.trace("CloseableConfigDataTree.initialize modification={}", modification);
-            delegate.initialize(modification);
-        }
-
         @Override
         public DataTreeSnapshot takeSnapshot() {
             LOG.trace("CloseableConfigDataTree.takeSnapshot");
diff --git a/v3po/data-impl/src/main/java/org/opendaylight/yang/gen/v1/urn/honeycomb/params/xml/ns/yang/data/impl/rev160411/InMemoryConfigDataTreeModule.java b/v3po/data-impl/src/main/java/org/opendaylight/yang/gen/v1/urn/honeycomb/params/xml/ns/yang/data/impl/rev160411/InMemoryConfigDataTreeModule.java
new file mode 100644 (file)
index 0000000..9ae8a01
--- /dev/null
@@ -0,0 +1,81 @@
+package org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.data.impl.rev160411;
+
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTree;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeModification;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeSnapshot;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.DataValidationFailedException;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType;
+import org.opendaylight.yangtools.yang.data.impl.schema.tree.InMemoryDataTreeFactory;
+import org.opendaylight.yangtools.yang.model.api.SchemaContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class InMemoryConfigDataTreeModule extends org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.data.impl.rev160411.AbstractInMemoryConfigDataTreeModule {
+
+    private static final Logger LOG = LoggerFactory.getLogger(InMemoryConfigDataTreeModule.class);
+
+    public InMemoryConfigDataTreeModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
+        super(identifier, dependencyResolver);
+    }
+
+    public InMemoryConfigDataTreeModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.data.impl.rev160411.InMemoryConfigDataTreeModule 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() {
+        LOG.debug("InMemoryConfigDataTreeModule.createInstance()");
+        return new CloseableConfigDataTree(getSchemaServiceDependency().getGlobalContext());
+    }
+
+    private static class CloseableConfigDataTree implements AutoCloseable, DataTree {
+        private final DataTree dataTree;
+
+        public CloseableConfigDataTree(final SchemaContext schemaContext) {
+            this.dataTree = InMemoryDataTreeFactory.getInstance().create(TreeType.CONFIGURATION);
+            dataTree.setSchemaContext(schemaContext);
+        }
+
+        @Override
+        public void close() throws Exception {
+            // NOP
+        }
+
+        @Override
+        public DataTreeSnapshot takeSnapshot() {
+            return dataTree.takeSnapshot();
+        }
+
+        @Override
+        public void setSchemaContext(final SchemaContext newSchemaContext) {
+            dataTree.setSchemaContext(newSchemaContext);
+        }
+
+        @Override
+        public void commit(final DataTreeCandidate candidate) {
+            dataTree.commit(candidate);
+        }
+
+        @Override
+        public YangInstanceIdentifier getRootPath() {
+            return dataTree.getRootPath();
+        }
+
+        @Override
+        public void validate(final DataTreeModification modification) throws DataValidationFailedException {
+            dataTree.validate(modification);
+        }
+
+        @Override
+        public DataTreeCandidate prepare(final DataTreeModification modification) {
+            return dataTree.prepare(modification);
+        }
+    }
+}
diff --git a/v3po/data-impl/src/main/java/org/opendaylight/yang/gen/v1/urn/honeycomb/params/xml/ns/yang/data/impl/rev160411/InMemoryConfigDataTreeModuleFactory.java b/v3po/data-impl/src/main/java/org/opendaylight/yang/gen/v1/urn/honeycomb/params/xml/ns/yang/data/impl/rev160411/InMemoryConfigDataTreeModuleFactory.java
new file mode 100644 (file)
index 0000000..504e007
--- /dev/null
@@ -0,0 +1,13 @@
+/*
+* Generated file
+*
+* Generated from: yang module name: data-impl yang module local name: inmemory-config-data-tree
+* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
+* Generated at: Tue Apr 12 07:26:54 CEST 2016
+*
+* Do not modify this file unless it is present under src/main directory
+*/
+package org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.data.impl.rev160411;
+public class InMemoryConfigDataTreeModuleFactory extends org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.data.impl.rev160411.AbstractInMemoryConfigDataTreeModuleFactory {
+
+}
index 0034b12..24a1ca5 100644 (file)
@@ -35,7 +35,7 @@ public class OperationalDataTreeModule extends
 
     @Override
     public java.lang.AutoCloseable createInstance() {
-        LOG.info("OperationalDataTreeModule.createInstance()");
+        LOG.debug("OperationalDataTreeModule.createInstance()");
         return new CloseableOperationalDataTree(
                 new OperationalDataTree(getSerializerDependency(), getSchemaServiceDependency().getGlobalContext(),
                         getReaderRegistryDependency()));
@@ -51,7 +51,7 @@ public class OperationalDataTreeModule extends
 
         @Override
         public void close() throws Exception {
-            LOG.info("CloseableOperationalDataTree.close()");
+            LOG.debug("CloseableOperationalDataTree.close()");
             // NOP
         }
 
index a1dfee3..43201a0 100644 (file)
@@ -18,6 +18,32 @@ module data-impl {
             "Initial revision.";
     }
 
+    identity data-tree {
+        base "config:service-type";
+        config:java-class org.opendaylight.yangtools.yang.data.api.schema.tree.DataTree;
+    }
+
+    identity inmemory-config-data-tree {
+        base config:module-type;
+        config:provided-service data-tree;
+        config:java-name-prefix InMemoryConfigDataTree;
+    }
+
+    augment "/config:modules/config:module/config:configuration" {
+        case inmemory-config-data-tree {
+            when "/config:modules/config:module/config:type = 'inmemory-config-data-tree'";
+
+            container schema-service {
+                uses config:service-ref {
+                    refine type {
+                        mandatory true;
+                        config:required-identity dom:schema-service;
+                    }
+                }
+            }
+        }
+    }
+
     identity honeycomb-config-data-tree {
         base config:module-type;
         config:provided-service dapi:honeycomb-modifiable-data-tree;
@@ -28,11 +54,11 @@ module data-impl {
         case honeycomb-config-data-tree {
             when "/config:modules/config:module/config:type = 'honeycomb-config-data-tree'";
 
-            container schema-service {
+            container data-tree {
                 uses config:service-ref {
                     refine type {
                         mandatory true;
-                        config:required-identity dom:schema-service;
+                        config:required-identity data-tree;
                     }
                 }
             }
@@ -97,5 +123,4 @@ module data-impl {
 
         }
     }
-
 }
\ No newline at end of file
index 328d002..518a6fa 100644 (file)
           <name>write-registry</name>
         </module>
 
+        <!-- In-memory data tree for HC config data tree -->
         <module>
-          <type xmlns:prefix="urn:honeycomb:params:xml:ns:yang:data:impl">prefix:honeycomb-config-data-tree</type>
-          <name>config-data-tree</name>
+          <type xmlns:prefix="urn:honeycomb:params:xml:ns:yang:data:impl">prefix:inmemory-config-data-tree</type>
+          <name>inmemory-config-data-tree</name>
           <schema-service>
             <type xmlns:dom="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom">dom:schema-service</type>
             <name>yang-schema-service</name>
           </schema-service>
+        </module>
+
+
+        <!-- HC config data tree -->
+        <module>
+          <type xmlns:prefix="urn:honeycomb:params:xml:ns:yang:data:impl">prefix:honeycomb-config-data-tree</type>
+          <name>config-data-tree</name>
+          <data-tree>
+            <type xmlns:prefix="urn:honeycomb:params:xml:ns:yang:data:impl">prefix:data-tree</type>
+            <name>inmemory-config-data-tree</name>
+          </data-tree>
           <serializer>
             <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">prefix:binding-dom-mapping-service</type>
             <name>runtime-mapping-singleton</name>
@@ -54,6 +66,7 @@
           </writer-registry>
         </module>
 
+        <!-- HC operational data tree -->
         <module>
           <type xmlns:prefix="urn:honeycomb:params:xml:ns:yang:data:impl">prefix:honeycomb-operational-data-tree</type>
           <name>operational-data-tree</name>
@@ -71,6 +84,7 @@
           </reader-registry>
         </module>
 
+        <!-- DOM data broker which provides transaction functionality for HC using BI format-->
         <module>
           <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:v3po:impl">prefix:honeycomb-dom-data-broker</type>
           <name>honeycomb-dom-data-broker</name>
@@ -84,6 +98,7 @@
           </operational-data-tree>
         </module>
 
+        <!-- Binding data broker which provides transaction functionality for HC using BA format -->
         <module>
           <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">prefix:binding-forwarded-data-broker</type>
           <name>honeycomb-binding-data-broker</name>
             <type xmlns:prefix="urn:honeycomb:params:xml:ns:yang:vpp:japi:cfg">prefix:vpp-japi</type>
             <name>vpp-japi</name>
           </vpp-japi>
-          <reader-registry>
-            <type xmlns:prefix="urn:honeycomb:params:xml:ns:yang:translate:api">prefix:honeycomb-reader-registry</type>
-            <name>read-registry</name>
-          </reader-registry>
-          <writer-registry>
-            <type xmlns:prefix="urn:honeycomb:params:xml:ns:yang:translate:api">prefix:honeycomb-writer-registry</type>
-            <name>write-registry</name>
-          </writer-registry>
           <serializer>
             <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">prefix:binding-dom-mapping-service</type>
             <name>runtime-mapping-singleton</name>
           </serializer>
+          <dom-data-broker>
+            <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom">prefix:dom-async-data-broker</type>
+            <name>honeycomb-dom-data-broker</name>
+          </dom-data-broker>
+        </module>
+
+        <!-- Config initialization -->
+        <!-- Empty registry which does not pass data to VPP  -->
+        <module>
+          <type xmlns:prefix="urn:honeycomb:params:xml:ns:yang:translate:utils">prefix:noop-writer-registry</type>
+          <name>noop-writer-registry</name>
+        </module>
+        <!-- Config data tree which does not pass data to translation layer (uses noop-write-registry)  -->
+        <module>
+          <type xmlns:prefix="urn:honeycomb:params:xml:ns:yang:data:impl">prefix:honeycomb-config-data-tree</type>
+          <name>cfg-init-config-data-tree</name>
+          <data-tree>
+            <type xmlns:prefix="urn:honeycomb:params:xml:ns:yang:data:impl">prefix:data-tree</type>
+            <name>inmemory-config-data-tree</name>
+          </data-tree>
+          <serializer>
+            <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">prefix:binding-dom-mapping-service</type>
+            <name>runtime-mapping-singleton</name>
+          </serializer>
+          <writer-registry>
+            <type xmlns:prefix="urn:honeycomb:params:xml:ns:yang:translate:api">prefix:honeycomb-writer-registry</type>
+            <name>noop-writer-registry</name>
+          </writer-registry>
+        </module>
+        <!-- DOM data broker for config initialization -->
+        <module>
+          <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:v3po:impl">prefix:honeycomb-dom-data-broker</type>
+          <name>cfg-init-dom-data-broker</name>
           <config-data-tree>
             <type xmlns:prefix="urn:honeycomb:params:xml:ns:yang:data:api">prefix:honeycomb-modifiable-data-tree</type>
-            <name>config-data-tree</name>
+            <name>cfg-init-config-data-tree</name>
           </config-data-tree>
           <operational-data-tree>
             <type xmlns:prefix="urn:honeycomb:params:xml:ns:yang:data:api">prefix:honeycomb-readable-data-tree</type>
             <name>operational-data-tree</name>
           </operational-data-tree>
         </module>
-
+        <!-- Binding data broker for config initialization -->
+        <module>
+          <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">prefix:binding-forwarded-data-broker</type>
+          <name>cfg-init-binding-data-broker</name>
+          <binding-forwarded-data-broker xmlns="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">
+            <dom-async-broker>
+              <type xmlns:dom="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom">dom:dom-async-data-broker</type>
+              <name>cfg-init-dom-data-broker</name>
+            </dom-async-broker>
+            <schema-service>
+              <type xmlns:dom="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom">dom:schema-service</type>
+              <name>yang-schema-service</name>
+            </schema-service>
+            <binding-mapping-service>
+              <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">binding:binding-dom-mapping-service</type>
+              <name>runtime-mapping-singleton</name>
+            </binding-mapping-service>
+          </binding-forwarded-data-broker>
+        </module>
+        <!-- Config initializer -->
         <module>
           <type xmlns:prefix="urn:honeycomb:params:xml:ns:yang:vpp:data:init">prefix:vpp-cfg-initializer-impl</type>
           <name>vpp-cfg-initializer</name>
-          <reader-registry>
-            <type xmlns:prefix="urn:honeycomb:params:xml:ns:yang:translate:api">prefix:honeycomb-reader-registry</type>
-            <name>read-registry</name>
-          </reader-registry>
-          <config-data-tree>
-            <type xmlns:prefix="urn:honeycomb:params:xml:ns:yang:data:api">prefix:honeycomb-modifiable-data-tree</type>
-            <name>config-data-tree</name>
-          </config-data-tree>
-          <serializer>
-            <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">binding:binding-dom-mapping-service</type>
-            <name>runtime-mapping-singleton</name>
-          </serializer>
-        </module>
-
+          <binding-data-broker>
+            <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">prefix:binding-async-data-broker</type>
+            <name>cfg-init-binding-data-broker</name>
+          </binding-data-broker>
+        </module>noop-writer-registry
+        <!-- END: Config initialization -->
       </modules>
 
       <services xmlns="urn:opendaylight:params:xml:ns:yang:controller:config">
             <provider>/modules/module[type='delegating-writer-registry'][name='write-registry']</provider>
           </instance>
         </service>
+
+        <service>
+          <type xmlns:prefix="urn:honeycomb:params:xml:ns:yang:data:impl">prefix:data-tree</type>
+          <instance>
+            <name>inmemory-config-data-tree</name>
+            <provider>/modules/module[type='inmemory-config-data-tree'][name='inmemory-config-data-tree']
+            </provider>
+          </instance>
+        </service>
+
         <service>
           <type xmlns:prefix="urn:honeycomb:params:xml:ns:yang:data:api">prefix:honeycomb-modifiable-data-tree</type>
           <instance>
             </provider>
           </instance>
         </service>
-        <service>
-          <type xmlns:prefix="urn:honeycomb:params:xml:ns:yang:vpp:data:init">prefix:vpp-cfg-initializer</type>
-          <instance>
-            <name>vpp-cfg-initializer</name>
-            <provider>/modules/module[type='vpp-cfg-initializer-impl'][name='vpp-cfg-initializer']
-            </provider>
-          </instance>
-        </service>
         <service>
           <type xmlns:dom="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom">
             dom:dom-broker-osgi-registry
           </instance>
         </service>
 
+        <!-- Config initialization -->
+        <service>
+          <type xmlns:prefix="urn:honeycomb:params:xml:ns:yang:translate:api">prefix:honeycomb-writer-registry</type>
+          <instance>
+            <name>noop-writer-registry</name>
+            <provider>/modules/module[type='noop-writer-registry'][name='noop-writer-registry']</provider>
+          </instance>
+        </service>
+        <service>
+          <type xmlns:prefix="urn:honeycomb:params:xml:ns:yang:data:api">prefix:honeycomb-modifiable-data-tree</type>
+          <instance>
+            <name>cfg-init-config-data-tree</name>
+            <provider>/modules/module[type='honeycomb-config-data-tree'][name='cfg-init-config-data-tree']
+            </provider>
+          </instance>
+        </service>
+        <service>
+          <type xmlns:dom="urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom">dom:dom-async-data-broker</type>
+          <instance>
+            <name>cfg-init-dom-data-broker</name>
+            <provider>/modules/module[type='honeycomb-dom-data-broker'][name='cfg-init-dom-data-broker']</provider>
+          </instance>
+        </service>
+        <service>
+          <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">binding:binding-async-data-broker</type>
+          <instance>
+            <name>cfg-init-binding-data-broker</name>
+            <provider>/modules/module[type='binding-forwarded-data-broker'][name='cfg-init-binding-data-broker']</provider>
+          </instance>
+        </service>
+        <service>
+          <type xmlns:prefix="urn:honeycomb:params:xml:ns:yang:vpp:data:init">prefix:vpp-cfg-initializer</type>
+          <instance>
+            <name>vpp-cfg-initializer</name>
+            <provider>/modules/module[type='vpp-cfg-initializer-impl'][name='vpp-cfg-initializer']
+            </provider>
+          </instance>
+        </service>
+        <!-- END: Config initialization -->
+
       </services>
     </data>
   </configuration>
index 36eeb85..8ed83d5 100644 (file)
@@ -20,10 +20,6 @@ import com.google.common.base.Preconditions;
 import com.google.common.collect.Lists;
 import com.google.common.util.concurrent.CheckedFuture;
 import com.google.common.util.concurrent.Futures;
-import io.fd.honeycomb.v3po.data.ModifiableDataTree;
-import io.fd.honeycomb.v3po.data.ReadableDataTree;
-import io.fd.honeycomb.v3po.translate.read.ReaderRegistry;
-import io.fd.honeycomb.v3po.translate.write.WriterRegistry;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
@@ -71,31 +67,22 @@ public class V3poProvider implements BindingAwareProvider, AutoCloseable, Broker
     private static final Logger LOG = LoggerFactory.getLogger(V3poProvider.class);
     private final Broker domBroker;
     private final BindingNormalizedNodeSerializer serializer;
+    private final DOMDataBroker domDataBroker;
     private RpcRegistration<V3poService> v3poService;
     private VppIetfInterfaceListener vppInterfaceListener;
     private VppBridgeDomainListener vppBridgeDomainListener;
     private vppApi api;
-    private ReaderRegistry readerRegistry;
-    private WriterRegistry writerRegistry;
     private DataBroker db;
     VppPollOperDataImpl vppPollOperData;
     private VppDataBrokerInitializationProvider vppDataBrokerInitializationProvider;
-    private final ModifiableDataTree configDataTree;
-    private final ReadableDataTree operationalDataTree;
 
     public V3poProvider(@Nonnull final Broker domBroker, final vppApi vppJapi,
-                        @Nonnull final ReaderRegistry readerRegistry,
-                        @Nonnull final WriterRegistry writerRegistry,
                         @Nonnull final BindingNormalizedNodeSerializer serializer,
-                        @Nonnull final ModifiableDataTree configDataTree,
-                        @Nonnull final ReadableDataTree operationalDataTree) {
+                        @Nonnull final DOMDataBroker domDataBroker) {
         api = vppJapi;
-        this.readerRegistry = Preconditions.checkNotNull(readerRegistry, "readerRegistry should not be null");
-        this.writerRegistry = Preconditions.checkNotNull(writerRegistry, "writerRegistry should not be null");
         this.domBroker = Preconditions.checkNotNull(domBroker, "domBroker should not be null");
         this.serializer = Preconditions.checkNotNull(serializer, "serializer should not be null");
-        this.configDataTree = Preconditions.checkNotNull(configDataTree, "configDataTree should not be null");
-        this.operationalDataTree = Preconditions.checkNotNull(operationalDataTree, "operationalDataTree should not be null");
+        this.domDataBroker = Preconditions.checkNotNull(domDataBroker, "domDataBroker should not be null");
     }
 
     private void initializeVppConfig() {
@@ -206,7 +193,7 @@ public class V3poProvider implements BindingAwareProvider, AutoCloseable, Broker
         startOperationalUpdateTimer();
 
         // TODO make configurable:
-        vppDataBrokerInitializationProvider = new VppDataBrokerInitializationProvider(db, readerRegistry, writerRegistry, serializer, configDataTree, operationalDataTree);
+        vppDataBrokerInitializationProvider = new VppDataBrokerInitializationProvider(db, serializer, domDataBroker);
         // TODO pull the registration into Module
         domBroker.registerProvider(vppDataBrokerInitializationProvider);
     }
index bbb004b..c1d22f9 100644 (file)
@@ -20,11 +20,6 @@ import static com.google.common.base.Preconditions.checkNotNull;
 
 import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
-import io.fd.honeycomb.v3po.data.ModifiableDataTree;
-import io.fd.honeycomb.v3po.data.ReadableDataTree;
-import io.fd.honeycomb.v3po.data.impl.DataBroker;
-import io.fd.honeycomb.v3po.translate.read.ReaderRegistry;
-import io.fd.honeycomb.v3po.translate.write.WriterRegistry;
 import java.util.Collection;
 import java.util.Collections;
 import javax.annotation.Nonnull;
@@ -67,28 +62,18 @@ public final class VppDataBrokerInitializationProvider implements Provider, Auto
     private final TopologyId VPP_TOPOLOGY_ID = TopologyId.getDefaultInstance("vpp-topology");
     private final NodeId VPP_TOPOLOGY_NODE_ID = NodeId.getDefaultInstance("vpp");
     private final org.opendaylight.controller.md.sal.binding.api.DataBroker bindingBroker;
-    private final ReaderRegistry readerRegistry;
     private final InstanceIdentifier<Node> mountPointPath;
-    private final WriterRegistry writerRegistry;
     private final BindingNormalizedNodeSerializer serializer;
     private ObjectRegistration<DOMMountPoint> mountPointRegistration;
-    private DOMDataBroker broker;
-    private final ModifiableDataTree configDataTree;
-    private final ReadableDataTree operationalDataTree;
+    private final DOMDataBroker domDataBroker;
 
     public VppDataBrokerInitializationProvider(
             @Nonnull final org.opendaylight.controller.md.sal.binding.api.DataBroker bindingBroker,
-            @Nonnull final ReaderRegistry readerRegistry,
-            @Nonnull final WriterRegistry writerRegistry,
             @Nonnull final BindingNormalizedNodeSerializer serializer,
-            @Nonnull final ModifiableDataTree configDataTree,
-            @Nonnull final ReadableDataTree operationalDataTree) {
+            @Nonnull final DOMDataBroker domDataBroker) {
         this.bindingBroker = checkNotNull(bindingBroker, "bindingBroker should not be null");
-        this.readerRegistry = checkNotNull(readerRegistry, "readerRegistry should not be null");
-        this.writerRegistry = checkNotNull(writerRegistry, "writerRegistry should not be null");
         this.serializer = checkNotNull(serializer, "serializer should not be null");
-        this.configDataTree = checkNotNull(configDataTree, "configDataTree should not be null");
-        this.operationalDataTree = checkNotNull(operationalDataTree, "configDataTree should not be null");
+        this.domDataBroker = checkNotNull(domDataBroker, "domDataBroker should not be null");
         this.mountPointPath = getMountPointPath();
     }
 
@@ -115,8 +100,7 @@ public final class VppDataBrokerInitializationProvider implements Provider, Auto
         final DOMMountPointService.DOMMountPointBuilder mountPointBuilder = mountPointService.createMountPoint(path);
         mountPointBuilder.addInitialSchemaContext(globalContext);
 
-        broker = new DataBroker(operationalDataTree, configDataTree);
-        mountPointBuilder.addService(DOMDataBroker.class, broker);
+        mountPointBuilder.addService(DOMDataBroker.class, domDataBroker);
 
         mountPointRegistration = mountPointBuilder.register();
         final DOMMountPoint mountPoint = mountPointRegistration.getInstance();
@@ -164,7 +148,7 @@ public final class VppDataBrokerInitializationProvider implements Provider, Auto
     }
 
     public Optional<DOMDataBroker> getBroker() {
-        return Optional.fromNullable(broker);
+        return Optional.fromNullable(domDataBroker);
     }
 
     @Override
@@ -173,10 +157,6 @@ public final class VppDataBrokerInitializationProvider implements Provider, Auto
             mountPointRegistration.close();
         }
 
-        if (broker != null) {
-            broker = null;
-        }
-
         // remove MD-SAL placeholder data for VPP mount point:
         final WriteTransaction rwTx = bindingBroker.newWriteOnlyTransaction();
         // does not fail if data is not present:
index 76f0144..24e34c0 100644 (file)
@@ -41,7 +41,7 @@ public class DataBrokerModule extends
 
     @Override
     public java.lang.AutoCloseable createInstance() {
-        LOG.info("DataBrokerModule.createInstance()");
+        LOG.debug("DataBrokerModule.createInstance()");
         return new CloseableDataBroker(
                 new DataBroker(getOperationalDataTreeDependency(), getConfigDataTreeDependency()));
     }
@@ -56,7 +56,7 @@ public class DataBrokerModule extends
 
         @Override
         public void close() throws Exception {
-            LOG.info("CloseableDataBroker.close()");
+            LOG.debug("CloseableDataBroker.close()");
             // NOP
         }
 
index 9597804..697213b 100644 (file)
@@ -57,9 +57,8 @@ public class V3poModule extends
         final Broker domBroker = getDomBrokerDependency();
         domBroker.registerProvider(new InitializationProvider());
 
-        final V3poProvider provider = new V3poProvider(domBroker, getVppJapiDependency(), getReaderRegistryDependency(),
-                getWriterRegistryDependency(), getSerializerDependency(),
-                getConfigDataTreeDependency(), getOperationalDataTreeDependency());
+        final V3poProvider provider = new V3poProvider(domBroker, getVppJapiDependency(), getSerializerDependency(),
+                getDomDataBrokerDependency());
         getBrokerDependency().registerProvider(provider);
         return provider;
     }
index c0240cd..d6fd251 100644 (file)
@@ -54,24 +54,6 @@ module v3po-impl {
                 }
             }
 
-            container reader-registry {
-                uses config:service-ref {
-                    refine type {
-                        mandatory true;
-                        config:required-identity tapi:honeycomb-reader-registry;
-                    }
-                }
-            }
-
-            container writer-registry {
-                uses config:service-ref {
-                    refine type {
-                        mandatory true;
-                        config:required-identity tapi:honeycomb-writer-registry;
-                    }
-                }
-            }
-
             container serializer {
                 uses config:service-ref {
                     refine type {
@@ -81,20 +63,11 @@ module v3po-impl {
                 }
             }
 
-            container config-data-tree {
-                uses config:service-ref {
-                    refine type {
-                        mandatory true;
-                        config:required-identity dapi:honeycomb-modifiable-data-tree;
-                    }
-                }
-            }
-
-            container operational-data-tree {
+            container dom-data-broker {
                 uses config:service-ref {
                     refine type {
                         mandatory true;
-                        config:required-identity dapi:honeycomb-readable-data-tree;
+                        config:required-identity dom:dom-async-data-broker;
                     }
                 }
             }
index cd36234..ee7619c 100644 (file)
@@ -26,11 +26,7 @@ import static org.mockito.Mockito.verify;
 import static org.mockito.MockitoAnnotations.initMocks;
 
 import com.google.common.util.concurrent.CheckedFuture;
-import io.fd.honeycomb.v3po.data.ModifiableDataTree;
-import io.fd.honeycomb.v3po.data.ReadableDataTree;
 import io.fd.honeycomb.v3po.impl.VppDataBrokerInitializationProvider;
-import io.fd.honeycomb.v3po.translate.read.ReaderRegistry;
-import io.fd.honeycomb.v3po.translate.write.WriterRegistry;
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.Mock;
@@ -38,9 +34,9 @@ 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.controller.md.sal.common.api.data.TransactionCommitFailedException;
+import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
 import org.opendaylight.yangtools.binding.data.codec.api.BindingNormalizedNodeSerializer;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.osgi.framework.Configurable;
 
 public class VppDataBrokerInitializationProviderTest {
 
@@ -49,15 +45,9 @@ public class VppDataBrokerInitializationProviderTest {
     @Mock
     private WriteTransaction writeTx;
     @Mock
-    private ReaderRegistry readerRegistry;
-    @Mock
-    private WriterRegistry writerRegistry;
-    @Mock
     private BindingNormalizedNodeSerializer serializer;
     @Mock
-    private ModifiableDataTree configDataTree;
-    @Mock
-    private ReadableDataTree operationalDataTree;
+    private DOMDataBroker domDataBroker;
 
     private VppDataBrokerInitializationProvider provider;
 
@@ -65,8 +55,7 @@ public class VppDataBrokerInitializationProviderTest {
     public void setUp() throws Exception {
         initMocks(this);
         doReturn(writeTx).when(bindingBroker).newWriteOnlyTransaction();
-        provider = new VppDataBrokerInitializationProvider(bindingBroker, readerRegistry, writerRegistry, serializer,
-                configDataTree, operationalDataTree);
+        provider = new VppDataBrokerInitializationProvider(bindingBroker, serializer, domDataBroker);
     }
 
     @Test
index 060b436..845e679 100644 (file)
@@ -21,16 +21,13 @@ import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import io.fd.honeycomb.v3po.data.ModifiableDataTree;
-import io.fd.honeycomb.v3po.data.ReadableDataTree;
 import io.fd.honeycomb.v3po.impl.V3poProvider;
-import io.fd.honeycomb.v3po.translate.read.ReaderRegistry;
-import io.fd.honeycomb.v3po.translate.write.WriterRegistry;
 import javax.management.ObjectName;
 import org.junit.Test;
 import org.opendaylight.controller.config.api.DependencyResolver;
 import org.opendaylight.controller.config.api.JmxAttribute;
 import org.opendaylight.controller.config.api.ModuleIdentifier;
+import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
 import org.opendaylight.yangtools.binding.data.codec.api.BindingNormalizedNodeSerializer;
 
@@ -55,16 +52,10 @@ public class V3poModuleTest {
         final org.opendaylight.controller.sal.core.api.Broker domBroker = mock(org.opendaylight.controller.sal.core.api.Broker.class);
         when(dependencyResolver.resolveInstance(eq(org.opendaylight.controller.sal.core.api.Broker.class), any(ObjectName.class), any(JmxAttribute.class)))
             .thenReturn(domBroker);
-        when(dependencyResolver.resolveInstance(eq(ReaderRegistry.class), any(ObjectName.class), any(JmxAttribute.class)))
-                .thenReturn(mock(ReaderRegistry.class));
-        when(dependencyResolver.resolveInstance(eq(WriterRegistry.class), any(ObjectName.class), any(JmxAttribute.class)))
-                .thenReturn(mock(WriterRegistry.class));
         when(dependencyResolver.resolveInstance(eq(BindingNormalizedNodeSerializer.class), any(ObjectName.class), any(JmxAttribute.class)))
                 .thenReturn(mock(BindingNormalizedNodeSerializer.class));
-        when(dependencyResolver.resolveInstance(eq(ModifiableDataTree.class), any(ObjectName.class), any(JmxAttribute.class)))
-                .thenReturn(mock(ModifiableDataTree.class));
-        when(dependencyResolver.resolveInstance(eq(ReadableDataTree.class), any(ObjectName.class), any(JmxAttribute.class)))
-                .thenReturn(mock(ReadableDataTree.class));
+        when(dependencyResolver.resolveInstance(eq(DOMDataBroker.class), any(ObjectName.class), any(JmxAttribute.class)))
+                .thenReturn(mock(DOMDataBroker.class));
 
         // create instance of module with injected mocks
         V3poModule module = new V3poModule(mock(ModuleIdentifier.class), dependencyResolver);
diff --git a/v3po/translate-utils/src/main/java/io/fd/honeycomb/v3po/translate/util/write/CloseableWriterRegistry.java b/v3po/translate-utils/src/main/java/io/fd/honeycomb/v3po/translate/util/write/CloseableWriterRegistry.java
new file mode 100644 (file)
index 0000000..cd53a4f
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+ * 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.write;
+
+import io.fd.honeycomb.v3po.translate.TranslationException;
+import io.fd.honeycomb.v3po.translate.write.WriteContext;
+import io.fd.honeycomb.v3po.translate.write.WriteFailedException;
+import io.fd.honeycomb.v3po.translate.write.WriterRegistry;
+import java.util.Map;
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+
+/**
+ * WriterRegistry wrapper providing AutoCloseable interface.
+ */
+public final class CloseableWriterRegistry implements WriterRegistry, AutoCloseable {
+    private final WriterRegistry writerRegistry;
+
+    public CloseableWriterRegistry( final WriterRegistry writerRegistry) {
+        this.writerRegistry = writerRegistry;
+    }
+
+    @Override
+    public void update(
+            @Nonnull final Map<InstanceIdentifier<?>, DataObject> nodesBefore,
+            @Nonnull final Map<InstanceIdentifier<?>, DataObject> nodesAfter,
+            @Nonnull final WriteContext ctx) throws TranslationException {
+        writerRegistry.update(nodesBefore, nodesAfter, ctx);
+    }
+
+    @Override
+    public void update(
+            @Nonnull final InstanceIdentifier<? extends DataObject> id,
+            @Nullable final DataObject dataBefore, @Nullable final DataObject dataAfter,
+            @Nonnull final WriteContext ctx) throws WriteFailedException {
+        writerRegistry.update(id, dataBefore, dataAfter, ctx);
+    }
+
+    @Nonnull
+    @Override
+    public InstanceIdentifier<DataObject> getManagedDataObjectType() {
+        return writerRegistry.getManagedDataObjectType();
+    }
+
+    @Override
+    public void close() throws Exception {
+        // NOOP
+    }
+}
\ No newline at end of file
diff --git a/v3po/translate-utils/src/main/java/io/fd/honeycomb/v3po/translate/util/write/NoopWriterRegistry.java b/v3po/translate-utils/src/main/java/io/fd/honeycomb/v3po/translate/util/write/NoopWriterRegistry.java
new file mode 100644 (file)
index 0000000..8668542
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * 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.write;
+
+import io.fd.honeycomb.v3po.translate.TranslationException;
+import io.fd.honeycomb.v3po.translate.write.WriteContext;
+import io.fd.honeycomb.v3po.translate.write.WriteFailedException;
+import io.fd.honeycomb.v3po.translate.write.WriterRegistry;
+import java.util.Map;
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Empty registry that does not perform any changes. Can be used in data layer, if we want to disable passing data to
+ * translation layer.
+ */
+public class NoopWriterRegistry implements WriterRegistry {
+
+    private static final Logger LOG = LoggerFactory.getLogger(NoopWriterRegistry.class);
+
+    @Override
+    public void update(@Nonnull final Map<InstanceIdentifier<?>, DataObject> dataBefore,
+                       @Nonnull final Map<InstanceIdentifier<?>, DataObject> dataAfter, @Nonnull final WriteContext ctx)
+            throws TranslationException {
+        LOG.trace("NoopWriterRegistry.update dataBefore{}, dataAfter={], ctx={}", dataBefore, dataAfter, ctx);
+        // NOOP
+    }
+
+    @Override
+    public void update(@Nonnull final InstanceIdentifier<? extends DataObject> id,
+                       @Nullable final DataObject dataBefore, @Nullable final DataObject dataAfter,
+                       @Nonnull final WriteContext ctx) throws WriteFailedException {
+        LOG.trace("NoopWriterRegistry.update id={}, dataBefore{}, dataAfter={], ctx={}", id, dataBefore, dataAfter,
+                ctx);
+        // NOOP
+    }
+
+    @Nonnull
+    @Override
+    public InstanceIdentifier<DataObject> getManagedDataObjectType() {
+        throw new UnsupportedOperationException("Root registry has no type");
+    }
+}
index 72ec876..0266ca9 100644 (file)
@@ -2,18 +2,11 @@ package org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.translate.
 
 import com.google.common.base.Function;
 import com.google.common.collect.Lists;
-import io.fd.honeycomb.v3po.translate.TranslationException;
+import io.fd.honeycomb.v3po.translate.util.write.CloseableWriterRegistry;
 import io.fd.honeycomb.v3po.translate.util.write.DelegatingWriterRegistry;
-import io.fd.honeycomb.v3po.translate.write.WriteContext;
-import io.fd.honeycomb.v3po.translate.write.WriteFailedException;
 import io.fd.honeycomb.v3po.translate.write.Writer;
-import io.fd.honeycomb.v3po.translate.write.WriterRegistry;
 import java.util.List;
-import java.util.Map;
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
 import org.opendaylight.yangtools.yang.binding.DataObject;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
 public class DelegatingWriterRegistryModule extends org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.translate.utils.rev160406.AbstractDelegatingWriterRegistryModule {
     public DelegatingWriterRegistryModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
@@ -43,41 +36,4 @@ public class DelegatingWriterRegistryModule extends org.opendaylight.yang.gen.v1
         return new CloseableWriterRegistry(new DelegatingWriterRegistry(rootReadersDependency));
     }
 
-    // TODO move to translate-utils
-    private static final class CloseableWriterRegistry implements WriterRegistry, AutoCloseable {
-        private final DelegatingWriterRegistry delegatingWriterRegistry;
-
-        CloseableWriterRegistry(
-            final DelegatingWriterRegistry delegatingWriterRegistry) {
-            this.delegatingWriterRegistry = delegatingWriterRegistry;
-        }
-
-        @Override
-        public void update(
-            @Nonnull final Map<InstanceIdentifier<?>, DataObject> nodesBefore,
-            @Nonnull final Map<InstanceIdentifier<?>, DataObject> nodesAfter,
-            @Nonnull final WriteContext ctx) throws TranslationException {
-            delegatingWriterRegistry.update(nodesBefore, nodesAfter, ctx);
-        }
-
-        @Override
-        public void update(
-            @Nonnull final InstanceIdentifier<? extends DataObject> id,
-            @Nullable final DataObject dataBefore, @Nullable final DataObject dataAfter,
-            @Nonnull final WriteContext ctx) throws WriteFailedException {
-            delegatingWriterRegistry.update(id, dataBefore, dataAfter, ctx);
-        }
-
-        @Nonnull
-        @Override
-        public InstanceIdentifier<DataObject> getManagedDataObjectType() {
-            return delegatingWriterRegistry.getManagedDataObjectType();
-        }
-
-        @Override
-        public void close() throws Exception {
-            // NOOP
-        }
-    }
-
 }
diff --git a/v3po/translate-utils/src/main/java/org/opendaylight/yang/gen/v1/urn/honeycomb/params/xml/ns/yang/translate/utils/rev160406/NoopWriterRegistryModule.java b/v3po/translate-utils/src/main/java/org/opendaylight/yang/gen/v1/urn/honeycomb/params/xml/ns/yang/translate/utils/rev160406/NoopWriterRegistryModule.java
new file mode 100644 (file)
index 0000000..16c8af3
--- /dev/null
@@ -0,0 +1,25 @@
+package org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.translate.utils.rev160406;
+
+import io.fd.honeycomb.v3po.translate.util.write.*;
+import io.fd.honeycomb.v3po.translate.util.write.NoopWriterRegistry;
+
+public class NoopWriterRegistryModule extends org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.translate.utils.rev160406.AbstractNoopWriterRegistryModule {
+    public NoopWriterRegistryModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
+        super(identifier, dependencyResolver);
+    }
+
+    public NoopWriterRegistryModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.translate.utils.rev160406.NoopWriterRegistryModule 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 CloseableWriterRegistry(new NoopWriterRegistry());
+    }
+
+}
diff --git a/v3po/translate-utils/src/main/java/org/opendaylight/yang/gen/v1/urn/honeycomb/params/xml/ns/yang/translate/utils/rev160406/NoopWriterRegistryModuleFactory.java b/v3po/translate-utils/src/main/java/org/opendaylight/yang/gen/v1/urn/honeycomb/params/xml/ns/yang/translate/utils/rev160406/NoopWriterRegistryModuleFactory.java
new file mode 100644 (file)
index 0000000..57b6859
--- /dev/null
@@ -0,0 +1,13 @@
+/*
+* Generated file
+*
+* Generated from: yang module name: translate-utils yang module local name: noop-writer-registry
+* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
+* Generated at: Tue Apr 12 08:41:08 CEST 2016
+*
+* Do not modify this file unless it is present under src/main directory
+*/
+package org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.translate.utils.rev160406;
+public class NoopWriterRegistryModuleFactory extends org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.translate.utils.rev160406.AbstractNoopWriterRegistryModuleFactory {
+
+}
index 093e172..238528d 100644 (file)
@@ -58,4 +58,15 @@ module translate-utils {
         }
     }
 
+    identity noop-writer-registry {
+        base config:module-type;
+        config:provided-service tapi:honeycomb-writer-registry;
+        config:java-name-prefix NoopWriterRegistry;
+    }
+
+    augment "/config:modules/config:module/config:configuration" {
+        case noop-writer-registry {
+            when "/config:modules/config:module/config:type = 'noop-writer-registry'";
+        }
+    }
 }
\ No newline at end of file
index 3048dc1..bf5a77d 100644 (file)
@@ -20,20 +20,14 @@ import static com.google.common.base.Preconditions.checkNotNull;
 
 import com.google.common.annotations.Beta;
 import com.google.common.base.Optional;
-import io.fd.honeycomb.v3po.data.ModifiableDataTree;
-import io.fd.honeycomb.v3po.translate.Context;
-import io.fd.honeycomb.v3po.translate.read.ReadContext;
-import io.fd.honeycomb.v3po.translate.read.ReadFailedException;
-import io.fd.honeycomb.v3po.translate.read.ReaderRegistry;
-import java.util.Map;
-import javax.annotation.Nonnull;
-import org.opendaylight.yangtools.binding.data.codec.api.BindingNormalizedNodeSerializer;
+import com.google.common.util.concurrent.CheckedFuture;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
+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.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.NormalizedNode;
-import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeModification;
-import org.opendaylight.yangtools.yang.data.api.schema.tree.DataValidationFailedException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -48,20 +42,14 @@ public abstract class AbstractDataTreeConverter<O extends DataObject, C extends
         implements DataTreeInitializer {
     private static final Logger LOG = LoggerFactory.getLogger(AbstractDataTreeConverter.class);
 
-    private final ReaderRegistry readerRegistry;
-    private final ModifiableDataTree configDataTree;
-    private final BindingNormalizedNodeSerializer serializer;
     private final InstanceIdentifier<O> idOper;
     private final InstanceIdentifier<C> idConfig;
+    private final DataBroker bindingDataBroker;
 
-    public AbstractDataTreeConverter(@Nonnull final ReaderRegistry readerRegistry,
-                                     @Nonnull final ModifiableDataTree configDataTree,
-                                     @Nonnull final BindingNormalizedNodeSerializer serializer,
-                                     @Nonnull final InstanceIdentifier<O> idOper,
-                                     @Nonnull final InstanceIdentifier<C> idConfig) {
-        this.readerRegistry = checkNotNull(readerRegistry, "readerRegistry should not be null");
-        this.configDataTree = checkNotNull(configDataTree, "configDataTree should not be null");
-        this.serializer = checkNotNull(serializer, "serializer should not be null");
+    public AbstractDataTreeConverter(final DataBroker bindingDataBroker,
+                                     final InstanceIdentifier<O> idOper,
+                                     final InstanceIdentifier<C> idConfig) {
+        this.bindingDataBroker = checkNotNull(bindingDataBroker, "bindingDataBroker should not be null");
         this.idOper = checkNotNull(idOper, "idOper should not be null");
         this.idConfig = checkNotNull(idConfig, "idConfig should not be null");
     }
@@ -69,59 +57,42 @@ public abstract class AbstractDataTreeConverter<O extends DataObject, C extends
     @Override
     public final void initialize() throws InitializeException {
         LOG.debug("AbstractDataTreeConverter.initialize()");
-
-        final Optional<? extends DataObject> data;
-        try (ReadContext ctx = new ReadContextImpl()) {
-            data = readerRegistry.read(idOper, ctx);
-        } catch (ReadFailedException e) {
-            LOG.warn("Failed to read operational state", e);
-            return;
-        }
-        LOG.debug("Config initialization data={}", data);
+        final Optional<O> data = readData();
 
         if (data.isPresent()) {
-            // conversion
-            final O operationalData = idOper.getTargetType().cast(data.get());
-            final C configData = convert(operationalData);
+            LOG.debug("Config initialization data={}", data);
 
-            final Map.Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> normalizedData =
-                    serializer.toNormalizedNode(idConfig, configData);
-
-            final DataTreeModification modification = configDataTree.takeSnapshot().newModification();
-            final YangInstanceIdentifier biPath = normalizedData.getKey();
-            final NormalizedNode<?, ?> biData = normalizedData.getValue();
-            LOG.debug("Config initialization biPath={}, biData={}", biPath, biData);
-            modification.write(biPath, biData);
-            modification.ready();
+            final O operationalData = data.get();
+            final C configData = convert(operationalData);
 
-            LOG.debug("Config writing modification ...");
             try {
-                configDataTree.initialize(modification);
-                LOG.debug("Config writing modification written successfully.");
-            } catch (DataValidationFailedException e) {
-                throw new InitializeException("Failed to read operational state", e);
+                LOG.debug("Initializing config with data={}", configData);
+                writeData(configData);
+                LOG.debug("Config initialization successful");
+            } catch (TransactionCommitFailedException e) {
+                throw new InitializeException("Failed to perform config initialization", e);
             }
         } else {
             LOG.warn("Data is not present");
         }
     }
 
-    protected abstract C convert(final O operationalData);
-
-    // TODO move to utility module
-    private static final class ReadContextImpl implements ReadContext {
-        public final Context ctx = new Context();
-
-        @Nonnull
-        @Override
-        public Context getContext() {
-            return ctx;
+    private Optional<O> readData() {
+        try (ReadOnlyTransaction readTx = bindingDataBroker.newReadOnlyTransaction()) {
+            final CheckedFuture<Optional<O>, org.opendaylight.controller.md.sal.common.api.data.ReadFailedException>
+                    readFuture = readTx.read(LogicalDatastoreType.OPERATIONAL, idOper);
+            return readFuture.checkedGet();
+        } catch (org.opendaylight.controller.md.sal.common.api.data.ReadFailedException e) {
+            LOG.warn("Failed to read operational state", e);
         }
+        return Optional.absent();
+    }
 
-        @Override
-        public void close() {
-            // Make sure to clear the storage in case some customizer stored it  to prevent memory leaks
-            ctx.close();
-        }
+    private void writeData(final C configData) throws TransactionCommitFailedException {
+        final WriteTransaction writeTx = bindingDataBroker.newWriteOnlyTransaction();
+        writeTx.merge(LogicalDatastoreType.CONFIGURATION, idConfig, configData);
+        writeTx.submit().checkedGet();
     }
+
+    protected abstract C convert(final O operationalData);
 }
index c0316c0..3fad2a8 100644 (file)
 
 package io.fd.honeycomb.v3po.vpp.data.init;
 
-import io.fd.honeycomb.v3po.data.ModifiableDataTree;
-import io.fd.honeycomb.v3po.translate.read.ReaderRegistry;
 import java.util.ArrayList;
 import java.util.List;
 import javax.annotation.Nonnull;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.Vpp;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VppBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VppState;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.bridge.domains.BridgeDomainKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.state.BridgeDomains;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.state.bridge.domains.BridgeDomain;
-import org.opendaylight.yangtools.binding.data.codec.api.BindingNormalizedNodeSerializer;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -35,10 +33,8 @@ import org.slf4j.LoggerFactory;
 public class VppInitializer extends AbstractDataTreeConverter<VppState, Vpp> {
     private static final Logger LOG = LoggerFactory.getLogger(VppInitializer.class);
 
-    public VppInitializer(@Nonnull final ReaderRegistry readerRegistry,
-                          @Nonnull final ModifiableDataTree configDataTree,
-                          @Nonnull final BindingNormalizedNodeSerializer serializer) {
-        super(readerRegistry, configDataTree, serializer, InstanceIdentifier.create(VppState.class), InstanceIdentifier.create(Vpp.class) );
+    public VppInitializer(@Nonnull final DataBroker bindingDataBroker) {
+        super(bindingDataBroker, InstanceIdentifier.create(VppState.class), InstanceIdentifier.create(Vpp.class));
     }
 
     @Override
@@ -61,7 +57,6 @@ public class VppInitializer extends AbstractDataTreeConverter<VppState, Vpp> {
         final List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.bridge.domains.BridgeDomain>
                 listOfBDs = new ArrayList<>();
 
-        // TODO use reflexion
         for (BridgeDomain bd : bridgeDomainList) {
             org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.bridge.domains.BridgeDomainBuilder
                     bdBuilder =
index 8b6f589..eddc74d 100644 (file)
@@ -1,13 +1,11 @@
 package org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.vpp.data.init.rev160407;
 
-import io.fd.honeycomb.v3po.data.ModifiableDataTree;
-import io.fd.honeycomb.v3po.translate.read.ReaderRegistry;
 import io.fd.honeycomb.v3po.vpp.data.init.DataTreeInitializer;
 import io.fd.honeycomb.v3po.vpp.data.init.InitializerRegistry;
 import io.fd.honeycomb.v3po.vpp.data.init.InitializerRegistryImpl;
 import io.fd.honeycomb.v3po.vpp.data.init.VppInitializer;
 import java.util.Collections;
-import org.opendaylight.yangtools.binding.data.codec.api.BindingNormalizedNodeSerializer;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -35,14 +33,12 @@ public class VppConfigurationInitializerModule extends
 
     @Override
     public java.lang.AutoCloseable createInstance() {
-        LOG.info("VppConfigurationInitializerModule.createInstance()");
-        final ReaderRegistry readerRegistry = getReaderRegistryDependency();
-        final ModifiableDataTree configDataTree = getConfigDataTreeDependency();
-        final BindingNormalizedNodeSerializer serializer = getSerializerDependency();
+        LOG.debug("VppConfigurationInitializerModule.createInstance()");
+        final DataBroker bindingDataBroker = getBindingDataBrokerDependency();
 
         // TODO make configurable
         final VppInitializer vppInitializer =
-                new VppInitializer(readerRegistry, configDataTree, serializer);
+                new VppInitializer(bindingDataBroker);
 
         final InitializerRegistry initializer =
                 new InitializerRegistryImpl(Collections.<DataTreeInitializer>singletonList(vppInitializer));
index 15a842e..e4ce95a 100644 (file)
@@ -31,33 +31,14 @@ module vpp-cfg-init {
         case vpp-cfg-initializer-impl {
             when "/config:modules/config:module/config:type = 'vpp-cfg-initializer-impl'";
 
-            container reader-registry {
-                uses config:service-ref {
-                    refine type {
-                       mandatory true;
-                        config:required-identity tapi:honeycomb-reader-registry;
-                    }
-                }
-            }
-
-            // TODO swich to binding broker
-            container config-data-tree {
-                uses config:service-ref {
-                    refine type {
-                        mandatory true;
-                        config:required-identity dapi:honeycomb-modifiable-data-tree;
-                    }
-                }
-            }
-
-            container serializer {
+             container binding-data-broker {
                 uses config:service-ref {
                     refine type {
                         mandatory true;
-                        config:required-identity md-sal-binding:binding-normalized-node-serializer;
+                        config:required-identity md-sal-binding:binding-async-data-broker;
                     }
                 }
-            }
+             }
         }
     }
 
index d77ac3f..d562fb6 100644 (file)
@@ -19,7 +19,6 @@ package io.fd.honeycomb.v3po.vpp.data.init;
 import static org.mockito.Mockito.verify;
 import static org.mockito.MockitoAnnotations.initMocks;
 
-import java.util.ArrayList;
 import java.util.Arrays;
 import org.junit.Before;
 import org.junit.Test;
@@ -34,18 +33,12 @@ public class InitializerRegistryImplTest {
     @Mock(name="dti3")
     private DataTreeInitializer dti3;
 
-    private ArrayList<DataTreeInitializer> initializers;
-
     private InitializerRegistryImpl initializerRegistry;
 
     @Before
     public void setUp() throws Exception {
         initMocks(this);
-        initializers = new ArrayList<>();
-        initializers.add(dti1);
-        initializers.add(dti2);
-        initializers.add(dti3);
-        initializerRegistry = new InitializerRegistryImpl(initializers);
+        initializerRegistry = new InitializerRegistryImpl(Arrays.asList(dti1, dti2, dti3));
     }
 
     @Test(expected = IllegalArgumentException.class)