diff --git a/docs/RELEASE-NOTES.rst b/docs/RELEASE-NOTES.rst index b02c4d226..b01c229fe 100644 --- a/docs/RELEASE-NOTES.rst +++ b/docs/RELEASE-NOTES.rst @@ -20,6 +20,9 @@ Bug Fixes * [OPENSTACK-2847] Retry 401 when initialize bigip connection * [OPENSTACK-2847] Retry 401 when cleanup partition * [OPENSTACK-2859] Ignore icontrol 409 by default when creating resource +* [OPENSTACK-2867] Fix creating route domain racing problem +* [OPENSTACK-2867] Needn't to detach redirect policy after removing vs +* [OPENSTACK-2867] Fix creating vlan racing problem Limitations ``````````` diff --git a/f5_openstack_agent/lbaasv2/drivers/bigip/network_helper.py b/f5_openstack_agent/lbaasv2/drivers/bigip/network_helper.py index b1092ac22..2dd208903 100644 --- a/f5_openstack_agent/lbaasv2/drivers/bigip/network_helper.py +++ b/f5_openstack_agent/lbaasv2/drivers/bigip/network_helper.py @@ -308,14 +308,15 @@ def create_route_domain(self, bigip, rd_id, name, name += '_aux_' + str(rd_id) payload = NetworkHelper.route_domain_defaults payload['name'] = name - payload['partition'] = '/' + partition + payload['partition'] = partition payload['id'] = rd_id if strictness: payload['strict'] = 'enabled' else: payload['parent'] = '/' + const.DEFAULT_PARTITION + '/0' - return rd.create(bigip, payload) + + rd.create(bigip, payload) @log_helpers.log_method_call def delete_route_domain(self, bigip, partition=const.DEFAULT_PARTITION, @@ -440,16 +441,24 @@ def create_vlan(self, bigip, model): if not name: return None v = Vlan() - if v.exists(bigip, name=name, partition=partition): - obj = v.load(bigip, name=name, partition=partition) - else: - payload = {'name': name, - 'partition': partition, - 'tag': tag} - if description: - payload['description'] = description - obj = v.create(bigip, payload) + payload = {'name': name, + 'partition': partition, + 'tag': tag} + + if description: + payload['description'] = description + + vlan_exists = False + try: + obj = v.create(bigip, payload, ignore=[]) + except HTTPError as ex: + if ex.response.status_code == 409: + vlan_exists = True + else: + raise + + if not vlan_exists: interface = model.get('interface', None) if interface: payload = {'name': interface} @@ -469,7 +478,6 @@ def create_vlan(self, bigip, model): if not partition == const.DEFAULT_PARTITION: self.add_vlan_to_domain_by_id(bigip, name, partition, route_domain_id) - return obj @log_helpers.log_method_call def delete_vlan( diff --git a/f5_openstack_agent/lbaasv2/drivers/bigip/resource.py b/f5_openstack_agent/lbaasv2/drivers/bigip/resource.py index 9020cab08..340f131a8 100644 --- a/f5_openstack_agent/lbaasv2/drivers/bigip/resource.py +++ b/f5_openstack_agent/lbaasv2/drivers/bigip/resource.py @@ -28,8 +28,8 @@ class BigIPResource(object): def __init__(self, **kwargs): pass - def create(self, bigip, model): - return self.helper.create(bigip, model) + def create(self, bigip, model, overwrite=False, ignore=[409]): + return self.helper.create(bigip, model, overwrite, ignore) def exists(self, bigip, name=None, partition=None): return self.helper.exists(bigip, name=name, partition=partition) diff --git a/f5_openstack_agent/lbaasv2/drivers/bigip/resource_manager.py b/f5_openstack_agent/lbaasv2/drivers/bigip/resource_manager.py index bd67348f5..e1b0ec176 100644 --- a/f5_openstack_agent/lbaasv2/drivers/bigip/resource_manager.py +++ b/f5_openstack_agent/lbaasv2/drivers/bigip/resource_manager.py @@ -1279,13 +1279,14 @@ def _update_redirect_policy(self, bigip, vs, old_listener, listener): if old_proto != new_proto or old_port != new_port: self._create_redirect_policy(bigip, vs, listener) - def _delete_redirect_policy(self, bigip, vs): + def _delete_redirect_policy(self, bigip, vs, detach=True): policy = LTMPolicyRedirect( bigip=bigip, partition=vs['partition'], vs_name=vs['name'] ) - policy.detach_from_vs() + if detach: + policy.detach_from_vs() policy.delete() def _get_tcp_options(self, ip_version): @@ -1484,7 +1485,7 @@ def _delete(self, bigip, vs, listener, service): self._delete_persist_profile(bigip, vs) self._delete_ssl_profiles(bigip, vs, service) self._delete_extended_profiles(bigip, listener, vs) - self._delete_redirect_policy(bigip, vs) + self._delete_redirect_policy(bigip, vs, detach=False) ftp_enable = self.ftp_helper.enable_ftp(service) if ftp_enable: self.ftp_helper.remove_profile(service, vs, bigip)