<p>Pau Espin Pedrol has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/11462">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">WIP: gprs<br><br>Change-Id: Icb06bdfcdd37c797be95ab5addb28da2d9f6681c<br>---<br>A example/scenarios/modem-ec20.conf<br>M src/osmo_gsm_tester/modem.py<br>M src/osmo_gsm_tester/process.py<br>M src/osmo_gsm_tester/suite.py<br>M suites/gprs/ping.py<br>A utils/osmo-gsm-tester_netns_exec.sh<br>6 files changed, 47 insertions(+), 6 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-gsm-tester refs/changes/62/11462/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/example/scenarios/modem-ec20.conf b/example/scenarios/modem-ec20.conf</span><br><span>new file mode 100644</span><br><span>index 0000000..c6dc8f9</span><br><span>--- /dev/null</span><br><span>+++ b/example/scenarios/modem-ec20.conf</span><br><span>@@ -0,0 +1,3 @@</span><br><span style="color: hsl(120, 100%, 40%);">+resources:</span><br><span style="color: hsl(120, 100%, 40%);">+  modem:</span><br><span style="color: hsl(120, 100%, 40%);">+  - label: ec20</span><br><span>diff --git a/src/osmo_gsm_tester/modem.py b/src/osmo_gsm_tester/modem.py</span><br><span>index d0bbf23..f7acd8c 100644</span><br><span>--- a/src/osmo_gsm_tester/modem.py</span><br><span>+++ b/src/osmo_gsm_tester/modem.py</span><br><span>@@ -17,13 +17,14 @@</span><br><span> # You should have received a copy of the GNU General Public License</span><br><span> # along with this program.  If not, see <http://www.gnu.org/licenses/>.</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-from . import log, util, sms</span><br><span style="color: hsl(120, 100%, 40%);">+from . import log, util, sms, process</span><br><span> from .event_loop import MainLoop</span><br><span> </span><br><span> from pydbus import SystemBus, Variant</span><br><span> import time</span><br><span> import pprint</span><br><span> import sys</span><br><span style="color: hsl(120, 100%, 40%);">+import os</span><br><span> </span><br><span> # Required for Gio.Cancellable.</span><br><span> # See https://lazka.github.io/pgi-docs/Gio-2.0/classes/Cancellable.html#Gio.Cancellable</span><br><span>@@ -326,15 +327,17 @@</span><br><span>     CTX_PROT_IPv6 = 'ipv6'</span><br><span>     CTX_PROT_IPv46 = 'dual'</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    def __init__(self, conf):</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, suite_run, conf):</span><br><span style="color: hsl(120, 100%, 40%);">+        self.suite_run = suite_run</span><br><span>         self.conf = conf</span><br><span>         self.syspath = conf.get('path')</span><br><span>         self.dbuspath = get_dbuspath_from_syspath(self.syspath)</span><br><span>         super().__init__(log.C_TST, self.dbuspath)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.dbg('creating from syspath %s', self.syspath)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.dbg('creating from syspath %s' % self.syspath)</span><br><span>         self.msisdn = None</span><br><span>         self._ki = None</span><br><span>         self._imsi = None</span><br><span style="color: hsl(120, 100%, 40%);">+        self.run_dir = util.Dir(self.suite_run.get_test_run_dir().new_dir(self.name().strip('/')))</span><br><span>         self.sms_received_list = []</span><br><span>         self.dbus = ModemDbusInteraction(self.dbuspath)</span><br><span>         self.register_attempts = 0</span><br><span>@@ -361,6 +364,9 @@</span><br><span>         self.dbus.cleanup()</span><br><span>         self.dbus = None</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    def netns(self):</span><br><span style="color: hsl(120, 100%, 40%);">+        return os.path.basename(self.syspath.rstrip('/'))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     def properties(self, *args, **kwargs):</span><br><span>         '''Return a dict of properties on this modem. For the actual arguments,</span><br><span>         see ModemDbusInteraction.properties(), which this function calls.  The</span><br><span>@@ -630,6 +636,23 @@</span><br><span>         connmgr.RemoveContext(ctx_id)</span><br><span>         self.log('context deactivated', path=ctx_id)</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    def run_netns_wait(self, name, popen_args):</span><br><span style="color: hsl(120, 100%, 40%);">+        proc = process.NetNSProcess(name, self.run_dir.new_dir(name), self.netns(), popen_args,</span><br><span style="color: hsl(120, 100%, 40%);">+                                       env={})</span><br><span style="color: hsl(120, 100%, 40%);">+        process.run_proc_sync(proc)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    def setup_context_data_plane(self, ctx_id):</span><br><span style="color: hsl(120, 100%, 40%);">+        self.dbg('setup_context_data', path=ctx_id)</span><br><span style="color: hsl(120, 100%, 40%);">+        ctx = systembus_get(ctx_id)</span><br><span style="color: hsl(120, 100%, 40%);">+        ctx_settings = ctx.GetProperties().get('Settings', None)</span><br><span style="color: hsl(120, 100%, 40%);">+        if not ctx_settings:</span><br><span style="color: hsl(120, 100%, 40%);">+            raise log.Error('%s no Settings found! No way to get iface!' % ctx_id)</span><br><span style="color: hsl(120, 100%, 40%);">+        iface = ctx_settings.get('Interface', None)</span><br><span style="color: hsl(120, 100%, 40%);">+        if not iface:</span><br><span style="color: hsl(120, 100%, 40%);">+            raise log.Error('%s Settings contains no iface! %r' % (ctx_id, repr(ctx_settings)))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.run_netns_wait('ifup', ('ip', 'link', 'set', 'dev', iface, 'up'))</span><br><span style="color: hsl(120, 100%, 40%);">+        self.run_netns_wait('dhcp', ('udhcpc', '-q', '-i', iface))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     def sms_send(self, to_msisdn_or_modem, *tokens):</span><br><span>         if isinstance(to_msisdn_or_modem, Modem):</span><br><span>             to_msisdn = to_msisdn_or_modem.msisdn</span><br><span>diff --git a/src/osmo_gsm_tester/process.py b/src/osmo_gsm_tester/process.py</span><br><span>index fb5c6f6..3764409 100644</span><br><span>--- a/src/osmo_gsm_tester/process.py</span><br><span>+++ b/src/osmo_gsm_tester/process.py</span><br><span>@@ -274,4 +274,12 @@</span><br><span>     scp(run_dir, remote_user, remote_addr, 'scp-cfg-to-remote', cfg_file_name, remote_config_file)</span><br><span>     return remote_inst</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+class NetNSProcess(Process):</span><br><span style="color: hsl(120, 100%, 40%);">+    NETNS_EXEC_BIN = 'osmo-gsm-tester_netns_exec.sh'</span><br><span style="color: hsl(120, 100%, 40%);">+    def __init__(self, name, run_dir, netns, popen_args, **popen_kwargs):</span><br><span style="color: hsl(120, 100%, 40%);">+        super().__init__(name, run_dir, popen_args, **popen_kwargs)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.netns = netns</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        self.popen_args = ['sudo', self.NETNS_EXEC_BIN, self.netns] + list(popen_args)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.dbg(self.popen_args, dir=self.run_dir, conf=self.popen_kwargs)</span><br><span> # vim: expandtab tabstop=4 shiftwidth=4</span><br><span>diff --git a/src/osmo_gsm_tester/suite.py b/src/osmo_gsm_tester/suite.py</span><br><span>index 3a49574..bf8156d 100644</span><br><span>--- a/src/osmo_gsm_tester/suite.py</span><br><span>+++ b/src/osmo_gsm_tester/suite.py</span><br><span>@@ -323,7 +323,7 @@</span><br><span>     def modem(self, specifics=None):</span><br><span>         conf = self.reserved_resources.get(resource.R_MODEM, specifics=specifics)</span><br><span>         self.dbg('create Modem object', conf=conf)</span><br><span style="color: hsl(0, 100%, 40%);">-        ms = modem.Modem(conf)</span><br><span style="color: hsl(120, 100%, 40%);">+        ms = modem.Modem(self, conf)</span><br><span>         self.register_for_cleanup(ms)</span><br><span>         return ms</span><br><span> </span><br><span>diff --git a/suites/gprs/ping.py b/suites/gprs/ping.py</span><br><span>index 1647445..5a821fe 100755</span><br><span>--- a/suites/gprs/ping.py</span><br><span>+++ b/suites/gprs/ping.py</span><br><span>@@ -48,8 +48,10 @@</span><br><span> </span><br><span> # We need to use inet46 since ofono qmi only uses ipv4v6 eua (OS#2713)</span><br><span> ctx_id_v4 = ms.activate_context(apn='inet46', protocol=ms.CTX_PROT_IPv4)</span><br><span style="color: hsl(0, 100%, 40%);">-sleep(5)</span><br><span style="color: hsl(0, 100%, 40%);">-# TODO: send ping to server or open TCP conn with a socket in python</span><br><span style="color: hsl(120, 100%, 40%);">+print("Setting up data plan for %r" % repr(ctx_id_v4))</span><br><span style="color: hsl(120, 100%, 40%);">+ms.setup_context_data_plane(ctx_id_v4)</span><br><span style="color: hsl(120, 100%, 40%);">+print("Running 10 ping requrests for %r" % repr(ctx_id_v4))</span><br><span style="color: hsl(120, 100%, 40%);">+ms.run_netns_wait('ping', ('ping', '-c', '10', ggsn.addr()))</span><br><span> ms.deactivate_context(ctx_id_v4)</span><br><span> </span><br><span> # We need to use inet46 since ofono qmi only uses ipv4v6 eua (OS#2713)</span><br><span>diff --git a/utils/osmo-gsm-tester_netns_exec.sh b/utils/osmo-gsm-tester_netns_exec.sh</span><br><span>new file mode 100755</span><br><span>index 0000000..336b746</span><br><span>--- /dev/null</span><br><span>+++ b/utils/osmo-gsm-tester_netns_exec.sh</span><br><span>@@ -0,0 +1,5 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#!/bin/bash</span><br><span style="color: hsl(120, 100%, 40%);">+netns="$1"</span><br><span style="color: hsl(120, 100%, 40%);">+shift</span><br><span style="color: hsl(120, 100%, 40%);">+#TODO: Later on I may want to call myself with specific ENV and calling sudo in order to run inside the netns but with dropped privileges</span><br><span style="color: hsl(120, 100%, 40%);">+ip netns exec $netns "$@"</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/11462">change 11462</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/11462"/><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-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: Icb06bdfcdd37c797be95ab5addb28da2d9f6681c </div>
<div style="display:none"> Gerrit-Change-Number: 11462 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Pau Espin Pedrol <pespin@sysmocom.de> </div>