This is due to nova violating the libvirt XML contract for virDomainDetachDevice.
You are required to provide the full <interface> XML as currently shown in the *live* guest XML.
Nova doesn't do this, instead it builds new minimal <interface> XML from scatch. Thus nova is missing the PCI device information that libvirt would use to uniquely identify devices.
This is due to nova violating the libvirt XML contract for virDomainDetach Device.
You are required to provide the full <interface> XML as currently shown in the *live* guest XML.
Nova doesn't do this, instead it builds new minimal <interface> XML from scatch. Thus nova is missing the PCI device information that libvirt would use to uniquely identify devices.