]> git.proxmox.com Git - ceph.git/blame - ceph/src/pybind/mgr/dashboard/tests/test_grafana.py
import ceph quincy 17.2.1
[ceph.git] / ceph / src / pybind / mgr / dashboard / tests / test_grafana.py
CommitLineData
92f5a8d4
TL
1import json
2import unittest
3
4try:
5 from mock import patch
6except ImportError:
7 from unittest.mock import patch
8
9f95a23c
TL
9from requests import RequestException
10
11fdf7f2 11from ..controllers.grafana import Grafana
92f5a8d4
TL
12from ..grafana import GrafanaRestClient
13from ..settings import Settings
a4b75251 14from ..tests import ControllerTestCase, KVStoreMockMixin
11fdf7f2
TL
15
16
9f95a23c 17class GrafanaTest(ControllerTestCase, KVStoreMockMixin):
11fdf7f2
TL
18 @classmethod
19 def setup_server(cls):
11fdf7f2
TL
20 cls.setup_controllers([Grafana])
21
9f95a23c
TL
22 def setUp(self):
23 self.mock_kv_store()
24
25 @staticmethod
81eedcae 26 def server_settings(
81eedcae
TL
27 url='http://localhost:3000',
28 user='admin',
29 password='admin',
30 ):
81eedcae 31 if url is not None:
9f95a23c 32 Settings.GRAFANA_API_URL = url
81eedcae 33 if user is not None:
9f95a23c 34 Settings.GRAFANA_API_USERNAME = user
81eedcae 35 if password is not None:
9f95a23c 36 Settings.GRAFANA_API_PASSWORD = password
81eedcae 37
11fdf7f2 38 def test_url(self):
81eedcae 39 self.server_settings()
11fdf7f2
TL
40 self._get('/api/grafana/url')
41 self.assertStatus(200)
42 self.assertJsonBody({'instance': 'http://localhost:3000'})
43
9f95a23c
TL
44 @patch('dashboard.controllers.grafana.GrafanaRestClient.url_validation')
45 def test_validation_endpoint_returns(self, url_validation):
46 """
47 The point of this test is to see that `validation` is an active endpoint that returns a 200
48 status code.
49 """
50 url_validation.return_value = b'404'
81eedcae 51 self.server_settings()
11fdf7f2 52 self._get('/api/grafana/validation/foo')
9f95a23c
TL
53 self.assertStatus(200)
54 self.assertBody(b'"404"')
81eedcae 55
33c7a0ef
TL
56 @patch('dashboard.controllers.grafana.GrafanaRestClient.url_validation')
57 def test_validation_endpoint_fails(self, url_validation):
58 url_validation.side_effect = RequestException
59 self.server_settings()
60 self._get('/api/grafana/validation/bar')
61 self.assertStatus(400)
62 self.assertJsonBody({'detail': '', 'code': 'Error', 'component': 'grafana'})
63
9f95a23c
TL
64 def test_dashboards_unavailable_no_url(self):
65 self.server_settings(url="")
81eedcae
TL
66 self._post('/api/grafana/dashboards')
67 self.assertStatus(500)
9f95a23c
TL
68
69 @patch('dashboard.controllers.grafana.GrafanaRestClient.push_dashboard')
70 def test_dashboards_unavailable_no_user(self, pd):
71 pd.side_effect = RequestException
72 self.server_settings(user="")
81eedcae
TL
73 self._post('/api/grafana/dashboards')
74 self.assertStatus(500)
9f95a23c
TL
75
76 def test_dashboards_unavailable_no_password(self):
77 self.server_settings(password="")
81eedcae
TL
78 self._post('/api/grafana/dashboards')
79 self.assertStatus(500)
92f5a8d4
TL
80
81
82class GrafanaRestClientTest(unittest.TestCase, KVStoreMockMixin):
83 headers = {
84 'Accept': 'application/json',
85 'Content-Type': 'application/json',
86 }
87 payload = json.dumps({
88 'dashboard': 'foo',
89 'overwrite': True
90 })
91
92 def setUp(self):
93 self.mock_kv_store()
94 Settings.GRAFANA_API_URL = 'https://foo/bar'
95 Settings.GRAFANA_API_USERNAME = 'xyz'
96 Settings.GRAFANA_API_PASSWORD = 'abc'
97 Settings.GRAFANA_API_SSL_VERIFY = True
98
99 def test_ssl_verify_url_validation(self):
100 with patch('requests.request') as mock_request:
101 rest_client = GrafanaRestClient()
102 rest_client.url_validation('FOO', Settings.GRAFANA_API_URL)
103 mock_request.assert_called_with('FOO', Settings.GRAFANA_API_URL,
104 verify=True)
105
106 def test_no_ssl_verify_url_validation(self):
107 Settings.GRAFANA_API_SSL_VERIFY = False
108 with patch('requests.request') as mock_request:
109 rest_client = GrafanaRestClient()
110 rest_client.url_validation('BAR', Settings.GRAFANA_API_URL)
111 mock_request.assert_called_with('BAR', Settings.GRAFANA_API_URL,
112 verify=False)
113
114 def test_ssl_verify_push_dashboard(self):
115 with patch('requests.post') as mock_request:
116 rest_client = GrafanaRestClient()
117 rest_client.push_dashboard('foo')
118 mock_request.assert_called_with(
119 Settings.GRAFANA_API_URL + '/api/dashboards/db',
120 auth=(Settings.GRAFANA_API_USERNAME,
121 Settings.GRAFANA_API_PASSWORD),
122 data=self.payload, headers=self.headers, verify=True)
123
124 def test_no_ssl_verify_push_dashboard(self):
125 Settings.GRAFANA_API_SSL_VERIFY = False
126 with patch('requests.post') as mock_request:
127 rest_client = GrafanaRestClient()
128 rest_client.push_dashboard('foo')
129 mock_request.assert_called_with(
130 Settings.GRAFANA_API_URL + '/api/dashboards/db',
131 auth=(Settings.GRAFANA_API_USERNAME,
132 Settings.GRAFANA_API_PASSWORD),
133 data=self.payload, headers=self.headers, verify=False)