File: Replace_request-aws_by_awscurl.patch

package info (click to toggle)
ceilometer 1%3A25.0.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 3,876 kB
  • sloc: python: 22,264; sh: 404; pascal: 148; makefile: 59
file content (188 lines) | stat: -rw-r--r-- 7,984 bytes parent folder | download
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