X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=xenserver%2Fetc_xapi.d_plugins_openvswitch-cfg-update;h=7333018687347a620e81573953e0cab979e108c7;hb=c5cd8b2ef14fa258f57ac5046ca3e85d97cd7650;hp=f915b422d0a4bebee2f60139890eef2a362fb0b9;hpb=88b56f290a776da698633db8a4457a506600688a;p=sliver-openvswitch.git diff --git a/xenserver/etc_xapi.d_plugins_openvswitch-cfg-update b/xenserver/etc_xapi.d_plugins_openvswitch-cfg-update index f915b422d..733301868 100755 --- a/xenserver/etc_xapi.d_plugins_openvswitch-cfg-update +++ b/xenserver/etc_xapi.d_plugins_openvswitch-cfg-update @@ -25,6 +25,7 @@ import XenAPIPlugin import XenAPI import os import subprocess +import syslog vsctl="/usr/bin/ovs-vsctl" cacert_filename="/etc/openvswitch/vswitchd.cacert" @@ -38,6 +39,15 @@ def delete_cacert(): pass def update(session, args): + # Refresh bridge network UUIDs in case this host joined or left a pool. + script = "/opt/xensource/libexec/interface-reconfigure" + try: + retval = subprocess.call([script, "rewrite"]) + if retval != 0: + syslog.syslog("%s exited with status %d" % (script, retval)) + except OSError, e: + syslog.syslog("%s: failed to execute (%s)" % (script, e.strerror)) + pools = session.xenapi.pool.get_all() # We assume there is only ever one pool... if len(pools) == 0: @@ -46,16 +56,29 @@ def update(session, args): raise XenAPIPlugin.Failure("MORE_THAN_ONE_POOL_FOR_HOST", []) pool = session.xenapi.pool.get_record(pools[0]) try: - controller = pool["other_config"]["vSwitchController"] + try: + controller = pool["vswitch_controller"] + except KeyError: + # On systems older than XenServer 5.6.0, we needed to store + # the key in "other_config". + controller = pool["other_config"]["vSwitchController"] except KeyError, e: controller = "" currentController = vswitchCurrentController() if controller == "" and currentController != "": delete_cacert() + try: + emergency_reset(session, None) + except: + pass removeControllerCfg() return "Successfully removed controller config" elif controller != currentController: delete_cacert() + try: + emergency_reset(session, None) + except: + pass setControllerCfg(controller) return "Successfully set controller to " + controller else: @@ -88,7 +111,7 @@ def setControllerCfg(controller): 'managers="ssl:' + controller + ':6632"']) def vswitchCfgQuery(action_args): - cmd = [vsctl, "-vANY:console:emer"] + action_args + cmd = [vsctl, "--timeout=5", "-vANY:console:emer"] + action_args output = subprocess.Popen(cmd, stdout=subprocess.PIPE).communicate() if len(output) == 0 or output[0] == None: output = "" @@ -97,11 +120,21 @@ def vswitchCfgQuery(action_args): return output def vswitchCfgMod(action_args): - cmd = [vsctl, "-vANY:console:emer"] + action_args + cmd = [vsctl, "--timeout=5", "-vANY:console:emer"] + action_args exitcode = subprocess.call(cmd) if exitcode != 0: raise XenAPIPlugin.Failure("VSWITCH_CONFIG_MOD_FAILURE", [ str(exitcode) , str(action_args) ]) + +def emergency_reset(session, args): + cmd = [vsctl, "--timeout=5", "emer-reset"] + exitcode = subprocess.call(cmd) + if exitcode != 0: + raise XenAPIPlugin.Failure("VSWITCH_EMER_RESET_FAILURE", + [ str(exitcode) ]) + + return "Successfully reset configuration" if __name__ == "__main__": - XenAPIPlugin.dispatch({"update": update}) + XenAPIPlugin.dispatch({"update": update, + "emergency_reset": emergency_reset})