From a0538aaf6c1d59b0e78d998b44ae01a87cf65467 Mon Sep 17 00:00:00 2001 From: yeswanth Date: Sun, 24 Aug 2025 23:40:45 +0530 Subject: [PATCH 1/3] Added Dlpar_mem_hotplug Tescase Signed-off-by: yeswanth --- testcases/OpTestDlpar.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/testcases/OpTestDlpar.py b/testcases/OpTestDlpar.py index 92d5fc4bd..0a651851c 100644 --- a/testcases/OpTestDlpar.py +++ b/testcases/OpTestDlpar.py @@ -315,6 +315,36 @@ def runTest(self): log.debug("Deleting smt script") self.console.run_command("rm ./smt_script") +class Dlpar_mem_hotplug(OpTestDlpar,unittest.TestCase): + '''Class for DLPAR Memory Basic Tests + This class allows --run testcases.OpTestDlpar.DlparMemBasic + Test 1 : memory_hotplug.memmap_on_memory=0 * test dlpar memory add, memory remove, memory mix + Test 2 : memory_hotplug.memmap_on_memory=1 * test dlpar memory add, memory remove, memory mix + Test 3 : memory_hotplug.memmap_on_memory=force * test dlpar memory add, memory remove, memory mix + + ''' + def setUp(self): + super(DlparMemBasic, self).setUp() + def runTest(self): + self.AddRemove("mem","-q","a",self.mem_resource) + self.AddRemove("mem","-q","r",self.mem_resource) + self.Move("mem","-q",self.mem_resource) + + def runTest(self): + obj = OpTestInstallUtil.InstallUtil() + list1 = [0,1,force] + for ele in list1: + obj.update_kernel_cmdline(self.distro, args="memory_hotplug.memmap_on_memory = ele", + reboot=True, reboot_cmd=True) + + log.debug("Mem add in a loop") + log.debug("=================") + self.AddRemove("mem","-q","a",self.mem_resource) + + log.debug("Mem remove in a loop") + log.debug("=================") + self.AddRemove("mem","-q","r",self.mem_resource) + def tearDown(self): self.console_thread.console_terminate() #reboot machine & delete script smt_script From afa80156f8228009a22ac0c4a8db0a78c37820c8 Mon Sep 17 00:00:00 2001 From: yeswanth Date: Thu, 4 Sep 2025 20:21:11 +0530 Subject: [PATCH 2/3] Done the changes and Tested Signed-off-by: yeswanth --- testcases/OpTestDlpar.py | 71 ++++++++++++++++++++++++++++++++-------- 1 file changed, 57 insertions(+), 14 deletions(-) diff --git a/testcases/OpTestDlpar.py b/testcases/OpTestDlpar.py index 0a651851c..71b7fe704 100644 --- a/testcases/OpTestDlpar.py +++ b/testcases/OpTestDlpar.py @@ -51,10 +51,15 @@ from random import randint from common.OpTestSystem import OpSystemState from common.OpTestSOL import OpSOLMonitorThread +from common import OpTestInstallUtil +from common.OpTestUtil import OpTestUtil + log = OpTestLogger.optest_logger_glob.get_logger(__name__) class OpTestDlpar(unittest.TestCase): def setUp(self): conf = OpTestConfiguration.conf + self.op_test_util = OpTestUtil(conf) + self.distro = self.op_test_util.distro_name() self.cv_SYSTEM = conf.system() self.console = self.cv_SYSTEM.console conf = OpTestConfiguration.conf @@ -315,28 +320,26 @@ def runTest(self): log.debug("Deleting smt script") self.console.run_command("rm ./smt_script") -class Dlpar_mem_hotplug(OpTestDlpar,unittest.TestCase): + +class Dlpar_mem_hotplu(OpTestDlpar,unittest.TestCase): '''Class for DLPAR Memory Basic Tests This class allows --run testcases.OpTestDlpar.DlparMemBasic - Test 1 : memory_hotplug.memmap_on_memory=0 * test dlpar memory add, memory remove, memory mix - Test 2 : memory_hotplug.memmap_on_memory=1 * test dlpar memory add, memory remove, memory mix - Test 3 : memory_hotplug.memmap_on_memory=force * test dlpar memory add, memory remove, memory mix - ''' def setUp(self): - super(DlparMemBasic, self).setUp() - def runTest(self): - self.AddRemove("mem","-q","a",self.mem_resource) - self.AddRemove("mem","-q","r",self.mem_resource) - self.Move("mem","-q",self.mem_resource) + super(Dlpar_mem_hotplug, self).setUp() def runTest(self): obj = OpTestInstallUtil.InstallUtil() - list1 = [0,1,force] + list1 = [0, 1, 'force'] for ele in list1: - obj.update_kernel_cmdline(self.distro, args="memory_hotplug.memmap_on_memory = ele", - reboot=True, reboot_cmd=True) - + obj.update_kernel_cmdline( + self.distro, + args=f"memory_hotplug.memmap_on_memory={ele}", + reboot=True, + reboot_cmd=True + ) + con = self.cv_SYSTEM.cv_HOST.get_ssh_connection() + #self.cv_SYSTEM.goto_state(OpSystemState.OS) log.debug("Mem add in a loop") log.debug("=================") self.AddRemove("mem","-q","a",self.mem_resource) @@ -345,6 +348,46 @@ def runTest(self): log.debug("=================") self.AddRemove("mem","-q","r",self.mem_resource) +class Dlpar_mem_hotplug(OpTestDlpar, unittest.TestCase): + """Class for DLPAR Memory hotplug Tests + This class executes test cases from OpTestDlpar.DlparMemBasic. + + Step 1 : memory_hotplug.memmap_on_memory=0 * test dlpar memory add, memory remove + Step 2 : memory_hotplug.memmap_on_memory=1 * test dlpar memory add, memory remove + Step 3 : memory_hotplug.memmap_on_memory=force * test dlpar memory add, memory remove + """ + + def setUp(self): + super(Dlpar_mem_hotplug, self).setUp() + + def runTest(self): + obj = OpTestInstallUtil.InstallUtil() + + test_settings = [0, 1, 'force'] + + for setting in test_settings: + obj.update_kernel_cmdline( + self.distro, + args=f"memory_hotplug.memmap_on_memory={setting}", + reboot=True, + reboot_cmd=True + ) + + # Establish SSH connection + con = self.cv_SYSTEM.cv_HOST.get_ssh_connection() + + log.debug("Memory hotplug with setting: %s", setting) + log.debug("=================") + + # Add memory resource + self.AddRemove("mem", "-q", "a", self.mem_resource) + + log.debug("Memory hotplug removal with setting: %s", setting) + log.debug("=================") + + # Remove memory resource + self.AddRemove("mem", "-q", "r", self.mem_resource) + def tearDown(self): self.console_thread.console_terminate() #reboot machine & delete script smt_script From 0a18b45012b9e08383f9a324b612ad2f10d87f9e Mon Sep 17 00:00:00 2001 From: yeswanth Date: Thu, 11 Sep 2025 01:43:53 +0530 Subject: [PATCH 3/3] Fixed changes Signed-off-by: yeswanth --- common/OpTestInstallUtil.py | 7 ++++++- common/OpTestSOL.py | 8 ++++++++ testcases/OpTestDlpar.py | 37 ++++--------------------------------- 3 files changed, 18 insertions(+), 34 deletions(-) diff --git a/common/OpTestInstallUtil.py b/common/OpTestInstallUtil.py index 9f700c837..420e261d0 100644 --- a/common/OpTestInstallUtil.py +++ b/common/OpTestInstallUtil.py @@ -466,9 +466,14 @@ def update_kernel_cmdline(self, distro, args="", remove_args="", reboot=True, if reboot and (req_args or req_remove_args): # Reboot the host for the kernel command to reflect if reboot_cmd: + # Always reopen console fresh to avoid stale session after first reboot + self.cv_SYSTEM.console.close() raw_pty = self.cv_SYSTEM.console.get_console() raw_pty.sendline("reboot") - raw_pty.expect("login:", timeout=900) + login_patterns = [ + "login:", "root login:", "Ubuntu login:", "Password:", + ] + raw_pty.expect(login_patterns, timeout=900) else: self.cv_SYSTEM.goto_state(OpSystemState.OFF) self.cv_SYSTEM.goto_state(OpSystemState.OS) diff --git a/common/OpTestSOL.py b/common/OpTestSOL.py index 49cb7f35c..155282a89 100644 --- a/common/OpTestSOL.py +++ b/common/OpTestSOL.py @@ -93,6 +93,14 @@ def nontimeout_run(self): self.c.expect("\n", timeout=60) except pexpect.TIMEOUT: pass + except OSError as e: + # File descriptor closed (reboot / rmvterm) + print(f"[OpTestSOL] Console closed: {e}, stopping SOL thread.") + break + except Exception as e: + # Catch-all for any other console errors + print(f"[OpTestSOL] Unexpected error in SOL thread: {e}, stopping.") + break except pexpect.EOF: self.c.close() self.c = self.system.console.get_console() diff --git a/testcases/OpTestDlpar.py b/testcases/OpTestDlpar.py index 71b7fe704..72dd8edd4 100644 --- a/testcases/OpTestDlpar.py +++ b/testcases/OpTestDlpar.py @@ -38,12 +38,14 @@ lpar2_name - name of destination lpar for move operation loop_num - number of times to run loop ''' +import time import unittest import logging import os.path from os import path import OpTestConfiguration import OpTestLogger +from testcases.grub import Grub from common import OpTestHMC, OpTestFSP from common import OpTestHMC from common.OpTestSystem import OpSystemState @@ -321,33 +323,6 @@ def runTest(self): self.console.run_command("rm ./smt_script") -class Dlpar_mem_hotplu(OpTestDlpar,unittest.TestCase): - '''Class for DLPAR Memory Basic Tests - This class allows --run testcases.OpTestDlpar.DlparMemBasic - ''' - def setUp(self): - super(Dlpar_mem_hotplug, self).setUp() - - def runTest(self): - obj = OpTestInstallUtil.InstallUtil() - list1 = [0, 1, 'force'] - for ele in list1: - obj.update_kernel_cmdline( - self.distro, - args=f"memory_hotplug.memmap_on_memory={ele}", - reboot=True, - reboot_cmd=True - ) - con = self.cv_SYSTEM.cv_HOST.get_ssh_connection() - #self.cv_SYSTEM.goto_state(OpSystemState.OS) - log.debug("Mem add in a loop") - log.debug("=================") - self.AddRemove("mem","-q","a",self.mem_resource) - - log.debug("Mem remove in a loop") - log.debug("=================") - self.AddRemove("mem","-q","r",self.mem_resource) - class Dlpar_mem_hotplug(OpTestDlpar, unittest.TestCase): """Class for DLPAR Memory hotplug Tests This class executes test cases from OpTestDlpar.DlparMemBasic. @@ -359,12 +334,11 @@ class Dlpar_mem_hotplug(OpTestDlpar, unittest.TestCase): def setUp(self): super(Dlpar_mem_hotplug, self).setUp() - + def runTest(self): obj = OpTestInstallUtil.InstallUtil() test_settings = [0, 1, 'force'] - for setting in test_settings: obj.update_kernel_cmdline( self.distro, @@ -372,19 +346,16 @@ def runTest(self): reboot=True, reboot_cmd=True ) - # Establish SSH connection con = self.cv_SYSTEM.cv_HOST.get_ssh_connection() log.debug("Memory hotplug with setting: %s", setting) log.debug("=================") - # Add memory resource self.AddRemove("mem", "-q", "a", self.mem_resource) - log.debug("Memory hotplug removal with setting: %s", setting) + #log.debug("Memory hotplug removal with setting: %s", setting) log.debug("=================") - # Remove memory resource self.AddRemove("mem", "-q", "r", self.mem_resource)