Merge "Fix Swift endpoint conversion to determine info/caps url"

This commit is contained in:
Zuul 2023-09-16 14:05:04 +00:00 committed by Gerrit Code Review
commit 194365f7fe
3 changed files with 71 additions and 9 deletions

View File

@ -11,10 +11,12 @@
# License for the specific language governing permissions and limitations
# under the License.
import re
import urllib
from openstack import exceptions
from openstack import resource
from openstack import utils
class Info(resource.Resource):
@ -33,6 +35,24 @@ class Info(resource.Resource):
staticweb = resource.Body("staticweb", type=dict)
tempurl = resource.Body("tempurl", type=dict)
# The endpoint in the catalog has version and project-id in it
# To get capabilities, we have to disassemble and reassemble the URL
# to append 'info'
# This logic is taken from swiftclient
def _get_info_url(self, url):
URI_PATTERN_VERSION = re.compile(r'\/v\d+\.?\d*(\/.*)?')
scheme, netloc, path, params, query, fragment = urllib.parse.urlparse(
url
)
if URI_PATTERN_VERSION.search(path):
path = URI_PATTERN_VERSION.sub('/info', path)
else:
path = utils.urljoin(path, 'info')
return urllib.parse.urlunparse(
(scheme, netloc, path, params, query, fragment)
)
def fetch(
self,
session,
@ -61,18 +81,11 @@ class Info(resource.Resource):
if not self.allow_fetch:
raise exceptions.MethodNotSupported(self, "fetch")
# The endpoint in the catalog has version and project-id in it
# To get capabilities, we have to disassemble and reassemble the URL
# This logic is taken from swiftclient
session = self._get_session(session)
endpoint = urllib.parse.urlparse(session.get_endpoint())
url = "{scheme}://{netloc}/info".format(
scheme=endpoint.scheme, netloc=endpoint.netloc
)
info_url = self._get_info_url(session.get_endpoint())
microversion = self._get_microversion(session, action='fetch')
response = session.get(url, microversion=microversion)
response = session.get(info_url, microversion=microversion)
kwargs = {}
if error_message:
kwargs['error_message'] = error_message

View File

@ -0,0 +1,44 @@
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from openstack.object_store.v1 import info
from openstack.tests.unit import base
class TestInfo(base.TestCase):
def setUp(self):
super(TestInfo, self).setUp()
def test_get_info_url(self):
sot = info.Info()
test_urls = {
'http://object.cloud.example.com': 'http://object.cloud.example.com/info',
'http://object.cloud.example.com/': 'http://object.cloud.example.com/info',
'http://object.cloud.example.com/v1': 'http://object.cloud.example.com/info',
'http://object.cloud.example.com/v1/': 'http://object.cloud.example.com/info',
'http://object.cloud.example.com/swift': 'http://object.cloud.example.com/swift/info',
'http://object.cloud.example.com/swift/': 'http://object.cloud.example.com/swift/info',
'http://object.cloud.example.com/v1.0': 'http://object.cloud.example.com/info',
'http://object.cloud.example.com/swift/v1.0': 'http://object.cloud.example.com/swift/info',
'http://object.cloud.example.com/v111': 'http://object.cloud.example.com/info',
'http://object.cloud.example.com/v111/test': 'http://object.cloud.example.com/info',
'http://object.cloud.example.com/v1/test': 'http://object.cloud.example.com/info',
'http://object.cloud.example.com/swift/v1.0/test': 'http://object.cloud.example.com/swift/info',
'http://object.cloud.example.com/v1.0/test': 'http://object.cloud.example.com/info',
'https://object.cloud.example.com/swift/v1/AUTH_%(tenant_id)s': 'https://object.cloud.example.com/swift/info',
'https://object.cloud.example.com/swift/v1/AUTH_%(project_id)s': 'https://object.cloud.example.com/swift/info',
'https://object.cloud.example.com/services/swift/v1/AUTH_%(project_id)s': 'https://object.cloud.example.com/services/swift/info',
'https://object.cloud.example.com/services/swift/v1/AUTH_%(project_id)s/': 'https://object.cloud.example.com/services/swift/info',
'https://object.cloud.example.com/info/v1/AUTH_%(project_id)s/': 'https://object.cloud.example.com/info/info',
}
for uri_k, uri_v in test_urls.items():
self.assertEqual(sot._get_info_url(uri_k), uri_v)

View File

@ -0,0 +1,5 @@
---
fixes:
- |
[`bug 2010898 <https://storyboard.openstack.org/#!/story/2010898>`_]
Fix Swift endpoint url handling to determine info/caps url