add TestDataUploadError
authorHongyuan Ma <CS_MaleicAcid@163.com>
Sat, 16 Jun 2018 06:36:25 +0000 (14:36 +0800)
committerHongyuan Ma <CS_MaleicAcid@163.com>
Sat, 16 Jun 2018 06:36:25 +0000 (14:36 +0800)
web/apps/test_records/exception.py [new file with mode: 0644]
web/apps/test_records/models.py
web/apps/test_records/views.py

diff --git a/web/apps/test_records/exception.py b/web/apps/test_records/exception.py
new file mode 100644 (file)
index 0000000..ed9b861
--- /dev/null
@@ -0,0 +1,4 @@
+# -*- coding: utf-8 -*-
+class TestDataUploadError(RuntimeError):
+  def __init__(self, arg):
+   self.args = arg
\ No newline at end of file
index ad64cd65687b8190299553ddc3437ea107ebf8d1..5171dd42adbd29a9871361e9def2bdc209cf47e5 100644 (file)
@@ -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")
index 74f43c96ca15a68470b9e91f9abceee4832d1f5e..6ff431729273487e6e06aaa260e3a0680c054a64 100644 (file)
@@ -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)