1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188
|
Description: [PATCH] Replace request-aws by awscurl
use awscurl instead of request-aws(deprecated and unmaintained upstream)
use either service_type/service_name to get object-store endpoint
.
Also, use the service_name to target the endpoint.
Author: Wissem MIMOUNA <ceph-users@ik.me>
Date: Fri, 24 Oct 2025 11:41:54 +0200
Change-Id: Ice6c1bf9463c71aab55be8c1c1c932609f5f8191
Signed-off-by: Wissem Mimouna <ceph-users@ik.me>
Signed-off-by: Thomas Goirand <zigo@debian.org>
Origin: upstream, https://review.opendev.org/c/openstack/ceilometer/+/964757
Last-Update: 2025-11-14
diff --git a/ceilometer/objectstore/rgw.py b/ceilometer/objectstore/rgw.py
index d8be071..8f5b8db 100644
--- a/ceilometer/objectstore/rgw.py
+++ b/ceilometer/objectstore/rgw.py
@@ -44,6 +44,11 @@
cfg.BoolOpt('implicit_tenants',
default=False,
help='Whether RGW uses implicit tenants or not.'),
+ cfg.StrOpt('rgw_service_name',
+ default=None,
+ sample_default='ceph',
+ help='Service name for object store endpoint. '
+ 'If left to None, will use [service_types]/radosgw.'),
]
@@ -68,9 +73,21 @@
@staticmethod
def _get_endpoint(conf, ksclient):
# we store the endpoint as a base class attribute, so keystone is
- # only ever called once, also we assume that in a single deployment
- # we may be only deploying `radosgw` or `swift` as the object-store
- if _Base._ENDPOINT is None and conf.service_types.radosgw:
+ # only ever called once.
+ if _Base._ENDPOINT is None and conf.rgw_client.rgw_service_name:
+ try:
+ creds = conf.service_credentials
+ # Use the service_name to target the endpoint.
+ # There are cases where both 'radosgw' and 'swift' are used.
+ rgw_url = keystone_client.get_service_catalog(
+ ksclient).url_for(
+ service_name=conf.rgw_client.rgw_service_name,
+ interface=creds.interface,
+ region_name=creds.region_name)
+ _Base._ENDPOINT = urlparse.urljoin(rgw_url, '/admin')
+ except exceptions.EndpointNotFound:
+ LOG.debug("Radosgw endpoint not found")
+ elif _Base._ENDPOINT is None and conf.service_types.radosgw:
try:
creds = conf.service_credentials
rgw_url = keystone_client.get_service_catalog(
@@ -81,6 +98,7 @@
_Base._ENDPOINT = urlparse.urljoin(rgw_url, '/admin')
except exceptions.EndpointNotFound:
LOG.debug("Radosgw endpoint not found")
+ LOG.debug(f"Using endpoint {_Base._ENDPOINT} for radosgw connections")
return _Base._ENDPOINT
def _iter_accounts(self, ksclient, cache, tenants):
diff --git a/ceilometer/objectstore/rgw_client.py b/ceilometer/objectstore/rgw_client.py
index 5c40d02..59c6172 100644
--- a/ceilometer/objectstore/rgw_client.py
+++ b/ceilometer/objectstore/rgw_client.py
@@ -16,8 +16,7 @@
from collections import namedtuple
-from awsauth import S3Auth
-import requests
+from awscurl import awscurl
from urllib import parse as urlparse
@@ -40,15 +39,37 @@
def _make_request(self, path, req_params):
uri = "{}/{}".format(self.endpoint, path)
- r = requests.get(uri, params=req_params,
- auth=S3Auth(self.access_key, self.secret,
- self.hostname)
- )
+ if req_params:
+ uri = f"{uri}?"
+ # Append req_params content to the uri
+ for i, (key, value) in enumerate(req_params.items()):
+ if i == len(req_params) - 1:
+ uri = uri + key + "=" + value
+ else:
+ uri = uri + key + "=" + value + "&"
+
+ # Data to be sent with request POST type,
+ # otherwise provide an empty string
+ data = ""
+ service = "s3"
+ method = "GET"
+ # Default region, in the case of radosgw either set
+ # the value to your zonegroup name or keep the default region.
+ # With a single Ceph zone-group, there's no need to customize
+ # this value.
+ region = "us-east-1"
+ headers = {'Accept': 'application/json'}
+
+ r = awscurl.make_request(method, service, region, uri, headers, data,
+ self.access_key, self.secret, None, False,
+ False)
if r.status_code != 200:
raise RGWAdminAPIFailed(
_('RGW AdminOps API returned %(status)s %(reason)s') %
{'status': r.status_code, 'reason': r.reason})
+ if not r.text:
+ return {}
return r.json()
diff --git a/ceilometer/tests/unit/objectstore/test_rgw_client.py b/ceilometer/tests/unit/objectstore/test_rgw_client.py
index 3d10f6b..44f1944 100644
--- a/ceilometer/tests/unit/objectstore/test_rgw_client.py
+++ b/ceilometer/tests/unit/objectstore/test_rgw_client.py
@@ -154,7 +154,7 @@
self.client = rgw_client.RGWAdminClient('http://127.0.0.1:8080/admin',
'abcde', 'secret', False)
self.get_resp = mock.MagicMock()
- self.get = mock.patch('requests.get',
+ self.get = mock.patch('requests.request',
return_value=self.get_resp).start()
def test_make_request_exception(self):
@@ -180,8 +180,9 @@
'buckets': bucket_list}
self.assertEqual(expected, actual)
self.assertEqual(1, len(self.get.call_args_list))
- self.assertEqual('foo',
- self.get.call_args_list[0][1]['params']['uid'])
+ self.assertEqual('http://127.0.0.1:8080/admin/bucket?'
+ 'uid=foo&stats=true',
+ self.get.call_args_list[0][0][1])
def test_get_buckets_implicit_tenants(self):
self.get_resp.status_code = 200
@@ -195,8 +196,9 @@
'buckets': bucket_list}
self.assertEqual(expected, actual)
self.assertEqual(1, len(self.get.call_args_list))
- self.assertEqual('foo$foo',
- self.get.call_args_list[0][1]['params']['uid'])
+ self.assertEqual('http://127.0.0.1:8080/admin/bucket?'
+ 'uid=foo$foo&stats=true',
+ self.get.call_args_list[0][0][1])
def test_get_usage(self):
self.get_resp.status_code = 200
@@ -205,8 +207,8 @@
expected = 7
self.assertEqual(expected, actual)
self.assertEqual(1, len(self.get.call_args_list))
- self.assertEqual('foo',
- self.get.call_args_list[0][1]['params']['uid'])
+ self.assertEqual('http://127.0.0.1:8080/admin/usage?uid=foo',
+ self.get.call_args_list[0][0][1])
def test_get_usage_implicit_tenants(self):
self.get_resp.status_code = 200
@@ -216,5 +218,5 @@
expected = 7
self.assertEqual(expected, actual)
self.assertEqual(1, len(self.get.call_args_list))
- self.assertEqual('foo$foo',
- self.get.call_args_list[0][1]['params']['uid'])
+ self.assertEqual('http://127.0.0.1:8080/admin/usage?uid=foo$foo',
+ self.get.call_args_list[0][0][1])
diff --git a/requirements.txt b/requirements.txt
index dc4aba7..63dc36e 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -35,6 +35,7 @@
oslo.cache>=1.26.0 # Apache-2.0
gnocchiclient>=7.0.0 # Apache-2.0
python-zaqarclient>=1.3.0 # Apache-2.0
-prometheus_client>=0.20.0 # Apache-2.0
-requests-aws>=0.1.4 # BSD License (3 clause)
+prometheus-client>=0.20.0 # Apache-2.0
aodhclient>=3.8.0 # Apache-2.0
+awscurl>=0.36 # MIT
+botocore>=1.20.0 # Apache-2.0
|