コード例 #1
0
ファイル: workflow.py プロジェクト: ybastide/simpleflow
    def create(
        self,
        name,
        version,
        status=REGISTERED,
        creation_date=0.0,
        deprecation_date=0.0,
        task_list=None,
        child_policy=CHILD_POLICIES.TERMINATE,
        execution_timeout="300",
        decision_tasks_timeout="300",
        description=None,
        *args,
        **kwargs
    ):
        """Creates a new remote workflow type and returns the
        created WorkflowType model instance.

        :param  name: name of the workflow type
        :type   name: String

        :param  version: workflow type version
        :type   version: String

        :param  status: workflow type status
        :type   status: swf.core.ConnectedSWFObject.{REGISTERED, DEPRECATED}

        :param   creation_date: creation date of the current WorkflowType
        :type    creation_date: float (timestamp)

        :param   deprecation_date: deprecation date of WorkflowType
        :type    deprecation_date: float (timestamp)

        :param  task_list: task list to use for scheduling decision tasks for executions
                           of this workflow type
        :type   task_list: String

        :param  child_policy: policy to use for the child workflow executions
                              when a workflow execution of this type is terminated
        :type   child_policy: CHILD_POLICIES.{TERMINATE |
                                              REQUEST_CANCEL |
                                              ABANDON}

        :param  execution_timeout: maximum duration for executions of this workflow type
        :type   execution_timeout: String

        :param  decision_tasks_timeout: maximum duration of decision tasks for this workflow type
        :type   decision_tasks_timeout: String

        :param  description: Textual description of the workflow type
        :type   description: String
        """
        workflow_type = WorkflowType(
            self.domain,
            name,
            version,
            status=status,
            creation_date=creation_date,
            deprecation_date=deprecation_date,
            task_list=task_list,
            child_policy=child_policy,
            execution_timeout=execution_timeout,
            decision_tasks_timeout=decision_tasks_timeout,
            description=description,
        )
        workflow_type.save()

        return workflow_type
