Example #1
0
 def test_revert_all_retry(self):
     flow = lf.Flow('flow-1', retry.Times(3, 'r1', provides='x')).add(
         utils.SaveOrderTask("task1"),
         lf.Flow('flow-2', retry.AlwaysRevertAll('r2')).add(
             utils.ConditionalTask("task2"))
     )
     engine = self._make_engine(flow)
     engine.storage.inject({'y': 2})
     utils.register_notifiers(engine, self.values)
     self.assertRaisesRegexp(RuntimeError, '^Woot', engine.run)
     self.assertEqual(engine.storage.fetch_all(), {'y': 2})
     expected = ['flow RUNNING',
                 'r1 RUNNING',
                 'r1 SUCCESS',
                 'task1 RUNNING',
                 'task1',
                 'task1 SUCCESS',
                 'r2 RUNNING',
                 'r2 SUCCESS',
                 'task2 RUNNING',
                 'task2',
                 'task2 FAILURE',
                 'task2 REVERTING',
                 u'task2 reverted(Failure: RuntimeError: Woot!)',
                 'task2 REVERTED',
                 'r2 REVERTING',
                 'r2 REVERTED',
                 'task1 REVERTING',
                 'task1 reverted(5)',
                 'task1 REVERTED',
                 'r1 REVERTING',
                 'r1 REVERTED',
                 'flow REVERTED']
     self.assertEqual(self.values, expected)
Example #2
0
    def test_resume_flow_that_should_be_retried(self):
        flow = lf.Flow('flow-1', retry.Times(3, 'r1')).add(
            utils.SaveOrderTask('t1'),
            utils.SaveOrderTask('t2')
        )
        engine = self._make_engine(flow)
        engine.compile()
        engine.prepare()
        utils.register_notifiers(engine, self.values)
        engine.storage.set_atom_intention('r1', st.RETRY)
        engine.storage.set_atom_state('r1', st.SUCCESS)
        engine.storage.set_atom_state('t1', st.REVERTED)
        engine.storage.set_atom_state('t2', st.REVERTED)

        engine.run()
        expected = ['flow RUNNING',
                    'r1 RETRYING',
                    't1 PENDING',
                    't2 PENDING',
                    'r1 RUNNING',
                    'r1 SUCCESS',
                    't1 RUNNING',
                    't1',
                    't1 SUCCESS',
                    't2 RUNNING',
                    't2',
                    't2 SUCCESS',
                    'flow SUCCESS']
        self.assertEqual(self.values, expected)
    def test_nested_flow_reverts_parent_retries(self):
        retry1 = retry.Times(3, 'r1', provides='x')
        retry2 = retry.Times(0, 'r2', provides='x2')

        flow = lf.Flow('flow-1', retry1).add(
            utils.SaveOrderTask("task1"),
            lf.Flow('flow-2', retry2).add(utils.ConditionalTask("task2")))
        engine = self._make_engine(flow)
        engine.storage.inject({'y': 2})
        utils.register_notifiers(engine, self.values)
        engine.run()
        self.assertEqual(engine.storage.fetch_all(), {'y': 2, 'x': 2, 'x2': 1})
        expected = [
            'flow RUNNING', 'r1 RUNNING', 'r1 SUCCESS', 'task1 RUNNING',
            'task1', 'task1 SUCCESS', 'r2 RUNNING', 'r2 SUCCESS',
            'task2 RUNNING', 'task2', 'task2 FAILURE', 'task2 REVERTING',
            u'task2 reverted(Failure: RuntimeError: Woot!)', 'task2 REVERTED',
            'r2 REVERTING', 'r2 REVERTED', 'task1 REVERTING',
            'task1 reverted(5)', 'task1 REVERTED', 'r1 RETRYING',
            'task1 PENDING', 'r2 PENDING', 'task2 PENDING', 'r1 RUNNING',
            'r1 SUCCESS', 'task1 RUNNING', 'task1', 'task1 SUCCESS',
            'r2 RUNNING', 'r2 SUCCESS', 'task2 RUNNING', 'task2',
            'task2 SUCCESS', 'flow SUCCESS'
        ]
        self.assertEqual(self.values, expected)
