The race is:
- while shelving vm, libvirt driver deletes vm vifs on original compute;
- ovs agent needs time to detect devices removal and to report update_device_down to neutron server;
- meanwhile the test respawns vm on new compute and asks neutron to update vm port's host;
- by the time neutron server receives update_device_down from ovs agent, vm port is already bound to another host;
- so neutron server skips port status update in this case - port stays in ACTIVE state;
- nova only waits for neutron events for non-ACTIVE ports;
I think the fix should be on nova side: wait for network-vif-unplugged when unplugging vifs. Neutron already sends such events when port status is changed form ACTIVE to DOWN.
The race is:
- while shelving vm, libvirt driver deletes vm vifs on original compute;
- ovs agent needs time to detect devices removal and to report update_device_down to neutron server;
- meanwhile the test respawns vm on new compute and asks neutron to update vm port's host;
- by the time neutron server receives update_device_down from ovs agent, vm port is already bound to another host;
- so neutron server skips port status update in this case - port stays in ACTIVE state;
- nova only waits for neutron events for non-ACTIVE ports;
I think the fix should be on nova side: wait for network- vif-unplugged when unplugging vifs. Neutron already sends such events when port status is changed form ACTIVE to DOWN.