Skip to content

Commit 5563c60

Browse files
arfioMatthewKhouzam
authored andcommitted
1 parent 3eb6129 commit 5563c60

File tree

5 files changed

+182
-21
lines changed

5 files changed

+182
-21
lines changed

test_tsp.py

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
"org.eclipse.tracecompass.analysis.timing.core.segmentstore.SegmentStoreTableDataProvider:"
4343
"org.eclipse.linuxtools.lttng2.ust.analysis.callstack"
4444
)
45+
TIMEGRAPH_DP_ID = "org.eclipse.tracecompass.internal.analysis.os.linux.core.threadstatus.ThreadStatusDataProvider"
4546

4647
REQUESTED_TIME_START = 1332170682440133097
4748
REQUESTED_TIME_END = 1332170692664579801
@@ -537,6 +538,87 @@ def test_fetch_virtual_table_lines(self, ust):
537538
assert cell.content is not None
538539
assert cell.tags == VirtualTableTag.NO_TAGS
539540

541+
def test_fetch_timegraph_states(self, kernel):
542+
"""Expect having states after tree is complete"""
543+
traces = []
544+
response = self.tsp_client.open_trace(os.path.basename(kernel), kernel)
545+
traces.append(response.model.UUID)
546+
response = self.tsp_client.open_experiment(
547+
os.path.basename(kernel), traces)
548+
assert response.status_code == 200
549+
experiment_uuid = response.model.UUID
550+
551+
response = self.tsp_client.fetch_experiment_outputs(experiment_uuid)
552+
output_id = TIMEGRAPH_DP_ID
553+
status = ResponseStatus.RUNNING
554+
while status == ResponseStatus.RUNNING:
555+
time.sleep(1)
556+
response = self.tsp_client.fetch_timegraph_tree(
557+
experiment_uuid, output_id)
558+
assert response.model is not None
559+
status = response.model.status
560+
entries = [entry.id for entry in response.model.model.entries if entry.has_row_model]
561+
params = {
562+
TspClient.REQUESTED_TIME_RANGE_KEY: {
563+
TspClient.REQUESTED_TIME_RANGE_NUM_TIMES_KEY: 100,
564+
TspClient.REQUESTED_TIME_RANGE_START_KEY: REQUESTED_TIME_START,
565+
TspClient.REQUESTED_TIME_RANGE_END_KEY: REQUESTED_TIME_END
566+
},
567+
TspClient.REQUESTED_ITEM_KEY: entries
568+
}
569+
response = self.tsp_client.fetch_timegraph_states(
570+
experiment_uuid, output_id, { TspClient.PARAMETERS_KEY: params })
571+
assert response.status_code == 200
572+
assert len(response.model.model.rows) > 0
573+
assert len(response.model.model.rows[0].states) != 0
574+
row = response.model.model.rows[0].states[0]
575+
assert row.start_time is not None
576+
assert row.end_time is not None
577+
self._delete_experiments()
578+
self._delete_traces()
579+
580+
def test_fetch_timegraph_arrows(self, kernel):
581+
"""Expect having arrows after tree is complete"""
582+
traces = []
583+
response = self.tsp_client.open_trace(os.path.basename(kernel), kernel)
584+
traces.append(response.model.UUID)
585+
response = self.tsp_client.open_experiment(
586+
os.path.basename(kernel), traces)
587+
assert response.status_code == 200
588+
experiment_uuid = response.model.UUID
589+
590+
response = self.tsp_client.fetch_experiment_outputs(experiment_uuid)
591+
output_id = TIMEGRAPH_DP_ID
592+
status = ResponseStatus.RUNNING
593+
while status == ResponseStatus.RUNNING:
594+
time.sleep(1)
595+
response = self.tsp_client.fetch_timegraph_tree(
596+
experiment_uuid, output_id)
597+
assert response.model is not None
598+
status = response.model.status
599+
600+
entries = [entry.id for entry in response.model.model.entries if entry.has_row_model]
601+
params = {
602+
TspClient.REQUESTED_TIME_RANGE_KEY: {
603+
TspClient.REQUESTED_TIME_RANGE_NUM_TIMES_KEY: 5000,
604+
TspClient.REQUESTED_TIME_RANGE_START_KEY: REQUESTED_TIME_START,
605+
TspClient.REQUESTED_TIME_RANGE_END_KEY: REQUESTED_TIME_END
606+
},
607+
TspClient.REQUESTED_ITEM_KEY: entries
608+
}
609+
response = self.tsp_client.fetch_timegraph_arrows(
610+
experiment_uuid, output_id, { TspClient.PARAMETERS_KEY: params })
611+
assert response.status_code == 200
612+
assert len(response.model.model) != 0
613+
arrow = response.model.model[0]
614+
assert arrow.source_id is not None
615+
assert arrow.target_id is not None
616+
if arrow.start is None or arrow.end is None:
617+
assert arrow.duration
618+
else:
619+
assert arrow.start is not None
620+
assert arrow.end is not None
621+
assert arrow.style is not None
540622
self._delete_experiments()
541623
self._delete_traces()
542624

