Discussion:
[netcf-devel] [netcf-devel][PATCH V3] vlan: fix vlan interface misses tag attribute when inactive
Leno Hou
2016-12-08 13:04:15 UTC
Permalink
This patch fixes the problem as shown below.
* virsh dumpxml failed with vlan1292 in inactive status
* virt-manager failed to view vlan1292 interface details.
RedHat Bugzilla:#1398143

Following is steps to reproduce in virsh.
1) setup 802.1q vlan tagging using ifcfg-files
#cat > /etc/sysconfig/network-scripts/ifcfg-vlan1292 < EOF
VLAN=yes
VLAN_NAME_TYPE=VLAN_PLUS_VID_NO_PAD
DEVICE=vlan1292
PHYSDEV=eth0
ONBOOT=yes
BOOTPROTO=static
IPADDR=10.254.5.254
NETMASK=255.255.255.0
TYPE=Ethernet
NM_CONTROLLED=no
EOF

2) active vlan interface and dumpxml
#ifup vlan1292
#virsh iface-dumpxml vlan1292
<interface type='vlan' name='vlan1292'>
<protocol family='ipv4'>
<ip address='10.254.5.254' prefix='24'/>
</protocol>
<protocol family='ipv6'>
<ip address='fe80::4:21ff:fe00:b300' prefix='64'/>
</protocol>
<link speed='1000' state='up'/>
<vlan tag='1292'>
<interface name='eth0'/>
</vlan>
</interface>

3) deactive vlan interface and dumpxml
#ifdown vlan1292
#virsh iface-dumpxml vlan1292
error: XML error: vlan interface misses the tag attribute

Once applied this patch, it's will be successfully returned the results:
#virsh iface-dumpxml vlan1292
<interface type='vlan' name='vlan1292'>
<start mode='onboot'/>
<protocol family='ipv4'>
<ip address='10.254.5.254' prefix='24'/>
</protocol>
<vlan tag='1292'>
<interface name='eth0'/>
</vlan>
</interface>

4) And netcf would turn above iface-dumpxml to the file
/etc/sysconfig/network-scripts/ifcfg-vlan192
#virsh iface-define vlan1292.xml

Signed-off-by: Leno Hou <***@gmail.com>
---
data/xml/redhat-get.xsl | 20 ++++++++++++++++----
data/xml/redhat-put.xsl | 21 ++++++++++++++++-----
2 files changed, 32 insertions(+), 9 deletions(-)

diff --git a/data/xml/redhat-get.xsl b/data/xml/redhat-get.xsl
index ec56f01..5796c10 100644
--- a/data/xml/redhat-get.xsl
+++ b/data/xml/redhat-get.xsl
@@ -46,11 +46,23 @@
</xsl:template>

<xsl:template name="vlan-interface-common">
- <xsl:variable name="iface" select="pathcomponent:escape(concat(vlan/interface/@name, '.', vlan/@tag))"/>
+ <xsl:variable name="vlan-name" select="@name"/>
+ <xsl:choose>
+ <xsl:when test="contains($vlan-name, '.')">
+ <xsl:variable name="iface" select="pathcomponent:escape(concat(vlan/interface/@name, '.', vlan/@tag))"/>
+ <xsl:attribute name="path">/files/etc/sysconfig/network-scripts/ifcfg-<xsl:value-of select="$iface"/></xsl:attribute>
+ <node label="DEVICE" value="{$iface}"/>
+ <node label="VLAN" value="yes"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="iface" select="/interface/@name"/>
+ <xsl:attribute name="path">/files/etc/sysconfig/network-scripts/ifcfg-<xsl:value-of select="$iface"/></xsl:attribute>
+ <node label="DEVICE" value="{$iface}"/>
+ <node label="PHYSDEV" value="{vlan/interface/@name}"/>
+ <node label="VLAN" value="yes"/>
+ </xsl:otherwise>
+ </xsl:choose>

- <xsl:attribute name="path">/files/etc/sysconfig/network-scripts/ifcfg-<xsl:value-of select="$iface"/></xsl:attribute>
- <node label="DEVICE" value="{$iface}"/>
- <node label="VLAN" value="yes"/>
</xsl:template>

<xsl:template name='bare-vlan-interface'>
diff --git a/data/xml/redhat-put.xsl b/data/xml/redhat-put.xsl
index 89145e5..c6f9f65 100644
--- a/data/xml/redhat-put.xsl
+++ b/data/xml/redhat-put.xsl
@@ -56,11 +56,22 @@

<xsl:template name="vlan-device">
<xsl:variable name="name" select="node[@label = 'DEVICE']/@value"/>
- <xsl:variable name="device" select="substring-before($name, '.')"/>
- <xsl:variable name="tag" select="substring-after($name, '.')"/>
- <vlan tag="{$tag}">
- <interface name="{$device}"/>
- </vlan>
+ <xsl:choose>
+ <xsl:when test="contains($name, '.')">
+ <xsl:variable name="device" select="substring-before($name, '.')"/>
+ <xsl:variable name="tag" select="substring-after($name, '.')"/>
+ <vlan tag="{$tag}">
+ <interface name="{$device}"/>
+ </vlan>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="device" select="node[@label = 'PHYSDEV']/@value"/>
+ <xsl:variable name="tag" select="translate($name, translate($name, '0123456789', ''), '')"/>
+ <vlan tag="{$tag}">
+ <interface name="{$device}"/>
+ </vlan>
+ </xsl:otherwise>
+ </xsl:choose>
</xsl:template>

<!--
--
2.7.4
_______________________________________________
netcf-devel mailing list -- netcf-***@lists.fedorahosted.org
To unsubscribe send an email to netcf-devel-***@lists.fedoraho
Loading...