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:
Jaromir Wysoglad
2025-04-16 17:36:57 -04:00
parent 5de446e314
commit ccf4ace2b5
5 changed files with 19 additions and 13 deletions

View File

@@ -53,9 +53,12 @@ class PrometheusMetric(object):
class PrometheusAPIClient(object):
def __init__(self, host):
def __init__(self, host, session=None):
self._host = host
self._session = requests.Session()
if session is None:
self._session = requests.Session()
else:
self._session = session
self._session.verify = False
def set_ca_cert(self, ca_cert):
@@ -75,7 +78,8 @@ class PrometheusAPIClient(object):
def _get(self, endpoint, params=None):
url = self._get_url(endpoint)
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:
raise PrometheusAPIClientError(resp)
decoded = resp.json()

View File

@@ -98,7 +98,8 @@ class PrometheusAPIClientTest(PrometheusAPIClientTestBase):
m.assert_called_with(expected_url,
params=expected_params,
headers={'Accept': 'application/json'})
headers={'Accept': 'application/json',
'Accept-Encoding': 'identity'})
def test_get_error(self):
url = "test"

View File

@@ -55,19 +55,20 @@ class GetPrometheusClientTest(testtools.TestCase):
mock.patch.object(prometheus_client.PrometheusAPIClient,
"__init__", return_value=None) as m:
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):
with mock.patch.dict(os.environ, {'PROMETHEUS_HOST': 'env_overide'}), \
def test_get_prometheus_client_env_override(self):
with mock.patch.dict(os.environ,
{'PROMETHEUS_HOST': 'env_override'}), \
mock.patch.object(metric_utils, 'get_config_file',
return_value=self.config_file), \
mock.patch.object(prometheus_client.PrometheusAPIClient,
"__init__", return_value=None) as m:
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):
patched_env = {'PROMETHEUS_HOST': 'env_overide',
patched_env = {'PROMETHEUS_HOST': 'env_override',
'PROMETHEUS_PORT': 'env_port'}
with mock.patch.dict(os.environ, patched_env), \
mock.patch.object(metric_utils, 'get_config_file',
@@ -75,7 +76,7 @@ class GetPrometheusClientTest(testtools.TestCase):
mock.patch.object(prometheus_client.PrometheusAPIClient,
"__init__", return_value=None) as m:
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):
with mock.patch.dict(os.environ, {}), \

View File

@@ -45,7 +45,7 @@ def get_config_file():
return None
def get_prometheus_client():
def get_prometheus_client(session=None):
host = None
port = None
ca_cert = None
@@ -71,7 +71,7 @@ def get_prometheus_client():
if host is None or port is None:
raise ConfigurationError("Can't find prometheus host and "
"port configuration.")
client = PrometheusAPIClient(f"{host}:{port}") # noqa: E231
client = PrometheusAPIClient(f"{host}:{port}", session) # noqa: E231
if ca_cert is not None:
client.set_ca_cert(ca_cert)
return client

View File

@@ -38,6 +38,6 @@ class Client(object):
self.session = session
self.prometheus_client = get_prometheus_client()
self.prometheus_client = get_prometheus_client(session)
self.query = python_api.QueryManager(self)
self.rbac = rbac.Rbac(self, self.session, disable_rbac)