diff --git a/src/sonic-host-services/scripts/determine-reboot-cause b/src/sonic-host-services/scripts/determine-reboot-cause index 8f1ee0a39b5d..ac304a06a027 100755 --- a/src/sonic-host-services/scripts/determine-reboot-cause +++ b/src/sonic-host-services/scripts/determine-reboot-cause @@ -127,7 +127,15 @@ def find_hardware_reboot_cause(): def get_reboot_cause_dict(previous_reboot_cause, comment, gen_time): - # resultant dictionary + """Store the key infomation of device reboot into a dictionary by parsing the string in + previous_reboot_cause. + + If user issused a command to reboot device, then user, command and time will be + stored into a dictionary. + + If device was rebooted due to the kernel panic, then the string `Kernel Panic` + and time will be stored into a dictionary. + """ reboot_cause_dict = {} reboot_cause_dict['gen_time'] = gen_time reboot_cause_dict['cause'] = previous_reboot_cause @@ -142,7 +150,12 @@ def get_reboot_cause_dict(previous_reboot_cause, comment, gen_time): reboot_cause_dict['cause'] = match.group(1) reboot_cause_dict['user'] = match.group(2) reboot_cause_dict['time'] = match.group(3) - + elif re.search(r'Kernel Panic', previous_reboot_cause): + match = re.search(r'Kernel Panic \[Time: (.*)\]', previous_reboot_cause) + if match is not None: + reboot_cause_dict['cause'] = "Kernel Panic" + reboot_cause_dict['time'] = match.group(1) + return reboot_cause_dict diff --git a/src/sonic-host-services/tests/determine-reboot-cause_test.py b/src/sonic-host-services/tests/determine-reboot-cause_test.py index 381313ba97f5..4eb95ee219ee 100644 --- a/src/sonic-host-services/tests/determine-reboot-cause_test.py +++ b/src/sonic-host-services/tests/determine-reboot-cause_test.py @@ -55,6 +55,9 @@ GEN_TIME_WATCHDOG = "2020_10_22_03_15_08" REBOOT_CAUSE_USER = "User issued 'reboot' command [User: admin, Time: Thu Oct 22 03:11:08 UTC 2020]" GEN_TIME_USER = "2020_10_22_03_14_07" +REBOOT_CAUSE_KERNEL_PANIC = "Kernel Panic [Time: Sun Mar 28 13:45:12 UTC 2021]" +GEN_TIME_KERNEL_PANIC = "2021_3_28_13_48_49" + EXPECTED_PARSE_WARMFAST_REBOOT_FROM_PROC_CMDLINE = "warm-reboot" EXPECTED_FIND_SOFTWARE_REBOOT_CAUSE_USER = "User issued 'warm-reboot' command [User: admin, Time: Mon Nov 2 22:37:45 UTC 2020]" @@ -64,6 +67,7 @@ EXPECTED_WATCHDOG_REBOOT_CAUSE_DICT = {'comment': '', 'gen_time': '2020_10_22_03_15_08', 'cause': 'Watchdog', 'user': 'N/A', 'time': 'N/A'} EXPECTED_USER_REBOOT_CAUSE_DICT = {'comment': '', 'gen_time': '2020_10_22_03_14_07', 'cause': 'reboot', 'user': 'admin', 'time': 'Thu Oct 22 03:11:08 UTC 2020'} +EXPECTED_KERNEL_PANIC_REBOOT_CAUSE_DICT = {'comment': '', 'gen_time': '2021_3_28_13_48_49', 'cause': 'Kernel Panic', 'user': 'N/A', 'time': 'Sun Mar 28 13:45:12 UTC 2021'} class TestDetermineRebootCause(object): @@ -114,3 +118,7 @@ def test_get_reboot_cause_dict_watchdog(self): def test_get_reboot_cause_dict_user(self): reboot_cause_dict = determine_reboot_cause.get_reboot_cause_dict(REBOOT_CAUSE_USER, "", GEN_TIME_USER) assert reboot_cause_dict == EXPECTED_USER_REBOOT_CAUSE_DICT + + def test_get_reboot_cause_dict_kernel_panic(self): + reboot_cause_dict = determine_reboot_cause.get_reboot_cause_dict(REBOOT_CAUSE_KERNEL_PANIC, "", GEN_TIME_KERNEL_PANIC) + assert reboot_cause_dict == EXPECTED_KERNEL_PANIC_REBOOT_CAUSE_DICT