2
2
# Copyright (c) Microsoft Corporation. All rights reserved.
3
3
# Licensed under the MIT License. See License.txt in the project root for license information.
4
4
# --------------------------------------------------------------------------------------------
5
-
5
+ from contextlib import contextmanager
6
6
from copy import copy
7
7
from typing import TYPE_CHECKING , Dict , Any , Union , List , cast , Type
8
8
from xml .etree .ElementTree import ElementTree , Element
9
9
10
- from azure .core .exceptions import ResourceNotFoundError
10
+ from azure .core .exceptions import ResourceNotFoundError , HttpResponseError
11
11
from azure .core .pipeline import Pipeline
12
12
from azure .core .pipeline .policies import HttpLoggingPolicy , DistributedTracingPolicy , ContentDecodePolicy , \
13
13
RequestIdPolicy , BearerTokenCredentialPolicy
29
29
from azure .core .credentials import TokenCredential # pylint:disable=ungrouped-imports
30
30
31
31
32
+ @contextmanager
33
+ def _handle_response_error ():
34
+ try :
35
+ yield
36
+ except HttpResponseError as response_error :
37
+ new_response_error = HttpResponseError (
38
+ message = response_error .model .detail ,
39
+ response = response_error .response ,
40
+ model = response_error .model
41
+ )
42
+ raise new_response_error
43
+
44
+
32
45
def _convert_xml_to_object (queue_name , et , class_ ):
33
46
# type: (str, Union[Element, ElementTree], Type[Model]) -> Union[QueueDescription, QueueRuntimeInfo]
34
47
content_ele = cast (ElementTree , et ).find (constants .CONTENT_TAG )
@@ -97,17 +110,40 @@ def _get_queue_object(self, queue_name, class_):
97
110
98
111
if not queue_name :
99
112
raise ValueError ("queue_name must be a non-empty str" )
100
- et = cast (
101
- ElementTree ,
102
- self ._impl .queue .get (queue_name , enrich = False , api_version = constants .API_VERSION )
103
- )
113
+
114
+ with _handle_response_error ():
115
+ et = cast (
116
+ ElementTree ,
117
+ self ._impl .queue .get (queue_name , enrich = False , api_version = constants .API_VERSION )
118
+ )
104
119
return _convert_xml_to_object (queue_name , et , class_ )
105
120
121
+ def _list_queues (self , skip , max_count , class_ ):
122
+ # type: (int, int, Type[Model]) -> Union[List[QueueDescription], List[QueueRuntimeInfo])
123
+ with _handle_response_error ():
124
+ et = cast (
125
+ ElementTree ,
126
+ self ._impl .list_entities (
127
+ entity_type = "queues" , skip = skip , top = max_count , api_version = constants .API_VERSION
128
+ )
129
+ )
130
+ entries = et .findall (constants .ENTRY_TAG )
131
+ queues = []
132
+ for entry in entries :
133
+ entity_name = entry .find (constants .TITLE_TAG ).text # type: ignore
134
+ queue_description = _convert_xml_to_object (
135
+ entity_name , # type: ignore
136
+ cast (Element , entry ),
137
+ class_
138
+ )
139
+ queues .append (queue_description )
140
+ return queues
141
+
106
142
def get_queue (self , queue_name ):
107
143
# type: (str) -> QueueDescription
108
144
return self ._get_queue_object (queue_name , QueueDescription )
109
145
110
- def get_queue_metrics (self , queue_name ):
146
+ def get_queue_runtime_info (self , queue_name ):
111
147
# type: (str) -> QueueRuntimeInfo
112
148
return self ._get_queue_object (queue_name , QueueRuntimeInfo )
113
149
@@ -131,10 +167,11 @@ def create_queue(self, queue):
131
167
)
132
168
request_body = create_entity_body .serialize (is_xml = True )
133
169
try :
134
- et = cast (
135
- ElementTree ,
136
- self ._impl .queue .put (queue_name , request_body , api_version = constants .API_VERSION )
137
- )
170
+ with _handle_response_error ():
171
+ et = cast (
172
+ ElementTree ,
173
+ self ._impl .queue .put (queue_name , request_body , api_version = constants .API_VERSION )
174
+ )
138
175
except ValidationError as e :
139
176
# post-hoc try to give a somewhat-justifiable failure reason.
140
177
if isinstance (queue , str ) or (isinstance (queue , QueueDescription ) and isinstance (queue .queue_name , str )):
@@ -157,15 +194,16 @@ def update_queue(self, queue_description):
157
194
)
158
195
)
159
196
request_body = create_entity_body .serialize (is_xml = True )
160
- et = cast (
161
- ElementTree ,
162
- self ._impl .queue .put (
163
- queue_description .queue_name , # type: ignore
164
- request_body ,
165
- api_version = constants .API_VERSION ,
166
- if_match = "*"
197
+ with _handle_response_error ():
198
+ et = cast (
199
+ ElementTree ,
200
+ self ._impl .queue .put (
201
+ queue_description .queue_name , # type: ignore
202
+ request_body ,
203
+ api_version = constants .API_VERSION ,
204
+ if_match = "*"
205
+ )
167
206
)
168
- )
169
207
return _convert_xml_to_object (queue_description .queue_name , et , QueueDescription )
170
208
171
209
def delete_queue (self , queue_name ):
@@ -174,21 +212,13 @@ def delete_queue(self, queue_name):
174
212
175
213
if not queue_name :
176
214
raise ValueError ("queue_name must not be None or empty" )
177
- self ._impl .queue .delete (queue_name , api_version = constants .API_VERSION )
215
+ with _handle_response_error ():
216
+ self ._impl .queue .delete (queue_name , api_version = constants .API_VERSION )
178
217
179
218
def list_queues (self , skip = 0 , max_count = 100 ):
180
219
# type: (int, int) -> List[QueueDescription]
181
- et = cast (
182
- ElementTree ,
183
- self ._impl .list_entities (entity_type = "queues" , skip = skip , top = max_count , api_version = constants .API_VERSION )
184
- )
185
- entries = et .findall (constants .ENTRY_TAG )
186
- queue_descriptions = []
187
- for entry in entries :
188
- entity_name = entry .find (constants .TITLE_TAG ).text # type: ignore
189
- queue_description = _convert_xml_to_object (
190
- entity_name , # type: ignore
191
- cast (Element , entry ),
192
- QueueDescription )
193
- queue_descriptions .append (queue_description )
194
- return queue_descriptions
220
+ return self ._list_queues (skip , max_count , QueueDescription )
221
+
222
+ def list_queues_runtime_info (self , skip = 0 , max_count = 100 ):
223
+ # type: (int, int) -> List[QueueRuntimeInfo]
224
+ return self ._list_queues (skip , max_count , QueueRuntimeInfo )
0 commit comments