Skip to content
This repository was archived by the owner on Nov 17, 2022. It is now read-only.

Commit 8926681

Browse files
committed
Support timeout configuration
1 parent ca570c9 commit 8926681

File tree

2 files changed

+34
-30
lines changed

2 files changed

+34
-30
lines changed

elemental/client.py

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,11 @@ class InvalidResponse(ElementalException):
3232

3333

3434
class ElementalLive():
35-
def __init__(self, server_ip, user=None, api_key=None):
35+
def __init__(self, server_ip, user=None, api_key=None, timeout=5):
3636
self.server_ip = server_ip
3737
self.user = user
3838
self.api_key = api_key
39+
self.timeout = timeout
3940

4041
def generate_headers(self, url=""):
4142
# Generate headers according to how users create ElementalLive class
@@ -61,11 +62,12 @@ def generate_headers(self, url=""):
6162
'Content-Type': 'application/xml'
6263
}
6364

64-
def send_request(self, http_method, url, headers, body=""):
65+
def send_request(self, http_method, url, headers, body="", timeout=None):
6566
# Send request according to different methods
6667
try:
68+
timeout = timeout or self.timeout
6769
response = requests.request(
68-
method=http_method, url=url, data=body, headers=headers)
70+
method=http_method, url=url, data=body, headers=headers, timeout=timeout)
6971

7072
except requests.exceptions.RequestException as e:
7173
raise InvalidRequest(f"{http_method}: {url} failed\n{e}")
@@ -75,7 +77,7 @@ def send_request(self, http_method, url, headers, body=""):
7577
f"{response.status_code}\n{response.text}")
7678
return response
7779

78-
def create_event(self, options):
80+
def create_event(self, options, timeout=None):
7981

8082
# Initiate url
8183
url = f'{self.server_ip}/live_events'
@@ -92,7 +94,7 @@ def create_event(self, options):
9294

9395
# Send request and do exception handling
9496
response = self.send_request(
95-
http_method="POST", url=url, headers=headers, body=body)
97+
http_method="POST", url=url, headers=headers, body=body, timeout=timeout)
9698

9799
# Find newly created event id
98100
xml_root = ET.fromstring(response.content)
@@ -101,7 +103,7 @@ def create_event(self, options):
101103

102104
return {'id': event_id}
103105

104-
def delete_event(self, event_id):
106+
def delete_event(self, event_id, timeout=None):
105107

106108
# Initial url
107109
url = f'{self.server_ip}/live_events/{event_id}'
@@ -110,9 +112,9 @@ def delete_event(self, event_id):
110112
headers = self.generate_headers(url)
111113

112114
# Send request and do exception handling
113-
self.send_request(http_method="DELETE", url=url, headers=headers)
115+
self.send_request(http_method="DELETE", url=url, headers=headers, timeout=timeout)
114116

115-
def start_event(self, event_id):
117+
def start_event(self, event_id, timeout=None):
116118
# Initail url
117119
url = f'{self.server_ip}/live_events/{event_id}/start'
118120

@@ -124,9 +126,9 @@ def start_event(self, event_id):
124126

125127
# Send request and do exception handling
126128
self.send_request(http_method="POST", url=url,
127-
headers=headers, body=body)
129+
headers=headers, body=body, timeout=timeout)
128130

129-
def stop_event(self, event_id):
131+
def stop_event(self, event_id, timeout=None):
130132
# Initail url
131133
url = f'{self.server_ip}/live_events/{event_id}/stop'
132134

@@ -138,15 +140,15 @@ def stop_event(self, event_id):
138140

139141
# Send request and do exception handling
140142
self.send_request(http_method="POST", url=url,
141-
headers=headers, body=body)
143+
headers=headers, body=body, timeout=timeout)
142144

143-
def describe_event(self, event_id):
145+
def describe_event(self, event_id, timeout=None):
144146
url = f'{self.server_ip}/live_events/{event_id}'
145147

146148
headers = self.generate_headers(url)
147149

