Methods _create_ha_network, add_ha_port don't have wrapping
transaction in them, so they are prone to race conditions.
This commit adds a transaction to them. To avoid problem with
rolling back outmost transaction during exception handling,
internal methods have been wrapped in nested transaction.
Nested transaction is required in places like this:
def create():
create_something()
try:
_do_other_thing()
except Exception:
with excutils.save_and_reraise_exception():
delete_something()
def _do_other_thing():
with context.session.begin(subtransactions=True):
....
When exception is raised in _do_other_thing it
is caught in except block, but the object cannot be deleted in
except section because internal transaction has been rolled back.
A new method safe_creation and has been added
that provides a common way of handling such situations.
Closes-bug: #1501686
Change-Id: I952f6f7f8684743aa7f829bd92b1dc41b2c6aecf
(cherry picked from commit 924f19e8f1)