<!-- 
RSS generated by JIRA (8.20.10#820010-sha1:ace47f9899e9ee25d7157d59aa17ab06aee30d3d) at Wed Feb 07 20:35:37 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>[OVSDB-144] plugin set two controller&apos;s for integration bridge</title>
                <link>https://jira.opendaylight.org/browse/OVSDB-144</link>
                <project id="10158" key="OVSDB">ovsdb</project>
                    <description>&lt;p&gt;In my two node openstack setup, when i try to connect my compute node ovsdb instance to controller, i see that controller sets two controller value for the integration bridge. I can easily recreate this issue, after 2-3 attempts.&lt;/p&gt;

&lt;p&gt;root@ComputeNode:~/openstack-setup# ovs-vsctl show&lt;br/&gt;
4575bb26-b73b-4e0a-a62a-9b3ff06e19af&lt;br/&gt;
    Manager &quot;tcp:192.168.57.1:6640&quot;&lt;br/&gt;
        is_connected: true&lt;br/&gt;
    Bridge br-int&lt;br/&gt;
        Controller &quot;tcp:192.168.57.1:6633&quot;&lt;br/&gt;
            is_connected: true&lt;br/&gt;
        Controller &quot;tcp:192.168.57.1:6633&quot;&lt;br/&gt;
            is_connected: true&lt;br/&gt;
        fail_mode: secure&lt;br/&gt;
        Port br-int&lt;br/&gt;
            Interface br-int&lt;br/&gt;
    ovs_version: &quot;2.0.2&quot;&lt;/p&gt;</description>
                <environment>&lt;p&gt;Operating System: All&lt;br/&gt;
Platform: All&lt;/p&gt;</environment>
        <key id="21836">OVSDB-144</key>
            <summary>plugin set two controller&apos;s for integration bridge</summary>
                <type id="10104" iconUrl="https://jira.opendaylight.org/secure/viewavatar?size=xsmall&amp;avatarId=10303&amp;avatarType=issuetype">Bug</type>
                                                <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="Avishnoi">Anil Vishnoi</assignee>
                                    <reporter username="Avishnoi">Anil Vishnoi</reporter>
                        <labels>
                    </labels>
                <created>Tue, 31 Mar 2015 12:20:29 +0000</created>
                <updated>Fri, 26 Jun 2015 11:09:20 +0000</updated>
                            <resolved>Fri, 26 Jun 2015 11:09:20 +0000</resolved>
                                    <version>unspecified</version>
                                                    <component>Plugin</component>
                        <due></due>
                            <votes>0</votes>
                                    <watches>3</watches>
                                                                                                                <comments>
                            <comment id="40782" author="vishnoianil@gmail.com" created="Tue, 31 Mar 2015 12:21:22 +0000"  >&lt;p&gt;The root cause of this problem is a race condition while setting up the openflow controller for bridge. When ovsdb node connects to the controller, it generate NODE event, that results in creating br-int and setting up the OF controller. Once bridge table is modified with br-int entry, it generate table update for Bridge table. Ovsdb Plugin receives this table update and it&apos;s default behavior is to set of controller for any new bridge, so when it gets the bridge table update, it  again tries to set the openflow controller for the same bridge (br-int) and that causes the race condition, given that both the actions happens in two separate thread. Following are the two stack that try to set the OF controller for the bridge when ovsdb node connects to the controller first time.&lt;/p&gt;

&lt;p&gt;1) &lt;br/&gt;
java.lang.Exception: Stack trace&lt;br/&gt;
	at java.lang.Thread.dumpStack(Thread.java:1365)&lt;br/&gt;
	at org.opendaylight.ovsdb.plugin.impl.ConfigurationServiceImpl.setOFController(ConfigurationServiceImpl.java:407)&lt;br/&gt;
	at org.opendaylight.ovsdb.openstack.netvirt.impl.BridgeConfigurationManagerImpl.addBridge(BridgeConfigurationManagerImpl.java:677)&lt;br/&gt;
	at org.opendaylight.ovsdb.openstack.netvirt.impl.BridgeConfigurationManagerImpl.createIntegrationBridge(BridgeConfigurationManagerImpl.java:376)&lt;br/&gt;
	at org.opendaylight.ovsdb.openstack.netvirt.impl.BridgeConfigurationManagerImpl.prepareNode(BridgeConfigurationManagerImpl.java:182)&lt;br/&gt;
	at org.opendaylight.ovsdb.openstack.netvirt.SouthboundHandler.processNodeUpdate(SouthboundHandler.java:128)&lt;br/&gt;
	at org.opendaylight.ovsdb.openstack.netvirt.SouthboundHandler.processEvent(SouthboundHandler.java:345)&lt;br/&gt;
	at org.opendaylight.ovsdb.openstack.netvirt.impl.EventDispatcherImpl.dispatchEvent(EventDispatcherImpl.java:92)&lt;br/&gt;
	at org.opendaylight.ovsdb.openstack.netvirt.impl.EventDispatcherImpl.access$100(EventDispatcherImpl.java:28)&lt;br/&gt;
	at org.opendaylight.ovsdb.openstack.netvirt.impl.EventDispatcherImpl$1.run(EventDispatcherImpl.java:55)&lt;br/&gt;
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)&lt;br/&gt;
	at java.util.concurrent.FutureTask.run(FutureTask.java:262)&lt;br/&gt;
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)&lt;br/&gt;
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)&lt;br/&gt;
	at java.lang.Thread.run(Thread.java:745)&lt;/p&gt;

