<!-- 
RSS generated by JIRA (8.20.10#820010-sha1:ace47f9899e9ee25d7157d59aa17ab06aee30d3d) at Wed Feb 07 20:34:05 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>[OPNFLWPLUG-1059] Migrate BP &lt;odl:action-provider&gt; for PacketProcessingService from XML to programmatic blueprint wiring</title>
                <link>https://jira.opendaylight.org/browse/OPNFLWPLUG-1059</link>
                <project id="10155" key="OPNFLWPLUG">OpenFlowPlugin</project>
                    <description>&lt;p&gt;The only remaining open loose end of &lt;a href=&quot;https://jira.opendaylight.org/browse/OPNFLWPLUG-1046&quot; title=&quot;Migrate OFP from XML to annotation based blueprint&quot; class=&quot;issue-link&quot; data-issue-key=&quot;OPNFLWPLUG-1046&quot;&gt;&lt;del&gt;OPNFLWPLUG-1046&lt;/del&gt;&lt;/a&gt; is this pesky little business:&lt;/p&gt;

&lt;p&gt;&lt;tt&gt;org.opendaylight.genius.arputil.internal.ArpUtilImpl&lt;/tt&gt; and &lt;tt&gt;org.opendaylight.genius.ipv6util.nd.Ipv6NsHelper&lt;/tt&gt;, and possibly other places, require an OFP &lt;tt&gt;PacketProcessingService&lt;/tt&gt; @Inject-ed.&lt;/p&gt;

&lt;p&gt;In our OSGi Karaf BP environment, this works via an &lt;tt&gt;&amp;lt;odl:rpc-service&amp;gt;&lt;/tt&gt; in OSGI-INF/blueprint/arputil.xml and /OSGI-INF/blueprint/ipv6util.xml, which from what I gathered is provided by the &lt;tt&gt;org.opendaylight.openflowplugin.impl.services.sal.PacketProcessingServiceImpl&lt;/tt&gt; that is registered as an &lt;tt&gt;&amp;lt;odl:action-provider&amp;gt;&lt;/tt&gt; in OSGI-INF/blueprint/openflowplugin-impl.xml.&lt;/p&gt;

&lt;p&gt;What is an odl:action-provider? How does it obtain the RequestContextStack (of which there are several implementations), DeviceContext (apparently created by DeviceManagerImpl.createContext from a ConnectionContext) and ConvertorManager (looks easy) which it requires?&lt;/p&gt;</description>
                <environment></environment>
        <key id="31230">OPNFLWPLUG-1059</key>
            <summary>Migrate BP &lt;odl:action-provider&gt; for PacketProcessingService from XML to programmatic blueprint wiring</summary>
                <type id="10100" iconUrl="https://jira.opendaylight.org/secure/viewavatar?size=xsmall&amp;avatarId=10310&amp;avatarType=issuetype">Improvement</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="vorburger">Michael Vorburger</assignee>
                                    <reporter username="vorburger">Michael Vorburger</reporter>
                        <labels>
                    </labels>
                <created>Fri, 21 Dec 2018 14:52:01 +0000</created>
                <updated>Tue, 29 Jan 2019 14:04:18 +0000</updated>
                            <resolved>Tue, 29 Jan 2019 14:03:32 +0000</resolved>
                                                    <fixVersion>Neon</fixVersion>
                                        <due></due>
                            <votes>0</votes>
                                    <watches>2</watches>
                                                                                                                <comments>
                            <comment id="66095" author="vorburger" created="Fri, 21 Dec 2018 14:54:55 +0000"  >&lt;p&gt;&lt;a href=&quot;https://jira.opendaylight.org/browse/CONTROLLER-1587&quot; title=&quot;Fix blueprint assumptions around odl:rpc-service&quot; class=&quot;issue-link&quot; data-issue-key=&quot;CONTROLLER-1587&quot;&gt;&lt;del&gt;CONTROLLER-1587&lt;/del&gt;&lt;/a&gt;, &lt;a href=&quot;https://jira.opendaylight.org/browse/OPNFLWPLUG-870&quot; title=&quot;missing method to use barrier when installing dependant groups+flows or flows+packet_out&quot; class=&quot;issue-link&quot; data-issue-key=&quot;OPNFLWPLUG-870&quot;&gt;&lt;del&gt;OPNFLWPLUG-870&lt;/del&gt;&lt;/a&gt;,&#160;&lt;a href=&quot;https://jira.opendaylight.org/browse/GENIUS-162&quot; title=&quot;genius karaf log levels and messages should be checked&quot; class=&quot;issue-link&quot; data-issue-key=&quot;GENIUS-162&quot;&gt;&lt;del&gt;GENIUS-162&lt;/del&gt;&lt;/a&gt;,&#160;&lt;a href=&quot;https://jira.opendaylight.org/browse/NETVIRT-988&quot; title=&quot;IO Exception got while activating mip: Cannot run program &amp;quot;cluster&amp;quot;: error=2, No such file or directory&quot; class=&quot;issue-link&quot; data-issue-key=&quot;NETVIRT-988&quot;&gt;&lt;del&gt;NETVIRT-988&lt;/del&gt;&lt;/a&gt; mention/have logs related to&#160;PacketProcessingService ... Also looking at the source code of what the &lt;tt&gt;&amp;lt;odl:action-provider&amp;gt;&lt;/tt&gt;&#160; actually does could perhaps shed some light on this. But the easiest would be if someone actually had a good grasp on what magic is going on behind the scenes here and could jump in with an explanation here...&lt;/p&gt;</comment>
                            <comment id="66097" author="vorburger" created="Fri, 21 Dec 2018 15:02:14 +0000"  >&lt;p&gt;Put in another way, to goal of this issue is just to get &lt;a href=&quot;https://github.com/vorburger/opendaylight-simple/pull/76&quot; class=&quot;external-link&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;&gt;https://github.com/vorburger/opendaylight-simple/pull/76&lt;/a&gt;&#160;to pass...&lt;/p&gt;</comment>
                            <comment id="66101" author="tpantelis" created="Fri, 21 Dec 2018 17:34:28 +0000"  >&lt;p&gt;odl:action-provider basically wraps&#160;RpcProviderService.registerRpcImplementation just like odl:rpc-service. However if no implementation bean is provided,&#160;odl:action-provider registers a no-op&#160;implementation for each RPC - it seems this is for routed RPCs to register a placeholder for the actual instantiations that are registered in code per RPC context. This is done for&#160;PacketProcessingService in&#160;./openflowplugin-impl/src/main/resources/OSGI-INF/blueprint/openflowplugin-impl.xml:&lt;/p&gt;
&lt;div class=&quot;preformatted panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;preformattedContent panelContent&quot;&gt;
&lt;pre&gt;&amp;lt;odl:action-provider interface=&quot;org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketProcessingService&quot;/&amp;gt;
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;I think to satisfy the odl:rpc-service BP dependency in consumers which waits for an underlying implementation to be available - which makes sense for &quot;global&quot; RPCs but not really for routed RPCs so hence the placeholder.  Before odl:action-provider, odl:rpc-service happened to work b/c the placeholders were (incorrectly) provided by the sal-remoterpc-connector implementation. &lt;/p&gt;

&lt;p&gt;So for PacketProcessingService, no equivalent of odl:action-provider should be needed in ODL simple.&lt;/p&gt;</comment>
                            <comment id="66127" author="vorburger" created="Sun, 6 Jan 2019 17:58:09 +0000"  >&lt;p&gt;&amp;gt; no equivalent of odl:action-provider should be needed in ODL simple&lt;/p&gt;

&lt;p&gt;but e.g. (in genius) &lt;tt&gt;ArpUtilImpl&lt;/tt&gt; and &lt;tt&gt;Ipv6NsHelper&lt;/tt&gt; do require an OFP &lt;tt&gt;PacketProcessingService&lt;/tt&gt; @Inject-ed, so what do we bind it to?&lt;/p&gt;

&lt;p&gt;&amp;gt; the actual instantiations that are registered in code per RPC context&lt;/p&gt;

&lt;p&gt;perhaps we have a bigger issue with routed RPC in a standalone environment... the Guice (or other DI) framework probably needs to made to support those...&lt;/p&gt;</comment>
                            <comment id="66178" author="vorburger" created="Mon, 14 Jan 2019 15:50:42 +0000"  >&lt;p&gt;&amp;gt; perhaps we have a bigger issue with routed RPC in a standalone environment... the Guice (or other DI) framework probably needs to made to support those...&lt;/p&gt;

&lt;p&gt;right.. I think the binding of RPC consumers is currently compeltely wrong - we need to go through the... which one, RpcProviderRegistry or RpcProviderService?!&lt;/p&gt;</comment>
                            <comment id="66236" author="vorburger" created="Thu, 17 Jan 2019 17:16:31 +0000"  >&lt;p&gt;&lt;a href=&quot;https://jira.opendaylight.org/secure/ViewProfile.jspa?name=tpantelis&quot; class=&quot;user-hover&quot; rel=&quot;tpantelis&quot;&gt;tpantelis&lt;/a&gt; and I spoke for 1/2h by voice about this today and clarified what needs to be happen here next:&lt;/p&gt;

&lt;p&gt;The Guice *Module currently binds PacketProcessingService to PacketProcessingServiceImpl directly, and that was wrong &amp;amp; NOK for a routed RPC - my bad, sorry.&lt;/p&gt;

&lt;p&gt;Instead, we need to use the &lt;a href=&quot;https://github.com/opendaylight/mdsal/blob/master/binding/mdsal-binding-api/src/main/java/org/opendaylight/mdsal/binding/api/RpcConsumerRegistry.java&quot; class=&quot;external-link&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;&gt;mdsal.RpcConsumerRegistry&lt;/a&gt;&apos;s &lt;tt&gt;getRpcService()&lt;/tt&gt;. (FTR: There is also the now &lt;tt&gt;@Deprecated&lt;/tt&gt; &lt;a href=&quot;https://github.com/opendaylight/controller/blob/master/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/RpcConsumerRegistry.java&quot; class=&quot;external-link&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;&gt;controller.RpcConsumerRegistry&lt;/a&gt; but Tom says that it should be OK to only use &lt;em&gt;mdsal&lt;/em&gt; one to look up the RPC - even if &lt;em&gt;openflowplugin&lt;/em&gt; still uses the &lt;em&gt;controller&lt;/em&gt; one to register the RPC - because behind the scenes they are, or should be, aligned.)&lt;/p&gt;

&lt;p&gt;&amp;gt; So for PacketProcessingService, no equivalent of odl:action-provider should be needed in ODL simple.&lt;/p&gt;

&lt;p&gt;We also discussed this and weren&apos;t 100% sure.. so &lt;a href=&quot;https://github.com/opendaylight/openflowplugin/search?q=RpcProviderRegistry&amp;amp;unscoped_q=RpcProviderRegistry&quot; class=&quot;external-link&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;&gt;we can see that OFP&lt;/a&gt; uses &lt;a href=&quot;https://github.com/opendaylight/controller/blob/master/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/RpcProviderRegistry.java&quot; class=&quot;external-link&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;&gt;controller.RpcProviderRegistry&lt;/a&gt; (and not, yet, the &lt;a href=&quot;https://github.com/opendaylight/controller/blob/master/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/RpcProviderRegistry.java&quot; class=&quot;external-link&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;&gt;mdsal.RpcProviderService&lt;/a&gt;) to register routed RPC implementations. We are unsure if this is sufficient; but if it&apos;s not, it actually seems trivial &lt;a href=&quot;https://github.com/opendaylight/controller/blob/master/opendaylight/blueprint/src/main/java/org/opendaylight/controller/blueprint/ext/ActionProviderBean.java&quot; class=&quot;external-link&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;&gt;to do the equivalent of&lt;/a&gt; &amp;lt;odl:action-provider&amp;gt; in a Guice Module.&lt;/p&gt;</comment>
                            <comment id="66237" author="tpantelis" created="Thu, 17 Jan 2019 18:16:30 +0000"  >&lt;p&gt;&amp;gt; The Guice *Module currently binds PacketProcessingService to PacketProcessingServiceImpl directly, and that was wrong &amp;amp; NOK for a routed &amp;gt; RPC - my bad, sorry.&lt;/p&gt;

&lt;p&gt;It&apos;s NOK for global RPCs either. All RPC providers and consumers must go thru the *Registry interfaces. The consumer actually receives an internal proxy implementation that does various things including handling distributed RPC invocations across the cluster.&lt;/p&gt;

&lt;p&gt;My gut feeling is that the equivalent of &amp;lt;odl:action-provider&amp;gt; is not needed. IIRC, this was needed due to the BP extension waiting for an underlying DOM implementation to become available to satisfy the dependency (see my comment above on 12/Dec/18). &lt;/p&gt;</comment>
                            <comment id="66268" author="vorburger" created="Wed, 23 Jan 2019 21:43:45 +0000"  >&lt;p&gt;&lt;a href=&quot;https://jira.opendaylight.org/secure/ViewProfile.jspa?name=tpantelis&quot; class=&quot;user-hover&quot; rel=&quot;tpantelis&quot;&gt;tpantelis&lt;/a&gt; I think &lt;a href=&quot;https://github.com/vorburger/opendaylight-simple/commit/b9abb1de16eecd2467e9c8ca1bde527ccf8ca96b&quot; class=&quot;external-link&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;&gt;https://github.com/vorburger/opendaylight-simple/commit/b9abb1de16eecd2467e9c8ca1bde527ccf8ca96b&lt;/a&gt; is probably about right? &lt;a href=&quot;https://jira.opendaylight.org/secure/ViewProfile.jspa?name=skitt&quot; class=&quot;user-hover&quot; rel=&quot;skitt&quot;&gt;skitt&lt;/a&gt; FYI, if interested.&lt;/p&gt;

&lt;p&gt;&amp;gt; It&apos;s NOK for global RPCs either. All RPC providers and consumers must go thru the *Registry interfaces. The consumer actually receives an internal proxy implementation that does various things including handling distributed RPC invocations across the cluster.&lt;/p&gt;

&lt;p&gt;But have we actually implemented / are we really using distributed RPCs? Can you point to an example in an application?&lt;/p&gt;

&lt;p&gt;&amp;gt; My gut feeling is that the equivalent of &amp;lt;odl:action-provider&amp;gt; is not needed.&lt;/p&gt;

&lt;p&gt;Yeah, it wasn&apos;t.&lt;/p&gt;</comment>
                            <comment id="66271" author="tpantelis" created="Thu, 24 Jan 2019 00:23:12 +0000"  >&lt;p&gt;I think it looks right. Does it work? If so then it&apos;s probably right &lt;img class=&quot;emoticon&quot; src=&quot;https://jira.opendaylight.org/images/icons/emoticons/smile.png&quot; height=&quot;16&quot; width=&quot;16&quot; align=&quot;absmiddle&quot; alt=&quot;&quot; border=&quot;0&quot;/&gt;&lt;/p&gt;

&lt;p&gt;&amp;gt; But have we actually implemented / are we really using distributed RPCs? Can you point to an example in an application?&lt;/p&gt;

&lt;p&gt;yes - opendaylight/md-sal/sal-remoterpc-connector in controller. Apps don&apos;t specifically use them - it&apos;s done transparently under the hood. Eg, OFP registers routed RPCs on the node that gets the entity ownership for the device - these RPCs are advertised across the cluster and can be invoked from any node. The app is unaware of this happening under the hood.&lt;/p&gt;</comment>
                            <comment id="66272" author="vorburger" created="Thu, 24 Jan 2019 00:49:02 +0000"  >&lt;p&gt;for non-routed RPCs, how does it decide when to route an RPC to another node? (Asking because apart from this particular routed one in openflowplugin where we have to go through the mechanism,I&apos;m reluctant to just let all and any other RPC calls go through a machine that is not needed in a simple package... my feeling is that it&apos;s overused; think something like genius lockmanager or idmanager - having those as RPC is non-sense, IMHO.)&lt;/p&gt;</comment>
                            <comment id="66273" author="tpantelis" created="Thu, 24 Jan 2019 01:02:21 +0000"  >&lt;p&gt;Routed and global RPCs work the same way. If there is a local implementation registered, it uses that otherwise it looks for a registration advertised from a remote node. If found, it proxies the RPC invocation across the wire (using akka) to the remote node. It&apos;s all part of ODL clustering.&lt;/p&gt;

&lt;p&gt;Anyway that&apos;s really orthogonal here. The bottom line is that you have to go thru the mdsal RPC registries to provide or consume RPC services for various reasons, otherwise it won&apos;t work properly. You can&apos;t just inject an RPC service implementation instance directly as you had originally done.&lt;/p&gt;</comment>
                    </comments>
                <issuelinks>
                            <issuelinktype id="10000">
                    <name>Blocks</name>
                                            <outwardlinks description="blocks">
                                        <issuelink>
            <issuekey id="31227">COE-51</issuekey>
        </issuelink>
            <issuelink>
            <issuekey id="31007">OPNFLWPLUG-1046</issuekey>
        </issuelink>
                            </outwardlinks>
                                                        </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|i03lov:</customfieldvalue>

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