From 98d29b77003d4c4058b81373a41db778a8c19d8a Mon Sep 17 00:00:00 2001 From: Ryan Rossiter Date: Mon, 29 Jun 2015 13:19:07 +0000 Subject: [PATCH] Set vif and allocated when associating fixed ip Follow on to changes I84fa2f0926f719bff33ac43b39e161a4eb412f44 and I8cf5483982085da57ee470fa2753b0d0aebc12b3. This change removes a race when associating fixed IPs and pools. Originally, the fixed IPs were associated, and "virtual_interface_id" was updated and saved to the DB at a later time. This value is now sent into associate(_pool) and are tunneled down to the DB on associate, so now the value is saved to the DB at association. Change-Id: Ic37d96deba3a5ef51594733cc16091173a9655a4 Closes-Bug: #1249065 --- nova/db/api.py | 9 +++++---- nova/db/sqlalchemy/api.py | 13 +++++++++---- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/nova/db/api.py b/nova/db/api.py index 30d1f7945..d00aa1e0e 100644 --- a/nova/db/api.py +++ b/nova/db/api.py @@ -488,25 +488,26 @@ def migration_get_all_by_filters(context, filters): def fixed_ip_associate(context, address, instance_uuid, network_id=None, - reserved=False): + reserved=False, virtual_interface_id=None): """Associate fixed ip to instance. Raises if fixed ip is not available. """ return IMPL.fixed_ip_associate(context, address, instance_uuid, network_id, - reserved) + reserved, virtual_interface_id) def fixed_ip_associate_pool(context, network_id, instance_uuid=None, - host=None): + host=None, virtual_interface_id=None): """Find free ip in network and associate it to instance or host. Raises if one is not available. """ return IMPL.fixed_ip_associate_pool(context, network_id, - instance_uuid, host) + instance_uuid, host, + virtual_interface_id) def fixed_ip_create(context, values): diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py index 8fccc2894..9bb81b2e8 100644 --- a/nova/db/sqlalchemy/api.py +++ b/nova/db/sqlalchemy/api.py @@ -1085,7 +1085,7 @@ def dnsdomain_get_all(context): @oslo_db_api.wrap_db_retry(max_retries=5, retry_on_deadlock=True, retry_on_request=True) def fixed_ip_associate(context, address, instance_uuid, network_id=None, - reserved=False): + reserved=False, virtual_interface_id=None): """Keyword arguments: reserved -- should be a boolean value(True or False), exact value will be used to filter on the fixed ip address @@ -1111,9 +1111,12 @@ def fixed_ip_associate(context, address, instance_uuid, network_id=None, raise exception.FixedIpAlreadyInUse(address=address, instance_uuid=instance_uuid) - params = {'instance_uuid': instance_uuid} + params = {'instance_uuid': instance_uuid, + 'allocated': virtual_interface_id is not None} if not fixed_ip_ref.network_id: params['network_id'] = network_id + if virtual_interface_id: + params['virtual_interface_id'] = virtual_interface_id rows_updated = model_query(context, models.FixedIp, session=session, read_deleted="no").\ @@ -1135,7 +1138,7 @@ def fixed_ip_associate(context, address, instance_uuid, network_id=None, @oslo_db_api.wrap_db_retry(max_retries=5, retry_on_deadlock=True, retry_on_request=True) def fixed_ip_associate_pool(context, network_id, instance_uuid=None, - host=None): + host=None, virtual_interface_id=None): if instance_uuid and not uuidutils.is_uuid_like(instance_uuid): raise exception.InvalidUUID(uuid=instance_uuid) @@ -1154,13 +1157,15 @@ def fixed_ip_associate_pool(context, network_id, instance_uuid=None, if not fixed_ip_ref: raise exception.NoMoreFixedIps(net=network_id) - params = {} + params = {'allocated': virtual_interface_id is not None} if fixed_ip_ref['network_id'] is None: params['network_id'] = network_id if instance_uuid: params['instance_uuid'] = instance_uuid if host: params['host'] = host + if virtual_interface_id: + params['virtual_interface_id'] = virtual_interface_id rows_updated = model_query(context, models.FixedIp, session=session, read_deleted="no").\