Esempio n. 1
0
    def test_query_api_with_retries_other_error_rate_limited(self):
        with mock.patch.object(KubernetesApi, "query_api") as mock_query:
            mock_query.side_effect = K8sApiPermanentError("Permanent Error")

            k8s = KubernetesApi()
            rate_limiter = BlockingRateLimiter(
                num_agents=1,
                initial_cluster_rate=100,
                max_cluster_rate=1000,
                min_cluster_rate=1,
                consecutive_success_threshold=1,
                strategy="multiply",
            )
            options = ApiQueryOptions(rate_limiter=rate_limiter, max_retries=0)
            self.assertRaises(
                K8sApiPermanentError,
                lambda: k8s.query_api_with_retries("/foo/bar", options),
            )
            self.assertEqual(rate_limiter.current_cluster_rate, 50.0)

            mock_query.side_effect = Exception("Some other exception")
            self.assertRaises(
                Exception,
                lambda: k8s.query_api_with_retries("/foo/bar", options))
            self.assertEqual(rate_limiter.current_cluster_rate, 25.0)
Esempio n. 2
0
 def test_query_api_min_response_len(self):
     """Fails to satisfy minimum response len.  Not logged"""
     kapi = KubernetesApi(log_api_responses=True,
                          log_api_min_response_len=3)
     # pylint: disable=no-value-for-parameter
     mock_logger, expected_log_msg = self._simulate_response(kapi, 200)
     self._assert_not_logged(mock_logger, expected_log_msg)
Esempio n. 3
0
    def test_query_api_non_200_always_logged(self):
        """Non-200 response logged when 200s are excluded"""
        kapi = KubernetesApi(log_api_responses=True, log_api_exclude_200s=True)

        def func():
            mock_logger, expected_log_msg = self._simulate_response(kapi, 404)
            self._assert_logged(mock_logger, expected_log_msg)

        self.assertRaises(K8sApiNotFoundException, lambda: func())
Esempio n. 4
0
    def test_query_api_exception_obey_criteria(self):
        """Exception response obeys criteria (such as latency)"""
        kapi = KubernetesApi(log_api_responses=True, log_api_min_latency=100)

        def func():
            mock_logger, expected_log_msg = self._simulate_response(kapi, requests.ReadTimeout())
            self._assert_not_logged(mock_logger, expected_log_msg)

        self.assertRaises(requests.ReadTimeout, lambda: func())
Esempio n. 5
0
    def test_query_api_exception_logged(self):
        """Exception response are logged in general"""
        kapi = KubernetesApi(log_api_responses=True)

        def func():
            mock_logger, expected_log_msg = self._simulate_response(kapi, requests.ReadTimeout())
            self._assert_logged(mock_logger, expected_log_msg)

        self.assertRaises(requests.ReadTimeout, lambda: func())
Esempio n. 6
0
 def test_query_api_ratelimit(self):
     """Fails to satisfy minimum latency.  Not logged"""
     kapi = KubernetesApi(log_api_responses=True, log_api_ratelimit_interval=77)
     mock_logger, expected_log_msg = self._simulate_response(kapi, 200)
     mock_logger.log.assert_called_with(
         scalyr_logging.DEBUG_LEVEL_1,
         expected_log_msg,
         limit_once_per_x_secs=77,
         limit_key='query-api-log-resp-%s' % md5_hexdigest(self._path))
Esempio n. 7
0
    def test_query_api_exception_logged(self):
        """Exception response are logged in general"""
        kapi = KubernetesApi(log_api_responses=True)

        def func():
            (
                mock_logger,
                expected_log_msg,
            ) = self._simulate_response(  # pylint: disable=no-value-for-parameter
                kapi, requests.ReadTimeout())
            self._assert_logged(mock_logger, expected_log_msg)

        self.assertRaises(requests.ReadTimeout, lambda: func())
Esempio n. 8
0
    def test_query_api_with_retries_not_found_not_rate_limited( self ):
        with mock.patch.object( KubernetesApi, "query_api" ) as mock_query:
            mock_query.side_effect = K8sApiNotFoundException( "/foo/bar" )

            k8s = KubernetesApi()
            rate_limiter = BlockingRateLimiter(
                num_agents=1, initial_cluster_rate=100, max_cluster_rate=1000, min_cluster_rate=1,
                consecutive_success_threshold=1,
                strategy='multiply',
            )
            options = ApiQueryOptions( rate_limiter=rate_limiter )
            self.assertRaises( K8sApiNotFoundException, lambda: k8s.query_api_with_retries( "/foo/bar", options ) )
            self.assertEqual( rate_limiter.current_cluster_rate, 200.0 )
Esempio n. 9
0
    def test_query_api_with_retries_success_not_rate_limited( self ):
        with mock.patch.object( KubernetesApi, "query_api" ) as mock_query:
            mock_query.return_value = { "success": "success" }

            k8s = KubernetesApi()
            rate_limiter = BlockingRateLimiter(
                num_agents=1, initial_cluster_rate=100, max_cluster_rate=1000, min_cluster_rate=1,
                consecutive_success_threshold=1,
                strategy='multiply',
            )
            options = ApiQueryOptions( rate_limiter=rate_limiter )
            result = k8s.query_api_with_retries( "/foo/bar", options )
            self.assertEqual( result, { "success": "success" } )
            self.assertEqual( rate_limiter.current_cluster_rate, 200.0 )
Esempio n. 10
0
 def test_query_api_200s_not_logged(self):
     """200 response not logged when 200s are excluded"""
     kapi = KubernetesApi(log_api_responses=True, log_api_exclude_200s=True)
     # pylint: disable=no-value-for-parameter
     mock_logger, expected_log_msg = self._simulate_response(kapi, 200)
     self._assert_not_logged(mock_logger, expected_log_msg)
Esempio n. 11
0
 def test_query_api_no_log(self):
     """Logging is turned off"""
     kapi = KubernetesApi(log_api_responses=False)
     # pylint: disable=no-value-for-parameter
     mock_logger, expected_log_msg = self._simulate_response(kapi, 200)
     self._assert_not_logged(mock_logger, expected_log_msg)
Esempio n. 12
0
 def test_query_api_log_format(self):
     """Logging is turned on.  Asserts proper debug-logging (url + stacktrace + response content)"""
     kapi = KubernetesApi(log_api_responses=True)
     # pylint: disable=no-value-for-parameter
     mock_logger, expected_log_msg = self._simulate_response(kapi, 200)
     self._assert_logged(mock_logger, expected_log_msg)
Esempio n. 13
0
 def test_query_api_min_latency(self):
     """Fails to satisfy minimum latency.  Not logged"""
     kapi = KubernetesApi(log_api_responses=True, log_api_min_latency=10)
     mock_logger, expected_log_msg = self._simulate_response(kapi, 200)
     self._assert_not_logged(mock_logger, expected_log_msg)
Esempio n. 14
0
 def test_query_api_no_log(self):
     """Logging is turned off"""
     kapi = KubernetesApi(log_api_responses=False)
     mock_logger, expected_log_msg = self._simulate_response(kapi, 200)
     self._assert_not_logged(mock_logger, expected_log_msg)