def setUp(self):
        mock_clients = self._create_service_mock('transform_management')
        self.transform_service = TransformManagementService()
        self.transform_service.clients = mock_clients
        self.transform_service.clients.pubsub_management = DotDict()
        self.transform_service.clients.pubsub_management['XP'] = 'science.data'
        self.transform_service.clients.pubsub_management['create_stream'] = Mock()
        self.transform_service.clients.pubsub_management['create_subscription'] = Mock()
        self.transform_service.clients.pubsub_management['register_producer'] = Mock()
        self.transform_service.clients.pubsub_management['activate_subscription'] = Mock()
        self.transform_service.clients.pubsub_management['read_subscription'] = Mock()
        self.transform_service.container = DotDict()
        self.transform_service.container['spawn_process'] = Mock()
        self.transform_service.container['id'] = 'mock_container_id'
        self.transform_service.container['proc_manager'] = DotDict()
        self.transform_service.container.proc_manager['terminate_process'] = Mock()
        self.transform_service.container.proc_manager['procs'] = {}
        # CRUD Shortcuts
        self.mock_rr_create = self.transform_service.clients.resource_registry.create
        self.mock_rr_read = self.transform_service.clients.resource_registry.read
        self.mock_rr_update = self.transform_service.clients.resource_registry.update
        self.mock_rr_delete = self.transform_service.clients.resource_registry.delete
        self.mock_rr_find = self.transform_service.clients.resource_registry.find_objects
        self.mock_rr_find_res = self.transform_service.clients.resource_registry.find_resources
        self.mock_rr_assoc = self.transform_service.clients.resource_registry.find_associations
        self.mock_rr_create_assoc = self.transform_service.clients.resource_registry.create_association
        self.mock_rr_del_assoc = self.transform_service.clients.resource_registry.delete_association

        self.mock_pd_create = self.transform_service.clients.process_dispatcher.create_process_definition
        self.mock_pd_read = self.transform_service.clients.process_dispatcher.read_process_definition
        self.mock_pd_update = self.transform_service.clients.process_dispatcher.update_process_definition
        self.mock_pd_delete = self.transform_service.clients.process_dispatcher.delete_process_definition
        self.mock_pd_schedule = self.transform_service.clients.process_dispatcher.schedule_process
        self.mock_pd_cancel = self.transform_service.clients.process_dispatcher.cancel_process

        self.mock_ps_create_stream = self.transform_service.clients.pubsub_management.create_stream
        self.mock_ps_create_sub = self.transform_service.clients.pubsub_management.create_subscription
        self.mock_ps_register = self.transform_service.clients.pubsub_management.register_producer
        self.mock_ps_activate = self.transform_service.clients.pubsub_management.activate_subscription
        self.mock_ps_read_sub = self.transform_service.clients.pubsub_management.read_subscription

        self.mock_cc_spawn = self.transform_service.container.spawn_process
        self.mock_cc_terminate = self.transform_service.container.proc_manager.terminate_process
        self.mock_cc_procs = self.transform_service.container.proc_manager.procs
Пример #2
0
    def setUp(self):
        mock_clients = self._create_service_mock("transform_management")
        self.transform_service = TransformManagementService()
        self.transform_service.clients = mock_clients
        self.transform_service.clients.pubsub_management = DotDict()
        self.transform_service.clients.pubsub_management["XP"] = "science.data"
        self.transform_service.clients.pubsub_management["create_stream"] = Mock()
        self.transform_service.clients.pubsub_management["create_subscription"] = Mock()
        self.transform_service.clients.pubsub_management["register_producer"] = Mock()
        self.transform_service.clients.pubsub_management["activate_subscription"] = Mock()
        self.transform_service.clients.pubsub_management["read_subscription"] = Mock()
        self.transform_service.container = DotDict()
        self.transform_service.container["spawn_process"] = Mock()
        self.transform_service.container["id"] = "mock_container_id"
        self.transform_service.container["proc_manager"] = DotDict()
        self.transform_service.container.proc_manager["terminate_process"] = Mock()
        self.transform_service.container.proc_manager["procs"] = {}
        # CRUD Shortcuts
        self.mock_rr_create = self.transform_service.clients.resource_registry.create
        self.mock_rr_read = self.transform_service.clients.resource_registry.read
        self.mock_rr_update = self.transform_service.clients.resource_registry.update
        self.mock_rr_delete = self.transform_service.clients.resource_registry.delete
        self.mock_rr_find = self.transform_service.clients.resource_registry.find_objects
        self.mock_rr_find_res = self.transform_service.clients.resource_registry.find_resources
        self.mock_rr_assoc = self.transform_service.clients.resource_registry.find_associations
        self.mock_rr_create_assoc = self.transform_service.clients.resource_registry.create_association
        self.mock_rr_del_assoc = self.transform_service.clients.resource_registry.delete_association

        self.mock_pd_create = self.transform_service.clients.process_dispatcher.create_process_definition
        self.mock_pd_read = self.transform_service.clients.process_dispatcher.read_process_definition
        self.mock_pd_update = self.transform_service.clients.process_dispatcher.update_process_definition
        self.mock_pd_delete = self.transform_service.clients.process_dispatcher.delete_process_definition
        self.mock_pd_schedule = self.transform_service.clients.process_dispatcher.schedule_process
        self.mock_pd_cancel = self.transform_service.clients.process_dispatcher.cancel_process

        self.mock_ps_create_stream = self.transform_service.clients.pubsub_management.create_stream
        self.mock_ps_create_sub = self.transform_service.clients.pubsub_management.create_subscription
        self.mock_ps_register = self.transform_service.clients.pubsub_management.register_producer
        self.mock_ps_activate = self.transform_service.clients.pubsub_management.activate_subscription
        self.mock_ps_read_sub = self.transform_service.clients.pubsub_management.read_subscription

        self.mock_cc_spawn = self.transform_service.container.spawn_process
        self.mock_cc_terminate = self.transform_service.container.proc_manager.terminate_process
        self.mock_cc_procs = self.transform_service.container.proc_manager.procs
