<!-- 
RSS generated by JIRA (8.20.10#820010-sha1:ace47f9899e9ee25d7157d59aa17ab06aee30d3d) at Wed Feb 07 20:15:36 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-669] Separate out schemaless mountpoints</title>
                <link>https://jira.opendaylight.org/browse/NETCONF-669</link>
                <project id="10142" key="NETCONF">netconf</project>
                    <description>&lt;p&gt;NETCONF is currently abusing DOMMountPoint and especially DOMRpcService to funnel unparsed anyxml nodes through DOM interfaces.&lt;/p&gt;

&lt;p&gt;This relies on a historic leniency of DOMRpcResult of allowing other nodes than containers to carry the result.&lt;/p&gt;

&lt;p&gt;This is completely wrong, as NETCONF mount points which do not have a schema should not expose a DOMRpcService, but some completely different service, which does not play pretend it conforms to DOMRpcService specification.&lt;/p&gt;

&lt;p&gt;Most notable example is that while normal mount points can be interacted with via Binding components, as we can make sense of the payload. schemaless mounts cannot &#8211; yet they pretend their services can in fact be a source of normalized data.&lt;/p&gt;</description>
                <environment></environment>
        <key id="32599">NETCONF-669</key>
            <summary>Separate out schemaless mountpoints</summary>
                <type id="10103" iconUrl="https://jira.opendaylight.org/secure/viewavatar?size=xsmall&amp;avatarId=10311&amp;avatarType=issuetype">New Feature</type>
                                            <priority id="1" iconUrl="https://jira.opendaylight.org/images/icons/priorities/blocker.svg">Highest</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="rovarga">Robert Varga</assignee>
                                    <reporter username="rovarga">Robert Varga</reporter>
                        <labels>
                            <label>pt</label>
                    </labels>
                <created>Thu, 23 Apr 2020 14:24:43 +0000</created>
                <updated>Thu, 29 Dec 2022 21:40:55 +0000</updated>
                            <resolved>Thu, 29 Dec 2022 21:40:46 +0000</resolved>
                                                    <fixVersion>5.0.0</fixVersion>
                                    <component>netconf</component>
                        <due></due>
                            <votes>0</votes>
                                    <watches>1</watches>
                                                                                                                                                            <comments>
                            <comment id="68050" author="rovarga" created="Thu, 23 Apr 2020 14:25:49 +0000"  >&lt;p&gt;RESTCONF participates in this game in that this API difference needs to be understood by RESTCONF, which gets the onus of dealing with XML-&amp;gt;JSON translation without ever knowing the schema.&lt;/p&gt;</comment>
                            <comment id="71621" author="rovarga" created="Fri, 11 Nov 2022 17:54:09 +0000"  >&lt;p&gt;This is manifested at RemoteDeviceHandler exposing DOMRpcService &#8211; here input and output are required to be ContainerNodes. There are two implementations plugged into this &#8211; NetconfDeviceRpc and SchemalessNetconfDeviceRpc.&lt;/p&gt;

&lt;p&gt;So now, we need a sal.connect.api.RemoteDeviceRpcs:&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;
sealed &lt;span class=&quot;code-keyword&quot;&gt;interface&lt;/span&gt; RemoteDeviceRpcs {
  non-sealed &lt;span class=&quot;code-keyword&quot;&gt;interface&lt;/span&gt; Normalized &lt;span class=&quot;code-keyword&quot;&gt;extends&lt;/span&gt; RemoteDeviceRpcs, DOMRpcService {
    &lt;span class=&quot;code-comment&quot;&gt;// Nothing &lt;span class=&quot;code-keyword&quot;&gt;else&lt;/span&gt; needed
&lt;/span&gt;  }

  non-sealed &lt;span class=&quot;code-keyword&quot;&gt;interface&lt;/span&gt; Raw &lt;span class=&quot;code-keyword&quot;&gt;extends&lt;/span&gt; RemoteDeviceRpcs, DocumentRpcService {
    &lt;span class=&quot;code-comment&quot;&gt;// Nothing &lt;span class=&quot;code-keyword&quot;&gt;else&lt;/span&gt; needed
&lt;/span&gt;  }
}
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;plus, we need to define a new DOMService:&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;
&lt;span class=&quot;code-keyword&quot;&gt;import&lt;/span&gt; org.w3c.Document;

&lt;span class=&quot;code-keyword&quot;&gt;interface&lt;/span&gt; DocumentRpcService &lt;span class=&quot;code-keyword&quot;&gt;extends&lt;/span&gt; DOMService {

  ListenableFuture&amp;lt;? &lt;span class=&quot;code-keyword&quot;&gt;extends&lt;/span&gt; Document&amp;gt; invokeRpc(@NonNull &lt;span class=&quot;code-object&quot;&gt;String&lt;/span&gt; namespaceURI, @NonNull &lt;span class=&quot;code-object&quot;&gt;String&lt;/span&gt; localName, @NonNull Document input);
} 
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The result may perhaps be not a Document, but a more structured thing &#8211; that is left to be determined based on integration experience.&lt;/p&gt;

&lt;p&gt;&#160;&lt;/p&gt;</comment>
                            <comment id="71622" author="rovarga" created="Fri, 11 Nov 2022 17:56:45 +0000"  >&lt;p&gt;Also, &lt;a href=&quot;https://git.opendaylight.org/gerrit/c/netconf/+/103168&quot; class=&quot;external-link&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;&gt;https://git.opendaylight.org/gerrit/c/netconf/+/103168&lt;/a&gt; is already flushing the incompatibility, hence we will need a solution quite soon.&lt;/p&gt;</comment>
                            <comment id="71623" author="rovarga" created="Fri, 11 Nov 2022 18:26:05 +0000"  >&lt;p&gt;A bit of prototyping shows that this may actually need to addressed starting with the interface exposed by SchemalessNetconfDevice &#8211; i.e. it probably should have its own RemoteDeviceHandler.&lt;/p&gt;</comment>
                            <comment id="71624" author="rovarga" created="Fri, 11 Nov 2022 22:24:50 +0000"  >&lt;p&gt;(brain dump)&lt;br/&gt;
Looking at this a bit more, we could start by making RemoteDeviceHandler disconnect from DOM concepts and also NetconfTopology.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://git.opendaylight.org/gerrit/c/netconf/+/82678&quot; class=&quot;external-link&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;&gt;https://git.opendaylight.org/gerrit/c/netconf/+/82678&lt;/a&gt; introduced this:&lt;/p&gt;

&lt;p&gt;&#160;&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;  &#160; &lt;span class=&quot;code-keyword&quot;&gt;default&lt;/span&gt; void onDeviceReconnected(&lt;span class=&quot;code-keyword&quot;&gt;final&lt;/span&gt; PREF netconfSessionPreferences, &lt;span class=&quot;code-keyword&quot;&gt;final&lt;/span&gt; NetconfNode node);&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Which is fueled by passing down the NetconfNode &#8211; this needs to be pushed back to netconf-topology, so it follows proper up/down/reconnect lifecycle (via onDeviceDisconnected()). This should be possible, AFAICT.&lt;/p&gt;

&lt;p&gt;&#160;&lt;/p&gt;

&lt;p&gt;The next up unsolicited messages &#8211; for NETCONF this can only be a notification:&lt;/p&gt;

&lt;p&gt;&#160;&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;  &#160; void onNotification(DOMNotification domNotification); &lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;This should be a generic parameter of RemoteDeviceHandler &#8211; i.e. the format of unsolicited messages. It might be DOMNotification, assuming schemas, but at the end of the day this could as well be a message, which in turn comes to RemoteDeviceCommunicator specialization, which would naturally be a NetconfNotification!&lt;/p&gt;

&lt;p&gt;&#160;&lt;/p&gt;

&lt;p&gt;The thing is: the schemaless case of using org.w3c.Document is already handled by raw NetconfMessage, which begs the question, what is the key driver behind the use case. And it really is for netconf-topology to have:&lt;/p&gt;

&lt;p&gt;&#160;&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;&lt;span class=&quot;code-keyword&quot;&gt;final&lt;/span&gt; RemoteDevice&amp;lt;NetconfSessionPreferences, NetconfMessage, NetconfDeviceCommunicator&amp;gt; device; &lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;and having a NetconfDeviceCommunicator working on top of that. The interaction with services then around back to NetconfDeviceSalFacade, which has onTopologyDeviceConnected() &#8211; which reflects back the services received on RemoveDeviceHandler callback. Note that onTopologyDeviceConnected() is again a leak of &quot;topology&quot; concept, but at this particular it should be called &quot;onMountPointConnected&quot;. RemoteDeviceId is the key offender here: at the end of the day, this should be interface only YangInstanceIdentifier (and perhaps InetAddress, which is low-enough of a concet), as that is what we need to talk to DOMMountPointService &#8211; so topology-netconf should be filling out this part of RemoteDeviceId:&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;&#160; &#160; &lt;span class=&quot;code-keyword&quot;&gt;private&lt;/span&gt; RemoteDeviceId(&lt;span class=&quot;code-keyword&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;code-object&quot;&gt;String&lt;/span&gt; name) {
&#160; &#160; &#160; &#160; &lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt;.name = requireNonNull(name);
&#160; &#160; &#160; &#160; topologyPath = DEFAULT_TOPOLOGY_NODE.node(NodeIdentifierWithPredicates.of(Node.QNAME, NODE_ID_QNAME, name));
&#160; &#160; &#160; &#160; key = &lt;span class=&quot;code-keyword&quot;&gt;new&lt;/span&gt; NodeKey(&lt;span class=&quot;code-keyword&quot;&gt;new&lt;/span&gt; NodeId(name));
&#160; &#160; &#160; &#160; topologyBindingPath = DEFAULT_TOPOLOGY_IID.child(Node.class, key);
&#160; &#160; }
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;There might be more, but really, sal-netconf-connector is the binding between netconf-api and mdsal-dom-api &#8211; it must not depend on topology model in any shape or manner.&lt;/p&gt;

&lt;p&gt;Circling back for a minute on the grand scheme of things: sal-netconf-connect has multiple parts, which perhaps should split out to multiple components (but not now!). This is:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;setting up the device for use with DOMService APIs, then&lt;/li&gt;
	&lt;li&gt;passing the lifecycle baton back to the user (i.e. netconf-topology) via RemoteDeviceHander.onDeviceConnected(), then&lt;/li&gt;
	&lt;li&gt;supporting that user in binding that device to DOMMountPointService&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;This means onDeviceConnected() does not break down all the services available in terms of individual DOMServices, but rather a generic handle (i.e. a sealed interface) with perhaps known specializations (as hinted by RemoteDeviceRpcs in above proposal), but really encapsulating everything but the session preferences. That sealed interface will be reflected back to us in step 3) which when we make sense of it.&lt;/p&gt;