コード例 #2
0
ファイル: test_workflow.py プロジェクト: ybastide/simpleflow
class TestWorkflowType(unittest.TestCase, CustomAssertions):
    def setUp(self):
        self.domain = Domain("test-domain")
        self.wt = WorkflowType(self.domain, "TestType", "1.0")

    def tearDown(self):
        pass

    def test_init_with_invalid_child_policy(self):
        with self.assertRaises(ValueError):
            WorkflowType(self.domain, "TestType", "1.0", child_policy="FAILING_POLICY")

    def test___diff_with_different_workflow_type(self):
        with patch.object(
            Layer1, "describe_workflow_type", mock_describe_workflow_type,
        ):
            workflow_type = WorkflowType(
                self.domain, "different-workflow-type", version="different-version"
            )
            diffs = workflow_type._diff()

            self.assertIsNotNone(diffs)
            self.assertLength(diffs, 6)

            self.assertTrue(hasattr(diffs[0], "attr"))
            self.assertTrue(hasattr(diffs[0], "local"))
            self.assertTrue(hasattr(diffs[0], "upstream"))

    def test_workflow_type__diff_with_identical_workflow_type(self):
        with patch.object(
            Layer1, "describe_workflow_type", mock_describe_workflow_type,
        ):
            mocked = mock_describe_workflow_type()
            workflow_type = WorkflowType(
                self.domain,
                name=mocked["typeInfo"]["workflowType"]["name"],
                version=mocked["typeInfo"]["workflowType"]["version"],
                status=mocked["typeInfo"]["status"],
                creation_date=mocked["typeInfo"]["creationDate"],
                deprecation_date=mocked["typeInfo"]["deprecationDate"],
                task_list=mocked["configuration"]["defaultTaskList"]["name"],
                child_policy=mocked["configuration"]["defaultChildPolicy"],
                execution_timeout=mocked["configuration"][
                    "defaultExecutionStartToCloseTimeout"
                ],
                decision_tasks_timeout=mocked["configuration"][
                    "defaultTaskStartToCloseTimeout"
                ],
                description=mocked["typeInfo"]["description"],
            )

            diffs = workflow_type._diff()

            self.assertLength(diffs, 0)

    def test_exists_with_existing_workflow_type(self):
        with patch.object(Layer1, "describe_workflow_type"):
            self.assertTrue(self.wt.exists)

    def test_exists_with_non_existent_workflow_type(self):
        with patch.object(self.wt.connection, "describe_workflow_type") as mock:
            mock.side_effect = SWFResponseError(
                400,
                "Bad Request:",
                {
                    "__type": "com.amazonaws.swf.base.model#UnknownResourceFault",
                    "message": "Unknown type: WorkflowType=[workflowId=blah, runId=test]",
                },
                "UnknownResourceFault",
            )

            self.assertFalse(self.wt.exists)

    # TODO: fix test when no network (probably hits real SWF endpoints)
    @unittest.skip("Skip it in case there's no network connection.")
    def test_workflow_type_exists_with_whatever_error(self):
        with patch.object(self.wt.connection, "describe_workflow_type") as mock:
            with self.assertRaises(ResponseError):
                mock.side_effect = SWFResponseError(
                    400,
                    "mocking exception",
                    {"__type": "WhateverError", "message": "Whatever"},
                )
                dummy = self.domain.exists

    def test_is_synced_with_unsynced_workflow_type(self):
        pass

    def test_is_synced_with_synced_workflow_type(self):
        pass

    def test_is_synced_over_non_existent_workflow_type(self):
        with patch.object(
            Layer1, "describe_workflow_type", mock_describe_workflow_type
        ):
            workflow_type = WorkflowType(
                self.domain,
                "non-existent-workflow-type",
                version="non-existent-version",
            )
            self.assertFalse(workflow_type.is_synced)

    def test_changes_with_different_workflow_type(self):
        with patch.object(
            Layer1, "describe_workflow_type", mock_describe_workflow_type,
        ):
            workflow_type = WorkflowType(
                self.domain,
                "different-workflow-type-type",
                version="different-workflow-type-type-version",
            )
            diffs = workflow_type.changes

            self.assertIsNotNone(diffs)
            self.assertLength(diffs, 6)

            self.assertTrue(hasattr(diffs[0], "attr"))
            self.assertTrue(hasattr(diffs[0], "local"))
            self.assertTrue(hasattr(diffs[0], "upstream"))

    def test_workflow_type_changes_with_identical_workflow_type(self):
        with patch.object(
            Layer1, "describe_workflow_type", mock_describe_workflow_type,
        ):
            mocked = mock_describe_workflow_type()
            workflow_type = WorkflowType(
                self.domain,
                name=mocked["typeInfo"]["workflowType"]["name"],
                version=mocked["typeInfo"]["workflowType"]["version"],
                status=mocked["typeInfo"]["status"],
                creation_date=mocked["typeInfo"]["creationDate"],
                deprecation_date=mocked["typeInfo"]["deprecationDate"],
                task_list=mocked["configuration"]["defaultTaskList"]["name"],
                child_policy=mocked["configuration"]["defaultChildPolicy"],
                execution_timeout=mocked["configuration"][
                    "defaultExecutionStartToCloseTimeout"
                ],
                decision_tasks_timeout=mocked["configuration"][
                    "defaultTaskStartToCloseTimeout"
                ],
                description=mocked["typeInfo"]["description"],
            )

            diffs = workflow_type.changes

            self.assertLength(diffs, 0)

    def test_save_already_existing_type(self):
        with patch.object(self.wt.connection, "register_workflow_type") as mock:
            with self.assertRaises(AlreadyExistsError):
                mock.side_effect = SWFTypeAlreadyExistsError(400, "mocked exception")
                self.wt.save()

    def test_save_with_response_error(self):
        with patch.object(self.wt.connection, "register_workflow_type") as mock:
            with self.assertRaises(DoesNotExistError):
                mock.side_effect = SWFResponseError(
                    400,
                    "mocked exception",
                    {"__type": "UnknownResourceFault", "message": "Whatever"},
                )
                self.wt.save()

    def test_delete_non_existent_type(self):
        with patch.object(self.wt.connection, "deprecate_workflow_type") as mock:
            with self.assertRaises(DoesNotExistError):
                mock.side_effect = SWFResponseError(
                    400,
                    "mocked exception",
                    {"__type": "UnknownResourceFault", "message": "Whatever"},
                )
                self.wt.delete()

    def test_delete_deprecated_type(self):
        with patch.object(self.wt.connection, "deprecate_workflow_type") as mock:
            with self.assertRaises(DoesNotExistError):
                mock.side_effect = SWFResponseError(
                    400,
                    "mocked exception",
                    {"__type": "TypeDeprecatedFault", "message": "Whatever"},
                )
                self.wt.delete()
