monasca-agent/tests/checks_d/test_kubernetes_api.py

159 lines
7.1 KiB
Python

# (C) Copyright 2017 Hewlett Packard Enterprise Development LP
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from unittest import mock
import unittest
from monasca_agent.collector.checks_d.kubernetes_api import KubernetesAPI
SUCCESS = 0
FAILURE = 1
KUBERNETES_LABELS = ['app']
class TestKubernetesAPI(unittest.TestCase):
def setUp(self):
unittest.TestCase.setUp(self)
init_config = {}
agent_config = {}
self._kubernetes_api = KubernetesAPI('TestKubernetesAPI',
init_config,
agent_config)
self._gauge = mock.Mock()
self._kubernetes_api.gauge = self._gauge
self._hostname = 'SUPPRESS'
self._instance = {'derive_api_url': True}
self._base_dimensions = {}
def _get_api_health_check(self, instance, result_input):
mock_check = mock.Mock(return_value=result_input)
self._kubernetes_api._get_api_health = mock_check
self._kubernetes_api.check(instance)
def test_kubernetes_api_is_healthy(self):
api_health_result = True
self._get_api_health_check(self._instance,
api_health_result)
self._gauge.assert_called_with('kubernetes.api.health_status',
SUCCESS,
self._base_dimensions,
hostname=self._hostname)
def test_kubernetes_api_is_not_healthy(self):
api_health_result = False
self._get_api_health_check(self._instance,
api_health_result)
self._gauge.assert_called_with('kubernetes.api.health_status',
FAILURE,
self._base_dimensions,
hostname=self._hostname)
def _send_request(self, result_input):
mock_check = mock.Mock(return_value=result_input)
self._kubernetes_api._send_request = mock_check
def test_report_cluster_component_statuses(self):
component_statuses_request_result = {
u'items': [
{u'conditions': [{
u'status': u'True',
u'message': u'{"health": "true"}',
u'type': u'Healthy'}],
u'metadata': {u'creationTimestamp': None,
u'name': u'etcd-0'}}],
u'kind': u'ComponentStatusList',
u'apiVersion': u'v1',
u'metadata': {u'selfLink': u'/api/v1/componentstatuses'}}
self._send_request(component_statuses_request_result)
self._kubernetes_api._report_cluster_component_statuses(
self._base_dimensions)
self._gauge.assert_called_with('kubernetes.component_status',
SUCCESS,
{'component_name': u'etcd-0'},
hostname=self._hostname)
def test_nodes_capacity_metric(self):
nodes_request_result = {
u'items': [
{u'status': {
u'capacity': {u'cpu': u'4'},
u'allocatable': {},
u'daemonEndpoints': {
u'kubeletEndpoint': {u'Port': 10250}},
u'images': [{u'sizeBytes': 821774423,
u'names': [u'image_name',
u'image_name:latest']}],
u'conditions': [{u'status': u'False',
u'type': u'OutOfDisk'}]},
u'metadata': {u'name': u'node01',
u'uid': u'e3600619-2557-11e7-9d76-aab101'}}]}
self._send_request(nodes_request_result)
self._kubernetes_api._report_nodes_metrics(self._base_dimensions)
self._gauge.assert_called_with('kubernetes.node.capacity.cpu',
4.0,
{'hostname': u'node01',
'unit': 'cores'})
def test_nodes_allocatable_metric(self):
nodes_request_result = {
u'items': [
{u'status': {
u'capacity': {},
u'allocatable': {
u'alpha.kubernetes.io/nvidia-gpu': u'0',
u'pods': u'110'},
u'daemonEndpoints': {
u'kubeletEndpoint': {u'Port': 10250}},
u'images': [{u'sizeBytes': 821774423,
u'names': [u'image_name',
u'image_name:latest']}],
u'conditions': [{u'status': u'False',
u'type': u'OutOfDisk'},
{u'status': u'False',
u'type': u'MemoryPressure'},
{u'status': u'False',
u'type': u'DiskPressure'},
{u'status': u'True',
u'type': u'Ready'}]},
u'metadata': {u'name': u'node01',
u'uid': u'e3600619-2557-11e7-9d76-aa3201'}}]}
self._send_request(nodes_request_result)
self._kubernetes_api._report_nodes_metrics(self._base_dimensions)
self._gauge.assert_called_with('kubernetes.node.allocatable.pods',
110.0,
{'hostname': u'node01'})
def test_deployment_metrics(self):
deployments_request_result = {
u'items': [
{u'status': {
u'observedGeneration': 1,
u'updatedReplicas': 2,
u'availableReplicas': 3,
u'replicas': 4
},
u'metadata': {u'name': u'kube-controller-manager',
u'labels': {
u'k8s-app': u'kube-controller-manager'},
u'namespace': u'kube-system',
u'uid': u'e61835b9-2557-11e7-9d76-aabbcc201'}}]}
self._send_request(deployments_request_result)
self._kubernetes_api._report_deployment_metrics(self._base_dimensions,
KUBERNETES_LABELS)
self._gauge.assert_called_with(
'kubernetes.deployment.updated_replicas', 2,
{'type': u'kube-controller-manager',
'namespace': u'kube-system'},
hostname=self._hostname)