Skip to content

Commit 539ca96

Browse files
zhuxiaolong37huiguangjun
authored andcommitted
Add describe regions (#335)
1 parent a94d31e commit 539ca96

File tree

5 files changed

+133
-4
lines changed

5 files changed

+133
-4
lines changed

oss2/api.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,7 @@ class Service(_Base):
296296
"""
297297

298298
QOS_INFO = 'qosInfo'
299+
REGIONS = 'regions'
299300

300301
def __init__(self, auth, endpoint,
301302
session=None,
@@ -347,6 +348,19 @@ def get_user_qos_info(self):
347348
logger.debug("get use qos, req_id: {0}, status_code: {1}".format(resp.request_id, resp.status))
348349
return self._parse_result(resp, xml_utils.parse_get_qos_info, GetUserQosInfoResult)
349350

351+
def describe_regions(self, regions=''):
352+
"""查询所有支持地域或者指定地域对应的Endpoint信息,包括外网Endpoint、内网Endpoint和传输加速Endpoint。
353+
354+
:param str regions : 地域。
355+
:return: :class:`DescribeRegionsResult <oss2.models.DescribeRegionsResult>`
356+
"""
357+
logger.debug("Start to describe regions")
358+
359+
resp = self._do('GET', '', '', params={Service.REGIONS: regions})
360+
logger.debug("Describe regions done, req_id: {0}, status_code: {1}".format(resp.request_id, resp.status))
361+
362+
return self._parse_result(resp, xml_utils.parse_describe_regions, DescribeRegionsResult)
363+
350364
class Bucket(_Base):
351365
"""用于Bucket和Object操作的类,诸如创建、删除Bucket,上传、下载Object等。
352366

oss2/models.py

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2650,9 +2650,35 @@ def __init__(self, name=None, content=None, create_time=None, last_modify_time=N
26502650
class ListBucketStyleResult(RequestResult):
26512651
"""查询图片样式信息列表的容器。
26522652
2653-
:param str styles: 图片样式内容的容器。元素类型为:class:`ListBucketStyleResult <oss2.models.ListBucketStyleResult>`。
2653+
:param str styles: 图片样式内容的容器。元素类型为:class:`BucketStyleInfo <oss2.models.BucketStyleInfo>`。
26542654
"""
26552655

26562656
def __init__(self, resp):
26572657
super(ListBucketStyleResult, self).__init__(resp)
2658-
self.styles = []
2658+
self.styles = []
2659+
2660+
2661+
class RegionInfo(RequestResult):
2662+
"""地域信息。
2663+
2664+
:param region: 地域ID。
2665+
:param internet_endpoint: 地域对应的外网Endpoint。
2666+
:param internal_endpoint: 地域对应的内网Endpoint。
2667+
:param accelerate_endpoint: 地域对应的传输加速Endpoint。取值固定为oss-accelerate.aliyuncs.com。
2668+
"""
2669+
def __init__(self, region=None, internet_endpoint=None, internal_endpoint=None, accelerate_endpoint=None):
2670+
self.region = region
2671+
self.internet_endpoint = internet_endpoint
2672+
self.internal_endpoint = internal_endpoint
2673+
self.accelerate_endpoint = accelerate_endpoint
2674+
2675+
2676+
class DescribeRegionsResult(RequestResult):
2677+
"""地域信息列表。
2678+
2679+
:param list regions: 地域信息列表。元素类型为:class:`RegionInfo <oss2.models.RegionInfo>`。
2680+
"""
2681+
2682+
def __init__(self, resp):
2683+
super(DescribeRegionsResult, self).__init__(resp)
2684+
self.regions = []

oss2/xml_utils.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,8 @@
7373
LifecycleFilter,
7474
FilterNot,
7575
FilterNotTag,
76-
BucketStyleInfo)
76+
BucketStyleInfo,
77+
RegionInfo)
7778

7879
from .select_params import (SelectJsonTypes, SelectParameters)
7980

@@ -2009,4 +2010,15 @@ def parse_list_bucket_style(result, body):
20092010
tmp.create_time = _find_tag_with_default(style, 'CreateTime', None)
20102011
tmp.last_modify_time = _find_tag_with_default(style, 'LastModifyTime', None)
20112012

