From c55514a488adce48c0f66fe4cffbb8841ba6e9e9 Mon Sep 17 00:00:00 2001 From: Michal Rehak Date: Thu, 6 Oct 2016 12:31:25 +0200 Subject: [PATCH] BUG-6953: fix renderer-node overwriting - 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 --- .../impl/writer/NodeWriter.java | 37 +++++++------------ .../impl/util/NodeWriterTest.java | 3 +- 2 files changed, 16 insertions(+), 24 deletions(-) diff --git a/renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/writer/NodeWriter.java b/renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/writer/NodeWriter.java index 03884b11b..6908eeb74 100644 --- a/renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/writer/NodeWriter.java +++ b/renderers/ios-xe/src/main/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/writer/NodeWriter.java @@ -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 iid = buildRendererNodesIid(); + final ArrayList rendererNodes = new ArrayList<>(rendererNodesCache); + // Clear cache + rendererNodesCache.clear(); + + boolean createParents = true; + for (RendererNode rendererNode : rendererNodes) { + final InstanceIdentifier 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 buildRendererNodesIid() { - return InstanceIdentifier.builder(Renderers.class) - .child(Renderer.class, new RendererKey(new RendererName(PolicyManagerImpl.IOS_XE_RENDERER))) - .child(RendererNodes.class) - .build(); - } - private InstanceIdentifier 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(); - } } diff --git a/renderers/ios-xe/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/util/NodeWriterTest.java b/renderers/ios-xe/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/util/NodeWriterTest.java index a7f8d614b..79b6d8227 100644 --- a/renderers/ios-xe/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/util/NodeWriterTest.java +++ b/renderers/ios-xe/src/test/java/org/opendaylight/groupbasedpolicy/renderer/ios_xe_provider/impl/util/NodeWriterTest.java @@ -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 result = nodeWriter.commitToDatastore(dataBroker); assertFalse(getFutureResult(result)); -- 2.36.6