tsp/model_type.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,9 @@ class ModelType(Enum):
3131
'''
3232

3333
TIME_GRAPH_TREE = "time_graph_tree"
34+
TIME_GRAPH_STATE = "time_graph_state"
35+
TIME_GRAPH_ARROW = "time_graph_arrow"
3436
XY_TREE = "xy_tree"
35-
STATES = "states"
3637
XY = "xy"
3738
DATA_TREE = "data_tree"
3839
VIRTUAL_TABLE_HEADER = "virtual_table_header"

tsp/response.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
from tsp.virtual_table_header_model import VirtualTableHeaderModel
3131
from tsp.xy_model import XYModel
3232
from tsp.virtual_table_model import VirtualTableModel
33+
from tsp.time_graph_model import TimeGraphModel, TimeGraphArrow
3334

3435
MODEL_KEY = "model"
3536
OUTPUT_DESCRIPTOR_KEY = "output"
@@ -81,10 +82,15 @@ def __init__(self, params, model_type):
8182
if MODEL_KEY in params and params.get(MODEL_KEY) is not None:
8283
if self.model_type == ModelType.TIME_GRAPH_TREE:
8384
self.model = EntryModel(params.get(MODEL_KEY), self.model_type)
85+
elif self.model_type == ModelType.TIME_GRAPH_STATE:
86+
self.model = TimeGraphModel(params.get(MODEL_KEY))
87+
elif self.model_type == ModelType.TIME_GRAPH_ARROW:
88+
arrows = []
89+
for arrow in params.get(MODEL_KEY):
90+
arrows.append(TimeGraphArrow(arrow))
91+
self.model = arrows
8492
elif self.model_type == ModelType.XY_TREE:
8593
self.model = EntryModel(params.get(MODEL_KEY))
86-
elif self.model_type == ModelType.STATES: # pragma: no cover
87-
print("not implemented")
8894
elif self.model_type == ModelType.XY:
8995
self.model = XYModel(params.get(MODEL_KEY))
9096
elif self.model_type == ModelType.DATA_TREE:

tsp/time_graph_model.py

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -25,19 +25,19 @@
2525
from tsp.entry import Entry
2626

2727
TYPE_KEY = "type"
28-
START_TIME_KEY = "startTime"
29-
END_TIME_KEY = "endTime"
30-
HAS_ROW_MODEL_KEY = "hasRowModel"
28+
START_TIME_KEY = "start"
29+
END_TIME_KEY = "end"
30+
HAS_ROW_MODEL_KEY = "hasData"
3131
ROWS_KEY = "rows"
32-
ENTRY_ID_KEY = "entryID"
32+
ENTRY_ID_KEY = "entryId"
3333
STATES_KEY = "states"
3434
DURATION_KEY = "duration"
3535
LABEL_KEY = "label"
36-
VALUE_KEY = "value"
36+
VALUE_KEY = "values"
3737
TAGS_KEY = "tags"
3838
STYLE_KEY = "style"
3939
SOURCE_ID_TAG = "sourceId"
40-
DESTINATION_ID_TAG = "destinationId"
40+
TARGET_ID_TAG = "targetId"
4141

4242
# pylint: disable=too-few-public-methods
4343

@@ -119,9 +119,9 @@ def __init__(self, params):
119119
del params[START_TIME_KEY]
120120

121121
# Duration of the state
122-
if DURATION_KEY in params:
123-
self.duration = params.get(DURATION_KEY)
124-
del params[DURATION_KEY]
122+
if END_TIME_KEY in params:
123+
self.end_time = params.get(END_TIME_KEY)
124+
del params[END_TIME_KEY]
125125

126126
# Label to apply to the state
127127
if LABEL_KEY in params:
@@ -158,15 +158,20 @@ def __init__(self, params):
158158
del params[SOURCE_ID_TAG]
159159

160160
# Destination entry Id for the arrow
161-
if DESTINATION_ID_TAG in params:
162-
self.destination_id = params.get(DESTINATION_ID_TAG)
163-
del params[DESTINATION_ID_TAG]
161+
if TARGET_ID_TAG in params:
162+
self.target_id = params.get(TARGET_ID_TAG)
163+
del params[TARGET_ID_TAG]
164164

165165
# Start time of the arrow
166166
if START_TIME_KEY in params:
167-
self.start_time = params.get(START_TIME_KEY)
167+
self.start = params.get(START_TIME_KEY)
168168
del params[START_TIME_KEY]
169169

170+
# Duration of the state
171+
if END_TIME_KEY in params:
172+
self.end = params.get(END_TIME_KEY)
173+
del params[END_TIME_KEY]
174+
170175
# Duration of the arrow
171176
if DURATION_KEY in params:
172177
self.duration = params.get(DURATION_KEY)

tsp/tsp_client.py

Lines changed: 72 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@
4747
'Accept': APPLICATION_JSON}
4848

4949
GET_TREE_FAILED = "failed to get tree: {0}"
50+
GET_STATES_FAILED = "failed to get states: {0}"
51+
GET_ARROWS_FAILED = "failed to get arrows: {0}"
52+
5053

5154
# pylint: disable=consider-using-f-string,missing-timeout
5255

@@ -346,12 +349,13 @@ def fetch_timegraph_tree(self, exp_uuid, output_id, parameters=None):
346349
:returns: :class: `TspClientResponse <GenericResponse>` object Timegraph entries response
347350
:rtype: TspClientResponse
348351
'''
349-
api_url = '{0}experiments/{1}/outputs/timeGraph/{2}/tree'.format(
350-
self.base_url, exp_uuid, output_id)
352+
api_url = f'{self.base_url}experiments/{exp_uuid}/outputs/timeGraph/{output_id}/tree'
351353

