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

Commit c8de51d

Browse files
author
Allison Deal
authored
client: add get_event_status method (#72)
Fixes cbsinteractive/propeller#1529
1 parent aac5a2d commit c8de51d

File tree

2 files changed

+72
-2
lines changed

2 files changed

+72
-2
lines changed

elemental/client.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,15 +144,20 @@ def describe_event(self, event_id: str, timeout: Optional[int] = None) -> EventS
144144
uri = destinations[1].find('uri')
145145
event_info['backup_url'] = uri.text if uri is not None else ''
146146

147-
status = ET.fromstring(response.text).find('status')
148-
event_info['status'] = status.text if status is not None else 'unknown'
147+
event_info['status'] = self._parse_status(response.text)
149148

150149
return EventStatusDict(
151150
status=str(event_info['status']),
152151
origin_url=str(event_info['origin_url']),
153152
backup_url=event_info.get('backup_url')
154153
)
155154

155+
def get_event_status(self, event_id: str, timeout: Optional[int] = None) -> str:
156+
url = f'{self.server_url}/live_events/{event_id}/status'
157+
headers = self.generate_headers(url)
158+
response = self.send_request(http_method="GET", url=url, headers=headers, timeout=timeout)
159+
return self._parse_status(response.text)
160+
156161
def find_devices_in_use(self, timeout: Optional[int] = None) -> Set[Optional[str]]:
157162
events_url = f'{self.server_url}/live_events?filter=active'
158163
events_headers = self.generate_headers(events_url)
@@ -249,3 +254,7 @@ def generate_preview(self, input_id: str, timeout: Optional[int] = None) -> Prev
249254
def event_can_delete(self, channel_id: str, timeout: Optional[int] = None) -> bool:
250255
channel_info = self.describe_event(channel_id, timeout=timeout)
251256
return channel_info['status'] not in ('pending', 'running', 'preprocessing', 'postprocessing',)
257+
258+
def _parse_status(self, text):
259+
status = ET.fromstring(text).find('status')
260+
return status.text if status is not None else 'unknown'

tests/client_test.py

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -440,6 +440,67 @@ def test_describe_event_will_return_event_info_as_expect():
440440
'status': 'complete'}
441441

442442

443+
def test_get_event_status():
444+
client = ElementalLive(ELEMENTAL_ADDRESS, USER, API_KEY)
445+
446+
client.generate_headers = mock.Mock()
447+
client.generate_headers.return_value = HEADERS
448+
449+
client.send_request = mock.Mock()
450+
response_from_elemental_api = """<?xml version="1.0" encoding="UTF-8"?>
451+
<live_event href="/live_events/18">
452+
<node>ctcsdprdel5</node>
453+
<user_data/>
454+
<submitted>2020-11-02 18:38:27 -0500</submitted>
455+
<priority>50</priority>
456+
<restart_on_failure>false</restart_on_failure>
457+
<status>pending</status>
458+
<average_fps>0</average_fps>
459+
<start_time/>
460+
<elapsed>0</elapsed>
461+
<elapsed_time_in_words>00:00:00</elapsed_time_in_words>
462+
<dropped_frames/>
463+
<buffer_avg/>
464+
<buffer_max/>
465+
</live_event>
466+
"""
467+
client.send_request.return_value = mock_response(
468+
status=200, text=response_from_elemental_api)
469+
event_id = '999'
470+
471+
status = client.get_event_status(event_id)
472+
473+
assert status == 'pending'
474+
client.send_request.assert_called_once_with(
475+
http_method='GET',
476+
url=f'{ELEMENTAL_ADDRESS}/live_events/{event_id}/status',
477+
headers=HEADERS, timeout=None)
478+
479+
480+
def test_get_event_status_missing_status_in_elemental_response():
481+
client = ElementalLive(ELEMENTAL_ADDRESS, USER, API_KEY)
482+
483+
client.generate_headers = mock.Mock()
484+
client.generate_headers.return_value = HEADERS
485+
486+
client.send_request = mock.Mock()
487+
response_from_elemental_api = """<?xml version="1.0" encoding="UTF-8"?>
488+
<live_event href="/live_events/18">
489+
</live_event>
490+
"""
491+
client.send_request.return_value = mock_response(
492+
status=200, text=response_from_elemental_api)
493+
event_id = '999'
494+
495+
status = client.get_event_status(event_id)
496+
497+
assert status == 'unknown'
498+
client.send_request.assert_called_once_with(
499+
http_method='GET',
500+
url=f'{ELEMENTAL_ADDRESS}/live_events/{event_id}/status',
501+
headers=HEADERS, timeout=None)
502+
503+
443504
@pytest.mark.parametrize('status,expected_result', [
444505
('pending', False),
445506
('running', False),

0 commit comments

Comments
 (0)