def setUp(self):

        self.mock_backend = DotDict()
        self.mock_backend['create_definition'] = Mock()
        self.mock_backend['read_definition'] = Mock()
        self.mock_backend['read_definition_by_name'] = Mock()
        self.mock_backend['update_definition'] = Mock()
        self.mock_backend['delete_definition'] = Mock()
        self.mock_backend['create'] = Mock()
        self.mock_backend['schedule'] = Mock()
        self.mock_backend['read_process'] = Mock()
        self.mock_backend['list'] = Mock()
        self.mock_backend['cancel'] = Mock()
        self.mock_backend['set_system_boot'] = Mock()

        self.mock_dashi = DotDict()
        self.mock_dashi['handle'] = Mock()

        self.mock_pyon_dashi_exc_map = {
            NotFound: FakeDashiNotFoundError,
            BadRequest: FakeDashiBadRequestError,
            Conflict: FakeDashiWriteConflictError
        }

        self.pd_dashi_handler = PDDashiHandler(self.mock_backend,
                                               self.mock_dashi)
    def setUp(self):

        self.mock_backend = DotDict()
        self.mock_backend['create_definition'] = Mock()
        self.mock_backend['read_definition'] = Mock()
        self.mock_backend['read_definition_by_name'] = Mock()
        self.mock_backend['update_definition'] = Mock()
        self.mock_backend['delete_definition'] = Mock()
        self.mock_backend['create'] = Mock()
        self.mock_backend['schedule'] = Mock()
        self.mock_backend['read_process'] = Mock()
        self.mock_backend['list'] = Mock()
        self.mock_backend['cancel'] = Mock()
        self.mock_backend['set_system_boot'] = Mock()

        self.mock_dashi = DotDict()
        self.mock_dashi['handle'] = Mock()

        self.mock_pyon_dashi_exc_map = {
            NotFound: FakeDashiNotFoundError,
            BadRequest: FakeDashiBadRequestError,
            Conflict: FakeDashiWriteConflictError
            }

        self.pd_dashi_handler = PDDashiHandler(self.mock_backend, self.mock_dashi)
    def setUp(self):

        self.mock_backend = DotDict()
        self.mock_backend['create_definition'] = Mock()
        self.mock_backend['read_definition'] = Mock()
        self.mock_backend['read_definition_by_name'] = Mock()
        self.mock_backend['delete_definition'] = Mock()
        self.mock_backend['spawn'] = Mock()
        self.mock_backend['read_process'] = Mock()
        self.mock_backend['list'] = Mock()
        self.mock_backend['cancel'] = Mock()

        self.mock_dashi = DotDict()
        self.mock_dashi['handle'] = Mock()

        self.pd_dashi_handler = PDDashiHandler(self.mock_backend, self.mock_dashi)
