From 46bfea2645661bb5f04dcc7d6497a88a08930111 Mon Sep 17 00:00:00 2001 From: Hongyuan Ma Date: Sat, 16 Jun 2018 14:36:25 +0800 Subject: [PATCH] add TestDataUploadError --- web/apps/test_records/exception.py | 4 + web/apps/test_records/models.py | 8 +- web/apps/test_records/views.py | 206 +++++++++++++++-------------- 3 files changed, 118 insertions(+), 100 deletions(-) create mode 100644 web/apps/test_records/exception.py diff --git a/web/apps/test_records/exception.py b/web/apps/test_records/exception.py new file mode 100644 index 0000000..ed9b861 --- /dev/null +++ b/web/apps/test_records/exception.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +class TestDataUploadError(RuntimeError): + def __init__(self, arg): + self.args = arg \ No newline at end of file diff --git a/web/apps/test_records/models.py b/web/apps/test_records/models.py index ad64cd6..5171dd4 100644 --- a/web/apps/test_records/models.py +++ b/web/apps/test_records/models.py @@ -86,7 +86,7 @@ class TestRecord(models.Model): """ tests """ - test_machine_id = models.ForeignKey(UserMachine, verbose_name="test owner", + test_machine = models.ForeignKey(UserMachine, verbose_name="test owner", help_text="person who add this test item") pg_info = models.ForeignKey(PGInfo, verbose_name="pg info", help_text="pg info") meta_info = models.ForeignKey(MetaInfo, verbose_name="meta info", help_text="meta info") @@ -144,8 +144,8 @@ class TestResult(models.Model): """ - test_dataset_id = models.ForeignKey(TestDataSet, verbose_name="test dataset id", help_text="test dataset id") - test_cate = models.ForeignKey(TestCategory, verbose_name="test category", help_text="test category") + test_dataset = models.ForeignKey(TestDataSet, verbose_name="test dataset id", help_text="test dataset id") + # test_cate = models.ForeignKey(TestCategory, verbose_name="test category", help_text="test category") latency = models.IntegerField(verbose_name="latency", help_text="latency of the test result") scale = models.IntegerField(verbose_name="scale", help_text="scale of the test result") end = models.DecimalField(max_digits=16, decimal_places=6, verbose_name="end", @@ -157,7 +157,7 @@ class TestResult(models.Model): threads = models.IntegerField(verbose_name="threads", help_text="threads of the test result") MODE_CHOICE = ( - ('1', 'simple'), + (1, 'simple'), ) mode = models.IntegerField(choices=MODE_CHOICE, verbose_name="mode", help_text="test mode") add_time = models.DateTimeField(default=timezone.now, verbose_name="test result added time") diff --git a/web/apps/test_records/views.py b/web/apps/test_records/views.py index 74f43c9..6ff4317 100644 --- a/web/apps/test_records/views.py +++ b/web/apps/test_records/views.py @@ -4,7 +4,9 @@ from __future__ import unicode_literals from django.shortcuts import render from rest_framework.pagination import PageNumberPagination +from exception import TestDataUploadError from models import UserMachine, TestCategory +from pgperffarm.settings import DB_ENUM from .serializer import TestRecordSerializer, TestRecordDetailSerializer, LinuxInfoSerializer, MetaInfoSerializer, \ PGInfoSerializer, CreateTestRecordSerializer, CreateTestDateSetSerializer, TestResultSerializer from rest_framework.views import APIView @@ -60,103 +62,115 @@ def TestRecordCreate(request, format=None): # obj = data[0].pgbench # jsLoads = json.loads(data[0]) - linux_data = json_data['linux'] - linuxInfo = LinuxInfoSerializer(data=linux_data) - linuxInfoRet = None - if linuxInfo.is_valid(): - linuxInfoRet = linuxInfo.save() - else: - msg = 'linuxInfo save error' - return Response(msg, status=status.HTTP_202_ACCEPTED) - - meta_data = json_data['meta'] - metaInfo = MetaInfoSerializer(data=meta_data) - metaInfoRet = None - if metaInfo.is_valid(): - metaInfoRet = metaInfo.save() - else: - msg = 'metaInfo save error' + from django.db import transaction + + try: + with transaction.atomic(): + + linux_data = json_data['linux'] + linuxInfo = LinuxInfoSerializer(data=linux_data) + linuxInfoRet = None + if linuxInfo.is_valid(): + linuxInfoRet = linuxInfo.save() + else: + msg = 'linuxInfo invalid' + raise TestDataUploadError(msg) + + meta_data = json_data['meta'] + metaInfo = MetaInfoSerializer(data=meta_data) + metaInfoRet = None + if metaInfo.is_valid(): + metaInfoRet = metaInfo.save() + else: + msg = 'metaInfo invalid' + raise TestDataUploadError(msg) + + # pg_data = json_data['postgres'] + pg_data = { + 'pg_branch':1 + } + pgInfo = PGInfoSerializer(data=pg_data) + pgInfoRet = None + if pgInfo.is_valid(): + pgInfoRet = pgInfo.save() + else: + msg = 'pgInfo invalid' + raise TestDataUploadError(msg) + + test_record_data = { + 'pg_info': pgInfoRet.id, + 'linux_info': linuxInfoRet.id, + 'meta_info': metaInfoRet.id, + 'test_machine': 1, + 'test_desc': 'here is desc', + 'meta_time': metaInfoRet.date + } + testRecord = CreateTestRecordSerializer(data=test_record_data) + testRecordRet = None + if testRecord.is_valid(): + testRecordRet = testRecord.save() + else: + msg = 'testRecord invalid' + print(testRecord.errors) + raise TestDataUploadError(msg) + + pgbench = json_data['pgbench'] + # print(type(ro)) + ro = pgbench['ro'] + for tag, tag_list in pgbench.iteritems(): + test_cate = TestCategory.objects.get(cate_sn=tag) + if not test_cate: + continue + else: + print test_cate.cate_name + for scale, dataset_list in tag_list.iteritems(): + print "ro[%s]=" % scale, dataset_list + for client_num, dataset in dataset_list.iteritems(): + print 'std is:'+ str(dataset['std']) + + test_dataset_data = { + 'test_record': testRecordRet.id, + 'clients': client_num, + 'scale': scale, + 'std': dataset['std'], + 'metric': dataset['metric'], + 'median': dataset['median'], + 'test_cate': test_cate.id, + # status,percentage calc by tarr + 'status': -1, + 'percentage': 0.0, + } + testDateSet = CreateTestDateSetSerializer(data=test_dataset_data) + testDateSetRet = None + if testDateSet.is_valid(): + print 'dataset valid' + testDateSetRet = testDateSet.save() + else: + print(testDateSet.errors) + msg = 'testDateSet invalid' + raise TestDataUploadError(msg) + + test_result_list = dataset['results'] + for test_result in test_result_list: + test_result_data = test_result + test_result_data['test_dataset'] = testDateSetRet.id + test_result_data['mode'] = DB_ENUM['mode'][test_result_data['mode']] + testResult = TestResultSerializer(data=test_result_data) + + testResultRet = None + if testResult.is_valid(): + print 'testResult valid' + testResultRet = testResult.save() + else: + print(testResult.errors) + msg = 'testResult invalid' + raise TestDataUploadError(msg) + + except Exception as e: + msg = 'upload error:' + str(e).encode('utf-8') return Response(msg, status=status.HTTP_202_ACCEPTED) - # pg_data = json_data['postgres'] - pg_data = { - 'pg_branch':1 - } - pgInfo = PGInfoSerializer(data=pg_data) - pgInfoRet = None - if pgInfo.is_valid(): - pgInfoRet = pgInfo.save() - else: - msg = 'pgInfo save error' - return Response(msg, status=status.HTTP_202_ACCEPTED) + msg = 'upload success!' + return Response(msg, status=status.HTTP_201_CREATED) - test_record_data = { - 'pg_info': pgInfoRet.id, - 'linux_info': linuxInfoRet.id, - 'meta_info': metaInfoRet.id, - 'test_machine_id': 1, - 'test_desc': 'here is desc', - 'meta_time': metaInfoRet.date - } - testRecord = CreateTestRecordSerializer(data=test_record_data) - testRecordRet = None - if testRecord.is_valid(): - testRecordRet = testRecord.save() - else: - msg = 'testRecord save error' - return Response(msg, status=status.HTTP_202_ACCEPTED) - pgbench = json_data['pgbench'] - # print(type(ro)) - ro = pgbench['ro'] - for tag, tag_list in pgbench.iteritems(): - test_cate = TestCategory.objects.get(cate_sn=tag) - if not test_cate: - continue - else: - print test_cate.cate_name - for scale, dataset_list in tag_list.iteritems(): - print "ro[%s]=" % scale, dataset_list - for client_num, dataset in dataset_list.iteritems(): - print 'std is:'+ str(dataset['std']) - - test_dataset_data = { - 'test_record': testRecordRet.id, - 'clients': client_num, - 'scale': scale, - 'std': dataset['std'], - 'metric': dataset['metric'], - 'median': dataset['median'], - 'test_cate': test_cate.id, - # status,percentage cal by tarr - 'status': -1, - 'percentage': 0.0, - } - testDateSet = CreateTestDateSetSerializer(data=test_dataset_data) - testDateSetRet = None - if testDateSet.is_valid(): - print 'dataset valid' - testDateSetRet = testDateSet.save() - else: - print(testDateSet.errors) - msg = 'testDateSet save error' - return Response(msg, status=status.HTTP_202_ACCEPTED) - - test_result_list = dataset['results'] - for test_result in test_result_list: - test_result_data = test_result - test_result_data['test_dataset_id'] = testDateSetRet.id - testResult = TestResultSerializer(data=test_result_data) - - testResultRet = None - if testResult.is_valid(): - print 'testResult valid' - testResultRet = testDateSet.save() - else: - print(testResult.errors) - msg = 'testResult save error' - return Response(msg, status=status.HTTP_202_ACCEPTED) - - - msg = 'upload success' - return Response(msg, status=status.HTTP_201_CREATED) -- 2.39.5