コード例 #3
0
    def create(self, name, version,
               status=REGISTERED,
               creation_date=0.0,
               deprecation_date=0.0,
               task_list=None,
               child_policy=CHILD_POLICIES.TERMINATE,
               execution_timeout='300',
               decision_tasks_timeout='300',
               description=None,
               *args, **kwargs):
        """Creates a new remote workflow type and returns the
        created WorkflowType model instance.

        :param  name: name of the workflow type
        :type   name: String

        :param  version: workflow type version
        :type   version: String

        :param  status: workflow type status
        :type   status: swf.core.ConnectedSWFObject.{REGISTERED, DEPRECATED}

        :param   creation_date: creation date of the current WorkflowType
        :type    creation_date: float (timestamp)

        :param   deprecation_date: deprecation date of WorkflowType
        :type    deprecation_date: float (timestamp)

        :param  task_list: task list to use for scheduling decision tasks for executions
                           of this workflow type
        :type   task_list: String

        :param  child_policy: policy to use for the child workflow executions
                              when a workflow execution of this type is terminated
        :type   child_policy: CHILD_POLICIES.{TERMINATE |
                                              REQUEST_CANCEL |
                                              ABANDON}

        :param  execution_timeout: maximum duration for executions of this workflow type
        :type   execution_timeout: String

        :param  decision_tasks_timeout: maximum duration of decision tasks for this workflow type
        :type   decision_tasks_timeout: String

        :param  description: Textual description of the workflow type
        :type   description: String
        """
        workflow_type = WorkflowType(
            self.domain,
            name,
            version,
            status=status,
            creation_date=creation_date,
            deprecation_date=deprecation_date,
            task_list=task_list,
            child_policy=child_policy,
            execution_timeout=execution_timeout,
            decision_tasks_timeout=decision_tasks_timeout,
            description=description
        )
        workflow_type.save()

        return workflow_type