148150
response = self.send_request(http_method="GET", url=url,
149-
headers=headers)
151+
headers=headers, timeout=timeout)
150152
# print(response.text)
151153
event_info = {}
152154

@@ -159,11 +161,11 @@ def describe_event(self, event_id):
159161

160162
return event_info
161163

162-
def find_devices_in_use(self):
164+
def find_devices_in_use(self, timeout=None):
163165
events_url = f'{self.server_ip}/live_events?filter=active'
164166
events_headers = self.generate_headers(events_url)
165167
events = self.send_request(
166-
http_method="GET", url=events_url, headers=events_headers)
168+
http_method="GET", url=events_url, headers=events_headers, timeout=timeout)
167169
events_list = ET.fromstring(events.text)
168170

169171
# Find in use devices from active events
@@ -173,11 +175,11 @@ def find_devices_in_use(self):
173175

174176
return in_use_devices
175177

176-
def get_input_devices(self):
178+
def get_input_devices(self, timeout=None):
177179
devices_url = f'{self.server_ip}/devices'
178180
devices_headers = self.generate_headers(devices_url)
179181
devices = self.send_request(
180-
http_method="GET", url=devices_url, headers=devices_headers)
182+
http_method="GET", url=devices_url, headers=devices_headers, timeout=timeout)
181183
devices_info = xmltodict.parse(devices.text)[
182184
'device_list']['device']
183185

@@ -192,19 +194,19 @@ def get_input_devices(self):
192194
devices_info, key=lambda d: int(d["id"]))
193195
return [dict(d) for d in devices_info]
194196

195-
def get_input_device_by_id(self, input_device_id):
197+
def get_input_device_by_id(self, input_device_id, timeout=None):
196198
devices_url = f'{self.server_ip}/devices/{input_device_id}'
197199
devices_headers = self.generate_headers(devices_url)
198200
devices = self.send_request(
199-
http_method="GET", url=devices_url, headers=devices_headers)
201+
http_method="GET", url=devices_url, headers=devices_headers, timeout=timeout)
200202
device_info = xmltodict.parse(devices.text)['device']
201203
devices_in_use = self.find_devices_in_use()
202204
device_info['availability'] = (device_info['device_name']
203205
not in devices_in_use)
204206
device_info.pop('@href')
205207
return dict(device_info)
206208

207-
def generate_preview(self, input_id):
209+
def generate_preview(self, input_id, timeout=None):
208210
url = f'{self.server_ip}/inputs/generate_preview'
209211
headers = self.generate_headers(url)
210212

@@ -219,7 +221,7 @@ def generate_preview(self, input_id):
219221
f"[input_format]=Auto&live_event[inputs_attributes][0]" \
220222
f"[device_input_attributes][device_id]={input_id}"
221223
response = self.send_request(
222-
http_method="POST", url=url, headers=headers, body=data)
224+
http_method="POST", url=url, headers=headers, body=data, timeout=timeout)
223225

224226
response_parse = ast.literal_eval(response.text)
225227

@@ -231,7 +233,7 @@ def generate_preview(self, input_id):
231233
f'p_{response_parse["preview_image_id"]}_job_0.jpg'
232234
return {'preview_url': preview_url}
233235

234-
def event_can_delete(self, channel_id):
236+
def event_can_delete(self, channel_id, timeout=None):
235237
channel_info = self.describe_event(channel_id)
236238
if channel_info['status'] in ('pending', 'running',
237239
'preprocessing', 'postprocessing'):

elemental/client_test.py

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
ELEMENTAL_ADDRESS = "FAKE_ADDRESS.com"
1414
HEADERS = {'Accept': 'application/xml', 'Content-Type': 'application/xml'}
1515
REQUEST_BODY = "<live_event>FAKE</live_event>"
16+
TIMEOUT = 10
1617

1718

1819
def file_fixture(file_name):
@@ -66,13 +67,14 @@ def test_send_request_should_call_request_as_expected(mock_request):
6667
mock_request.return_value = mock_response(status=200)
6768
client = ElementalLive(ELEMENTAL_ADDRESS, USER, API_KEY)
6869
client.send_request(
69-
'POST', f'{ELEMENTAL_ADDRESS}/live_events', HEADERS, REQUEST_BODY)
70+
'POST', f'{ELEMENTAL_ADDRESS}/live_events', HEADERS, REQUEST_BODY, timeout=TIMEOUT)
7071

