Properly create parent nodes in reachability builders 80/9880/2
authorRobert Varga <rovarga@cisco.com>
Tue, 12 Aug 2014 05:41:39 +0000 (07:41 +0200)
committerRobert Varga <rovarga@cisco.com>
Tue, 12 Aug 2014 05:43:33 +0000 (05:43 +0000)
The abstract class quietly relied on parent nodes being created by the
datastore, which could have lead to them not being cleaned up. Fix the
code to do the right thing.

Change-Id: Ie5dd735b4a0791a4439d446cb2a7a5bb6fe87db5
Signed-off-by: Robert Varga <rovarga@cisco.com>
bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/AbstractReachabilityTopologyBuilder.java

index 2dc3cf0946083b6c49ec63f17a15751a5e045efb..4721676a27a2f173f225ca8a7b667f15273d08be 100644 (file)
@@ -8,8 +8,10 @@
 package org.opendaylight.bgpcep.bgp.topology.provider;
 
 import com.google.common.base.Optional;
+
 import java.util.ArrayList;
 import java.util.concurrent.ExecutionException;
+
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.ReadTransaction;
 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
@@ -26,6 +28,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.type
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeBuilder;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.TopologyTypesBuilder;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.Node1;
@@ -36,6 +39,7 @@ import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.igp.node.attributes.igp.node.attributes.PrefixKey;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -66,8 +70,8 @@ abstract class AbstractReachabilityTopologyBuilder<T extends Route> extends Abst
         }
     }
 
-    private InstanceIdentifier<Node1> nodeInstanceId(final NodeId ni) {
-        return getInstanceIdentifier().builder().child(Node.class, new NodeKey(ni)).augmentation(Node1.class).toInstance();
+    private KeyedInstanceIdentifier<Node, NodeKey> nodeInstanceId(final NodeId ni) {
+        return getInstanceIdentifier().child(Node.class, new NodeKey(ni));
     }
 
     private static <T extends DataObject> T read(final ReadTransaction t, final InstanceIdentifier<T> id) {
@@ -79,24 +83,26 @@ abstract class AbstractReachabilityTopologyBuilder<T extends Route> extends Abst
             return null;
         }
 
-        return (T)o.orNull();
+        return o.orNull();
     }
 
     private InstanceIdentifier<Node1> ensureNodePresent(final ReadWriteTransaction trans, final NodeId ni) {
-        final InstanceIdentifier<Node1> nii = nodeInstanceId(ni);
+        final KeyedInstanceIdentifier<Node, NodeKey> nii = nodeInstanceId(ni);
         LOG.debug("Looking for pre-existing node at {}", nii);
 
-        if (read(trans, nii) == null) {
+        final InstanceIdentifier<Node1> ret = nii.augmentation(Node1.class);
+        if (read(trans, ret) == null) {
             LOG.debug("Create a new node at {}", nii);
-            trans.put(LogicalDatastoreType.OPERATIONAL, nii, new Node1Builder().setIgpNodeAttributes(
-                    new IgpNodeAttributesBuilder().setPrefix(new ArrayList<Prefix>()).build()).build());
+            trans.put(LogicalDatastoreType.OPERATIONAL, nii, new NodeBuilder().setKey(nii.getKey()).setNodeId(ni)
+                .addAugmentation(Node1.class, new Node1Builder().setIgpNodeAttributes(
+                    new IgpNodeAttributesBuilder().setPrefix(new ArrayList<Prefix>()).build()).build()).build());
         }
 
-        return nii;
+        return ret;
     }
 
-    private void removeEmptyNode(final ReadWriteTransaction trans, final InstanceIdentifier<Node1> nii) {
-        final Node1 node = read(trans, nii);
+    private void removeEmptyNode(final ReadWriteTransaction trans, final InstanceIdentifier<Node> nii) {
+        final Node1 node = read(trans, nii.augmentation(Node1.class));
         if (node != null && node.getIgpNodeAttributes().getPrefix().isEmpty()) {
             trans.delete(LogicalDatastoreType.OPERATIONAL, nii);
         }
@@ -115,22 +121,22 @@ abstract class AbstractReachabilityTopologyBuilder<T extends Route> extends Abst
         final PrefixKey pk = new PrefixKey(prefix);
 
         trans.put(LogicalDatastoreType.OPERATIONAL,
-                nii.builder().child(
+                nii.child(
                         org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.igp.node.attributes.IgpNodeAttributes.class).child(
-                                Prefix.class, pk).toInstance(), new PrefixBuilder().setKey(pk).setPrefix(prefix).build());
+                                Prefix.class, pk), new PrefixBuilder().setKey(pk).setPrefix(prefix).build());
     }
 
     @Override
     protected final void removeObject(final ReadWriteTransaction trans, final InstanceIdentifier<T> id, final T value) {
         final NodeId ni = advertizingNode(getAttributes(value));
-        final InstanceIdentifier<Node1> nii = nodeInstanceId(ni);
+        final InstanceIdentifier<Node> nii = nodeInstanceId(ni);
 
         final IpPrefix prefix = getPrefix(value);
         final PrefixKey pk = new PrefixKey(prefix);
 
-        trans.delete(LogicalDatastoreType.OPERATIONAL, nii.builder().child(
+        trans.delete(LogicalDatastoreType.OPERATIONAL, nii.augmentation(Node1.class).child(
                 org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.igp.node.attributes.IgpNodeAttributes.class).child(
-                        Prefix.class, pk).toInstance());
+                        Prefix.class, pk));
 
         removeEmptyNode(trans, nii);
     }