Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
73 commits
Select commit Hold shift + click to select a range
a9a8800
fixed remote variable patch
muhammadalihussnain Apr 8, 2025
e9d98cd
fixed remote variable patch
muhammadalihussnain Apr 8, 2025
7671a03
covering coverage
muhammadalihussnain Apr 8, 2025
8fbc889
covering coverage
muhammadalihussnain Apr 8, 2025
3c3f08c
covering coverage
muhammadalihussnain Apr 8, 2025
ed763ae
covering coverage
muhammadalihussnain Apr 8, 2025
13106bb
covering coverage
muhammadalihussnain Apr 8, 2025
61ed07a
covering coverage
muhammadalihussnain Apr 8, 2025
7517c40
covering coverage
muhammadalihussnain Apr 8, 2025
2c12467
covering coverage
muhammadalihussnain Apr 8, 2025
26d1db9
covering coverage
muhammadalihussnain Apr 8, 2025
6f4422a
covering coverage
muhammadalihussnain Apr 8, 2025
cb68255
covering coverage
muhammadalihussnain Apr 8, 2025
5b45ff8
code coverage
muhammadalihussnain Apr 8, 2025
c9fba44
reverted unintended changes
muhammadalihussnain Apr 9, 2025
33a6b10
added test case
muhammadalihussnain Apr 9, 2025
049281b
added test case
muhammadalihussnain Apr 9, 2025
4510400
added test case
muhammadalihussnain Apr 9, 2025
6f9ff7d
added test case
muhammadalihussnain Apr 9, 2025
8e2e4cc
added test case
muhammadalihussnain Apr 9, 2025
41b8e8c
added test case
muhammadalihussnain Apr 9, 2025
2aabc2b
added test case
muhammadalihussnain Apr 9, 2025
493f958
added test case
muhammadalihussnain Apr 9, 2025
94f305a
added test case
muhammadalihussnain Apr 9, 2025
1811eaf
added test case
muhammadalihussnain Apr 9, 2025
9f4b5fc
added test case
muhammadalihussnain Apr 9, 2025
5fd1255
added test case
muhammadalihussnain Apr 9, 2025
fe38f53
code coverage
muhammadalihussnain Apr 9, 2025
86bc1ce
code coverage
muhammadalihussnain Apr 9, 2025
c5945e0
code coverage
muhammadalihussnain Apr 9, 2025
eb0fb92
code coverage
muhammadalihussnain Apr 9, 2025
b215ae6
code coverage
muhammadalihussnain Apr 9, 2025
0a2f98e
code coverage
muhammadalihussnain Apr 9, 2025
0d4c389
code coverage
muhammadalihussnain Apr 9, 2025
a999fe8
code cover
muhammadalihussnain Apr 9, 2025
c8de38b
code cover
muhammadalihussnain Apr 9, 2025
31f4b9f
code cover
muhammadalihussnain Apr 9, 2025
08b5ff1
code cover
muhammadalihussnain Apr 9, 2025
16b4b9c
code cover
muhammadalihussnain Apr 9, 2025
33bb0dd
code cover
muhammadalihussnain Apr 9, 2025
d996bbf
code cover
muhammadalihussnain Apr 9, 2025
19a0dde
coverage
muhammadalihussnain Apr 9, 2025
0a8a873
coverage
muhammadalihussnain Apr 9, 2025
ae98d8b
coverage
muhammadalihussnain Apr 10, 2025
523ce60
coverage
muhammadalihussnain Apr 10, 2025
535b346
cover
muhammadalihussnain Apr 10, 2025
be92dc6
cover
muhammadalihussnain Apr 10, 2025
ddb368b
cover
muhammadalihussnain Apr 10, 2025
b43e4fb
cover
muhammadalihussnain Apr 10, 2025
041ec66
cover
muhammadalihussnain Apr 10, 2025
173408f
cover
muhammadalihussnain Apr 10, 2025
421df2a
cover
muhammadalihussnain Apr 10, 2025
2bf29e4
cover
muhammadalihussnain Apr 10, 2025
8fc6be2
cover
muhammadalihussnain Apr 10, 2025
5301e38
coverage
muhammadalihussnain Apr 10, 2025
43f8f6f
coverage
muhammadalihussnain Apr 10, 2025
7f7de4c
coverage
muhammadalihussnain Apr 10, 2025
2f2049f
coverage
muhammadalihussnain Apr 10, 2025
c6338f7
coverage
muhammadalihussnain Apr 10, 2025
45bc7d1
coverage
muhammadalihussnain Apr 10, 2025
04dc9b0
coverage
muhammadalihussnain Apr 10, 2025
486eafd
coverage
muhammadalihussnain Apr 10, 2025
c3048b5
coverage
muhammadalihussnain Apr 10, 2025
47c494a
coverage
muhammadalihussnain Apr 10, 2025
4f574fe
coverage
muhammadalihussnain Apr 10, 2025
fad09b1
cover
muhammadalihussnain Apr 10, 2025
8359eed
cover
muhammadalihussnain Apr 10, 2025
dcfdb5d
cover
muhammadalihussnain Apr 10, 2025
c5bf74a
coverage
muhammadalihussnain Apr 11, 2025
c4fb126
coverage
muhammadalihussnain Apr 11, 2025
a08e5b8
coverage
muhammadalihussnain Apr 11, 2025
e159e84
fixed helping string
muhammadalihussnain Apr 14, 2025
4414864
fixed helping string
muhammadalihussnain Apr 14, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 22 additions & 18 deletions scripts/sonic-kdump-config
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,22 @@ def cmd_dump_db():
else:
print("empty")

