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 --- yarns/900-implements.yarn | 81 +-------------------------------------- yarns/900-local.yarn | 96 +++++++++++++++++++++++++++++++++++++++++++++++ yarns/900-remote.yarn | 59 +++++++++++++++++++++++++++++ yarns/lib.py | 8 ++-- 4 files changed, 161 insertions(+), 83 deletions(-) create mode 100644 yarns/900-local.yarn create mode 100644 yarns/900-remote.yarn (limited to 'yarns') 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