class TransformManagementServiceTest(PyonTestCase):
    """Unit test for TransformManagementService

    """
    def setUp(self):
        mock_clients = self._create_service_mock('transform_management')
        self.transform_service = TransformManagementService()
        self.transform_service.clients = mock_clients
        self.transform_service.clients.pubsub_management = DotDict()
        self.transform_service.clients.pubsub_management['XP'] = 'science.data'
        self.transform_service.clients.pubsub_management['create_stream'] = Mock()
        self.transform_service.clients.pubsub_management['create_subscription'] = Mock()
        self.transform_service.clients.pubsub_management['register_producer'] = Mock()
        self.transform_service.clients.pubsub_management['activate_subscription'] = Mock()
        self.transform_service.clients.pubsub_management['read_subscription'] = Mock()
        self.transform_service.container = DotDict()
        self.transform_service.container['spawn_process'] = Mock()
        self.transform_service.container['id'] = 'mock_container_id'
        self.transform_service.container['proc_manager'] = DotDict()
        self.transform_service.container.proc_manager['terminate_process'] = Mock()
        self.transform_service.container.proc_manager['procs'] = {}
        # CRUD Shortcuts
        self.mock_rr_create = self.transform_service.clients.resource_registry.create
        self.mock_rr_read = self.transform_service.clients.resource_registry.read
        self.mock_rr_update = self.transform_service.clients.resource_registry.update
        self.mock_rr_delete = self.transform_service.clients.resource_registry.delete
        self.mock_rr_find = self.transform_service.clients.resource_registry.find_objects
        self.mock_rr_find_res = self.transform_service.clients.resource_registry.find_resources
        self.mock_rr_assoc = self.transform_service.clients.resource_registry.find_associations
        self.mock_rr_create_assoc = self.transform_service.clients.resource_registry.create_association
        self.mock_rr_del_assoc = self.transform_service.clients.resource_registry.delete_association

        self.mock_pd_create = self.transform_service.clients.process_dispatcher.create_process_definition
        self.mock_pd_read = self.transform_service.clients.process_dispatcher.read_process_definition
        self.mock_pd_delete = self.transform_service.clients.process_dispatcher.delete_process_definition
        self.mock_pd_schedule = self.transform_service.clients.process_dispatcher.schedule_process
        self.mock_pd_cancel = self.transform_service.clients.process_dispatcher.cancel_process

        self.mock_ps_create_stream = self.transform_service.clients.pubsub_management.create_stream
        self.mock_ps_create_sub = self.transform_service.clients.pubsub_management.create_subscription
        self.mock_ps_register = self.transform_service.clients.pubsub_management.register_producer
        self.mock_ps_activate = self.transform_service.clients.pubsub_management.activate_subscription
        self.mock_ps_read_sub = self.transform_service.clients.pubsub_management.read_subscription

        self.mock_cc_spawn = self.transform_service.container.spawn_process
        self.mock_cc_terminate = self.transform_service.container.proc_manager.terminate_process
        self.mock_cc_procs = self.transform_service.container.proc_manager.procs

    # test a create transform with identical names here

    def test_create_transform_full_config(self):
        # mocks
        proc_def = DotDict()
        proc_def['executable'] = {'module':'my_module', 'class':'class'}
        self.mock_pd_read.return_value = proc_def
        self.mock_rr_find_res.return_value = ([],[])
        self.mock_pd_schedule.return_value = '123' # PID
        self.mock_rr_create.return_value = ('transform_id','garbage')
        self.mock_ps_read_sub.return_value = DotDict({'exchange_name':'input_stream_id'})



        # execution
        configuration = {'proc_args':{'arg1':'value'}}
        ret = self.transform_service.create_transform(name='test_transform',
            process_definition_id='mock_procdef_id',
            in_subscription_id='mock_subscription_id',
            out_streams={'output':'mock_output_stream_id'},
            configuration=configuration)

        # assertions
        # look up on procdef
        self.mock_ps_read_sub.assert_called_with(subscription_id='mock_subscription_id')

        # (1) sub, (1) stream, (1) procdef
        out_config = {
            'process':{
                'name':'test_transform',
                'type':'stream_process',
                'listen_name':'input_stream_id',
                'publish_streams':{'output':'mock_output_stream_id'},
                'transform_id': 'transform_id'
            },
            'proc_args':{
                'arg1':'value'
            }
        }
        self.assertEquals(self.mock_rr_create_assoc.call_count,3)
        self.mock_pd_schedule.assert_called_with(
            'mock_procdef_id',
            None,
            out_config,
            ""
        )
        self.assertTrue(self.mock_rr_create.called)

    def test_create_transform_no_config(self):
        # mocks
        proc_def = DotDict()
        proc_def['executable'] = {'module':'my_module', 'class':'class'}
        self.mock_pd_read.return_value = proc_def
        self.mock_rr_find_res.return_value = ([],[])

        self.mock_cc_spawn.return_value = '123' #PID
        self.mock_pd_schedule.return_value = '123' # PID
        self.mock_rr_create.return_value = ('transform_id','garbage')
        self.mock_ps_read_sub.return_value = DotDict({'exchange_name':'input_stream_id'})


        # execution
        configuration = {}
        ret = self.transform_service.create_transform(name='test_transform',
            process_definition_id='mock_procdef_id',
            in_subscription_id='mock_subscription_id',
            out_streams={'output':'mock_output_stream_id'},
            configuration=configuration)

        # assertions
        # look up on procdef
        self.mock_ps_read_sub.assert_called_with(subscription_id='mock_subscription_id')

        # (1) sub, (1) stream, (1) procdef
        out_config = {
            'process':{
                'name':'test_transform',
                'type':'stream_process',
                'listen_name':'input_stream_id',
                'publish_streams':{'output':'mock_output_stream_id'},
                'transform_id': 'transform_id'
            }
        }
        self.assertEquals(self.mock_rr_create_assoc.call_count,3)
        self.mock_pd_schedule.assert_called_with(
            'mock_procdef_id',
            None,
            out_config,
            ""
        )

        self.assertTrue(self.mock_rr_create.called)

    def test_create_transform_no_stream(self):
        # mocks
        proc_def = DotDict()
        proc_def['executable'] = {'module':'my_module', 'class':'class'}
        self.mock_pd_read.return_value = proc_def
        self.mock_rr_find_res.return_value = ([],[])
        self.mock_pd_schedule.return_value = '123' # PID
        self.mock_rr_create.return_value = ('transform_id','garbage')
        self.mock_ps_read_sub.return_value = DotDict({'exchange_name':'input_stream_id'})


        # execution
        configuration = {'proc_args':{'arg1':'value'}}
        ret = self.transform_service.create_transform(name='test_transform',
            process_definition_id='mock_procdef_id',
            in_subscription_id='mock_subscription_id',
            configuration=configuration)

        # assertions
        # look up on procdef
        self.mock_ps_read_sub.assert_called_with(subscription_id='mock_subscription_id')

        # (1) sub, (1) stream, (1) procdef
        out_config = {
            'process':{
                'name':'test_transform',
                'type':'stream_process',
                'listen_name':'input_stream_id',
                'transform_id': 'transform_id'
            },
            'proc_args':{
                'arg1':'value'
            }
        }
        self.assertEquals(self.mock_rr_create_assoc.call_count,2)
        self.mock_pd_schedule.assert_called_with(
            'mock_procdef_id',
            None,
            out_config,
            ""
        )

        self.assertTrue(self.mock_rr_create.called)




    def test_update_transform(self):
        with self.assertRaises(NotImplementedError):
            self.transform_service.update_transform()


    def test_read_transform(self):
        # mocks
        self.mock_rr_read.return_value = 'mock_object'

        # execution
        ret = self.transform_service.read_transform('transform_id')

        # assertions
        self.mock_rr_read.assert_called_with('transform_id','')
        self.assertEquals(ret,'mock_object')


    def test_delete_transform(self):
        # mocks
        self.transform_service.read_transform = Mock()
        self.transform_service.read_transform.return_value = DotDict({'process_id':'pid'})
        find_list = ['process_definition','subscription_id','stream_id']
        def finds(*args, **kwargs):
            return ([find_list.pop(0)],'junk')
        self.mock_rr_find.side_effect = finds
        association_list = ['one','two','three']
        def associations(*args,**kwargs):
            return [association_list.pop(0)]
        self.mock_rr_assoc.side_effect = associations


        # execution
        ret = self.transform_service.delete_transform('mock_transform_id')

        # assertions
        self.transform_service.read_transform.assert_called_with(transform_id='mock_transform_id')
        self.mock_pd_cancel.assert_called_with('pid')
        self.assertEquals(self.mock_rr_find.call_count,3)
        self.assertEquals(self.mock_rr_del_assoc.call_count,3)
        self.assertEquals(self.mock_rr_delete.call_count,1)



    def test_activate_transform(self):
        # mocks
        self.mock_rr_find.return_value = [['one','two','three'],'garbage']

        # execution
        ret = self.transform_service.activate_transform('transform_id')

        # assertions
        self.mock_rr_find.assert_called_with('transform_id',PRED.hasSubscription,RT.Subscription,True)
        self.assertEquals(self.mock_ps_activate.call_count,3)

        # ---

    def test_activate_transform_nonexist(self):
        # mocks
        self.mock_rr_find.return_value = ([],'')

        # execution
        with self.assertRaises(NotFound):
            ret = self.transform_service.activate_transform('transform_id')



    def test_schedule_transform(self):
        # not implemented
        with self.assertRaises(NotImplementedError):
            self.transform_service.schedule_transform()

    def test_execute_transform(self):
        # Mocks
        procdef = ProcessDefinition(
            executable={
                'module':'ion.processes.data.transforms.transform_example',
                'class':'ReverseTransform'}
        )
        self.mock_pd_read.return_value = procdef

        retval = self.transform_service.execute_transform('1234',[1,2,3,4])

        self.assertEquals(retval,[4,3,2,1])
