[ovs-dev] [PATCH] xenserver: Update all external_ids in tap interfaces.

Ethan Jackson ethan at nicira.com
Wed Jun 22 21:18:49 UTC 2011


Commit 400430 "xenserver: Give tap devices iface-ids." copies the
iface-id from vifs to their related tap device.  It turns out this
is not sufficient, so this commit copies all relevant external_ids
over.

Requested-by: Pankaj Thakkar <thakkar at nicira.com>
Signed-off-by: Ethan Jackson <ethan at nicira.com>

Bug #5954.
---
 .../usr_share_openvswitch_scripts_ovs-xapi-sync    |   31 ++++++++++++++++++-
 1 files changed, 29 insertions(+), 2 deletions(-)

diff --git a/xenserver/usr_share_openvswitch_scripts_ovs-xapi-sync b/xenserver/usr_share_openvswitch_scripts_ovs-xapi-sync
index 400693c..28acad8 100755
--- a/xenserver/usr_share_openvswitch_scripts_ovs-xapi-sync
+++ b/xenserver/usr_share_openvswitch_scripts_ovs-xapi-sync
@@ -124,8 +124,12 @@ def call_vsctl(args):
         s_log.warning("Couldn't call ovs-vsctl")
 
 def set_external_id(table, record, key, value):
-    col = 'external-ids:"' + key + '"="' + value + '"'
-    call_vsctl(["set", table, record, col])
+    if value:
+        col = 'external-ids:"' + key + '"="' + value + '"'
+        call_vsctl(["set", table, record, col])
+    else:
+        call_vsctl(["remove", table, record, "external-ids", key])
+
 
 # XenServer does not call interface-reconfigure on internal networks,
 # which is where the fail-mode would normally be set.
@@ -235,6 +239,27 @@ def handler(signum, frame):
     if (signum == signal.SIGHUP):
         force_run = True
 
+def update_tap_from_vif(idl, tap_name, vif_name):
+    ifaces = idl.data["Interface"]
+    tap = None
+    vif = None
+
+    for i in ifaces:
+        name = str(ifaces[i].name).strip('"')
+        if name == tap_name:
+            tap = ifaces[i]
+        elif name == vif_name:
+            vif = ifaces[i]
+
+    if vif and tap:
+        vxid = vif.external_ids
+        txid = tap.external_ids
+
+        keys = ["attached-mac", "xs-network-uuid", "xs-vif-uuid", "xs-vm-uuid"]
+        for k in keys:
+            if vxid.get(k) != txid.get(k):
+                set_external_id("Interface", tap_name, k, vxid.get(k))
+
 def main(argv):
     global force_run
 
@@ -319,6 +344,8 @@ def main(argv):
                 new_interfaces[vif]["iface-status"] = "inactive"
                 new_interfaces[name]["iface-status"] = "active"
 
+                update_tap_from_vif(idl, name, vif)
+
         if bridges != new_bridges:
             for name,ids in new_bridges.items():
                 if name not in bridges:
-- 
1.7.5.2




More information about the dev mailing list