diff options
-rw-r--r-- | yarns/900-implements.yarn | 2 | ||||
-rw-r--r-- | yarns/900-local.yarn | 82 | ||||
-rw-r--r-- | yarns/900-remote.yarn | 2 | ||||
-rw-r--r-- | yarns/lib.py | 84 |
4 files changed, 92 insertions, 78 deletions
diff --git a/yarns/900-implements.yarn b/yarns/900-implements.yarn index 490f46e..4dcbd8b 100644 --- a/yarns/900-implements.yarn +++ b/yarns/900-implements.yarn @@ -1,6 +1,6 @@ <!-- -Copyright 2017-2018 Lars Wirzenius +Copyright 2017-2019 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 diff --git a/yarns/900-local.yarn b/yarns/900-local.yarn index 5fa06f3..e9e8a7c 100644 --- a/yarns/900-local.yarn +++ b/yarns/900-local.yarn @@ -1,6 +1,6 @@ <!-- -Copyright 2017-2018 Lars Wirzenius +Copyright 2017-2019 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 @@ -60,52 +60,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. ## Start and stop the controller IMPLEMENTS GIVEN a running ick controller - import os, time, cliapp, yaml - V['controller.log'] = 'ick_controller.log' - V['gunicorn3.log'] = 'gunicorn3.log' - V['port'] = random_free_port() - V['url'] = 'http://127.0.0.1:{}'.format(V['port']) - assert V['auth_url'] is not None - assert V['notify_url'] is not None - config = { - 'token-issuer': V['issuer'], - 'token-audience': V['audience'], - 'token-public-key': cat('token.key.pub'), - 'log': [ - { - 'filename': V['controller.log'], - }, - ], - 'statedir': V['statedir'], - 'apt-server': 'localhost', - 'artifact-store': V['artifact_store'], - 'auth-url': V['auth_url'], - 'notify-url': V['notify_url'], - } - assert config['notify-url'] is not None - 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(V['port']), - '--log-file', V['gunicorn3.log'], - '--log-level', 'debug', - '-p', 'pid', - 'ick_controller:app', - ] - cliapp.runcmd(argv, env=env) - V['pid'] = int(cat('pid')) - wait_for_port(V['port']) + start_controller() IMPLEMENTS WHEN user stops ick controller - import os, signal - os.kill(int(V['pid']), signal.SIGTERM) + stop_controller() IMPLEMENTS FINALLY stop ick controller - import os, signal - os.kill(V['pid'], signal.SIGTERM) + stop_controller() ## Controller state inspection @@ -154,38 +115,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. V['blobdir'] = get_next_match() IMPLEMENTS GIVEN a running artifact store - import os, time, cliapp, yaml - V['artifact_store.log'] = 'artifact_store.log' - V['gunicorn3_as.log'] = 'gunicorn3_as.log' - V['bsport'] = random_free_port() - V['bsurl'] = 'http://127.0.0.1:{}'.format(V['bsport']) - config = { - 'token-issuer': V['issuer'], - 'token-audience': V['audience'], - 'token-public-key': cat('token.key.pub'), - 'log': [ - { - 'filename': V['artifact_store.log'], - }, - ], - 'blobdir': V['blobdir'], - } - env = dict(os.environ) - env['ARTIFACT_STORE_CONFIG'] = 'artifact_store.yaml' - yaml.safe_dump(config, open('artifact_store.yaml', 'w')) - argv = [ - 'gunicorn3', - '--daemon', - '--bind', '127.0.0.1:{}'.format(V['bsport']), - '--log-file', V['gunicorn3_as.log'], - '--log-level', 'debug', - '-p', 'bspid', - 'artifact_store:app', - ] - cliapp.runcmd(argv, env=env) - V['bspid'] = int(cat('bspid')) - wait_for_port(V['bsport']) + start_artifact_store() IMPLEMENTS FINALLY stop artifact store - import os, signal - os.kill(V['bspid'], signal.SIGTERM) + stop_artifact_store() diff --git a/yarns/900-remote.yarn b/yarns/900-remote.yarn index 6cc7f88..3c0443c 100644 --- a/yarns/900-remote.yarn +++ b/yarns/900-remote.yarn @@ -1,6 +1,6 @@ <!-- -Copyright 2017 Lars Wirzenius +Copyright 2017,2019 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 diff --git a/yarns/lib.py b/yarns/lib.py index 290512c..5fbd5ab 100644 --- a/yarns/lib.py +++ b/yarns/lib.py @@ -19,6 +19,7 @@ import errno import json import os import random +import signal import socket import sys import time @@ -26,6 +27,7 @@ import urllib import cliapp import requests +import yaml from yarnutils import * @@ -35,6 +37,88 @@ datadir = os.environ['DATADIR'] V = Variables(datadir) +def start_controller(): + port = V['port'] = random_free_port() + + V['url'] = 'http://127.0.0.1:{}'.format(V['port']) + + filename = 'ick_controller.yaml' + env = dict(os.environ) + env['ICK_CONTROLLER_CONFIG'] = filename + write_yaml(filename, { + 'token-issuer': V['issuer'], + 'token-audience': V['audience'], + 'token-public-key': cat('token.key.pub'), + 'log': [ + { + 'filename': 'ick_controller.log', + }, + ], + 'statedir': V['statedir'], + 'apt-server': 'localhost', + 'artifact-store': V['artifact_store'], + 'auth-url': V['auth_url'], + 'notify-url': V['notify_url'], + }) + + V['pid'] = gunicorn('ick_controller', 'app', port, env) + + +def stop_controller(): + if V['pid'] is not None: + os.kill(int(V['pid']), signal.SIGTERM) + + +def start_artifact_store(): + port = V['bsport'] = random_free_port() + + V['bsurl'] = 'http://127.0.0.1:{}'.format(V['bsport']) + + filename = 'artifact_store.yaml' + env = dict(os.environ) + env['ARTIFACT_STORE_CONFIG'] = filename + write_yaml(filename, { + 'token-issuer': V['issuer'], + 'token-audience': V['audience'], + 'token-public-key': cat('token.key.pub'), + 'log': [ + { + 'filename': 'artifact_store.log', + }, + ], + 'blobdir': V['blobdir'], + }) + + V['bspid'] = gunicorn('artifact_store', 'app', port, env) + + +def stop_artifact_store(): + if V['pid'] is not None: + os.kill(int(V['bspid']), signal.SIGTERM) + + +def write_yaml(filename, obj): + yaml.safe_dump(obj, open(filename, 'w')) + + +def gunicorn(module_name, var_name, port, env): + log_filename = '{}.gunicorn.log'.format(module_name) + pid_filename = '{}.pid'.format(module_name) + + argv = [ + 'gunicorn3', + '--daemon', + '--bind', '127.0.0.1:{}'.format(port), + '--log-file', log_filename, + '--log-level', 'debug', + '-p', pid_filename, + '{}:{}'.format(module_name, var_name), + ] + cliapp.runcmd(argv, env=env) + wait_for_port(port) + return int(cat(pid_filename)) + + def random_free_port(): MAX = 1000 for i in range(MAX): |