Skip to content

Commit bafebf9

Browse files
trzhang-msftyxieca
authored andcommitted
Update neighbor advertiser (sonic-net#498)
* update * update * address comments * address comments * add import sys * handle request timeout
1 parent fa90083 commit bafebf9

1 file changed

Lines changed: 37 additions & 13 deletions

File tree

scripts/neighbor_advertiser

Lines changed: 37 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99

1010
import os
11+
import sys
1112
import json
1213
import requests
1314
import argparse
@@ -23,6 +24,7 @@ from swsssdk import SonicV2Connector
2324
#
2425

2526
DEFAULT_DURATION = 300
27+
DEFAULT_REQUEST_TIMEOUT = 2
2628
SYSLOG_IDENTIFIER = 'neighbor_advertiser'
2729

2830

@@ -242,18 +244,24 @@ def post_neighbor_advertiser_slice(ferret_service_vip):
242244
save_as_json(request_slice, NEIGHBOR_ADVERTISER_REQUEST_SLICE_PATH)
243245

244246
url = 'http://{}:85{}{}'.format(ferret_service_vip, FERRET_NEIGHBOR_ADVERTISER_API_PREFIX, get_switch_name())
245-
response = requests.post(url, json = request_slice)
246-
247-
ferret_server_ipv4_addr = ''
247+
response = None
248248

249-
if response.ok:
249+
try:
250+
response = requests.post(url, json = request_slice, timeout = DEFAULT_REQUEST_TIMEOUT)
251+
except Exception as e:
252+
log_error('The request failed, vip: {}, error: {}'.format(ferret_service_vip, e))
253+
254+
ferret_server_ipv4_addr = None
255+
256+
if response and response.ok:
250257
neighbor_advertiser_configuration = json.loads(response.content)
251258
save_as_json(neighbor_advertiser_configuration, NEIGHBOR_ADVERTISER_RESPONSE_CONFIG_PATH)
252259
ferret_server_ipv4_addr = neighbor_advertiser_configuration['ipv4Addr']
253-
log_info('Successfully set up neighbor advertiser slice')
260+
log_info('Successfully set up neighbor advertiser slice, vip: {}, dip: {}'.format(ferret_service_vip, ferret_server_ipv4_addr))
261+
elif response:
262+
log_error('Failed to set up neighbor advertiser slice, vip: {}, error_code: {}, error_content: {}'.format(ferret_service_vip, response.status_code, response.content))
254263
else:
255-
log_error('Failed to set up neighbor advertiser slice, error_code: {}'.format(response.status_code))
256-
response.raise_for_status()
264+
log_error('Failed to set up neighbor advertiser slice, vip: {}, no response obtained'.format(ferret_service_vip))
257265

258266
return ferret_server_ipv4_addr
259267

@@ -383,30 +391,46 @@ def reset_vxlan_tunnel():
383391

384392
def main():
385393
parser = argparse.ArgumentParser()
386-
parser.add_argument('-s', dest='vip', metavar='vip', type = str, required = True, help = 'ferret service vip')
394+
parser.add_argument('-s', dest='vips', metavar='vips', type = str, required = False, help = 'ferret service vip list, required in set mode')
387395
parser.add_argument('-m', dest='mode', metavar='mode (set, reset)', type = str, required = True, choices=['set', 'reset'], help = 'operation mode')
388396
args = parser.parse_args()
389397

390-
ferret_service_vip = args.vip
398+
ferret_service_vips = args.vips
391399
operation_mode = args.mode
392400

401+
if operation_mode == 'set' and ferret_service_vips == None:
402+
log_warning('ferret service vip is required in set mode')
403+
sys.exit(1)
404+
393405
connect_config_db()
394406

395407
if operation_mode == 'set':
396-
ferret_server_ip = post_neighbor_advertiser_slice(ferret_service_vip)
397-
set_vxlan_tunnel(ferret_server_ip)
398-
set_mirror_tunnel(ferret_server_ip)
408+
set_success = False
409+
410+
for ferret_service_vip in ferret_service_vips.split(','):
411+
ferret_server_ip = post_neighbor_advertiser_slice(ferret_service_vip)
412+
413+
if ferret_server_ip:
414+
set_vxlan_tunnel(ferret_server_ip)
415+
set_mirror_tunnel(ferret_server_ip)
416+
set_success = True
417+
break
418+
419+
if not set_success:
420+
log_error('Failed to set up neighbor advertiser slice, tried all vips in {}'.format(ferret_service_vips))
421+
sys.exit(1)
399422

400423
if operation_mode == 'reset':
401424
reset_mirror_tunnel()
402425
reset_vxlan_tunnel()
403426

404-
return true
427+
sys.exit(0)
405428

406429

407430
if __name__ == '__main__':
408431
try:
409432
main()
410433
except Exception as e:
411434
log_error('! [Failure] {} {}'.format(e, traceback.format_exc()))
435+
sys.exit(1)
412436

0 commit comments

Comments
 (0)