On 12/02/2016 12:29 AM, Leno Hou wrote:
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
I shortened the commit log considerably, and changed it to describe the
changed behavior, rather than how to reproduce the bug.
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 <lenohou(a)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..9e18c62 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="/interface/@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>
It would be nice to eliminate the duplication between the two choices
(the setting of DEVICE and VLAN), but I know only enough about xsl to
realize that variables like $iface must be local to the <xsl:blah> block
they're defined in, so I left it as you wrote it. Since you seem to be
pretty handy with xsl transforms, I would appreciate a followup patch to
eliminate the redundandancy (and if you're good enough to understand how
to translate <route> elements in the XML to/from a file called
"route-$DEVNAME", please let me know and I'll send you a full spec for
adding static routes to an interface's config :-)
In the meantime, ACK, and I pushed it. Thanks for the contribution!
(I've added your name to the AUTHORS file).
+ </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>
<!--