class ProcessDispatcherServiceDashiHandlerTest(PyonTestCase):
    """Tests the dashi frontend of the PD
    """

    #TODO: add some more thorough tests

    def setUp(self):

        self.mock_backend = DotDict()
        self.mock_backend['create_definition'] = Mock()
        self.mock_backend['read_definition'] = Mock()
        self.mock_backend['read_definition_by_name'] = Mock()
        self.mock_backend['delete_definition'] = Mock()
        self.mock_backend['spawn'] = Mock()
        self.mock_backend['read_process'] = Mock()
        self.mock_backend['list'] = Mock()
        self.mock_backend['cancel'] = Mock()

        self.mock_dashi = DotDict()
        self.mock_dashi['handle'] = Mock()

        self.pd_dashi_handler = PDDashiHandler(self.mock_backend, self.mock_dashi)

    def test_process_definitions(self):

        definition_id = "hello"
        definition_type = ProcessDefinitionType.PYON_STREAM
        executable = {'class': 'SomeThing', 'module': 'some.module'}
        name = "whataname"
        description = "describing stuff"

        self.pd_dashi_handler.create_definition(definition_id, definition_type,
                executable, name, description)
        self.assertEqual(self.mock_backend.create_definition.call_count, 1)

        self.pd_dashi_handler.describe_definition(definition_id)
        self.assertEqual(self.mock_backend.read_definition.call_count, 1)

        raised = False
        try:
            self.pd_dashi_handler.update_definition(definition_id, definition_type,
                executable, name, description)
        except BadRequest:
            raised = True
        assert raised, "update_definition didn't raise badrequest"

        self.pd_dashi_handler.remove_definition(definition_id)
        self.assertEqual(self.mock_backend.delete_definition.call_count, 1)

        raised = False
        try:
            self.pd_dashi_handler.list_definitions()
        except BadRequest:
            raised = True
        assert raised, "list_definitions didn't raise badrequest"

    def test_schedule(self):

        self.mock_backend['read_definition'].return_value = ProcessDefinition()

        upid = 'myupid'
        definition_id = 'something'
        queueing_mode = 'RESTART_ONLY'
        restart_mode = 'ABNORMAL'

        self.pd_dashi_handler.schedule_process(upid, definition_id, queueing_mode=queueing_mode, restart_mode=restart_mode)

        self.assertEqual(self.mock_backend.spawn.call_count, 1)
        args, kwargs = self.mock_backend.spawn.call_args
        passed_schedule = args[2]
        assert passed_schedule.queueing_mode == ProcessQueueingMode.RESTART_ONLY
        assert passed_schedule.restart_mode == ProcessRestartMode.ABNORMAL

    def test_schedule_by_name(self):
        pdef = ProcessDefinition()
        pdef._id = "someprocessid"
        self.mock_backend['read_definition_by_name'].return_value = pdef

        upid = 'myupid'
        definition_name = 'something'
        queueing_mode = 'RESTART_ONLY'
        restart_mode = 'ABNORMAL'

        self.pd_dashi_handler.schedule_process(upid, definition_name=definition_name,
            queueing_mode=queueing_mode, restart_mode=restart_mode)

        self.mock_backend.read_definition_by_name.assert_called_once_with(definition_name)
        self.assertFalse(self.mock_backend.read_definition.call_count)

        self.assertEqual(self.mock_backend.spawn.call_count, 1)
        args, kwargs = self.mock_backend.spawn.call_args
        passed_schedule = args[2]
        assert passed_schedule.queueing_mode == ProcessQueueingMode.RESTART_ONLY
        assert passed_schedule.restart_mode == ProcessRestartMode.ABNORMAL
