summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ick2/controllerapi.py33
-rw-r--r--ick2/controllerapi_tests.py18
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)