&lt;p&gt;2)&lt;br/&gt;
java.lang.Exception: Stack trace&lt;br/&gt;
	at java.lang.Thread.dumpStack(Thread.java:1365)&lt;br/&gt;
	at org.opendaylight.ovsdb.plugin.impl.ConfigurationServiceImpl.setOFController(ConfigurationServiceImpl.java:407)&lt;br/&gt;
	at org.opendaylight.ovsdb.plugin.impl.InventoryServiceImpl$1.run(InventoryServiceImpl.java:184)&lt;br/&gt;
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)&lt;br/&gt;
	at java.util.concurrent.FutureTask.run(FutureTask.java:262)&lt;br/&gt;
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:178)&lt;br/&gt;
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:292)&lt;br/&gt;
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)&lt;br/&gt;
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)&lt;br/&gt;
	at java.lang.Thread.run(Thread.java:745)&lt;/p&gt;

&lt;p&gt;Second stack is the one that set&apos;s the OF controller for any new bridge.&lt;/p&gt;

&lt;p&gt;Although setOFController check for the existing controller, but it checks the internal cache for that, and internal cache won&apos;t get updated till controller gets the update from ovsdb node for Controller table update. So this race condition happens in the duration between controller sent the &quot;set controller for br-int&quot; to ovsdb-node and it gets updated in internal cache.&lt;/p&gt;

&lt;p&gt;From Openstack integration perspective, i think we should not explicitly set controller for each bridge that we find on ovsdb node. I am referring to following code in InventoryServiceImpl.java &lt;/p&gt;

&lt;p&gt;    private void handleOpenVSwitchSpecialCase(final Node node, final String databaseName, final String tableName, final UUID uuid) {&lt;br/&gt;
        if (OvsVswitchdSchemaConstants.shouldConfigureController(databaseName, tableName)) {&lt;br/&gt;
            Runnable updateControllerRunnable = new Runnable() {&lt;br/&gt;
                @Override&lt;br/&gt;
                public void run() {&lt;br/&gt;
                    try &lt;/p&gt;
{
                        if (ovsdbConfigurationService != null) ovsdbConfigurationService.setOFController(node, uuid.toString());
                    }
&lt;p&gt; catch (InterruptedException | ExecutionException e) &lt;/p&gt;
{
                        e.printStackTrace();
                    }
&lt;p&gt;                }&lt;br/&gt;
            };&lt;br/&gt;
            executor.execute(updateControllerRunnable);&lt;br/&gt;
        }&lt;br/&gt;
    }&lt;/p&gt;

