# 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 (\S+) with scopes (.+) user = get_next_match() scopes = get_next_match() key = open('token.key').read() argv = [ os.path.join(srcdir, 'create-token'), scopes, user, ] token = cliapp.runcmd(argv, feed_stdin=key) store_token(user, token) V['issuer'] = 'localhost' V['audience'] = user ## Controller configuration IMPLEMENTS GIVEN controller config uses (\S+) at the state directory V['statedir'] = get_next_match() IMPLEMENTS GIVEN controller config uses (\S+) as artifact store V['artifact_store'] = get_next_match() IMPLEMENTS GIVEN controller config uses (\S+) as authentication V['auth_url'] = get_next_match() IMPLEMENTS GIVEN controller config uses (\S+) as notify V['notify_url'] = get_next_match() assert V['notify_url'] is not None ## 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']) IMPLEMENTS WHEN user stops ick controller import os, signal os.kill(int(V['pid']), signal.SIGTERM) IMPLEMENTS FINALLY stop ick controller import os, signal os.kill(V['pid'], signal.SIGTERM) ## Controller state inspection IMPLEMENTS THEN controller state directory contains project (\S+) name = get_next_match() basename = encode_basename(name) filename = os.path.join(V['statedir'], 'projects', basename) print 'name', name print 'basename', basename print 'filename', filename assertTrue(os.path.exists(filename)) IMPLEMENTS THEN controller state directory contains worker (\S+) name = get_next_match() basename = encode_basename(name) filename = os.path.join(V['statedir'], 'workers', basename) print 'filename', filename assertTrue(os.path.exists(filename)) ## Check version result IMPLEMENTS THEN artifact store URL is (\S+) expected = get_next_match() body = V['body'] obj = json.loads(body) actual = obj['artifact_store'] assertEqual(actual, expected) IMPLEMENTS THEN authentication URL is (\S+) expected = get_next_match() body = V['body'] obj = json.loads(body) actual = obj['auth_url'] assertEqual(actual, expected) IMPLEMENTS THEN notify URL is (\S+) expected = get_next_match() body = V['body'] obj = json.loads(body) actual = obj['notify_url'] assertEqual(actual, expected) ## Start and stop artifact store IMPLEMENTS GIVEN artifact store config uses (\S+) at the blob directory 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']) IMPLEMENTS FINALLY stop artifact store import os, signal os.kill(V['bspid'], signal.SIGTERM)