diff options
author | Lars Wirzenius <liw@liw.fi> | 2017-11-05 18:30:56 +0100 |
---|---|---|
committer | Lars Wirzenius <liw@liw.fi> | 2017-11-05 18:30:56 +0100 |
commit | d14f7d3f2c26201cdcf2e73accc079d51b935651 (patch) | |
tree | 913bc0fdaf074598c872e53c7d7a62aec5038aef | |
parent | 860bca1a4b14b8a8fbe4bc40f8680b63263b4aa0 (diff) | |
download | ick2-d14f7d3f2c26201cdcf2e73accc079d51b935651.tar.gz |
Add: WorkAPI.get_work
-rw-r--r-- | ick2/controllerapi.py | 33 | ||||
-rw-r--r-- | ick2/controllerapi_tests.py | 18 |
2 files changed, 50 insertions, 1 deletions
diff --git a/ick2/controllerapi.py b/ick2/controllerapi.py index 9ac4bcc..91d68b6 100644 --- a/ick2/controllerapi.py +++ b/ick2/controllerapi.py @@ -303,9 +303,40 @@ class WorkAPI(APIbase): super().__init__(state) self._projects = projects self._workers = workers + self._type_name = 'workers' def get_work(self, worker): - return {} + worker_state = self._state.get_resource(self._type_name, worker) + if not worker_state.get('doing'): + project, pipeline = self._pick_triggered_pipeline() + if project is None: + doing = {} + else: + pipeline['status'] = 'building' + self._projects.update(project, project['project']) + + doing = { + 'project': project['project'], + 'pipeline': pipeline['name'], + 'step': pipeline['actions'][0], + 'current_step': 0, + } + + worker_state = { + 'worker': worker, + 'doing': doing, + } + self._state.update_resource(self._type_name, worker, worker_state) + + return worker_state['doing'] + + def _pick_triggered_pipeline(self): + projects = self._projects.list() + for project in projects['projects']: + for pipeline in project['pipelines']: + if pipeline.get('status') == 'triggered': + return project, pipeline + return None, None def create(self, *args, **kwargs): # pragma: no cover pass diff --git a/ick2/controllerapi_tests.py b/ick2/controllerapi_tests.py index f3d0d08..7ad3344 100644 --- a/ick2/controllerapi_tests.py +++ b/ick2/controllerapi_tests.py @@ -276,3 +276,21 @@ class WorkAPITests(unittest.TestCase): workers = self.create_worker_api() work = self.create_work_api(projects, workers) self.assertEqual(work.get_work('asterix'), {}) + + def test_worker_gets_work_when_a_pipeline_is_triggered(self): + projects = self.create_project_api() + workers = self.create_worker_api() + work = self.create_work_api(projects, workers) + projects.set_pipeline('triggered', 'foo', 'build') + expected = { + 'project': 'foo', + 'pipeline': 'build', + 'step': { + 'shell': 'step-1', + }, + 'current_step': 0, + } + self.assertEqual(work.get_work('asterix'), expected) + + # Check we get the same thing twice. + self.assertEqual(work.get_work('asterix'), expected) |