Hi all,

Any feedback for this patch?

Leno Hou


On Fri, Dec 2, 2016 at 1:29 PM, Leno Hou <lenohou@gmail.com> 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

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@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>
+      </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