2012-
result.styles.append(tmp)
2013+
result.styles.append(tmp)
2014+
2015+
def parse_describe_regions(result, body):
2016+
root = ElementTree.fromstring(body)
2017+
for region in root.findall('RegionInfo'):
2018+
tmp = RegionInfo()
2019+
tmp.region = _find_tag_with_default(region, 'Region', None)
2020+
tmp.internet_endpoint = _find_tag_with_default(region, 'InternetEndpoint', None)
2021+
tmp.internal_endpoint = _find_tag_with_default(region, 'InternalEndpoint', None)
2022+
tmp.accelerate_endpoint = _find_tag_with_default(region, 'AccelerateEndpoint', None)
2023+
2024+
result.regions.append(tmp)
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
from .common import *
2+
3+
class TestDescribeRegions(OssTestCase):
4+
def test_describe_regions_normal(self):
5+
6+
service = oss2.Service(oss2.Auth(OSS_ID, OSS_SECRET), OSS_ENDPOINT)
7+
result = service.describe_regions()
8+
self.assertEqual(200, result.status)
9+
10+
exist_region = False
11+
for r in result.regions:
12+
if 'oss-cn-chengdu' == r.region:
13+
exist_region = True
14+
self.assertTrue(exist_region)
15+
16+
exist_region = False
17+
result = service.describe_regions('oss-cn-chengdu')
18+
self.assertEqual(200, result.status)
19+
for r in result.regions:
20+
if 'oss-cn-chengdu' == r.region:
21+
exist_region = True
22+
23+
self.assertTrue(exist_region)
24+
25+
def test_describe_regions_exception(self):
26+
try:
27+
service = oss2.Service(oss2.Auth(OSS_ID, OSS_SECRET), OSS_ENDPOINT)
28+
service.describe_regions('aaa')
29+
except oss2.exceptions.ServerError as e:
30+
self.assertEqual(e.code, 'NoSuchRegion')
31+
32+
33+
if __name__ == '__main__':
34+
unittest.main()

unittests/test_bucket.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2399,7 +2399,50 @@ def test_get_black_referer2(self, do_request):
23992399
self.assertEqual(result.allow_empty_referer, True)
24002400
self.assertSortedListEqual(result.referers, ['http://hello.com', 'mibrowser:home', '阿里巴巴'])
24012401

2402+
@patch('oss2.Session.do_request')
2403+
def test_describe_regions(self, do_request):
2404+
request_text = '''GET /?regions HTTP/1.1
2405+
Date: Fri , 30 Apr 2021 13:08:38 GMT
2406+
Content-Length:443
2407+
Host: oss-cn-hangzhou.aliyuncs.com
2408+
Authorization: OSS qn6qrrqxo2oawuk53otf****:PYbzsdWAIWAlMW8luk****'''
2409+
2410+
response_text = '''HTTP/1.1 200 OK
2411+
x-oss-request-id: 566B6BD927A4046E9C725578
2412+
Date: Fri , 30 Apr 2021 13:08:38 GMT
24022413
2414+
<?xml version="1.0" encoding="UTF-8"?>
2415+
<RegionInfoList>
2416+
<RegionInfo>
2417+
<Region>oss-cn-hangzhou</Region>
2418+
<InternetEndpoint>oss-cn-hangzhou.aliyuncs.com</InternetEndpoint>
2419+
<InternalEndpoint>oss-cn-hangzhou-internal.aliyuncs.com</InternalEndpoint>
2420+
<AccelerateEndpoint>oss-accelerate.aliyuncs.com</AccelerateEndpoint>
2421+
</RegionInfo>
2422+
<RegionInfo>
2423+
<Region>oss-cn-shanghai</Region>
2424+
<InternetEndpoint>oss-cn-shanghai.aliyuncs.com</InternetEndpoint>
2425+
<InternalEndpoint>oss-cn-shanghai-internal.aliyuncs.com</InternalEndpoint>
2426+
<AccelerateEndpoint>oss-accelerate.aliyuncs.com</AccelerateEndpoint>
2427+
</RegionInfo>
2428+
</RegionInfoList>
2429+
'''
2430+
2431+
req_info = mock_response(do_request, response_text)
24032432

2433+
result = service().describe_regions()
2434+
2435+
self.assertRequest(req_info, request_text)
2436+
self.assertEqual(result.request_id, '566B6BD927A4046E9C725578')
2437+
self.assertEqual(result.status, 200)
2438+
self.assertEqual(result.regions[0].region, 'oss-cn-hangzhou')
2439+
self.assertEqual(result.regions[0].internet_endpoint, 'oss-cn-hangzhou.aliyuncs.com')
2440+
self.assertEqual(result.regions[0].internal_endpoint, 'oss-cn-hangzhou-internal.aliyuncs.com')
2441+
self.assertEqual(result.regions[0].accelerate_endpoint, 'oss-accelerate.aliyuncs.com')
2442+
self.assertEqual(result.regions[1].region, 'oss-cn-shanghai')
2443+
self.assertEqual(result.regions[1].internet_endpoint, 'oss-cn-shanghai.aliyuncs.com')
2444+
self.assertEqual(result.regions[1].internal_endpoint, 'oss-cn-shanghai-internal.aliyuncs.com')
2445+
self.assertEqual(result.regions[1].accelerate_endpoint, 'oss-accelerate.aliyuncs.com')
2446+
24042447
if __name__ == '__main__':
24052448
unittest.main()

0 commit comments

Comments
 (0)