[ovs-dev] [PATCH] xenserver: Set fail_mode on internal bridges.

Ethan Jackson ethan at nicira.com
Wed Feb 9 03:19:08 UTC 2011


The fail_mode was not getting set on internal bridges.  This commit
forces ovs-external-ids to automatically set fail_mode on all new
bridges.

Signed-off-by: Ethan Jackson <ethan at nicira.com>
Bug #4494.
---
 .../usr_share_openvswitch_scripts_ovs-external-ids |   51 +++++++++++++++----
 1 files changed, 40 insertions(+), 11 deletions(-)

diff --git a/xenserver/usr_share_openvswitch_scripts_ovs-external-ids b/xenserver/usr_share_openvswitch_scripts_ovs-external-ids
index 07303e3..d88c5c6 100755
--- a/xenserver/usr_share_openvswitch_scripts_ovs-external-ids
+++ b/xenserver/usr_share_openvswitch_scripts_ovs-external-ids
@@ -68,20 +68,26 @@ def init_session():
 
     return True
 
-# By default, the "bridge-id" external id in the Bridge table is the
-# same as "xs-network-uuids".  This may be overridden by defining a
-# "nicira-bridge-id" key in the "other_config" field of the network
-# record of XAPI.
-def get_bridge_id(br_name, default=None):
+def get_network_by_bridge(br_name):
     if not init_session():
         s_log.warning("Failed to get bridge id %s because"
                 " XAPI session could not be initialized" % br_name)
-        return default
+        return None
 
     for n in session.xenapi.network.get_all():
         rec = session.xenapi.network.get_record(n)
-        if rec['bridge'] != br_name:
-            continue
+        if rec['bridge'] == br_name:
+            return rec
+
+    return None
+
+# By default, the "bridge-id" external id in the Bridge table is the
+# same as "xs-network-uuids".  This may be overridden by defining a
+# "nicira-bridge-id" key in the "other_config" field of the network
+# record of XAPI.
+def get_bridge_id(br_name, default=None):
+    rec = get_network_by_bridge(br_name)
+    if rec:
         return rec['other_config'].get('nicira-bridge-id', default)
 
 # By default, the "iface-id" external id in the Interface table is the
@@ -107,13 +113,16 @@ def get_iface_id(if_name, xs_vif_uuid):
         s_log.warning("Could not find XAPI entry for VIF %s" % if_name)
         return xs_vif_uuid
 
-def set_external_id(table, record, key, value):
-    col = 'external-ids:"' + key + '"="' + value + '"'
-    cmd = [vsctl, "--timeout=30", "-vANY:console:emer", "set", table, record, col]
+def vsctl_call(args):
+    cmd = [vsctl, "--timeout=30", "-vANY:console:emer"] + args
     exitcode = subprocess.call(cmd)
     if exitcode != 0:
         s_log.warning("Couldn't call ovs-vsctl")
 
+def set_external_id(table, record, key, value):
+    col = 'external-ids:"' + key + '"="' + value + '"'
+    vsctl_call(["set", table, record, col])
+
 # XAPI on XenServer 5.6 uses the external-id "network-uuids" for internal
 # networks, but we now prefer "xs-network-uuids".  Look for its use and
 # write our preferred external-id.
@@ -122,6 +131,25 @@ def update_network_uuids(name, ids):
         set_external_id("Bridge", name, "xs-network-uuids",
                 ids["network-uuids"])
 
+def update_fail_mode(name):
+    rec = get_network_by_bridge(name)
+
+    if not rec:
+        return
+
+    fail_mode = rec['other_config'].get('vswitch-controller-fail-mode')
+
+    if not fail_mode:
+        pools = session.xenapi.pool.get_all()
+        if len(pools) == 1:
+            prec = session.xenapi.pool.get_record(pools[0])
+            fail_mode = prec['other_config'].get('vswitch-controller-fail-mode')
+
+    if fail_mode not in ['standalone', 'secure']:
+        fail_mode = 'standalone'
+
+    vsctl_call(["set", "bridge", name, "fail_mode=" + fail_mode])
+
 def update_bridge_id(name, ids):
     id = get_bridge_id(name, ids.get("xs-network-uuids"))
 
@@ -257,6 +285,7 @@ def main(argv):
                 # so only check for "network-uuids" on creation.
                 if name not in bridges:
                     update_network_uuids(name, ids)
+                    update_fail_mode(name)
 
                 if (name not in bridges) or (bridges[name] != ids):
                     update_bridge_id(name, ids)
-- 
1.7.4





More information about the dev mailing list