[ovs-dev] [PATCH] interface-reconfigure: callout to datapath backend class method on rewrite

Ian Campbell ian.campbell at citrix.com
Fri Jun 4 15:39:10 UTC 2010


Use this mechanism to allow the vswitch backend to update the vswitch
configuration's mapping from datapath to XenAPI datamodel Network
UUIDs. The vswitch needs a mechanism to update these when they change
(i.e. on pool join and eject).

Refactor the DatapathFactory method to return the class which the
caller can instantiate or not as the require.

Signed-off-by: Ian Campbell <ian.campbell at citrix.com>

diff -r bf13c6a1e0da -r ceb44765e47f scripts/InterfaceReconfigure.py
--- a/scripts/InterfaceReconfigure.py	Fri Jun 04 16:38:58 2010 +0100
+++ b/scripts/InterfaceReconfigure.py	Fri Jun 04 16:38:58 2010 +0100
@@ -803,6 +803,12 @@
     def __init__(self, pif):
         self._pif = pif
 
+    @classmethod
+    def rewrite(cls):
+        """Class method called when write action is called. Can be used
+           to update any backend specific configuration."""
+        pass
+
     def configure_ipdev(self, cfg):
         """Write ifcfg TYPE field for an IPdev, plus any type specific
            fields to cfg
@@ -850,7 +856,7 @@
         """
         raise NotImplementedError
         
-def DatapathFactory(pif):
+def DatapathFactory():
     # XXX Need a datapath object for bridgeless PIFs
 
     try:
@@ -862,9 +868,9 @@
     
     if network_backend == "bridge":
         from InterfaceReconfigureBridge import DatapathBridge
-        return DatapathBridge(pif)
+        return DatapathBridge
     elif network_backend in ["openvswitch", "vswitch"]:
         from InterfaceReconfigureVswitch import DatapathVswitch
-        return DatapathVswitch(pif)
+        return DatapathVswitch
     else:
         raise Error("unknown network backend %s" % network_backend)
diff -r bf13c6a1e0da -r ceb44765e47f scripts/InterfaceReconfigureVswitch.py
--- a/scripts/InterfaceReconfigureVswitch.py	Fri Jun 04 16:38:58 2010 +0100
+++ b/scripts/InterfaceReconfigureVswitch.py	Fri Jun 04 16:38:58 2010 +0100
@@ -358,6 +358,17 @@
         
         log("Configured for Vswitch datapath")
 
+    @classmethod
+    def rewrite(cls):
+        vsctl_argv = []
+        for pif in db().get_all_pifs():
+            pifrec = db().get_pif_record(pif)
+            if not pif_is_vlan(pif) and pifrec['currently_attached']:
+                vsctl_argv += set_br_external_ids(pif)
+
+        if vsctl_argv != []:
+            datapath_modify_config(vsctl_argv)
+
     def configure_ipdev(self, cfg):
         cfg.write("TYPE=Ethernet\n")
 
diff -r bf13c6a1e0da -r ceb44765e47f scripts/interface-reconfigure
--- a/scripts/interface-reconfigure	Fri Jun 04 16:38:58 2010 +0100
+++ b/scripts/interface-reconfigure	Fri Jun 04 16:38:58 2010 +0100
@@ -415,7 +415,7 @@
     pifrec = db().get_pif_record(pif)
 
     ipdev = pif_ipdev_name(pif)
-    dp = DatapathFactory(pif)
+    dp = DatapathFactory()(pif)
 
     log("action_up: %s" % ipdev)
 
@@ -455,7 +455,7 @@
 
 def action_down(pif):
     ipdev = pif_ipdev_name(pif)
-    dp = DatapathFactory(pif)
+    dp = DatapathFactory()(pif)
 
     log("action_down: %s" % ipdev)
 
@@ -463,6 +463,9 @@
 
     dp.bring_down()
 
+def action_rewrite():
+    DatapathFactory().rewrite()
+    
 # This is useful for reconfiguring the mgmt interface after having lost connectivity to the pool master
 def action_force_rewrite(bridge, config):
     def getUUID():
@@ -666,7 +669,7 @@
                 pif = db().get_pif_by_uuid(pif_uuid)
 
             if action == "rewrite":
-                pass
+                action_rewrite()
             else:
                 if not pif:
                     raise Usage("No PIF given")




More information about the dev mailing list