From 6c65064e1265cb79230f3af7800bee18e995215c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roberto=20Abdelkader=20Mart=C3=ADnez=20P=C3=A9rez?= Date: Thu, 5 Sep 2019 07:55:55 +0200 Subject: [PATCH 1/5] Change custom request & response commands by two kapow subcommands --- poc/bin/kapow | 33 ++++++++++++++++++++ poc/bin/request | 19 ------------ poc/bin/response | 46 ---------------------------- poc/examples/eval.pow | 2 +- poc/examples/nmap/nmap.pow | 2 +- poc/examples/operator.pow | 22 ++++++------- poc/examples/pandoc/pandoc.pow | 12 ++++---- poc/examples/pdfeditor/pdfeditor.pow | 2 +- poc/examples/pdfeditor/topdf | 10 +++--- poc/examples/torrent.pow | 14 ++++----- 10 files changed, 65 insertions(+), 97 deletions(-) delete mode 100755 poc/bin/request delete mode 100755 poc/bin/response diff --git a/poc/bin/kapow b/poc/bin/kapow index f9073e7..73ffc3b 100755 --- a/poc/bin/kapow +++ b/poc/bin/kapow @@ -595,5 +595,38 @@ def route_list(route_id, url): print(json.dumps(response.json(), indent=2)) +@kapow.command("set") +@click.option("--url", envvar='KAPOW_URL') +@click.option("--handler-id", envvar='KAPOW_HANDLER_ID') +@click.argument("path", nargs=1) +@click.argument("value", required=False) +def kapow_set(url, handler_id, path, value): + if value is None: + data = sys.stdin.buffer + else: + data = value.encode('utf-8') + + try: + response = requests.put(f"{url}/handlers/{handler_id}{path}", + data=data) + except requests.exceptions.ConnectionError: + return False + else: + response.raise_for_status() + + +@kapow.command("get") +@click.option("--url", envvar='KAPOW_URL') +@click.option("--handler-id", envvar='KAPOW_HANDLER_ID') +@click.argument("path", nargs=1) +def kapow_get(url, handler_id, path): + try: + response = requests.get(f"{url}/handlers/{handler_id}{path}") + response.raise_for_status() + except requests.exceptions.ConnectionError: + return False + else: + print(response.text) + if __name__ == '__main__': kapow() diff --git a/poc/bin/request b/poc/bin/request deleted file mode 100755 index 0ebf854..0000000 --- a/poc/bin/request +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/sh - -# -# Copyright 2019 Banco Bilbao Vizcaya Argentaria, S.A. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -curl -sf "${KAPOW_URL}/handlers/${KAPOW_HANDLER_ID}/request$1" diff --git a/poc/bin/response b/poc/bin/response deleted file mode 100755 index 75dc091..0000000 --- a/poc/bin/response +++ /dev/null @@ -1,46 +0,0 @@ -#!/usr/bin/env python - -# -# Copyright 2019 Banco Bilbao Vizcaya Argentaria, S.A. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -import sys - -import click -import requests - - -@click.command() -@click.option("--url", envvar='KAPOW_URL') -@click.option("--handler-id", envvar='KAPOW_HANDLER_ID') -@click.argument("path", nargs=1) -@click.argument("value", required=False) -def response(url, handler_id, path, value): - if value is None: - data = sys.stdin.buffer - else: - data = value.encode('utf-8') - - try: - response = requests.put(f"{url}/handlers/{handler_id}/response{path}", - data=data) - except requests.exceptions.ConnectionError: - return False - else: - response.raise_for_status() - - -if __name__ == '__main__': - response() diff --git a/poc/examples/eval.pow b/poc/examples/eval.pow index 209be5d..acc18bd 100755 --- a/poc/examples/eval.pow +++ b/poc/examples/eval.pow @@ -16,4 +16,4 @@ # limitations under the License. # -kapow route add -X POST '/eval' -c '$($(request /body) | response /stream)' +kapow route add -X POST '/eval' -c '$($(kapow get /request/body) | kapow set /response/stream)' diff --git a/poc/examples/nmap/nmap.pow b/poc/examples/nmap/nmap.pow index e68eb4c..37ec075 100755 --- a/poc/examples/nmap/nmap.pow +++ b/poc/examples/nmap/nmap.pow @@ -16,4 +16,4 @@ # limitations under the License. # -kapow route add -X GET '/list/{ip}' -c 'nmap -sL $(request /matches/ip) | response /body' +kapow route add -X GET '/list/{ip}' -c 'nmap -sL $(kapow get /request/matches/ip) | kapow set /response/body' diff --git a/poc/examples/operator.pow b/poc/examples/operator.pow index 6be8194..27bca22 100755 --- a/poc/examples/operator.pow +++ b/poc/examples/operator.pow @@ -16,26 +16,26 @@ # limitations under the License. # -kapow route add /list/files -c 'ls -la $(request /params/path) | response /body' +kapow route add /list/files -c 'ls -la $(kapow get /request/params/path) | kapow set /response/body' -kapow route add /list/processes -c 'ps -aux | response /body' +kapow route add /list/processes -c 'ps -aux | kapow set /response/body' -kapow route add /show/cpuinfo -c 'response /body < /proc/cpuinfo' +kapow route add /show/cpuinfo -c 'kapow set /response/body < /proc/cpuinfo' -kapow route add /show/memory -c 'free -m | response /body' +kapow route add /show/memory -c 'free -m | kapow set /response/body' -kapow route add /show/disk -c 'df -h | response /body' +kapow route add /show/disk -c 'df -h | kapow set /response/body' -kapow route add /show/connections -c 'ss -pluton | response /body' +kapow route add /show/connections -c 'ss -pluton | kapow set /response/body' -kapow route add /show/mounts -c 'mount | response /body' +kapow route add /show/mounts -c 'mount | kapow set /response/body' kapow route add /tail/dmesg - <<-'EOF' - response /headers/Content-Type text/plain - dmesg -w | response /stream + kapow set /response/headers/Content-Type text/plain + dmesg -w | kapow set /response/stream EOF kapow route add /tail/journal - <<-'EOF' - response /headers/Content-Type text/plain - journalctl -f | response /stream + kapow set /response/headers/Content-Type text/plain + journalctl -f | kapow set /response/stream EOF diff --git a/poc/examples/pandoc/pandoc.pow b/poc/examples/pandoc/pandoc.pow index 22af342..fb245c5 100755 --- a/poc/examples/pandoc/pandoc.pow +++ b/poc/examples/pandoc/pandoc.pow @@ -17,10 +17,10 @@ # kapow route add -X POST --entrypoint '/bin/zsh -c' '/convert/{from}/{to}' - <<-'EOF' - pandoc --from=$(request /matches/from) \ - --to=$(request /matches/to) \ - --output=>(response /body) \ - =(request /body) + pandoc --from=$(kapow get /request/matches/from) \ + --to=$(kapow get /request/matches/to) \ + --output=>(kapow set /response/body) \ + =(kapow get /request/body) EOF -kapow route add -X GET '/formats/input' -c 'pandoc --list-input-formats | response /body' -kapow route add -X GET '/formats/output' -c 'pandoc --list-output-formats | grep -v pdf | response /body' +kapow route add -X GET '/formats/input' -c 'pandoc --list-input-formats | kapow set /response/body' +kapow route add -X GET '/formats/output' -c 'pandoc --list-output-formats | grep -v pdf | kapow set /response/body' diff --git a/poc/examples/pdfeditor/pdfeditor.pow b/poc/examples/pdfeditor/pdfeditor.pow index 00db1da..06eb815 100755 --- a/poc/examples/pdfeditor/pdfeditor.pow +++ b/poc/examples/pdfeditor/pdfeditor.pow @@ -17,4 +17,4 @@ # kapow route add -X POST --entrypoint ./topdf '/editor/pdf' -kapow route add / -c 'response /headers/Content-Type text/html && response /body < pdfeditor.html' +kapow route add / -c 'kapow set /response/headers/Content-Type text/html && kapow set /response/body < pdfeditor.html' diff --git a/poc/examples/pdfeditor/topdf b/poc/examples/pdfeditor/topdf index d05b2dc..8e2dddc 100755 --- a/poc/examples/pdfeditor/topdf +++ b/poc/examples/pdfeditor/topdf @@ -17,12 +17,12 @@ # tmpfile=$(mktemp --suffix=.pdf) -pandoc --from=$(request /form/from) --to=pdf --output=${tmpfile} -t latex =(request /form/content) +pandoc --from=$(kapow get /request/form/from) --to=pdf --output=${tmpfile} -t latex =(kapow get /request/form/content) if [ $? -eq 0 ]; then - response /headers/Content-Type application/pdf - response /body < ${tmpfile} - response /status 200 + kapow set /response/headers/Content-Type application/pdf + kapow set /response/body < ${tmpfile} + kapow set /response/status 200 else - response /status 500 + kapow set /response/status 500 fi rm -f ${tmpfile} diff --git a/poc/examples/torrent.pow b/poc/examples/torrent.pow index c58ff45..ee31e7d 100755 --- a/poc/examples/torrent.pow +++ b/poc/examples/torrent.pow @@ -17,8 +17,8 @@ # kapow route add / - <<-'EOF' - response /headers/Content-Type text/html - response /body <<-HTML + kapow set /response/headers/Content-Type text/html + kapow set /response/body <<-HTML Add me to your bookmarks! @@ -28,16 +28,16 @@ kapow route add / - <<-'EOF' EOF kapow route add /save/magnet -e '/bin/bash -c' - <<-'EOF' - link=$(request /params/link) - [ -z $link ] && response /status 400 && exit 0 + link=$(kapow get /request/params/link) + [ -z $link ] && kapow set /response/status 400 && exit 0 watch_folder=/tmp cd $watch_folder [[ "$link" =~ xt=urn:btih:([^&/]+) ]] || exit; echo "d10:magnet-uri${#link}:${link}e" > "meta-${BASH_REMATCH[1]}.torrent" - response /status 302 - response /headers/Location /torrent/list + kapow set /response/status 302 + kapow set /response/headers/Location /torrent/list EOF -kapow route add /torrent/list -c 'response /body "Not Implemented Yet"' +kapow route add /torrent/list -c 'kapow set /response/body "Not Implemented Yet"' From f6ce9935a51858fdcdecd6f13f45606f1cb9fae6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roberto=20Abdelkader=20Mart=C3=ADnez=20P=C3=A9rez?= Date: Thu, 5 Sep 2019 08:32:34 +0200 Subject: [PATCH 2/5] Adapt bin/static to new binary structure --- poc/bin/static | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/poc/bin/static b/poc/bin/static index 5698741..ebe59c4 100755 --- a/poc/bin/static +++ b/poc/bin/static @@ -5,17 +5,17 @@ PATHNAME="$2" REAL="$(realpath --relative-base="$BASE" "$BASE/$PATHNAME")" if [ ! -f "$BASE/$PATHNAME" ]; then - response /status 404 + kapow set /response/status 404 exit else case $REAL in "/"*) - response /status 403 + kapow set /response/status 403 exit ;; *) - response /status 200 - response /headers/Content-Type "$(python -m mimetypes "$BASE/$REAL" | awk '/type:/ {print $2; exit 0}; !/type:/ {print "application/octet-stream"}')" - response /body < "$BASE/$REAL" + kapow set /response/status 200 + kapow set /response/headers/Content-Type "$(python -m mimetypes "$BASE/$REAL" | awk '/type:/ {print $2; exit 0}; !/type:/ {print "application/octet-stream"}')" + kapow set /response/body < "$BASE/$REAL" esac fi From 58a800e5e960829b03e584c1fe9bc00b18a40b52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roberto=20Abdelkader=20Mart=C3=ADnez=20P=C3=A9rez?= Date: Thu, 5 Sep 2019 08:40:59 +0200 Subject: [PATCH 3/5] Replace request/response with new commands --- doc/readme.rst | 8 +++--- poc/setup.cfg | 2 -- spec/README.md | 28 +++++++++---------- .../append/error_unprocessable.feature | 4 +-- .../features/control/append/success.feature | 12 ++++---- .../control/delete/list_order.feature | 26 ++++++++--------- .../features/control/delete/success.feature | 4 +-- .../test/features/control/get/success.feature | 6 ++-- .../control/insert/error_malformed.feature | 2 +- .../insert/error_unprocessable.feature | 6 ++-- .../control/insert/list_order.feature | 28 +++++++++---------- .../features/control/insert/success.feature | 12 ++++---- .../features/control/list/success.feature | 8 +++--- 13 files changed, 72 insertions(+), 74 deletions(-) diff --git a/doc/readme.rst b/doc/readme.rst index 0835521..15a761e 100644 --- a/doc/readme.rst +++ b/doc/readme.rst @@ -34,7 +34,7 @@ that contains: .. code-block:: bash kapow route add /backups \ - -c 'cloudx storage ls /backups | grep $(request /params/query) | response /body' + -c 'cloudx storage ls /backups | grep $(kapow get /request/params/query) | kapow set /response/body' and execute it in the host with the command: @@ -53,7 +53,7 @@ First you must create a pow file named ``hello.pow`` with the following contents .. code-block:: bash - kapow route add /greet -c "echo 'hello world' | response /body" + kapow route add /greet -c "echo 'hello world' | kapow set /response/body" then, you must execute: @@ -75,7 +75,7 @@ First you must create a pow file named ``echo.pow`` with the following contents: .. code-block:: bash - kapow route add -X POST /echo -c 'request /body | response /body' + kapow route add -X POST /echo -c 'kapow get /request/body | kapow set /response/body' then, you must execute: @@ -108,7 +108,7 @@ Let's write a ``multiline.pow`` file with the following content: kapow route add /log_and_love - <<- 'EOF' echo "[$(date)] and stuff" >> stuff.log - echo love | response /body + echo love | kapow set /response/body EOF and then we serve it with ``kapow``: diff --git a/poc/setup.cfg b/poc/setup.cfg index bc2f52f..2740a1b 100644 --- a/poc/setup.cfg +++ b/poc/setup.cfg @@ -10,8 +10,6 @@ zip_safe = True include_package_data = True scripts = bin/kapow - bin/request - bin/response bin/static install_requires = aiohttp==3.5.4 diff --git a/spec/README.md b/spec/README.md index dcaa4f9..4883b90 100644 --- a/spec/README.md +++ b/spec/README.md @@ -159,7 +159,7 @@ Content-Length: 189 "method": "GET", "url_pattern": "/hello", "entrypoint": null, - "command": "echo Hello World | response /body", + "command": "echo Hello World | kapow set /response/body", "index": 0, "id": "xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx" } @@ -194,7 +194,7 @@ field must be a json scaped string. "method": "GET", "url_pattern": "/hello", "entrypoint": null, - "command": "echo Hello World | response /body", + "command": "echo Hello World | kapow set /response/body", "index": 0, "id": "xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx" }, @@ -202,7 +202,7 @@ field must be a json scaped string. "method": "POST", "url_pattern": "/bye", "entrypoint": null, - "command": "echo Bye World | response /body", + "command": "echo Bye World | kapow set /response/body", "index": 1, "id": "xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx" } @@ -227,7 +227,7 @@ A new id is created for the appended route so it can be referenced later. "method": "GET", "url_pattern": "/hello", "entrypoint": null, - "command": "echo Hello World | response /body" + "command": "echo Hello World | kapow set /response/body" } ``` * **Success Responses**: @@ -239,7 +239,7 @@ A new id is created for the appended route so it can be referenced later. "method": "GET", "url_pattern": "/hello", "entrypoint": null, - "command": "echo Hello World | response /body", + "command": "echo Hello World | kapow set /response/body", "index": 0, "id": "xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx" } @@ -254,7 +254,7 @@ A new id is created for the appended route so it can be referenced later. "method": "GET", "url_pattern": "/hello", "entrypoint": null, - "command": "echo Hello World | response /body" + "command": "echo Hello World | kapow set /response/body" } EOF ``` @@ -280,7 +280,7 @@ A new id is created for the appended route so it can be referenced later. "method": "GET", "url_pattern": "/hello", "entrypoint": null, - "command": "echo Hello World | response /body", + "command": "echo Hello World | kapow set /response/body", } ``` * **Success Responses**: @@ -292,7 +292,7 @@ A new id is created for the appended route so it can be referenced later. "method": "GET", "url_pattern": "/hello", "entrypoint": null, - "command": "echo Hello World | response /body", + "command": "echo Hello World | kapow set /response/body", "index": 0, "id": "xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx" } @@ -307,7 +307,7 @@ A new id is created for the appended route so it can be referenced later. "method": "GET", "url_pattern": "/hello", "entrypoint": null, - "command": "echo Hello World | response /body", + "command": "echo Hello World | kapow set /response/body", "index": 0 } EOF @@ -354,7 +354,7 @@ Retrieves the information about the route identified by `{id}`. "method": "GET", "url_pattern": "/hello", "entrypoint": null, - "command": "echo Hello World | response /body", + "command": "echo Hello World | kapow set /response/body", "index": 0, "id": "xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx" } @@ -673,7 +673,7 @@ Options: #### Example ```sh -kapow route add -X GET '/list/{ip}' -c 'nmap -sL $(request /matches/ip) | response /body' +kapow route add -X GET '/list/{ip}' -c 'nmap -sL $(kapow get /request/matches/ip) | kapow set /response/body' ``` ### `request` @@ -689,7 +689,7 @@ Exposes the requests' resources. #### Example ```sh # Access the body of the request -request /body +kapow get /request/body ``` @@ -706,14 +706,14 @@ Exposes the response's resources. #### Example ```sh # Write to the body of the response -echo 'Hello, World!' | response /body +echo 'Hello, World!' | kapow set /response/body ``` ## An End-to-End Example ```sh $ cat nmap.kpow -kapow route add -X GET '/list/{ip}' -c 'nmap -sL $(request /matches/ip) | response /body' +kapow route add -X GET '/list/{ip}' -c 'nmap -sL $(kapow get /request/matches/ip) | kapow set /response/body' ``` ```sh $ kapow ./nmap.kapow diff --git a/spec/test/features/control/append/error_unprocessable.feature b/spec/test/features/control/append/error_unprocessable.feature index 29eb180..128ece7 100644 --- a/spec/test/features/control/append/error_unprocessable.feature +++ b/spec/test/features/control/append/error_unprocessable.feature @@ -12,7 +12,7 @@ Feature: Kapow! server rejects requests with semantic errors. """ { "entrypoint": "/bin/sh -c", - "command": "ls -la / | response /body" + "command": "ls -la / | kapow set /response/body" } """ Then I get 422 as response code @@ -29,7 +29,7 @@ Feature: Kapow! server rejects requests with semantic errors. "method": "GET", "url_pattern": "+123--", "entrypoint": "/bin/sh -c", - "command": "ls -la / | response /body" + "command": "ls -la / | kapow set /response/body" } """ Then I get 422 as response code diff --git a/spec/test/features/control/append/success.feature b/spec/test/features/control/append/success.feature index 2f419b7..0ab5581 100644 --- a/spec/test/features/control/append/success.feature +++ b/spec/test/features/control/append/success.feature @@ -14,7 +14,7 @@ Feature: Append new routes in Kapow! server. "method": "GET", "url_pattern": "/foo", "entrypoint": "/bin/sh -c", - "command": "ls -la / | response /body" + "command": "ls -la / | kapow set /response/body" } """ Then I get 201 as response code @@ -25,7 +25,7 @@ Feature: Append new routes in Kapow! server. "method": "GET", "url_pattern": "/foo", "entrypoint": "/bin/sh -c", - "command": "ls -la / | response /body", + "command": "ls -la / | kapow set /response/body", "index": 0, "id": ANY } @@ -37,15 +37,15 @@ Feature: Append new routes in Kapow! server. Given I have a Kapow! server with the following routes: | method | url_pattern | entrypoint | command | - | GET | /foo | /bin/sh -c | ls -la / \| response /body | - | GET | /qux/{dirname} | /bin/sh -c | ls -la /request/params/dirname \| response /body | + | GET | /foo | /bin/sh -c | ls -la / \| kapow set /response/body | + | GET | /qux/{dirname} | /bin/sh -c | ls -la /request/params/dirname \| kapow set /response/body | When I append the route: """ { "method": "GET", "url_pattern": "/baz", "entrypoint": "/bin/sh -c", - "command": "ls -la /etc | response /body" + "command": "ls -la /etc | kapow set /response/body" } """ Then I get 201 as response code @@ -56,7 +56,7 @@ Feature: Append new routes in Kapow! server. "method": "GET", "url_pattern": "/baz", "entrypoint": "/bin/sh -c", - "command": "ls -la /etc | response /body", + "command": "ls -la /etc | kapow set /response/body", "index": 2, "id": ANY } diff --git a/spec/test/features/control/delete/list_order.feature b/spec/test/features/control/delete/list_order.feature index f6296c4..c2f0531 100644 --- a/spec/test/features/control/delete/list_order.feature +++ b/spec/test/features/control/delete/list_order.feature @@ -5,10 +5,10 @@ Feature: Consistent route order after a route deletion in Kapow! server. Background: Given I have a Kapow! server with the following routes: | method | url_pattern | entrypoint | command | - | GET | /foo | /bin/sh -c | ls -la / \| response /body | - | GET | /bar | /bin/sh -c | ls -la /var \| response /body | - | GET | /baz | /bin/sh -c | ls -la /etc \| response /body | - | GET | /qux/{dirname} | /bin/sh -c | ls -la /request/params/dirname \| response /body | + | GET | /foo | /bin/sh -c | ls -la / \| kapow set /response/body | + | GET | /bar | /bin/sh -c | ls -la /var \| kapow set /response/body | + | GET | /baz | /bin/sh -c | ls -la /etc \| kapow set /response/body | + | GET | /qux/{dirname} | /bin/sh -c | ls -la /request/params/dirname \| kapow set /response/body | Scenario: Removing the first route. After removing the first route the remaining ones @@ -24,7 +24,7 @@ Feature: Consistent route order after a route deletion in Kapow! server. "method": "GET", "url_pattern": "/bar", "entrypoint": "/bin/sh -c", - "command": "ls -la /var | response /body", + "command": "ls -la /var | kapow set /response/body", "index": 0, "id": ANY }, @@ -32,7 +32,7 @@ Feature: Consistent route order after a route deletion in Kapow! server. "method": "GET", "url_pattern": "/baz", "entrypoint": "/bin/sh -c", - "command": "ls -la /etc | response /body", + "command": "ls -la /etc | kapow set /response/body", "index": 1, "id": ANY }, @@ -40,7 +40,7 @@ Feature: Consistent route order after a route deletion in Kapow! server. "method": "GET", "url_pattern": "/qux/{dirname}", "entrypoint": "/bin/sh -c", - "command": "ls -la /request/params/dirname | response /body", + "command": "ls -la /request/params/dirname | kapow set /response/body", "index": 2, "id": ANY } @@ -60,7 +60,7 @@ Feature: Consistent route order after a route deletion in Kapow! server. "method": "GET", "url_pattern": "/foo", "entrypoint": "/bin/sh -c", - "command": "ls -la / | response /body", + "command": "ls -la / | kapow set /response/body", "index": 0, "id": ANY }, @@ -68,7 +68,7 @@ Feature: Consistent route order after a route deletion in Kapow! server. "method": "GET", "url_pattern": "/bar", "entrypoint": "/bin/sh -c", - "command": "ls -la /var | response /body", + "command": "ls -la /var | kapow set /response/body", "index": 1, "id": ANY }, @@ -76,7 +76,7 @@ Feature: Consistent route order after a route deletion in Kapow! server. "method": "GET", "url_pattern": "/baz", "entrypoint": "/bin/sh -c", - "command": "ls -la /etc | response /body", + "command": "ls -la /etc | kapow set /response/body", "index": 2, "id": ANY } @@ -97,7 +97,7 @@ Feature: Consistent route order after a route deletion in Kapow! server. "method": "GET", "url_pattern": "/foo", "entrypoint": "/bin/sh -c", - "command": "ls -la / | response /body", + "command": "ls -la / | kapow set /response/body", "index": 0, "id": ANY }, @@ -105,7 +105,7 @@ Feature: Consistent route order after a route deletion in Kapow! server. "method": "GET", "url_pattern": "/baz", "entrypoint": "/bin/sh -c", - "command": "ls -la /etc | response /body", + "command": "ls -la /etc | kapow set /response/body", "index": 1, "id": ANY }, @@ -113,7 +113,7 @@ Feature: Consistent route order after a route deletion in Kapow! server. "method": "GET", "url_pattern": "/qux/{dirname}", "entrypoint": "/bin/sh -c", - "command": "ls -la /request/params/dirname | response /body", + "command": "ls -la /request/params/dirname | kapow set /response/body", "index": 2, "id": ANY } diff --git a/spec/test/features/control/delete/success.feature b/spec/test/features/control/delete/success.feature index 3aafacd..8b60dac 100644 --- a/spec/test/features/control/delete/success.feature +++ b/spec/test/features/control/delete/success.feature @@ -7,8 +7,8 @@ Feature: Delete routes in Kapow! server. Given I have a Kapow! server with the following routes: | method | url_pattern | entrypoint | command | - | GET | /foo | /bin/sh -c | ls -la / \| response /body | - | GET | /qux/{dirname} | /bin/sh -c | ls -la /request/params/dirname \| response /body | + | GET | /foo | /bin/sh -c | ls -la / \| kapow set /response/body | + | GET | /qux/{dirname} | /bin/sh -c | ls -la /request/params/dirname \| kapow set /response/body | When I delete the first route Then I get 204 as response code And I get "No Content" as response reason phrase diff --git a/spec/test/features/control/get/success.feature b/spec/test/features/control/get/success.feature index c01f09f..e723fa5 100644 --- a/spec/test/features/control/get/success.feature +++ b/spec/test/features/control/get/success.feature @@ -7,8 +7,8 @@ Feature: Retrieve route details in Kapow! server. Given I have a Kapow! server with the following routes: | method | url_pattern | entrypoint | command | - | GET | /foo | /bin/sh -c | ls -la / \| response /body | - | GET | /qux/{dirname} | /bin/sh -c | ls -la /request/params/dirname \| response /body | + | GET | /foo | /bin/sh -c | ls -la / \| kapow set /response/body | + | GET | /qux/{dirname} | /bin/sh -c | ls -la /request/params/dirname \| kapow set /response/body | When I get the first route Then I get 200 as response code And I get "OK" as response reason phrase @@ -18,7 +18,7 @@ Feature: Retrieve route details in Kapow! server. "method": "GET", "url_pattern": "/foo", "entrypoint": "/bin/sh -c", - "command": "ls -la / | response /body", + "command": "ls -la / | kapow set /response/body", "index": 0, "id": ANY } diff --git a/spec/test/features/control/insert/error_malformed.feature b/spec/test/features/control/insert/error_malformed.feature index 86e9461..74ea132 100644 --- a/spec/test/features/control/insert/error_malformed.feature +++ b/spec/test/features/control/insert/error_malformed.feature @@ -15,7 +15,7 @@ Feature: Kapow! server rejects insertion requests with malformed JSON bodies. "url_pattern": /hello, "entrypoint": null "command": "echo Hello - World | response /body", + World | kapow set /response/body", "index": 0, "id": "xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx" } diff --git a/spec/test/features/control/insert/error_unprocessable.feature b/spec/test/features/control/insert/error_unprocessable.feature index 97e15c7..c90898d 100644 --- a/spec/test/features/control/insert/error_unprocessable.feature +++ b/spec/test/features/control/insert/error_unprocessable.feature @@ -11,7 +11,7 @@ Feature: Kapow! server rejects insertion requests with semantic errors. """ { "entrypoint": "/bin/sh -c", - "command": "ls -la / | response /body" + "command": "ls -la / | kapow set /response/body" } """ Then I get 422 as response code @@ -28,7 +28,7 @@ Feature: Kapow! server rejects insertion requests with semantic errors. "method": "GET", "url_pattern": "+123--", "entrypoint": "/bin/sh -c", - "command": "ls -la / | response /body", + "command": "ls -la / | kapow set /response/body", "index": 0 } """ @@ -46,7 +46,7 @@ Feature: Kapow! server rejects insertion requests with semantic errors. "method": "GET", "url_pattern": "+123--", "entrypoint": "/bin/sh -c", - "command": "ls -la / | response /body", + "command": "ls -la / | kapow set /response/body", "index": -1 } """ diff --git a/spec/test/features/control/insert/list_order.feature b/spec/test/features/control/insert/list_order.feature index 5e11303..5644736 100644 --- a/spec/test/features/control/insert/list_order.feature +++ b/spec/test/features/control/insert/list_order.feature @@ -5,8 +5,8 @@ Feature: Consistent route ordering after inserting a route in a Kapow! server. Background: Given I have a Kapow! server with the following routes: | method | url_pattern | entrypoint | command | - | GET | /foo | /bin/sh -c | ls -la / \| response /body | - | GET | /qux/{dirname} | /bin/sh -c | ls -la /request/params/dirname \| response /body | + | GET | /foo | /bin/sh -c | ls -la / \| kapow set /response/body | + | GET | /qux/{dirname} | /bin/sh -c | ls -la /request/params/dirname \| kapow set /response/body | Scenario: Inserting before the first route. After inserting before the first route the previous set @@ -19,7 +19,7 @@ Feature: Consistent route ordering after inserting a route in a Kapow! server. "method": "GET", "url_pattern": "/bar", "entrypoint": "/bin/sh -c", - "command": "ls -la /var | response /body", + "command": "ls -la /var | kapow set /response/body", "index": 0 } """ @@ -31,7 +31,7 @@ Feature: Consistent route ordering after inserting a route in a Kapow! server. "method": "GET", "url_pattern": "/bar", "entrypoint": "/bin/sh -c", - "command": "ls -la /var | response /body", + "command": "ls -la /var | kapow set /response/body", "index": 0, "id": ANY }, @@ -39,7 +39,7 @@ Feature: Consistent route ordering after inserting a route in a Kapow! server. "method": "GET", "url_pattern": "/foo", "entrypoint": "/bin/sh -c", - "command": "ls -la / | response /body", + "command": "ls -la / | kapow set /response/body", "index": 1, "id": ANY }, @@ -47,7 +47,7 @@ Feature: Consistent route ordering after inserting a route in a Kapow! server. "method": "GET", "url_pattern": "/qux/{dirname}", "entrypoint": "/bin/sh -c", - "command": "ls -la /request/params/dirname | response /body", + "command": "ls -la /request/params/dirname | kapow set /response/body", "index": 2, "id": ANY } @@ -64,7 +64,7 @@ Feature: Consistent route ordering after inserting a route in a Kapow! server. "method": "GET", "url_pattern": "/bar", "entrypoint": "/bin/sh -c", - "command": "ls -la /var | response /body", + "command": "ls -la /var | kapow set /response/body", "index": 2 } """ @@ -76,7 +76,7 @@ Feature: Consistent route ordering after inserting a route in a Kapow! server. "method": "GET", "url_pattern": "/foo", "entrypoint": "/bin/sh -c", - "command": "ls -la / | response /body", + "command": "ls -la / | kapow set /response/body", "index": 0, "id": ANY }, @@ -84,7 +84,7 @@ Feature: Consistent route ordering after inserting a route in a Kapow! server. "method": "GET", "url_pattern": "/qux/{dirname}", "entrypoint": "/bin/sh -c", - "command": "ls -la /request/params/dirname | response /body", + "command": "ls -la /request/params/dirname | kapow set /response/body", "index": 1, "id": ANY }, @@ -92,7 +92,7 @@ Feature: Consistent route ordering after inserting a route in a Kapow! server. "method": "GET", "url_pattern": "/bar", "entrypoint": "/bin/sh -c", - "command": "ls -la /var | response /body", + "command": "ls -la /var | kapow set /response/body", "index": 2, "id": ANY } @@ -110,7 +110,7 @@ Feature: Consistent route ordering after inserting a route in a Kapow! server. "method": "GET", "url_pattern": "/bar", "entrypoint": "/bin/sh -c", - "command": "ls -la /var | response /body", + "command": "ls -la /var | kapow set /response/body", "index": 1 } """ @@ -122,7 +122,7 @@ Feature: Consistent route ordering after inserting a route in a Kapow! server. "method": "GET", "url_pattern": "/foo", "entrypoint": "/bin/sh -c", - "command": "ls -la / | response /body", + "command": "ls -la / | kapow set /response/body", "index": 0, "id": ANY }, @@ -130,7 +130,7 @@ Feature: Consistent route ordering after inserting a route in a Kapow! server. "method": "GET", "url_pattern": "/bar", "entrypoint": "/bin/sh -c", - "command": "ls -la /var | response /body", + "command": "ls -la /var | kapow set /response/body", "index": 1, "id": ANY }, @@ -138,7 +138,7 @@ Feature: Consistent route ordering after inserting a route in a Kapow! server. "method": "GET", "url_pattern": "/qux/{dirname}", "entrypoint": "/bin/sh -c", - "command": "ls -la /request/params/dirname | response /body", + "command": "ls -la /request/params/dirname | kapow set /response/body", "index": 2, "id": ANY } diff --git a/spec/test/features/control/insert/success.feature b/spec/test/features/control/insert/success.feature index 185308a..61ff11e 100644 --- a/spec/test/features/control/insert/success.feature +++ b/spec/test/features/control/insert/success.feature @@ -6,8 +6,8 @@ Feature: Insert new routes in Kapow! server. Background: Given I have a Kapow! server with the following routes: | method | url_pattern | entrypoint | command | - | GET | /foo | /bin/sh -c | ls -la / \| response /body | - | GET | /qux/{dirname} | /bin/sh -c | ls -la /request/params/dirname \| response /body | + | GET | /foo | /bin/sh -c | ls -la / \| kapow set /response/body | + | GET | /qux/{dirname} | /bin/sh -c | ls -la /request/params/dirname \| kapow set /response/body | Scenario: Insert a route at the beginning. A route can be inserted at the beginning of the list @@ -19,7 +19,7 @@ Feature: Insert new routes in Kapow! server. "method": "GET", "url_pattern": "/bar", "entrypoint": "/bin/sh -c", - "command": "ls -la /var | response /body", + "command": "ls -la /var | kapow set /response/body", "index": 0 } """ @@ -31,7 +31,7 @@ Feature: Insert new routes in Kapow! server. "method": "GET", "url_pattern": "/bar", "entrypoint": "/bin/sh -c", - "command": "ls -la /var | response /body", + "command": "ls -la /var | kapow set /response/body", "index": 0, "id": ANY } @@ -48,7 +48,7 @@ Feature: Insert new routes in Kapow! server. "method": "GET", "url_pattern": "/bar", "entrypoint": "/bin/sh -c", - "command": "ls -la /var | response /body", + "command": "ls -la /var | kapow set /response/body", "index": 1 } """ @@ -60,7 +60,7 @@ Feature: Insert new routes in Kapow! server. "method": "GET", "url_pattern": "/bar", "entrypoint": "/bin/sh -c", - "command": "ls -la /var | response /body", + "command": "ls -la /var | kapow set /response/body", "index": 1, "id": ANY } diff --git a/spec/test/features/control/list/success.feature b/spec/test/features/control/list/success.feature index d3c3fd4..711435f 100644 --- a/spec/test/features/control/list/success.feature +++ b/spec/test/features/control/list/success.feature @@ -22,8 +22,8 @@ Feature: Listing routes in a Kapow! server. Given I have a Kapow! server with the following routes: | method | url_pattern | entrypoint | command | - | GET | /foo | /bin/sh -c | ls -la / \| response /body | - | GET | /qux/{dirname} | /bin/sh -c | ls -la /request/params/dirname \| response /body | + | GET | /foo | /bin/sh -c | ls -la / \| kapow set /response/body | + | GET | /qux/{dirname} | /bin/sh -c | ls -la /request/params/dirname \| kapow set /response/body | When I request a routes listing Then I get 200 as response code And I get "OK" as response reason phrase @@ -34,7 +34,7 @@ Feature: Listing routes in a Kapow! server. "method": "GET", "url_pattern": "/foo", "entrypoint": "/bin/sh -c", - "command": "ls -la / | response /body", + "command": "ls -la / | kapow set /response/body", "index": 0, "id": ANY }, @@ -42,7 +42,7 @@ Feature: Listing routes in a Kapow! server. "method": "GET", "url_pattern": "/qux/{dirname}", "entrypoint": "/bin/sh -c", - "command": "ls -la /request/params/dirname | response /body", + "command": "ls -la /request/params/dirname | kapow set /response/body", "index": 1, "id": ANY } From ef90064fec4375a5b5624e522f06aa22f031d045 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roberto=20Abdelkader=20Mart=C3=ADnez=20P=C3=A9rez?= Date: Thu, 5 Sep 2019 09:13:30 +0200 Subject: [PATCH 4/5] Update README gif --- resources/kapow.gif | Bin 40685 -> 48231 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/resources/kapow.gif b/resources/kapow.gif index 7c29bccb9feebfeb2b76047c0367d35cf0591839..63b20ecc5b6792787c973be8bdcc2077fb94ae41 100644 GIT binary patch delta 31836 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�q_r6=}J$38df9%3w%91ik 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 eFct0k?Vp|SJ>62HV$h$71vK-E9567z Date: Thu, 5 Sep 2019 09:25:27 +0200 Subject: [PATCH 5/5] Update README reference to gif file to be relative --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 007c637..4c6fca0 100644 --- a/README.rst +++ b/README.rst @@ -34,7 +34,7 @@ Kapow! allows you to write a litte script that will **serve an executable as RES service**. This script will let you define how to connect HTTP and the Shell using Kapow!'s shell abstractions to the HTTP world. See it to believe: -.. image:: https://github.com/BBVA/kapow/blob/master/resources/kapow.gif?raw=true +.. image:: resources/kapow.gif?raw=true :alt: Kapow! in action