Example #4
0
 def test_states_retry_failure_linear_flow(self):
     flow = lf.Flow('flow-1', retry.Times(2, 'r1', provides='x')).add(
         utils.NastyTask("task1"),
         utils.ConditionalTask("task2")
     )
     engine = self._make_engine(flow)
     utils.register_notifiers(engine, self.values)
     engine.storage.inject({'y': 4})
     self.assertRaisesRegexp(RuntimeError, '^Gotcha', engine.run)
     self.assertEqual(engine.storage.fetch_all(), {'y': 4, 'x': 1})
     expected = ['flow RUNNING',
                 'r1 RUNNING',
                 'r1 SUCCESS',
                 'task1 RUNNING',
                 'task1 SUCCESS',
                 'task2 RUNNING',
                 'task2',
                 'task2 FAILURE',
                 'task2 REVERTING',
                 u'task2 reverted(Failure: RuntimeError: Woot!)',
                 'task2 REVERTED',
                 'task1 REVERTING',
                 'task1 FAILURE',
                 'flow FAILURE']
     self.assertEqual(self.values, expected)
 def test_states_retry_failure_parent_flow_fails(self):
     flow = lf.Flow('flow-1', retry.Times(3, 'r1', provides='x1')).add(
         utils.TaskNoRequiresNoReturns("task1"),
         lf.Flow('flow-2', retry.Times(3, 'r2', provides='x2')).add(
             utils.TaskNoRequiresNoReturns("task2"),
             utils.TaskNoRequiresNoReturns("task3")),
         utils.ConditionalTask("task4", rebind={'x': 'x1'}))
     engine = self._make_engine(flow)
     utils.register_notifiers(engine, self.values)
     engine.storage.inject({'y': 2})
     engine.run()
     self.assertEqual(engine.storage.fetch_all(), {
         'y': 2,
         'x1': 2,
         'x2': 1
     })
     expected = [
         'flow RUNNING', 'r1 RUNNING', 'r1 SUCCESS', 'task1 RUNNING',
         'task1 SUCCESS', 'r2 RUNNING', 'r2 SUCCESS', 'task2 RUNNING',
         'task2 SUCCESS', 'task3 RUNNING', 'task3 SUCCESS', 'task4 RUNNING',
         'task4', 'task4 FAILURE', 'task4 REVERTING',
         u'task4 reverted(Failure: RuntimeError: Woot!)', 'task4 REVERTED',
         'task3 REVERTING', 'task3 REVERTED', 'task2 REVERTING',
         'task2 REVERTED', 'r2 REVERTING', 'r2 REVERTED', 'task1 REVERTING',
         'task1 REVERTED', 'r1 RETRYING', 'task1 PENDING', 'r2 PENDING',
         'task2 PENDING', 'task3 PENDING', 'task4 PENDING', 'r1 RUNNING',
         'r1 SUCCESS', 'task1 RUNNING', 'task1 SUCCESS', 'r2 RUNNING',
         'r2 SUCCESS', 'task2 RUNNING', 'task2 SUCCESS', 'task3 RUNNING',
         'task3 SUCCESS', 'task4 RUNNING', 'task4', 'task4 SUCCESS',
         'flow SUCCESS'
     ]
     self.assertEqual(self.values, expected)
Example #6
0
 def test_run_task_with_notifications(self):
     flow = utils.SaveOrderTask(name='task1')
     engine = self._make_engine(flow)
     utils.register_notifiers(engine, self.values)
     engine.run()
     self.assertEqual(self.values, [
         'flow RUNNING', 'task1 RUNNING', 'task1', 'task1 SUCCESS',
         'flow SUCCESS'
     ])
 def test_run_task_with_notifications(self):
     flow = utils.SaveOrderTask(name='task1')
     engine = self._make_engine(flow)
     utils.register_notifiers(engine, self.values)
     engine.run()
     self.assertEqual(self.values,
                      ['flow RUNNING',
                       'task1 RUNNING',
                       'task1',
                       'task1 SUCCESS',
                       'flow SUCCESS'])
