<!-- 
RSS generated by JIRA (8.20.10#820010-sha1:ace47f9899e9ee25d7157d59aa17ab06aee30d3d) at Wed Feb 07 20:15:47 UTC 2024

It is possible to restrict the fields that are returned in this document by specifying the 'field' parameter in your request.
For example, to request only the issue key and summary append 'field=key&field=summary' to the URL of your request.
-->
<rss version="0.92" >
<channel>
    <title>OpenDaylight JIRA</title>
    <link>https://jira.opendaylight.org</link>
    <description>This file is an XML representation of an issue</description>
    <language>en-us</language>    <build-info>
        <version>8.20.10</version>
        <build-number>820010</build-number>
        <build-date>22-06-2022</build-date>
    </build-info>


<item>
            <title>[NETCONF-746] YANG patch request on NETCONF mountpoint is not atomic</title>
                <link>https://jira.opendaylight.org/browse/NETCONF-746</link>
                <project id="10142" key="NETCONF">netconf</project>
                    <description>&lt;p&gt;The &lt;a href=&quot;https://tools.ietf.org/html/rfc8072#page-3&quot; class=&quot;external-link&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;&gt;RFC8072&lt;/a&gt;&#160;states in the introduction part, that:&lt;br/&gt;
 &quot;For any protocol that supports the YANG Patch media type, if the entire patch document cannot be successfully applied, then the server MUST NOT apply any of the changes.&quot;&lt;/p&gt;

&lt;p&gt;This is not the case when executing YANG patch request on NETCONF mountpoint.&lt;/p&gt;

&lt;p&gt;If YANG patch request contains for example three edits - edit1, edit2 and edit3. Then if edit1 is successfully executed but edit2 fails, then request execution will stop (edit3 will not be executed). However data modification from edit1 will be applied anyway.&lt;/p&gt;

&lt;p&gt;Atomicity works as it should when executing YANG patch request on ODL datastore. Problem seems to be only when working with mountpoints.&lt;/p&gt;

&lt;p&gt;&amp;#8212;&lt;/p&gt;

&lt;p&gt;Actual example (tested with RFC8040 and on Aluminium SR0 and Magnesium SR2 versions):&lt;br/&gt;
 Test YANG model:&lt;/p&gt;
&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;
module test-model {
  namespace &lt;span class=&quot;code-quote&quot;&gt;&quot;test-ns&quot;&lt;/span&gt;;
  prefix test-model;

  container container-root {
    leaf leaf-lvl1 {
      type string;
    }
    container container-lvl1 {
      leaf leaf-lvl2 {
        type string;
      }
      list list-lvl2 {
        key list-lvl2-key;
        leaf list-lvl2-key {
          type string;
        }
        leaf leaf-lvl2 {
          type string;
        }
      }
    }
  }
}
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Mountpoint datastore content before executing YANG patch (note that &quot;leaf-lvl1&quot; contains value &quot;something&quot;):&lt;/p&gt;
&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-json&quot;&gt;
{
    &lt;span class=&quot;code-quote&quot;&gt;&quot;test-model:container-root&quot;&lt;/span&gt;: {
        &lt;span class=&quot;code-quote&quot;&gt;&quot;leaf-lvl1&quot;&lt;/span&gt;: &lt;span class=&quot;code-quote&quot;&gt;&quot;something&quot;&lt;/span&gt;,
        &lt;span class=&quot;code-quote&quot;&gt;&quot;container-lvl1&quot;&lt;/span&gt;: {
            &lt;span class=&quot;code-quote&quot;&gt;&quot;list-lvl2&quot;&lt;/span&gt;: [
                {
                    &lt;span class=&quot;code-quote&quot;&gt;&quot;list-lvl2-key&quot;&lt;/span&gt;: &lt;span class=&quot;code-quote&quot;&gt;&quot;key&quot;&lt;/span&gt;,
                    &lt;span class=&quot;code-quote&quot;&gt;&quot;leaf-lvl2&quot;&lt;/span&gt;: &lt;span class=&quot;code-quote&quot;&gt;&quot;something&quot;&lt;/span&gt;
                },
                {
                    &lt;span class=&quot;code-quote&quot;&gt;&quot;list-lvl2-key&quot;&lt;/span&gt;: &lt;span class=&quot;code-quote&quot;&gt;&quot;key2&quot;&lt;/span&gt;,
                    &lt;span class=&quot;code-quote&quot;&gt;&quot;leaf-lvl2&quot;&lt;/span&gt;: &lt;span class=&quot;code-quote&quot;&gt;&quot;something&quot;&lt;/span&gt;
                }
            ]
        }
    }
}
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;YANG patch request payload - edit1 and edit3 are operation &quot;replace&quot;, but edit2 is operation &quot;create&quot;, which fails, because data already exists (note that we are trying to rewrite leaf values from &quot;something&quot; to &quot;something-else&quot;):&lt;/p&gt;
&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-json&quot;&gt;
{
    &lt;span class=&quot;code-quote&quot;&gt;&quot;ietf-yang-patch:yang-patch&quot;&lt;/span&gt;: {
        &lt;span class=&quot;code-quote&quot;&gt;&quot;patch-id&quot;&lt;/span&gt;: &lt;span class=&quot;code-quote&quot;&gt;&quot;patch1&quot;&lt;/span&gt;,
        &lt;span class=&quot;code-quote&quot;&gt;&quot;comment&quot;&lt;/span&gt;: &lt;span class=&quot;code-quote&quot;&gt;&quot;Edit mountpoint data&quot;&lt;/span&gt;,
        &lt;span class=&quot;code-quote&quot;&gt;&quot;edit&quot;&lt;/span&gt;: [
            {
                &lt;span class=&quot;code-quote&quot;&gt;&quot;edit-id&quot;&lt;/span&gt;: &lt;span class=&quot;code-quote&quot;&gt;&quot;edit1&quot;&lt;/span&gt;,
                &lt;span class=&quot;code-quote&quot;&gt;&quot;operation&quot;&lt;/span&gt;: &lt;span class=&quot;code-quote&quot;&gt;&quot;replace&quot;&lt;/span&gt;,
                &lt;span class=&quot;code-quote&quot;&gt;&quot;target&quot;&lt;/span&gt;: &lt;span class=&quot;code-quote&quot;&gt;&quot;/test-model:container-root/test-model:leaf-lvl1&quot;&lt;/span&gt;,
                &lt;span class=&quot;code-quote&quot;&gt;&quot;value&quot;&lt;/span&gt;: {
                    &lt;span class=&quot;code-quote&quot;&gt;&quot;leaf-lvl1&quot;&lt;/span&gt;: &lt;span class=&quot;code-quote&quot;&gt;&quot;something-&lt;span class=&quot;code-keyword&quot;&gt;else&lt;/span&gt;&quot;&lt;/span&gt;
                }
            },
            {
                &lt;span class=&quot;code-quote&quot;&gt;&quot;edit-id&quot;&lt;/span&gt;: &lt;span class=&quot;code-quote&quot;&gt;&quot;edit2&quot;&lt;/span&gt;,
                &lt;span class=&quot;code-quote&quot;&gt;&quot;operation&quot;&lt;/span&gt;: &lt;span class=&quot;code-quote&quot;&gt;&quot;create&quot;&lt;/span&gt;,
                &lt;span class=&quot;code-quote&quot;&gt;&quot;target&quot;&lt;/span&gt;: &lt;span class=&quot;code-quote&quot;&gt;&quot;/test-model:container-root/test-model:container-lvl1/test-model:list-lvl2[test-model:list-lvl2-key=&lt;span class=&quot;code-quote&quot;&gt;&apos;key&apos;&lt;/span&gt;]&quot;&lt;/span&gt;,
                &lt;span class=&quot;code-quote&quot;&gt;&quot;value&quot;&lt;/span&gt;: {
                    &lt;span class=&quot;code-quote&quot;&gt;&quot;test-model:list-lvl2&quot;&lt;/span&gt;: {
                        &lt;span class=&quot;code-quote&quot;&gt;&quot;list-lvl2-key&quot;&lt;/span&gt;: &lt;span class=&quot;code-quote&quot;&gt;&quot;key&quot;&lt;/span&gt;,
                        &lt;span class=&quot;code-quote&quot;&gt;&quot;leaf-lvl2&quot;&lt;/span&gt;: &lt;span class=&quot;code-quote&quot;&gt;&quot;something-&lt;span class=&quot;code-keyword&quot;&gt;else&lt;/span&gt;&quot;&lt;/span&gt;
                    }
                }
            },
            {
                &lt;span class=&quot;code-quote&quot;&gt;&quot;edit-id&quot;&lt;/span&gt;: &lt;span class=&quot;code-quote&quot;&gt;&quot;edit3&quot;&lt;/span&gt;,
                &lt;span class=&quot;code-quote&quot;&gt;&quot;operation&quot;&lt;/span&gt;: &lt;span class=&quot;code-quote&quot;&gt;&quot;replace&quot;&lt;/span&gt;,
                &lt;span class=&quot;code-quote&quot;&gt;&quot;target&quot;&lt;/span&gt;: &lt;span class=&quot;code-quote&quot;&gt;&quot;/test-model:container-root/test-model:container-lvl1/test-model:list-lvl2[test-model:list-lvl2-key=&lt;span class=&quot;code-quote&quot;&gt;&apos;key2&apos;&lt;/span&gt;]&quot;&lt;/span&gt;,
                &lt;span class=&quot;code-quote&quot;&gt;&quot;value&quot;&lt;/span&gt;: {
                    &lt;span class=&quot;code-quote&quot;&gt;&quot;test-model:list-lvl2&quot;&lt;/span&gt;: {
                        &lt;span class=&quot;code-quote&quot;&gt;&quot;list-lvl2-key&quot;&lt;/span&gt;: &lt;span class=&quot;code-quote&quot;&gt;&quot;key2&quot;&lt;/span&gt;,
                        &lt;span class=&quot;code-quote&quot;&gt;&quot;leaf-lvl2&quot;&lt;/span&gt;: &lt;span class=&quot;code-quote&quot;&gt;&quot;something-&lt;span class=&quot;code-keyword&quot;&gt;else&lt;/span&gt;&quot;&lt;/span&gt;
                    }
                }
            }
        ]
    }
}
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Response from request above:&lt;/p&gt;
&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-json&quot;&gt;
{
    &lt;span class=&quot;code-quote&quot;&gt;&quot;ietf-yang-patch:yang-patch-status&quot;&lt;/span&gt;: {
        &lt;span class=&quot;code-quote&quot;&gt;&quot;patch-id&quot;&lt;/span&gt;: &lt;span class=&quot;code-quote&quot;&gt;&quot;patch1&quot;&lt;/span&gt;,
        &lt;span class=&quot;code-quote&quot;&gt;&quot;edit-status&quot;&lt;/span&gt;: {
            &lt;span class=&quot;code-quote&quot;&gt;&quot;edit&quot;&lt;/span&gt;: [
                {
                    &lt;span class=&quot;code-quote&quot;&gt;&quot;edit-id&quot;&lt;/span&gt;: &lt;span class=&quot;code-quote&quot;&gt;&quot;edit1&quot;&lt;/span&gt;,
                    &lt;span class=&quot;code-quote&quot;&gt;&quot;ok&quot;&lt;/span&gt;: [
                        &lt;span class=&quot;code-keyword&quot;&gt;null&lt;/span&gt;
                    ]
                },
                {
                    &lt;span class=&quot;code-quote&quot;&gt;&quot;edit-id&quot;&lt;/span&gt;: &lt;span class=&quot;code-quote&quot;&gt;&quot;edit2&quot;&lt;/span&gt;,
                    &lt;span class=&quot;code-quote&quot;&gt;&quot;errors&quot;&lt;/span&gt;: {
                        &lt;span class=&quot;code-quote&quot;&gt;&quot;error&quot;&lt;/span&gt;: [
                            {
                                &lt;span class=&quot;code-quote&quot;&gt;&quot;error-type&quot;&lt;/span&gt;: &lt;span class=&quot;code-quote&quot;&gt;&quot;protocol&quot;&lt;/span&gt;,
                                &lt;span class=&quot;code-quote&quot;&gt;&quot;error-tag&quot;&lt;/span&gt;: &lt;span class=&quot;code-quote&quot;&gt;&quot;data-exists&quot;&lt;/span&gt;,
                                &lt;span class=&quot;code-quote&quot;&gt;&quot;error-path&quot;&lt;/span&gt;: &lt;span class=&quot;code-quote&quot;&gt;&quot;/(test-ns)container-root/container-lvl1/list-lvl2/list-lvl2[{(test-ns)list-lvl2-key=key}]&quot;&lt;/span&gt;,
                                &lt;span class=&quot;code-quote&quot;&gt;&quot;error-message&quot;&lt;/span&gt;: &lt;span class=&quot;code-quote&quot;&gt;&quot;Data already exists&quot;&lt;/span&gt;
                            }
                        ]
                    }
                }
            ]
        }
    }
}
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Mountpoint datastore content AFTER executing YANG patch (note that &quot;leaf-lvl1&quot; contains now value &quot;something-else&quot; but other leaves still contain value &quot;something&quot;):&lt;/p&gt;
&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-json&quot;&gt;
{
    &lt;span class=&quot;code-quote&quot;&gt;&quot;test-model:container-root&quot;&lt;/span&gt;: {
        &lt;span class=&quot;code-quote&quot;&gt;&quot;leaf-lvl1&quot;&lt;/span&gt;: &lt;span class=&quot;code-quote&quot;&gt;&quot;something-&lt;span class=&quot;code-keyword&quot;&gt;else&lt;/span&gt;&quot;&lt;/span&gt;,
        &lt;span class=&quot;code-quote&quot;&gt;&quot;container-lvl1&quot;&lt;/span&gt;: {
            &lt;span class=&quot;code-quote&quot;&gt;&quot;list-lvl2&quot;&lt;/span&gt;: [
                {
                    &lt;span class=&quot;code-quote&quot;&gt;&quot;list-lvl2-key&quot;&lt;/span&gt;: &lt;span class=&quot;code-quote&quot;&gt;&quot;key&quot;&lt;/span&gt;,
                    &lt;span class=&quot;code-quote&quot;&gt;&quot;leaf-lvl2&quot;&lt;/span&gt;: &lt;span class=&quot;code-quote&quot;&gt;&quot;something&quot;&lt;/span&gt;
                },
                {
                    &lt;span class=&quot;code-quote&quot;&gt;&quot;list-lvl2-key&quot;&lt;/span&gt;: &lt;span class=&quot;code-quote&quot;&gt;&quot;key2&quot;&lt;/span&gt;,
                    &lt;span class=&quot;code-quote&quot;&gt;&quot;leaf-lvl2&quot;&lt;/span&gt;: &lt;span class=&quot;code-quote&quot;&gt;&quot;something&quot;&lt;/span&gt;
                }
            ]
        }
    }
}
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&#160;&lt;/p&gt;

&lt;p&gt;According to response, edit1 was executed successfully but edit2 failed with &quot;Data already exists&quot; error message. There was not attempt to execute edit3.&lt;/p&gt;

&lt;p&gt;However, request actually changed value of &quot;leaf-lvl1&quot; from &quot;something&quot; to &quot;something-else&quot; even when edit2 failed.&lt;/p&gt;</description>
                <environment></environment>
        <key id="33613">NETCONF-746</key>
            <summary>YANG patch request on NETCONF mountpoint is not atomic</summary>
                <type id="10104" iconUrl="https://jira.opendaylight.org/secure/viewavatar?size=xsmall&amp;avatarId=10303&amp;avatarType=issuetype">Bug</type>
                                            <priority id="3" iconUrl="https://jira.opendaylight.org/images/icons/priorities/major.svg">Medium</priority>
                        <status id="5" iconUrl="https://jira.opendaylight.org/images/icons/statuses/resolved.png" description="A resolution has been taken, and it is awaiting verification by reporter. From here issues are either reopened, or are closed.">Resolved</status>
                    <statusCategory id="3" key="done" colorName="green"/>
                                    <resolution id="10000">Done</resolution>
                                        <assignee username="oleksii.mozghovyi">Oleksii Mozghovyi</assignee>
                                    <reporter username="samuel.kontris">Samuel Kontris</reporter>
                        <labels>
                    </labels>
                <created>Thu, 3 Dec 2020 15:54:37 +0000</created>
                <updated>Fri, 2 Jul 2021 19:44:23 +0000</updated>
                            <resolved>Fri, 2 Jul 2021 19:44:23 +0000</resolved>
                                    <version>Magnesium</version>
                    <version>Aluminium</version>
                                    <fixVersion>1.13.1</fixVersion>
                                    <component>netconf</component>
                        <due></due>
                            <votes>0</votes>
                                    <watches>3</watches>
                                                                                                                <comments>
                            <comment id="69018" author="JIRAUSER12941" created="Tue, 9 Mar 2021 11:28:24 +0000"  >&lt;p&gt;I&apos;ve pushed changes,&#160;which&#160;should fix this issue. Commit operation now takes into account the results of previously executed operations inside the RESTCONF transaction and sends discard-changes if any of those fails.&lt;/p&gt;</comment>
                            <comment id="69234" author="JIRAUSER12941" created="Wed, 26 May 2021 10:52:33 +0000"  >&lt;p&gt;This issue has been fixed with the following commit: &lt;a href=&quot;https://git.opendaylight.org/gerrit/c/netconf/+/95359&quot; class=&quot;external-link&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;&gt;https://git.opendaylight.org/gerrit/c/netconf/+/95359&lt;/a&gt;&lt;/p&gt;</comment>
                    </comments>
                <issuelinks>
                            <issuelinktype id="10000">
                    <name>Blocks</name>
                                                                <inwardlinks description="is blocked by">
                                        <issuelink>
            <issuekey id="32808">NETCONF-705</issuekey>
        </issuelink>
                            </inwardlinks>
                                    </issuelinktype>
                    </issuelinks>
                <attachments>
                    </attachments>
                <subtasks>
                    </subtasks>
                <customfields>
                                                                            <customfield id="customfield_11400" key="com.atlassian.jira.plugins.jira-development-integration-plugin:devsummary">
                        <customfieldname>Development</customfieldname>
                        <customfieldvalues>
                            
                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                <customfield id="customfield_10000" key="com.pyxis.greenhopper.jira:gh-lexo-rank">
                        <customfieldname>Rank</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>0|i03wif:</customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                </customfields>
    </item>
</channel>
</rss>