|
| 1 | +import json |
| 2 | +import unittest |
| 3 | + |
| 4 | +import requests_mock |
| 5 | + |
| 6 | +from grafana_client import GrafanaApi |
| 7 | +from grafana_client.client import ( |
| 8 | + GrafanaBadInputError, |
| 9 | + GrafanaClientError, |
| 10 | + GrafanaServerError, |
| 11 | + GrafanaUnauthorizedError, |
| 12 | +) |
| 13 | + |
| 14 | + |
| 15 | +class DatasourceTestCase(unittest.TestCase): |
| 16 | + def setUp(self): |
| 17 | + self.grafana = GrafanaApi(("admin", "admin"), host="localhost", url_path_prefix="", protocol="http") |
| 18 | + |
| 19 | + |
| 20 | + @requests_mock.Mocker() |
| 21 | + def test_find_datasource(self, m): |
| 22 | + m.get( |
| 23 | + "http://localhost/api/datasources/name/Prometheus", |
| 24 | + json={ |
| 25 | + "id":1, |
| 26 | + "uid":"h8KkCLt7z", |
| 27 | + "orgId":1, |
| 28 | + "name":"Prometheus", |
| 29 | + "type":"prometheus", |
| 30 | + "typeName":"Prometheus", |
| 31 | + "typeLogoUrl":"public/app/plugins/datasource/prometheus/img/prometheus_logo.svg", |
| 32 | + "access":"proxy", |
| 33 | + "url":"http://localhost:9090", |
| 34 | + "password":"", |
| 35 | + "user":"", |
| 36 | + "database":"", |
| 37 | + "basicAuth": False, |
| 38 | + "isDefault": True, |
| 39 | + "jsonData":{ |
| 40 | + "httpMethod":"POST" |
| 41 | + }, |
| 42 | + "readOnly": False |
| 43 | + } |
| 44 | + ) |
| 45 | + |
| 46 | + result = self.grafana.datasource.find_datasource('Prometheus') |
| 47 | + self.assertEqual(result["type"], 'prometheus') |
| 48 | + |
| 49 | + @requests_mock.Mocker() |
| 50 | + def test_find_datasource_not_existing(self, m): |
| 51 | + m.get( |
| 52 | + "http://localhost/api/datasources/name/it_doesnot_exist", |
| 53 | + json= {"message": "Data source not found"}, |
| 54 | + status_code=400 |
| 55 | + ) |
| 56 | + |
| 57 | + with self.assertRaises(GrafanaBadInputError): |
| 58 | + result = self.grafana.datasource.find_datasource('it_doesnot_exist') |
| 59 | + |
| 60 | + |
| 61 | + @requests_mock.Mocker() |
| 62 | + def test_get_datasource_id_by_name(self, m): |
| 63 | + m.get( |
| 64 | + "http://localhost/api/datasources/id/Prometheus", |
| 65 | + json={"id": 1} |
| 66 | + ) |
| 67 | + |
| 68 | + result = self.grafana.datasource.get_datasource_id_by_name('Prometheus') |
| 69 | + self.assertEqual(result["id"], 1) |
| 70 | + |
| 71 | + |
| 72 | + @requests_mock.Mocker() |
| 73 | + def test_list_datasources(self, m): |
| 74 | + m.get( |
| 75 | + "http://localhost/api/datasources", |
| 76 | + json=[ |
| 77 | + { |
| 78 | + "id":1, |
| 79 | + "uid":"h8KkCLt7z", |
| 80 | + "orgId":1, |
| 81 | + "name":"Prometheus", |
| 82 | + "type":"prometheus", |
| 83 | + "typeName":"Prometheus", |
| 84 | + "typeLogoUrl":"public/app/plugins/datasource/prometheus/img/prometheus_logo.svg", |
| 85 | + "access":"proxy", |
| 86 | + "url":"http://localhost:9090", |
| 87 | + "password":"", |
| 88 | + "user":"", |
| 89 | + "database":"", |
| 90 | + "basicAuth": False, |
| 91 | + "isDefault": True, |
| 92 | + "jsonData":{ |
| 93 | + "httpMethod":"POST" |
| 94 | + }, |
| 95 | + "readOnly": False |
| 96 | + } |
| 97 | + ], |
| 98 | + ) |
| 99 | + |
| 100 | + result = self.grafana.datasource.list_datasources() |
| 101 | + self.assertEqual(result[0]["type"], 'prometheus') |
| 102 | + self.assertEqual(len(result), 1) |
| 103 | + |
| 104 | + @requests_mock.Mocker() |
| 105 | + def test_get_datasource_proxy_data(self, m): |
| 106 | + # http://localhost:3000/api/datasources/proxy/1/api/v1/query_range?query=up%7binstance%3d%22localhost:9090%22%7d&start=1644164339&end=1644164639&step=60 |
| 107 | + m.get( |
| 108 | + "http://localhost/api/datasources/proxy/1/api/v1/query_range", |
| 109 | + json={ |
| 110 | + "status": "success", |
| 111 | + "data": { |
| 112 | + "resultType": "matrix", |
| 113 | + "result":[ |
| 114 | + { |
| 115 | + "metric":{ |
| 116 | + "__name__":"up", |
| 117 | + "instance":"localhost:9090", |
| 118 | + "job":"prometheus" |
| 119 | + }, |
| 120 | + "values":[ |
| 121 | + [1644164339,"1"], |
| 122 | + [1644164399,"1"], |
| 123 | + [1644164459,"1"], |
| 124 | + [1644164519,"1"], |
| 125 | + [1644164579,"1"], |
| 126 | + [1644164639,"1"] |
| 127 | + ] |
| 128 | + } |
| 129 | + ] |
| 130 | + } |
| 131 | + } |
| 132 | + ) |
| 133 | + result = self.grafana.datasource.get_datasource_proxy_data( |
| 134 | + 1, # datasource_id |
| 135 | + query_type='query_range', |
| 136 | + expr="up{instance=\"localhost:9090\"}", |
| 137 | + start=1644164339, |
| 138 | + end=1644164639, |
| 139 | + step=60, |
| 140 | + ) |
| 141 | + self.assertEqual(result["status"], 'success') |
| 142 | + self.assertEqual(result["data"]["result"][0]["metric"]["job"], 'prometheus') |
| 143 | + self.assertEqual(len(result["data"]["result"][0]["values"]), 6) |
0 commit comments