コード例 #4
0
class TestWorkflowType(unittest2.TestCase):
    def setUp(self):
        self.domain = Domain("test-domain")
        self.wt = WorkflowType(self.domain, "TestType", "1.0")

    def tearDown(self):
        pass

    def test_init_with_invalid_child_policy(self):
        with self.assertRaises(ValueError):
            WorkflowType(
                self.domain,
                "TestType",
                "1.0",
                child_policy="FAILING_POLICY"
            )

    def test___diff_with_different_workflow_type(self):
        with patch.object(
            Layer1,
            'describe_workflow_type',
            mock_describe_workflow_type,
        ):
            workflow_type = WorkflowType(
                self.domain,
                "different-workflow-type",
                version="different-version"
            )
            diffs = workflow_type._diff()

            self.assertIsNotNone(diffs)
            self.assertEqual(len(diffs), 6)

            self.assertTrue(hasattr(diffs[0], 'attr'))
            self.assertTrue(hasattr(diffs[0], 'local'))
            self.assertTrue(hasattr(diffs[0], 'upstream'))

    def test_workflow_type__diff_with_identical_workflow_type(self):
        with patch.object(
            Layer1,
            'describe_workflow_type',
            mock_describe_workflow_type,
        ):
            mocked = mock_describe_workflow_type()
            workflow_type = WorkflowType(
                self.domain,
                name=mocked['typeInfo']['workflowType']['name'],
                version=mocked['typeInfo']['workflowType']['version'],
                status=mocked['typeInfo']['status'],
                creation_date=mocked['typeInfo']['creationDate'],
                deprecation_date=mocked['typeInfo']['deprecationDate'],
                task_list=mocked['configuration']['defaultTaskList']['name'],
                child_policy=mocked['configuration']['defaultChildPolicy'],
                execution_timeout=mocked['configuration']['defaultExecutionStartToCloseTimeout'],
                decision_tasks_timeout=mocked['configuration']['defaultTaskStartToCloseTimeout'],
                description=mocked['typeInfo']['description'],
            )

            diffs = workflow_type._diff()

            self.assertEqual(len(diffs), 0)

    def test_exists_with_existing_workflow_type(self):
        with patch.object(Layer1, 'describe_workflow_type'):
            self.assertTrue(self.wt.exists)

    def test_exists_with_non_existent_workflow_type(self):
        with patch.object(self.wt.connection, 'describe_workflow_type') as mock:
            mock.side_effect = SWFResponseError(
                    400,
                    "Bad Request:",
                    {'__type': 'com.amazonaws.swf.base.model#UnknownResourceFault',
                     'message': 'Unknown type: WorkflowType=[workflowId=blah, runId=test]'},
                    'UnknownResourceFault',
                )

            self.assertFalse(self.wt.exists)

    def test_workflow_type_exists_with_whatever_error(self):
        with patch.object(self.wt.connection, 'describe_workflow_type') as mock:
            with self.assertRaises(ResponseError):
                mock.side_effect = SWFResponseError(
                        400,
                        "mocking exception",
                        {
                            '__type': 'WhateverError',
                            'message': 'Whatever'
                        }
                )
                self.domain.exists

    def test_is_synced_with_unsynced_workflow_type(self):
        pass

    def test_is_synced_with_synced_workflow_type(self):
        pass

    def test_is_synced_over_non_existent_workflow_type(self):
        with patch.object(
            Layer1,
            'describe_workflow_type',
            mock_describe_workflow_type
        ):
            workflow_type = WorkflowType(
                self.domain,
                "non-existent-workflow-type",
                version="non-existent-version"
            )
            self.assertFalse(workflow_type.is_synced)

    def test_changes_with_different_workflow_type(self):
        with patch.object(
            Layer1,
            'describe_workflow_type',
            mock_describe_workflow_type,
        ):
            workflow_type = WorkflowType(
                self.domain,
                "different-workflow-type-type",
                version="different-workflow-type-type-version"
            )
            diffs = workflow_type.changes

            self.assertIsNotNone(diffs)
            self.assertEqual(len(diffs), 6)

            self.assertTrue(hasattr(diffs[0], 'attr'))
            self.assertTrue(hasattr(diffs[0], 'local'))
            self.assertTrue(hasattr(diffs[0], 'upstream'))

    def test_workflow_type_changes_with_identical_workflow_type(self):
        with patch.object(
            Layer1,
            'describe_workflow_type',
            mock_describe_workflow_type,
        ):
            mocked = mock_describe_workflow_type()
            workflow_type = WorkflowType(
               self.domain,
                name=mocked['typeInfo']['workflowType']['name'],
                version=mocked['typeInfo']['workflowType']['version'],
                status=mocked['typeInfo']['status'],
                creation_date=mocked['typeInfo']['creationDate'],
                deprecation_date=mocked['typeInfo']['deprecationDate'],
                task_list=mocked['configuration']['defaultTaskList']['name'],
                child_policy=mocked['configuration']['defaultChildPolicy'],
                execution_timeout=mocked['configuration']['defaultExecutionStartToCloseTimeout'],
                decision_tasks_timeout=mocked['configuration']['defaultTaskStartToCloseTimeout'],
                description=mocked['typeInfo']['description'],
            )

            diffs = workflow_type.changes

            self.assertEqual(len(diffs), 0)


    def test_save_already_existing_type(self):
        with patch.object(self.wt.connection, 'register_workflow_type') as mock:
            with self.assertRaises(AlreadyExistsError):
                mock.side_effect = SWFTypeAlreadyExistsError(400, "mocked exception")
                self.wt.save()

    def test_save_with_response_error(self):
        with patch.object(self.wt.connection, 'register_workflow_type') as mock:
            with self.assertRaises(DoesNotExistError):
                mock.side_effect = SWFResponseError(
                    400,
                    "mocked exception",
                    {
                        "__type": "UnknownResourceFault",
                        "message": "Whatever"
                    }
                )
                self.wt.save()

    def test_delete_non_existent_type(self):
        with patch.object(self.wt.connection, 'deprecate_workflow_type') as mock:
            with self.assertRaises(DoesNotExistError):
                mock.side_effect = SWFResponseError(
                    400,
                    "mocked exception",
                    {
                        "__type": "UnknownResourceFault",
                        "message": "Whatever"
                    }
                )
                self.wt.delete()

    def test_delete_deprecated_type(self):
        with patch.object(self.wt.connection, 'deprecate_workflow_type') as mock:
            with self.assertRaises(DoesNotExistError):
                mock.side_effect = SWFResponseError(
                    400,
                    "mocked exception",
                    {
                        "__type": "TypeDeprecatedFault",
                        "message": "Whatever"
                    }
                )
                self.wt.delete()
