BUG-6953: fix renderer-node overwriting 22/47022/3
authorMichal Rehak <mirehak@cisco.com>
Thu, 6 Oct 2016 10:31:25 +0000 (12:31 +0200)
committermichal rehak <mirehak@cisco.com>
Tue, 18 Oct 2016 12:18:31 +0000 (12:18 +0000)
    - when reporting connected nodes under renderer tree (renderer-nodes)
      then write items to exact path by id order not to replace existing
      list content
    - code cleanup
    - test fix

Change-Id: I4754630c0f5dd7b86a7313bbd8c7673033fbea53
Signed-off-by: Michal Rehak <mirehak@cisco.com>
renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/writer/NodeWriter.java
renderers/ios-xe/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/util/NodeWriterTest.java

index 03884b11b7221bc71a993f2f666fa8eeaba934c0..6908eeb748f3e2a15dff552faa7c8d0d49a98288 100644 (file)
@@ -8,13 +8,12 @@
 
 package org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.writer;
 
-import java.util.ArrayList;
-import java.util.List;
 import com.google.common.util.concurrent.CheckedFuture;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
+import java.util.ArrayList;
+import java.util.List;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
 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;
@@ -25,7 +24,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.Renderer;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.RendererKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.RendererNodes;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.RendererNodesBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.nodes.RendererNode;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.nodes.RendererNodeKey;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
@@ -54,14 +52,20 @@ public class NodeWriter {
         if (rendererNodesCache.isEmpty()) {
             return Futures.immediateFuture(true);
         }
-        final RendererNodes rendererNodes = loadCachedRendererNodes();
+
         final WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();
-        final InstanceIdentifier<RendererNodes> iid = buildRendererNodesIid();
+        final ArrayList<RendererNode> rendererNodes = new ArrayList<>(rendererNodesCache);
+        // Clear cache
+        rendererNodesCache.clear();
+
+        boolean createParents = true;
+        for (RendererNode rendererNode : rendererNodes) {
+            final InstanceIdentifier<RendererNode> iid = buildRendererNodeIid(rendererNode);
+            writeTransaction.put(LogicalDatastoreType.OPERATIONAL, iid, rendererNode, createParents);
+            createParents = false;
+        }
         try {
-            writeTransaction.put(LogicalDatastoreType.OPERATIONAL, iid, rendererNodes, true);
-            final boolean result  = DataStoreHelper.submitToDs(writeTransaction);
-            // Clear cache
-            rendererNodesCache.clear();
+            final boolean result = DataStoreHelper.submitToDs(writeTransaction);
             return Futures.immediateFuture(result);
         } catch (Exception e) {
             LOG.error("Failed to .. {}", e.getMessage());
@@ -97,13 +101,6 @@ public class NodeWriter {
         return Futures.immediateFuture(result);
     }
 
-    private InstanceIdentifier<RendererNodes> buildRendererNodesIid() {
-        return InstanceIdentifier.builder(Renderers.class)
-                .child(Renderer.class, new RendererKey(new RendererName(PolicyManagerImpl.IOS_XE_RENDERER)))
-                .child(RendererNodes.class)
-                .build();
-    }
-
     private InstanceIdentifier<RendererNode> buildRendererNodeIid(final RendererNode rendererNode) {
         return InstanceIdentifier.builder(Renderers.class)
                 .child(Renderer.class, new RendererKey(new RendererName(PolicyManagerImpl.IOS_XE_RENDERER)))
@@ -111,10 +108,4 @@ public class NodeWriter {
                 .child(RendererNode.class, new RendererNodeKey(rendererNode.getNodePath()))
                 .build();
     }
-
-    private RendererNodes loadCachedRendererNodes() {
-        final RendererNodesBuilder rendererNodesBuilder = new RendererNodesBuilder();
-        rendererNodesBuilder.setRendererNode(new ArrayList<>(rendererNodesCache));
-        return rendererNodesBuilder.build();
-    }
 }
index a7f8d614b018f884aada1b0aa0c736f3c1ae4b40..79b6d822745c6d262091ce11e296945cbf6a0c2e 100644 (file)
@@ -15,9 +15,9 @@ import static org.mockito.Mockito.when;
 import static org.powermock.api.support.membermodification.MemberMatcher.method;
 import static org.powermock.api.support.membermodification.MemberModifier.stub;
 
-import java.util.concurrent.ExecutionException;
 import com.google.common.util.concurrent.CheckedFuture;
 import com.google.common.util.concurrent.ListenableFuture;
+import java.util.concurrent.ExecutionException;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
@@ -63,6 +63,7 @@ public class NodeWriterTest {
     @Test
     public void commitToDs_failure() {
         nodeWriter.cache(rendererNode);
+        when(dataBroker.newWriteOnlyTransaction()).thenReturn(transaction);
         stub(method(DataStoreHelper.class, "submitToDs")).toReturn(false);
         final ListenableFuture<Boolean> result = nodeWriter.commitToDatastore(dataBroker);
         assertFalse(getFutureResult(result));