summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2018-04-28 09:00:26 +0300
committerLars Wirzenius <liw@liw.fi>2018-04-28 12:51:02 +0300
commit898afe7a5b0e2505472a20431e7e43158c8a9545 (patch)
tree7dc9322fb5c732971d6c811796cd0d177427a206
parent5c09fd0b2223e54cde3470a00feade65abe9b026 (diff)
downloadick2-898afe7a5b0e2505472a20431e7e43158c8a9545.tar.gz
Add: populate-workspace action
-rw-r--r--NEWS2
-rw-r--r--ick2/actions.py80
2 files changed, 67 insertions, 15 deletions
diff --git a/NEWS b/NEWS
index 1feaca8..bd87c66 100644
--- a/NEWS
+++ b/NEWS
@@ -27,6 +27,8 @@ Version 0.49, released 2018-04-27
* The `rsync` action now deletes files from the target if they're not
in the source.
+* Add `populate_workspace` action.
+
Version 0.48, released 2018-04-27
----------------------------------
diff --git a/ick2/actions.py b/ick2/actions.py
index 9299609..a84e974 100644
--- a/ick2/actions.py
+++ b/ick2/actions.py
@@ -15,7 +15,6 @@
import base64
import json
-import logging
import os
import tempfile
@@ -99,6 +98,7 @@ class ActionFactory:
if 'action' in spec:
rules2 = {
'populate_systree': PopulateSystreeAction,
+ 'populate_workspace': PopulateWorkspaceAction,
'create_workspace': CreateWorkspaceAction,
'git': GitAction,
'rsync': RsyncAction,
@@ -270,25 +270,45 @@ class ArchiveWorkspaceAction(Action): # pragma: no cover
return exit_code
-class PopulateSystreeAction(Action): # pragma: no cover
+class PopulateActionBase(Action): # pragma: no cover
+
+ step_field = None
+ param_name = None
def encode_parameters(self, params):
pass
def execute(self, params, step):
- systree_name = step.get('systree_name')
- if not systree_name or systree_name == 'auto':
- systree_name = params['systree_name']
- logging.info(
- 'No systree name or it is "auto", using %s', systree_name)
-
env = self.get_env()
- systree_dir = env.get_systree_directory()
- make_directory_empty(env, systree_dir)
- return self.download_and_unpack_systree(systree_name, systree_dir)
- def download_and_unpack_systree(self, systree_name, dirname):
- url = self.get_blob_upload_url(systree_name)
+ name = step.get(self.step_field)
+ if not name or name == 'auto':
+ name = params.get(self.param_name)
+ if not name:
+ msg = '{} in action is {}, but no {} params\n'.format(
+ self.step_field, name, self.param_name)
+ env.report(1, msg)
+ return 1
+
+ env.report(None, 'Using {} for artifact name\n'.format(name))
+
+ dirname = self.get_unpack_directory(env)
+ make_directory_empty(env, dirname)
+ exit_code = self.download_and_unpack_artifact(name, dirname)
+ new_code = self.mangle_exit_code(exit_code)
+ env.report(
+ new_code, '{} finished (exit_code {} -> {})\n'.format(
+ str(self), exit_code, new_code))
+ return new_code
+
+ def get_unpack_directory(self, env):
+ raise NotImplementedError()
+
+ def mangle_exit_code(self, exit_code):
+ raise NotImplementedError()
+
+ def download_and_unpack_artifact(self, name, dirname):
+ url = self.get_blob_upload_url(name)
headers = self.get_authz_headers()
curl = ['curl', '-sk'] + [
'-H{}:{}'.format(name, value)
@@ -297,11 +317,41 @@ class PopulateSystreeAction(Action): # pragma: no cover
untar = ['sudo', 'tar', '-zxf', '-', '-C', dirname]
- exit_code = self._env.host_runcmd(curl, untar)
- self._env.report(exit_code, 'action finished\n')
+ env = self.get_env()
+ return env.host_runcmd(curl, untar)
+
+
+class PopulateSystreeAction(PopulateActionBase): # pragma: no cover
+
+ step_field = 'systree_name'
+ param_name = 'systree_name'
+
+ def __str__(self):
+ return 'populate-systree'
+
+ def get_unpack_directory(self, env):
+ return env.get_systree_directory()
+
+ def mangle_exit_code(self, exit_code):
return exit_code
+class PopulateWorkspaceAction(PopulateActionBase): # pragma: no cover
+
+ step_field = 'workspace_name'
+ param_name = 'workspace_name'
+
+ def __str__(self):
+ return 'populate-workspace'
+
+ def get_unpack_directory(self, env):
+ return env.get_workspace_directory()
+
+ def mangle_exit_code(self, exit_code):
+ # We never fail this action. The artifact might not exist.
+ return 0
+
+
class GitAction(Action): # pragma: no cover
def encode_parameters(self, params):