summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2019-04-06 18:29:05 +0300
committerLars Wirzenius <liw@liw.fi>2019-04-06 19:16:07 +0300
commit1c6d50edf9041055f4804a1ba21a4fc5499bb0a9 (patch)
tree8d700a59ffb5f0140d8b4f16e0f7064df0739c7e
parent161cd6ead960ecf6afc05bd583718724140d6973 (diff)
downloadick2-1c6d50edf9041055f4804a1ba21a4fc5499bb0a9.tar.gz
Refactor: move tricky Python code into lib.pyHEADmaster
-rw-r--r--yarns/900-implements.yarn2
-rw-r--r--yarns/900-local.yarn82
-rw-r--r--yarns/900-remote.yarn2
-rw-r--r--yarns/lib.py84
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):