&lt;p&gt;Above method is called from method processTableUpdates() in the same class&lt;/p&gt;

&lt;p&gt;            if (update.getNew(uuid) != null) {&lt;br/&gt;
                boolean isNewRow = (tCache == null || tCache.get(uuid.toString()) == null) ? true : false;&lt;br/&gt;
                db.updateRow(databaseName, tableName, uuid.toString(), update.getNew(uuid));&lt;br/&gt;
                if (isNewRow) {&lt;br/&gt;
                    this.handleOpenVSwitchSpecialCase(n, databaseName, tableName, uuid);&lt;br/&gt;
                    if (!ovsdbInventoryListeners.isEmpty()) {&lt;br/&gt;
                        for (OvsdbInventoryListener listener : ovsdbInventoryListeners) &lt;/p&gt;
{
                            listener.rowAdded(n, tableName, uuid.toString(), update.getNew(uuid));
                        }
&lt;p&gt;                    }&lt;/p&gt;

&lt;p&gt;Once i disable &quot;setting OF controller for every new bridge&quot; behavior, it fixes the issue.&lt;/p&gt;

&lt;p&gt;IMO assuming that compute node ovsdb instance will be clean (no bridges) before it connects to the controller is absolutely fine. After that ovsdb instance will only persist the configuration that is created by controller. This will give more controlled environment for controller to make sure that things work as expected.&lt;/p&gt;</comment>
                            <comment id="40783" author="vishnoianil@gmail.com" created="Tue, 31 Mar 2015 12:23:14 +0000"  >&lt;p&gt;If any external project wants to enable the behavior of setting OF Controller for every new bridge, they can override the value in controller config file to enable that. Although it&apos;s good if that can be exposed through config sub system rather then a config file.&lt;/p&gt;</comment>
                            <comment id="40784" author="vishnoianil@gmail.com" created="Tue, 31 Mar 2015 12:26:49 +0000"  >&lt;p&gt;&lt;a href=&quot;https://git.opendaylight.org/gerrit/17439&quot; class=&quot;external-link&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;&gt;https://git.opendaylight.org/gerrit/17439&lt;/a&gt;&lt;/p&gt;</comment>
                            <comment id="40785" author="flavio@flaviof.com" created="Tue, 31 Mar 2015 12:33:47 +0000"  >&lt;p&gt;(In reply to Anil Vishnoi from comment #1)&lt;br/&gt;
&amp;gt; The root cause of this problem is a race condition while setting up the&lt;br/&gt;
&amp;gt; openflow controller for bridge. When ovsdb node connects to the controller,&lt;br/&gt;
&amp;gt; it generate NODE event, that results in creating br-int and setting up the&lt;br/&gt;
&amp;gt; OF controller. Once bridge table is modified with br-int entry, it generate&lt;br/&gt;
&amp;gt; table update for Bridge table. Ovsdb Plugin receives this table update and&lt;br/&gt;
&amp;gt; it&apos;s default behavior is to set of controller for any new bridge, so when it&lt;br/&gt;
&amp;gt; gets the bridge table update, it  again tries to set the openflow controller&lt;br/&gt;
&amp;gt; for the same bridge (br-int) and that causes the race condition, given that&lt;br/&gt;
&amp;gt; both the actions happens in two separate thread. Following are the two stack&lt;br/&gt;
&amp;gt; that try to set the OF controller for the bridge when ovsdb node connects to&lt;br/&gt;
&amp;gt; the controller first time.&lt;br/&gt;
&amp;gt; &lt;br/&gt;
&amp;gt; 1) &lt;br/&gt;
&amp;gt; java.lang.Exception: Stack trace&lt;br/&gt;
&amp;gt; 	at java.lang.Thread.dumpStack(Thread.java:1365)&lt;br/&gt;
&amp;gt; 	at&lt;br/&gt;
&amp;gt; org.opendaylight.ovsdb.plugin.impl.ConfigurationServiceImpl.&lt;br/&gt;
&amp;gt; setOFController(ConfigurationServiceImpl.java:407)&lt;br/&gt;
&amp;gt; 	at&lt;br/&gt;
&amp;gt; org.opendaylight.ovsdb.openstack.netvirt.impl.BridgeConfigurationManagerImpl.&lt;br/&gt;
&amp;gt; addBridge(BridgeConfigurationManagerImpl.java:677)&lt;br/&gt;
&amp;gt; 	at&lt;br/&gt;
&amp;gt; org.opendaylight.ovsdb.openstack.netvirt.impl.BridgeConfigurationManagerImpl.&lt;br/&gt;
&amp;gt; createIntegrationBridge(BridgeConfigurationManagerImpl.java:376)&lt;br/&gt;
&amp;gt; 	at&lt;br/&gt;
&amp;gt; org.opendaylight.ovsdb.openstack.netvirt.impl.BridgeConfigurationManagerImpl.&lt;br/&gt;
&amp;gt; prepareNode(BridgeConfigurationManagerImpl.java:182)&lt;br/&gt;
&amp;gt; 	at&lt;br/&gt;
&amp;gt; org.opendaylight.ovsdb.openstack.netvirt.SouthboundHandler.&lt;br/&gt;
&amp;gt; processNodeUpdate(SouthboundHandler.java:128)&lt;br/&gt;
&amp;gt; 	at&lt;br/&gt;
&amp;gt; org.opendaylight.ovsdb.openstack.netvirt.SouthboundHandler.&lt;br/&gt;
&amp;gt; processEvent(SouthboundHandler.java:345)&lt;br/&gt;
&amp;gt; 	at&lt;br/&gt;
&amp;gt; org.opendaylight.ovsdb.openstack.netvirt.impl.EventDispatcherImpl.&lt;br/&gt;
&amp;gt; dispatchEvent(EventDispatcherImpl.java:92)&lt;br/&gt;
&amp;gt; 	at&lt;br/&gt;
&amp;gt; org.opendaylight.ovsdb.openstack.netvirt.impl.EventDispatcherImpl.&lt;br/&gt;
&amp;gt; access$100(EventDispatcherImpl.java:28)&lt;br/&gt;
&amp;gt; 	at&lt;br/&gt;
&amp;gt; org.opendaylight.ovsdb.openstack.netvirt.impl.EventDispatcherImpl$1.&lt;br/&gt;
&amp;gt; run(EventDispatcherImpl.java:55)&lt;br/&gt;
&amp;gt; 	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)&lt;br/&gt;
&amp;gt; 	at java.util.concurrent.FutureTask.run(FutureTask.java:262)&lt;br/&gt;
&amp;gt; 	at&lt;br/&gt;
&amp;gt; java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:&lt;br/&gt;
&amp;gt; 1145)&lt;br/&gt;
&amp;gt; 	at&lt;br/&gt;
&amp;gt; java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:&lt;br/&gt;
&amp;gt; 615)&lt;br/&gt;
&amp;gt; 	at java.lang.Thread.run(Thread.java:745)&lt;br/&gt;
&amp;gt; &lt;br/&gt;
&amp;gt; 2)&lt;br/&gt;
&amp;gt; java.lang.Exception: Stack trace&lt;br/&gt;
&amp;gt; 	at java.lang.Thread.dumpStack(Thread.java:1365)&lt;br/&gt;
&amp;gt; 	at&lt;br/&gt;
&amp;gt; org.opendaylight.ovsdb.plugin.impl.ConfigurationServiceImpl.&lt;br/&gt;
&amp;gt; setOFController(ConfigurationServiceImpl.java:407)&lt;br/&gt;
&amp;gt; 	at&lt;br/&gt;
&amp;gt; org.opendaylight.ovsdb.plugin.impl.InventoryServiceImpl$1.&lt;br/&gt;
&amp;gt; run(InventoryServiceImpl.java:184)&lt;br/&gt;
&amp;gt; 	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)&lt;br/&gt;
&amp;gt; 	at java.util.concurrent.FutureTask.run(FutureTask.java:262)&lt;br/&gt;
&amp;gt; 	at&lt;br/&gt;
&amp;gt; java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.&lt;br/&gt;
&amp;gt; access$201(ScheduledThreadPoolExecutor.java:178)&lt;br/&gt;
&amp;gt; 	at&lt;br/&gt;
&amp;gt; java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.&lt;br/&gt;
&amp;gt; run(ScheduledThreadPoolExecutor.java:292)&lt;br/&gt;
&amp;gt; 	at&lt;br/&gt;
&amp;gt; java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:&lt;br/&gt;
&amp;gt; 1145)&lt;br/&gt;
&amp;gt; 	at&lt;br/&gt;
&amp;gt; java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:&lt;br/&gt;
&amp;gt; 615)&lt;br/&gt;
&amp;gt; 	at java.lang.Thread.run(Thread.java:745)&lt;br/&gt;
&amp;gt; &lt;br/&gt;
&amp;gt; Second stack is the one that set&apos;s the OF controller for any new bridge.&lt;br/&gt;
&amp;gt; &lt;br/&gt;
&amp;gt; Although setOFController check for the existing controller, but it checks&lt;br/&gt;
&amp;gt; the internal cache for that, and internal cache won&apos;t get updated till&lt;br/&gt;
&amp;gt; controller gets the update from ovsdb node for Controller table update. So&lt;br/&gt;
&amp;gt; this race condition happens in the duration between controller sent the &quot;set&lt;br/&gt;
&amp;gt; controller for br-int&quot; to ovsdb-node and it gets updated in internal cache.&lt;br/&gt;
&amp;gt; &lt;br/&gt;
&amp;gt; From Openstack integration perspective, i think we should not explicitly set&lt;br/&gt;
&amp;gt; controller for each bridge that we find on ovsdb node. I am referring to&lt;br/&gt;
&amp;gt; following code in InventoryServiceImpl.java &lt;br/&gt;
&amp;gt; &lt;br/&gt;
&amp;gt;     private void handleOpenVSwitchSpecialCase(final Node node, final String&lt;br/&gt;
&amp;gt; databaseName, final String tableName, final UUID uuid) {&lt;br/&gt;
&amp;gt;         if&lt;br/&gt;
&amp;gt; (OvsVswitchdSchemaConstants.shouldConfigureController(databaseName,&lt;br/&gt;
&amp;gt; tableName)) {&lt;br/&gt;
&amp;gt;             Runnable updateControllerRunnable = new Runnable() {&lt;br/&gt;
&amp;gt;                 @Override&lt;br/&gt;
&amp;gt;                 public void run() {&lt;br/&gt;
&amp;gt;                     try &lt;/p&gt;
{
&amp;gt;                         if (ovsdbConfigurationService != null)
&amp;gt; ovsdbConfigurationService.setOFController(node, uuid.toString());
&amp;gt;                     }
&lt;p&gt; catch (InterruptedException | ExecutionException e) &lt;/p&gt;
{
&amp;gt;                         e.printStackTrace();
&amp;gt;                     }
&lt;p&gt;&amp;gt;                 }&lt;br/&gt;
&amp;gt;             };&lt;br/&gt;
&amp;gt;             executor.execute(updateControllerRunnable);&lt;br/&gt;
&amp;gt;         }&lt;br/&gt;
&amp;gt;     }&lt;br/&gt;
&amp;gt; &lt;br/&gt;
&amp;gt; Above method is called from method processTableUpdates() in the same class&lt;br/&gt;
&amp;gt; &lt;br/&gt;
&amp;gt;             if (update.getNew(uuid) != null) {&lt;br/&gt;
&amp;gt;                 boolean isNewRow = (tCache == null ||&lt;br/&gt;
&amp;gt; tCache.get(uuid.toString()) == null) ? true : false;&lt;br/&gt;
&amp;gt;                 db.updateRow(databaseName, tableName, uuid.toString(),&lt;br/&gt;
&amp;gt; update.getNew(uuid));&lt;br/&gt;
&amp;gt;                 if (isNewRow) {&lt;br/&gt;
&amp;gt;                     this.handleOpenVSwitchSpecialCase(n, databaseName,&lt;br/&gt;
&amp;gt; tableName, uuid);&lt;br/&gt;
&amp;gt;                     if (!ovsdbInventoryListeners.isEmpty()) {&lt;br/&gt;
&amp;gt;                         for (OvsdbInventoryListener listener :&lt;br/&gt;
&amp;gt; ovsdbInventoryListeners) &lt;/p&gt;
{
&amp;gt;                             listener.rowAdded(n, tableName, uuid.toString(),
&amp;gt; update.getNew(uuid));
&amp;gt;                         }
&lt;p&gt;&amp;gt;                     }&lt;br/&gt;
&amp;gt; &lt;br/&gt;
&amp;gt; Once i disable &quot;setting OF controller for every new bridge&quot; behavior, it&lt;br/&gt;
&amp;gt; fixes the issue.&lt;br/&gt;
&amp;gt; &lt;br/&gt;
&amp;gt; IMO assuming that compute node ovsdb instance will be clean (no bridges)&lt;br/&gt;
&amp;gt; before it connects to the controller is absolutely fine. After that ovsdb&lt;br/&gt;
&amp;gt; instance will only persist the configuration that is created by controller.&lt;br/&gt;
&amp;gt; This will give more controlled environment for controller to make sure that&lt;br/&gt;
&amp;gt; things work as expected.&lt;/p&gt;

&lt;p&gt;Very good catch, Anil! I don&apos;t think we can assume there are no bridges in&lt;br/&gt;
ovs when we connect it to the manager. In some start-up scripts, openstack&lt;br/&gt;
explicitly creates br-int before connecting to ODL. Also, br-ex is only&lt;br/&gt;
created by openstack. Any ideas on how we could avoid the race w/out losing&lt;br/&gt;
the ability to set controller in cases when bridge is already created?&lt;/p&gt;</comment>
                    </comments>
                    <attachments>
                    </attachments>
                <subtasks>
                    </subtasks>
                <customfields>
                                                <customfield id="customfield_10205" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                        <customfieldname>Component Version</customfieldname>
                        <customfieldvalues>
                                <customfieldvalue key="10366"><![CDATA[ovsdb-plugin - 1.0.0]]></customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                <customfield id="customfield_11400" key="com.atlassian.jira.plugins.jira-development-integration-plugin:devsummary">
                        <customfieldname>Development</customfieldname>
                        <customfieldvalues>
                            
                        </customfieldvalues>
                    </customfield>
                                                                                                                        <customfield id="customfield_10208" key="com.atlassian.jira.plugin.system.customfieldtypes:textfield">
                        <customfieldname>External issue ID</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>2925</customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                <customfield id="customfield_10201" key="com.atlassian.jira.plugin.system.customfieldtypes:url">
                        <customfieldname>External issue URL</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue><![CDATA[https://bugs.opendaylight.org/show_bug.cgi?id=2925]]></customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                                            <customfield id="customfield_10206" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                        <customfieldname>Issue Type</customfieldname>
                        <customfieldvalues>
                                <customfieldvalue key="10300"><![CDATA[Bug]]></customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                                                                                                                                                                                                                            <customfield id="customfield_10202" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                        <customfieldname>Priority</customfieldname>
                        <customfieldvalues>
                                <customfieldvalue key="10301"><![CDATA[Normal]]></customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                <customfield id="customfield_10000" key="com.pyxis.greenhopper.jira:gh-lexo-rank">
                        <customfieldname>Rank</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>0|i020x3:</customfieldvalue>

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