From: Ian Campbell Date: Fri, 4 Jun 2010 15:39:10 +0000 (+0100) Subject: interface-reconfigure: callout to datapath backend class method on rewrite X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=823c5699d4de7bf726f988e1ca6197fb2400f388;p=openvswitch interface-reconfigure: callout to datapath backend class method on rewrite 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 --- diff --git a/xenserver/opt_xensource_libexec_InterfaceReconfigure.py b/xenserver/opt_xensource_libexec_InterfaceReconfigure.py index 9723c661..2b709ad0 100644 --- a/xenserver/opt_xensource_libexec_InterfaceReconfigure.py +++ b/xenserver/opt_xensource_libexec_InterfaceReconfigure.py @@ -803,6 +803,12 @@ class Datapath(object): 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 @@ class Datapath(object): """ raise NotImplementedError -def DatapathFactory(pif): +def DatapathFactory(): # XXX Need a datapath object for bridgeless PIFs try: @@ -862,9 +868,9 @@ def DatapathFactory(pif): 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 --git a/xenserver/opt_xensource_libexec_InterfaceReconfigureVswitch.py b/xenserver/opt_xensource_libexec_InterfaceReconfigureVswitch.py index b102886e..a4b9da75 100644 --- a/xenserver/opt_xensource_libexec_InterfaceReconfigureVswitch.py +++ b/xenserver/opt_xensource_libexec_InterfaceReconfigureVswitch.py @@ -358,6 +358,17 @@ class DatapathVswitch(Datapath): 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 --git a/xenserver/opt_xensource_libexec_interface-reconfigure b/xenserver/opt_xensource_libexec_interface-reconfigure index f756bab7..7d30f97e 100755 --- a/xenserver/opt_xensource_libexec_interface-reconfigure +++ b/xenserver/opt_xensource_libexec_interface-reconfigure @@ -415,7 +415,7 @@ def action_up(pif, force): 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_up(pif, force): def action_down(pif): ipdev = pif_ipdev_name(pif) - dp = DatapathFactory(pif) + dp = DatapathFactory()(pif) log("action_down: %s" % ipdev) @@ -463,6 +463,9 @@ def action_down(pif): 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 @@ def main(argv=None): pif = db().get_pif_by_uuid(pif_uuid) if action == "rewrite": - pass + action_rewrite() else: if not pif: raise Usage("No PIF given")