add task status ui test

This commit is contained in:
bohanjason 2020-03-30 00:40:03 -04:00 committed by Dana Van Aken
parent adfee76977
commit 516d02006a
4 changed files with 86 additions and 6 deletions

View File

@ -807,3 +807,23 @@ def integration_tests():
assert response['status'] == 'good'
LOG.info("\n\nIntegration Tests: PASSED!!\n")
@task
def task_status_ui_test():
# Test GPR
upload_code = 'ottertuneTestTuningGPR'
response = requests.get(dconf.WEBSITE_URL + '/test/task_status/' + upload_code)
assert 'Success:' in get_content(response)
# Test DNN:
upload_code = 'ottertuneTestTuningDNN'
response = requests.get(dconf.WEBSITE_URL + '/test/task_status/' + upload_code)
assert 'Success:' in get_content(response)
# Test DDPG:
upload_code = 'ottertuneTestTuningDDPG'
response = requests.get(dconf.WEBSITE_URL + '/test/task_status/' + upload_code)
assert 'Success:' in get_content(response)
LOG.info("\n\nTask Status UI Tests: PASSED!!\n")

View File

@ -105,14 +105,14 @@ class WorkloadStatusType(BaseType):
class TaskType(BaseType):
PREPROCESS = 1
RUN_WM = 2
RUN_GPR = 3
WORKLOAD_MAPPING = 2
RECOMMENDATION = 3
# Should be in order of execution!!
TYPE_NAMES = OrderedDict([
(PREPROCESS, "Preprocess"),
(RUN_WM, "Workload Mapping"),
(RUN_GPR, "Recommendation"),
(WORKLOAD_MAPPING, "Workload Mapping"),
(RECOMMENDATION, "Recommendation"),
])

View File

@ -81,6 +81,7 @@ urlpatterns = [
# Test
url(r'^test/create/', website_views.create_test_website, name='create_test_website'),
url(r'^test/pipeline/', website_views.pipeline_data_ready, name='pipeline_data_ready'),
url(r'^test/task_status/(?P<upload_code>[0-9a-zA-Z]+)$', website_views.tuner_status_test, name="tuner_status_test"),
# Pipeline data
url(r'^pipeline/data/(?P<pipeline_id>[0-9]+)', website_views.pipeline_data_view, name='pipeline_data_view')

View File

@ -985,8 +985,7 @@ def pipeline_data_view(request, pipeline_id):
return render(request, "pipeline_data.html", context)
@login_required(login_url=reverse_lazy('login'))
def tuner_status_view(request, project_id, session_id, result_id): # pylint: disable=unused-argument
def _tuner_statue_helper(project_id, session_id, result_id): # pylint: disable=unused-argument
res = Result.objects.get(pk=result_id)
task_tuple = JSONUtil.loads(res.task_ids)
task_ids = TaskUtil.get_task_ids_from_tuple(task_tuple)[-3:]
@ -1010,7 +1009,12 @@ def tuner_status_view(request, project_id, session_id, result_id): # pylint: di
"completion_time": completion_time,
"total_runtime": total_runtime,
"tasks": task_info}
return context
@login_required(login_url=reverse_lazy('login'))
def tuner_status_view(request, project_id, session_id, result_id): # pylint: disable=unused-argument
context = _tuner_statue_helper(project_id, session_id, result_id)
return render(request, "task_status.html", context)
@ -1662,3 +1666,58 @@ def create_test_website(request): # pylint: disable=unused-argument
set_default_knobs(s4)
response = HttpResponse("Success: create test website successfully")
return response
# For tuner status UI test
@csrf_exempt
def tuner_status_test(request, upload_code): # pylint: disable=unused-argument,too-many-return-statements
try:
session = Session.objects.get(upload_code=upload_code)
except Session.DoesNotExist:
LOG.warning("Invalid upload code: %s", upload_code)
return HttpResponse("Invalid upload code: " + upload_code, status=400)
result = Result.objects.filter(session=session).earliest('creation_time')
context = _tuner_statue_helper(session.project.id, session.id, result.id)
overall_status = context['overall_status']
num_completed, num_total = context['num_completed'].replace(' ', '').split('/')
task_info = context['task_info']
num_tasks = len(task_info)
if overall_status.lower() != 'success':
return HttpResponse("Failure: overall status {} should be success".format(
overall_status.lower()))
if num_completed != num_total:
return HttpResponse("Failure: #completed tasks {} != #total tasks {}".format(
num_completed, num_total))
if num_tasks < 3:
return HttpResponse("Failure: number of tasks {} should >= 3".format(num_tasks))
for i in range(num_tasks):
name, task = task_info[i]
result = task.result
if i == 0:
expected_name = TaskType.TYPE_NAMES[TaskType.PREPROCESS]
if name != expected_name:
return HttpResponse("Failure: the first task {} should be {}".format(
name, expected_name))
elif i == 1:
expected_name = TaskType.TYPE_NAMES[TaskType.WORKLOAD_MAPPING]
if name != expected_name:
return HttpResponse("Failure: the second task {} should be {}".format(
name, expected_name))
if session.tuning_session == "tuning_session":
if session.algorithm == AlgorithmType.GPR or session.algorithm == AlgorithmType.DNN:
if isinstance(result, dict) is False:
return HttpResponse("Failure: wrong result for task {}".format(name))
if 'mapped_workload_id' not in result:
return HttpResponse("Failure: wrong result for task {}".format(name))
elif i == 2:
expected_name = TaskType.TYPE_NAMES[TaskType.RECOMMENDATION]
if name != expected_name:
return HttpResponse("Failure: the third task {} should be {}".format(
name, expected_name))
if isinstance(result, dict) is False:
return HttpResponse("Failure: wrong result for task {}".format(name))
if 'recommendation' not in result:
return HttpResponse("Failure: wrong result for task {}".format(name))
return HttpResponse("Success: task status view test passes")