Skip to content

Commit e227d1a

Browse files
Merge pull request #2094 from zhaoqin-github/vlan-9.10.5
[OPENSTACK-2867] Fix creating vlan racing problem (9.10.5)
2 parents 1db18d9 + 4721eb1 commit e227d1a

4 files changed

Lines changed: 29 additions & 17 deletions

File tree

docs/RELEASE-NOTES.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ Bug Fixes
2020
* [OPENSTACK-2847] Retry 401 when initialize bigip connection
2121
* [OPENSTACK-2847] Retry 401 when cleanup partition
2222
* [OPENSTACK-2859] Ignore icontrol 409 by default when creating resource
23+
* [OPENSTACK-2867] Fix creating route domain racing problem
24+
* [OPENSTACK-2867] Needn't to detach redirect policy after removing vs
25+
* [OPENSTACK-2867] Fix creating vlan racing problem
2326

2427
Limitations
2528
```````````

f5_openstack_agent/lbaasv2/drivers/bigip/network_helper.py

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -308,14 +308,15 @@ def create_route_domain(self, bigip, rd_id, name,
308308
name += '_aux_' + str(rd_id)
309309
payload = NetworkHelper.route_domain_defaults
310310
payload['name'] = name
311-
payload['partition'] = '/' + partition
311+
payload['partition'] = partition
312312
payload['id'] = rd_id
313313

314314
if strictness:
315315
payload['strict'] = 'enabled'
316316
else:
317317
payload['parent'] = '/' + const.DEFAULT_PARTITION + '/0'
318-
return rd.create(bigip, payload)
318+
319+
rd.create(bigip, payload)
319320

320321
@log_helpers.log_method_call
321322
def delete_route_domain(self, bigip, partition=const.DEFAULT_PARTITION,
@@ -440,16 +441,24 @@ def create_vlan(self, bigip, model):
440441
if not name:
441442
return None
442443
v = Vlan()
443-
if v.exists(bigip, name=name, partition=partition):
444-
obj = v.load(bigip, name=name, partition=partition)
445-
else:
446-
payload = {'name': name,
447-
'partition': partition,
448-
'tag': tag}
449444

450-
if description:
451-
payload['description'] = description
452-
obj = v.create(bigip, payload)
445+
payload = {'name': name,
446+
'partition': partition,
447+
'tag': tag}
448+
449+
if description:
450+
payload['description'] = description
451+
452+
vlan_exists = False
453+
try:
454+
obj = v.create(bigip, payload, ignore=[])
455+
except HTTPError as ex:
456+
if ex.response.status_code == 409:
457+
vlan_exists = True
458+
else:
459+
raise
460+
461+
if not vlan_exists:
453462
interface = model.get('interface', None)
454463
if interface:
455464
payload = {'name': interface}
@@ -469,7 +478,6 @@ def create_vlan(self, bigip, model):
469478
if not partition == const.DEFAULT_PARTITION:
470479
self.add_vlan_to_domain_by_id(bigip, name, partition,
471480
route_domain_id)
472-
return obj
473481

474482
@log_helpers.log_method_call
475483
def delete_vlan(

f5_openstack_agent/lbaasv2/drivers/bigip/resource.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ class BigIPResource(object):
2828
def __init__(self, **kwargs):
2929
pass
3030

31-
def create(self, bigip, model):
32-
return self.helper.create(bigip, model)
31+
def create(self, bigip, model, overwrite=False, ignore=[409]):
32+
return self.helper.create(bigip, model, overwrite, ignore)
3333

3434
def exists(self, bigip, name=None, partition=None):
3535
return self.helper.exists(bigip, name=name, partition=partition)

f5_openstack_agent/lbaasv2/drivers/bigip/resource_manager.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1279,13 +1279,14 @@ def _update_redirect_policy(self, bigip, vs, old_listener, listener):
12791279
if old_proto != new_proto or old_port != new_port:
12801280
self._create_redirect_policy(bigip, vs, listener)
12811281

1282-
def _delete_redirect_policy(self, bigip, vs):
1282+
def _delete_redirect_policy(self, bigip, vs, detach=True):
12831283
policy = LTMPolicyRedirect(
12841284
bigip=bigip,
12851285
partition=vs['partition'],
12861286
vs_name=vs['name']
12871287
)
1288-
policy.detach_from_vs()
1288+
if detach:
1289+
policy.detach_from_vs()
12891290
policy.delete()
12901291

12911292
def _get_tcp_options(self, ip_version):
@@ -1484,7 +1485,7 @@ def _delete(self, bigip, vs, listener, service):
14841485
self._delete_persist_profile(bigip, vs)
14851486
self._delete_ssl_profiles(bigip, vs, service)
14861487
self._delete_extended_profiles(bigip, listener, vs)
1487-
self._delete_redirect_policy(bigip, vs)
1488+
self._delete_redirect_policy(bigip, vs, detach=False)
14881489
ftp_enable = self.ftp_helper.enable_ftp(service)
14891490
if ftp_enable:
14901491
self.ftp_helper.remove_profile(service, vs, bigip)

0 commit comments

Comments
 (0)