예제 #1
0
class AlamoManager(object):
    def __init__(self):

        self.loop = asyncio.new_event_loop()
        asyncio.set_event_loop(self.loop)
        self.server = SchedulerServerApplication()
        self.scheduler = AlamoScheduler(loop=self.loop)
        self.server.add_get('/checks', self.scheduler.checks)
        self.server.add_get('/checks/{uuid}', self.scheduler.checks)
        self.server.add_post('/checks', self.scheduler.update)

    def execute(self):
        self.server.init(loop=self.loop)
        self.scheduler.start()
        self.server.finish_connections()
        self.loop.close()
 def setUp(self, *args):
     self.loop = asyncio.new_event_loop()
     asyncio.set_event_loop(self.loop)
     self.scheduler = AlamoScheduler(loop=self.loop)
     self.check = deepcopy(CHECK_TEST_DATA)
     self.check_two = deepcopy(CHECK_TEST_DATA)
     self.check_two['uuid'] = str(uuid4())
     self.connection = Mock()
예제 #3
0
    def __init__(self):

        self.loop = asyncio.new_event_loop()
        asyncio.set_event_loop(self.loop)
        self.server = SchedulerServerApplication()
        self.scheduler = AlamoScheduler(loop=self.loop)
        self.server.add_get('/checks', self.scheduler.checks)
        self.server.add_get('/checks/{uuid}', self.scheduler.checks)
        self.server.add_post('/checks', self.scheduler.update)
class TestAlamoScheduler(TestCase):
    @patch('alamo_scheduler.scheduler.ZeroMQQueue', Mock())
    def setUp(self, *args):
        self.loop = asyncio.new_event_loop()
        asyncio.set_event_loop(self.loop)
        self.scheduler = AlamoScheduler(loop=self.loop)
        self.check = deepcopy(CHECK_TEST_DATA)
        self.check_two = deepcopy(CHECK_TEST_DATA)
        self.check_two['uuid'] = str(uuid4())
        self.connection = Mock()

    def tearDown(self):
        self.loop.stop()
        asyncio.set_event_loop(None)

    def test_schedule_job(self):
        with self.assertLogs('alamo_scheduler.scheduler', level='ERROR'):
            self.check.pop('uuid')
            self.scheduler.schedule_check(self.check)

    @unpack
    @data({'type': EVENT_JOB_ERROR, 'log_level': 'ERROR'},
          {'type': EVENT_JOB_MISSED, 'log_level': 'WARNING'})
    def test_event_listener(self, *args, **kwargs):
        event = JobExecutionEvent(kwargs['type'], 1, None, '1970-2-2')
        with self.assertLogs('alamo_scheduler.scheduler',
                             level=kwargs['log_level']):
            self.scheduler.event_listener(event)

    def test_schedule_check(self):
        queue_mock = Mock()
        self.scheduler.message_queue = queue_mock

        def run_later():
            self.scheduler._schedule_check(self.check)
            self.scheduler.wait_and_kill('SIGINT')

        self.scheduler.loop = self.loop
        self.scheduler.scheduler.start()
        self.loop.call_later(0.5, run_later)
        self.loop.run_forever()

        self.assertTrue(queue_mock.send.called)

    def test_remove_job(self):
        job_id = str(self.check['uuid'])
        self.scheduler.schedule_check(self.check)
        self.scheduler.scheduler.start()
        self.assertEqual(len(self.scheduler.scheduler.get_jobs()), 1)
        self.scheduler.remove_job(job_id)
        self.assertEqual(len(self.scheduler.scheduler.get_jobs()), 0)

    def test_removing_non_existing_job(self):
        try:
            self.scheduler.remove_job('fake_job')
        except JobLookupError:
            self.fail('Removing non existing job raise an unexpectedly.')

    def test_conflict_with_adding_the_same_job(self):
        self.scheduler.scheduler.start()
        self.scheduler.schedule_check(self.check)
        try:
            self.scheduler.schedule_check(self.check)
        except ConflictingIdError:
            self.fail(
                'Scheduling duplicated check raise an error unexpectedly.'
            )

    def test_checks_endpoint(self):
        request = Mock(match_info=dict(uuid=self.check['uuid']), method='GET')
        self.scheduler.scheduler.start()
        self.scheduler.schedule_check(self.check)

        response = self.loop.run_until_complete(self.scheduler.checks(request))
        self.assertIn(self.check['uuid'], response.text)

    @patch('alamo_scheduler.scheduler.json_response')
    def test_checks_update_endpoint(self, json_response_mock):
        self.scheduler.scheduler.start()

        check = self.check

        async def _json():
            return check

        request = Mock()
        request.json = _json

        response = self.loop.run_until_complete(
            self.scheduler.update(request)
        )

        self.assertEqual(list(response), [])
        json_response_mock.assert_called_with(
            data={'status': 'scheduled'}, status=202
        )

        # test if already scheduled check will be removed
        check['triggers'] = []
        response = self.loop.run_until_complete(
            self.scheduler.update(request)
        )

        self.assertEqual(list(response), [])
        json_response_mock.assert_called_with(
            data={'status': 'deleted'}, status=202
        )

    def test_checks_endpoint_with_not_provided_uuid(self):
        request = Mock(match_info=dict(), method='GET')

        response = self.loop.run_until_complete(
            self.scheduler.checks(request)
        )
        self.assertDictEqual(
            json.loads(response.text), dict(count=0, results=[])
        )

    @patch('alamo_scheduler.scheduler.ZeroMQQueue')
    def test_setup(self, zmq):
        zmq_mock = Mock()
        zmq.return_value = zmq_mock
        loop = self.loop

        async def retrieve(*args, **kwargs):
            await asyncio.sleep(0.1)

        def run_later():
            self.scheduler.wait_and_kill('SIGINT')

        loop.call_later(0.2, run_later)
        self.scheduler.retrieve_all_jobs = retrieve
        self.scheduler.fetch_messages = Mock()
        self.scheduler.start(loop=self.loop)
        self.loop.close()
        self.assertTrue(zmq_mock.connect.called)
        self.assertFalse(loop.is_running())