Fix notification serialization with odl-leaf-nodes-only 42/100242/1
authorPeter Puškár <ppuskar@frinx.io>
Mon, 14 Feb 2022 12:44:52 +0000 (13:44 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Thu, 24 Mar 2022 13:48:39 +0000 (14:48 +0100)
Rather than attempting to roll a SchemaPath from PathArguments, use the
provided tool to perform that function -- in a centralized manner.

Add tests to cover serialization of augmentation and choice nodes.

JIRA: NETCONF-848
Change-Id: I9f6dffd9532bd3d52021bbac58473c3cf3b58937
Signed-off-by: Peter Puškár <ppuskar@frinx.io>
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
(cherry picked from commit c123de52b03a3ee4fba2da5e7ec18a214d3876e8)

13 files changed:
restconf/restconf-common-models/src/main/yang/augment-iip-module.yang [new file with mode: 0644]
restconf/restconf-common/src/main/java/org/opendaylight/restconf/common/formatters/JSONDataTreeCandidateFormatter.java
restconf/restconf-common/src/main/java/org/opendaylight/restconf/common/serializer/AbstractWebsocketSerializer.java
restconf/restconf-common/src/main/java/org/opendaylight/restconf/common/serializer/JsonDataTreeCandidateSerializer.java
restconf/restconf-common/src/main/java/org/opendaylight/restconf/common/serializer/XmlDataTreeCandidateSerializer.java
restconf/restconf-nb-rfc8040/src/test/java/org/opendaylight/restconf/nb/rfc8040/streams/listeners/ListenerAdapterTest.java
restconf/restconf-nb-rfc8040/src/test/resources/instanceidentifier/yang/augment-iip-module.yang [new file with mode: 0644]
restconf/restconf-nb-rfc8040/src/test/resources/listener-adapter-test/notif-leaves-create.json
restconf/restconf-nb-rfc8040/src/test/resources/listener-adapter-test/notif-leaves-create.xml
restconf/restconf-nb-rfc8040/src/test/resources/listener-adapter-test/notif-leaves-del.json
restconf/restconf-nb-rfc8040/src/test/resources/listener-adapter-test/notif-leaves-delete.xml [new file with mode: 0644]
restconf/restconf-nb-rfc8040/src/test/resources/listener-adapter-test/notif-leaves-update.json
restconf/restconf-nb-rfc8040/src/test/resources/listener-adapter-test/notif-leaves-update.xml

diff --git a/restconf/restconf-common-models/src/main/yang/augment-iip-module.yang b/restconf/restconf-common-models/src/main/yang/augment-iip-module.yang
new file mode 100644 (file)
index 0000000..f41f080
--- /dev/null
@@ -0,0 +1,29 @@
+module augment-iip-module {
+  namespace "augment:instance:identifier:patch:module";
+  prefix "aiipmodule";
+
+  import instance-identifier-patch-module {
+   prefix imodule; revision-date 2015-11-21;
+  }
+
+  revision 2022-02-18 {
+  }
+
+  augment "/imodule:patch-cont" {
+      choice patch-choice1 {
+        case patch-case1 {
+          leaf case-leaf1 {
+            type string;
+          }
+        }
+        case patch-case2 {
+          leaf case-leaf2 {
+            type int64;
+          }
+        }
+      }
+      leaf leaf1 {
+        type string;
+      }
+  }
+}
\ No newline at end of file
index 38c585a62eaf5949e438d27cbec7c83e0306de20..d73b9bac09603c834a8fdd68565a1407323a72d0 100644 (file)
@@ -58,7 +58,7 @@ public final class JSONDataTreeCandidateFormatter extends DataTreeCandidateForma
 
     @Override
     String createText(final EffectiveModelContext schemaContext, final Collection<DataTreeCandidate> input,
-                      final Instant now, boolean leafNodesOnly, boolean skipData)
+                      final Instant now, final boolean leafNodesOnly, final boolean skipData)
             throws IOException {
         final Writer writer = new StringWriter();
         final JsonWriter jsonWriter = new JsonWriter(writer).beginObject();
@@ -68,7 +68,7 @@ public final class JSONDataTreeCandidateFormatter extends DataTreeCandidateForma
         jsonWriter.name("data-change-event").beginArray();
 
         final JsonDataTreeCandidateSerializer serializer =
-                new JsonDataTreeCandidateSerializer(codecSupplier, schemaContext, jsonWriter);
+                new JsonDataTreeCandidateSerializer(schemaContext, codecSupplier, jsonWriter);
         for (final DataTreeCandidate candidate : input) {
             serializer.serialize(candidate, leafNodesOnly, skipData);
         }
index 131216036a20071211242e327f233174f87cc56c..369e3c97afb0c21eb7ce01745c61116a7d64d2e1 100644 (file)
@@ -7,6 +7,9 @@
  */
 package org.opendaylight.restconf.common.serializer;
 
+import static com.google.common.base.Verify.verifyNotNull;
+import static java.util.Objects.requireNonNull;
+
 import java.util.ArrayDeque;
 import java.util.Collection;
 import java.util.Deque;
@@ -21,14 +24,22 @@ import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidateNode;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.ModificationType;
+import org.opendaylight.yangtools.yang.data.util.DataSchemaContextTree;
+import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
+import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public abstract class AbstractWebsocketSerializer<T extends Exception> {
-
     private static final Logger LOG = LoggerFactory.getLogger(AbstractWebsocketSerializer.class);
 
-    public void serialize(final DataTreeCandidate candidate, final boolean leafNodesOnly, final boolean skipData)
+    private final EffectiveModelContext context;
+
+    protected AbstractWebsocketSerializer(final EffectiveModelContext context) {
+        this.context = requireNonNull(context);
+    }
+
+    public final void serialize(final DataTreeCandidate candidate, final boolean leafNodesOnly, final boolean skipData)
             throws T {
         final Deque<PathArgument> path = new ArrayDeque<>();
         path.addAll(candidate.getRootPath().getPathArguments());
@@ -78,8 +89,21 @@ public abstract class AbstractWebsocketSerializer<T extends Exception> {
         }
     }
 
-    abstract void serializeData(Collection<PathArgument> path, DataTreeCandidateNode candidate, boolean skipData)
-            throws T;
+    private void serializeData(final Collection<PathArgument> dataPath, final DataTreeCandidateNode candidate,
+            final boolean skipData) throws T {
+        var current = DataSchemaContextTree.from(context).getRoot();
+        for (var arg : dataPath) {
+            final var next = verifyNotNull(current.getChild(arg),
+                "Failed to resolve %s: cannot find %s in %s", dataPath, arg, current);
+            current = next;
+        }
+        final var schemaPath = verifyNotNull(current.getDataSchemaNode(),
+            "Path %s resolved to non-data %s", dataPath, current).getPath();
+        serializeData(context, schemaPath, dataPath, candidate, skipData);
+    }
+
+    abstract void serializeData(EffectiveModelContext context, SchemaPath schemaPath, Collection<PathArgument> dataPath,
+            DataTreeCandidateNode candidate, boolean skipData) throws T;
 
     abstract void serializePath(Collection<PathArgument> pathArguments) throws T;
 
@@ -89,8 +113,11 @@ public abstract class AbstractWebsocketSerializer<T extends Exception> {
         final StringBuilder pathBuilder = new StringBuilder();
 
         for (PathArgument pathArgument : path) {
+            if (pathArgument instanceof YangInstanceIdentifier.AugmentationIdentifier) {
+                continue;
+            }
             pathBuilder.append("/");
-            pathBuilder.append(pathArgument.getNodeType().getNamespace().toString().replaceAll(":", "-"));
+            pathBuilder.append(pathArgument.getNodeType().getNamespace().toString().replace(':', '-'));
             pathBuilder.append(":");
             pathBuilder.append(pathArgument.getNodeType().getLocalName());
 
@@ -99,7 +126,7 @@ public abstract class AbstractWebsocketSerializer<T extends Exception> {
                 final Set<Map.Entry<QName, Object>> keys =
                         ((YangInstanceIdentifier.NodeIdentifierWithPredicates) pathArgument).entrySet();
                 for (Map.Entry<QName, Object> key : keys) {
-                    pathBuilder.append(key.getKey().getNamespace().toString().replaceAll(":", "-"));
+                    pathBuilder.append(key.getKey().getNamespace().toString().replace(':', '-'));
                     pathBuilder.append(":");
                     pathBuilder.append(key.getKey().getLocalName());
                     pathBuilder.append("='");
index 37fb4ad3b4f5b66d3435c823b164efa3cffdb775..74b5f89ad554ba929ddfd078161e15c78d2e39d8 100644 (file)
@@ -7,11 +7,13 @@
  */
 package org.opendaylight.restconf.common.serializer;
 
+import static java.util.Objects.requireNonNull;
+
 import com.google.gson.stream.JsonWriter;
 import java.io.IOException;
 import java.util.Collection;
-import java.util.stream.Collectors;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidateNode;
@@ -21,32 +23,24 @@ import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 
 public class JsonDataTreeCandidateSerializer extends AbstractWebsocketSerializer<IOException> {
-
     private final JSONCodecFactorySupplier codecSupplier;
-    private final EffectiveModelContext context;
     private final JsonWriter jsonWriter;
 
-    public JsonDataTreeCandidateSerializer(final JSONCodecFactorySupplier codecSupplier,
-                                           final EffectiveModelContext context,
-                                           final JsonWriter jsonWriter) {
-
-        this.codecSupplier = codecSupplier;
-        this.context = context;
-        this.jsonWriter = jsonWriter;
+    public JsonDataTreeCandidateSerializer(final EffectiveModelContext context,
+            final JSONCodecFactorySupplier codecSupplier, final JsonWriter jsonWriter) {
+        super(context);
+        this.codecSupplier = requireNonNull(codecSupplier);
+        this.jsonWriter = requireNonNull(jsonWriter);
     }
 
-    void serializeData(Collection<YangInstanceIdentifier.PathArgument> nodePath, DataTreeCandidateNode candidate,
-                       boolean skipData)
-            throws IOException {
-        final SchemaPath path = SchemaPath.create(nodePath.stream()
-                .filter(p -> !(p instanceof YangInstanceIdentifier.NodeIdentifierWithPredicates))
-                .map(YangInstanceIdentifier.PathArgument::getNodeType).collect(Collectors.toList()), true);
-        final NormalizedNodeStreamWriter nestedWriter =
-                JSONNormalizedNodeStreamWriter
-                        .createNestedWriter(codecSupplier.getShared(context), path.getParent(), null, jsonWriter);
-
+    @Override
+    void serializeData(final EffectiveModelContext context, final SchemaPath schemaPath,
+            final Collection<PathArgument> dataPath, final DataTreeCandidateNode candidate, final boolean skipData)
+                throws IOException {
+        NormalizedNodeStreamWriter nestedWriter = JSONNormalizedNodeStreamWriter.createNestedWriter(
+            codecSupplier.getShared(context), schemaPath.getParent(), null, jsonWriter);
         jsonWriter.beginObject();
-        serializePath(nodePath);
+        serializePath(dataPath);
 
         if (!skipData && candidate.getDataAfter().isPresent()) {
             jsonWriter.name("data").beginObject();
@@ -69,7 +63,7 @@ public class JsonDataTreeCandidateSerializer extends AbstractWebsocketSerializer
     }
 
     @Override
-    void serializePath(Collection<YangInstanceIdentifier.PathArgument> pathArguments)
+    void serializePath(final Collection<YangInstanceIdentifier.PathArgument> pathArguments)
             throws IOException {
         jsonWriter.name("path").value(convertPath(pathArguments));
     }
index 71e6d266ea9579a6bb2748131dc1be1dc06baeea..a2ba87ad4589458a5b0e5c2d486b0517a3d37f16 100644 (file)
@@ -7,13 +7,12 @@
  */
 package org.opendaylight.restconf.common.serializer;
 
+import static java.util.Objects.requireNonNull;
 import static org.opendaylight.restconf.common.formatters.XMLNotificationFormatter.DATA_CHANGE_EVENT_ELEMENT;
 
 import java.util.Collection;
-import java.util.stream.Collectors;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamWriter;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter;
@@ -23,24 +22,19 @@ import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 
 public class XmlDataTreeCandidateSerializer extends AbstractWebsocketSerializer<Exception> {
-
-    private final EffectiveModelContext context;
     private final XMLStreamWriter xmlWriter;
 
-    public XmlDataTreeCandidateSerializer(EffectiveModelContext context, XMLStreamWriter xmlWriter) {
-        this.context = context;
-        this.xmlWriter = xmlWriter;
+    public XmlDataTreeCandidateSerializer(final EffectiveModelContext context, final XMLStreamWriter xmlWriter) {
+        super(context);
+        this.xmlWriter = requireNonNull(xmlWriter);
     }
 
     @Override
-    void serializeData(Collection<PathArgument> nodePath, DataTreeCandidateNode candidate, boolean skipData)
-            throws Exception {
-        final SchemaPath path = SchemaPath.create(nodePath.stream()
-                .filter(p -> !(p instanceof YangInstanceIdentifier.NodeIdentifierWithPredicates))
-                .map(PathArgument::getNodeType).collect(Collectors.toList()), true);
-        final NormalizedNodeStreamWriter nodeStreamWriter =
-                XMLStreamNormalizedNodeStreamWriter.create(xmlWriter, context, path.getParent());
-
+    void serializeData(final EffectiveModelContext context, final SchemaPath schemaPath,
+            final Collection<PathArgument> nodePath, final DataTreeCandidateNode candidate, final boolean skipData)
+                throws Exception {
+        NormalizedNodeStreamWriter nodeStreamWriter = XMLStreamNormalizedNodeStreamWriter.create(xmlWriter, context,
+            schemaPath.getParent());
         xmlWriter.writeStartElement(DATA_CHANGE_EVENT_ELEMENT);
         serializePath(nodePath);
 
@@ -58,14 +52,14 @@ public class XmlDataTreeCandidateSerializer extends AbstractWebsocketSerializer<
     }
 
     @Override
-    public void serializePath(Collection<PathArgument> pathArguments) throws XMLStreamException {
+    public void serializePath(final Collection<PathArgument> pathArguments) throws XMLStreamException {
         xmlWriter.writeStartElement("path");
         xmlWriter.writeCharacters(convertPath(pathArguments));
         xmlWriter.writeEndElement();
     }
 
     @Override
-    public void serializeOperation(DataTreeCandidateNode candidate) throws XMLStreamException {
+    public void serializeOperation(final DataTreeCandidateNode candidate) throws XMLStreamException {
         xmlWriter.writeStartElement("operation");
         xmlWriter.writeCharacters(modificationTypeToOperation(candidate, candidate.getModificationType()));
         xmlWriter.writeEndElement();
index b616916c693803db06b52cd772a4d09d86175e7a..48a33593addd5fecdd10fcc4ab8f795f42fcd8d2 100644 (file)
@@ -18,6 +18,7 @@ import java.net.URL;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Paths;
+import java.util.Map;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 import org.json.JSONException;
@@ -39,7 +40,10 @@ import org.opendaylight.restconf.nb.rfc8040.NotificationQueryParams;
 import org.opendaylight.restconf.nb.rfc8040.SkipNotificationDataParam;
 import org.opendaylight.restconf.nb.rfc8040.StartTimeParam;
 import org.opendaylight.restconf.nb.rfc8040.handlers.SchemaContextHandler;
+import org.opendaylight.yang.gen.v1.augment.instance.identifier.patch.module.rev220218.PatchCont1Builder;
+import org.opendaylight.yang.gen.v1.augment.instance.identifier.patch.module.rev220218.patch.cont.patch.choice1.PatchCase1Builder;
 import org.opendaylight.yang.gen.v1.instance.identifier.patch.module.rev151121.PatchCont;
+import org.opendaylight.yang.gen.v1.instance.identifier.patch.module.rev151121.PatchContBuilder;
 import org.opendaylight.yang.gen.v1.instance.identifier.patch.module.rev151121.patch.cont.MyList1;
 import org.opendaylight.yang.gen.v1.instance.identifier.patch.module.rev151121.patch.cont.MyList1Builder;
 import org.opendaylight.yang.gen.v1.instance.identifier.patch.module.rev151121.patch.cont.MyList1Key;
@@ -96,8 +100,8 @@ public class ListenerAdapterTest extends AbstractConcurrentDataBrokerTest {
 
     @BeforeClass
     public static void beforeClass() {
-        SCHEMA_CONTEXT = YangParserTestUtils.parseYangResource(
-                "/instanceidentifier/yang/instance-identifier-patch-module.yang");
+        SCHEMA_CONTEXT = YangParserTestUtils.parseYangResourceDirectory(
+                "/instanceidentifier/yang");
     }
 
     @AfterClass
@@ -213,15 +217,31 @@ public class ListenerAdapterTest extends AbstractConcurrentDataBrokerTest {
         changeService.registerDataTreeChangeListener(root, adapter);
 
         WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();
-        MyList1Builder builder = new MyList1Builder().setMyLeaf11("Jed").setName("Althea");
-        final InstanceIdentifier<MyList1> iid = InstanceIdentifier.create(PatchCont.class)
-                .child(MyList1.class, new MyList1Key("Althea"));
+        final InstanceIdentifier<PatchCont> iid = InstanceIdentifier.create(PatchCont.class);
+        PatchContBuilder builder =
+                new PatchContBuilder()
+                        .addAugmentation(
+                                new PatchCont1Builder()
+                            .setPatchChoice1(new PatchCase1Builder().setCaseLeaf1("ChoiceLeaf").build())
+                                        .setLeaf1("AugmentLeaf").build())
+                        .setMyList1(
+                                Map.of(new MyList1Key("Althea"),
+                                        new MyList1Builder().setMyLeaf11("Jed").setName("Althea").build())
+                        );
         writeTransaction.mergeParentStructurePut(LogicalDatastoreType.CONFIGURATION, iid, builder.build());
         writeTransaction.commit();
         adapter.assertGot(getNotifJson(JSON_NOTIF_LEAVES_CREATE));
 
         writeTransaction = dataBroker.newWriteOnlyTransaction();
-        builder = new MyList1Builder().withKey(new MyList1Key("Althea")).setMyLeaf12("Bertha");
+        builder = new PatchContBuilder()
+                .addAugmentation(
+                        new PatchCont1Builder()
+                                .setPatchChoice1(new PatchCase1Builder().setCaseLeaf1("ChoiceUpdate").build())
+                                .setLeaf1("AugmentLeaf").build())
+                .setMyList1(
+                        Map.of(new MyList1Key("Althea"),
+                                new MyList1Builder().setMyLeaf12("Bertha").setName("Althea").build())
+                );
         writeTransaction.mergeParentStructureMerge(LogicalDatastoreType.CONFIGURATION, iid, builder.build());
         writeTransaction.commit();
         adapter.assertGot(getNotifJson(JSON_NOTIF_LEAVES_UPDATE));
@@ -365,15 +385,30 @@ public class ListenerAdapterTest extends AbstractConcurrentDataBrokerTest {
         DOMDataTreeIdentifier root = new DOMDataTreeIdentifier(LogicalDatastoreType.CONFIGURATION, PATCH_CONT_YIID);
         changeService.registerDataTreeChangeListener(root, adapter);
         WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();
-        MyList1Builder builder = new MyList1Builder().setMyLeaf11("Jed").setName("Althea");
-        InstanceIdentifier<MyList1> iid = InstanceIdentifier.create(PatchCont.class)
-                .child(MyList1.class, new MyList1Key("Althea"));
+        final InstanceIdentifier<PatchCont> iid = InstanceIdentifier.create(PatchCont.class);
+        PatchContBuilder builder = new PatchContBuilder()
+                .addAugmentation(
+                        new PatchCont1Builder()
+                                .setPatchChoice1(new PatchCase1Builder().setCaseLeaf1("ChoiceLeaf").build())
+                                .setLeaf1("AugmentLeaf").build())
+                                .setMyList1(
+                                        Map.of(new MyList1Key("Althea"),
+                                                new MyList1Builder().setMyLeaf11("Jed").setName("Althea").build())
+                        );
         writeTransaction.mergeParentStructurePut(LogicalDatastoreType.CONFIGURATION, iid, builder.build());
         writeTransaction.commit();
         adapter.assertXmlSimilar(getResultXml(XML_NOTIF_LEAVES_CREATE));
 
         writeTransaction = dataBroker.newWriteOnlyTransaction();
-        builder = new MyList1Builder().withKey(new MyList1Key("Althea")).setMyLeaf12("Bertha");
+        builder = new PatchContBuilder()
+                .addAugmentation(
+                        new PatchCont1Builder()
+                                .setPatchChoice1(new PatchCase1Builder().setCaseLeaf1("ChoiceUpdate").build())
+                                .setLeaf1("AugmentLeaf").build())
+                                .setMyList1(
+                                    Map.of(new MyList1Key("Althea"),
+                                                new MyList1Builder().setMyLeaf12("Bertha").setName("Althea").build())
+                );
         writeTransaction.mergeParentStructureMerge(LogicalDatastoreType.CONFIGURATION, iid, builder.build());
         writeTransaction.commit();
         adapter.assertXmlSimilar(getResultXml(XML_NOTIF_LEAVES_UPDATE));
@@ -387,5 +422,7 @@ public class ListenerAdapterTest extends AbstractConcurrentDataBrokerTest {
         assertTrue(notification.contains("instance-identifier-patch-module:my-leaf12"));
         assertTrue(notification.contains("instance-identifier-patch-module:my-leaf11"));
         assertTrue(notification.contains("instance-identifier-patch-module:name"));
+        assertTrue(notification.contains("augment-instance-identifier-patch-module:case-leaf1"));
+        assertTrue(notification.contains("augment-instance-identifier-patch-module:leaf1"));
     }
 }
diff --git a/restconf/restconf-nb-rfc8040/src/test/resources/instanceidentifier/yang/augment-iip-module.yang b/restconf/restconf-nb-rfc8040/src/test/resources/instanceidentifier/yang/augment-iip-module.yang
new file mode 100644 (file)
index 0000000..07b9c46
--- /dev/null
@@ -0,0 +1,30 @@
+module augment-iip-module {
+  namespace "augment:instance:identifier:patch:module";
+  prefix "aiipmodule";
+
+  import instance-identifier-patch-module {
+   prefix imodule; revision-date 2015-11-21;
+  }
+
+  revision 2022-02-18 {
+  }
+
+  augment "/imodule:patch-cont" {
+      choice patch-choice1 {
+        case patch-case1 {
+          leaf case-leaf1 {
+            type string;
+          }
+        }
+        case patch-case2 {
+          leaf case-leaf2 {
+            type int64;
+          }
+        }
+      }
+      leaf leaf1 {
+        type string;
+      }
+  }
+
+}
\ No newline at end of file
index c46115ef09270600e5cf064ca00156287fce7c5e..eb408f3b25ad88de650c82160ac8b787257806a9 100644 (file)
@@ -1,23 +1,37 @@
 {
-    "urn-ietf-params-xml-ns-netconf-notification-1.0:notification":{
-        "urn-opendaylight-params-xml-ns-yang-controller-md-sal-remote:data-changed-notification":{
-            "data-change-event":[
-                {
-                    "path":"/instance-identifier-patch-module:patch-cont/instance-identifier-patch-module:my-list1/instance-identifier-patch-module:my-list1[instance-identifier-patch-module:name='Althea']/instance-identifier-patch-module:my-leaf11",
-                    "data":{
-                        "instance-identifier-patch-module:my-leaf11":"Jed"
-                    },
-                    "operation":"created"
-                },
-                {
-                    "path":"/instance-identifier-patch-module:patch-cont/instance-identifier-patch-module:my-list1/instance-identifier-patch-module:my-list1[instance-identifier-patch-module:name='Althea']/instance-identifier-patch-module:name",
-                    "data":{
-                        "instance-identifier-patch-module:name":"Althea"
-                    },
-                    "operation":"created"
-                }
-            ]
+  "urn-ietf-params-xml-ns-netconf-notification-1.0:notification": {
+    "urn-opendaylight-params-xml-ns-yang-controller-md-sal-remote:data-changed-notification": {
+      "data-change-event": [
+        {
+          "path": "/instance-identifier-patch-module:patch-cont/instance-identifier-patch-module:my-list1/instance-identifier-patch-module:my-list1[instance-identifier-patch-module:name='Althea']/instance-identifier-patch-module:my-leaf11",
+          "data": {
+            "instance-identifier-patch-module:my-leaf11": "Jed"
+          },
+          "operation": "created"
         },
-        "event-time":"2020-10-15T13:01:29.019468+02:00"
-    }
+        {
+          "path": "/instance-identifier-patch-module:patch-cont/instance-identifier-patch-module:my-list1/instance-identifier-patch-module:my-list1[instance-identifier-patch-module:name='Althea']/instance-identifier-patch-module:name",
+          "data": {
+            "instance-identifier-patch-module:name": "Althea"
+          },
+          "operation": "created"
+        },
+        {
+          "path": "/instance-identifier-patch-module:patch-cont/augment-instance-identifier-patch-module:patch-choice1/augment-instance-identifier-patch-module:case-leaf1",
+          "data": {
+            "augment-iip-module:case-leaf1": "ChoiceLeaf"
+          },
+          "operation": "created"
+        },
+        {
+          "path": "/instance-identifier-patch-module:patch-cont/augment-instance-identifier-patch-module:leaf1",
+          "data": {
+            "augment-iip-module:leaf1": "AugmentLeaf"
+          },
+          "operation": "created"
+        }
+      ]
+    },
+    "event-time": "2022-02-18T18:04:25.177143+01:00"
+  }
 }
\ No newline at end of file
index ed7a7a53d9984dd7e5c448c590db27ffce469638..aff6471ebd677399dcfcebbadb86e2fdbc71382b 100644 (file)
@@ -1,19 +1,39 @@
 <notification xmlns="urn:ietf:params:xml:ns:netconf:notification:1.0">
-    <eventTime>2020-10-19T13:50:24.917103+02:00</eventTime>
+    <eventTime>2022-02-18T18:04:25.177143+01:00</eventTime>
     <data-changed-notification xmlns="urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote">
         <data-change-event>
-            <path>/instance-identifier-patch-module:patch-cont/instance-identifier-patch-module:my-list1/instance-identifier-patch-module:my-list1[instance-identifier-patch-module:name='Althea']/instance-identifier-patch-module:my-leaf11</path>
+            <path>
+                /instance-identifier-patch-module:patch-cont/instance-identifier-patch-module:my-list1/instance-identifier-patch-module:my-list1[instance-identifier-patch-module:name='Althea']/instance-identifier-patch-module:my-leaf11
+            </path>
             <data>
                 <my-leaf11 xmlns="instance:identifier:patch:module">Jed</my-leaf11>
             </data>
             <operation>created</operation>
         </data-change-event>
         <data-change-event>
-            <path>/instance-identifier-patch-module:patch-cont/instance-identifier-patch-module:my-list1/instance-identifier-patch-module:my-list1[instance-identifier-patch-module:name='Althea']/instance-identifier-patch-module:name</path>
+            <path>
+                /instance-identifier-patch-module:patch-cont/instance-identifier-patch-module:my-list1/instance-identifier-patch-module:my-list1[instance-identifier-patch-module:name='Althea']/instance-identifier-patch-module:name
+            </path>
             <data>
                 <name xmlns="instance:identifier:patch:module">Althea</name>
             </data>
             <operation>created</operation>
         </data-change-event>
+        <data-change-event>
+            <path>
+                /instance-identifier-patch-module:patch-cont/augment-instance-identifier-patch-module:patch-choice1/augment-instance-identifier-patch-module:case-leaf1
+            </path>
+            <data>
+                <case-leaf1 xmlns="augment:instance:identifier:patch:module">ChoiceLeaf</case-leaf1>
+            </data>
+            <operation>created</operation>
+        </data-change-event>
+        <data-change-event>
+            <path>/instance-identifier-patch-module:patch-cont/augment-instance-identifier-patch-module:leaf1</path>
+            <data>
+                <leaf1 xmlns="augment:instance:identifier:patch:module">AugmentLeaf</leaf1>
+            </data>
+            <operation>created</operation>
+        </data-change-event>
     </data-changed-notification>
 </notification>
\ No newline at end of file
index b82d295f2414095620c81435af54b3e981bc81f1..7bba9222549d4bf29e0db5096e56eb849017e168 100644 (file)
@@ -1,21 +1,29 @@
 {
-    "urn-ietf-params-xml-ns-netconf-notification-1.0:notification":{
-        "urn-opendaylight-params-xml-ns-yang-controller-md-sal-remote:data-changed-notification":{
-            "data-change-event": [
-                {
-                    "operation": "deleted",
-                    "path": "/instance-identifier-patch-module:patch-cont/instance-identifier-patch-module:my-list1/instance-identifier-patch-module:my-list1[instance-identifier-patch-module:name='Althea']/instance-identifier-patch-module:my-leaf11"
-                },
-                {
-                    "operation": "deleted",
-                    "path": "/instance-identifier-patch-module:patch-cont/instance-identifier-patch-module:my-list1/instance-identifier-patch-module:my-list1[instance-identifier-patch-module:name='Althea']/instance-identifier-patch-module:name"
-                },
-                {
-                    "operation": "deleted",
-                    "path": "/instance-identifier-patch-module:patch-cont/instance-identifier-patch-module:my-list1/instance-identifier-patch-module:my-list1[instance-identifier-patch-module:name='Althea']/instance-identifier-patch-module:my-leaf12"
-                }
-            ],
+  "urn-ietf-params-xml-ns-netconf-notification-1.0:notification": {
+    "urn-opendaylight-params-xml-ns-yang-controller-md-sal-remote:data-changed-notification": {
+      "data-change-event": [
+        {
+          "path": "/instance-identifier-patch-module:patch-cont/instance-identifier-patch-module:my-list1/instance-identifier-patch-module:my-list1[instance-identifier-patch-module:name='Althea']/instance-identifier-patch-module:my-leaf11",
+          "operation": "deleted"
         },
-        "event-time": "2017-09-18T15:30:16.099+03:00",
-    }
-}
+        {
+          "path": "/instance-identifier-patch-module:patch-cont/instance-identifier-patch-module:my-list1/instance-identifier-patch-module:my-list1[instance-identifier-patch-module:name='Althea']/instance-identifier-patch-module:name",
+          "operation": "deleted"
+        },
+        {
+          "path": "/instance-identifier-patch-module:patch-cont/instance-identifier-patch-module:my-list1/instance-identifier-patch-module:my-list1[instance-identifier-patch-module:name='Althea']/instance-identifier-patch-module:my-leaf12",
+          "operation": "deleted"
+        },
+        {
+          "path": "/instance-identifier-patch-module:patch-cont/augment-instance-identifier-patch-module:patch-choice1/augment-instance-identifier-patch-module:case-leaf1",
+          "operation": "deleted"
+        },
+        {
+          "path": "/instance-identifier-patch-module:patch-cont/augment-instance-identifier-patch-module:leaf1",
+          "operation": "deleted"
+        }
+      ]
+    },
+    "event-time": "2022-02-18T18:07:48.662524+01:00"
+  }
+}
\ No newline at end of file
diff --git a/restconf/restconf-nb-rfc8040/src/test/resources/listener-adapter-test/notif-leaves-delete.xml b/restconf/restconf-nb-rfc8040/src/test/resources/listener-adapter-test/notif-leaves-delete.xml
new file mode 100644 (file)
index 0000000..38ea208
--- /dev/null
@@ -0,0 +1,33 @@
+<notification xmlns="urn:ietf:params:xml:ns:netconf:notification:1.0">
+    <eventTime>2022-02-18T18:07:48.662524+01:00</eventTime>
+    <data-changed-notification xmlns="urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote">
+        <data-change-event>
+            <path>
+                /instance-identifier-patch-module:patch-cont/instance-identifier-patch-module:my-list1/instance-identifier-patch-module:my-list1[instance-identifier-patch-module:name='Althea']/instance-identifier-patch-module:my-leaf11
+            </path>
+            <operation>deleted</operation>
+        </data-change-event>
+        <data-change-event>
+            <path>
+                /instance-identifier-patch-module:patch-cont/instance-identifier-patch-module:my-list1/instance-identifier-patch-module:my-list1[instance-identifier-patch-module:name='Althea']/instance-identifier-patch-module:name
+            </path>
+            <operation>deleted</operation>
+        </data-change-event>
+        <data-change-event>
+            <path>
+                /instance-identifier-patch-module:patch-cont/instance-identifier-patch-module:my-list1/instance-identifier-patch-module:my-list1[instance-identifier-patch-module:name='Althea']/instance-identifier-patch-module:my-leaf12
+            </path>
+            <operation>deleted</operation>
+        </data-change-event>
+        <data-change-event>
+            <path>
+                /instance-identifier-patch-module:patch-cont/augment-instance-identifier-patch-module:patch-choice1/augment-instance-identifier-patch-module:case-leaf1
+            </path>
+            <operation>deleted</operation>
+        </data-change-event>
+        <data-change-event>
+            <path>/instance-identifier-patch-module:patch-cont/augment-instance-identifier-patch-module:leaf1</path>
+            <operation>deleted</operation>
+        </data-change-event>
+    </data-changed-notification>
+</notification>
\ No newline at end of file
index 7a0b6161d3af6e118c89b08c32fb344d11bf06a6..ea825fd10346fbc36226117bc6cb1749317f00fc 100644 (file)
@@ -1,23 +1,37 @@
 {
-    "urn-ietf-params-xml-ns-netconf-notification-1.0:notification":{
-        "urn-opendaylight-params-xml-ns-yang-controller-md-sal-remote:data-changed-notification":{
-            "data-change-event":[
-                {
-                    "path":"/instance-identifier-patch-module:patch-cont/instance-identifier-patch-module:my-list1/instance-identifier-patch-module:my-list1[instance-identifier-patch-module:name='Althea']/instance-identifier-patch-module:name",
-                    "data":{
-                        "instance-identifier-patch-module:name":"Althea"
-                    },
-                    "operation":"updated"
-                },
-                {
-                    "path":"/instance-identifier-patch-module:patch-cont/instance-identifier-patch-module:my-list1/instance-identifier-patch-module:my-list1[instance-identifier-patch-module:name='Althea']/instance-identifier-patch-module:my-leaf12",
-                    "data":{
-                        "instance-identifier-patch-module:my-leaf12":"Bertha"
-                    },
-                    "operation":"created"
-                }
-            ]
+  "urn-ietf-params-xml-ns-netconf-notification-1.0:notification": {
+    "urn-opendaylight-params-xml-ns-yang-controller-md-sal-remote:data-changed-notification": {
+      "data-change-event": [
+        {
+          "path": "/instance-identifier-patch-module:patch-cont/instance-identifier-patch-module:my-list1/instance-identifier-patch-module:my-list1[instance-identifier-patch-module:name='Althea']/instance-identifier-patch-module:name",
+          "data": {
+            "instance-identifier-patch-module:name": "Althea"
+          },
+          "operation": "updated"
         },
-        "event-time":"2020-10-15T13:23:29.520115+02:00"
-    }
+        {
+          "path": "/instance-identifier-patch-module:patch-cont/instance-identifier-patch-module:my-list1/instance-identifier-patch-module:my-list1[instance-identifier-patch-module:name='Althea']/instance-identifier-patch-module:my-leaf12",
+          "data": {
+            "instance-identifier-patch-module:my-leaf12": "Bertha"
+          },
+          "operation": "created"
+        },
+        {
+        "path": "/instance-identifier-patch-module:patch-cont/augment-instance-identifier-patch-module:patch-choice1/augment-instance-identifier-patch-module:case-leaf1",
+        "data": {
+          "augment-iip-module:case-leaf1": "ChoiceUpdate"
+        },
+          "operation": "updated"
+        },
+        {
+          "path": "/instance-identifier-patch-module:patch-cont/augment-instance-identifier-patch-module:leaf1",
+          "data": {
+            "augment-iip-module:leaf1": "AugmentLeaf"
+          },
+          "operation": "updated"
+        }
+      ]
+    },
+    "event-time": "2022-02-18T18:04:25.214583+01:00"
+  }
 }
\ No newline at end of file
index 2fc5729fbe084c055bd64d41f35543d497bd24aa..19b3bf61eb1090c605c0bb0169144e71cc752761 100644 (file)
@@ -1,19 +1,39 @@
 <notification xmlns="urn:ietf:params:xml:ns:netconf:notification:1.0">
-    <eventTime>2020-10-19T13:54:31.86969+02:00</eventTime>
+    <eventTime>2022-02-18T18:04:25.214583+01:00</eventTime>
     <data-changed-notification xmlns="urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote">
         <data-change-event>
-            <path>/instance-identifier-patch-module:patch-cont/instance-identifier-patch-module:my-list1/instance-identifier-patch-module:my-list1[instance-identifier-patch-module:name='Althea']/instance-identifier-patch-module:name</path>
+            <path>
+                /instance-identifier-patch-module:patch-cont/instance-identifier-patch-module:my-list1/instance-identifier-patch-module:my-list1[instance-identifier-patch-module:name='Althea']/instance-identifier-patch-module:name
+            </path>
             <data>
                 <name xmlns="instance:identifier:patch:module">Althea</name>
             </data>
             <operation>updated</operation>
         </data-change-event>
         <data-change-event>
-            <path>/instance-identifier-patch-module:patch-cont/instance-identifier-patch-module:my-list1/instance-identifier-patch-module:my-list1[instance-identifier-patch-module:name='Althea']/instance-identifier-patch-module:my-leaf12</path>
+            <path>
+                /instance-identifier-patch-module:patch-cont/instance-identifier-patch-module:my-list1/instance-identifier-patch-module:my-list1[instance-identifier-patch-module:name='Althea']/instance-identifier-patch-module:my-leaf12
+            </path>
             <data>
                 <my-leaf12 xmlns="instance:identifier:patch:module">Bertha</my-leaf12>
             </data>
             <operation>created</operation>
         </data-change-event>
+        <data-change-event>
+            <path>
+                /instance-identifier-patch-module:patch-cont/augment-instance-identifier-patch-module:patch-choice1/augment-instance-identifier-patch-module:case-leaf1
+            </path>
+            <data>
+                <case-leaf1 xmlns="augment:instance:identifier:patch:module">ChoiceUpdate</case-leaf1>
+            </data>
+            <operation>updated</operation>
+        </data-change-event>
+        <data-change-event>
+            <path>/instance-identifier-patch-module:patch-cont/augment-instance-identifier-patch-module:leaf1</path>
+            <data>
+                <leaf1 xmlns="augment:instance:identifier:patch:module">AugmentLeaf</leaf1>
+            </data>
+            <operation>updated</operation>
+        </data-change-event>
     </data-changed-notification>
 </notification>
\ No newline at end of file