7172
request_to_elemental = mock_request.call_args_list[0][1]
7273
assert request_to_elemental['url'] == f'{ELEMENTAL_ADDRESS}/live_events'
7374
assert request_to_elemental['method'] == 'POST'
7475
assert request_to_elemental['headers']['Accept'] == 'application/xml'
7576
assert request_to_elemental['headers']['Content-Type'] == 'application/xml'
77+
assert request_to_elemental['timeout'] == TIMEOUT
7678

7779

7880
@mock.patch('requests.request')
@@ -174,7 +176,7 @@ def test_delete_event_should_call_send_request_as_expect():
174176
client.delete_event(event_id)
175177
client.send_request.assert_called_once_with(
176178
http_method='DELETE',
177-
url=f'{ELEMENTAL_ADDRESS}/live_events/{event_id}', headers=HEADERS)
179+
url=f'{ELEMENTAL_ADDRESS}/live_events/{event_id}', headers=HEADERS, timeout=None)
178180

179181

180182
def test_start_event_should_call_send_request_as_expect():
@@ -192,7 +194,7 @@ def test_start_event_should_call_send_request_as_expect():
192194
client.send_request.assert_called_once_with(
193195
http_method='POST',
194196
url=f'{ELEMENTAL_ADDRESS}/live_events/{event_id}/start',
195-
headers=HEADERS, body="<start></start>")
197+
headers=HEADERS, body="<start></start>", timeout=None)
196198

197199

198200
def test_stop_event_should_call_send_request_as_expect():
@@ -209,7 +211,7 @@ def test_stop_event_should_call_send_request_as_expect():
209211
client.send_request.assert_called_once_with(
210212
http_method='POST',
211213
url=f'{ELEMENTAL_ADDRESS}/live_events/{event_id}/stop',
212-
headers=HEADERS, body="<stop></stop>")
214+
headers=HEADERS, body="<stop></stop>", timeout=None)
213215

214216

215217
def send_request_side_effect(**kwargs):
@@ -237,7 +239,7 @@ def test_find_devices_in_use_will_call_send_request_as_expect():
237239
client.send_request.assert_called_with(http_method="GET",
238240
url=f'{ELEMENTAL_ADDRESS}'
239241
f'/live_events?'
240-
f'filter=active', headers=HEADERS)
242+
f'filter=active', headers=HEADERS, timeout=None)
241243

242244

243245
def test_find_devices_in_use_will_return_in_used_devices():
@@ -272,7 +274,7 @@ def test_get_input_devices_will_call_send_request_as_expect():
272274

273275
client.send_request.\
274276
assert_called_with(http_method="GET",
275-
url=f'{ELEMENTAL_ADDRESS}/devices', headers=HEADERS)
277+
url=f'{ELEMENTAL_ADDRESS}/devices', headers=HEADERS, timeout=None)
276278

277279

278280
def test_get_input_devices_will_get_right_devices_info():
@@ -321,7 +323,7 @@ def test_get_input_device_by_id_will_call_send_request_as_expect():
321323
client.send_request.\
322324
assert_called_with(http_method="GET",
323325
url=f'{ELEMENTAL_ADDRESS}/devices/2',
324-
headers=HEADERS)
326+
headers=HEADERS, timeout=None)
325327

326328

327329
def test_get_input_device_by_id_will_get_right_devices_info():
@@ -403,7 +405,7 @@ def test_describe_event_will_call_send_request_as_expect():
403405
client.send_request.assert_called_once_with(
404406
http_method='GET',
405407
url=f'{ELEMENTAL_ADDRESS}/live_events/{event_id}',
406-
headers=HEADERS)
408+
headers=HEADERS, timeout=None)
407409

408410

409411
def test_describe_event_will_return_event_info_as_expect():

0 commit comments

Comments
 (0)