def get_kdump_remote():
"""Get the value of the remote feature from the KDUMP configuration."""
config_db = ConfigDBConnector(use_unix_socket_path=True)
if config_db is not None:
config_db.connect()
table_data = config_db.get_table('KDUMP')
if table_data is not None:
config_data = table_data.get('config')
if config_data is not None:
remote_value = config_data.get('remote')
if remote_value is not None:
# Return True if the remote value is 'true', otherwise False
return remote_value.lower() == 'true' # Explicitly return boolean

return False # Default return value if no remote setting is found

def cmd_dump_config_json():
kdump_enabled = get_kdump_administrative_mode()
kdump_memory = get_kdump_memory()
Expand Down Expand Up @@ -320,22 +336,6 @@ def get_kdump_num_dumps():
num_dumps = num
return num_dumps

def get_kdump_remote():
"""Get the value of the remote feature from the KDUMP configuration."""
config_db = ConfigDBConnector(use_unix_socket_path=True)
if config_db is not None:
config_db.connect()
table_data = config_db.get_table('KDUMP')
if table_data is not None:
config_data = table_data.get('config')
if config_data is not None:
remote_value = config_data.get('remote')
if remote_value is not None:
# Return True if the remote value is 'true', otherwise False
return remote_value.lower() == 'true' # Explicitly return boolean

return False # Default return value if no remote setting is found

def get_kdump_ssh_string():
"""Get the SSH string from the KDUMP configuration."""
config_db = ConfigDBConnector(use_unix_socket_path=True)
Expand Down Expand Up @@ -433,7 +433,7 @@ def write_num_dumps(num_dumps):
def write_kdump_remote():
# Assuming there's a function that retrieves the remote value from the config database
remote = get_kdump_remote() # This function needs to be implemented

kdump_cfg = '/etc/default/kdump-tools'

if remote:
Expand Down Expand Up @@ -641,7 +641,7 @@ def cmd_kdump_config_next(verbose):


def kdump_disable(verbose, image, booter_config_file_path):
"""Unloads Kdump kernel and remove parameter `crashkernel=*` from configuration file of
"""Unloads Kdump kernel and remove parameter `crashkernel=*` from configuration file of
kernel boot loader.

Args:
Expand Down Expand Up @@ -826,11 +826,15 @@ def main():
parser.add_argument('--num_dumps', nargs='?', type=int, action='store', default=False,
help='Maximum number of kernel dump files stored')

parser.add_argument('--remote', action='store_true', default=False,
help='Enable remote kdump via SSH')

parser.add_argument('--ssh_string', nargs='?', type=str, action='store', default=False,
help='ssh_string for remote kdump')

parser.add_argument('--ssh_path', nargs='?', type=str, action='store',default=False,
help='ssh_path for remote kdump')

# Memory allocated for capture kernel on Current Image
parser.add_argument('--memory', nargs='?', type=str, action='store', default=False,
help='Amount of memory reserved for the capture kernel')
Expand Down
87 changes: 85 additions & 2 deletions tests/sonic_kdump_config_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
import unittest
from unittest.mock import patch, mock_open, Mock
from utilities_common.general import load_module_from_source

from sonic_installer.common import IMAGE_PREFIX
import argparse

TESTS_DIR_PATH = os.path.dirname(os.path.abspath(__file__))
UTILITY_DIR_PATH = os.path.dirname(TESTS_DIR_PATH)
Expand All @@ -23,6 +23,32 @@
sonic_kdump_config = load_module_from_source("sonic_kdump_config", sonic_kdump_config_path)


