From 4c5bfc6aae6bf4e608a5e675be075bc37b910b53 Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Sat, 14 Oct 2017 18:35:58 +0300 Subject: Add: run yarns against locallly started instance, or remote --- check | 70 ++++++++++++++++++++++++++-------- yarns/900-implements.yarn | 81 +-------------------------------------- yarns/900-local.yarn | 96 +++++++++++++++++++++++++++++++++++++++++++++++ yarns/900-remote.yarn | 59 +++++++++++++++++++++++++++++ yarns/lib.py | 8 ++-- 5 files changed, 215 insertions(+), 99 deletions(-) create mode 100644 yarns/900-local.yarn create mode 100644 yarns/900-remote.yarn diff --git a/check b/check index 1cca3c1..165142b 100755 --- a/check +++ b/check @@ -30,37 +30,75 @@ title() } -title Unit tests -python3 -m CoverageTestRunner --ignore-missing-from=without-tests ick2 +title Remote or local yarns? +remote=no +if [ "$#" -gt 0 ] +then + case "$1" in + https://*) + remote=yes + remote_url="$1" + shift 1 + ;; + local) + remote=no + shift 1 + ;; + *) + echo "Don't understand args: $@" 1>&2 + exit 1 + ;; + esac +fi +if [ "$remote" = no ] +then + echo "Run yarns against a locally managed instance" +else + echo "Run yarns against remote instance $remote_url" +fi -if [ -e .git ] +if [ "$remote" = no ] then - sources="$(git ls-files | grep -Fvxf copyright-exceptions)" + title Unit tests + python3 -m CoverageTestRunner --ignore-missing-from=without-tests ick2 - title Copyright statements - copyright-statement-lint $sources + if [ -e .git ] + then + sources="$(git ls-files | grep -Fvxf copyright-exceptions)" - title Copyright licences - ./is-agpl3+ $sources -fi + title Copyright statements + copyright-statement-lint $sources -python_sources="ick_controller.py worker_manager ick2" + title Copyright licences + ./is-agpl3+ $sources + fi -title pycodestyle -pycodestyle ick2 $python_sources + python_sources="ick_controller.py worker_manager ick2" -title pylint -pylint3 --rcfile pylint.conf $python_sources + title pycodestyle + pycodestyle ick2 $python_sources + + title pylint + pylint3 --rcfile pylint.conf $python_sources +fi title Yarns -yarn yarns/*.yarn \ +if [ "$remote" = no ] +then + impl=yarns/900-local.yarn + args="" +else + impl=yarns/900-remote.yarn + args="--env ICK_URL=$remote_url" +fi +yarn yarns/[^9]*.yarn yarns/900-implements.yarn "$impl" \ --shell python2 \ --shell-arg '' \ --shell-library yarns/lib.py \ --cd-datadir \ + $args \ "$@" - title OK echo "All tests pass" diff --git a/yarns/900-implements.yarn b/yarns/900-implements.yarn index b369833..3bb694e 100644 --- a/yarns/900-implements.yarn +++ b/yarns/900-implements.yarn @@ -17,77 +17,7 @@ along with this program. If not, see . --> -# Scenario step implementations - -## Authentication setup - - IMPLEMENTS GIVEN an RSA key pair for token signing - argv = [ - os.path.join(srcdir, 'generate-rsa-key'), - 'token.key', - ] - cliapp.runcmd(argv, stdout=None, stderr=None) - - IMPLEMENTS GIVEN an access token for scopes (.+) - scopes = get_next_match() - key = open('token.key').read() - argv = [ - os.path.join(srcdir, 'create-token'), - scopes, - ] - token = cliapp.runcmd(argv, feed_stdin=key) - write('token.jwt', token) - vars['issuer'] = 'localhost' - vars['audience'] = 'localhost' - -## Controller configuration - - IMPLEMENTS GIVEN controller config uses (\S+) at the state directory - vars['statedir'] = get_next_match() - -## Start and stop the controller - - IMPLEMENTS GIVEN a running ick controller - import os, time, cliapp, yaml - vars['controller.log'] = 'ick_controller.log' - vars['gunicorn3.log'] = 'gunicorn3.log' - vars['port'] = random_free_port() - vars['url'] = 'http://127.0.0.1:{}'.format(vars['port']) - config = { - 'token-issuer': vars['issuer'], - 'token-audience': vars['audience'], - 'token-public-key': cat('token.key.pub'), - 'log': [ - { - 'filename': vars['controller.log'], - }, - ], - 'statedir': vars['statedir'], - } - env = dict(os.environ) - env['ICK_CONTROLLER_CONFIG'] = 'ick_controller.yaml' - yaml.safe_dump(config, open('ick_controller.yaml', 'w')) - argv = [ - 'gunicorn3', - '--daemon', - '--bind', '127.0.0.1:{}'.format(vars['port']), - '--log-file', vars['gunicorn3.log'], - '--log-level', 'debug', - '-p', 'pid', - 'ick_controller:app', - ] - cliapp.runcmd(argv, env=env) - vars['pid'] = int(cat('pid')) - wait_for_port(vars['port']) - - IMPLEMENTS WHEN user stops ick controller - import os, signal - os.kill(int(vars['pid']), signal.SIGTERM) - - IMPLEMENTS FINALLY stop ick controller - import os, signal - os.kill(vars['pid'], signal.SIGTERM) - +# Scenario step implementations (local and remote instances) ## HTTP requests of various kinds @@ -154,11 +84,4 @@ along with this program. If not, see . actual = obj['version'] setup_py = os.path.join(srcdir, 'setup.py') wanted = cliapp.runcmd(['python3', setup_py, '--version']).strip() - assertEqual(actual, wanted) - -## Controller state inspection - - IMPLEMENTS THEN controller state directory contains project (\S+) - name = get_next_match() - filename = os.path.join(vars['statedir'], 'projects', name + '.yaml') - assertTrue(os.path.exists(filename)) + assertTrue(wanted.startswith(actual)) diff --git a/yarns/900-local.yarn b/yarns/900-local.yarn new file mode 100644 index 0000000..2657662 --- /dev/null +++ b/yarns/900-local.yarn @@ -0,0 +1,96 @@ + + +# Scenario step implementations for locally managed ick + +## Authentication setup + + IMPLEMENTS GIVEN an RSA key pair for token signing + argv = [ + os.path.join(srcdir, 'generate-rsa-key'), + 'token.key', + ] + cliapp.runcmd(argv, stdout=None, stderr=None) + + IMPLEMENTS GIVEN an access token for scopes (.+) + scopes = get_next_match() + key = open('token.key').read() + argv = [ + os.path.join(srcdir, 'create-token'), + scopes, + ] + token = cliapp.runcmd(argv, feed_stdin=key) + write('token.jwt', token) + vars['issuer'] = 'localhost' + vars['audience'] = 'localhost' + +## Controller configuration + + IMPLEMENTS GIVEN controller config uses (\S+) at the state directory + vars['statedir'] = get_next_match() + +## Start and stop the controller + + IMPLEMENTS GIVEN a running ick controller + import os, time, cliapp, yaml + vars['controller.log'] = 'ick_controller.log' + vars['gunicorn3.log'] = 'gunicorn3.log' + vars['port'] = random_free_port() + vars['url'] = 'http://127.0.0.1:{}'.format(vars['port']) + config = { + 'token-issuer': vars['issuer'], + 'token-audience': vars['audience'], + 'token-public-key': cat('token.key.pub'), + 'log': [ + { + 'filename': vars['controller.log'], + }, + ], + 'statedir': vars['statedir'], + } + env = dict(os.environ) + env['ICK_CONTROLLER_CONFIG'] = 'ick_controller.yaml' + yaml.safe_dump(config, open('ick_controller.yaml', 'w')) + argv = [ + 'gunicorn3', + '--daemon', + '--bind', '127.0.0.1:{}'.format(vars['port']), + '--log-file', vars['gunicorn3.log'], + '--log-level', 'debug', + '-p', 'pid', + 'ick_controller:app', + ] + cliapp.runcmd(argv, env=env) + vars['pid'] = int(cat('pid')) + wait_for_port(vars['port']) + + IMPLEMENTS WHEN user stops ick controller + import os, signal + os.kill(int(vars['pid']), signal.SIGTERM) + + IMPLEMENTS FINALLY stop ick controller + import os, signal + os.kill(vars['pid'], signal.SIGTERM) + +## Controller state inspection + + IMPLEMENTS THEN controller state directory contains project (\S+) + name = get_next_match() + filename = os.path.join(vars['statedir'], 'projects', name + '.yaml') + assertTrue(os.path.exists(filename)) diff --git a/yarns/900-remote.yarn b/yarns/900-remote.yarn new file mode 100644 index 0000000..8c5c8b7 --- /dev/null +++ b/yarns/900-remote.yarn @@ -0,0 +1,59 @@ + + +# Scenario step implementations for remote Ick + +## Authentication setup + + IMPLEMENTS GIVEN an RSA key pair for token signing + vars['private_key_file'] = os.environ['ICK_PRIVATE_KEY'] + assertTrue(os.path.exists(vars['private_key_file'])) + + IMPLEMENTS GIVEN an access token for scopes (.+) + scopes = get_next_match() + key = open(vars['private_key_file']).read() + argv = [ + os.path.join(srcdir, 'create-token'), + scopes, + ] + token = cliapp.runcmd(argv, feed_stdin=key) + write('token.jwt', token) + vars['issuer'] = 'localhost' + vars['audience'] = 'localhost' + +## Controller configuration + + IMPLEMENTS GIVEN controller config uses (\S+) at the state directory + vars['statedir'] = get_next_match() + +## Start and stop the controller + + IMPLEMENTS GIVEN a running ick controller + vars['url'] = os.environ['ICK_URL'] + + IMPLEMENTS WHEN user stops ick controller + pass + + IMPLEMENTS FINALLY stop ick controller + pass + +## Controller state inspection + + IMPLEMENTS THEN controller state directory contains project (\S+) + pass diff --git a/yarns/lib.py b/yarns/lib.py index 960f2f7..0b95a81 100644 --- a/yarns/lib.py +++ b/yarns/lib.py @@ -79,7 +79,7 @@ def get(url, token): headers = { 'Authorization': 'Bearer {}'.format(token), } - r = requests.get(url, headers=headers) + r = requests.get(url, headers=headers, verify=False) return r.status_code, r.headers['Content-Type'], r.text @@ -88,7 +88,7 @@ def post(url, body_text, token): 'Authorization': 'Bearer {}'.format(token), 'Content-Type': 'application/json', } - r = requests.post(url, headers=headers, data=body_text) + r = requests.post(url, headers=headers, data=body_text, verify=False) return r.status_code, r.headers['Content-Type'], r.text @@ -97,7 +97,7 @@ def put(url, body_text, token): 'Authorization': 'Bearer {}'.format(token), 'Content-Type': 'application/json', } - r = requests.put(url, headers=headers, data=body_text) + r = requests.put(url, headers=headers, data=body_text, verify=False) return r.status_code, r.headers['Content-Type'], r.text @@ -105,5 +105,5 @@ def delete(url, token): headers = { 'Authorization': 'Bearer {}'.format(token), } - r = requests.delete(url, headers=headers) + r = requests.delete(url, headers=headers, verify=False) return r.status_code, r.headers['Content-Type'], r.text -- cgit v1.2.1