To expand on comment 2, I'm wondering if you're just issuing the delete request which is a cast to the compute and asynchronous and before the vifs are deleted from the nova db you're already trying to boot a new instance with the port, and that's why you hit the unique constraint.
Ideally what you should be doing is deleting the instance and polling the port.device_id to be unbound, that's what the tempest test "test_reassign_port_between_servers" does.
To expand on comment 2, I'm wondering if you're just issuing the delete request which is a cast to the compute and asynchronous and before the vifs are deleted from the nova db you're already trying to boot a new instance with the port, and that's why you hit the unique constraint.
Ideally what you should be doing is deleting the instance and polling the port.device_id to be unbound, that's what the tempest test "test_reassign_ port_between_ servers" does.