class TransformManagementServiceTest(PyonTestCase):
    """Unit test for TransformManagementService

    """
    def setUp(self):
        mock_clients = self._create_service_mock('transform_management')
        self.transform_service = TransformManagementService()
        self.transform_service.clients = mock_clients
        self.transform_service.clients.pubsub_management = DotDict()
        self.transform_service.clients.pubsub_management['XP'] = 'science.data'
        self.transform_service.clients.pubsub_management['create_stream'] = Mock()
        self.transform_service.clients.pubsub_management['create_subscription'] = Mock()
        self.transform_service.clients.pubsub_management['register_producer'] = Mock()
        self.transform_service.clients.pubsub_management['activate_subscription'] = Mock()
        self.transform_service.clients.pubsub_management['read_subscription'] = Mock()
        self.transform_service.container = DotDict()
        self.transform_service.container['spawn_process'] = Mock()
        self.transform_service.container['id'] = 'mock_container_id'
        self.transform_service.container['proc_manager'] = DotDict()
        self.transform_service.container.proc_manager['terminate_process'] = Mock()
        self.transform_service.container.proc_manager['procs'] = {}
        # CRUD Shortcuts
        self.mock_rr_create = self.transform_service.clients.resource_registry.create
        self.mock_rr_read = self.transform_service.clients.resource_registry.read
        self.mock_rr_update = self.transform_service.clients.resource_registry.update
        self.mock_rr_delete = self.transform_service.clients.resource_registry.delete
        self.mock_rr_find = self.transform_service.clients.resource_registry.find_objects
        self.mock_rr_find_res = self.transform_service.clients.resource_registry.find_resources
        self.mock_rr_assoc = self.transform_service.clients.resource_registry.find_associations
        self.mock_rr_create_assoc = self.transform_service.clients.resource_registry.create_association
        self.mock_rr_del_assoc = self.transform_service.clients.resource_registry.delete_association

        self.mock_pd_create = self.transform_service.clients.process_dispatcher.create_process_definition
        self.mock_pd_read = self.transform_service.clients.process_dispatcher.read_process_definition
        self.mock_pd_update = self.transform_service.clients.process_dispatcher.update_process_definition
        self.mock_pd_delete = self.transform_service.clients.process_dispatcher.delete_process_definition
        self.mock_pd_schedule = self.transform_service.clients.process_dispatcher.schedule_process
        self.mock_pd_cancel = self.transform_service.clients.process_dispatcher.cancel_process

        self.mock_ps_create_stream = self.transform_service.clients.pubsub_management.create_stream
        self.mock_ps_create_sub = self.transform_service.clients.pubsub_management.create_subscription
        self.mock_ps_register = self.transform_service.clients.pubsub_management.register_producer
        self.mock_ps_activate = self.transform_service.clients.pubsub_management.activate_subscription
        self.mock_ps_read_sub = self.transform_service.clients.pubsub_management.read_subscription

        self.mock_cc_spawn = self.transform_service.container.spawn_process
        self.mock_cc_terminate = self.transform_service.container.proc_manager.terminate_process
        self.mock_cc_procs = self.transform_service.container.proc_manager.procs

    # test a create transform with identical names here

    def test_create_transform_full_config(self):
        # mocks
        proc_def = DotDict()
        proc_def['executable'] = {'module':'my_module', 'class':'class'}
        self.mock_pd_read.return_value = proc_def
        self.mock_rr_find_res.return_value = ([],[])
        self.mock_pd_schedule.return_value = '123' # PID
        self.mock_rr_create.return_value = ('transform_id','garbage')
        self.mock_ps_read_sub.return_value = DotDict({'exchange_name':'input_stream_id'})



        # execution
        configuration = {'proc_args':{'arg1':'value'}}
        ret = self.transform_service.create_transform(name='test_transform',
            process_definition_id='mock_procdef_id',
            in_subscription_id='mock_subscription_id',
            out_streams={'output':'mock_output_stream_id'},
            configuration=configuration)

        # assertions
        # look up on procdef
        self.mock_ps_read_sub.assert_called_with(subscription_id='mock_subscription_id')

        # (1) sub, (1) stream, (1) procdef
        out_config = {
            'process':{
                'name':'test_transform',
                'type':'stream_process',
                'listen_name':'input_stream_id',
                'publish_streams':{'output':'mock_output_stream_id'},
                'transform_id': 'transform_id'
            },
            'proc_args':{
                'arg1':'value'
            }
        }
        self.assertEquals(self.mock_rr_create_assoc.call_count,3)
        self.mock_pd_schedule.assert_called_with(
            'mock_procdef_id',
            None,
            out_config,
            ""
        )
        self.assertTrue(self.mock_rr_create.called)

    def test_create_transform_no_config(self):
        # mocks
        proc_def = DotDict()
        proc_def['executable'] = {'module':'my_module', 'class':'class'}
        self.mock_pd_read.return_value = proc_def
        self.mock_rr_find_res.return_value = ([],[])

        self.mock_cc_spawn.return_value = '123' #PID
        self.mock_pd_schedule.return_value = '123' # PID
        self.mock_rr_create.return_value = ('transform_id','garbage')
        self.mock_ps_read_sub.return_value = DotDict({'exchange_name':'input_stream_id'})


        # execution
        configuration = {}
        ret = self.transform_service.create_transform(name='test_transform',
            process_definition_id='mock_procdef_id',
            in_subscription_id='mock_subscription_id',
            out_streams={'output':'mock_output_stream_id'},
            configuration=configuration)

        # assertions
        # look up on procdef
        self.mock_ps_read_sub.assert_called_with(subscription_id='mock_subscription_id')

        # (1) sub, (1) stream, (1) procdef
        out_config = {
            'process':{
                'name':'test_transform',
                'type':'stream_process',
                'listen_name':'input_stream_id',
                'publish_streams':{'output':'mock_output_stream_id'},
                'transform_id': 'transform_id'
            }
        }
        self.assertEquals(self.mock_rr_create_assoc.call_count,3)
        self.mock_pd_schedule.assert_called_with(
            'mock_procdef_id',
            None,
            out_config,
            ""
        )

        self.assertTrue(self.mock_rr_create.called)

    def test_create_transform_no_stream(self):
        # mocks
        proc_def = DotDict()
        proc_def['executable'] = {'module':'my_module', 'class':'class'}
        self.mock_pd_read.return_value = proc_def
        self.mock_rr_find_res.return_value = ([],[])
        self.mock_pd_schedule.return_value = '123' # PID
        self.mock_rr_create.return_value = ('transform_id','garbage')
        self.mock_ps_read_sub.return_value = DotDict({'exchange_name':'input_stream_id'})


        # execution
        configuration = {'proc_args':{'arg1':'value'}}
        ret = self.transform_service.create_transform(name='test_transform',
            process_definition_id='mock_procdef_id',
            in_subscription_id='mock_subscription_id',
            configuration=configuration)

        # assertions
        # look up on procdef
        self.mock_ps_read_sub.assert_called_with(subscription_id='mock_subscription_id')

        # (1) sub, (1) stream, (1) procdef
        out_config = {
            'process':{
                'name':'test_transform',
                'type':'stream_process',
                'listen_name':'input_stream_id',
                'transform_id': 'transform_id'
            },
            'proc_args':{
                'arg1':'value'
            }
        }
        self.assertEquals(self.mock_rr_create_assoc.call_count,2)
        self.mock_pd_schedule.assert_called_with(
            'mock_procdef_id',
            None,
            out_config,
            ""
        )

        self.assertTrue(self.mock_rr_create.called)




    def test_update_transform(self):
        with self.assertRaises(NotImplementedError):
            self.transform_service.update_transform()


    def test_read_transform(self):
        # mocks
        self.mock_rr_read.return_value = 'mock_object'

        # execution
        ret = self.transform_service.read_transform('transform_id')

        # assertions
        self.mock_rr_read.assert_called_with('transform_id','')
        self.assertEquals(ret,'mock_object')


    def test_delete_transform(self):
        # mocks
        self.transform_service.read_transform = Mock()
        self.transform_service.read_transform.return_value = DotDict({'process_id':'pid'})
        find_list = ['process_definition','subscription_id','stream_id']
        def finds(*args, **kwargs):
            return ([find_list.pop(0)],'junk')
        self.mock_rr_find.side_effect = finds
        association_list = ['one','two','three']
        def associations(*args,**kwargs):
            return [association_list.pop(0)]
        self.mock_rr_assoc.side_effect = associations


        # execution
        ret = self.transform_service.delete_transform('mock_transform_id')

        # assertions
        self.transform_service.read_transform.assert_called_with(transform_id='mock_transform_id')
        self.mock_pd_cancel.assert_called_with('pid')
        self.assertEquals(self.mock_rr_find.call_count,3)
        self.assertEquals(self.mock_rr_del_assoc.call_count,3)
        self.assertEquals(self.mock_rr_delete.call_count,1)



    def test_activate_transform(self):
        # mocks
        self.mock_rr_find.return_value = [['one','two','three'],'garbage']

        # execution
        ret = self.transform_service.activate_transform('transform_id')

        # assertions
        self.mock_rr_find.assert_called_with('transform_id',PRED.hasSubscription,RT.Subscription,True)
        self.assertEquals(self.mock_ps_activate.call_count,3)

        # ---

    def test_activate_transform_nonexist(self):
        # mocks
        self.mock_rr_find.return_value = ([],'')

        # execution
        with self.assertRaises(NotFound):
            ret = self.transform_service.activate_transform('transform_id')



    def test_schedule_transform(self):
        # not implemented
        with self.assertRaises(NotImplementedError):
            self.transform_service.schedule_transform()

    def test_execute_transform(self):
        # Mocks
        procdef = ProcessDefinition(
            executable={
                'module':'ion.processes.data.transforms.transform_example',
                'class':'ReverseTransform'}
        )
        self.mock_pd_read.return_value = procdef

        retval = self.transform_service.execute_transform('1234',[1,2,3,4])

        self.assertEquals(retval,[4,3,2,1])
