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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">add contrib/remsim-apitool.py to control the REST-interface of osmo-remsim-server<br><br>Change-Id: Ia01b0a89e21af18b898becd8f5440c32936772b7<br>---<br>M Makefile.am<br>A contrib/remsim-apitool.py<br>2 files changed, 118 insertions(+), 1 deletion(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/Makefile.am b/Makefile.am</span><br><span>index 4843641..0ff9363 100644</span><br><span>--- a/Makefile.am</span><br><span>+++ b/Makefile.am</span><br><span>@@ -5,7 +5,7 @@</span><br><span> pkgconfigdir = $(libdir)/pkgconfig</span><br><span> pkgconfig_DATA = libosmo-rspro.pc</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-EXTRA_DIST = asn1 .version README.md</span><br><span style="color: hsl(120, 100%, 40%);">+EXTRA_DIST = asn1 .version README.md contrib/remsim-apitool.py</span><br><span> </span><br><span> pkgcofigdir = $(libdir)/pkgconfig</span><br><span> </span><br><span>diff --git a/contrib/remsim-apitool.py b/contrib/remsim-apitool.py</span><br><span>new file mode 100755</span><br><span>index 0000000..35c8826</span><br><span>--- /dev/null</span><br><span>+++ b/contrib/remsim-apitool.py</span><br><span>@@ -0,0 +1,117 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#!/usr/bin/env python3</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import sys</span><br><span style="color: hsl(120, 100%, 40%);">+import argparse</span><br><span style="color: hsl(120, 100%, 40%);">+import requests</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+version = "0.1"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#access rest</span><br><span style="color: hsl(120, 100%, 40%);">+def build_url(suffix):</span><br><span style="color: hsl(120, 100%, 40%);">+    BASE_PATH = "/api/backend/v1"</span><br><span style="color: hsl(120, 100%, 40%);">+    return ("http://" + server_host + ":" + server_port + BASE_PATH + suffix)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+def rest_get(suffix):</span><br><span style="color: hsl(120, 100%, 40%);">+    if verbose:</span><br><span style="color: hsl(120, 100%, 40%);">+        print("GET "+ build_url(suffix))</span><br><span style="color: hsl(120, 100%, 40%);">+    try:</span><br><span style="color: hsl(120, 100%, 40%);">+        resp = requests.get(build_url(suffix))</span><br><span style="color: hsl(120, 100%, 40%);">+    except:</span><br><span style="color: hsl(120, 100%, 40%);">+        print("REST GET failed")</span><br><span style="color: hsl(120, 100%, 40%);">+        return</span><br><span style="color: hsl(120, 100%, 40%);">+    if resp.ok:</span><br><span style="color: hsl(120, 100%, 40%);">+        try:</span><br><span style="color: hsl(120, 100%, 40%);">+            js = resp.json()</span><br><span style="color: hsl(120, 100%, 40%);">+            print("%s: %s" % (suffix, js))</span><br><span style="color: hsl(120, 100%, 40%);">+        except:</span><br><span style="color: hsl(120, 100%, 40%);">+            return</span><br><span style="color: hsl(120, 100%, 40%);">+    else:</span><br><span style="color: hsl(120, 100%, 40%);">+        return None</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+def rest_post(suffix, js = None):</span><br><span style="color: hsl(120, 100%, 40%);">+    if verbose:</span><br><span style="color: hsl(120, 100%, 40%);">+        print("POST "+ build_url(suffix)+ str(js))</span><br><span style="color: hsl(120, 100%, 40%);">+    resp = requests.post(build_url(suffix), json=js)</span><br><span style="color: hsl(120, 100%, 40%);">+    if not resp.ok:</span><br><span style="color: hsl(120, 100%, 40%);">+        print("post failed")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+def rest_delete(suffix):</span><br><span style="color: hsl(120, 100%, 40%);">+    if verbose:</span><br><span style="color: hsl(120, 100%, 40%);">+        print("DELETE "+ build_url(suffix))</span><br><span style="color: hsl(120, 100%, 40%);">+    resp = requests.delete(build_url(suffix))</span><br><span style="color: hsl(120, 100%, 40%);">+    if not resp.ok:</span><br><span style="color: hsl(120, 100%, 40%);">+        print("delete failed")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#rest calls</span><br><span style="color: hsl(120, 100%, 40%);">+def slotmap_create(bank_id, bank_slot, client_id, client_slot):</span><br><span style="color: hsl(120, 100%, 40%);">+    js = {</span><br><span style="color: hsl(120, 100%, 40%);">+        'bank': {'bankId': bank_id, 'slotNr': bank_slot},</span><br><span style="color: hsl(120, 100%, 40%);">+        'client': {'clientId': client_id, 'slotNr': client_slot},</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+    return rest_post('/slotmaps', js)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+def slotmap_delete(bank_id, bank_slot):</span><br><span style="color: hsl(120, 100%, 40%);">+    slotmap_id = bank_id * 65536 + bank_slot</span><br><span style="color: hsl(120, 100%, 40%);">+    return rest_delete("/slotmaps/%u"%slotmap_id)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+def reset_global():</span><br><span style="color: hsl(120, 100%, 40%);">+    return rest_post('/global-reset')</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+def main(argv):</span><br><span style="color: hsl(120, 100%, 40%);">+    global server_port, server_host, verbose</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    parser = argparse.ArgumentParser()</span><br><span style="color: hsl(120, 100%, 40%);">+    parser.add_argument("-H", "--host",    help="host to connect to",                        default="127.0.0.1")</span><br><span style="color: hsl(120, 100%, 40%);">+    parser.add_argument("-p", "--port",    help="port to connect to",                        default="9997")</span><br><span style="color: hsl(120, 100%, 40%);">+    parser.add_argument("-v", "--verbose", help="increase output verbosity", action="count", default=0)</span><br><span style="color: hsl(120, 100%, 40%);">+    group = parser.add_mutually_exclusive_group()</span><br><span style="color: hsl(120, 100%, 40%);">+    group.add_argument("-r", "--reset",          help="remove all mappings  (POST /global-reset)", action="store_true")</span><br><span style="color: hsl(120, 100%, 40%);">+    group.add_argument("-c", "--show-clients",   help="show clients         (GET /clients)",nargs='?',const="all",default=None)</span><br><span style="color: hsl(120, 100%, 40%);">+    group.add_argument("-b", "--show-banks",     help="show banks           (GET /banks)",nargs='?',const="all",default=None)</span><br><span style="color: hsl(120, 100%, 40%);">+    group.add_argument("-s", "--show-slotmaps",  help="show slotmaps        (GET /slotmaps)",nargs='?',const="all",default=None)</span><br><span style="color: hsl(120, 100%, 40%);">+    group.add_argument("-m", "--create-slotmap", help="create new slotmap   (POST /slotmaps)",nargs=4,metavar=('bank_id', 'bank_slot','client_id','client_slot'))</span><br><span style="color: hsl(120, 100%, 40%);">+    group.add_argument("-d", "--delete-slotmap", help="delete slotmapping   (DELETE /slotmaps/<id>)", type=int, nargs=2, metavar=('bank_id','bank_slot'))</span><br><span style="color: hsl(120, 100%, 40%);">+    group.add_argument("-a", "--show-all",       help="show all (default if no argument given)", action="store_true")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    args = parser.parse_args()</span><br><span style="color: hsl(120, 100%, 40%);">+    if args.verbose:</span><br><span style="color: hsl(120, 100%, 40%);">+        print("verbosity = ", args.verbose)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    server_host = args.host</span><br><span style="color: hsl(120, 100%, 40%);">+    server_port = args.port</span><br><span style="color: hsl(120, 100%, 40%);">+    verbose = args.verbose</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    if args.reset:</span><br><span style="color: hsl(120, 100%, 40%);">+        reset_global()</span><br><span style="color: hsl(120, 100%, 40%);">+        return</span><br><span style="color: hsl(120, 100%, 40%);">+    if args.show_clients:</span><br><span style="color: hsl(120, 100%, 40%);">+        if args.show_clients == "all":</span><br><span style="color: hsl(120, 100%, 40%);">+            rest_get("/clients")</span><br><span style="color: hsl(120, 100%, 40%);">+        else:</span><br><span style="color: hsl(120, 100%, 40%);">+            rest_get("/clients/" + str(args.show_clients))</span><br><span style="color: hsl(120, 100%, 40%);">+        return</span><br><span style="color: hsl(120, 100%, 40%);">+    if args.show_banks:</span><br><span style="color: hsl(120, 100%, 40%);">+        if args.show_banks == "all":</span><br><span style="color: hsl(120, 100%, 40%);">+            rest_get("/banks")</span><br><span style="color: hsl(120, 100%, 40%);">+        else:</span><br><span style="color: hsl(120, 100%, 40%);">+            rest_get("/banks/" + str(args.show_banks))</span><br><span style="color: hsl(120, 100%, 40%);">+        return</span><br><span style="color: hsl(120, 100%, 40%);">+    if args.show_slotmaps:</span><br><span style="color: hsl(120, 100%, 40%);">+        if args.show_slotmaps == "all":</span><br><span style="color: hsl(120, 100%, 40%);">+            rest_get("/slotmaps")</span><br><span style="color: hsl(120, 100%, 40%);">+        else:</span><br><span style="color: hsl(120, 100%, 40%);">+            rest_get("/slotmaps/" + str(args.show_slotmaps))</span><br><span style="color: hsl(120, 100%, 40%);">+        return</span><br><span style="color: hsl(120, 100%, 40%);">+    if args.create_slotmap:</span><br><span style="color: hsl(120, 100%, 40%);">+        slotmap_create(args.create_slotmap[0],args.create_slotmap[1],args.create_slotmap[2],args.create_slotmap[3])</span><br><span style="color: hsl(120, 100%, 40%);">+        return</span><br><span style="color: hsl(120, 100%, 40%);">+    if args.delete_slotmap:</span><br><span style="color: hsl(120, 100%, 40%);">+        slotmap_delete(args.delete_slotmap[0],args.delete_slotmap[1])</span><br><span style="color: hsl(120, 100%, 40%);">+        return</span><br><span style="color: hsl(120, 100%, 40%);">+    rest_get("/clients")</span><br><span style="color: hsl(120, 100%, 40%);">+    rest_get("/banks")</span><br><span style="color: hsl(120, 100%, 40%);">+    rest_get("/slotmaps")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+if __name__ == "__main__":</span><br><span style="color: hsl(120, 100%, 40%);">+    main(sys.argv)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-remsim/+/14968">change 14968</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-remsim/+/14968"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-remsim </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Ia01b0a89e21af18b898becd8f5440c32936772b7 </div>
<div style="display:none"> Gerrit-Change-Number: 14968 </div>
<div style="display:none"> Gerrit-PatchSet: 2 </div>
<div style="display:none"> Gerrit-Owner: roh <jsteiger@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>