As of #4559, the above 3 operations use a fetched FloatingIp/ExternalIp to provide user-friendly error messages based on the current state of parent_id, before firing an UPDATE query conditioned on the correct parent_id field.
While this is not incorrect, this will provide a less user-friendly error message in the event of concurrent modification. We should move these datastore methods into a transaction and/or transaction_retry_wrapper to clean this up.