Skip to content

Commit 87b319c

Browse files
committed
enable or disable snat
1 parent 6b5a22f commit 87b319c

2 files changed

Lines changed: 77 additions & 1 deletion

File tree

f5_openstack_agent/lbaasv2/drivers/bigip/resource_manager.py

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,28 @@ def _update_payload(self, old_listener, listener, service, **kwargs):
335335
if old_listener['default_pool_id'] != listener['default_pool_id']:
336336
payload['persist'] = create_payload['persist']
337337

338+
snat_enable_or_not = self._check_snat_changed(old_listener, listener)
339+
340+
LOG.debug('the create_payload:')
341+
LOG.debug(create_payload)
342+
if snat_enable_or_not == 'enable':
343+
LOG.debug('inside enable')
344+
payload['sourceAddressTranslation'] = {}
345+
if "sourceAddressTranslation" in create_payload and \
346+
create_payload['sourceAddressTranslation'].get('type'):
347+
payload['sourceAddressTranslation']['type'] = \
348+
create_payload['sourceAddressTranslation'].get('type')
349+
350+
if "sourceAddressTranslation" in create_payload and \
351+
create_payload['sourceAddressTranslation'].get('pool'):
352+
payload['sourceAddressTranslation']['pool'] = \
353+
create_payload['sourceAddressTranslation'].get('pool')
354+
elif snat_enable_or_not == 'disable':
355+
LOG.debug('inside disable')
356+
payload['sourceAddressTranslation'] = {}
357+
payload['sourceAddressTranslation']['type'] = None
358+
payload['sourceAddressTranslation']['pool'] = None
359+
338360
return super(ListenerManager, self)._update_payload(
339361
old_listener, listener, service,
340362
payload=payload, create_payload=create_payload
@@ -375,11 +397,46 @@ def _check_customized_changed(self, old_listener, listener):
375397
return True
376398
return False
377399

400+
def _check_snat_changed(self, old_listener, listener):
401+
if not old_listener:
402+
return ''
403+
404+
if 'customized' in listener and listener['customized']:
405+
try:
406+
new_customized_json = json.loads(listener['customized'])
407+
new_enable_snat = new_customized_json.get('enable_snat')
408+
except ValueError:
409+
LOG.error('Invalid json.')
410+
LOG.error('Due to the error, not handle snat at all.')
411+
return ''
412+
413+
# might want to modify and compare with old one
414+
# if 'customized' in old_listener and old_listener['customized']:
415+
# try:
416+
# old_customized_json = json.loads(old_listener['customized'])
417+
# old_enable_snat = old_customized_json.get('enable_snat')
418+
# except ValueError:
419+
# LOG.error('Invalid json.')
420+
# LOG.error('Due to the error, not handle snat at all.')
421+
422+
# might want to test agaist other cases as well, e.g '', str, etc
423+
if new_enable_snat == 'True':
424+
LOG.info('enable snat')
425+
return 'enable'
426+
elif new_enable_snat == 'False':
427+
LOG.info('disable snat')
428+
return 'disable'
429+
else:
430+
LOG.info('seems nothing at all')
431+
return ''
432+
378433
def _check_update_needed(self, payload, old_listener, listener):
379434
if not payload or len(payload.keys()) == 0:
380435
if self._check_customized_changed(old_listener, listener) \
381436
is False and \
382-
self._check_tls_changed(old_listener, listener) is False:
437+
self._check_tls_changed(old_listener, listener) is False and \
438+
not self._check_snat_changed(old_listener, listener):
439+
LOG.info('seems not needed to update')
383440
return False
384441
return True
385442

f5_openstack_agent/lbaasv2/drivers/bigip/service_adapter.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#
1616

1717
import ast
18+
import json
1819

1920
import hashlib
2021
import netaddr
@@ -116,6 +117,24 @@ def get_virtual(self, service):
116117

117118
listener["use_snat"] = self.snat_mode() and not listener.get(
118119
"transparent")
120+
121+
if 'customized' in listener and listener['customized']:
122+
enable_snat_arg = None
123+
try:
124+
cust = json.loads(listener['customized'])
125+
enable_snat_arg = cust.get('enable_snat')
126+
LOG.info(enable_snat_arg)
127+
except ValueError:
128+
LOG.error("Skipped. Invalid json: %s", listener['customized'])
129+
130+
# better to do more checks agaist value, 0,1,true,false,str,etc
131+
if enable_snat_arg == 'True':
132+
listener["use_snat"] = True
133+
elif enable_snat_arg == 'False':
134+
listener["use_snat"] = False
135+
else:
136+
LOG.debug('nothing, skip.')
137+
119138
if listener["use_snat"] and self.snat_count() > 0:
120139
listener["snat_pool_name"] = self.get_folder_name(
121140
loadbalancer["tenant_id"])

0 commit comments

Comments
 (0)