From e4604e40a451150d2d5f8bef9d6a9c8dfc00c6d6 Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Fri, 18 Oct 2019 10:49:33 +0300 Subject: Revert "Change: get and use tokens" This reverts commit 4dd2e14cd15ad2840cfc3636251802f8eb0bc9ba. --- ick2/apibase.py | 63 +++++++++++++++--------------------------------- ick2/logapi.py | 6 ++--- ick2/persistent.py | 36 +++++++++++++-------------- ick2/persistent_tests.py | 44 ++++++++++----------------------- ick2/projectapi.py | 20 +++++++-------- ick2/trans.py | 40 +++++++++++++++--------------- ick2/workapi.py | 24 +++++++++--------- 7 files changed, 94 insertions(+), 139 deletions(-) diff --git a/ick2/apibase.py b/ick2/apibase.py index e18ebe2..f330eae 100644 --- a/ick2/apibase.py +++ b/ick2/apibase.py @@ -16,15 +16,10 @@ import ick2 -import bottle - - class APIbase: def __init__(self, state): - assert (state is None or - isinstance(state, ick2.MemoryPersistentState) or - isinstance(state, ick2.MuckPersistentState)) + assert state is None or isinstance(state, ick2.MemoryPersistentState) self._trans = ick2.TransactionalState(state) def get_routes(self, path): @@ -57,26 +52,12 @@ class APIbase: }, ] - # This is quite ugly. The apifw library we use as a wrapper around - # Bottle should be doing this. But due to stupid reasons, it's - # awkward to modify that library, for now, and anyway all of this - # is going to be rewritten in a better programming language - # eventually, so we take the past of least effort and increase - # technical debt. - def _get_token(self): - v = bottle.request.get_header('Authorization', '') - prefix = 'Bearer ' - if v.startswith(prefix): - return v[len(prefix):] - return None - def GET(self, callback): def wrapper(content_type, body, **kwargs): ick2.log.log( 'trace', msg_text='GET called', kwargs=kwargs, content_type=content_type, body=body) try: - kwargs['token'] = self._get_token() if 'raw_uri_path' in kwargs: del kwargs['raw_uri_path'] body = callback(**kwargs) @@ -101,7 +82,6 @@ class APIbase: 'trace', msg_text='POST called', kwargs=kwargs, content_type=content_type, body=body) try: - kwargs['token'] = self._get_token() body = callback(body, **kwargs) except ick2.ExistsAlready as e: ick2.log.log('error', msg_text=str(e), kwargs=kwargs) @@ -114,7 +94,6 @@ class APIbase: ick2.log.log( 'trace', msg_text='PUT called', kwargs=kwargs, content_type=content_type, body=body) - kwargs['token'] = self._get_token() if 'raw_uri_path' in kwargs: del kwargs['raw_uri_path'] try: @@ -133,7 +112,6 @@ class APIbase: 'trace', msg_text='DELETE called', kwargs=kwargs, content_type=content_type, body=body) try: - kwargs['token'] = self._get_token() if 'raw_uri_path' in kwargs: del kwargs['raw_uri_path'] body = callback(**kwargs) @@ -144,19 +122,19 @@ class APIbase: return ick2.OK(body) return wrapper - def create(self, body, token=None, **kwargs): + def create(self, body, **kwargs): raise NotImplementedError() - def update(self, body, name, token=None, **kwargs): + def update(self, body, name, **kwargs): raise NotImplementedError() - def delete(self, name, token=None, **kwargs): + def delete(self, name, **kwargs): raise NotImplementedError() - def list(self, token=None, **kwargs): + def list(self, **kwargs): raise NotImplementedError() - def show(self, name, token=None, **kwargs): + def show(self, name, **kwargs): raise NotImplementedError() @@ -166,27 +144,26 @@ class ResourceApiBase(APIbase): super().__init__(state) self._type_name = type_name - def list(self, token=None, **kwargs): - resources = self._trans.get_resources(token, self._type_name) + def list(self, **kwargs): + resources = self._trans.get_resources(self._type_name) return { self._type_name: [r.as_dict() for r in resources] } - def show(self, name, token=None, **kwargs): - return self._trans.get_resource(token, self._type_name, name).as_dict() + def show(self, name, **kwargs): + return self._trans.get_resource(self._type_name, name).as_dict() - def create(self, body, token=None, **kwargs): + def create(self, body, **kwargs): ick2.log.log( 'trace', msg_text='create resource', - resource_type=self._type_name, - body=body, token=token, kwargs=kwargs) + resource_type=self._type_name, body=body, kwargs=kwargs) as_dict = self.mangle_new_resource(body) rid = self.get_resource_name(as_dict) - if self._trans.has_resource(token, self._type_name, rid): + if self._trans.has_resource(self._type_name, rid): raise ick2.ExistsAlready(rid) - with self._trans.new(token, self._type_name, rid) as resource: + with self._trans.new(self._type_name, rid) as resource: resource.from_dict(as_dict) return as_dict @@ -197,12 +174,12 @@ class ResourceApiBase(APIbase): def get_resource_name(self, resource): # pragma: no cover raise NotImplementedError() - def update(self, body, name, token=None, **kwargs): + def update(self, body, name, **kwargs): rid = self.get_resource_name(body) - if not self._trans.has_resource(token, self._type_name, rid): + if not self._trans.has_resource(self._type_name, rid): raise ick2.NotFound(kind=self._type_name, rid=rid) - with self._trans.modify(token, self._type_name, rid) as resource: + with self._trans.modify(self._type_name, rid) as resource: as_dict = self.mangle_updated_resource(resource.as_dict(), body) resource.from_dict(as_dict) @@ -211,7 +188,7 @@ class ResourceApiBase(APIbase): def mangle_updated_resource(self, old, new): # pragma: no cover return new - def delete(self, name, token=None, **kwargs): - if not self._trans.has_resource(token, self._type_name, name): + def delete(self, name, **kwargs): + if not self._trans.has_resource(self._type_name, name): raise ick2.NotFound(kind=self._type_name, rid=name) - self._trans.remove_resource(token, self._type_name, name) + self._trans.remove_resource(self._type_name, name) diff --git a/ick2/logapi.py b/ick2/logapi.py index 16aeaef..c43e8a6 100644 --- a/ick2/logapi.py +++ b/ick2/logapi.py @@ -1,4 +1,4 @@ -# Copyright (C) 2017-2019 Lars Wirzenius +# Copyright (C) 2017-2018 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 @@ -59,7 +59,7 @@ class LogAPI(ick2.ResourceApiBase): # pragma: no cover def update(self, body, name, **kwargs): # pragma: no cover raise ick2.MethodNotAllowed('Updating builds directly is not allowed') - def show(self, name, token=None, **kwargs): - log = self._trans.get_resource(token, 'log', str(name)) + def show(self, name, **kwargs): + log = self._trans.get_resource('log', str(name)) ick2.log.log('info', msg_text='Returning log', log=log.as_dict()) return log['log'] diff --git a/ick2/persistent.py b/ick2/persistent.py index d865207..31473ba 100644 --- a/ick2/persistent.py +++ b/ick2/persistent.py @@ -27,25 +27,25 @@ import ick2 class PersistentStateInterface: # pragma: no cover - def get_resource_ids(self, token, kind): + def get_resource_ids(self, kind): raise NotImplementedError() - def has_resource(self, token, kind, rid): + def has_resource(self, kind, rid): raise NotImplementedError() - def get_resource(self, token, kind, rid): + def get_resource(self, kind, rid): raise NotImplementedError() - def get_resources(self, token, kind): + def get_resources(self, kind): return [ - self.get_resource(token, kind, rid) - for rid in self.get_resource_ids(token, kind) + self.get_resource(kind, rid) + for rid in self.get_resource_ids(kind) ] - def write_resource(self, token, kind, rid, resource): + def write_resource(self, kind, rid, resource): raise NotImplementedError() - def remove_resource(self, token, kind, rid): + def remove_resource(self, kind, rid): raise NotImplementedError() @@ -54,25 +54,25 @@ class MemoryPersistentState(PersistentStateInterface): def __init__(self): self._res = {} - def get_resource_ids(self, token, kind): + def get_resource_ids(self, kind): if kind not in self._res: return [] return list(self._res[kind].keys()) - def has_resource(self, token, kind, rid): + def has_resource(self, kind, rid): return kind in self._res and rid in self._res[kind] - def get_resource(self, token, kind, rid): + def get_resource(self, kind, rid): if kind not in self._res or rid not in self._res[kind]: raise ick2.NotFound(kind=kind, rid=rid) return self._res[kind][rid] - def write_resource(self, token, kind, rid, resource): + def write_resource(self, kind, rid, resource): if kind not in self._res: self._res[kind] = {} self._res[kind][rid] = resource - def remove_resource(self, token, kind, rid): + def remove_resource(self, kind, rid): if kind not in self._res or rid not in self._res[kind]: raise ick2.NotFound(kind=kind, rid=rid) del self._res[kind][rid] @@ -83,25 +83,25 @@ class MuckPersistentState(PersistentStateInterface): def __init__(self): self._res = {} - def get_resource_ids(self, token, kind): + def get_resource_ids(self, kind): if kind not in self._res: return [] return list(self._res[kind].keys()) - def has_resource(self, token, kind, rid): + def has_resource(self, kind, rid): return kind in self._res and rid in self._res[kind] - def get_resource(self, token, kind, rid): + def get_resource(self, kind, rid): if kind not in self._res or rid not in self._res[kind]: raise ick2.NotFound(kind=kind, rid=rid) return self._res[kind][rid] - def write_resource(self, token, kind, rid, resource): + def write_resource(self, kind, rid, resource): if kind not in self._res: self._res[kind] = {} self._res[kind][rid] = resource - def remove_resource(self, token, kind, rid): + def remove_resource(self, kind, rid): if kind not in self._res or rid not in self._res[kind]: raise ick2.NotFound(kind=kind, rid=rid) del self._res[kind][rid] diff --git a/ick2/persistent_tests.py b/ick2/persistent_tests.py index 802ca8b..3d72342 100644 --- a/ick2/persistent_tests.py +++ b/ick2/persistent_tests.py @@ -24,69 +24,51 @@ import ick2 class PersistentStateTestsMixIn: - def get_token(self): - raise NotImplementedError() - def test_has_no_resources_initially(self): - token = self.get_token() - self.assertEqual(self.state.get_resource_ids(token, 'silly'), []) + self.assertEqual(self.state.get_resource_ids('silly'), []) def test_has_no_resource_initially(self): - token = self.get_token() with self.assertRaises(ick2.NotFound): - self.state.get_resource(token, 'silly', '#1') + self.state.get_resource('silly', '#1') def test_creates_resource(self): as_dict = {'foo': 'bar'} r = ick2.resource_from_dict(as_dict) + self.state.write_resource('silly', '#1', r) + self.assertTrue(self.state.has_resource('silly', '#1')) + self.assertEqual(self.state.get_resource_ids('silly'), ['#1']) - token = self.get_token() - self.state.write_resource(token, 'silly', '#1', r) - self.assertTrue(self.state.has_resource(token, 'silly', '#1')) - self.assertEqual(self.state.get_resource_ids(token, 'silly'), ['#1']) - - r2 = self.state.get_resource(token, 'silly', '#1') + r2 = self.state.get_resource('silly', '#1') self.assertTrue(isinstance(r2, ick2.Resource)) self.assertEqual(r.as_dict(), r2.as_dict()) def test_removes_resource(self): as_dict = {'foo': 'bar'} r = ick2.resource_from_dict(as_dict) - - token = self.get_token() - self.state.write_resource(token, 'silly', '#1', r) - self.state.remove_resource(token, 'silly', '#1') - self.assertFalse(self.state.has_resource(token, 'silly', '#1')) - self.assertEqual(self.state.get_resource_ids(token, 'silly'), []) + self.state.write_resource('silly', '#1', r) + self.state.remove_resource('silly', '#1') + self.assertFalse(self.state.has_resource('silly', '#1')) + self.assertEqual(self.state.get_resource_ids('silly'), []) def test_raises_error_removing_nonexistent_resource_kind(self): - token = self.get_token() with self.assertRaises(ick2.NotFound): - self.state.remove_resource(token, 'silly', '#1') + self.state.remove_resource('silly', '#1') def test_raises_error_removing_nonexistent_resource(self): as_dict = {'foo': 'bar'} r = ick2.resource_from_dict(as_dict) - - token = self.get_token() - self.state.write_resource(token, 'silly', '#1', r) + self.state.write_resource('silly', '#1', r) with self.assertRaises(ick2.NotFound): - self.state.remove_resource(token, 'silly', '#2') + self.state.remove_resource('silly', '#2') class MemoryPersistentStateTests(unittest.TestCase, PersistentStateTestsMixIn): - def get_token(self): - return 'DUMMY-TOKEN' - def setUp(self): self.state = ick2.MemoryPersistentState() class MuckPersistentStateTests(unittest.TestCase, PersistentStateTestsMixIn): - def get_token(self): - return 'DUMMY-TOKEN' - def setUp(self): self.state = ick2.MuckPersistentState() diff --git a/ick2/projectapi.py b/ick2/projectapi.py index a854716..0d9f8f5 100644 --- a/ick2/projectapi.py +++ b/ick2/projectapi.py @@ -1,4 +1,4 @@ -# Copyright (C) 2017-2019 Lars Wirzenius +# Copyright (C) 2017-2018 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 @@ -50,17 +50,16 @@ class ProjectAPI(ick2.ResourceApiBase): ] def trigger_project(self, project, **kwargs): # pragma: no cover - token = 'FIXME' - with self._trans.modify(token, 'projects', project) as p: - self._start_build(token, p) + with self._trans.modify('projects', project) as p: + self._start_build(p) return {'status': ick2.BUILD_TRIGGERED} - def _start_build(self, token, project): # pragma: no cover + def _start_build(self, project): # pragma: no cover build_no = self._pick_build_number(project) build_id = '{}/{}'.format(project['project'], build_no) ick2.log.log('info', msg_text='Starting new build', build_id=build_id) - with self._trans.new(token, 'builds', build_id) as build: + with self._trans.new('builds', build_id) as build: parameters = project.get('parameters', {}) build.from_dict({ 'build_id': build_id, @@ -82,10 +81,10 @@ class ProjectAPI(ick2.ResourceApiBase): build_obj = ick2.Build(build) graph = build_obj.get_graph() graph.append_action(create_workspace) - for action in self._get_actions(token, project): + for action in self._get_actions(project): graph.append_action(action) - with self._trans.new(token, 'log', build_id) as r: + with self._trans.new('log', build_id) as r: r.from_dict({ 'build_id': build_id, 'log': '', @@ -102,12 +101,11 @@ class ProjectAPI(ick2.ResourceApiBase): old_build_no=old_build_no, build_no=build_no) return build_no - def _get_actions(self, token, project): # pragma: no cover + def _get_actions(self, project): # pragma: no cover actions = [] params = project.get('parameters', {}) for pipeline_name in project.get('pipelines', []): - pipeline = self._trans.get_resource( - token, 'pipelines', pipeline_name) + pipeline = self._trans.get_resource('pipelines', pipeline_name) wanted = pipeline.get('parameters', []) missing = [ name diff --git a/ick2/trans.py b/ick2/trans.py index 20e38ed..c5dc22f 100644 --- a/ick2/trans.py +++ b/ick2/trans.py @@ -19,13 +19,12 @@ import ick2 class TransactionalResource: - def __init__(self, token, state, kind, rid): - self.token = token + def __init__(self, state, kind, rid): self.state = state self.kind = kind self.rid = rid - if state.has_resource(self.token, kind, rid): - self.resource = state.get_resource(self.token, kind, rid) + if state.has_resource(kind, rid): + self.resource = state.get_resource(kind, rid) else: self.resource = ick2.resource_from_dict({}) @@ -44,8 +43,7 @@ class TransactionalResource: def __exit__(self, exc_type, value, traceback): if exc_type is None: - self.state.write_resource( - self.token, self.kind, self.rid, self.resource) + self.state.write_resource(self.kind, self.rid, self.resource) class TransactionalState: @@ -53,25 +51,25 @@ class TransactionalState: def __init__(self, state): self.state = state - def new(self, token, kind, rid): - return TransactionalResource(token, self.state, kind, rid) + def new(self, kind, rid): + return TransactionalResource(self.state, kind, rid) - def modify(self, token, kind, rid): - if not self.state.has_resource(token, kind, rid): + def modify(self, kind, rid): + if not self.state.has_resource(kind, rid): raise ick2.NotFound(kind=kind, rid=rid) - return TransactionalResource(token, self.state, kind, rid) + return TransactionalResource(self.state, kind, rid) - def get_resource_ids(self, token, kind): - return self.state.get_resource_ids(token, kind) + def get_resource_ids(self, kind): + return self.state.get_resource_ids(kind) - def has_resource(self, token, kind, rid): - return self.state.has_resource(token, kind, rid) + def has_resource(self, kind, rid): + return self.state.has_resource(kind, rid) - def get_resource(self, token, kind, rid): - return self.state.get_resource(token, kind, rid) + def get_resource(self, kind, rid): + return self.state.get_resource(kind, rid) - def get_resources(self, token, kind): - return self.state.get_resources(token, kind) + def get_resources(self, kind): + return self.state.get_resources(kind) - def remove_resource(self, token, kind, rid): - self.state.remove_resource(token, kind, rid) + def remove_resource(self, kind, rid): + self.state.remove_resource(kind, rid) diff --git a/ick2/workapi.py b/ick2/workapi.py index 3eeb0fa..5179f90 100644 --- a/ick2/workapi.py +++ b/ick2/workapi.py @@ -1,4 +1,4 @@ -# Copyright (C) 2017-2019 Lars Wirzenius +# Copyright (C) 2017-2018 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 @@ -40,24 +40,24 @@ class WorkAPI(ick2.APIbase): }, ] - def get_work(self, token=None, **kwargs): + def get_work(self, **kwargs): worker_id = self._get_client_id(**kwargs) ick2.log.log( 'trace', msg_text='Worker wants work', worker_id=worker_id) - with self._trans.modify(token, 'workers', worker_id) as worker: + with self._trans.modify('workers', worker_id) as worker: doing = worker.get('doing') if doing: ick2.log.log( 'trace', msg_text='Worker already got work', doing=doing) return doing - build_id = self._pick_build(token, worker_id) + build_id = self._pick_build(worker_id) if build_id is None: ick2.log.log('trace', msg_text='No suitable build for worker') return {} - with self._trans.modify(token, 'builds', build_id) as build: - with self._trans.modify(token, 'log', build_id) as log: + with self._trans.modify('builds', build_id) as build: + with self._trans.modify('log', build_id) as log: ick2.log.log( 'trace', msg_text='Picked build for worker', build_id=build_id, build=build.as_dict()) @@ -115,7 +115,7 @@ class WorkAPI(ick2.APIbase): raise ick2.ClientIdMissing() return client_id - def _pick_build(self, token, worker): + def _pick_build(self, worker): def on_worker(build): return build.get('worker') == worker @@ -129,7 +129,7 @@ class WorkAPI(ick2.APIbase): def is_triggered(build): return status(build) == ick2.BUILD_TRIGGERED - builds = self._trans.get_resources(token, 'builds') + builds = self._trans.get_resources('builds') return (self._find_build(builds, on_worker, is_building) or self._find_build(builds, is_triggered)) @@ -139,7 +139,7 @@ class WorkAPI(ick2.APIbase): return build['build_id'] return None - def update_work(self, update, token=None, **kwargs): + def update_work(self, update, **kwargs): try: worker_id = update['worker'] build_id = update['build_id'] @@ -148,9 +148,9 @@ class WorkAPI(ick2.APIbase): except KeyError as e: # pragma: no cover raise ick2.BadUpdate(str(e)) - with self._trans.modify(token, 'workers', worker_id) as worker: - with self._trans.modify(token, 'builds', build_id) as build: - with self._trans.modify(token, 'log', build_id) as log: + with self._trans.modify('workers', worker_id) as worker: + with self._trans.modify('builds', build_id) as build: + with self._trans.modify('log', build_id) as log: doing = worker.get('doing', {}) self._check_work_update(doing, update) self._append_to_build_log(log, update) -- cgit v1.2.1