Exemplo n.º 1
0
    def test_loop_pool_size_big(self, mock_create_check_service_jobs,
                                mock_create_pool, mock_get_services):

        mock_pool = mock.Mock()
        mock_pool_size = 10

        mock_get_services.return_value = {'srv1': ['a', 'b'],
                                          'srv2': ['c', 'd']}
        mock_create_pool.return_value = mock_pool, mock_pool_size

        liaison = Liaison(LiaisonConfig(sleep=0))
        liaison.loop()

        self.assertEqual(1, mock_pool.map.call_count)
        self.assertEqual(1, mock_create_check_service_jobs.call_count)
Exemplo n.º 2
0
 def setUp(self):
     self.liaison = Liaison(LiaisonConfig())
Exemplo n.º 3
0
class MainTests(unittest.TestCase):
    def setUp(self):
        self.liaison = Liaison(LiaisonConfig())

    def test_create_pool(self):
        import multiprocessing.pool

        l = LiaisonConfig()
        pool, _ = self.liaison.create_pool(l)
        self.assertTrue(isinstance(pool, multiprocessing.pool.Pool))

    def test_create_pool_size_none(self):
        from multiprocessing import cpu_count

        l = LiaisonConfig()
        l.pool_size = None
        _, pool_size = self.liaison.create_pool(l)
        self.assertTrue(pool_size == cpu_count())

    def test_create_pool_size(self):
        l = LiaisonConfig()
        l.pool_size = 10
        _, pool_size = self.liaison.create_pool(l)
        self.assertTrue(pool_size == 10)

    def test_create_service_jobs(self):
        from liaison.config import ConsulConfig, SinkConfig
        services = dict()
        services['srv1'] = [None, 'tag1']
        services['srv2'] = [None]
        services['srv3'] = ['tag1', 'tag2']
        jobs = self.liaison.create_check_service_jobs(services)
        for job in jobs:
            self.assertTrue('service' in job)
            self.assertTrue(isinstance(job['service'], str))
            self.assertTrue('tag' in job)
            self.assertTrue(isinstance(job['tag'], str) or job['tag'] is None)
            self.assertTrue('consul_config' in job)
            self.assertTrue(isinstance(job['consul_config'], ConsulConfig))
            self.assertTrue('sink_config' in job)
            self.assertTrue(isinstance(job['sink_config'], SinkConfig))

    def test_get_node_status(self):
        nodes = list()
        node_a = {
            'Node': {
                'Node': 'node_c'
            },
            'Checks': []
        }
        node_b = {
            'Node': {
                'Node': 'node_b'
            },
            'Checks': [
                {
                    'Status': 'passing'
                },
                {
                    'Status': 'passing'
                },
                {
                    'Status': 'warning'
                },
                {
                    'Status': 'bogus'
                }
            ]
        }
        node_c = {
            'Node': {
                'Node': 'node_a'
            },
            'Checks': [
                {
                    'Status': 'passing'
                },
                {
                    'Status': 'critical'
                },
                {
                    'Status': 'warning'
                },
                {
                    'Status': 'bogus'
                }
            ]
        }
        nodes.append(node_a)
        self.assertEqual(get_node_status(nodes), (1, 0))
        nodes.append(node_b)
        self.assertEqual(get_node_status(nodes), (2, 0))
        nodes.append(node_c)
        self.assertEqual(get_node_status(nodes), (2, 1))

    def stub_create_check_service_jobs(self, services):
        check_service_jobs = list()
        for name, tags in services.items():
            for tag in tags:
                check_service_jobs.append(
                    {'service': name, 'tag': tag})
            check_service_jobs.append({'service': name, 'tag': None})
        return check_service_jobs

    #
    # 2015-12-16 - Cannot use autospec with static methods
    # https://bugs.python.org/issue23078
    # Leaving it off create_pool

    @mock.patch('liaison.main.Consul.get_services', autospec=True)
    @mock.patch('liaison.main.Liaison.create_pool')
    @mock.patch('liaison.main.Liaison.create_check_service_jobs',
                side_effect=stub_create_check_service_jobs, autospec=True)
    def test_loop_pool_size_small(self, mock_create_check_service_jobs,
                                  mock_create_pool, mock_get_services):

        mock_pool = mock.Mock()
        mock_pool_size = 1

        mock_get_services.return_value = {'srv1': ['a', 'b'],
                                          'srv2': ['c', 'd']}
        mock_create_pool.return_value = mock_pool, mock_pool_size

        liaison = Liaison(LiaisonConfig(sleep=0))
        liaison.loop()

        self.assertEqual(6, mock_pool.map.call_count)
        self.assertEqual(1, mock_create_check_service_jobs.call_count)

    @mock.patch('liaison.main.Consul.get_services', autospec=True)
    @mock.patch('liaison.main.Liaison.create_pool')
    @mock.patch('liaison.main.Liaison.create_check_service_jobs',
                side_effect=stub_create_check_service_jobs, autospec=True)
    def test_loop_pool_size_big(self, mock_create_check_service_jobs,
                                mock_create_pool, mock_get_services):

        mock_pool = mock.Mock()
        mock_pool_size = 10

        mock_get_services.return_value = {'srv1': ['a', 'b'],
                                          'srv2': ['c', 'd']}
        mock_create_pool.return_value = mock_pool, mock_pool_size

        liaison = Liaison(LiaisonConfig(sleep=0))
        liaison.loop()

        self.assertEqual(1, mock_pool.map.call_count)
        self.assertEqual(1, mock_create_check_service_jobs.call_count)

    def test_check_service_bad_service(self):
        self.assertRaises(KeyError, check_service, dict())
        self.assertRaises(KeyError, check_service, {
            'service': 'x',
            'tag': None,
            'consul_config': 'x'
        })

    @mock.patch('liaison.main.get_node_status', autospec=True)
    @mock.patch('liaison.main.Sink', autospec=True)
    @mock.patch('liaison.main.Consul', autospec=True)
    def test_check_service(self, mock_consul, mock_sink,
                           mock_get_node_status):

        mock_get_node_status.return_value = (1.0, 4.0)
        mock_consul.return_value.get_dc.return_value = 'dc1'
        sink = mock_sink.return_value

        ret = check_service({
            'service': 'test',
            'tag': None,
            'consul_config': None,
            'sink_config': None
        })

        sink.ok_count.assert_called_with(
            1.0, 'test', 'dc1', None)
        sink.critical_count.assert_called_with(
            4.0, 'test', 'dc1', None)
        sink.ok_percent.assert_called_with(
            20.0, 'test', 'dc1', None)
        sink.critical_percent.assert_called_with(
            80.0, 'test', 'dc1', None)

        self.assertEqual(ret, 0)