I haven't gotten a chance to look into it too much, but apparently if you create 2 Server objects with the same id in the same Jupyter block (may apply to regular python scope as well), calling associate_floating_ip will result in a 400 error (bad request). This bug lead some users to believe their Server objects had floating IPs already associated and the bad requests were a result of trying to associate a floating with a Server that already has one, even though associate_floating_ip should be a noop if this happens.
Apparently, users can work around the bug by calling dissociate_floating_ip before calling associate_floating_ip.