summaryrefslogtreecommitdiffstats
path: root/src/pybind/mgr/dashboard/tests/test_grafana.py
blob: b822020d8ac9aa51a38d1bbfb1ca1ee0c54e318e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
import json
import unittest

try:
    from mock import patch
except ImportError:
    from unittest.mock import patch

from requests import RequestException

from ..controllers.grafana import Grafana
from ..grafana import GrafanaRestClient
from ..settings import Settings
from ..tests import ControllerTestCase, KVStoreMockMixin


class GrafanaTest(ControllerTestCase, KVStoreMockMixin):
    @classmethod
    def setup_server(cls):
        cls.setup_controllers([Grafana])

    def setUp(self):
        self.mock_kv_store()

    @staticmethod
    def server_settings(
            url='http://localhost:3000',
            user='admin',
            password='admin',
    ):
        if url is not None:
            Settings.GRAFANA_API_URL = url
        if user is not None:
            Settings.GRAFANA_API_USERNAME = user
        if password is not None:
            Settings.GRAFANA_API_PASSWORD = password

    def test_url(self):
        self.server_settings()
        self._get('/api/grafana/url')
        self.assertStatus(200)
        self.assertJsonBody({'instance': 'http://localhost:3000'})

    @patch('dashboard.controllers.grafana.GrafanaRestClient.url_validation')
    def test_validation_endpoint_returns(self, url_validation):
        """
        The point of this test is to see that `validation` is an active endpoint that returns a 200
        status code.
        """
        url_validation.return_value = b'404'
        self.server_settings()
        self._get('/api/grafana/validation/foo')
        self.assertStatus(200)
        self.assertBody(b'"404"')

    @patch('dashboard.controllers.grafana.GrafanaRestClient.url_validation')
    def test_validation_endpoint_fails(self, url_validation):
        url_validation.side_effect = RequestException
        self.server_settings()
        self._get('/api/grafana/validation/bar')
        self.assertStatus(400)
        self.assertJsonBody({'detail': '', 'code': 'Error', 'component': 'grafana'})

    def test_dashboards_unavailable_no_url(self):
        self.server_settings(url="")
        self._post('/api/grafana/dashboards')
        self.assertStatus(500)

    @patch('dashboard.controllers.grafana.GrafanaRestClient.push_dashboard')
    def test_dashboards_unavailable_no_user(self, pd):
        pd.side_effect = RequestException
        self.server_settings(user="")
        self._post('/api/grafana/dashboards')
        self.assertStatus(500)

    def test_dashboards_unavailable_no_password(self):
        self.server_settings(password="")
        self._post('/api/grafana/dashboards')
        self.assertStatus(500)


class GrafanaRestClientTest(unittest.TestCase, KVStoreMockMixin):
    headers = {
        'Accept': 'application/json',
        'Content-Type': 'application/json',
    }
    payload = json.dumps({
        'dashboard': 'foo',
        'overwrite': True
    })

    def setUp(self):
        self.mock_kv_store()
        Settings.GRAFANA_API_URL = 'https://foo/bar'
        Settings.GRAFANA_API_USERNAME = 'xyz'
        Settings.GRAFANA_API_PASSWORD = 'abc'
        Settings.GRAFANA_API_SSL_VERIFY = True

    def test_ssl_verify_url_validation(self):
        with patch('requests.request') as mock_request:
            rest_client = GrafanaRestClient()
            rest_client.url_validation('FOO', Settings.GRAFANA_API_URL)
            mock_request.assert_called_with('FOO', Settings.GRAFANA_API_URL,
                                            verify=True)

    def test_no_ssl_verify_url_validation(self):
        Settings.GRAFANA_API_SSL_VERIFY = False
        with patch('requests.request') as mock_request:
            rest_client = GrafanaRestClient()
            rest_client.url_validation('BAR', Settings.GRAFANA_API_URL)
            mock_request.assert_called_with('BAR', Settings.GRAFANA_API_URL,
                                            verify=False)

    def test_ssl_verify_push_dashboard(self):
        with patch('requests.post') as mock_request:
            rest_client = GrafanaRestClient()
            rest_client.push_dashboard('foo')
            mock_request.assert_called_with(
                Settings.GRAFANA_API_URL + '/api/dashboards/db',
                auth=(Settings.GRAFANA_API_USERNAME,
                      Settings.GRAFANA_API_PASSWORD),
                data=self.payload, headers=self.headers, verify=True)

    def test_no_ssl_verify_push_dashboard(self):
        Settings.GRAFANA_API_SSL_VERIFY = False
        with patch('requests.post') as mock_request:
            rest_client = GrafanaRestClient()
            rest_client.push_dashboard('foo')
            mock_request.assert_called_with(
                Settings.GRAFANA_API_URL + '/api/dashboards/db',
                auth=(Settings.GRAFANA_API_USERNAME,
                      Settings.GRAFANA_API_PASSWORD),
                data=self.payload, headers=self.headers, verify=False)