コード例 #5
0
class TestWorkflowType(unittest.TestCase):
    def setUp(self):
        self.domain = Domain("test-domain")
        self.wt = WorkflowType(self.domain, "TestType", "1.0")

    def tearDown(self):
        pass

    def test_init_with_invalid_child_policy(self):
        with self.assertRaises(ValueError):
            WorkflowType(self.domain,
                         "TestType",
                         "1.0",
                         child_policy="FAILING_POLICY")

    def test___diff_with_different_workflow_type(self):
        with patch.object(
                Layer1,
                'describe_workflow_type',
                mock_describe_workflow_type,
        ):
            workflow_type = WorkflowType(self.domain,
                                         "different-workflow-type",
                                         version="different-version")
            diffs = workflow_type._diff()

            self.assertIsNotNone(diffs)
            self.assertEqual(len(diffs), 6)

            self.assertTrue(hasattr(diffs[0], 'attr'))
            self.assertTrue(hasattr(diffs[0], 'local'))
            self.assertTrue(hasattr(diffs[0], 'upstream'))

    def test_workflow_type__diff_with_identical_workflow_type(self):
        with patch.object(
                Layer1,
                'describe_workflow_type',
                mock_describe_workflow_type,
        ):
            mocked = mock_describe_workflow_type()
            workflow_type = WorkflowType(
                self.domain,
                name=mocked['typeInfo']['workflowType']['name'],
                version=mocked['typeInfo']['workflowType']['version'],
                status=mocked['typeInfo']['status'],
                creation_date=mocked['typeInfo']['creationDate'],
                deprecation_date=mocked['typeInfo']['deprecationDate'],
                task_list=mocked['configuration']['defaultTaskList']['name'],
                child_policy=mocked['configuration']['defaultChildPolicy'],
                execution_timeout=mocked['configuration']
                ['defaultExecutionStartToCloseTimeout'],
                decision_tasks_timeout=mocked['configuration']
                ['defaultTaskStartToCloseTimeout'],
                description=mocked['typeInfo']['description'],
            )

            diffs = workflow_type._diff()

            self.assertEqual(len(diffs), 0)

    def test_exists_with_existing_workflow_type(self):
        with patch.object(Layer1, 'describe_workflow_type'):
            self.assertTrue(self.wt.exists)

    def test_exists_with_non_existent_workflow_type(self):
        with patch.object(self.wt.connection,
                          'describe_workflow_type') as mock:
            mock.side_effect = SWFResponseError(
                400,
                "Bad Request:",
                {
                    '__type':
                    'com.amazonaws.swf.base.model#UnknownResourceFault',
                    'message':
                    'Unknown type: WorkflowType=[workflowId=blah, runId=test]'
                },
                'UnknownResourceFault',
            )

            self.assertFalse(self.wt.exists)

    def test_workflow_type_exists_with_whatever_error(self):
        with patch.object(self.wt.connection,
                          'describe_workflow_type') as mock:
            with self.assertRaises(ResponseError):
                mock.side_effect = SWFResponseError(400, "mocking exception", {
                    '__type': 'WhateverError',
                    'message': 'Whatever'
                })
                self.domain.exists

    def test_is_synced_with_unsynced_workflow_type(self):
        pass

    def test_is_synced_with_synced_workflow_type(self):
        pass

    def test_is_synced_over_non_existent_workflow_type(self):
        with patch.object(Layer1, 'describe_workflow_type',
                          mock_describe_workflow_type):
            workflow_type = WorkflowType(self.domain,
                                         "non-existent-workflow-type",
                                         version="non-existent-version")
            self.assertFalse(workflow_type.is_synced)

    def test_changes_with_different_workflow_type(self):
        with patch.object(
                Layer1,
                'describe_workflow_type',
                mock_describe_workflow_type,
        ):
            workflow_type = WorkflowType(
                self.domain,
                "different-workflow-type-type",
                version="different-workflow-type-type-version")
            diffs = workflow_type.changes

            self.assertIsNotNone(diffs)
            self.assertEqual(len(diffs), 6)

            self.assertTrue(hasattr(diffs[0], 'attr'))
            self.assertTrue(hasattr(diffs[0], 'local'))
            self.assertTrue(hasattr(diffs[0], 'upstream'))

    def test_workflow_type_changes_with_identical_workflow_type(self):
        with patch.object(
                Layer1,
                'describe_workflow_type',
                mock_describe_workflow_type,
        ):
            mocked = mock_describe_workflow_type()
            workflow_type = WorkflowType(
                self.domain,
                name=mocked['typeInfo']['workflowType']['name'],
                version=mocked['typeInfo']['workflowType']['version'],
                status=mocked['typeInfo']['status'],
                creation_date=mocked['typeInfo']['creationDate'],
                deprecation_date=mocked['typeInfo']['deprecationDate'],
                task_list=mocked['configuration']['defaultTaskList']['name'],
                child_policy=mocked['configuration']['defaultChildPolicy'],
                execution_timeout=mocked['configuration']
                ['defaultExecutionStartToCloseTimeout'],
                decision_tasks_timeout=mocked['configuration']
                ['defaultTaskStartToCloseTimeout'],
                description=mocked['typeInfo']['description'],
            )

            diffs = workflow_type.changes

            self.assertEqual(len(diffs), 0)

    def test_save_already_existing_type(self):
        with patch.object(self.wt.connection,
                          'register_workflow_type') as mock:
            with self.assertRaises(AlreadyExistsError):
                mock.side_effect = SWFTypeAlreadyExistsError(
                    400, "mocked exception")
                self.wt.save()

    def test_save_with_response_error(self):
        with patch.object(self.wt.connection,
                          'register_workflow_type') as mock:
            with self.assertRaises(DoesNotExistError):
                mock.side_effect = SWFResponseError(400, "mocked exception", {
                    "__type": "UnknownResourceFault",
                    "message": "Whatever"
                })
                self.wt.save()

    def test_delete_non_existent_type(self):
        with patch.object(self.wt.connection,
                          'deprecate_workflow_type') as mock:
            with self.assertRaises(DoesNotExistError):
                mock.side_effect = SWFResponseError(400, "mocked exception", {
                    "__type": "UnknownResourceFault",
                    "message": "Whatever"
                })
                self.wt.delete()

    def test_delete_deprecated_type(self):
        with patch.object(self.wt.connection,
                          'deprecate_workflow_type') as mock:
            with self.assertRaises(DoesNotExistError):
                mock.side_effect = SWFResponseError(400, "mocked exception", {
                    "__type": "TypeDeprecatedFault",
                    "message": "Whatever"
                })
                self.wt.delete()