From 898afe7a5b0e2505472a20431e7e43158c8a9545 Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Sat, 28 Apr 2018 09:00:26 +0300 Subject: Add: populate-workspace action --- NEWS | 2 ++ ick2/actions.py | 80 ++++++++++++++++++++++++++++++++++++++++++++++----------- 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): -- cgit v1.2.1