Enable providing keystone session for Prometheus
This enables us to create a PrometheusAPIClient, which uses a keystone session when communicating with Prometheus, which causes the requests to include an X-Auth-Token header with the user's keystone token. This will enable observabilityclient to authenticate when communicating with Aetos in the future. Change-Id: I3693a6906efccdbb193ddd1e927ed83975592442
This commit is contained in:
@@ -53,9 +53,12 @@ class PrometheusMetric(object):
|
|||||||
|
|
||||||
|
|
||||||
class PrometheusAPIClient(object):
|
class PrometheusAPIClient(object):
|
||||||
def __init__(self, host):
|
def __init__(self, host, session=None):
|
||||||
self._host = host
|
self._host = host
|
||||||
self._session = requests.Session()
|
if session is None:
|
||||||
|
self._session = requests.Session()
|
||||||
|
else:
|
||||||
|
self._session = session
|
||||||
self._session.verify = False
|
self._session.verify = False
|
||||||
|
|
||||||
def set_ca_cert(self, ca_cert):
|
def set_ca_cert(self, ca_cert):
|
||||||
@@ -75,7 +78,8 @@ class PrometheusAPIClient(object):
|
|||||||
def _get(self, endpoint, params=None):
|
def _get(self, endpoint, params=None):
|
||||||
url = self._get_url(endpoint)
|
url = self._get_url(endpoint)
|
||||||
resp = self._session.get(url, params=params,
|
resp = self._session.get(url, params=params,
|
||||||
headers={'Accept': 'application/json'})
|
headers={'Accept': 'application/json',
|
||||||
|
'Accept-Encoding': 'identity'})
|
||||||
if resp.status_code != requests.codes.ok:
|
if resp.status_code != requests.codes.ok:
|
||||||
raise PrometheusAPIClientError(resp)
|
raise PrometheusAPIClientError(resp)
|
||||||
decoded = resp.json()
|
decoded = resp.json()
|
||||||
|
@@ -98,7 +98,8 @@ class PrometheusAPIClientTest(PrometheusAPIClientTestBase):
|
|||||||
|
|
||||||
m.assert_called_with(expected_url,
|
m.assert_called_with(expected_url,
|
||||||
params=expected_params,
|
params=expected_params,
|
||||||
headers={'Accept': 'application/json'})
|
headers={'Accept': 'application/json',
|
||||||
|
'Accept-Encoding': 'identity'})
|
||||||
|
|
||||||
def test_get_error(self):
|
def test_get_error(self):
|
||||||
url = "test"
|
url = "test"
|
||||||
|
@@ -55,19 +55,20 @@ class GetPrometheusClientTest(testtools.TestCase):
|
|||||||
mock.patch.object(prometheus_client.PrometheusAPIClient,
|
mock.patch.object(prometheus_client.PrometheusAPIClient,
|
||||||
"__init__", return_value=None) as m:
|
"__init__", return_value=None) as m:
|
||||||
metric_utils.get_prometheus_client()
|
metric_utils.get_prometheus_client()
|
||||||
m.assert_called_with("somehost:1234")
|
m.assert_called_with("somehost:1234", None)
|
||||||
|
|
||||||
def test_get_prometheus_client_env_overide(self):
|
def test_get_prometheus_client_env_override(self):
|
||||||
with mock.patch.dict(os.environ, {'PROMETHEUS_HOST': 'env_overide'}), \
|
with mock.patch.dict(os.environ,
|
||||||
|
{'PROMETHEUS_HOST': 'env_override'}), \
|
||||||
mock.patch.object(metric_utils, 'get_config_file',
|
mock.patch.object(metric_utils, 'get_config_file',
|
||||||
return_value=self.config_file), \
|
return_value=self.config_file), \
|
||||||
mock.patch.object(prometheus_client.PrometheusAPIClient,
|
mock.patch.object(prometheus_client.PrometheusAPIClient,
|
||||||
"__init__", return_value=None) as m:
|
"__init__", return_value=None) as m:
|
||||||
metric_utils.get_prometheus_client()
|
metric_utils.get_prometheus_client()
|
||||||
m.assert_called_with("env_overide:1234")
|
m.assert_called_with("env_override:1234", None)
|
||||||
|
|
||||||
def test_get_prometheus_client_no_config_file(self):
|
def test_get_prometheus_client_no_config_file(self):
|
||||||
patched_env = {'PROMETHEUS_HOST': 'env_overide',
|
patched_env = {'PROMETHEUS_HOST': 'env_override',
|
||||||
'PROMETHEUS_PORT': 'env_port'}
|
'PROMETHEUS_PORT': 'env_port'}
|
||||||
with mock.patch.dict(os.environ, patched_env), \
|
with mock.patch.dict(os.environ, patched_env), \
|
||||||
mock.patch.object(metric_utils, 'get_config_file',
|
mock.patch.object(metric_utils, 'get_config_file',
|
||||||
@@ -75,7 +76,7 @@ class GetPrometheusClientTest(testtools.TestCase):
|
|||||||
mock.patch.object(prometheus_client.PrometheusAPIClient,
|
mock.patch.object(prometheus_client.PrometheusAPIClient,
|
||||||
"__init__", return_value=None) as m:
|
"__init__", return_value=None) as m:
|
||||||
metric_utils.get_prometheus_client()
|
metric_utils.get_prometheus_client()
|
||||||
m.assert_called_with("env_overide:env_port")
|
m.assert_called_with("env_override:env_port", None)
|
||||||
|
|
||||||
def test_get_prometheus_client_missing_configuration(self):
|
def test_get_prometheus_client_missing_configuration(self):
|
||||||
with mock.patch.dict(os.environ, {}), \
|
with mock.patch.dict(os.environ, {}), \
|
||||||
|
@@ -45,7 +45,7 @@ def get_config_file():
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
def get_prometheus_client():
|
def get_prometheus_client(session=None):
|
||||||
host = None
|
host = None
|
||||||
port = None
|
port = None
|
||||||
ca_cert = None
|
ca_cert = None
|
||||||
@@ -71,7 +71,7 @@ def get_prometheus_client():
|
|||||||
if host is None or port is None:
|
if host is None or port is None:
|
||||||
raise ConfigurationError("Can't find prometheus host and "
|
raise ConfigurationError("Can't find prometheus host and "
|
||||||
"port configuration.")
|
"port configuration.")
|
||||||
client = PrometheusAPIClient(f"{host}:{port}") # noqa: E231
|
client = PrometheusAPIClient(f"{host}:{port}", session) # noqa: E231
|
||||||
if ca_cert is not None:
|
if ca_cert is not None:
|
||||||
client.set_ca_cert(ca_cert)
|
client.set_ca_cert(ca_cert)
|
||||||
return client
|
return client
|
||||||
|
@@ -38,6 +38,6 @@ class Client(object):
|
|||||||
|
|
||||||
self.session = session
|
self.session = session
|
||||||
|
|
||||||
self.prometheus_client = get_prometheus_client()
|
self.prometheus_client = get_prometheus_client(session)
|
||||||
self.query = python_api.QueryManager(self)
|
self.query = python_api.QueryManager(self)
|
||||||
self.rbac = rbac.Rbac(self, self.session, disable_rbac)
|
self.rbac = rbac.Rbac(self, self.session, disable_rbac)
|
||||||
|
Reference in New Issue
Block a user