Example #8
0
    def test_nested_flow_reverts_parent_retries(self):
        retry1 = retry.Times(3, 'r1', provides='x')
        retry2 = retry.Times(0, 'r2', provides='x2')

        flow = lf.Flow('flow-1', retry1).add(
            utils.SaveOrderTask("task1"),
            lf.Flow('flow-2', retry2).add(utils.ConditionalTask("task2"))
        )
        engine = self._make_engine(flow)
        engine.storage.inject({'y': 2})
        utils.register_notifiers(engine, self.values)
        engine.run()
        self.assertEqual(engine.storage.fetch_all(), {'y': 2, 'x': 2, 'x2': 1})
        expected = ['flow RUNNING',
                    'r1 RUNNING',
                    'r1 SUCCESS',
                    'task1 RUNNING',
                    'task1',
                    'task1 SUCCESS',
                    'r2 RUNNING',
                    'r2 SUCCESS',
                    'task2 RUNNING',
                    'task2',
                    'task2 FAILURE',
                    'task2 REVERTING',
                    u'task2 reverted(Failure: RuntimeError: Woot!)',
                    'task2 REVERTED',
                    'r2 REVERTING',
                    'r2 REVERTED',
                    'task1 REVERTING',
                    'task1 reverted(5)',
                    'task1 REVERTED',
                    'r1 RETRYING',
                    'task1 PENDING',
                    'r2 PENDING',
                    'task2 PENDING',
                    'r1 RUNNING',
                    'r1 SUCCESS',
                    'task1 RUNNING',
                    'task1',
                    'task1 SUCCESS',
                    'r2 RUNNING',
                    'r2 SUCCESS',
                    'task2 RUNNING',
                    'task2',
                    'task2 SUCCESS',
                    'flow SUCCESS']
        self.assertEqual(self.values, expected)
 def test_states_retry_failure_linear_flow(self):
     flow = lf.Flow('flow-1', retry.Times(2, 'r1', provides='x')).add(
         utils.NastyTask("task1"), utils.ConditionalTask("task2"))
     engine = self._make_engine(flow)
     utils.register_notifiers(engine, self.values)
     engine.storage.inject({'y': 4})
     self.assertRaisesRegexp(RuntimeError, '^Gotcha', engine.run)
     self.assertEqual(engine.storage.fetch_all(), {'y': 4, 'x': 1})
     expected = [
         'flow RUNNING', 'r1 RUNNING', 'r1 SUCCESS', 'task1 RUNNING',
         'task1 SUCCESS', 'task2 RUNNING', 'task2', 'task2 FAILURE',
         'task2 REVERTING', u'task2 reverted(Failure: RuntimeError: Woot!)',
         'task2 REVERTED', 'task1 REVERTING', 'task1 FAILURE',
         'flow FAILURE'
     ]
     self.assertEqual(self.values, expected)
Example #10
0
    def test_failing_task_with_notifications(self):
        flow = utils.FailingTask('fail')
        engine = self._make_engine(flow)
        utils.register_notifiers(engine, self.values)
        expected = [
            'flow RUNNING', 'fail RUNNING', 'fail FAILURE', 'fail REVERTING',
            'fail reverted(Failure: RuntimeError: Woot!)', 'fail REVERTED',
            'flow REVERTED'
        ]
        self.assertFailuresRegexp(RuntimeError, '^Woot', engine.run)
        self.assertEqual(self.values, expected)
        self.assertEqual(engine.storage.get_flow_state(), states.REVERTED)

        self.assertFailuresRegexp(RuntimeError, '^Woot', engine.run)
        now_expected = expected + ['fail PENDING', 'flow PENDING'] + expected
        self.assertEqual(self.values, now_expected)
        self.assertEqual(engine.storage.get_flow_state(), states.REVERTED)
