xenserver: Allow use first class datamodel field for controller IP
authorJustin Pettit <jpettit@nicira.com>
Fri, 9 Apr 2010 15:10:34 +0000 (08:10 -0700)
committerJustin Pettit <jpettit@nicira.com>
Mon, 12 Apr 2010 19:39:45 +0000 (12:39 -0700)
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.

xenserver/etc_xapi.d_plugins_openvswitch-cfg-update
xenserver/usr_lib_xsconsole_plugins-base_XSFeatureVSwitch.py

index 27aeaf6..42bd09a 100755 (executable)
@@ -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()
index 252c6e8..6ee4138 100644 (file)
@@ -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())