352354
params = parameters
353355
if parameters is None:
354-
params = {}
356+
params = {
357+
"parameters": { }
358+
}
355359

356360
response = requests.post(api_url, json=params, headers=headers)
357361

@@ -363,6 +367,62 @@ def fetch_timegraph_tree(self, exp_uuid, output_id, parameters=None):
363367
print(GET_TREE_FAILED.format(response.status_code))
364368
return TspClientResponse(None, response.status_code, response.text)
365369

370+
371+
def fetch_timegraph_states(self, exp_uuid, output_id, parameters=None):
372+
'''
373+
Fetch Time Graph States
374+
:param exp_uuid: Experiment UUID
375+
:param output_id: Output ID
376+
:param parameters: Query object
377+
:returns: :class: `TspClientResponse <GenericResponse>` object Timegraph Model response
378+
:rtype: TspClientResponse
379+
'''
380+
api_url = f'{self.base_url}experiments/{exp_uuid}/outputs/timeGraph/{output_id}/states'
381+
382+
params = parameters
383+
if parameters is None:
384+
params = {
385+
"parameters": { }
386+
}
387+
388+
response = requests.post(api_url, json=params, headers=headers)
389+
390+
if response.status_code == 200:
391+
return TspClientResponse(GenericResponse(json.loads(response.content.decode('utf-8')),
392+
ModelType.TIME_GRAPH_STATE),
393+
response.status_code, response.text)
394+
else: # pragma: no cover
395+
print(GET_STATES_FAILED.format(response.status_code))
396+
return TspClientResponse(None, response.status_code, response.text)
397+
398+
399+
def fetch_timegraph_arrows(self, exp_uuid, output_id, parameters=None):
400+
'''
401+
Fetch Time Graph Arrows
402+
:param exp_uuid: Experiment UUID
403+
:param output_id: Output ID
404+
:param parameters: Query object
405+
:returns: :class: `TspClientResponse <GenericResponse>` list of object Timegraph arrows response
406+
:rtype: TspClientResponse
407+
'''
408+
api_url = f'{self.base_url}experiments/{exp_uuid}/outputs/timeGraph/{output_id}/arrows'
409+
410+
params = parameters
411+
if parameters is None:
412+
params = {
413+
"parameters": { }
414+
}
415+
416+
response = requests.post(api_url, json=params, headers=headers)
417+
418+
if response.status_code == 200:
419+
return TspClientResponse(GenericResponse(json.loads(response.content.decode('utf-8')),
420+
ModelType.TIME_GRAPH_ARROW),
421+
response.status_code, response.text)
422+
else: # pragma: no cover
423+
print(GET_ARROWS_FAILED.format(response.status_code))
424+
return TspClientResponse(None, response.status_code, response.text)
425+
366426
def fetch_xy_tree(self, exp_uuid, output_id, parameters=None):
367427
'''
368428
Fetch XY tree, Model extends Entry
@@ -377,7 +437,9 @@ def fetch_xy_tree(self, exp_uuid, output_id, parameters=None):
377437

378438
params = parameters
379439
if parameters is None:
380-
params = {}
440+
params = {
441+
"parameters": { }
442+
}
381443

382444
response = requests.post(api_url, json=params, headers=headers)
383445

@@ -401,7 +463,12 @@ def fetch_xy(self, exp_uuid, output_id, parameters):
401463
api_url = '{0}experiments/{1}/outputs/XY/{2}/xy'.format(
402464
self.base_url, exp_uuid, output_id)
403465

404-
response = requests.post(api_url, json=parameters, headers=headers)
466+
params = parameters
467+
if parameters is None:
468+
params = {
469+
"parameters": { }
470+
}
471+
response = requests.post(api_url, json=params, headers=headers)
405472

406473
if response.status_code == 200:
407474
return TspClientResponse(GenericResponse(json.loads(response.content.decode('utf-8')),

0 commit comments

Comments
 (0)