xenserver: Change license of xsconsole plugin to GPLv2.
[sliver-openvswitch.git] / xenserver / usr_lib_xsconsole_plugins-base_XSFeatureVSwitch.py
index 74eb212..015f4cc 100644 (file)
@@ -1,11 +1,18 @@
-# Copyright (c) Citrix Systems 2008. All rights reserved.
-# xsconsole is proprietary software.
+# Copyright (c) 2007-2010 Citrix Systems Inc.
+# Copyright (c) 2009,2010 Nicira Networks.
 #
-# Xen, the Xen logo, XenCenter, XenMotion are trademarks or registered
-# trademarks of Citrix Systems, Inc., in the United States and other
-# countries.
-
-# Copyright (c) 2009, 2010 Nicira Networks.
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 only.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 
 from XSConsoleLog import *
 
@@ -79,7 +86,7 @@ class VSwitchConfig:
     @staticmethod
     def Get(action):
         try:
-            arg = [vsctl, "-vANY:console:emer"] + action.split()
+            arg = [vsctl, "--timeout=30", "-vANY:console:emer"] + action.split()
             output = ShellPipe(arg).Stdout()
         except StandardError, e:
             XSLogError("config retrieval error: " + str(e))
@@ -99,9 +106,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 +233,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 +250,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 +281,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 +294,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 +320,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())
@@ -327,5 +346,6 @@ class XSFeatureVSwitch:
             }
         )
 
-# Register this plugin when module is imported
-XSFeatureVSwitch().Register()
+# Register this plugin when module is imported, IFF vswitchd is running
+if os.path.exists('/var/run/openvswitch/ovs-vswitchd.pid'):
+    XSFeatureVSwitch().Register()