From 72238868cbc8bcb6543090dc5298ebc1e503cdea Mon Sep 17 00:00:00 2001 From: Justin Pettit Date: Mon, 25 Oct 2010 17:26:44 -0700 Subject: [PATCH] ovs-external-ids: Better handle VIFs from recently resumed VMs XAPI doesn't provide a way to look up a VIF entry based on the name, so we have to locate it by other methods. Previously, we were breaking up the name into the domid and device number. Unfortunately, it can take XAPI a few seconds to update the domid of the VM, when resuming from a suspend. Since we have the VIF UUID, we can just look up the needed information directly based on that. Bug #3930 --- ...share_openvswitch_scripts_ovs-external-ids | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/xenserver/usr_share_openvswitch_scripts_ovs-external-ids b/xenserver/usr_share_openvswitch_scripts_ovs-external-ids index 13c644f0..07303e3e 100755 --- a/xenserver/usr_share_openvswitch_scripts_ovs-external-ids +++ b/xenserver/usr_share_openvswitch_scripts_ovs-external-ids @@ -88,26 +88,24 @@ def get_bridge_id(br_name, default=None): # same as "xs-vif-uuid". This may be overridden by defining a # "nicira-iface-id" key in the "other_config" field of the VIF # record of XAPI. -def get_iface_id(if_name, default=None): +def get_iface_id(if_name, xs_vif_uuid): if not if_name.startswith("vif"): - return default - - domain,device = if_name.strip("vif").split(".") + # Treat whatever was passed into 'xs_vif_uuid' as a default + # value for non-VIFs. + return xs_vif_uuid if not init_session(): s_log.warning("Failed to get interface id %s because" " XAPI session could not be initialized" % if_name) - return default - - for n in session.xenapi.VM.get_all(): - if session.xenapi.VM.get_domid(n) == domain: - vifs = session.xenapi.VM.get_VIFs(n) - for vif in vifs: - rec = session.xenapi.VIF.get_record(vif) - if rec['device'] == device: - return rec['other_config'].get('nicira-iface-id', default) - return None + return xs_vif_uuid + try: + vif = session.xenapi.VIF.get_by_uuid(xs_vif_uuid) + rec = session.xenapi.VIF.get_record(vif) + return rec['other_config'].get('nicira-iface-id', xs_vif_uuid) + except XenAPI.Failure: + s_log.warning("Could not find XAPI entry for VIF %s" % if_name) + return xs_vif_uuid def set_external_id(table, record, key, value): col = 'external-ids:"' + key + '"="' + value + '"' -- 2.30.2