Example #11
0
 def test_states_retry_failure_nested_flow_fails(self):
     flow = lf.Flow('flow-1', utils.retry.AlwaysRevert('r1')).add(
         utils.TaskNoRequiresNoReturns("task1"),
         lf.Flow('flow-2', retry.Times(3, 'r2', provides='x')).add(
             utils.TaskNoRequiresNoReturns("task2"),
             utils.ConditionalTask("task3")
         ),
         utils.TaskNoRequiresNoReturns("task4")
     )
     engine = self._make_engine(flow)
     utils.register_notifiers(engine, self.values)
     engine.storage.inject({'y': 2})
     engine.run()
     self.assertEqual(engine.storage.fetch_all(), {'y': 2, 'x': 2})
     expected = ['flow RUNNING',
                 'r1 RUNNING',
                 'r1 SUCCESS',
                 'task1 RUNNING',
                 'task1 SUCCESS',
                 'r2 RUNNING',
                 'r2 SUCCESS',
                 'task2 RUNNING',
                 'task2 SUCCESS',
                 'task3 RUNNING',
                 'task3',
                 'task3 FAILURE',
                 'task3 REVERTING',
                 u'task3 reverted(Failure: RuntimeError: Woot!)',
                 'task3 REVERTED',
                 'task2 REVERTING',
                 'task2 REVERTED',
                 'r2 RETRYING',
                 'task2 PENDING',
                 'task3 PENDING',
                 'r2 RUNNING',
                 'r2 SUCCESS',
                 'task2 RUNNING',
                 'task2 SUCCESS',
                 'task3 RUNNING',
                 'task3',
                 'task3 SUCCESS',
                 'task4 RUNNING',
                 'task4 SUCCESS',
                 'flow SUCCESS']
     self.assertEqual(self.values, expected)
Example #12
0
    def test_failing_task_with_notifications(self):
        flow = utils.FailingTask('fail')
        engine = self._make_engine(flow)
        utils.register_notifiers(engine, self.values)
        expected = ['flow RUNNING',
                    'fail RUNNING',
                    'fail FAILURE',
                    'fail REVERTING',
                    'fail reverted(Failure: RuntimeError: Woot!)',
                    'fail REVERTED',
                    'flow REVERTED']
        self.assertFailuresRegexp(RuntimeError, '^Woot', engine.run)
        self.assertEqual(self.values, expected)
        self.assertEqual(engine.storage.get_flow_state(), states.REVERTED)

        self.assertFailuresRegexp(RuntimeError, '^Woot', engine.run)
        now_expected = expected + ['fail PENDING', 'flow PENDING'] + expected
        self.assertEqual(self.values, now_expected)
        self.assertEqual(engine.storage.get_flow_state(), states.REVERTED)
Example #13
0
 def test_states_retry_success_linear_flow(self):
     flow = lf.Flow('flow-1', retry.Times(4, 'r1', provides='x')).add(
         utils.SaveOrderTask("task1"), utils.ConditionalTask("task2"))
     engine = self._make_engine(flow)
     utils.register_notifiers(engine, self.values)
     engine.storage.inject({'y': 2})
     engine.run()
     self.assertEqual(engine.storage.fetch_all(), {'y': 2, 'x': 2})
     expected = [
         'flow RUNNING', 'r1 RUNNING', 'r1 SUCCESS', 'task1 RUNNING',
         'task1', 'task1 SUCCESS', 'task2 RUNNING', 'task2',
         'task2 FAILURE', 'task2 REVERTING',
         u'task2 reverted(Failure: RuntimeError: Woot!)', 'task2 REVERTED',
         'task1 REVERTING', 'task1 reverted(5)', 'task1 REVERTED',
         'r1 RETRYING', 'task1 PENDING', 'task2 PENDING', 'r1 RUNNING',
         'r1 SUCCESS', 'task1 RUNNING', 'task1', 'task1 SUCCESS',
         'task2 RUNNING', 'task2', 'task2 SUCCESS', 'flow SUCCESS'
     ]
     self.assertEqual(self.values, expected)
