From f357c76cd508ac53844141602c4ba0127b63a7de Mon Sep 17 00:00:00 2001
From: Vasyl Saienko <vsaienko@mirantis.com>
Date: Mon, 9 Oct 2017 13:14:41 +0300
Subject: [PATCH] [Devstack] Replace tap with veth

This patch replace tap interfaces by veth pairs which
ensures that port is always present in ovs even when VM
is powered off.

Closes-Bug: #1722158

Change-Id: I04ff6a97bebf15636a794b51f748c62eda627d36
---
 devstack/lib/ironic                          |  2 +-
 devstack/tools/ironic/scripts/create-node.sh | 15 ++++++++++-----
 devstack/tools/ironic/templates/vm.xml       |  4 ++--
 3 files changed, 13 insertions(+), 8 deletions(-)

diff --git a/devstack/lib/ironic b/devstack/lib/ironic
index 0390131d2a..7f7bf44cd7 100644
--- a/devstack/lib/ironic
+++ b/devstack/lib/ironic
@@ -2120,7 +2120,7 @@ function cleanup_baremetal_basic_ops {
 
         # Cleanup node bridge/interfaces
         for i in $(seq 1 $IRONIC_VM_INTERFACE_COUNT); do
-            sudo ip tuntap del dev tap-${vm_name}i${i} mode tap
+            sudo ip link del dev tap-${vm_name}i${i}
         done
     done
 
diff --git a/devstack/tools/ironic/scripts/create-node.sh b/devstack/tools/ironic/scripts/create-node.sh
index 55b25ceb75..9c1144a5dc 100755
--- a/devstack/tools/ironic/scripts/create-node.sh
+++ b/devstack/tools/ironic/scripts/create-node.sh
@@ -94,10 +94,15 @@ INTERFACE_COUNT=${INTERFACE_COUNT:-1}
 
 for int in $(seq 1 $INTERFACE_COUNT); do
     tapif=tap-${NAME}i${int}
-    sudo ip tuntap add dev $tapif mode tap
-    sudo ip link set $tapif mtu $INTERFACE_MTU
-    sudo ip link set $tapif up
-    sudo ovs-vsctl add-port $BRIDGE $tapif
+    ovsif=ovs-${NAME}i${int}
+    # NOTE(vsaienko) use veth pair here to ensure that interface
+    # exists in OVS even when VM is powered off.
+    sudo ip link add dev $tapif type veth peer name $ovsif
+    for l in $tapif $ovsif; do
+        sudo ip link set dev $l up
+        sudo ip link set $l mtu $INTERFACE_MTU
+    done
+    sudo ovs-vsctl add-port $BRIDGE $ovsif
 done
 
 if ! virsh list --all | grep -q $NAME; then
@@ -126,5 +131,5 @@ if ! virsh list --all | grep -q $NAME; then
 fi
 
 # echo mac in format mac1,ovs-node-0i1;mac2,ovs-node-0i2;...;macN,ovs-node0iN
-VM_MAC=$(echo -n $(virsh domiflist $NAME |awk '/tap-/{print $5","$1}')|tr ' ' ';')
+VM_MAC=$(echo -n $(virsh domiflist $NAME |awk '/tap-/{print $5","$3}')|tr ' ' ';' |sed s/tap-/ovs-/g)
 echo -n "$VM_MAC $VBMC_PORT $PDU_OUTLET"
diff --git a/devstack/tools/ironic/templates/vm.xml b/devstack/tools/ironic/templates/vm.xml
index 3fc1380ec0..dc6093e0b4 100644
--- a/devstack/tools/ironic/templates/vm.xml
+++ b/devstack/tools/ironic/templates/vm.xml
@@ -45,8 +45,8 @@
       <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
     </controller>
     {% for n in range(1, interface_count+1) %}
-    <interface type='ethernet'>
-      <target dev='{{ "tap-" + name + "i" + n|string }}'/>
+    <interface type='direct'>
+      <source dev='{{ "tap-" + name + "i" + n|string }}'/>
       <model type='{{ nicdriver }}'/>
       <address type='pci' domain='0x0000' bus='0x01' slot='{{ "0x0" + n|string }}' function='0x0'/>
     </interface>