&lt;p&gt;Hence all of the possibilities in RemoteDeviceHandler.onDeviceConnected() need to be refactored a single method:&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;void onDeviceConnected(PREF netconfSessionPreferences, RemoteDeviceAccess access); &lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;I think we can safely specialize PREF to NetconfSessionPreferences, as there no other specializations. RemoteDeviceAccess is that sealed interface, which gets passed back to NetconfDeviceSalFacade and it will then make a decision what DOMServices to instantiate from that.&lt;/p&gt;

&lt;p&gt;So let&apos;s break this down into multiple subtask to focus our effort.&lt;/p&gt;

&lt;p&gt;&#160;&lt;/p&gt;

&lt;p&gt;&#160;&lt;/p&gt;</comment>
                            <comment id="71721" author="rovarga" created="Tue, 6 Dec 2022 09:56:15 +0000"  >&lt;p&gt;This issue is flushing out a ton of technical debt w.r.t layering of information and control bits. At the end of the day sal-netconf-connector needs to be provide crisp components without being explicitly tied to netconf-topology.&lt;/p&gt;

&lt;p&gt;&#160;&lt;/p&gt;</comment>
                    </comments>
                <issuelinks>
                            <issuelinktype id="10000">
                    <name>Blocks</name>
                                            <outwardlinks description="blocks">
                                        <issuelink>
            <issuekey id="32598">MDSAL-541</issuekey>
        </issuelink>
                            </outwardlinks>
                                                        </issuelinktype>
                            <issuelinktype id="10300">
                    <name>Issue split</name>
                                            <outwardlinks description="split to">
                                        <issuelink>
            <issuekey id="36430">NETCONF-925</issuekey>
        </issuelink>
                            </outwardlinks>
                                                        </issuelinktype>
                            <issuelinktype id="10003">
                    <name>Relates</name>
                                                                <inwardlinks description="relates to">
                                        <issuelink>
            <issuekey id="32600">MDSAL-542</issuekey>
        </issuelink>
                            </inwardlinks>
                                    </issuelinktype>
                    </issuelinks>
                <attachments>
                    </attachments>
                <subtasks>
                            <subtask id="36313">NETCONF-916</subtask>
                            <subtask id="36312">NETCONF-915</subtask>
                            <subtask id="36309">NETCONF-912</subtask>
                            <subtask id="36428">NETCONF-923</subtask>
                            <subtask id="36429">NETCONF-924</subtask>
                            <subtask id="36425">NETCONF-920</subtask>
                            <subtask id="36311">NETCONF-914</subtask>
                            <subtask id="36437">NETCONF-930</subtask>
                    </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|i03s3b:</customfieldvalue>

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