Beispiel #1
0
 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_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))
Beispiel #4
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))
Beispiel #5
0
    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_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))
Beispiel #8
0
    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_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_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)
Beispiel #11
0
    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)
Beispiel #12
0
    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_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")
Beispiel #14
0
 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")
Beispiel #15
0
 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_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)
Beispiel #17
0
    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_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)
Beispiel #19
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)
Beispiel #20
0
    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_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)