예제 #1
0
    def test_execute(self):
        self.inst = HostnameResolver()
        self.inst.api = MagicMock()

        # Set up mock for api.get_data - what we are to retrieve
        ips = ['10.1.1.1', '192.168.1.12']
        self.inst.api.get_data.return_value.json.return_value = ips

        # Set up mock for api.send_file
        remote_path = 'file:///tmp/obsrvbl/hostnames/resolutions.json'
        output = {}

        def _send_file(data_type, path, now, suffix=None):
            with io.open(path, 'rb') as infile:
                output[index] = infile.read()

            return remote_path

        self.inst.api.send_file.side_effect = _send_file

        # Do the deed
        index = 0
        self.inst.execute()

        self.assertEqual(self.inst.api.send_file.call_count, 1)
        call_args, call_kwargs = self.inst.api.send_file.call_args
        self.assertEqual(call_args[0], 'hostnames')
        self.assertEqual(call_kwargs['suffix'], 'hosts')
        self.assertEqual(output[0], json.dumps(DNS_RESOLUTIONS))
        self.inst.api.send_signal.assert_called_once_with(
            'hostnames', {'path': remote_path})
예제 #2
0
    def test_execute_error(self):
        self.inst = HostnameResolver()
        self.inst.api = MagicMock()
        self.inst.api.get_data.return_value.json.side_effect = ValueError
        self.inst.execute()

        self.assertEqual(self.inst.api.send_file.call_count, 0)
        self.assertEqual(self.inst.api.send_signal.call_count, 0)
예제 #3
0
    def test_execute_no_ips(self):
        self.inst = HostnameResolver()
        self.inst.api = MagicMock()
        self.inst.api.get_data.return_value.json.return_value = []
        self.inst.execute()

        self.assertEqual(self.inst.api.send_file.call_count, 0)
        self.assertEqual(self.inst.api.send_signal.call_count, 0)
예제 #4
0
    def test_service(self, mock_requests):
        resolver = HostnameResolver()
        resolver.poll_seconds = 0

        def killer(signum, frame):
            resolver.stop()

        signal.signal(signal.SIGALRM, killer)
        signal.alarm(1)
        resolver.run()
예제 #5
0
    def test_execute_ipsplosion(self, mock_get_data, mock_update,
                                mock_resolve):
        mock_get_data.return_value.json.side_effect = ValueError

        resolver = HostnameResolver()
        resolver.execute()

        mock_get_data.assert_called_once_with('hostnames')
        self.assertEquals(mock_resolve.call_args_list, [])
        self.assertEquals(mock_update.call_args_list, [])
예제 #6
0
    def test_execute_no_ips(self, mock_get_data, mock_update, mock_resolve):
        ips = []
        mock_get_data.return_value.json.return_value = ips

        resolver = HostnameResolver()
        resolver.execute()

        mock_get_data.assert_called_once_with('hostnames')
        self.assertEquals(mock_resolve.call_args_list, [])
        self.assertEquals(mock_update.call_args_list, [])
예제 #7
0
    def test_service(self):
        self.inst = HostnameResolver()
        self.inst.api = MagicMock()
        self.inst.poll_seconds = 0

        def killer(signum, frame):
            self.inst.stop()

        signal.signal(signal.SIGALRM, killer)
        signal.alarm(1)
        self.inst.run()
예제 #8
0
    def test_execute(self, mock_get_data, mock_update, mock_resolve):
        ips = ['1.2.3.4', '5.6.7.8']
        hosts = ['host1', 'host2']
        mock_get_data.return_value.json.return_value = ips
        mock_resolve.return_value = hosts

        resolver = HostnameResolver()
        resolver.execute()

        mock_get_data.assert_called_once_with('hostnames')
        mock_resolve.assert_called_once_with(ips)
        mock_update.assert_called_once_with(hosts, None)
예제 #9
0
    def test_execute_both(self, mock_check_output):
        self.inst = HostnameResolver()
        self.inst.api = MagicMock()

        # Set up mock for api.get_data - what we are to retrieve
        ips = ['192.0.2.1', '192.168.1.12', '10.1.1.1', '198.51.100.1']
        self.inst.api.get_data.return_value.json.return_value = ips

        # Set up mock for api.send_file
        remote_path = 'file:///tmp/obsrvbl/hostnames/resolutions.json'
        output = {}

        def _send_file(data_type, path, now, suffix=None):
            with io.open(path, 'rb') as infile:
                output[index] = infile.read()

            return remote_path

        self.inst.api.send_file.side_effect = _send_file

        # Set up the resolver
        def _check_output(*popenargs, **kwargs):
            ip = popenargs[0][-1]
            if ip == '192.0.2.1':
                return '\tTEST_3 <00> - M <ACTIVE> \n'
            elif ip == '192.168.1.12':
                return '\tTEST_2.BOGUS <00> - M <ACTIVE> \n'
            raise CalledProcessError(None, None)

        mock_check_output.side_effect = _check_output

        expected_resolutions = {
            '192.0.2.1': NETBIOS_RESOLUTIONS['192.0.2.1'],
            '192.168.1.12': NETBIOS_RESOLUTIONS['192.168.1.12'],
            '10.1.1.1': DNS_RESOLUTIONS['10.1.1.1'],
            '198.51.100.1': None,
        }

        # Do the deed
        index = 0
        self.inst.execute()

        self.assertEqual(self.inst.api.send_file.call_count, 1)
        call_args, call_kwargs = self.inst.api.send_file.call_args
        self.assertEqual(call_args[0], 'hostnames')
        self.assertEqual(call_kwargs['suffix'], 'hosts')
        self.assertEqual(output[0], json.dumps(expected_resolutions))
        self.inst.api.send_signal.assert_called_once_with(
            'hostnames', {'path': remote_path})
예제 #10
0
    def test_update_host_names(self, mock_tempfile, mock_upload, mock_signal):
        handle = Mock()
        handle.name = 'foobar'
        mock_tempfile.return_value.__enter__.return_value = handle
        mock_upload.return_value = 's3://blah/blah'

        hosts = ['host1', 'host2']
        time = datetime.utcnow()
        resolver = HostnameResolver()
        resolver._update_host_names(hosts, time)

        handle.write.assert_called_once_with(json.dumps(hosts))
        mock_upload.assert_called_once_with('hostnames',
                                            'foobar',
                                            time,
                                            suffix='hosts')
        mock_signal.assert_called_once_with('hostnames',
                                            {'path': mock_upload.return_value})