27
27
SONIC_CFGGEN_PATH = '/usr/local/bin/sonic-cfggen'
28
28
SYSLOG_IDENTIFIER = "config"
29
29
VLAN_SUB_INTERFACE_SEPARATOR = '.'
30
+ ASIC_CONF_FILENAME = 'asic.conf'
30
31
31
32
INIT_CFG_FILE = '/etc/sonic/init_cfg.json'
32
33
34
+ SYSTEMCTL_ACTION_STOP = "stop"
35
+ SYSTEMCTL_ACTION_RESTART = "restart"
36
+ SYSTEMCTL_ACTION_RESET_FAILED = "reset-failed"
37
+
33
38
# ========================== Syslog wrappers ==========================
34
39
35
40
def log_debug (msg ):
@@ -69,6 +74,31 @@ def log_error(msg):
69
74
# Helper functions
70
75
#
71
76
77
+ # Execute action on list of systemd services
78
+ def execute_systemctl (list_of_services , action ):
79
+ num_asic = _get_num_asic ()
80
+ generated_services_list , generated_multi_instance_services = _get_sonic_generated_services (num_asic )
81
+ if ((generated_services_list == []) and
82
+ (generated_multi_instance_services == [])):
83
+ log_error ("Failed to get generated services" )
84
+ return
85
+
86
+ for service in list_of_services :
87
+ if (service + '.service' in generated_services_list ):
88
+ try :
89
+ click .echo ("Executing {} of service {}..." .format (action , service ))
90
+ run_command ("systemctl {} {}" .format (action , service ))
91
+ except SystemExit as e :
92
+ log_error ("Failed to execute {} of service {} with error {}" .format (action , service , e ))
93
+ raise
94
+ if (service + '.service' in generated_multi_instance_services ):
95
+ for inst in range (num_asic ):
96
+ try :
97
+ click .echo ("Executing {} of service {}@{}..." .format (action , service , inst ))
98
+ run_command ("systemctl {} {}@{}.service" .format (action , service , inst ))
99
+ except SystemExit as e :
100
+ log_error ("Failed to execute {} of service {}@{} with error {}" .format (action , service , inst , e ))
101
+ raise
72
102
73
103
def run_command (command , display_cmd = False , ignore_error = False ):
74
104
"""Run bash command and print output to stdout
@@ -395,14 +425,34 @@ def _get_platform():
395
425
return tokens [1 ].strip ()
396
426
return ''
397
427
398
- def _get_sonic_generated_services ():
428
+ def _get_num_asic ():
429
+ platform = _get_platform ()
430
+ num_asic = 1
431
+ asic_conf_file = os .path .join ('/usr/share/sonic/device/' , platform , ASIC_CONF_FILENAME )
432
+ if os .path .isfile (asic_conf_file ):
433
+ with open (asic_conf_file ) as conf_file :
434
+ for line in conf_file :
435
+ line_info = line .split ('=' )
436
+ if line_info [0 ].lower () == "num_asic" :
437
+ num_asic = int (line_info [1 ])
438
+ return num_asic
439
+
440
+ def _get_sonic_generated_services (num_asic ):
399
441
if not os .path .isfile (SONIC_GENERATED_SERVICE_PATH ):
400
442
return None
401
443
generated_services_list = []
444
+ generated_multi_instance_services = []
402
445
with open (SONIC_GENERATED_SERVICE_PATH ) as generated_service_file :
403
446
for line in generated_service_file :
404
- generated_services_list .append (line .rstrip ('\n ' ))
405
- return None if not generated_services_list else generated_services_list
447
+ if '@' in line :
448
+ line = line .replace ('@' , '' )
449
+ if num_asic > 1 :
450
+ generated_multi_instance_services .append (line .rstrip ('\n ' ))
451
+ else :
452
+ generated_services_list .append (line .rstrip ('\n ' ))
453
+ else :
454
+ generated_services_list .append (line .rstrip ('\n ' ))
455
+ return generated_services_list , generated_multi_instance_services
406
456
407
457
# Callback for confirmation prompt. Aborts if user enters "n"
408
458
def _abort_if_false (ctx , param , value ):
@@ -419,25 +469,11 @@ def _stop_services():
419
469
'hostcfgd' ,
420
470
'nat'
421
471
]
422
- generated_services_list = _get_sonic_generated_services ()
423
-
424
- if generated_services_list is None :
425
- log_error ("Failed to get generated services" )
426
- return
427
472
428
473
if asic_type == 'mellanox' and 'pmon' in services_to_stop :
429
474
services_to_stop .remove ('pmon' )
430
475
431
- for service in services_to_stop :
432
- if service + '.service' not in generated_services_list :
433
- continue
434
- try :
435
- click .echo ("Stopping service {} ..." .format (service ))
436
- run_command ("systemctl stop {}" .format (service ))
437
-
438
- except SystemExit as e :
439
- log_error ("Stopping {} failed with error {}" .format (service , e ))
440
- raise
476
+ execute_systemctl (services_to_stop , SYSTEMCTL_ACTION_STOP )
441
477
442
478
def _reset_failed_services ():
443
479
services_to_reset = [
@@ -458,22 +494,9 @@ def _reset_failed_services():
458
494
'nat' ,
459
495
'sflow'
460
496
]
497
+ execute_systemctl (services_to_reset , SYSTEMCTL_ACTION_RESET_FAILED )
461
498
462
- generated_services_list = _get_sonic_generated_services ()
463
499
464
- if generated_services_list is None :
465
- log_error ("Failed to get generated services" )
466
- return
467
-
468
- for service in services_to_reset :
469
- if service + '.service' not in generated_services_list :
470
- continue
471
- try :
472
- click .echo ("Resetting failed status for service {} ..." .format (service ))
473
- run_command ("systemctl reset-failed {}" .format (service ))
474
- except SystemExit as e :
475
- log_error ("Failed to reset failed status for service {}" .format (service ))
476
- raise
477
500
478
501
def _restart_services ():
479
502
# on Mellanox platform pmon is started by syncd
@@ -490,24 +513,12 @@ def _restart_services():
490
513
'nat' ,
491
514
'sflow' ,
492
515
]
493
- generated_services_list = _get_sonic_generated_services ()
494
-
495
- if generated_services_list is None :
496
- log_error ("Failed to get generated services" )
497
- return
498
516
499
517
if asic_type == 'mellanox' and 'pmon' in services_to_restart :
500
518
services_to_restart .remove ('pmon' )
501
519
502
- for service in services_to_restart :
503
- if service + '.service' not in generated_services_list :
504
- continue
505
- try :
506
- click .echo ("Restarting service {} ..." .format (service ))
507
- run_command ("systemctl restart {}" .format (service ))
508
- except SystemExit as e :
509
- log_error ("Restart {} failed with error {}" .format (service , e ))
510
- raise
520
+ execute_systemctl (services_to_restart , SYSTEMCTL_ACTION_RESTART )
521
+
511
522
512
523
def is_ipaddress (val ):
513
524
""" Validate if an entry is a valid IP """
0 commit comments