def test_runs_subaction(self): pipe = Pipeline() pipe.add_action(self.sub0) pipe.add_action(self.sub1) pipe.run_actions(None) self.assertTrue(self.sub0.ran) self.assertTrue(self.sub1.ran) self.assertNotEqual(self.sub0.elapsed_time, 0) self.assertNotEqual(self.sub1.elapsed_time, 0)
def test_keep_connection(self): class KeepConnection(Action): def __init__(self): super(KeepConnection, self).__init__() self.name = "keep-connection" def run(self, connection, args=None): pass pipe = Pipeline() pipe.add_action(KeepConnection()) conn = object() self.assertIs(conn, pipe.run_actions(conn))
def test_change_connection(self): class MakeNewConnection(Action): def __init__(self): super(MakeNewConnection, self).__init__() self.name = "make-new-connection" def run(self, connection, args=None): new_connection = object() return new_connection pipe = Pipeline() pipe.add_action(MakeNewConnection()) conn = object() self.assertIsNot(conn, pipe.run_actions(conn))
def test_composite_action_aggregates_errors_from_sub_actions(self): sub1 = Action() sub1.__errors__ = [1] sub2 = Action() sub2.name = "sub2" sub2.__errors__ = [2] pipe = Pipeline() self.assertRaises(RuntimeError, pipe.add_action, sub1) sub1.name = "sub1" pipe.add_action(sub1) pipe.add_action(sub2) self.assertEqual([1, 2], pipe.errors)
def test_create_internal_pipeline(self): action = Action() action.name = "internal_pipe" action.description = "test action only" action.summary = "starter" pipe = Pipeline() pipe.add_action(action) self.assertEqual(len(pipe.children[pipe]), 1) self.assertEqual(action.level, "1") action = Action() action.name = "child_action" action.summary = "child" action.description = "action implementing an internal pipe" with self.assertRaises(RuntimeError): Pipeline(action) pipe.add_action(action) self.assertEqual(action.level, "2") self.assertEqual(len(pipe.children[pipe]), 2) # a formal RetryAction would contain a pre-built pipeline which can be inserted directly retry_pipe = Pipeline(action) action = Action() action.name = "inside_action" action.description = "action inside the internal pipe" action.summary = "child" retry_pipe.add_action(action) self.assertEqual(len(retry_pipe.children[retry_pipe]), 1) self.assertEqual(action.level, "2.1")
def test_prepare(self): class PrepareAction(Action): def __init__(self, pipeline): self.called = False super(PrepareAction, self).__init__() self.name = "prepare" def prepare(self): self.called = True pipe = Pipeline() prepare = PrepareAction(pipe) pipe.add_action(prepare) pipe.prepare_actions() self.assertTrue(prepare.called)
def test_post_process(self): class PostProcess(Action): def __init__(self, pipeline): self.called = False super(PostProcess, self).__init__() self.name = "post-process" def post_process(self): self.called = True pipe = Pipeline() post_process = PostProcess(pipe) pipe.add_action(post_process) pipe.post_process_actions() self.assertTrue(post_process.called)
def test_add_action_to_pipeline(self): action = Action() action.name = "test-action" action.description = "test action only" action.summary = "starter" self.assertEqual(action.description, "test action only") self.assertEqual(action.summary, "starter") # action needs to be added to a top level pipe first with self.assertRaises(RuntimeError): Pipeline(action) pipe = Pipeline() with self.assertRaises(RuntimeError): pipe.add_action(None) with self.assertRaises(RuntimeError): pipe.add_action(pipe) pipe.add_action(action) self.assertNotEqual(pipe.children, {pipe: []}) self.assertEqual(pipe.children, {pipe: [action]}) self.assertEqual(action.level, "1") try: simplejson.loads(pipe.describe()) except: self.assertFalse(0)
def test_list_of_subcommands(self): pipe = Pipeline() pipe.add_action(self.sub0) pipe.add_action(self.sub1) self.assertIs(pipe.actions[0], self.sub0) self.assertIs(pipe.actions[1], self.sub1)
def test_complex_pipeline(self): action = Action() action.name = "starter_action" action.description = "test action only" action.summary = "starter" pipe = Pipeline() pipe.add_action(action) self.assertEqual(action.level, "1") action = Action() action.name = "pipe_action" action.description = "action implementing an internal pipe" action.summary = "child" pipe.add_action(action) self.assertEqual(action.level, "2") # a formal RetryAction would contain a pre-built pipeline which can be inserted directly retry_pipe = Pipeline(action) action = Action() action.name = "child_action" action.description = "action inside the internal pipe" action.summary = "child" retry_pipe.add_action(action) self.assertEqual(action.level, "2.1") action = Action() action.name = "second-child-action" action.description = "second action inside the internal pipe" action.summary = "child2" retry_pipe.add_action(action) self.assertEqual(action.level, "2.2") action = Action() action.name = "baby_action" action.description = "action implementing an internal pipe" action.summary = "baby" retry_pipe.add_action(action) self.assertEqual(action.level, "2.3") inner_pipe = Pipeline(action) action = Action() action.name = "single_action" action.description = "single line action" action.summary = "single" inner_pipe.add_action(action) self.assertEqual(action.level, "2.3.1") action = Action() action.name = "step_out" action.description = "step out of inner pipe" action.summary = "brother" retry_pipe.add_action(action) self.assertEqual(action.level, "2.4") action = Action() action.name = "top-level" action.description = "top level" action.summary = "action" pipe.add_action(action) self.assertEqual(action.level, "3") self.assertEqual(len(pipe.describe().values()), 8)
def __init__(self, parent): super(DeployImage, self).__init__(parent) self.action = DeployImageAction() self.action.job = self.job parent.add_action(self.action) internal_pipeline = Pipeline(parent=self.action, job=self.job) internal_pipeline.add_action(DownloaderAction()) internal_pipeline.add_action(ChecksumAction()) internal_pipeline.add_action(MountAction()) internal_pipeline.add_action(CustomisationAction()) for action_params in self.job.parameters['actions']: if 'test' in action_params: # FIXME: does it matter if testdef_action runs before overlay? testdef_action = TestDefinitionAction() testdef_action.parameters = action_params internal_pipeline.add_action(testdef_action) if 'target_group' in self.job.parameters: internal_pipeline.add_action(MultinodeOverlayAction()) if 'lmp_module' in self.job.parameters: internal_pipeline.add_action(LMPOverlayAction()) internal_pipeline.add_action(OverlayAction()) internal_pipeline.add_action(UnmountAction())
def test_create_empty_pipeline(self): pipe = Pipeline() self.assertEqual(pipe.children, {pipe: []})