Пример #5
0
class TransformManagementServiceTest(PyonTestCase):
    """Unit test for TransformManagementService

    """

    def setUp(self):
        mock_clients = self._create_service_mock("transform_management")
        self.transform_service = TransformManagementService()
        self.transform_service.clients = mock_clients
        self.transform_service.clients.pubsub_management = DotDict()
        self.transform_service.clients.pubsub_management["XP"] = "science.data"
        self.transform_service.clients.pubsub_management["create_stream"] = Mock()
        self.transform_service.clients.pubsub_management["create_subscription"] = Mock()
        self.transform_service.clients.pubsub_management["register_producer"] = Mock()
        self.transform_service.clients.pubsub_management["activate_subscription"] = Mock()
        self.transform_service.clients.pubsub_management["read_subscription"] = Mock()
        self.transform_service.container = DotDict()
        self.transform_service.container["spawn_process"] = Mock()
        self.transform_service.container["id"] = "mock_container_id"
        self.transform_service.container["proc_manager"] = DotDict()
        self.transform_service.container.proc_manager["terminate_process"] = Mock()
        self.transform_service.container.proc_manager["procs"] = {}
        # CRUD Shortcuts
        self.mock_rr_create = self.transform_service.clients.resource_registry.create
        self.mock_rr_read = self.transform_service.clients.resource_registry.read
        self.mock_rr_update = self.transform_service.clients.resource_registry.update
        self.mock_rr_delete = self.transform_service.clients.resource_registry.delete
        self.mock_rr_find = self.transform_service.clients.resource_registry.find_objects
        self.mock_rr_find_res = self.transform_service.clients.resource_registry.find_resources
        self.mock_rr_assoc = self.transform_service.clients.resource_registry.find_associations
        self.mock_rr_create_assoc = self.transform_service.clients.resource_registry.create_association
        self.mock_rr_del_assoc = self.transform_service.clients.resource_registry.delete_association

        self.mock_pd_create = self.transform_service.clients.process_dispatcher.create_process_definition
        self.mock_pd_read = self.transform_service.clients.process_dispatcher.read_process_definition
        self.mock_pd_update = self.transform_service.clients.process_dispatcher.update_process_definition
        self.mock_pd_delete = self.transform_service.clients.process_dispatcher.delete_process_definition
        self.mock_pd_schedule = self.transform_service.clients.process_dispatcher.schedule_process
        self.mock_pd_cancel = self.transform_service.clients.process_dispatcher.cancel_process

        self.mock_ps_create_stream = self.transform_service.clients.pubsub_management.create_stream
        self.mock_ps_create_sub = self.transform_service.clients.pubsub_management.create_subscription
        self.mock_ps_register = self.transform_service.clients.pubsub_management.register_producer
        self.mock_ps_activate = self.transform_service.clients.pubsub_management.activate_subscription
        self.mock_ps_read_sub = self.transform_service.clients.pubsub_management.read_subscription

        self.mock_cc_spawn = self.transform_service.container.spawn_process
        self.mock_cc_terminate = self.transform_service.container.proc_manager.terminate_process
        self.mock_cc_procs = self.transform_service.container.proc_manager.procs

    # test a create transform with identical names here

    def test_create_transform_full_config(self):
        # mocks
        proc_def = DotDict()
        proc_def["executable"] = {"module": "my_module", "class": "class"}
        self.mock_pd_read.return_value = proc_def
        self.mock_rr_find_res.return_value = ([], [])
        self.mock_pd_schedule.return_value = "123"  # PID
        self.mock_rr_create.return_value = ("transform_id", "garbage")
        self.mock_ps_read_sub.return_value = DotDict({"exchange_name": "input_stream_id"})

        # execution
        configuration = {"proc_args": {"arg1": "value"}}
        ret = self.transform_service.create_transform(
            name="test_transform",
            process_definition_id="mock_procdef_id",
            in_subscription_id="mock_subscription_id",
            out_streams={"output": "mock_output_stream_id"},
            configuration=configuration,
        )

        # assertions
        # look up on procdef
        self.mock_ps_read_sub.assert_called_with(subscription_id="mock_subscription_id")

        # (1) sub, (1) stream, (1) procdef
        out_config = {
            "process": {
                "name": "test_transform",
                "type": "stream_process",
                "listen_name": "input_stream_id",
                "publish_streams": {"output": "mock_output_stream_id"},
                "transform_id": "transform_id",
            },
            "proc_args": {"arg1": "value"},
        }
        self.assertEquals(self.mock_rr_create_assoc.call_count, 3)
        self.mock_pd_schedule.assert_called_with("mock_procdef_id", None, out_config, "")
        self.assertTrue(self.mock_rr_create.called)

    def test_create_transform_no_config(self):
        # mocks
        proc_def = DotDict()
        proc_def["executable"] = {"module": "my_module", "class": "class"}
        self.mock_pd_read.return_value = proc_def
        self.mock_rr_find_res.return_value = ([], [])

        self.mock_cc_spawn.return_value = "123"  # PID
        self.mock_pd_schedule.return_value = "123"  # PID
        self.mock_rr_create.return_value = ("transform_id", "garbage")
        self.mock_ps_read_sub.return_value = DotDict({"exchange_name": "input_stream_id"})

        # execution
        configuration = {}
        ret = self.transform_service.create_transform(
            name="test_transform",
            process_definition_id="mock_procdef_id",
            in_subscription_id="mock_subscription_id",
            out_streams={"output": "mock_output_stream_id"},
            configuration=configuration,
        )

        # assertions
        # look up on procdef
        self.mock_ps_read_sub.assert_called_with(subscription_id="mock_subscription_id")

        # (1) sub, (1) stream, (1) procdef
        out_config = {
            "process": {
                "name": "test_transform",
                "type": "stream_process",
                "listen_name": "input_stream_id",
                "publish_streams": {"output": "mock_output_stream_id"},
                "transform_id": "transform_id",
            }
        }
        self.assertEquals(self.mock_rr_create_assoc.call_count, 3)
        self.mock_pd_schedule.assert_called_with("mock_procdef_id", None, out_config, "")

        self.assertTrue(self.mock_rr_create.called)

    def test_create_transform_no_stream(self):
        # mocks
        proc_def = DotDict()
        proc_def["executable"] = {"module": "my_module", "class": "class"}
        self.mock_pd_read.return_value = proc_def
        self.mock_rr_find_res.return_value = ([], [])
        self.mock_pd_schedule.return_value = "123"  # PID
        self.mock_rr_create.return_value = ("transform_id", "garbage")
        self.mock_ps_read_sub.return_value = DotDict({"exchange_name": "input_stream_id"})

        # execution
        configuration = {"proc_args": {"arg1": "value"}}
        ret = self.transform_service.create_transform(
            name="test_transform",
            process_definition_id="mock_procdef_id",
            in_subscription_id="mock_subscription_id",
            configuration=configuration,
        )

        # assertions
        # look up on procdef
        self.mock_ps_read_sub.assert_called_with(subscription_id="mock_subscription_id")

        # (1) sub, (1) stream, (1) procdef
        out_config = {
            "process": {
                "name": "test_transform",
                "type": "stream_process",
                "listen_name": "input_stream_id",
                "transform_id": "transform_id",
            },
            "proc_args": {"arg1": "value"},
        }
        self.assertEquals(self.mock_rr_create_assoc.call_count, 2)
        self.mock_pd_schedule.assert_called_with("mock_procdef_id", None, out_config, "")

        self.assertTrue(self.mock_rr_create.called)

    def test_update_transform(self):
        with self.assertRaises(NotImplementedError):
            self.transform_service.update_transform()

    def test_read_transform(self):
        # mocks
        self.mock_rr_read.return_value = "mock_object"

        # execution
        ret = self.transform_service.read_transform("transform_id")

        # assertions
        self.mock_rr_read.assert_called_with("transform_id", "")
        self.assertEquals(ret, "mock_object")

    def test_delete_transform(self):
        # mocks
        self.transform_service.read_transform = Mock()
        self.transform_service.read_transform.return_value = DotDict({"process_id": "pid"})
        find_list = ["process_definition", "subscription_id", "stream_id"]

        def finds(*args, **kwargs):
            return ([find_list.pop(0)], "junk")

        self.mock_rr_find.side_effect = finds
        association_list = ["one", "two", "three"]

        def associations(*args, **kwargs):
            return [association_list.pop(0)]

        self.mock_rr_assoc.side_effect = associations

        # execution
        ret = self.transform_service.delete_transform("mock_transform_id")

        # assertions
        self.transform_service.read_transform.assert_called_with(transform_id="mock_transform_id")
        self.mock_pd_cancel.assert_called_with("pid")
        self.assertEquals(self.mock_rr_find.call_count, 3)
        self.assertEquals(self.mock_rr_del_assoc.call_count, 3)
        self.assertEquals(self.mock_rr_delete.call_count, 1)

    def test_activate_transform(self):
        # mocks
        self.mock_rr_find.return_value = [["one", "two", "three"], "garbage"]

        # execution
        ret = self.transform_service.activate_transform("transform_id")

        # assertions
        self.mock_rr_find.assert_called_with("transform_id", PRED.hasSubscription, RT.Subscription, True)
        self.assertEquals(self.mock_ps_activate.call_count, 3)

        # ---

    def test_activate_transform_nonexist(self):
        # mocks
        self.mock_rr_find.return_value = ([], "")

        # execution
        with self.assertRaises(NotFound):
            ret = self.transform_service.activate_transform("transform_id")

    def test_schedule_transform(self):
        # not implemented
        with self.assertRaises(NotImplementedError):
            self.transform_service.schedule_transform()

    def test_execute_transform(self):
        # Mocks
        procdef = ProcessDefinition(
            executable={"module": "ion.processes.data.transforms.transform_example", "class": "ReverseTransform"}
        )
        self.mock_pd_read.return_value = procdef

        retval = self.transform_service.execute_transform("1234", [1, 2, 3, 4])

        self.assertEquals(retval, [4, 3, 2, 1])