Example #14
0
    def test_resume_flow_that_should_be_retried(self):
        flow = lf.Flow('flow-1',
                       retry.Times(3, 'r1')).add(utils.SaveOrderTask('t1'),
                                                 utils.SaveOrderTask('t2'))
        engine = self._make_engine(flow)
        engine.compile()
        engine.prepare()
        utils.register_notifiers(engine, self.values)
        engine.storage.set_atom_intention('r1', st.RETRY)
        engine.storage.set_atom_state('r1', st.SUCCESS)
        engine.storage.set_atom_state('t1', st.REVERTED)
        engine.storage.set_atom_state('t2', st.REVERTED)

        engine.run()
        expected = [
            'flow RUNNING', 'r1 RETRYING', 't1 PENDING', 't2 PENDING',
            'r1 RUNNING', 'r1 SUCCESS', 't1 RUNNING', 't1', 't1 SUCCESS',
            't2 RUNNING', 't2', 't2 SUCCESS', 'flow SUCCESS'
        ]
        self.assertEqual(self.values, expected)
Example #15
0
 def test_revert_all_retry(self):
     flow = lf.Flow('flow-1', retry.Times(3, 'r1', provides='x')).add(
         utils.SaveOrderTask("task1"),
         lf.Flow('flow-2', retry.AlwaysRevertAll('r2')).add(
             utils.ConditionalTask("task2")))
     engine = self._make_engine(flow)
     engine.storage.inject({'y': 2})
     utils.register_notifiers(engine, self.values)
     self.assertRaisesRegexp(RuntimeError, '^Woot', engine.run)
     self.assertEqual(engine.storage.fetch_all(), {'y': 2})
     expected = [
         'flow RUNNING', 'r1 RUNNING', 'r1 SUCCESS', 'task1 RUNNING',
         'task1', 'task1 SUCCESS', 'r2 RUNNING', 'r2 SUCCESS',
         'task2 RUNNING', 'task2', 'task2 FAILURE', 'task2 REVERTING',
         u'task2 reverted(Failure: RuntimeError: Woot!)', 'task2 REVERTED',
         'r2 REVERTING', 'r2 REVERTED', 'task1 REVERTING',
         'task1 reverted(5)', 'task1 REVERTED', 'r1 REVERTING',
         'r1 REVERTED', 'flow REVERTED'
     ]
     self.assertEqual(self.values, expected)
Example #16
0
 def test_states_retry_success_linear_flow(self):
     flow = lf.Flow('flow-1', retry.Times(4, 'r1', provides='x')).add(
         utils.SaveOrderTask("task1"),
         utils.ConditionalTask("task2")
     )
     engine = self._make_engine(flow)
     utils.register_notifiers(engine, self.values)
     engine.storage.inject({'y': 2})
     engine.run()
     self.assertEqual(engine.storage.fetch_all(), {'y': 2, 'x': 2})
     expected = ['flow RUNNING',
                 'r1 RUNNING',
                 'r1 SUCCESS',
                 'task1 RUNNING',
                 'task1',
                 'task1 SUCCESS',
                 'task2 RUNNING',
                 'task2',
                 'task2 FAILURE',
                 'task2 REVERTING',
                 u'task2 reverted(Failure: RuntimeError: Woot!)',
                 'task2 REVERTED',
                 'task1 REVERTING',
                 'task1 reverted(5)',
                 'task1 REVERTED',
                 'r1 RETRYING',
                 'task1 PENDING',
                 'task2 PENDING',
                 'r1 RUNNING',
                 'r1 SUCCESS',
                 'task1 RUNNING',
                 'task1',
                 'task1 SUCCESS',
                 'task2 RUNNING',
                 'task2',
                 'task2 SUCCESS',
                 'flow SUCCESS']
     self.assertEqual(self.values, expected)