Beispiel #1
0
class TestDriver(TestCase):
    """
    Unit-test tests of the Driver.
    """
    def setUp(self):
        self.m_sck = Mock(spec=socket.socket)
        self.driver = EtcdDriver(self.m_sck)
        self.msg_reader = StubMessageReader(self.m_sck)
        self.msg_writer = StubMessageWriter(self.m_sck)
        self.driver._msg_reader = self.msg_reader
        self.driver._msg_writer = self.msg_writer

    def test_read_bad_message(self):
        self.msg_reader.send_msg("unknown", {})
        self.assertRaises(RuntimeError, self.driver._read_from_socket)

    def test_read_socket_closed(self):
        self.msg_reader.send_exception(SocketClosed())
        self.driver._read_from_socket()

    def test_read_driver_shutdown(self):
        self.msg_reader.send_exception(DriverShutdown())
        self.driver._read_from_socket()

    def test_shutdown_before_config(self):
        self.driver._stop_event.set()
        self.assertRaises(DriverShutdown, self.driver._wait_for_config)

    def test_shutdown_before_ready(self):
        self.driver._stop_event.set()
        self.assertRaises(DriverShutdown, self.driver._wait_for_ready)

    def test_issue_etcd_request_basic_get(self):
        # Initialise the etcd URL.
        self.driver._handle_init({
            MSG_KEY_ETCD_URL: "http://*****:*****@patch("time.sleep")
    def test_resync_http_error(self, m_sleep):
        self.driver._init_received.set()
        with patch.object(self.driver, "get_etcd_connection") as m_get:
            with patch("calico.etcddriver.driver.monotonic_time") as m_time:
                m_time.side_effect = iter([1, 10, RuntimeError()])
                m_get.side_effect = HTTPError()
                self.assertRaises(RuntimeError, self.driver._resync_and_merge)

    def test_parse_snap_error_from_etcd(self):
        parser = ijson.parse(StringIO(json.dumps({"errorCode": 100})))
        next(parser)
        self.assertRaises(ResyncRequired, driver._parse_map, parser, None)

    def test_parse_snap_bad_data(self):
        parser = ijson.parse(StringIO(json.dumps({"nodes": ["foo"]})))
        next(parser)
        self.assertRaises(ValueError, driver._parse_map, parser, None)

    def test_join_not_stopped(self):
        with patch.object(self.driver._stop_event, "wait"):
            self.assertFalse(self.driver.join())

    def test_process_events_stopped(self):
        self.driver._stop_event.set()
        self.assertRaises(DriverShutdown, self.driver._process_events_only)

    def test_watch_etcd_already_stopped(self):
        stop_event = threading.Event()
        stop_event.set()
        m_queue = Mock()
        self.driver.watch_etcd(10, m_queue, stop_event)
        self.assertEqual(m_queue.put.mock_calls, [call(None)])

    def test_watch_etcd_driver_shutdown(self):
        stop_event = threading.Event()
        self.driver.get_etcd_connection = Mock()
        self.driver._etcd_request = Mock()
        self.driver._check_cluster_id = Mock(side_effect=DriverShutdown())
        # Should return without exception.
        m_queue = Mock()
        self.driver.watch_etcd(10, m_queue, stop_event)
        # And send it's normal shutdown signal.
        self.assertEqual(m_queue.put.mock_calls, [call(None)])
Beispiel #2
0
class TestDriver(TestCase):
    """
    Unit-test tests of the Driver.
    """
    def setUp(self):
        self.m_sck = Mock(spec=socket.socket)
        self.driver = EtcdDriver(self.m_sck)
        self.msg_reader = StubMessageReader(self.m_sck)
        self.msg_writer = StubMessageWriter(self.m_sck)
        self.driver._msg_reader = self.msg_reader
        self.driver._msg_writer = self.msg_writer

    def test_read_bad_message(self):
        self.msg_reader.send_msg("unknown", {})
        self.assertRaises(RuntimeError, self.driver._read_from_socket)

    def test_read_socket_closed(self):
        self.msg_reader.send_exception(SocketClosed())
        self.driver._read_from_socket()

    def test_read_driver_shutdown(self):
        self.msg_reader.send_exception(DriverShutdown())
        self.driver._read_from_socket()

    def test_shutdown_before_config(self):
        self.driver._stop_event.set()
        self.assertRaises(DriverShutdown, self.driver._wait_for_config)

    def test_shutdown_before_ready(self):
        self.driver._stop_event.set()
        self.assertRaises(DriverShutdown, self.driver._wait_for_ready)

    def test_issue_etcd_request_basic_get(self):
        # Initialise the etcd URL.
        self.driver._handle_init({
            MSG_KEY_ETCD_URLS: ["http://*****:*****@patch("time.sleep")
    def test_resync_http_error(self, m_sleep):
        self.driver._init_received.set()
        with patch.object(self.driver, "get_etcd_connection") as m_get:
            with patch("calico.etcddriver.driver.monotonic_time") as m_time:
                m_time.side_effect = iter([
                    1, 10, RuntimeError()
                ])
                m_get.side_effect = HTTPError()
                self.assertRaises(RuntimeError, self.driver._resync_and_merge)

    def test_parse_snap_error_from_etcd(self):
        parser = ijson.parse(StringIO(json.dumps({
            "errorCode": 100
        })))
        next(parser)
        self.assertRaises(ResyncRequired, driver._parse_map, parser, None)

    def test_parse_snap_bad_data(self):
        parser = ijson.parse(StringIO(json.dumps({
            "nodes": [
                "foo"
            ]
        })))
        next(parser)
        self.assertRaises(ValueError, driver._parse_map, parser, None)

    def test_join_not_stopped(self):
        with patch.object(self.driver._stop_event, "wait"):
            self.assertFalse(self.driver.join())

    def test_process_events_stopped(self):
        self.driver._stop_event.set()
        self.assertRaises(DriverShutdown, self.driver._process_events_only)

    def test_watch_etcd_already_stopped(self):
        stop_event = threading.Event()
        stop_event.set()
        m_queue = Mock()
        self.driver.watch_etcd(10, m_queue, stop_event)
        self.assertEqual(m_queue.put.mock_calls, [call(None)])

    def test_watch_etcd_driver_shutdown(self):
        stop_event = threading.Event()
        self.driver.get_etcd_connection = Mock()
        self.driver._etcd_request = Mock()
        self.driver._check_cluster_id = Mock(side_effect=DriverShutdown())
        # Should return without exception.
        m_queue = Mock()
        self.driver.watch_etcd(10, m_queue, stop_event)
        # And send it's normal shutdown signal.
        self.assertEqual(m_queue.put.mock_calls, [call(None)])

    @patch("calico.etcddriver.driver.complete_logging", autospec=True)
    @patch("calico.etcddriver.driver.start_http_server", autospec=True)
    def test_handle_config_starts_metrics(self, start_http, compl_log):
        self.driver._handle_config({
            MSG_KEY_LOG_FILE: "/tmp/driver.log",
            MSG_KEY_SEV_FILE: "DEBUG",
            MSG_KEY_SEV_SCREEN: "INFO",
            MSG_KEY_SEV_SYSLOG: "WARNING",
            MSG_KEY_PROM_PORT: 9092,
        })
        start_http.assert_called_once_with(9092)
        compl_log.assert_called_once_with("/tmp/driver.log",
                                          file_level="DEBUG",
                                          syslog_level="WARNING",
                                          stream_level="INFO",
                                          gevent_in_use=False)