class ProcessDispatcherServiceDashiHandlerTest(PyonTestCase):
    """Tests the dashi frontend of the PD
    """
    def setUp(self):

        self.mock_backend = DotDict()
        self.mock_backend['create_definition'] = Mock()
        self.mock_backend['read_definition'] = Mock()
        self.mock_backend['read_definition_by_name'] = Mock()
        self.mock_backend['update_definition'] = Mock()
        self.mock_backend['delete_definition'] = Mock()
        self.mock_backend['create'] = Mock()
        self.mock_backend['schedule'] = Mock()
        self.mock_backend['read_process'] = Mock()
        self.mock_backend['list'] = Mock()
        self.mock_backend['cancel'] = Mock()
        self.mock_backend['set_system_boot'] = Mock()

        self.mock_dashi = DotDict()
        self.mock_dashi['handle'] = Mock()

        self.mock_pyon_dashi_exc_map = {
            NotFound: FakeDashiNotFoundError,
            BadRequest: FakeDashiBadRequestError,
            Conflict: FakeDashiWriteConflictError
            }

        self.pd_dashi_handler = PDDashiHandler(self.mock_backend, self.mock_dashi)

    def test_process_definitions(self):

        definition_id = "hello"
        definition_type = ProcessDefinitionType.PYON_STREAM
        executable = {'class': 'SomeThing', 'module': 'some.module'}
        name = "whataname"
        description = "describing stuff"

        self.pd_dashi_handler.create_definition(definition_id, definition_type,
                executable, name, description)
        self.assertEqual(self.mock_backend.create_definition.call_count, 1)

        self.pd_dashi_handler.describe_definition(definition_id)
        self.assertEqual(self.mock_backend.read_definition.call_count, 1)

        self.pd_dashi_handler.describe_definition(definition_name=name)
        self.assertEqual(self.mock_backend.read_definition_by_name.call_count, 1)

        self.pd_dashi_handler.update_definition(definition_id, definition_type,
            executable, name, description)
        self.assertEqual(self.mock_backend.update_definition.call_count, 1)

        self.pd_dashi_handler.remove_definition(definition_id)
        self.assertEqual(self.mock_backend.delete_definition.call_count, 1)

        with patch('ion.services.cei.process_dispatcher_service._PYON_DASHI_EXC_MAP',
                self.mock_pyon_dashi_exc_map):

            with self.assertRaises(FakeDashiBadRequestError):
                self.pd_dashi_handler.list_definitions()

            # need to specify either definition id or name
            with self.assertRaises(FakeDashiBadRequestError):
                self.pd_dashi_handler.describe_definition()

    def test_exception_map(self):
        # only testing one of the handlers. assuming they all share the decorator
        with patch('ion.services.cei.process_dispatcher_service._PYON_DASHI_EXC_MAP',
                self.mock_pyon_dashi_exc_map):

            self.mock_backend.read_definition.side_effect = NotFound()
            with self.assertRaises(FakeDashiNotFoundError):
                self.pd_dashi_handler.describe_definition("some-def")

            self.mock_backend.read_definition.side_effect = Conflict()
            with self.assertRaises(FakeDashiWriteConflictError):
                self.pd_dashi_handler.describe_definition("some-def")

            self.mock_backend.read_definition.side_effect = BadRequest()
            with self.assertRaises(FakeDashiBadRequestError):
                self.pd_dashi_handler.describe_definition("some-def")

            # try with an unmapped IonException. should get passed through directly
            self.mock_backend.read_definition.side_effect = IonException()
            with self.assertRaises(IonException):
                self.pd_dashi_handler.describe_definition("some-def")

    def test_schedule(self):

        self.mock_backend['read_definition'].return_value = ProcessDefinition()

        upid = 'myupid'
        name = 'myname'
        definition_id = 'something'
        queueing_mode = 'RESTART_ONLY'
        restart_mode = 'ABNORMAL'

        self.pd_dashi_handler.schedule_process(upid, definition_id,
            queueing_mode=queueing_mode, restart_mode=restart_mode, name=name)

        self.assertEqual(self.mock_backend.schedule.call_count, 1)
        args, kwargs = self.mock_backend.schedule.call_args
        passed_schedule = args[2]
        assert passed_schedule.queueing_mode == ProcessQueueingMode.RESTART_ONLY
        assert passed_schedule.restart_mode == ProcessRestartMode.ABNORMAL
        passed_name = args[4]
        assert passed_name == name

    def test_schedule_by_name(self):
        pdef = ProcessDefinition()
        pdef._id = "someprocessid"
        self.mock_backend['read_definition_by_name'].return_value = pdef

        upid = 'myupid'
        definition_name = 'something'
        queueing_mode = 'RESTART_ONLY'
        restart_mode = 'ABNORMAL'

        self.pd_dashi_handler.schedule_process(upid, definition_name=definition_name,
            queueing_mode=queueing_mode, restart_mode=restart_mode)

        self.mock_backend.read_definition_by_name.assert_called_once_with(definition_name)
        self.assertFalse(self.mock_backend.read_definition.call_count)

        self.assertEqual(self.mock_backend.schedule.call_count, 1)
        args, kwargs = self.mock_backend.schedule.call_args
        passed_schedule = args[2]
        assert passed_schedule.queueing_mode == ProcessQueueingMode.RESTART_ONLY
        assert passed_schedule.restart_mode == ProcessRestartMode.ABNORMAL

    def test_set_system_boot(self):
        self.pd_dashi_handler.set_system_boot(False)
        self.mock_backend.set_system_boot.assert_called_once_with(False)
