<p>pespin <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-gsm-tester/+/19105">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  pespin: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Introduce stress tool object<br><br>This object allows to run the "stress" cmdline program in the background<br>on the specifies run_node, to simulate system load.<br><br>To run stress, a test can simply do:<br>stress = tenv.stress(epc.run_node())<br>stress.start(cpu_workers=2, mem_workers=1, io_workers=1)<br><br>And the test environment will remember to stop it when the test finishes.<br><br>Change-Id: I21023e6c64c48109f294291bfe3d8d8f4e1de038<br>---<br>A src/osmo_gsm_tester/obj/stress.py<br>M src/osmo_gsm_tester/testenv.py<br>2 files changed, 78 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/osmo_gsm_tester/obj/stress.py b/src/osmo_gsm_tester/obj/stress.py</span><br><span>new file mode 100644</span><br><span>index 0000000..f0e417a</span><br><span>--- /dev/null</span><br><span>+++ b/src/osmo_gsm_tester/obj/stress.py</span><br><span>@@ -0,0 +1,73 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# osmo_gsm_tester: specifics for running stress(-ng), a tool to load and stress a computer system</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# Copyright (C) 2020 by sysmocom - s.f.m.c. GmbH</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# Author: Pau Espin Pedrol <pespin@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# This program is free software: you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+# it under the terms of the GNU General Public License as</span><br><span style="color: hsl(120, 100%, 40%);">+# published by the Free Software Foundation, either version 3 of the</span><br><span style="color: hsl(120, 100%, 40%);">+# License, or (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+# but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+# GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# You should have received a copy of the GNU General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+# along with this program.  If not, see <http://www.gnu.org/licenses/>.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+from ..core import log</span><br><span style="color: hsl(120, 100%, 40%);">+from ..core import util</span><br><span style="color: hsl(120, 100%, 40%);">+from ..core import process</span><br><span style="color: hsl(120, 100%, 40%);">+from ..core import remote</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+class StressTool(log.Origin):</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    STRESS_BIN = 'stress'</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+##############</span><br><span style="color: hsl(120, 100%, 40%);">+# PROTECTED</span><br><span style="color: hsl(120, 100%, 40%);">+##############</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, testenv, run_node):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(log.C_RUN, StressTool.STRESS_BIN)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv = testenv</span><br><span style="color: hsl(120, 100%, 40%);">+        self._run_node = run_node</span><br><span style="color: hsl(120, 100%, 40%);">+        self.proc = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.rem_host = None</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def runs_locally(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        locally = not self._run_node or self._run_node.is_local()</span><br><span style="color: hsl(120, 100%, 40%);">+        return locally</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+###################</span><br><span style="color: hsl(120, 100%, 40%);">+# PUBLIC (test API included)</span><br><span style="color: hsl(120, 100%, 40%);">+###################</span><br><span style="color: hsl(120, 100%, 40%);">+    def start(self, cpu_workers=0, mem_workers=0, io_workers=0, timeout=0):</span><br><span style="color: hsl(120, 100%, 40%);">+        self.run_dir = util.Dir(self.testenv.test().get_run_dir().new_dir(self.name()))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        popen_args = (StressTool.STRESS_BIN,)</span><br><span style="color: hsl(120, 100%, 40%);">+        if cpu_workers > 0:</span><br><span style="color: hsl(120, 100%, 40%);">+            popen_args += ('-c', str(cpu_workers))</span><br><span style="color: hsl(120, 100%, 40%);">+        if mem_workers > 0:</span><br><span style="color: hsl(120, 100%, 40%);">+            popen_args += ('-m', str(mem_workers))</span><br><span style="color: hsl(120, 100%, 40%);">+        if io_workers > 0:</span><br><span style="color: hsl(120, 100%, 40%);">+            popen_args += ('-i', str(io_workers))</span><br><span style="color: hsl(120, 100%, 40%);">+        if timeout > 0:</span><br><span style="color: hsl(120, 100%, 40%);">+            popen_args += ('-t', str(timeout))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if self.runs_locally():</span><br><span style="color: hsl(120, 100%, 40%);">+            self.proc = process.Process(self.name(), self.run_dir, popen_args, env={})</span><br><span style="color: hsl(120, 100%, 40%);">+        else:</span><br><span style="color: hsl(120, 100%, 40%);">+            self.rem_host = remote.RemoteHost(self.run_dir, self._run_node.ssh_user(), self._run_node.ssh_addr())</span><br><span style="color: hsl(120, 100%, 40%);">+            self.proc = self.rem_host.RemoteProcess(self.name(), popen_args, env={})</span><br><span style="color: hsl(120, 100%, 40%);">+        # Warning: Be aware that if process ends before test is finished due to</span><br><span style="color: hsl(120, 100%, 40%);">+        # "-t timeout" param being set, the test will most probably fail as</span><br><span style="color: hsl(120, 100%, 40%);">+        # detected 'early exit' by the testenv.</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.remember_to_stop(self.proc)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.proc.launch()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def stop(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        self.testenv.stop_process(self.proc)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# vim: expandtab tabstop=4 shiftwidth=4</span><br><span>diff --git a/src/osmo_gsm_tester/testenv.py b/src/osmo_gsm_tester/testenv.py</span><br><span>index ea71df9..1790059 100644</span><br><span>--- a/src/osmo_gsm_tester/testenv.py</span><br><span>+++ b/src/osmo_gsm_tester/testenv.py</span><br><span>@@ -318,6 +318,11 @@</span><br><span>         iperf3srv_obj = IPerf3Server(self, ip_address)</span><br><span>         return iperf3srv_obj</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    def stress(self, run_node=None):</span><br><span style="color: hsl(120, 100%, 40%);">+        from .obj.stress import StressTool</span><br><span style="color: hsl(120, 100%, 40%);">+        stress_obj = StressTool(self, run_node)</span><br><span style="color: hsl(120, 100%, 40%);">+        return stress_obj</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     def msisdn(self):</span><br><span>         msisdn = self.suite_run.resource_pool().next_msisdn(self)</span><br><span>         self.log('using MSISDN', msisdn)</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-gsm-tester/+/19105">change 19105</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmo-gsm-tester/+/19105"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-gsm-tester </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I21023e6c64c48109f294291bfe3d8d8f4e1de038 </div>
<div style="display:none"> Gerrit-Change-Number: 19105 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>