summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xcheck70
-rw-r--r--yarns/900-implements.yarn81
-rw-r--r--yarns/900-local.yarn96
-rw-r--r--yarns/900-remote.yarn59
-rw-r--r--yarns/lib.py8
5 files changed, 215 insertions, 99 deletions
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 <http://www.gnu.org/licenses/>.
-->
-# 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 <http://www.gnu.org/licenses/>.
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 @@
+<!--
+
+Copyright 2017 Lars Wirzenius
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+-->
+
+# 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 @@
+<!--
+
+Copyright 2017 Lars Wirzenius
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+-->
+
+# 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