From 8085488086c48577deaf26fcc11d1be02a6ee140 Mon Sep 17 00:00:00 2001 From: Justin Pettit Date: Fri, 9 Apr 2010 08:10:34 -0700 Subject: [PATCH] xenserver: Allow use first class datamodel field for controller IP Starting in XenServer 5.6.0, a "vswitch_controller" key is available to store the controller's IP address in the "pool" table of XAPI. Older versions must still use the "vSwitchController" key in "other_config". Based on commits 37fee7 and 0ebd737 from the xs5.7 branch written by Ian Campbell. --- .../etc_xapi.d_plugins_openvswitch-cfg-update | 7 ++++- ...xsconsole_plugins-base_XSFeatureVSwitch.py | 30 +++++++++++++------ 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/xenserver/etc_xapi.d_plugins_openvswitch-cfg-update b/xenserver/etc_xapi.d_plugins_openvswitch-cfg-update index 27aeaf624..42bd09a19 100755 --- a/xenserver/etc_xapi.d_plugins_openvswitch-cfg-update +++ b/xenserver/etc_xapi.d_plugins_openvswitch-cfg-update @@ -47,7 +47,12 @@ 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() diff --git a/xenserver/usr_lib_xsconsole_plugins-base_XSFeatureVSwitch.py b/xenserver/usr_lib_xsconsole_plugins-base_XSFeatureVSwitch.py index 252c6e8a8..6ee4138b2 100644 --- a/xenserver/usr_lib_xsconsole_plugins-base_XSFeatureVSwitch.py +++ b/xenserver/usr_lib_xsconsole_plugins-base_XSFeatureVSwitch.py @@ -99,9 +99,13 @@ class VSwitchControllerDialogue(Dialogue): self.hostsInPool = 0 self.hostsUpdated = 0 + self.xs_version = data.host.software_version.product_version('') pool = data.GetPoolForThisHost() if pool is not None: - self.controller = pool.get("other_config", {}).get("vSwitchController", "") + if self.xs_version == "5.5.0": + self.controller = pool.get("other_config", {}).get("vSwitchController", "") + else: + self.controller = pool.get("vswitch_controller", "") else: self.controller = "" @@ -222,14 +226,15 @@ class VSwitchControllerDialogue(Dialogue): def SetController(self, ip): self.hostsInPool = 0 self.hostsUpdated = 0 - Task.Sync(lambda s: self._modifyPoolConfig(s, "vSwitchController", ip)) + Task.Sync(lambda s: self._modifyPoolConfig(s, ip or "")) # Should be done asynchronously, maybe with an external script? Task.Sync(lambda s: self._updateActiveServers(s)) - def _modifyPoolConfig(self, session, key, value): + def _modifyPoolConfig(self, session, value): """Modify pool configuration. - If value == None then delete key, otherwise set key to value.""" + If value == "" then delete configuration, otherwise set to value. + """ pools = session.xenapi.pool.get_all() # We assume there is only ever one pool... if len(pools) == 0: @@ -238,9 +243,13 @@ class VSwitchControllerDialogue(Dialogue): if len(pools) > 1: XSLogFatal(Lang("More than one pool for host.")) return - session.xenapi.pool.remove_from_other_config(pools[0], key) - if value != None: - session.xenapi.pool.add_to_other_config(pools[0], key, value) + if self.xs_version == "5.5.0": + key = "vSwitchController" + session.xenapi.pool.remove_from_other_config(pools[0], key) + if value != None: + session.xenapi.pool.add_to_other_config(pools[0], key, value) + else: + session.xenapi.pool.set_vswitch_controller(value) Data.Inst().Update() def _updateActiveServers(self, session): @@ -265,6 +274,7 @@ class XSFeatureVSwitch: @classmethod def StatusUpdateHandler(cls, inPane): data = Data.Inst() + xs_version = data.host.software_version.product_version('') inPane.AddTitleField(Lang("Open vSwitch")) @@ -277,7 +287,10 @@ class XSFeatureVSwitch: pool = data.GetPoolForThisHost() if pool is not None: - dbController = pool.get("other_config", {}).get("vSwitchController", "") + if (xs_version == "5.5.0"): + dbController = pool.get("other_config", {}).get("vSwitchController", "") + else: + dbController = pool.get("vswitch_controller", "") else: dbController = "" @@ -300,7 +313,6 @@ class XSFeatureVSwitch: VSwitchService.Inst("openvswitch", "ovsdb-server").status()) # Only XenServer 5.5.0 runs ovs-brcompatd - xs_version = data.host.software_version.product_version('') if (xs_version == "5.5.0"): inPane.AddStatusField(Lang("ovs-brcompatd status", 20), VSwitchService.Inst("openvswitch", "ovs-brcompatd").status()) -- 2.43.0