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