+ new_bridges = {}
+ for row in idl.tables["Bridge"].rows.itervalues():
+ bridge_id = bridges.get(row.name)
+ if bridge_id is None:
+ # Configure the new bridge.
+ update_fail_mode(row)
+ update_in_band_mgmt(row)
+
+ # Get the correct bridge_id, if we can.
+ bridge_id = get_bridge_id(row.name)
+ if bridge_id is None:
+ xs_network_uuids = row.external_ids.get("xs-network-uuids")
+ if xs_network_uuids:
+ bridge_ids = xs_network_uuids.split(";")
+ if len(bridge_ids) == 1:
+ bridge_id = bridge_ids[0]
+ else:
+ bridge_id = get_single_bridge_id(bridge_ids,
+ row.name)
+ set_external_id(row, "bridge-id", bridge_id)
+
+ if bridge_id is not None:
+ new_bridges[row.name] = bridge_id
+ bridges = new_bridges
+
+ iface_by_name = {}
+ for row in idl.tables["Interface"].rows.itervalues():
+ iface_by_name[row.name] = row
+
+ new_iface_ids = {}
+ new_vm_ids = {}
+ for row in idl.tables["Interface"].rows.itervalues():
+ # Match up paired vif and tap devices.
+ if row.name.startswith("vif"):
+ vif = row
+ tap = iface_by_name.get("tap%s" % row.name[3:])
+ elif row.name.startswith("tap"):
+ tap = row
+ vif = iface_by_name.get("vif%s" % row.name[3:])
+ else:
+ tap = vif = None
+
+ # Several tap external-ids need to be copied from the vif.
+ if row == tap and vif:
+ keys = ["attached-mac",
+ "xs-network-uuid",
+ "xs-vif-uuid",
+ "xs-vm-uuid"]
+ for k in keys:
+ set_external_id(row, k, vif.external_ids.get(k))
+
+ # Map from xs-vif-uuid to iface-id.
+ #
+ # (A tap's xs-vif-uuid comes from its vif. That falls out
+ # naturally from the copy loop above.)
+ xvu = row.external_ids.get("xs-vif-uuid")
+ if xvu:
+ iface_id = (new_iface_ids.get(xvu)
+ or iface_ids.get(xvu)
+ or get_iface_id(row.name, xvu))
+ new_iface_ids[xvu] = iface_id
+ else:
+ # No xs-vif-uuid therefore no iface-id.
+ iface_id = None
+ set_external_id(row, "iface-id", iface_id)
+
+ # Map from xs-vm-uuid to vm-id.
+ xvmu = row.external_ids.get("xs-vm-uuid")
+ if xvmu:
+ vm_id = (new_vm_ids.get(xvmu)
+ or vm_ids.get(xvmu)
+ or get_vm_id(row.name, xvmu))
+ new_vm_ids[xvmu] = vm_id
+ else:
+ vm_id = None
+ set_external_id(row, "vm-id", vm_id)
+
+ # When there's a vif and a tap, the tap is active (used for
+ # traffic). When there's just a vif, the vif is active.
+ #
+ # A tap on its own shouldn't happen, and we don't know
+ # anything about other kinds of devices, so we don't use
+ # an iface-status for those devices at all.
+ if vif and tap:
+ set_external_id(tap, "iface-status", "active")
+ set_external_id(vif, "iface-status", "inactive")
+ elif vif:
+ set_external_id(vif, "iface-status", "active")
+ else:
+ set_external_id(row, "iface-status", None)
+ iface_ids = new_iface_ids
+ vm_ids = new_vm_ids
+
+ txn.add_comment("ovs-xapi-sync: Updating records from XAPI")
+ txn.commit_block()
+
+ unixctl_server.close()
+ idl.close()