class TestRemoteFlag(unittest.TestCase):
def setUp(self):
# Create a new ArgumentParser for each test
self.parser = argparse.ArgumentParser(description="kdump configuration and status tool")
self.parser.add_argument('--remote', action='store_true', default=False,
help='Enable the Kdump remote SSH mechanism')

def test_remote_flag_provided(self):
"""Test that the --remote flag sets the remote attribute to True."""
with patch.object(sys, 'argv', ['script.py', '--remote']):
args = self.parser.parse_args()
self.assertTrue(args.remote)

def test_remote_flag_not_provided(self):
"""Test that the --remote flag defaults to False when not provided."""
with patch.object(sys, 'argv', ['script.py']):
args = self.parser.parse_args()
self.assertFalse(args.remote)

def test_remote_flag_with_value(self):
"""Test that providing a value to the --remote flag raises an error."""
with patch.object(sys, 'argv', ['script.py', '--remote', 'some_value']):
with self.assertRaises(SystemExit):
self.parser.parse_args()


class TestSonicKdumpConfig(unittest.TestCase):
@classmethod
def setup_class(cls):
Expand Down Expand Up @@ -246,7 +272,7 @@ def test_cmd_kdump_ssh_string_none(self, mock_print, mock_read, mock_run):
def test_cmd_kdump_ssh_string_update(self, mock_print, mock_write, mock_read, mock_run):
# Mock read_ssh_string to return the current SSH string
mock_read.return_value = 'old_ssh_string'
# Call the function with a new SSH string
# Call the function with a new SSH string to configure
sonic_kdump_config.cmd_kdump_ssh_string(verbose=True, ssh_string='new_ssh_string')

# Check that write_ssh_string was called with the new SSH string
Expand Down Expand Up @@ -302,6 +328,63 @@ def test_cmd_kdump_disable(self, mock_path_exist, mock_num_dumps, mock_memory,
return_result = sonic_kdump_config.cmd_kdump_disable(True)
assert return_result == False

@patch("sonic_kdump_config.read_num_dumps")
@patch("sonic_kdump_config.run_command")
def test_write_num_dumps(self, mock_run_cmd, mock_read_num_dumps):
# Success case: correct write and verification
mock_run_cmd.side_effect = [(0, [], None)]
mock_read_num_dumps.return_value = 5
sonic_kdump_config.write_num_dumps(5)

# Case where run_command returns wrong type
mock_run_cmd.side_effect = [(0, (), None)]
mock_read_num_dumps.return_value = 5
with self.assertRaises(SystemExit) as sys_exit:
sonic_kdump_config.write_num_dumps(5)
self.assertEqual(sys_exit.exception.code, 1)

# Case where line is non-empty
mock_run_cmd.side_effect = [(0, ["Some output"], None)]
mock_read_num_dumps.return_value = 5
with self.assertRaises(SystemExit) as sys_exit:
sonic_kdump_config.write_num_dumps(5)
self.assertEqual(sys_exit.exception.code, 1)

# Case where read_num_dumps does not match input
mock_run_cmd.side_effect = [(0, [], None)]
mock_read_num_dumps.return_value = 4
with self.assertRaises(SystemExit) as sys_exit:
sonic_kdump_config.write_num_dumps(5)
self.assertEqual(sys_exit.exception.code, 1)

# Case where run_command fails
mock_run_cmd.side_effect = [(1, [], "Error")]
mock_read_num_dumps.return_value = 5
with self.assertRaises(SystemExit) as sys_exit:
sonic_kdump_config.write_num_dumps(5)
self.assertEqual(sys_exit.exception.code, 1)

# Case where lines contain non-integer
mock_run_cmd.side_effect = [(0, ["NotInteger"], None)]
mock_read_num_dumps.return_value = 5
with self.assertRaises(SystemExit) as sys_exit:
sonic_kdump_config.write_num_dumps(5)
self.assertEqual(sys_exit.exception.code, 1)

# Edge case: empty string in output but matches value
mock_run_cmd.side_effect = [(0, [""], None)]
mock_read_num_dumps.return_value = 5
with self.assertRaises(SystemExit) as sys_exit:
sonic_kdump_config.write_num_dumps(5)
self.assertEqual(sys_exit.exception.code, 1)

# Edge case: read_num_dumps returns matching value but run_command fails
mock_run_cmd.side_effect = [(2, [], None)]
mock_read_num_dumps.return_value = 5
with self.assertRaises(SystemExit) as sys_exit:
sonic_kdump_config.write_num_dumps(5)
self.assertEqual(sys_exit.exception.code, 1)

@patch("sonic_kdump_config.get_bootloader")
def test_get_image(self, mock_get_bootloader):
"""Tests the function `get_current_image() and get_next_image()` in script `sonic-kdump-config.py`.
Expand Down
Loading