class ProcessDispatcherServiceDashiHandlerTest(PyonTestCase):
    """Tests the dashi frontend of the PD
    """
    def setUp(self):

        self.mock_backend = DotDict()
        self.mock_backend['create_definition'] = Mock()
        self.mock_backend['read_definition'] = Mock()
        self.mock_backend['read_definition_by_name'] = Mock()
        self.mock_backend['update_definition'] = Mock()
        self.mock_backend['delete_definition'] = Mock()
        self.mock_backend['create'] = Mock()
        self.mock_backend['schedule'] = Mock()
        self.mock_backend['read_process'] = Mock()
        self.mock_backend['list'] = Mock()
        self.mock_backend['cancel'] = Mock()
        self.mock_backend['set_system_boot'] = Mock()

        self.mock_dashi = DotDict()
        self.mock_dashi['handle'] = Mock()

        self.mock_pyon_dashi_exc_map = {
            NotFound: FakeDashiNotFoundError,
            BadRequest: FakeDashiBadRequestError,
            Conflict: FakeDashiWriteConflictError
        }

        self.pd_dashi_handler = PDDashiHandler(self.mock_backend,
                                               self.mock_dashi)

    def test_process_definitions(self):

        definition_id = "hello"
        definition_type = ProcessDefinitionType.PYON_STREAM
        executable = {'class': 'SomeThing', 'module': 'some.module'}
        name = "whataname"
        description = "describing stuff"

        self.pd_dashi_handler.create_definition(definition_id, definition_type,
                                                executable, name, description)
        self.assertEqual(self.mock_backend.create_definition.call_count, 1)

        self.pd_dashi_handler.describe_definition(definition_id)
        self.assertEqual(self.mock_backend.read_definition.call_count, 1)

        self.pd_dashi_handler.describe_definition(definition_name=name)
        self.assertEqual(self.mock_backend.read_definition_by_name.call_count,
                         1)

        self.pd_dashi_handler.update_definition(definition_id, definition_type,
                                                executable, name, description)
        self.assertEqual(self.mock_backend.update_definition.call_count, 1)

        self.pd_dashi_handler.remove_definition(definition_id)
        self.assertEqual(self.mock_backend.delete_definition.call_count, 1)

        with patch(
                'ion.services.cei.process_dispatcher_service._PYON_DASHI_EXC_MAP',
                self.mock_pyon_dashi_exc_map):

            with self.assertRaises(FakeDashiBadRequestError):
                self.pd_dashi_handler.list_definitions()

            # need to specify either definition id or name
            with self.assertRaises(FakeDashiBadRequestError):
                self.pd_dashi_handler.describe_definition()

    def test_exception_map(self):
        # only testing one of the handlers. assuming they all share the decorator
        with patch(
                'ion.services.cei.process_dispatcher_service._PYON_DASHI_EXC_MAP',
                self.mock_pyon_dashi_exc_map):

            self.mock_backend.read_definition.side_effect = NotFound()
            with self.assertRaises(FakeDashiNotFoundError):
                self.pd_dashi_handler.describe_definition("some-def")

            self.mock_backend.read_definition.side_effect = Conflict()
            with self.assertRaises(FakeDashiWriteConflictError):
                self.pd_dashi_handler.describe_definition("some-def")

            self.mock_backend.read_definition.side_effect = BadRequest()
            with self.assertRaises(FakeDashiBadRequestError):
                self.pd_dashi_handler.describe_definition("some-def")

            # try with an unmapped IonException. should get passed through directly
            self.mock_backend.read_definition.side_effect = IonException()
            with self.assertRaises(IonException):
                self.pd_dashi_handler.describe_definition("some-def")

    def test_schedule(self):

        self.mock_backend['read_definition'].return_value = ProcessDefinition()

        upid = 'myupid'
        name = 'myname'
        definition_id = 'something'
        queueing_mode = 'RESTART_ONLY'
        restart_mode = 'ABNORMAL'

        self.pd_dashi_handler.schedule_process(upid,
                                               definition_id,
                                               queueing_mode=queueing_mode,
                                               restart_mode=restart_mode,
                                               name=name)

        self.assertEqual(self.mock_backend.schedule.call_count, 1)
        args, kwargs = self.mock_backend.schedule.call_args
        passed_schedule = args[2]
        assert passed_schedule.queueing_mode == ProcessQueueingMode.RESTART_ONLY
        assert passed_schedule.restart_mode == ProcessRestartMode.ABNORMAL
        passed_name = args[4]
        assert passed_name == name

    def test_schedule_by_name(self):
        pdef = ProcessDefinition()
        pdef._id = "someprocessid"
        self.mock_backend['read_definition_by_name'].return_value = pdef

        upid = 'myupid'
        definition_name = 'something'
        queueing_mode = 'RESTART_ONLY'
        restart_mode = 'ABNORMAL'

        self.pd_dashi_handler.schedule_process(upid,
                                               definition_name=definition_name,
                                               queueing_mode=queueing_mode,
                                               restart_mode=restart_mode)

        self.mock_backend.read_definition_by_name.assert_called_once_with(
            definition_name)
        self.assertFalse(self.mock_backend.read_definition.call_count)

        self.assertEqual(self.mock_backend.schedule.call_count, 1)
        args, kwargs = self.mock_backend.schedule.call_args
        passed_schedule = args[2]
        assert passed_schedule.queueing_mode == ProcessQueueingMode.RESTART_ONLY
        assert passed_schedule.restart_mode == ProcessRestartMode.ABNORMAL

    def test_set_system_boot(self):
        self.pd_dashi_handler.set_system_boot(False)
        self.mock_backend.set_system_boot.assert_called_once_with(False)