From 685a26c0279cd2ddfe963ca7a574136c7ce8e4c4 Mon Sep 17 00:00:00 2001 From: Alan Date: Sun, 26 Jan 2020 11:41:47 -0800 Subject: [PATCH 1/2] update postgresql settings file --- rest_api/rest_api/settings_local.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/rest_api/rest_api/settings_local.py b/rest_api/rest_api/settings_local.py index 29bc0bd..a62729a 100644 --- a/rest_api/rest_api/settings_local.py +++ b/rest_api/rest_api/settings_local.py @@ -3,11 +3,11 @@ DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', - 'NAME': 'postgres', # data_base name - 'USER': 'chenzhang', + 'NAME': 'pgperffarm-db', + 'USER': 'postgres', 'PASSWORD': 'password', - #'HOST': '/var/run/postgresql' - 'HOST': '/tmp' + 'HOST': '/var/run/postgresql' + #'HOST': '/tmp' } } @@ -19,4 +19,4 @@ PGAUTH_KEY = '' EMAIL_HOST_USER = '' -EMAIL_HOST_PASSWORD = '' # individual smtp password +EMAIL_HOST_PASSWORD = '' # individual smtp password \ No newline at end of file From 31de849773d60656734c550c37f474956963b483 Mon Sep 17 00:00:00 2001 From: Chloe Guo Date: Sun, 16 Feb 2020 22:53:42 +0800 Subject: [PATCH 2/2] modify files related uploading, run through the flow --- .idea/.gitignore | 2 + .idea/django-postgres-stack.iml | 13 + .../inspectionProfiles/profiles_settings.xml | 6 + .idea/misc.xml | 7 + .idea/modules.xml | 8 + .idea/vcs.xml | 6 + client/__pycache__/settings.cpython-36.pyc | Bin 0 -> 1115 bytes .../__pycache__/settings_local.cpython-36.pyc | Bin 0 -> 491 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 156 bytes .../__pycache__/pgbench.cpython-36.pyc | Bin 0 -> 6170 bytes .../__pycache__/runner.cpython-36.pyc | Bin 0 -> 4481 bytes client/benchmarks/pgbench.py | 3 +- client/benchmarks/runner.py | 6 +- .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 156 bytes .../__pycache__/collectd.cpython-36.pyc | Bin 0 -> 2380 bytes .../__pycache__/collector.cpython-36.pyc | Bin 0 -> 1175 bytes .../__pycache__/linux.cpython-36.pyc | Bin 0 -> 1871 bytes .../__pycache__/postgres.cpython-36.pyc | Bin 0 -> 2154 bytes client/collectors/collectd.py | 4 +- client/perffarm-client.py | 13 +- client/settings.py | 14 +- .../utils/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 151 bytes .../utils/__pycache__/cluster.cpython-36.pyc | Bin 0 -> 2972 bytes client/utils/__pycache__/git.cpython-36.pyc | Bin 0 -> 3400 bytes .../utils/__pycache__/locking.cpython-36.pyc | Bin 0 -> 1015 bytes .../utils/__pycache__/logging.cpython-36.pyc | Bin 0 -> 441 bytes client/utils/__pycache__/misc.cpython-36.pyc | Bin 0 -> 2025 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 161 bytes .../machines/__pycache__/admin.cpython-36.pyc | Bin 0 -> 202 bytes .../__pycache__/models.cpython-36.pyc | Bin 0 -> 1832 bytes .../__pycache__/permissions.cpython-36.pyc | Bin 0 -> 713 bytes .../__pycache__/serializers.cpython-36.pyc | Bin 0 -> 4759 bytes .../machines/__pycache__/urls.cpython-36.pyc | Bin 0 -> 531 bytes .../machines/__pycache__/views.cpython-36.pyc | Bin 0 -> 3730 bytes .../apps/machines/migrations/0001_initial.py | 49 +++ .../migrations/0002_auto_20200213_1523.py | 20 ++ rest_api/apps/machines/migrations/__init__.py | 0 .../__pycache__/0001_initial.cpython-36.pyc | Bin 0 -> 1711 bytes .../0002_auto_20200213_1523.cpython-36.pyc | Bin 0 -> 716 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 172 bytes rest_api/apps/machines/models.py | 2 +- .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 160 bytes .../records/__pycache__/admin.cpython-36.pyc | Bin 0 -> 201 bytes .../__pycache__/exception.cpython-36.pyc | Bin 0 -> 473 bytes .../__pycache__/filters.cpython-36.pyc | Bin 0 -> 849 bytes .../records/__pycache__/models.cpython-36.pyc | Bin 0 -> 8358 bytes .../__pycache__/serializers.cpython-36.pyc | Bin 0 -> 16820 bytes .../records/__pycache__/urls.cpython-36.pyc | Bin 0 -> 847 bytes .../records/__pycache__/views.cpython-36.pyc | Bin 0 -> 7377 bytes .../apps/records/migrations/0001_initial.py | 164 ++++++++++ .../migrations/0002_auto_20200215_1749.py | 20 ++ rest_api/apps/records/migrations/__init__.py | 0 .../__pycache__/0001_initial.cpython-36.pyc | Bin 0 -> 5107 bytes .../0002_auto_20200215_1749.cpython-36.pyc | Bin 0 -> 698 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 171 bytes rest_api/apps/records/models (copy).py | 226 +++++++++++++ rest_api/apps/records/models.py | 2 +- rest_api/apps/records/views (copy).py | 303 ++++++++++++++++++ rest_api/apps/records/views.py | 32 +- .../users/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 158 bytes .../users/__pycache__/admin.cpython-36.pyc | Bin 0 -> 199 bytes .../users/__pycache__/auth.cpython-36.pyc | Bin 0 -> 5165 bytes .../users/__pycache__/filters.cpython-36.pyc | Bin 0 -> 1232 bytes .../users/__pycache__/models.cpython-36.pyc | Bin 0 -> 263 bytes .../__pycache__/serializers.cpython-36.pyc | Bin 0 -> 1516 bytes .../users/__pycache__/urls.cpython-36.pyc | Bin 0 -> 572 bytes .../users/__pycache__/views.cpython-36.pyc | Bin 0 -> 3940 bytes rest_api/requirements.txt | 1 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 156 bytes .../__pycache__/settings.cpython-36.pyc | Bin 0 -> 4493 bytes .../__pycache__/settings_local.cpython-36.pyc | Bin 0 -> 502 bytes .../rest_api/__pycache__/urls.cpython-36.pyc | Bin 0 -> 1729 bytes .../rest_api/__pycache__/wsgi.cpython-36.pyc | Bin 0 -> 577 bytes rest_api/rest_api/settings_local.py | 2 +- rest_api/rest_api/settings_local.py.in | 2 +- 75 files changed, 882 insertions(+), 23 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/django-postgres-stack.iml create mode 100644 .idea/inspectionProfiles/profiles_settings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 client/__pycache__/settings.cpython-36.pyc create mode 100644 client/__pycache__/settings_local.cpython-36.pyc create mode 100644 client/benchmarks/__pycache__/__init__.cpython-36.pyc create mode 100644 client/benchmarks/__pycache__/pgbench.cpython-36.pyc create mode 100644 client/benchmarks/__pycache__/runner.cpython-36.pyc create mode 100644 client/collectors/__pycache__/__init__.cpython-36.pyc create mode 100644 client/collectors/__pycache__/collectd.cpython-36.pyc create mode 100644 client/collectors/__pycache__/collector.cpython-36.pyc create mode 100644 client/collectors/__pycache__/linux.cpython-36.pyc create mode 100644 client/collectors/__pycache__/postgres.cpython-36.pyc create mode 100644 client/utils/__pycache__/__init__.cpython-36.pyc create mode 100644 client/utils/__pycache__/cluster.cpython-36.pyc create mode 100644 client/utils/__pycache__/git.cpython-36.pyc create mode 100644 client/utils/__pycache__/locking.cpython-36.pyc create mode 100644 client/utils/__pycache__/logging.cpython-36.pyc create mode 100644 client/utils/__pycache__/misc.cpython-36.pyc create mode 100644 rest_api/apps/machines/__pycache__/__init__.cpython-36.pyc create mode 100644 rest_api/apps/machines/__pycache__/admin.cpython-36.pyc create mode 100644 rest_api/apps/machines/__pycache__/models.cpython-36.pyc create mode 100644 rest_api/apps/machines/__pycache__/permissions.cpython-36.pyc create mode 100644 rest_api/apps/machines/__pycache__/serializers.cpython-36.pyc create mode 100644 rest_api/apps/machines/__pycache__/urls.cpython-36.pyc create mode 100644 rest_api/apps/machines/__pycache__/views.cpython-36.pyc create mode 100644 rest_api/apps/machines/migrations/0001_initial.py create mode 100644 rest_api/apps/machines/migrations/0002_auto_20200213_1523.py create mode 100644 rest_api/apps/machines/migrations/__init__.py create mode 100644 rest_api/apps/machines/migrations/__pycache__/0001_initial.cpython-36.pyc create mode 100644 rest_api/apps/machines/migrations/__pycache__/0002_auto_20200213_1523.cpython-36.pyc create mode 100644 rest_api/apps/machines/migrations/__pycache__/__init__.cpython-36.pyc create mode 100644 rest_api/apps/records/__pycache__/__init__.cpython-36.pyc create mode 100644 rest_api/apps/records/__pycache__/admin.cpython-36.pyc create mode 100644 rest_api/apps/records/__pycache__/exception.cpython-36.pyc create mode 100644 rest_api/apps/records/__pycache__/filters.cpython-36.pyc create mode 100644 rest_api/apps/records/__pycache__/models.cpython-36.pyc create mode 100644 rest_api/apps/records/__pycache__/serializers.cpython-36.pyc create mode 100644 rest_api/apps/records/__pycache__/urls.cpython-36.pyc create mode 100644 rest_api/apps/records/__pycache__/views.cpython-36.pyc create mode 100644 rest_api/apps/records/migrations/0001_initial.py create mode 100644 rest_api/apps/records/migrations/0002_auto_20200215_1749.py create mode 100644 rest_api/apps/records/migrations/__init__.py create mode 100644 rest_api/apps/records/migrations/__pycache__/0001_initial.cpython-36.pyc create mode 100644 rest_api/apps/records/migrations/__pycache__/0002_auto_20200215_1749.cpython-36.pyc create mode 100644 rest_api/apps/records/migrations/__pycache__/__init__.cpython-36.pyc create mode 100644 rest_api/apps/records/models (copy).py create mode 100644 rest_api/apps/records/views (copy).py create mode 100644 rest_api/apps/users/__pycache__/__init__.cpython-36.pyc create mode 100644 rest_api/apps/users/__pycache__/admin.cpython-36.pyc create mode 100644 rest_api/apps/users/__pycache__/auth.cpython-36.pyc create mode 100644 rest_api/apps/users/__pycache__/filters.cpython-36.pyc create mode 100644 rest_api/apps/users/__pycache__/models.cpython-36.pyc create mode 100644 rest_api/apps/users/__pycache__/serializers.cpython-36.pyc create mode 100644 rest_api/apps/users/__pycache__/urls.cpython-36.pyc create mode 100644 rest_api/apps/users/__pycache__/views.cpython-36.pyc create mode 100644 rest_api/rest_api/__pycache__/__init__.cpython-36.pyc create mode 100644 rest_api/rest_api/__pycache__/settings.cpython-36.pyc create mode 100644 rest_api/rest_api/__pycache__/settings_local.cpython-36.pyc create mode 100644 rest_api/rest_api/__pycache__/urls.cpython-36.pyc create mode 100644 rest_api/rest_api/__pycache__/wsgi.cpython-36.pyc diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..e7e9d11 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,2 @@ +# Default ignored files +/workspace.xml diff --git a/.idea/django-postgres-stack.iml b/.idea/django-postgres-stack.iml new file mode 100644 index 0000000..ff86ada --- /dev/null +++ b/.idea/django-postgres-stack.iml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..739fced --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..82ae627 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/client/__pycache__/settings.cpython-36.pyc b/client/__pycache__/settings.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dc7e9d9d9083144254787b2b151045ed14554139 GIT binary patch literal 1115 zcmZWn&2HO95ayDUEzA0`oit6FpwLA~6N%w zufPV*!9BbR_u)Hu0N;N#aDJXw@gMqyq4tXw?wJ}Xp6A%_NW&$hB~Qp2L9=yubg3gv zX&dmvB|^&cy{ZWiE`2DSX`z0mZYNsx@s+Ap>n2a9LPUJuvL>D&WXq+26~!#_$vn0q z%Eg2czNKtQ)tb_PSd*AqN7Ri25(=J@YByfD?#Tly=FIZF(Jl0=Z`JG47g^^r zUp#-;#F_feo;r*jg&5D<&BUsR@`pd_Qo!P>|3G zU1Hy&dBwHAIKIujgy4MOT-@DCKAqUU7ZN*SWb9qwYrvfn_dKF17RQfM4<{D%v*X5b zV5h+#W{&V^h>NLFkRY zFiO@f=6GPGP)(7eSX>!umfo4JX>Y2AG+7*SnY}4M8ZQ4_MG`$r_F98MZ?IqXsq6S< zmxg0+@^6{tpEwc13n$#Zwr)l9YB{8$Jf?97S4btO-c$YN(%^G0m)o78eL8q6OM_Ow zchVX52Jh{DV|Xlc&C|}?qlIopj+jbwrn)4v%}#fL=8qb~#!+XmxRn%r*dDY_?89F7 zO{XmjskzxWY1!SzyOzxLPKW)|p{)qA*l#ym-NWM>*W!O`mMg6bmqcmnBqA~sF*O~z z#03z>q)9G3@u$XqRKId9{(g10(*3!Z((urCIJaQtgcEwZ*EKF2_uN`+opqB@^+#r3 p1{7kSyh^*nUnr49S;N##WTK*O8an#_du?Az@vNz%JX%9}{U1E^R!jf@ literal 0 HcmV?d00001 diff --git a/client/__pycache__/settings_local.cpython-36.pyc b/client/__pycache__/settings_local.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..40171338b3074ee6e9fd36664198bfe6371b9ee4 GIT binary patch literal 491 zcmYjOK~BOz6m3fj1tlc1^8h9+U=rQ9FvdzpKn0q%#5fC^!Y>6aozf{ba277$A-qVp z-oljwTEk5K%gdWTdGp^~RI8Qk=iN(95`-_|V3jz(;l(aFfItKgL4pFvpg<8yTV*a1 z5mX}aDnOaY|6C;s=S8SkLgUEJO5jc1Rgi4X;MEO%+JbRw>`vai5LhdsEb(KHEdwWF z>j{ng^G!AKBQKs#-FVT2ai-=yoVkppG=@zby}L1rS0Ty|mq9}zMLg*A1~`)kTA$;{ z!X{A-&9a_`rcUJU(6TdObF#mjrYYjaiQ`6dG-#AEMaQ?J4k_!Jt=(!Cwn)wBXd}Dp zm{{+bxNVclpYVX6$+2M$@44t0n%yNe+}C=K&d$Nv+tv?+`~@FEtnx7T@U5d6U3kb} zQDm%>84cS3pAP+I)Xc|fvV=#4Cc)eb6U4kEnTI}e0y=SnRPx# literal 0 HcmV?d00001 diff --git a/client/benchmarks/__pycache__/__init__.cpython-36.pyc b/client/benchmarks/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f6970efe53fefa0b732e5e19940d62d90cb17376 GIT binary patch literal 156 zcmXr!<>eCLw}@i^g2x~N1{i@12OutH0TL+;!3>&=ek&P@K*9*(m#2P4er~FMdTG9X zKxIirex7qqVsWv4N>*ZCdcJN!esM{9QEIVnaYW@=uEeo|^)az<`qQFgI@ fe0*kJW=VX!UP0w84x8Nkl+v73JCGH{K+FIDpe`qA literal 0 HcmV?d00001 diff --git a/client/benchmarks/__pycache__/pgbench.cpython-36.pyc b/client/benchmarks/__pycache__/pgbench.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8ace00bfaa3fa6105c6c09eacb181bc17a7368a3 GIT binary patch literal 6170 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 literal 0 HcmV?d00001 diff --git a/client/benchmarks/__pycache__/runner.cpython-36.pyc b/client/benchmarks/__pycache__/runner.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1559e76215c213a7b3689cfec1c30c25c3e0e72e GIT binary patch literal 4481 zcmbVQOLH5?5uVu>7E2JINWCb(5SLgoDkiBosZ^rSifq}D^Ds@DPAH?|AkfYNTyU`q z%`9Yc3v^ONosvklPrm2}B$u4?TjrXR{(?{WdKLsFs8W>*P}}qF?e6LBuYn&fE(Uww zeDH?{ml*pud*?F0}Vtdi_c~UpL-J~&GYA7!F;Wkzaj0bp8?SYQBV4p@DOB5=ic=ARSirn5YGM&>Rn$cTZ6KD! zIkXF68RD+!#=B7(?hm{2;FEEhMzXj)?55p*q?&S^s%F+}c9W!;??=shryJFq%{UE{ zv53=t6RpZ4*_4sWyE0eJC=WM655m%iTGHS)9<>27;S<(jF$3j>S`!C-d*XsR6ARRx z*r1*HXj z8;7Ks(YhoTX#cW|`Y~Pdneku6yrPR`PVxG@&@XPE`9lRKd_2F#qnaRR;!iyIfIV>p zf8tJ6v7m}=RB5@oI+Id+<-KeF)b`rDC%bTCS{V-GoHVb2yF}t(txBo(LV3#QEHBgQ zD?~^Y-8khmbt&x~e9@Kt7fjKZ=~gnkio+@ZVP3#3^DSQcul6XF@9~R_ZW5-!Xq6o!C9&;KE>=On!(BKC*_FOx4t0tkgJCMqSPGc`aST`sX;H$i0~DST!DS zhu5s)!n}TF@9eV4Nyr<`Wq%EA|F6qt1ABlhDV$X%+()I8xC7^e5mX%m;*Nm>rE?s3 z@^RS{-YS!ibMFK@@=ET*VouKzl}FaGJDHw_8&xL`tm;i1`Ok?n2!wB(&>bugcSu{E zI;A_P(F|_Hp7y-KB1Z0@eqtOqZxHtM>5eLp0B)NviCTURs}|l}5sOcpi6`n?$)xD<{@hSC0LOKRBOX7+l2qd2!(p_;a=gy+3B3u)FN2 zj@_3gUOAh->9G9rLGU$~f8p%7%2`p*S0_e?J@y%aK4!nH-eswE7kzln#qHuMex`{_qJ#YN=KVVolT2ry6a36;T^@^4|ScZ-+S zK3iWKuCIya+6On*KD@EEyK&uozJL8XoRh*;JCww=Lucf=nHWZR+boMASI+t!E#HClD=PAf` zrhIi3hU?@g0hG2;$Y^Jf#VPPM&qgK(Yp>iXsUVOp5fVW=*(gdS#fEmjkTI!eM0CY? zI8wUN8IO{zE6(2Y{$Uu6D2-`%Bx8sk%;hI}m6%mY$oo`xwHKd}7exV=rR{i6^JqT4 z7doUznZpc3{Q}IGHO*nxvK`nCqWv;38!^v)GY-)D$O3`AWYvJ@1OzpQP<_c>=C4{7 zuk&SIyfmL5o_W_SOOScUIwnipMQ6f~t-eY61H=jWHXs7PAgm`Aq8Ttib2()NiamuS ztgI}$sQ~%e=U4fQpgiYUGyEY(C&V*1@Mm<6mU04OK=3rP>>#t)2Z8(}@(OHU{3u7w zLhB`LV`O&bxQ)|O&vQWbv4wrizvN~1IlPR06`)()pqpRb^ZfyGn@zx8d=FkZE5l3g z9Lq?YA-pQy+mS>~!QsdiyGo*NG6i%QuLSh{i|cZ>e`Co9P)3qSBPy)d=Ww$MP3^&#(CnJh%Ls zr1e>>QUarb$#}{GbPS?1D&OD%)>pqjwhlj?@Bs(z+K4_ow@)nj7W~7+tZ;UL;lg{! zCiZ*4O_Xxh0KbAnFwZG5k9f4I#Sf;KLO;SN&Ew}; zo;AD8+q=JO_TnUJzLD?CY~0_+oJoqU!dp`tNR09=$Xzs_#V0yc@;QU5?OAvb1d!sp zcoZ3~k3!({+A+_Os!sSf)_sU%Y)e085#xYFYva1+htC+CZ2euZmB1fSua9p2id5neX7k}T{d>Lxm;XTIZA&4ZRNsc_adL2eMMI0a^iv{9xjpFFTfn><`yEt9Ixw0RxK$Aa$U|_of>SY_uuKletf^Jg!R#aH{P-FVFC?b(E0c1;m HVypiF6ed$W literal 0 HcmV?d00001 diff --git a/client/benchmarks/pgbench.py b/client/benchmarks/pgbench.py index 3cf2719..3e0d775 100644 --- a/client/benchmarks/pgbench.py +++ b/client/benchmarks/pgbench.py @@ -214,7 +214,7 @@ def run_tests(self, csv_queue): # derive configuration for the CPU count / RAM size configs = PgBench._configure(cpu_count(), available_ram()) - results = {'ro': {}, 'rw': {}} + results = {'ro': {}, 'rw': {}} #ro:read only rw:read-write j = 0 for config in configs: scale = config['scale'] @@ -223,6 +223,7 @@ def run_tests(self, csv_queue): results['ro'][scale] = {} if scale not in results['rw']: results['rw'][scale] = {} + #print(results) # init for the dataset scale and warmup self._init(scale) diff --git a/client/benchmarks/runner.py b/client/benchmarks/runner.py index 8544fac..b4580fe 100644 --- a/client/benchmarks/runner.py +++ b/client/benchmarks/runner.py @@ -83,7 +83,7 @@ def _run_config(self, config_name): # expand the attribute names bench = bench(**config['config']) - self._cluster.start(config=config['postgres']) + self._cluster.start(config=config['postgres']) #obtain the database name pgperffarm-db l44 'postgres': postgres_config, # start collector(s) of additional info self._collector.start() @@ -143,8 +143,10 @@ def _upload_results(self, results): post.append(postdata) headers = {'Content-Type': 'application/json; charset=utf-8', 'Authorization': self._secret} + print(1) r = requests.post(self._url.encode('utf-8'), data=json.dumps(post).encode('utf-8'), headers=headers) - + print(self._url) + # print(post) def run(self): 'run all the configured benchmarks' diff --git a/client/collectors/__pycache__/__init__.cpython-36.pyc b/client/collectors/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..46679206ad8d755f4bd89b1544006f5edd09fb4e GIT binary patch literal 156 zcmXr!<>eCLw}@i^g2x~N1{i@12OutH0TL+;!3>&=ek&P@K*9*(m#2P4er~FMdTG9X zKxIirex7qqVsWv4N>*ZCdcJN!esM{9QEIVnaYW@=uEesX?JPHJ*Veo?W0 fe0*kJW=VX!UP0w84x8Nkl+v73JCGH{K+FIDq%tRk literal 0 HcmV?d00001 diff --git a/client/collectors/__pycache__/collectd.cpython-36.pyc b/client/collectors/__pycache__/collectd.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8edc1bd37d3b82ec42c839b1281c19efb10b2315 GIT binary patch literal 2380 zcmZuzUvJz*5Z|@ef6loy39Z_u6z~JBbfU?DkSKx*iqfP6g*2i?fFH0NuXFLmXS=)W zq_Hkf*9Tts2K@qj2qeVE*jFA9Z#?&j89R5nq^z_vWJ_ zOB!@IeM)-Wf4~;m?NM!J#Q>NisyvKGyuQ{KQOf)4agk+7tT+hyL4EbIwoG}9CZ@vx z;UP@~If`v!GWt&i$S9LeyKH599pV z-;ZP(`|?z(WaLLV_j#luP$s@qkxHdXW9e5i%?JMM=#7CG@xuYQ5(nl6O!+5}u{kCo zQFLekH#r?LJnWbZP0m)yz?{%let>(dq1{kNxf42}XAsVr1)2`GCv@md0O?gSTxj{3 zJ%#{}43Uj3-nmcCEbfizb#g{kmoJRjb;7$7wrQ%Gen$O~}|7)3Mcf zzOqXA(ks|Kp_IUm*1Ca~>t0MR2)NsEld7CwpKc`?t97J(4uN)<#LY&TP z%0enQhJ2n~(262Xq)g!cFMv0(sU)tJ9^Xf(Y-rVWaGM<0u7(9Bldq?&$ zD`b5Yq**#(Ca`{SimD|S0qu^sN66-NV6miwN(~nlIspE@hr^~ zsV!M%snV>`FKs;8+1cE9_9)zVvb(kYSX(C|Rf%S}Ut4ij$fVcNOeWcZwu?&PX>GpW z`kS55j8C}eB4T!1Fu@YWo(@7No-&KTqTMQfBjSD7_j#BGwGeXs#lA&d+%v)~AMIynGzkWU!i>3cd$|f^LYl!3{-~abPqRW{$Cv z+v>GA`?cwiP%GAMy#fIUHQyuZYt!`b*Eak+(qG#H`kMOK8sTbtwm`396^LG*UC-Y3 zqpj_oO=05N4I~(C&k*n6J`);ggKJCfpw4Pse-5Iwfe?tfOY0kNM&0b2g^UgsU^XG| zfiMmE^e%?X4QL(|0yZaP$R^~>P!_Z>V_+aGKal)3Bg#JV#5WXL2gSD;uKYxD<45># z%wQ?Xavm0e%~G?YG|TGyGlZb&`+1@KgQ9{4yylnFvh_#NDfD63?e8Z(d`faK)^l3u zZh|S%L-IBn1t3IPHpuCfEhvlKLT#bJO(6==GaCp42Yg}8XcL6XSTd=K@*xB{hc tu)dlkfws0kgddM4tj64&^9GitoZJU3tY2V^5__F%bZOUMl$pyL{{bk^bpikY literal 0 HcmV?d00001 diff --git a/client/collectors/__pycache__/collector.cpython-36.pyc b/client/collectors/__pycache__/collector.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1253f568f49b7fe9ca638295015a53962d691e78 GIT binary patch literal 1175 zcmb_b&1%~~5T0Ghw)~es<5CJfgdPe$Br4>RLns9oN((iG9s-7TQM6lIuB>%-Wk`&D za$csdq-)=zr_M;WoVaOET`@Z|>}d9zZ)VTh?MCPD{OfxT@DuJW7wtDFwu9R{kRaI| zih{K>WRib|o)h9px$yrY{u~Vj7z0Bt+0c<(I(IO1r7J6_E3ztUsH@VGb<{Q4kWJK{ zY+=rJcJOf?r%_+Wu?kad7JhIXZXL9yS5XorqvI(>&0=+|)3GwU5F4@$B+>+`k766R zMX&^ch2S-8&|_Isl!-06u2u23A7H5PUmyIjo+^Jd*Z!y5bgYwp99ZkiNsx^6$xPdH zWRyLzX%K$*!#Gk&>hH4c%+uLz<_UqAQz0sZgdhQ1JbPH?={6>G=o}Ymk{td48cV)} z2`t>^`BLdXAyE%uRx+%IYPGypUp}i!;xtQDjqPJoNqsV;fVlNH>%)UZ8W+B^Ynv z%aau=06m8ZTLXh@@3Mr(b7)xw2{LJq=Lk&=f8Rr8s4-0xOSA)Pu|;Q(nLNdR!sFUh z&;A96pd3DcbMyxsJuA@=GemCQq*rJ}uwpkaHw<-Ge90zk(>RVi@ijzj&5*0sCAPAd zM5o}YI-kiPRaq4W3x|8#R%RaMt&Nu*p;+oBFc+EY^2O6VutlmtuTDcq^C3jm5Mrw3 zJSMv(#PvLgHzzeAqz;8JRZMB>v{8Eukz(k=d(ESE87kdu-Em literal 0 HcmV?d00001 diff --git a/client/collectors/__pycache__/linux.cpython-36.pyc b/client/collectors/__pycache__/linux.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f096a390beb3bafc943187e17b42be91fb8b615c GIT binary patch literal 1871 zcmbtV&2HpG5bkb!Y|msSA=&IM0krbM1xqA8a6u5EMUh|+C|Z6bkPldn+cWX3?H;<@ zD`F+5*(>5Xc%{B_+85xkC#u>r+1Ux=f=Bh!U1fLG*Hty2P9~$nz0ZF6+a=^Lvhl#0 zJONTqfpNlVMG^{7XsQdyWf^g``ekQsv_4yc3-U2 z@I@v|(W=nekJX~c%W0X1N@u!My3AGhalUBFW-2}jYtc4ZML7nC56S`18IU>wc1^EI zN;I7_kPfGF7sI_KbBDV}Waccvj`}I!31JP+U(?UKQQRsStBbOUJFl0aS)^rdLd zs!XYv&$DJGju%4dnJm;Xq?tdD^QtTw9p`IwR9qoiCyOf+q-oidI!$*lM-LdGo)ggS z;oE?oto?F|KJcJKvfyBy*_7$IjW42d54Nn{vjbR~0mLIUs>)(ayTh$xti%60!&O== z?r$7%@6HioaeD%Wfn>9I1PaG1Bui4#8+uLWxMEAPq!cb6u9S8A7j0SbP+t}yAlz13 z8BblQTvyN!d+7?~wBIsbyTBGPhnogn)PVX_M9iXOsN4q1>p%T2reQC|8M9s1-QP;3 z_j)TCya}7khoERk2Se8s>vRTHJ7?VeondNxaD+ALbswxk4xbmYDXK6R&9t1g5*kD_ z-Tum2HnXtLNj`utckDRB7KcK8g;fwa5<5j=uyTSMeQxqS+`y83QwH)OEFS}{QVZw- z>mF^Twuu*Ddz+&J?;$KU#|D&=+)&JuvnBiE;D%kZIbFhKap#o$M7aAM`JViYNDS_H zcv~L+9gkqs!xq4>1Ay$53E#|(qTU=J-6UQ}k;f~$g~0f$)%n_5_b(;>O6kV^Tm2A9 zywxy*{uhe^W`Zm-4k%+=*@A;2GIY8P?GczGAoUI~;<#)~AKX&+(SLxvF3R(0gj1o( z>LN|eC{1g@+Y0q@n*Q2m)ym?hDHnN~%6o8-JVb_FC*MbgH!LxhjreR4VDC#GSOBDU zQK2pi{J??VFbJ$I+A+RRCyPv9N}Nj)J5=J$ODu0QX?0nt6Zm_XL0Q_uGoya5E>&)e h5C-PO9R3UJ2mdV!6P)&$eTns}FrI)N(lH%7{{REE#uWen literal 0 HcmV?d00001 diff --git a/client/collectors/__pycache__/postgres.cpython-36.pyc b/client/collectors/__pycache__/postgres.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..58df1052e23034129fd20c16d82155e70d4d4df4 GIT binary patch literal 2154 zcmaJ@&5ztP6t|O1lKI-*(yDAZ1td^MY-cJeB#_!tb-N&>vTb*f+D3vX8+&In^~6)# zvmc{bF544Q5BwS2Iq?_pH~7i{apT+*?>RHos-9w@M`=WHpD*HZGi^FK z5Up`LZBz0MVGS0(AS~paGe7OJ7K>T)1x;5N-6g&D-(Z_;_dFXtRI=b&+s30QpYk5H zzK}y;k(yRnF=hp7E*}qsJ23QhAe^AT;420HJm$Y3X}|*301mcU1Uz(BNgA;hTD2D* zN^ORU>rE*HFN{>Ptd+o1)N`He<+?1Ah1%|;`_}|NEaZp_8k7!y{E1t~L^u zn;bT9y^(+*fV;!Wit%Hvd-chPH$KSG|4kVBGLSi)lZ?zgpmgp71=PVyy4~|_l*y@K zr2>KNRr#3PX0}&W*(5gyy}$;Vi+vj|bi##7ywv!Ws1-2q>f6DA9P`0&DhCfw%z>;n zMXvRLjq++JuT2(MT!YIM&jy7kd1VF*B&5=Vr9yvlV&g0;tI}lIMRY#|LTCuT*#~by z+Fz;`6xHB~V64G#SN|OZ18H|gDLMJs(2>Ugf{}ljoY7M{r=tMY8l#Z;FX^c__eK#5 zP`6Gfn8)`}(`V7B3Hu0AGc@YiF?6 z%`UiAI&%CmsXhvbdGA?E{YJ@YNXaaGOrBzT!|bQ<38}m%AVYXM+p~3@AC}cHS>lsu zZVW8w+4=!sdP~S67bqolU~YY^A)!}_snSwq`#I*_$?Wd#*8Q!`?-Pvf#_|XdpN1{m`S^J^D|z64}Q=H!PC!pX=L@{9L8 zz|2w@5SJQId0zjz4H(yjTd2t@ynofYDInDgIiB495YNNILo)mH?Lb4~DAT{`?yGNu zu-s?KtUFk`-Y@i_rAL;w5Cu_I9ExXLRyn}XyQt7_8&C8}At%GnY*fgqg3?qmu7@>f zHsr@f<=U?7@Lb$03$y9Kv=J0qF*V$_-A&4gDP?7Ykt{2PS!aDT-ohP^UD4V=PIzV8 zu7nSG&bYG8x}N2cw(&kU#X&BFZ4^RkD7&rWg1b|Dk!sXC#C+I~8Vd&dmDTW@@GFUW^?E zAcY?%x;O~D zxDj89eYgG>EWz{7SA}b5AR>P^mZ6QI13$;llx;%mtwq&=O$u$OHW1W-^ghhRIe*X< z+jSqb<#*=>EG^JiUxEz9`8l#xg*9ha#{gY9slScTTC69vy5im}E2Y0EiNKU&uCPdz zj|$zXDTVGs{taPcU0$tvZCpaN!~X%OE4eqqBEuUy`{%rUjh>Bf)^WIvpt!z*xw-gx MYqUc<{@N%10@w2>g8%>k literal 0 HcmV?d00001 diff --git a/client/collectors/collectd.py b/client/collectors/collectd.py index 1cbe3b8..143983e 100644 --- a/client/collectors/collectd.py +++ b/client/collectors/collectd.py @@ -3,8 +3,8 @@ from utils.logging import log from utils.misc import run_cmd -COLLECTD_CONFIG = '/tmp/.collectd.conf' -COLLECTD_PIDFILE = '/tmp/.collectd.pid' +COLLECTD_CONFIG = '/raid/.collectd.conf' +COLLECTD_PIDFILE = '/raid/.collectd.pid' class CollectdCollector(object): diff --git a/client/perffarm-client.py b/client/perffarm-client.py index a0e4c7d..affe52a 100644 --- a/client/perffarm-client.py +++ b/client/perffarm-client.py @@ -19,8 +19,10 @@ from settings_local import * from settings import * -API_URL = 'http://127.0.0.1:8000/' -MACHINE_SECRET = '610f79063e62e6ad09460ac2c4e66da0386dc89b' +# API_URL = 'http://127.0.0.1:8000/' +API_URL = 'http://127.0.0.1:8000/upload/' +#MACHINE_SECRET = '610f79063e62e6ad09460ac2c4e66da0386dc89b' +MACHINE_SECRET = 'e984c3017cd1a0dff0ef9f0c394a5c285e421411' if __name__ == '__main__': with FileLock('.lock') as lock: @@ -34,8 +36,9 @@ ''' # clone repository and build the sources + print(0000000000000000000000000) repository = GitRepository(url=GIT_URL, path=REPOSITORY_PATH) - print(repository.current_branch()) + print(repository.current_branch())#we are in django-...,but not postgre repo #if GIT_CLONE: # repository.clone_or_update() @@ -70,8 +73,8 @@ PGBENCH_CONFIG['results_dir'] = OUTPUT_DIR runner.register_config('pgbench-basic', 'pgbench', - repository.current_branch(), - repository.current_commit(), + 'master', + 'akfhdfwiowhqgjog', dbname=DATABASE_NAME, bin_path=('%s/bin' % (BUILD_PATH,)), postgres_config=POSTGRES_CONFIG, diff --git a/client/settings.py b/client/settings.py index 0a4f31f..cafad66 100644 --- a/client/settings.py +++ b/client/settings.py @@ -2,11 +2,13 @@ import sys # global configuration -GIT_URL = 'https://github.com/postgres/postgres.git' -REPOSITORY_PATH = '/tmp/git-postgres' -BUILD_PATH = '/Users/chenzhang/anaconda3' +GIT_URL = 'https://gitee.com/purpleyu/postgres.git' +REPOSITORY_PATH = '/raid/git-postgres' +# REPOSITORY_PATH = '/home/guo/Documents/git-postgres/postgres' +BUILD_PATH = '/usr/lib/postgresql/11' BIN_PATH = os.path.join(BUILD_PATH, 'bin') -DATADIR_PATH = '/tmp/data-postgres' +DATADIR_PATH = '/raid/data-postgres' +# DATADIR_PATH = '/home/guo/Documents/git-postgres/postgres' POSTGRES_CONFIG = { 'shared_buffers': '1GB', @@ -22,9 +24,9 @@ 'checkpoint_completion_target': '0.9', } -DATABASE_NAME = 'postgres' # This name needs to be the same as rest_api settings_local.py database NAME +DATABASE_NAME = 'pgperffarm-db' # This name needs to be the same as rest_api settings_local.py database NAME -OUTPUT_DIR = '/tmp/perf-output' +OUTPUT_DIR = '/raid/perf-output' # configuration for PgBench # runs - number of repetitions (including test for all client counts) diff --git a/client/utils/__pycache__/__init__.cpython-36.pyc b/client/utils/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f6cb89d87852f0f27ff856ab07177da35f8e3495 GIT binary patch literal 151 zcmXr!<>eCLw}@i^g2x~N1{i@12OutH0TL+;!3>&=ek&P@K*9*(my3Qzer~FMdTG9X zKxIirex7qqVsWv4N>*ZCdcJN!esM{9QEIVnaYW@=uEerZW&PO*M`d}dx| aNqoFsLFFwDo80`A(wtN~kmF@2qt*WW?ju^+`L;e3$>NoD`)1c+?l)bW*(<8cJ8l&S+E++2Ik$#hpWBW zp7Gs$v>MOGoPEZGC;S&o`04(}o=pV*f=z>O@ilffwe=vWnkXroLTUe8mPuOI+Wovq zn{;YvCyDc1dtY2U`Rm^=rd*FN(p6Q;SYCgcOm;dTFLTynh@mlP)+3& zrT!3R&DShqYYUdIZCFd$O9!9gK1oZoYVW-a7Oa2G#oPT`r zXAOw8AC-*~nbb}+&kF5EB37}s%3Awr@pUH40zL4wvns;7>2>NLO9UOzv; z^r(u}l^)O%#{D0YZ(++XPfxDOReG{$%9HbJbyXIpd0f{gVi^~U^5HEo4}nDT^d!l% zv`{CF%JLd72Gd8?H9j2?U{SPBP>f(0_vmK@{GQbwZUgY>c3{G35FQIx_xKcofV61(6d67;qm?YSbNnXN>tuj51(j<#)9ZJA??*l08~?_ zQl3pc>0{3_ATuH3k~t*f!AvdrLsT?gVxED#Gxw<3H?WEMn|P^d4Q2=YfFJVqjUC8n z17e;KQuI)Y3{ebX@56ci-kLvQ|NPYr2MHDTkQC9@2_Gh5YyIi?B|k>y%Of<(AHZlE zr$a+`(xfadvxVkQ?;dstnV_ylrXgn4CXMVNZ;y7)x*f752muPw>yG;zjv>fdM-U>0 zu$Girwy-I$ZYg{49>>7vDfx8*s$eb!)_ck6wr^gv#@DC!0NTX!=J|D)J_m}sysA1`guKLsFjU+w zv!&#=rM>qw%X6B3n|tAQeiw(y3H7XE60}EECNzga&?M0HgR|-W4kIZ#lCn!4z-Y&4 zfM+&XYp1MIsD?~qf$yc-MHI72`?4vbWF-upLEJ0KcJ0ZPl4&}1O_b%&u-xpB_7TxW zB5WhNgrsX9o^fnAcNq{wy@vh*(`!l+<^`M>KjK4_H|>4?idgi+FB0NBJwyi57{mSl z!dY8#gdjmPI77|*8oci`16m?)Y~>g&aWTTXv^qVZ3kB~kT_{T*ULZUoknk5CC^A6H z5O2X#M}EC_mV3gq&`LRui$;Ytg9Jq7g_lZtqk6J_xtWHY_kV zi;<>YM%xFbX_q%yVbloONUbDHA%r}ZSz61V;Orz%D0xQ<|D;+x!gY$4XOh$vPDw$< z6^7(|2QBiaWI~v;>4E$Wz5JZaF_}9$Mkt%?HvGXwofanJHRz+#LTE3pz#nl}@OpyW z$8_!Y@iTPMHj#?%obLrt{uZw!VKvDia~vMv#u%bFAjOa$@qJUblkX+M9OxA>B;7TH z_!5p$hsRKX{`x?0?Awro23^ph38VlBH3i;XTMGXp`rr+^;H|m5K%Y;95(5Ns*dElX ztnS9Ftg8PbX3r2DHM4&AE^cZp`kMFzuMNnnw~Gm3FTC;t9NqwZ7vn#o<1Z*Rg_JHB z!uANs=J0lZ7uT{nn{xb3yO<8?Mla%38bx{-MXORYIr*a~`l^ZZzQ>OuQ6^C&e~fi^ zm}H1Wk(Ko6o$Z+5Q>5hphD6=$2|KcaVGsmfa5y|NeV`{PmV6gRJ1SeHda`PAmGxQ( z$R*u}l7vChO`?Z&Gw*vlPSX9W1BHK_BuEBMJvM(`C`}f$1YNoKmo#7Ee}Vb#>o%){ U#~lD4QdadlhHP0!Mz}`ycLtQtfB*mh literal 0 HcmV?d00001 diff --git a/client/utils/__pycache__/git.cpython-36.pyc b/client/utils/__pycache__/git.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..92e85c85748702cdad05b636739011093cc6fca0 GIT binary patch literal 3400 zcmb7H&5zqe6rb@|oNTh&ZnsN;LQN4Wfo_9<10bLU3at=Ypj`xt1eW8OI8Oc5nK86h z_LN=`|3a_uC;7^WJ10)OH%_wIk0KGv^YP}*_|5Nq=AB-zv$OTyPk(I^@+VpQSunl@ zulxZTMi@=Vu<7ZL!rVxV)Et@=X=Y-j_Rvn9p`+(k(n{T-tH*ZIPCLU6C3gsOSnCO4 zExs`~hh0YRlfL^GoKE)pv~Gt*>4$llslHKLVUQ%XbN}G>*WVq$V();bMJ@vI_=`B< zKroX$3UTZ5XTsnXyz(A2oS=w9gVCYM3}!wdLyK9=hTd+37&^>lZJ4)MhiyRbvM%dE z-)5U^3;GV*VdvTQ6FS^r7eLU9b?;8B?(rg*vC75c>ixizaattYOM@(kc*-;7YW1K!WzmFJ+D(HZf{%z&0^c#P_UQY7Bq`gz~o z`|7$^1Zo20BnO~877HGtP~JEfo|=xC!z=6 z{paRjlBawSmHFVC$7+&ipCy5m12zq^DBpuSt4MIUCshzW7=%d-cO8@}PUHYCd!u+< zyS^W1vGRR9PNMA))1lSwG0bi(nL>&T@WXzE09YVVWJ;%S|EW1g^Ptrm;e>||;8KAC zXq)@4fvYd-@kg;#vTxN!E=3oPshx%-+A!%;(Sc6iv}y25b<1yfF2F>h5X7o3o{+cU zSc!{Vc)V8FZ5Sx<3lJ7xV{Gh_Ii*CIbMl*aNR@@Aw_J^^8C5p3eg%*Do-q4ca*zA~ zJzUbMNp%G;0=BWP=xeXZYo5wI>}wN%u5Eo?P^%*q%S)wuF2sJ{5e|qWTx{^p!o~&- zOrSFQhK2z71?)Qsh2!gkp9fBfM-XGjaOpO!c23}-*^a@1`qpsVg26N4xV(fTLfz5@ z6xL}ds#nW`1&Vt?)@bzvCR%{%s%AQ|q~RKiJk@}S9gt^e6=jlu-J9VrOzZ+hJO|AR zE{&AN>`b`CCES5GJZ3hHgs%WuBIv~2v0Qq}bQ-R+vHBEtDFSBlHsAuDj)uZ4FcB~# zz{X_uuYk>rPA%r3Nx{gTlc_T&_sPO=S{OX5UBOi;GUj<}+wa|QP{j`!avH3GZ~>}x2w|AA7oVTBSZ z4qaXQA=(yT0@fwA(bwh>WHT30!V%aO1}ke$#&j9382TjG*OJ0az{#p^f~i2zpKz&D z%39EUoyU-5M3ZGa?Q${{feI%cD9*kBZDqM3&y z^s{F~@GTt;{9O2rvwZ}tD+D`+Yd{2h>4cqOVm#V$u*$_P*n1IPjp5%gSY#qPr(#!` zQwZNWxC2hVT{<+Cqj7A_=rZg>P&XRiRLJv(<}qP?iL;9p2y?W>wq~Ykvld#cYUr-& zsEs)!5Y~=t(8n4FRw!7VU}X|Hht{JnXVz`<W_4^xqUQvbrAT**K0$f#G*S1Wv78 z?-wu(uK){(A8EpV)n8UUE8ew}@rXEErZ_7N9`MT8lbGjtke%{7Sew?Zg;dq16yabL zX9Fxe*yw0pM1H7}YHPU;wiy>nR^26`kPp|Ei)h3lW>#BpF$ipF+nc0{TK=S{%W`Bw)_bVZ$YYZD@+z@nkHrg@yzb}XS*gAl9hk)}`) zJk5XRIzYg>;;F1H?1m1A3*0C3&v^}~4=6&#rS)?cJ|M3{L#!?Zv!@ol1Q}`5JV#x+ zLpL3RE+5C}Kw9qtwYqZLF;1NdHTglmi-lblq}=!Gj_;>AD-#@deg9z@B#V`n@3TDg zeX#{HG@h)TSi7@_G<0Hd6`KJzM=4d0upATUfC!7kNC0;*Tn8T4?YM1tHuQSG*Qnwe zu+&>=nW(rBdB~*%OKO1b$a1ux9hE<|3xF15`0Jo`Rrhr5dISDLM7R-ES3CJ=3RSfJ c&RGK1?uX6wKgMt?QF$(PjV>g#F72BC0+uZ{(*OVf literal 0 HcmV?d00001 diff --git a/client/utils/__pycache__/locking.cpython-36.pyc b/client/utils/__pycache__/locking.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..00660c414375f532a5e544ccddd27089bc894b6d GIT binary patch literal 1015 zcmZ8f&2AGh5VpO$i4$5{O2v8ML=Np9;J^W)O5sO{DpW#9Xb)J++DSIutQXr$Y1CW# zGQ5(noOlIJ%B&CvIbQ*NoX(&S(U6VADJ=q7{lN>4y zJbzo1>Qv|FtH)Vvi)CG^_`+m$txTL5-BdE3LPT6bNRE%-LXDuuut;sTBkQvKJju&KRW4~FU9zz2l8Hr{Kng z`nHMZU^ud%S7gCJ1J{(`c@etE^%ng#S<^MWx#Md{MlUoTTDPQE2cbvx8!*fzRkcgg$hawer!AtZbAYIFse-8_e@Aau}of ziDP^SN!=LPe`D;tlTjZhj=x9Thh4nY$M6Mw zrCdGfBY1LJMI88kl9@?{xtLDJhx?b0pM;Qi#9vtGZV+&cB#59T34fG^R9J$&kkArz zMLhchE66gYy*vv!7iVPNGF4-5`ZX0zdhg&KCgT(PWkPe-_7~TW1%y&7`v}GJHN$CZ)BWC<+V1p z&a1?@pw)VC3^rg!poMI;an@xEnMak4^S%+ahw`-uGFc@-+REU5qcd4A$_OA3MO3HK zZzSkcCE$aO;-?@k^Q6{6tMd|qQl@EMr{~SaF!WBpi7^skHXTuyPAoOWlgE^cqWWzO a7sJ2*Xo3mjUR6@GWpdpw7Wx5Q>auTK7-$Rt literal 0 HcmV?d00001 diff --git a/client/utils/__pycache__/misc.cpython-36.pyc b/client/utils/__pycache__/misc.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..65b997d2553b4c5d472cda171ec2be76a219b1f8 GIT binary patch literal 2025 zcmZ`)TW=gS6t+E=ootgPt)OZPEd~Vbh;}1!5j?a|NT`HF10+E$^U!EA_U_JRZrI)= zyPB;K=@U}L@8Hky1Ll|^`*`1m^)f3ULBe`WQP$2=h94|3*n zz~2LDfkqHPGZJ+@jc7Y&r@a$77_-dHy~xY`$fs7$$$EJZ1>jxbJtfhSI4^wBdrG6e zSQUM74%|7hELO0#Ea(mi*Pi1fvK6w%P2wzT{GHv+Z@%9RX|u8`^Qu&_n%z$`nOHIV zF_1NL1EhaOW5|RGdO|1c1O{Cp6Q}DJq=rEUOl=#tm2v+i<6R*qbU|w>{A=W8U);jJ z9`?;o_XVf>Am8df-B-AR*dqjZ}GBNFL|qv@pCJ^6k$b@U-A&EV-U(BXfQe z!(5Ky{h5(EY`kd^=TcGJBI?~&Qhu?sIllne#AJMYG^oZioy+{W6-bFoNaKB-7SrQ- zZwO(2I}g2vmAdh&vXVu!q+~2I*nk;bWvOYLv@n3y?~acgDEp15^HBHqz4dXK%k|N; zT>o}v#$~aQ#age6NnDJ|+f}K}NJ)KLn>aaGPqI`NW_@bXOt0suP6pMiS&0whG>i8$ zxu@d152gAd8sc1K0liKG+6QswGPQ=;#5&D>KFC_oI&c?^At&V5&4pv=gr1OvYgi4( zP-2{#)U;-`V_ZR>c?++0CZ1q+t+u>>Lb^S*dzlQK9r7L7CXe8BxWt{`P}71ZWuC`{ z;5TEgr~8#E6RGvUMjAg-aaBnbhHm4?;;?a&BLSq0D5s|FrBbbHw!)qQ_M~x5noEGK zfU2@_sO+5@S4(-&xEB1-Z`@dow7OtdEgBItDyz{0lFBqaB~4Na**c+XR;`jAtldj; z@frqt84Ym)z!=brtWVYJ7(c&*=1;pq$X}l&UdNFhdW&xh=PzJts@7^?ZlN2p9VGF> zJFYBX2Sh!s0pQ1E;mrnZP5|N|z0~G`aBI59YC3VS;sR*z8C_u9X>p115BlmSN)|}< z`I_lXf*Kh`$wTr3L6Z9m|B3&I{CLUILu3$~5X^tyRWojbGc86uhC7NvCMGQlZoPtu zsnVqy@UMnEHC&WZ^P)8HRgy>vx5>e1(C7G$#{1!+pcjX5EM@nUseT zhs8rAqSdToJ-&r`gUNiFnY7AetIB#&BO)}{l}yrMii7rNys)AvR;*=0X7S7>uZG@2 z=&-Y*jR$2Tcz$_|6uFy~h$YK$v2Szv?mHT_D>~oZYi}4Qrc^VOx2>&ksR=4QOUi2W ze$zWeBI?IeQ`#s+w))+!#+Szi)<@^JWt?rMiP>mTYL>n{PGn`#Q?J4Vgj6PF74{mx zI~*kx_^LOt76mV^(|GM&8k#or-%+PHL~nxhRWziBcynCZX8~h$jrpJe#91qs*oe2E z1G)~{0JRUrY#C95B(||oyoE@ih?D^$g&|V>Ha<|H7widpL<$h($$#V@|G#|uP_X$& z58?w<(y5aCNZvpzP>8yKvZ1m+HM~;t5QU1%7eMLIJ}q97m0GH|VQ}cEchR*VsnBw^ z7M)4N{!6X*v7&8m5r@%bx`tfrdi5UWTAwm?4Xm5N}*tW!hrdCVY!}d(;^lTWi~j5!}g3G0o(s_H}40uPqn&*&1DTf(!kX H{`G$V8us}c literal 0 HcmV?d00001 diff --git a/rest_api/apps/machines/__pycache__/__init__.cpython-36.pyc b/rest_api/apps/machines/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3ced7f3429104f076de9d3caa764a977c2e44abe GIT binary patch literal 161 zcmXr!<>eCLw}@i^g2x~N1{i@12OutH0TL+;!3>&=ek&P@K*9*(m!Ez{er~FMdTG9X zKxIirex7qqVsWv4N>*ZCdcJN!esM{9QEIVnaYeCLw}`W6U|@I*#Bjg_WH|tFu>g=rVMt-jVaR2SVq|1UVG3r@WPS-0Wzb~2 z#hRFso0;dQ$rQzxl9ia3p0AgjpI1_pnN$QaU?oElGmrukzr6J`@^e%5(@XR911d{0 z^7EW?5{rxVA=-2c@{3E-i&Beqi%Sxdv-N?jlK8}eO#Q@yf@1yL#N>?3ywqZSux)w; WmA5!-a`RJ4b5iXXf#w$jF#`Y@6f~Ux literal 0 HcmV?d00001 diff --git a/rest_api/apps/machines/__pycache__/models.cpython-36.pyc b/rest_api/apps/machines/__pycache__/models.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c38faf95f9e11fc25e1db770d1a067354743cd1f GIT binary patch literal 1832 zcma)6&2Aev5MJ(&_QxyPmL1zkQ6Pr`sZc~Z^jZW~6}vE68v(5Lz(a|(hL+Y|?JDFd zZj4@ve>o36ANfNZ z`VA6rfECV^amI*u3zxfg_PB?$SNPL_2h91w0Uv^o4g`{2H9mMeL`?%i)PyTd1n#-h zi5BS9=`honRv-&~hHP`1T}v^`w7#hnjL2a91;`xY(65k4hcj@vE4?cp7`Whpf9LT4 zMWv-6n`0B^TFkYCj%z}Ym)X3iRfMka1!*>~D^XTAA_EvPRMJN? zjR6jgVRn9Zt{l7wqeuJpV4SrqF8_2?3)lbosW+*nvNxVry*KacNmULCj7kr#vT|I# zoK?CWE2&@VIvZX0kgG*D%X`^urhC(DG|5YejE!q|_TGd-=voP}Md!On9Cq8ZA?U7F z&N>?=683#Um_!KNJTD~jsSt1HSwWW+LeXXu44uByDUG7T{ zyh~U5;9t697xB=z3JDL0fC%{*NQxjvtRxR)M8%!YH>@VTw@4pY(2nLKx%Eiid?asK zxhWBq(8B%OD7Rq~NWTNysM$sC3AAAcb`h_8*8bBC_pxxEz#bOP-UpW-z&;!xf}g@u z1kN)Po-WgDSl_S{-sq3&{GH^{Nts!0*kOvoxd0@_>3E7FXM&3&E3Z|8{B3K6l;>KG zl&m|xHBn#Unl-SPUQogoWWRP1jwV$;l6vVRM!-+HKWnK>v_>A*MXF?h2mp&H6IZ3c z8kew2IL%uuWSR`HSpXfd9yC>{aTcF*KV=c zHrF@4FSlopE{Yi(3{QSJ!VI3RxZr%)A0F9~Q+sp>y;SWI`5Fmd=T9v2$6a0Wu+lc< zJV6G#md>k^$D?XGTdGsbt`2G7{Z@Dc`(T+}R z;$_$C!i9|mkM*Qd^?Z(33n!VL6#0euVr4U`%39?YU5iRu#1JSC{g~jC+M#VI*71Xs Y-RI3j-!1#zD}taV)Tb=MKMmXQzi7j;N&o-= literal 0 HcmV?d00001 diff --git a/rest_api/apps/machines/__pycache__/permissions.cpython-36.pyc b/rest_api/apps/machines/__pycache__/permissions.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2924fcb6aa73eecb3d2f28443eb950e9c4e803f2 GIT binary patch literal 713 zcmZuvJCD;q5Z?7Vxg;cklR%=NuxL<-C`b-+RSH&%cau1=y}q6GMLAsu ze}=!bEfpm#6|)YINHEfT9?kn3@8e#tbNBX>k3T3O-^hW4XrH3OLj*}A%}7pXl#B<;gk#--!YF2sJm4vlcxZwE+Fx~KN6sEiVF7;6q!*;W`U$wU-z4Z zyFTvtElf6rG86Mb2{|dU?e(bB9#vp<9_^b)R!16xk;pQ=iL@_)NY5itMEcW8CDvys znc66|!%jQ#jJ)`--(`df4-jtXidf{bZkjuiPRR{hG4zG&0C@%Di$TLRb7hxW8eiwS z)90_w_`9=#Ea_jCb1@Ikb zz7MrMza|1Ffv`Y;yp@2RKpuop$r7mKkl+MJDpjf?Dy>JmDXU&txlBiXWdy&It5fL&^h<{@?WbbtNL#d^KE(!BKZUrj~%TbcRk z&|ZU!{|m&nC*(3N@(tNTFs(dX=%} zRiVeCHuTsXOGJ%_EDGXi7%~oz#ZFa5~Y1n>88nc-tEZdWWZwKcFHm?8tH?6 z$ov7gNUpBs&tVcou~2zmSaHC!kY~aUDD|@lzF_by$ij~6FdNim6%L-)9(o!hpdr7Uo72#+3i5 zu;cg^6#w3AZ>34t-W;Uu?;mDcY5yAN%iFXU^f%M<+bPdBS;)_W#@)MZXk~t|9kqk) zZQf4uK;i9~NNR0A6gs*U_2l?*o9Kj{fJRpZfj{iU2)YIre+xvW^hi$~k)B4$V}en% zqh`iP9g`hx1kps*;|fH9*1=#zyVyxsu8*JQqFYLlrfO&BiGU-%dY(xy4-jqRH zMvc&EkOi(TbRNbVLW8x!$pW?+f?+Zas--oho7gITsWP2)3?8`&LLn=vO@=4-#@2N1 zV!PjfwHW^h20JQIMru#(Y2X8$YTyF{d;qqC)p~~!mI!QQ$05E8^Mj50c$x*U*$=9A8uz z?vNESJhj;HV)oQ@3~}5nx#c5h%$g2u4RLS>a1h*}_Y81@Np*08MU64(*;$2}V*=rz zZz?;+FPBI9b>+^59kZN0GATI@sQ6gzRl#-ENE=x&-yRvg+Q{xXW5C;cU;d1@e8&n3zW)E%22U}2|i7jR59KAlp^Qc5S%2@YOkcwS3?$vF~@DIUVod*D-aUFH?JA=@_8CGu-R+V(+{p z$+%ToBMH^n{jGVqNR{L$1$mN0=|JYh-UmM{VoK}-9Jqi2^Iei7b`e|qGb8pPjw6<^ zk5PPrVgd1yEFyuy{Rz(j+c70Qho2M~MGgi)*7H-HM8+vlibj$jsC*uFfyU+My(i^8 zSHO&$XbNI!j-F1*eSp0+bjf~j-W&i;Q4|+W0BG)Pu2Fdok)?BPDOP|rxb|X~4%mf@ zjN!_z16a;b@cbsMh~v4Lc7RS}2fGSlFO1>2;R#s9A24km#yU_EchOPl%|*rM46ObQ z-+(sRsqSIht3BnyPNabrTlcV^W`)T0X6s!oHFp{68l!jbr`IX}e=ApIbh; G-1-j*q{PVp literal 0 HcmV?d00001 diff --git a/rest_api/apps/machines/__pycache__/urls.cpython-36.pyc b/rest_api/apps/machines/__pycache__/urls.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5231aa9b010e037ebfaa15b2e0c1e3d01a495554 GIT binary patch literal 531 zcmZ8eyKWmX5G3!drwzf#Kd6wdNRuK662w)21VIeDU}1w1SErN7{b4UwO7(l%_&}hT;+h#QxQRr>1CMlU z5|JG0Sf?fv8E25}naCmE7Ak>kJJ?h2fu+QTDplFf_@v~dj8uM7B2@sV&heh_ql$}( z8eFmY@Gp6@dF1oDS?OMZk9()*+)plHEqmR4vwa7Sg!G|?NA!h}t4-Yi{ur6v;+fF- z;JZY)Yor06OI;JeCw}{7KK18nE1SwLSGHL%X*#-yJY7s6UOB+-ZtdvWqjmR7cd$d3 zgpMpgcqN}5bzeBBYNSA7`uUjShEiQYCuY|O?mun(A>=r9_#{~S5n(Gk8qwfy=FWme zfTvI8#u_NA-j-i?-NrT_wL~nB*%z(FuA;09?BwdcJfxOwUCOq_^7$3Y;IM3WzIbb_ Y>NUKhFK0L=Dv`3Cs9dR(BZ`u2#ullNl;dnwvbEe961&_5 zkeP)ZEbs(hnf!y?a>!qrYfkzLt{n39EFeG@s{+>a&d&7COn=?|_3+Djy|U8$>aYK* z8peN&gLrj}=!^ll|~>Ud6C@Cs?sE9x;jDW$IG>b{ed(~4I~ zt6nv&d9}3e)zgO8NSj_WZFw!NQ%IK5w%6AEVzQjBcq_VJN>D~OsU{zN8$zU~Ji$9v!-YtyOSpy>tUXMFyw=wha zq~P7bOp~=R)0*nu#mEwCW2DV1@hABDQ&v7Oy322YfYG&7=~)o=qCQuJtt1L$*H%l@ zkpnKGAc@YnP)$9zFtGYUa`Ay)*HjIfm@9TmsygH%jiihQeW}WV_Zb&lNaena_$$dX zsfuazI>KZl7-c=)&!RBMpslJ{YI*`F$t=i55?d_o$h}v6F80Je57=Hmd4oZBpUWY3 z;OLhGe~BHa>(Fs_(W$4wDffqgl&=PYg=GBfXQA^DO@0l*4bNnTXK_1rj!mz?i(ZMl zaXGHwt;$TV#w=$4WO#MvumYY9R%9hSo6H5QWz}9l<_B1Kz%ymZerRHG`q9%y+eVY? z5SbC1u{Abg>=+lAd11yyW=%}2X4A(f~Ra|Pt4ev80XH| zk)LG+=48dV#0nSIfsr9@CPrML2)QuN3u7m)jtgtXc`>WSb$nAAm*Pg&%v$5(#ANQo zikDbnkKgc@4%OFaEqlDk?nxX-y-nJmfO$qOxWIeAoJn_K> z$Nq63(zC)SJHGc7g(3^G;1Hdr2qMXS{yOAC%>d>W2*k}3AY!VT_jrnZ#1*Wq3LvOJ zidE`2rlIIdjk~g=zmOi^G z^}sHmk?w6lu_!2##WfNXKdNvX37HA9FxOxE_VDnz|Lgk?{N24ne`|aD$@9alN8dkD zW!W2uY&3!a%IkNR^|Ly3`9~FNuznowDDk;%Ep+xLBr*Z0w?nydMr2 zSLGgm&7u=zpr9nt5idR?H5Wd42{afoI{^J%r@=xF)eY(|Q>slZ^{2L}a-QNF>_~h; zO2r@>q){k7rI(hr=!^TG``i0Zwho^>?$+jcChkB*+$FI|f?R;An6rUTXEsxDAA_ng zr*ZKmsnSlrNKElD#%`lY`oyrVT8`PUT2{q!&2`hY8fMLO%%bVy&oM3hxpvK}nH7w+ zt+Q*FWN}UnyWN&@eV;(~eO2-ObihUl^=m#zDoFAf;bK?S+>u-J62zHm&uf<-5+!me z=nkP;bDQ!B)yR?ba}Gu^(=>T3urVsmski)Clj&1U(T~8RD1@q+Yx_s}yHvGgFgP6z zu?kO^AV9hr|j5#h|2obAgrvOdQ)SxQ?C+G5qdF{Q3}0gFLHrsA)Dw z<%x^nsuEQm&*f#W!fdaKOGF)YufZJTenB;+X)~>BXRDR+_mM>6CrM}Od08ooHEf~d zVYk~9JM{7g65m0nlJB!Y==-{K>6}tFKF@Q?omGuIxOeHReG=L`cXI@vArF%0^E<_! z*y<1Zv#Wr3M*13`x#-Z?0mM@@S%GkE$7}&B$JFDOqeQ{||4{-mj;d)EoZ+&vfQu$5 zK7(bqTm1zh;t;zmFw6^jC590{kSLJQK+MgVd;dqwK1Y)jl(|iU#xA#q7;Mp==}pF& zdUx?oH^=wvPNh6!%h50y1gtYpicZ+$;c2BD+E|)?bX+2)Z8S;vjm;SM8-|*8Zf6$V zamF_7dtt?eylN7DyQ;0ZX6wb_w|o0L-qzvH-tJq?+?FO0@j2G&7M1ht$>El=L1kWb zA?N4h45oaIkd)oRoT`*VcN5$o^SWT8I4nd+2P>-v_?Jr4^rHF~jA={_vu3ZDXLlF& znnSbk{ztpm^ZjVgeS3t(7WSKa@6VVZZ%IN7-m?UabbqCqvt-%;Tk%BZ$wC-=EAOV} z3?%b((V;?t;4Psz3%RkVQNp;OP|>+0%G9Go5cn6#5Ol#2brM7)3!BU#k)nwywe~)( zZQxa3yLBN{S3a247jdyfpRP}9O*rUhB0Acj+y2Zzy5xxmBz{Y(*Dq705(%?(RTOj` z^JnsrkFt_=e*~9fh+Gi5Ya-sK%o}^0|YxKQ42f la(@TUppJY^F)Hcu*)ms9qwb>N50!~36{OvMuwH4q{{zKC%=-WU literal 0 HcmV?d00001 diff --git a/rest_api/apps/machines/migrations/0001_initial.py b/rest_api/apps/machines/migrations/0001_initial.py new file mode 100644 index 0000000..d17ad8c --- /dev/null +++ b/rest_api/apps/machines/migrations/0001_initial.py @@ -0,0 +1,49 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.17 on 2020-02-03 17:22 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Alias', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=32, unique=True, verbose_name='alias name')), + ('is_used', models.BooleanField(default=False, verbose_name='is_used')), + ('add_time', models.DateTimeField(auto_now_add=True)), + ], + ), + migrations.CreateModel( + name='Machine', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('add_time', models.DateTimeField(auto_now_add=True)), + ('alias', models.CharField(blank=True, default='', max_length=100)), + ('machine_secret', models.CharField(blank=True, default='', max_length=32, verbose_name='machine secret')), + ('sn', models.CharField(blank=True, default='', max_length=16)), + ('os_name', models.CharField(blank=True, default='', max_length=100)), + ('os_version', models.CharField(blank=True, default='', max_length=100)), + ('comp_name', models.CharField(blank=True, default='', max_length=100)), + ('comp_version', models.CharField(blank=True, default='', max_length=100)), + ('state', models.CharField(choices=[('A', 'Active'), ('I', 'Inactive')], default='A', max_length=10)), + ('owner_email', models.EmailField(max_length=256, verbose_name='email')), + ('owner_username', models.CharField(blank=True, default='', max_length=100)), + ('owner_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='machines', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'ordering': ('add_time',), + }, + ), + ] diff --git a/rest_api/apps/machines/migrations/0002_auto_20200213_1523.py b/rest_api/apps/machines/migrations/0002_auto_20200213_1523.py new file mode 100644 index 0000000..813015f --- /dev/null +++ b/rest_api/apps/machines/migrations/0002_auto_20200213_1523.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.17 on 2020-02-13 15:23 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('machines', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='machine', + name='machine_secret', + field=models.CharField(blank=True, default='', max_length=100, verbose_name='machine secret'), + ), + ] diff --git a/rest_api/apps/machines/migrations/__init__.py b/rest_api/apps/machines/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/rest_api/apps/machines/migrations/__pycache__/0001_initial.cpython-36.pyc b/rest_api/apps/machines/migrations/__pycache__/0001_initial.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..617499c3914b384719c5d8415785e3e6c9563316 GIT binary patch literal 1711 zcmZuxOLHSN5T2Jk4?mJkoWQcMq>6oDAaRylI8f9YCt*`d7K&s!xC*8ew>*|JGxAE~ z4as%6`iJm4_!qiz@?YRYOJh4wVWvjY{i(av`nsiqMkD(3=dXS}2rcU`>tBzD@^k#; zF%DpXom!dQw{0yusgt>V*T`<_WtDyL@sl^U zWl^hdgVlGy?z_|*S7>$Yzq1p&AD|Y311^omHL&sZbY3%W=zxz{9RkEch-NM#HAEU{ zQG@!-LA`-`6X%;Vd*~z{tj!z~Z~cGc{l^;andmlbz$Uaz^sN;Vz&5;Ra(I7*-CtOJ zutJu85AGlz-a$UPgFH0IK0Het_!vHcM<$2Ih_1mCcnY7I9k%cIeTK+7y*J(%N8`0 zprC3K!7?JQ<4bz2LP-T9DZ8Pn{+5ahE@_;Tj4Dr$^Bt`2O@#AA?r5OxVpovg;*{n| zF;Z3Rpf^)08fd0`CgZ83fSuz59g=BUloJ5~hzo|^_9B&>U&RQv9nsXD)ghxPNadfB z!HDHlRm_UYngdSbnw5)`Cm89#`RjXOj}H8*w>Nkp&W`?5?VI2L*eJ;)x1Qa$=NuROaXpMw|_(yj@h) z_*G6tOf$mLxrJv$Rg8@L)@hVUHA^F8P8i~YQfHuo#U>>(5b`|614uECx}d2pWSOc{ za20R?SjIeQyM|D)tvT}f#GKt%xZESX++&@nBc5pasg`Zg(!XsL#3ooAt0<1~q)$_d zay^dUOi8Mdmif+P+@OGL@Cz4$e~Il}g)zw!t{k{ff#FM6*6(%Cdfme#74ZpPbcU5bEb#&tH^bk*bVfX*on*>8 zKVBCjp7&BBWv2|bJK?fO1eLqk2ZPHFN<~a2tb+u|&ay_G+sm@EzrX)1UeL8SxfWGi zNOy_c$02Y$x9NGd z@O)S@A1)BMFhwfay}ttY$~$~-$&2V=7!&@Mic&h!@q@3+PWVPwRR%cJojN8Jxc>m& Cyy>L? literal 0 HcmV?d00001 diff --git a/rest_api/apps/machines/migrations/__pycache__/0002_auto_20200213_1523.cpython-36.pyc b/rest_api/apps/machines/migrations/__pycache__/0002_auto_20200213_1523.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4dbb59890943f414cb95a04dbd551ee26c0bc9c5 GIT binary patch literal 716 zcmYjOJ#Q2-5cPiE?sA7xLz8xkWbZ?C2n9tzMT7*^7FfO=->xs-4{R?Yw9w{<@R!_D zrKW=>^8vj1fC%I!lv(!3^r+5 z)rgL3J6|rBD=Io+1e135khf1C0M)!w+H6Fb_`o~hT_w0y0XEv~wM0ALx*L`IE1O<6?69|4KcLf-y}yWh=Ez+5+Z0XT z@}eI5;=_$;`tDLPtqa(*uI|rUCFut literal 0 HcmV?d00001 diff --git a/rest_api/apps/machines/migrations/__pycache__/__init__.cpython-36.pyc b/rest_api/apps/machines/migrations/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0851e011afea7e397c7ba7df5f919b2855a2f1ea GIT binary patch literal 172 zcmXr!<>fjYW)a5#1dl-k3@`#24nSPY0whuxf*CX!{Z=v*frJsnuSorj{M=Oi^wNC& zfXb4L{5eCLw}@i^g2x~N1{i@12OutH0TL+;!3>&=ek&P@K*9*(m#=*ZCdcJN!esM{9QEIVnaYZH=NF|E g>&M4u=4F<|$LkeT-r}&y%}*)KNwou6Qw+om08s}h`~Uy| literal 0 HcmV?d00001 diff --git a/rest_api/apps/records/__pycache__/admin.cpython-36.pyc b/rest_api/apps/records/__pycache__/admin.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a9137f9344010a196ce64a4b4851ca69e3d7cb65 GIT binary patch literal 201 zcmXr!<>eCLw}`W6U|@I*#Bjg_WH|tFu>g=rVMt-jVaR2SVq|1UVG3r@WPS-0Wzb~2 z#hRFso0;dQ$rQzxl9ia3p0AgjpI1_pnN$QaU?oElGmrukzr6G_@^e%5(@XR911d{0 z^7EW?5{rxVA=-2c@{3E-i&Beqi%Sxdv-N?jlK8}eO#Q@yf?^;qIlm~SSRZVeUP0w8 U4x8Nkl+v73J4T@K#X!se0OGSWMgRZ+ literal 0 HcmV?d00001 diff --git a/rest_api/apps/records/__pycache__/exception.cpython-36.pyc b/rest_api/apps/records/__pycache__/exception.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6380ffe6178ef92cf24fc3260e8a8d9b582b0f3e GIT binary patch literal 473 zcmZuty-ve05Vn&5QPqlpj=VsJ)&mOzLX`?)ix59c1}rN!X&|wU?MM`Lqc6iNdF3sb zIJ=_iz)9cv?)-heJD-h4gYohClSBx819p}{GzZu*xEsU~#~Xk^pJ|DCa*rly1vfiO zAesXrUm)P1GU347pfcqt@H2n%AgsG$jy>vDF@9}~GF1=;3unLrU)<`qr~{dt;8^!8r4tI}9}pE;NeWavbvlmL1;p(lwoke-*2H%CNi%a-Uyp8(zjY Hpn`q@`08+s literal 0 HcmV?d00001 diff --git a/rest_api/apps/records/__pycache__/filters.cpython-36.pyc b/rest_api/apps/records/__pycache__/filters.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..050a9564e21b891b5a65e42239bd0a89ae93cdc2 GIT binary patch literal 849 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 literal 0 HcmV?d00001 diff --git a/rest_api/apps/records/__pycache__/urls.cpython-36.pyc b/rest_api/apps/records/__pycache__/urls.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9f674c5f5dfa0a583d6669d1831397e4f7890f16 GIT binary patch literal 847 zcmY+Bzi!(w5XMDGmSxL||1?d9qUh4agRG%ThoUIr3@y+WMN)Lokbo9xSq>!%q}0G# zJ?BCCCVd93o%#xydX(%qmLP)nyN`GJj&FUxe>!}3{n|2&zs8ftf&EAL@p0x0VPpnstEnN%x4kz&zp} zu^zAi=^rr?P10OL1Qk6RNdVM(!B+i^d`p{t^Jk; zgqApE%3TPY$15t88{?8DTx@E;q_PYi!||?8u-F8xx*ldYUZpwR_j*9rwObX8V-mip zz2QF>$ z&o}M4efs6sb_$;$2XkwGVwY65HW-Z#73P9MdF25wa0$Pj%io3=YioLW_#CcyM#H4y z;rC6s;`y9mDZ_SVLBVC2z>ES};`lafriF_%#6=+?YHmE#Eoa3>x$iShDn>sbC@jxl R8KD6hm<~F9d?(fk`VY+X05Jdn literal 0 HcmV?d00001 diff --git a/rest_api/apps/records/__pycache__/views.cpython-36.pyc b/rest_api/apps/records/__pycache__/views.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e2e6d7cf93a6f6b76b0e09735f62bf330a5379c1 GIT binary patch literal 7377 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 literal 0 HcmV?d00001 diff --git a/rest_api/apps/records/migrations/0001_initial.py b/rest_api/apps/records/migrations/0001_initial.py new file mode 100644 index 0000000..05db8e8 --- /dev/null +++ b/rest_api/apps/records/migrations/0001_initial.py @@ -0,0 +1,164 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.17 on 2020-02-03 17:22 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('machines', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='LinuxInfo', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('mounts', models.TextField(default='null', help_text='mounts', verbose_name='mounts')), + ('cpuinfo', models.TextField(default='null', help_text='cpuinfo', verbose_name='cpuinfo')), + ('sysctl', models.TextField(default='null', help_text='sysctl', verbose_name='sysctl')), + ('meminfo', models.TextField(default='null', help_text='meminfo', verbose_name='meminfo')), + ], + options={ + 'verbose_name': 'linux info', + 'verbose_name_plural': 'linux info', + }, + ), + migrations.CreateModel( + name='MetaInfo', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('date', models.DateTimeField(help_text='date', verbose_name='date')), + ('uname', models.TextField(help_text='uname', verbose_name='uname')), + ('benchmark', models.TextField(help_text='benchmark', verbose_name='benchmark')), + ('name', models.TextField(help_text='name', verbose_name='name')), + ], + options={ + 'verbose_name': 'meta info', + 'verbose_name_plural': 'meta info', + }, + ), + migrations.CreateModel( + name='PGInfo', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('checkpoint_timeout', models.CharField(help_text='checkpoint_timeout', max_length=32, verbose_name='checkpoint_timeout')), + ('log_temp_files', models.IntegerField(help_text='log_temp_files', verbose_name='log_temp_files')), + ('work_mem', models.CharField(help_text='work_mem', max_length=32, verbose_name='work_mem')), + ('log_line_prefix', models.CharField(help_text='checkpoint_timeout', max_length=64, verbose_name='checkpoint_timeout')), + ('shared_buffers', models.CharField(help_text='shared_buffers', max_length=32, verbose_name='shared_buffers')), + ('log_autovacuum_min_duration', models.IntegerField(help_text='log_autovacuum_min_duration', verbose_name='log_autovacuum_min_duration')), + ('checkpoint_completion_target', models.DecimalField(decimal_places=4, help_text='checkpoint_completion_target', max_digits=8, verbose_name='checkpoint_completion_target')), + ('maintenance_work_mem', models.CharField(help_text='maintenance_work_mem', max_length=32, verbose_name='maintenance_work_mem')), + ('log_checkpoints', models.IntegerField(choices=[(1, 'on'), (2, 'off')], help_text='log_checkpoints', verbose_name='log_checkpoints')), + ('max_wal_size', models.CharField(help_text='max_wal_size', max_length=32, verbose_name='max_wal_size')), + ('min_wal_size', models.CharField(help_text='min_wal_size', max_length=32, verbose_name='min_wal_size')), + ], + options={ + 'verbose_name': 'pg info', + 'verbose_name_plural': 'pg info', + }, + ), + migrations.CreateModel( + name='TestBranch', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('branch_name', models.CharField(help_text='branch name', max_length=128, unique=True, verbose_name='branch name')), + ('branch_order', models.IntegerField(default=5, help_text='order in all the branch', verbose_name='branch order')), + ('is_show', models.BooleanField(default=True, help_text='branch isshow', verbose_name='branch is shown')), + ('is_accept', models.BooleanField(default=True, help_text='branch accepts new reports', verbose_name='branch accepts new reports')), + ('add_time', models.DateTimeField(default=django.utils.timezone.now, help_text='branch added time', verbose_name='branch added time')), + ], + options={ + 'verbose_name': 'test branch', + 'verbose_name_plural': 'test branch', + }, + ), + migrations.CreateModel( + name='TestCategory', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('cate_name', models.CharField(help_text='cate name', max_length=64, verbose_name='cate name')), + ('cate_sn', models.CharField(help_text='cate sn', max_length=32, unique=True, verbose_name='cate sn')), + ('cate_order', models.IntegerField(help_text='order in the current level', verbose_name='cate order')), + ('add_time', models.DateTimeField(default=django.utils.timezone.now, help_text='category added time', verbose_name='add time')), + ], + options={ + 'verbose_name': 'tests category', + 'verbose_name_plural': 'tests category', + }, + ), + migrations.CreateModel( + name='TestDataSet', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('clients', models.IntegerField(help_text='clients of the test dataset', verbose_name='clients')), + ('scale', models.IntegerField(help_text='scale of the test dataset', verbose_name='scale')), + ('std', models.DecimalField(decimal_places=8, help_text='std of the test dataset', max_digits=18, verbose_name='std')), + ('metric', models.DecimalField(decimal_places=8, help_text='metric of the test dataset', max_digits=18, verbose_name='metric')), + ('median', models.DecimalField(decimal_places=8, help_text='median of the test dataset', max_digits=18, verbose_name='median')), + ('status', models.IntegerField(choices=[(-1, 'none'), (1, 'improved'), (2, 'quo'), (3, 'regressive')], help_text='status of this dataset', verbose_name='status')), + ('percentage', models.DecimalField(decimal_places=4, help_text='percentage compared to previous dataset', max_digits=8, verbose_name='percentage')), + ('add_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='test dataset time')), + ('prev', models.ForeignKey(blank=True, help_text='previous test dataset id', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='prev1', to='records.TestDataSet', verbose_name='previous test dataset id')), + ('test_cate', models.ForeignKey(help_text='test cate id', on_delete=django.db.models.deletion.CASCADE, to='records.TestCategory', verbose_name='test cate id')), + ], + options={ + 'verbose_name': 'test dataset', + 'verbose_name_plural': 'test dataset', + }, + ), + migrations.CreateModel( + name='TestRecord', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('test_desc', models.TextField(help_text='test desc', verbose_name='test desc')), + ('meta_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='meta time')), + ('hash', models.CharField(default='', help_text='record hash', max_length=128, unique=True, verbose_name='record hash')), + ('uuid', models.CharField(default='', help_text='record uuid', max_length=64, unique=True, verbose_name='record uuid')), + ('commit', models.CharField(help_text='record commit', max_length=64, verbose_name='record commit')), + ('add_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='test added time')), + ('branch', models.ForeignKey(help_text='pg branch', on_delete=django.db.models.deletion.CASCADE, to='records.TestBranch', verbose_name='pg branch')), + ('linux_info', models.ForeignKey(help_text='linux info', on_delete=django.db.models.deletion.CASCADE, to='records.LinuxInfo', verbose_name='linux info')), + ('meta_info', models.ForeignKey(help_text='meta info', on_delete=django.db.models.deletion.CASCADE, to='records.MetaInfo', verbose_name='meta info')), + ('pg_info', models.ForeignKey(help_text='pg info', on_delete=django.db.models.deletion.CASCADE, to='records.PGInfo', verbose_name='pg info')), + ('test_machine', models.ForeignKey(help_text='person who add this test item', on_delete=django.db.models.deletion.CASCADE, to='machines.Machine', verbose_name='test owner')), + ], + options={ + 'verbose_name': 'tests', + 'verbose_name_plural': 'tests', + }, + ), + migrations.CreateModel( + name='TestResult', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('latency', models.IntegerField(help_text='latency of the test result', verbose_name='latency')), + ('scale', models.IntegerField(help_text='scale of the test result', verbose_name='scale')), + ('end', models.DecimalField(decimal_places=12, help_text='endtime of the test result', max_digits=32, verbose_name='end')), + ('clients', models.IntegerField(help_text='clients of the test result', verbose_name='clients')), + ('start', models.DecimalField(decimal_places=12, help_text='starttime of the test result', max_digits=32, verbose_name='start')), + ('tps', models.DecimalField(decimal_places=6, default=0, help_text='tps of the test result', max_digits=18, verbose_name='tps')), + ('run', models.IntegerField(help_text='run number', verbose_name='run')), + ('threads', models.IntegerField(help_text='threads of the test result', verbose_name='threads')), + ('mode', models.IntegerField(choices=[(1, 'simple'), (2, 'other'), (-1, 'test')], help_text='test mode', verbose_name='mode')), + ('add_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='test result added time')), + ('test_dataset', models.ForeignKey(help_text='test dataset id', on_delete=django.db.models.deletion.CASCADE, to='records.TestDataSet', verbose_name='test dataset id')), + ], + options={ + 'verbose_name': 'test result', + 'verbose_name_plural': 'test result', + }, + ), + migrations.AddField( + model_name='testdataset', + name='test_record', + field=models.ForeignKey(help_text='test record id', on_delete=django.db.models.deletion.CASCADE, to='records.TestRecord', verbose_name='test record id'), + ), + ] diff --git a/rest_api/apps/records/migrations/0002_auto_20200215_1749.py b/rest_api/apps/records/migrations/0002_auto_20200215_1749.py new file mode 100644 index 0000000..65a4849 --- /dev/null +++ b/rest_api/apps/records/migrations/0002_auto_20200215_1749.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.17 on 2020-02-15 17:49 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('records', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='testrecord', + name='commit', + field=models.CharField(help_text='record commit', max_length=100, verbose_name='record commit'), + ), + ] diff --git a/rest_api/apps/records/migrations/__init__.py b/rest_api/apps/records/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/rest_api/apps/records/migrations/__pycache__/0001_initial.cpython-36.pyc b/rest_api/apps/records/migrations/__pycache__/0001_initial.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6e49cd794abec064ca8693e64fe59e8f829e74a9 GIT binary patch literal 5107 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 PnWxu*2^+Rw#YglXEJDGt literal 0 HcmV?d00001 diff --git a/rest_api/apps/records/migrations/__pycache__/__init__.cpython-36.pyc b/rest_api/apps/records/migrations/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f4d7bb7ad0225dead9d297afd43f2ee57a9b9b03 GIT binary patch literal 171 zcmXr!<>mSmW)a5#1dl-k3@`#24nSPY0whuxf*CX!{Z=v*frJsnuL%8&{M=Oi^wNC& zfXb4L{5F4F81OEb literal 0 HcmV?d00001 diff --git a/rest_api/apps/records/models (copy).py b/rest_api/apps/records/models (copy).py new file mode 100644 index 0000000..cc12103 --- /dev/null +++ b/rest_api/apps/records/models (copy).py @@ -0,0 +1,226 @@ +from datetime import datetime +from django.utils import timezone +from django.db import models + +# Create your models here. +from machines.models import Machine + + +class TestBranch(models.Model): + """ + test branch + """ + branch_name = models.CharField(max_length=128, unique=True,verbose_name="branch name", help_text="branch name") + branch_order = models.IntegerField(default=5,verbose_name="branch order", help_text="order in all the branch") + is_show = models.BooleanField(verbose_name="branch is shown", default=True, help_text="branch isshow") + is_accept = models.BooleanField(verbose_name="branch accepts new reports", default=True, help_text="branch accepts new reports") + add_time = models.DateTimeField(default=timezone.now, verbose_name="branch added time", + help_text="branch added time") + + class Meta: + verbose_name = "test branch" + verbose_name_plural = "test branch" + + def __str__(self): + return self.branch_name + + +class TestCategory(models.Model): + """ + tests category + """ + cate_name = models.CharField(max_length=64, verbose_name="cate name", help_text="cate name") + cate_sn = models.CharField(max_length=32, unique=True, verbose_name="cate sn", help_text="cate sn") + cate_order = models.IntegerField(verbose_name="cate order", help_text="order in the current level") + add_time = models.DateTimeField(default=timezone.now, verbose_name="add time", help_text="category added time") + + class Meta: + verbose_name = "tests category" + verbose_name_plural = "tests category" + + def __str__(self): + return self.cate_name + + +class PGInfo(models.Model): + + checkpoint_timeout = models.CharField(max_length=32, verbose_name="checkpoint_timeout", help_text="checkpoint_timeout") + log_temp_files = models.IntegerField(verbose_name="log_temp_files", help_text="log_temp_files") + work_mem = models.CharField(max_length=32, verbose_name="work_mem", help_text="work_mem") + log_line_prefix = models.CharField(max_length=64,verbose_name="checkpoint_timeout", help_text="checkpoint_timeout") + shared_buffers = models.CharField(max_length=32, verbose_name="shared_buffers", help_text="shared_buffers") + log_autovacuum_min_duration =models.IntegerField(verbose_name="log_autovacuum_min_duration", help_text="log_autovacuum_min_duration") + + + checkpoint_completion_target = models.DecimalField(max_digits=8, decimal_places=4,verbose_name="checkpoint_completion_target", help_text="checkpoint_completion_target") + maintenance_work_mem = models.CharField(max_length=32, verbose_name="maintenance_work_mem", help_text="maintenance_work_mem") + + SWITCH_CHOICE = ( + (1, 'on'), + (2, 'off') + ) + log_checkpoints = models.IntegerField(choices=SWITCH_CHOICE,verbose_name="log_checkpoints", help_text="log_checkpoints") + max_wal_size = models.CharField(max_length=32, verbose_name="max_wal_size", help_text="max_wal_size") + min_wal_size = models.CharField(max_length=32, verbose_name="min_wal_size", help_text="min_wal_size") + + # pg_branch = models.ForeignKey(TestBranch, verbose_name="pg branch", help_text="pg branch") + + class Meta: + verbose_name = "pg info" + verbose_name_plural = "pg info" + + +class MetaInfo(models.Model): + """ + meta info + """ + date = models.DateTimeField(verbose_name="date", help_text="date") + uname = models.TextField(verbose_name="uname", help_text="uname") + benchmark = models.TextField(verbose_name="benchmark", help_text="benchmark") + name = models.TextField(verbose_name="name", help_text="name") + + class Meta: + verbose_name = "meta info" + verbose_name_plural = "meta info" + + +class LinuxInfo(models.Model): + """ + linux info + """ + mounts = models.TextField(verbose_name="mounts", help_text="mounts", default="null") + cpuinfo = models.TextField(verbose_name="cpuinfo", help_text="cpuinfo", default="null") + sysctl = models.TextField(verbose_name="sysctl", help_text="sysctl", default="null") + meminfo = models.TextField(verbose_name="meminfo", help_text="meminfo", default="null") + + class Meta: + verbose_name = "linux info" + verbose_name_plural = "linux info" + + def __str__(self): + return self.mounts + + +class TestRecord(models.Model): + """ + test record + """ + branch = models.ForeignKey(TestBranch, verbose_name="pg branch", help_text="pg branch") + test_machine = models.ForeignKey(Machine, 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") + linux_info = models.ForeignKey(LinuxInfo, verbose_name="linux info", help_text="linux info") + test_desc = models.TextField(verbose_name="test desc", help_text="test desc") + # test_branch_id = models.ForeignKey(TestBranch, verbose_name="test category", help_text="test category") + meta_time = models.DateTimeField(default=timezone.now, verbose_name="meta time") + hash = models.CharField(unique=True, default='', max_length=128, verbose_name="record hash", + help_text="record hash") + uuid = models.CharField(unique=True, default='', max_length=64, verbose_name="record uuid", help_text="record uuid") + commit = models.CharField(max_length=100, verbose_name="record commit", help_text="record commit") + + add_time = models.DateTimeField(default=timezone.now, verbose_name="test added time") + + class Meta: + verbose_name = "tests" + verbose_name_plural = "tests" + + +class TestDataSet(models.Model): + test_record = models.ForeignKey(TestRecord, verbose_name="test record id", help_text="test record id") + test_cate = models.ForeignKey(TestCategory, verbose_name="test cate id", help_text="test cate id") + clients = models.IntegerField(verbose_name="clients", help_text="clients of the test dataset") + scale = models.IntegerField(verbose_name="scale", help_text="scale of the test dataset") + std = models.DecimalField(max_digits=18, decimal_places=8, verbose_name="std", help_text="std of the test dataset") + metric = models.DecimalField(max_digits=18, decimal_places=8, verbose_name="metric", + help_text="metric of the test dataset") + median = models.DecimalField(max_digits=18, decimal_places=8, verbose_name="median", + help_text="median of the test dataset") + + STATUS_CHOICE = ( + (-1, 'none'), + (1, 'improved'), + (2, 'quo'), + (3, 'regressive'), + ) + status = models.IntegerField(choices=STATUS_CHOICE, verbose_name="status", help_text="status of this dataset") + percentage = models.DecimalField(max_digits=8, decimal_places=4, verbose_name="percentage", + help_text="percentage compared to previous dataset") + + prev = models.ForeignKey('self', blank=True, null=True, related_name='prev1', + verbose_name="previous test dataset id", help_text="previous test dataset id") + # prev = models.ForeignKey('self',verbose_name="previous test dataset id", help_text="previous test dataset id") + add_time = models.DateTimeField(default=timezone.now, verbose_name="test dataset time") + + class Meta: + verbose_name = "test dataset" + verbose_name_plural = "test dataset" + + +from django.db.models.signals import pre_save +from django.dispatch import receiver + + +@receiver(pre_save, sender=TestDataSet) +def calc_status(sender, instance, **kwargs): + print('dataset: ' + str(instance.id)) + print('previous: ' + str(instance.prev) + ' will be saved') + + machine_id = instance.test_record.test_machine_id + add_time = instance.test_record.add_time + branch = instance.test_record.branch + prevRecord = TestRecord.objects.order_by('-add_time').filter(test_machine_id=machine_id,branch=branch, + add_time__lt=add_time).first() + if (prevRecord == None): + print("prev record not found") + return + + prevTestDataSet = TestDataSet.objects.filter(test_record_id=prevRecord.id, scale=instance.scale, + clients=instance.clients, test_cate_id=instance.test_cate_id).first() + + if (prevTestDataSet == None): + return + + percentage = (instance.metric - prevTestDataSet.metric) / prevTestDataSet.metric + + status = 0 + if (percentage >= 0.05): + status = 1 + elif (percentage <= -0.05): + status = 3 + else: + status = 2 + + instance.percentage = percentage + instance.status = status + instance.prev_id = prevTestDataSet.id + + return + + +class TestResult(models.Model): + + test_dataset = models.ForeignKey(TestDataSet, verbose_name="test dataset id", help_text="test dataset id") + 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=32, decimal_places=12, verbose_name="end", + help_text="endtime of the test result") + clients = models.IntegerField(verbose_name="clients", help_text="clients of the test result") + start = models.DecimalField(max_digits=32, decimal_places=12, verbose_name="start", + help_text="starttime of the test result") + tps = models.DecimalField(default=0, max_digits=18, decimal_places=6, verbose_name="tps", + help_text="tps of the test result") + run = models.IntegerField(verbose_name="run", help_text="run number") + threads = models.IntegerField(verbose_name="threads", help_text="threads of the test result") + + MODE_CHOICE = ( + (1, 'simple'), + (2, 'other'), + (-1, 'test') + ) + 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") + + class Meta: + verbose_name = "test result" + verbose_name_plural = "test result" diff --git a/rest_api/apps/records/models.py b/rest_api/apps/records/models.py index 64b2e2f..cc12103 100644 --- a/rest_api/apps/records/models.py +++ b/rest_api/apps/records/models.py @@ -117,7 +117,7 @@ class TestRecord(models.Model): hash = models.CharField(unique=True, default='', max_length=128, verbose_name="record hash", help_text="record hash") uuid = models.CharField(unique=True, default='', max_length=64, verbose_name="record uuid", help_text="record uuid") - commit = models.CharField(max_length=64, verbose_name="record commit", help_text="record commit") + commit = models.CharField(max_length=100, verbose_name="record commit", help_text="record commit") add_time = models.DateTimeField(default=timezone.now, verbose_name="test added time") diff --git a/rest_api/apps/records/views (copy).py b/rest_api/apps/records/views (copy).py new file mode 100644 index 0000000..682b565 --- /dev/null +++ b/rest_api/apps/records/views (copy).py @@ -0,0 +1,303 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +import django_filters +import shortuuid + +from django.contrib.auth.hashers import make_password +from rest_framework.pagination import PageNumberPagination + +from records.exception import TestDataUploadError +from records.filters import TestRecordListFilter +from machines.models import Machine +from django.contrib.auth.models import User +from records.models import TestCategory, TestBranch +from rest_api.settings import DB_ENUM +from records.serializers import * + +from rest_framework.decorators import api_view, permission_classes +from rest_framework.response import Response +from rest_framework import mixins, status, permissions + +from rest_framework import viewsets +from .models import TestRecord +import json + + +class StandardResultsSetPagination(PageNumberPagination): + page_size = 20 + page_size_query_param = 'page_size' + max_page_size = 100 + + +class BigResultsSetPagination(PageNumberPagination): + page_size = 1000 + page_size_query_param = 'page_size' + + +class TestBranchListViewSet(viewsets.ModelViewSet): + """ + List test branches + """ + + queryset = TestBranch.objects.all().order_by('branch_order','add_time') + serializer_class = TestBranchSerializer + pagination_class = BigResultsSetPagination + + +class TestCategoryViewSet(viewsets.ModelViewSet): + """ + List test categories + """ + + queryset = TestCategory.objects.all().order_by('cate_name') + serializer_class = TestCategorySerializer + pagination_class = StandardResultsSetPagination + + +class TestRecordListViewSet(mixins.ListModelMixin, viewsets.GenericViewSet): + """ + List test records + """ + + queryset = TestRecord.objects.all().order_by('add_time') + serializer_class = TestRecordListSerializer + pagination_class = StandardResultsSetPagination + filter_backends = (django_filters.rest_framework.DjangoFilterBackend,) + lookup_field = 'uuid' + permission_classes = (permissions.AllowAny, ) + + +class TestRecordDetailViewSet(mixins.RetrieveModelMixin, viewsets.GenericViewSet): + """ + Detail test records + """ + lookup_field = 'uuid' + queryset = TestRecord.objects.all().order_by('add_time') + serializer_class = TestRecordDetailSerializer + permission_classes = (permissions.AllowAny, ) + + +class MachineHistoryRecordViewSet(mixins.RetrieveModelMixin, viewsets.GenericViewSet): + """ + Machine info page + """ + lookup_field = 'sn' + queryset = Machine.objects.all().order_by('add_time') + serializer_class = MachineHistoryRecordSerializer + permission_classes = (permissions.AllowAny, ) + + +class TestRecordListByBranchViewSet(mixins.ListModelMixin, viewsets.GenericViewSet): + """ + List test records (/status) + """ + queryset = TestRecord.objects.order_by('test_machine__alias','-add_time').distinct('test_machine__alias').all() + serializer_class = TestRecordListSerializer + pagination_class = StandardResultsSetPagination + filter_backends = (django_filters.rest_framework.DjangoFilterBackend,) + permission_classes = (permissions.IsAuthenticatedOrReadOnly, ) + + +@api_view(['POST']) +@permission_classes((permissions.AllowAny, )) +def TestRecordCreate(request, format=None): + """ + Receive data from client + """ + data = request.data + + json_data = json.dumps(data[0], ensure_ascii=False) + json_data = json.loads(json_data) + # obj = data[0].pgbench + # jsLoads = json.loads(data[0]) + + from django.db import transaction + + try: + secret = request.META.get("HTTP_AUTHORIZATION") + # ret = Machine.objects.filter(machine_secret=secret, state='A').get() + try: + ret = Machine.objects.filter(machine_secret=secret, state='A').get() + except Exception as e: + Machine.objects.create(alias='test', machine_secret=secret, state='A', + owner_id=User.objects.get(username='gsoccamp'), owner_email='test', + owner_username='gsoccamp').save() + ret = Machine.objects.filter(machine_secret=secret, state='A').get() + # print(ret) + + test_machine = ret.id + if test_machine <= 0: + raise TestDataUploadError("The machine is unavailable.") + + record_hash = make_password(str(json_data), 'pg_perf_farm') + r = TestRecord.objects.filter(hash=record_hash).count() + if r != 0: + raise TestDataUploadError('The same record already exists, please do not submit it twice.') + + with transaction.atomic(): + + if 'linux' not in json_data: + print('linuxInfo not found') + linuxInfo = LinuxInfoSerializer(data={'mounts': 'none', 'cpuinfo': 'none', 'sysctl': 'none', 'meminfo': 'none'}) + + else: + 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'] + branch_str = pg_data['branch'] + + if (branch_str == 'master'): + branch_str = 'HEAD' + + # print("branch", branch_str) + # branch = TestBranch.objects.filter(branch_name__iexact=branch_str, is_accept=True).get() + # ret = Machine.objects.filter(machine_secret=secret, state='A').get() + try: + branch = TestBranch.objects.filter(branch_name__iexact=branch_str, is_accept=True).get() + except Exception as e: + TestBranch.objects.create(branch_name=branch_str, is_accept=True).save() + branch = TestBranch.objects.filter(branch_name__iexact=branch_str, is_accept=True).get() + # print(branch) + + if not branch: + raise TestDataUploadError('The branch name is unavailable.') + + commit = pg_data['commit'] + pg_settings = pg_data['settings'] + + filtered = ['checkpoint_timeout','work_mem','shared_buffers','maintenance_work_mem','max_wal_size','min_wal_size'] + + for item in filtered: + if item.isdigit(): + pg_settings[item] = int(pg_settings[item]) + # pg_settings[item] = pg_settings[item].encode('utf-8') + # pg_settings[item] = filter(str.isdigit, pg_settings[item]) + + pg_settings['log_checkpoints'] = DB_ENUM['general_switch'][pg_settings['log_checkpoints']] + pgInfo = CreatePGInfoSerializer(data=pg_settings) + pgInfoRet = None + + if pgInfo.is_valid(): + pgInfoRet = pgInfo.save() + + else: + msg = pgInfo.errors + raise TestDataUploadError(msg) + + test_record_data = { + 'pg_info': pgInfoRet.id, + 'linux_info': linuxInfoRet.id, + 'meta_info': metaInfoRet.id, + 'test_machine': test_machine, + 'test_desc': 'here is desc', + 'meta_time': metaInfoRet.date, + 'hash': record_hash, + 'commit': commit, + 'branch': branch.id, + 'uuid': shortuuid.uuid() + } + + 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(): + for tag, tag_list in pgbench.items(): + #print(tag) + #print(tag_list) + + # test_cate = TestCategory.objects.get(cate_sn=tag) + try: + test_cate = TestCategory.objects.get(cate_sn=tag) + except Exception as e: + TestCategory.objects.create(cate_name='cate1', cate_sn=tag, cate_order=1).save() + 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.items(): + + for client_num, dataset in dataset_list.items(): + + 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 will calc by receiver + 'status': -1, + 'percentage': 0.0, + } + + testDateSet = CreateTestDateSetSerializer(data=test_dataset_data) + testDateSetRet = None + + if testDateSet.is_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 = CreateTestResultSerializer(data=test_result_data) + + testResultRet = None + + if testResult.is_valid(): + testResultRet = testResult.save() + + else: + print(testResult.errors) + msg = testResult.errors + raise TestDataUploadError(msg) + + + except Exception as e: + msg = 'Upload error: ' + e.__str__() + print(msg) + return Response(msg, status=status.HTTP_406_NOT_ACCEPTABLE) + + print('Upload successful!') + return Response(status=status.HTTP_201_CREATED) diff --git a/rest_api/apps/records/views.py b/rest_api/apps/records/views.py index a50fe7d..c4c6708 100644 --- a/rest_api/apps/records/views.py +++ b/rest_api/apps/records/views.py @@ -10,6 +10,7 @@ from records.exception import TestDataUploadError from records.filters import TestRecordListFilter from machines.models import Machine +from django.contrib.auth.models import User from records.models import TestCategory, TestBranch from rest_api.settings import DB_ENUM from records.serializers import * @@ -105,17 +106,29 @@ def TestRecordCreate(request, format=None): Receive data from client """ data = request.data + print(22222222) json_data = json.dumps(data[0], ensure_ascii=False) json_data = json.loads(json_data) # obj = data[0].pgbench # jsLoads = json.loads(data[0]) + # print(json_data) from django.db import transaction try: secret = request.META.get("HTTP_AUTHORIZATION") - ret = Machine.objects.filter(machine_secret=secret, state='A').get() + print(33333333) + # ret = Machine.objects.filter(machine_secret=secret, state='A').get() + try: + ret = Machine.objects.filter(machine_secret=secret, state='A').get() + except Exception as e: + Machine.objects.create(alias='test', machine_secret=secret, state='A', + owner_id=User.objects.get(username='gsoccamp'), owner_email='test', + owner_username='gsoccamp').save() + ret = Machine.objects.filter(machine_secret=secret, state='A').get() + # print(ret) + test_machine = ret.id if test_machine <= 0: raise TestDataUploadError("The machine is unavailable.") @@ -158,7 +171,15 @@ def TestRecordCreate(request, format=None): if (branch_str == 'master'): branch_str = 'HEAD' - branch = TestBranch.objects.filter(branch_name__iexact=branch_str, is_accept=True).get() + # print("branch", branch_str) + # branch = TestBranch.objects.filter(branch_name__iexact=branch_str, is_accept=True).get() + # ret = Machine.objects.filter(machine_secret=secret, state='A').get() + try: + branch = TestBranch.objects.filter(branch_name__iexact=branch_str, is_accept=True).get() + except Exception as e: + TestBranch.objects.create(branch_name=branch_str, is_accept=True).save() + branch = TestBranch.objects.filter(branch_name__iexact=branch_str, is_accept=True).get() + # print(branch) if not branch: raise TestDataUploadError('The branch name is unavailable.') @@ -218,7 +239,12 @@ def TestRecordCreate(request, format=None): #print(tag) #print(tag_list) - test_cate = TestCategory.objects.get(cate_sn=tag) + # test_cate = TestCategory.objects.get(cate_sn=tag) + try: + test_cate = TestCategory.objects.get(cate_sn=tag) + except Exception as e: + TestCategory.objects.create(cate_name='cate1', cate_sn=tag, cate_order=1).save() + test_cate = TestCategory.objects.get(cate_sn=tag) if not test_cate: continue diff --git a/rest_api/apps/users/__pycache__/__init__.cpython-36.pyc b/rest_api/apps/users/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..499a08d1c5543381db1e801b341f724c9e446b89 GIT binary patch literal 158 zcmXr!<>eCLw}@i^g2x~N1{i@12OutH0TL+;!3>&=ek&P@K*9*(m$!aKer~FMdTG9X zKxIirex7qqVsWv4N>*ZCdcJN!esM{9QEIVnaY2KczG$)edAyF%UBV0Qq4kIsgCw literal 0 HcmV?d00001 diff --git a/rest_api/apps/users/__pycache__/admin.cpython-36.pyc b/rest_api/apps/users/__pycache__/admin.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eaef221b8b9a63a691cf9d2423dca43c58f32047 GIT binary patch literal 199 zcmXr!<>eCLw}{JSU|@I*#Bjg_WH|tFu>g=rVMt-jVaR2SVq|1UVG3r@WPS-0Wzb~2 z#hRFso0;dQ$rQzxl9ia3p0AgjpI1_pnN$QaU?oElGmrukzdZCa@^e%5(@XR911d{0 z^7EW?5{rxVA=-2c@{3E-i&Beqi%Sxdv-N?jlK8}eO#Q@yf@1yB;?$yIeXvz}1(mlr TY;yBcN^?@}7=eZt12F>tmeMn_ literal 0 HcmV?d00001 diff --git a/rest_api/apps/users/__pycache__/auth.cpython-36.pyc b/rest_api/apps/users/__pycache__/auth.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..81dfebded0d5765dbe76a281e3e9f6276eed4ecf GIT binary patch literal 5165 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 Llub6hYcKu}*rN+< literal 0 HcmV?d00001 diff --git a/rest_api/apps/users/__pycache__/filters.cpython-36.pyc b/rest_api/apps/users/__pycache__/filters.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bf0094c393b9a652e26fd36bebccdb01e6988864 GIT binary patch literal 1232 zcmZ`&O>Yx15VgG@+1;jTK?PcbxaZL9p%)GaRjLFMq7hJ#kPo%Cv73+XN3b`l+H3hU z{3TyG@fSETvrf_^YFF}jG`8NGeQ$iUy`Ajsyg5H-g!~~ZpAY#lEb{|`B$DQY_nX|$gCgW1B_D_kWcZ87P?1S%65V+`hFVKTP>YteMA9?TjsF5V>36B6 zUm&zjv%zRwDoB%W%G6)gpwe=HcNU)q$uTVR8iFF6O2V0>+yf3KJ>c-}826dbbk>r!bk zgD%RfQ2lObBOx#q!X`o#m7L|6w}tpQ%W`+3@h5Enhbp(>V5t3@^)r`dFBQf$SfmyHglH@&ew zHo6Va1}%@MPjv^9emBr9B#bb`5Nt~bSq+3}&hNW%86xNa0^WB}p3j=fnx;$tdT?*m zKjlw?JHkWQTd+rKe#Ub@U(CI9gR$c1eiGjg%zb^sP#AJIJo_u;&QQsQ3@r7)QvdeV zBQ(y`IB0UhNX=w!lB{^ur@tNHnDc#lI=L7 z#oR^P?$3$~rQLArCwL_}8D;YV-(T->(X1&SH*yy+o?<`fX5{%aq7lIZMxucthyey(37K$LASnl^Yzum-Odw2elY(dLwdx78!VDYs)?Z$r4wg5Gpu6B?41;gU)&%C zO-o~?(tvdNR73Eh3C{x52PnTS7HK6v#n9SP)_#(w>%Y0NL-2iFiWs_bR(OUB-^4Gm zoyy^rch)H0M$6yE(AnWd3jjVVHqJt5y@Cw{(R^{Fuotf9!a3j(?*pI3r5n@PJ#y6Q LfubFzSI+4X?(aw$ literal 0 HcmV?d00001 diff --git a/rest_api/apps/users/__pycache__/serializers.cpython-36.pyc b/rest_api/apps/users/__pycache__/serializers.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0497da660f6a77b11b4550bd0b7cab29931b7a14 GIT binary patch literal 1516 zcmZuxOK%%D5GJ|Yht{%`s7{*(1)4*Vb`Oybz4QzA}GT&q~up3eHpwbGEm+uy7tl*XhIo*CIU?i znmyS%AxZoRPA3U<{CA@?eD~m!iz2^L+Q2kC7UOANDG(puiYHrxG49rGE5;V;32yD;=YIev9iLkT)Joht}9V07tMt+ z7qynoSEa}c7nSQ+m|^1U7|zyv2yKLYgbqLwxG2l;fGl%ymX)lMww z)cLTe3KyK^s*vU*(MY&~e}{ue{MY2K-pXIHS+Mja|C(GweZKwS4`Rb+CzJjSh593_ zV2N=LuD*&}t>L0PRr+~-_FSuZt*rqaq|>i2Dy2sW)kwxMQzbM#uz0uIz-O7MvMjHX zmPW2FtWRfZYz;=Ruu89!g6Vf$3P@-G0a2B7@d!?NqsC1#$MvGJN$9vy#hLTqjI_OR zAoHw>~yNf6HIBid$d+G9O-_3X3K zyR&7O#2UBhM+lD*JOI}_u{y6NZ&V?ylD}ZNG{xpxM^mBK^QH_jr}{gDZ7HoKWTyiF zjID_PBH95?9o}f~^$)r{M6;&=pLH^W-u0yix#X@ps?Sw*vMsbv|A9UBWhvfeg{mfY zI!uCxE~H<8rSmQBe~{_-u>LI!gY_9vjq_pBcF)!g&>z=z<+}*5+k&EvrkkCWSUG!?*@jp|fkAI0a JZC)08PEXx zJm^A6D4F80i)2h=na~6yL5_%~BHhh65%F%$36CDb3PZ(vF?b6edk>s|Cjx_icErcv zl=0NZbwHPVc7rza->@HT0++OX*^OMdaMaxfyX8kwv9Yt)YP3Q_L-eB+55^HT+Qvnr z5!yi8Y|D(e>zNdXmy(rD+lx$#QfY3o?LOOT)|br_zCFC)JJ#1KFI8`KyUqQW99Eex zo0VJtD^`=K;a*6GAoRHw#@=aDz^X~n1va=`HA$o-{Ixys%VrHMLnwG>)tl1 z|IjgGiqjutgEF=T;>=i9-WL-)8`^>mgDIw?6@Gj^>|Od+Dn54N9fq-H1+vCxcpb#} J0zV@w{0BQWrltS@ literal 0 HcmV?d00001 diff --git a/rest_api/apps/users/__pycache__/views.cpython-36.pyc b/rest_api/apps/users/__pycache__/views.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ea107e3eb4e36bd11ec3de92c026dc4685ed78dc GIT binary patch literal 3940 zcmZ`+OLH5?5#ASo#o|eT50SJiNTMvmHc8o5B`KHUn35PtE(v6jwB<~tvbEe961&{R z!ZQm|WI-qTs{Dl9bIFg$&zNgY{tG^(dv-y9DjKZm?dj=x_1BN#*R`56-}uu%{#(_w z|7kP7BJkfq6AyGvqZ-vCjo{aa^w=OqY!Xw)z8P6@ffN*PMa8&8O0iAsxJ=5iL!7um zDsh!m;~J?cokCQP8>FH5V$_W1$eiL!Q7dkfw&Lw*K3*UTiZ4ft@e)~5yc6Asm&vl? zE73~4N>&wLjXsKRlADUJMIXnv$SuX!qfUIA+>Y;%JG#aS;a#!@^d9--nMND5`HM!I ztPMio4$?NA2kCsS|3$994kHV65k?kSDcra)$tKnJ zweHfdXv$vKkX3J#_Sql}d@p6P5GBXKpsRy;7`TF^X)rhz-IA;f8IJ=Yf@C11{U%_i zFbLc+8!#UDLKc)v7USS;04nvFWnqrAITJ&e%V6!5@Ar3lui4>2a>52%)9pbIMx7`S zsmqg5in?>hEOnE^kooZ8?!yNUL1_IT7>92izx%Mi7X{}^QhMe2{a~PG=IoVm=YWZH zkNF9wF#pE1_YyXp(KO@&uAMJ|gMSU8lySL~i?TJQ13ubw@-u+>4w`rXglR;l8ZoF& zOlF0JBb^jkiP)?hI$`BP3#-()&`FJ&q)sisrXVZ0_m5!XeU_eouiKEe z>muvA(sA85p`!@-s_Xtd@}hjC!wWdDd`jICD6TFF%_jgsVKG<1&w7SVre{2okGb-{r*z2Q)7DkE(w_uLqs@g-Oj zn{a^Gre)Z=r8jjYzaGUufZ~TJhDAWGq>uw7i34$04QqgHoi)NHeCMbMSXy!ovAp6m zkIx=+Z{YXQc_tv=amv{3#F_hcxN=d^IXvqeDrEq(yzWuzrUByD;>&O-zJg>G$wx@q zNIFPvBe{d*E|Pg9w}8lcW-+iZx--P7vegj>S2#`hiEKYr7R|i-8?-=+@Li@QYQuMh zmH{nCF3zAei_b!iPYRwj0mmuJ0wBVukMWK_3z`XS2byRB8Ec_7){peD@h@X+{u48= z-h;$b^f`mT1oyB6i;iT8Gl&6^O3UNNLKaU>@jGKSw3xKe&HspNs}1$@)$32YfqIvR zs=x${Uv;Se0265Mtg#+K$z0aP7S$iY5usaZ{o!@{< zOC!LHZ$Uov4uENJFA&USZ+$jQak-Kh`92c@N@5YRNIDX-)CVVq-MTgY4J@IOm$X!S>T`g<}cfUn2Pm$=68KY1FMOOm3us6sq+k=}KpYFXiUo-{RD1B&s0X z1R1U-Fn?$efc5OpaP&ppHtO)L>W)!0&TsyXuVvS}^fvTNc#vsNpa~lY`qqUuaePa7 zZ&=sJZuJa?KRnQ5kSR~iUHsnfYLzo0UH-W*;@vlzo2JDd!ccGa5#T zM>}BN{I%Ed`^-Oa%04DG{Gn+u(J6%2fI);qo$3(1W(qkWw8kdx``!o(kQ1yiK5DF< zY$@;F`r+XD&fW{Mb?{=R_ba*zL|lCmvVws>rLuq#$ht*oz1lw5k|x9spJMPAm?Vqr zEfh@AEleXsT3F;Ee6vMNSZT(m+0H8RhMx>l9vp6$S?$A5KFmU_c zfJTsDTd29+d$RL%`%O3 Ny=bmf7M+#*{|6U#AesOG literal 0 HcmV?d00001 diff --git a/rest_api/requirements.txt b/rest_api/requirements.txt index d17208a..a88d49e 100644 --- a/rest_api/requirements.txt +++ b/rest_api/requirements.txt @@ -45,3 +45,4 @@ xlrd==1.1.0 xlwt==1.3.0 psycopg2==2.8.2 pygments==2.4.2 +numpy==1.18.1 \ No newline at end of file diff --git a/rest_api/rest_api/__pycache__/__init__.cpython-36.pyc b/rest_api/rest_api/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7704eed17baf336828c1f0de61a7b3b077fc3d58 GIT binary patch literal 156 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 QQVWWl@3N-Ksv@xAAAQ4;+yDRo literal 0 HcmV?d00001 diff --git a/rest_api/rest_api/__pycache__/urls.cpython-36.pyc b/rest_api/rest_api/__pycache__/urls.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f597ba18ffec146287f56d218b6e990a722c5bda GIT binary patch literal 1729 zcma)6O>f&q5Tz)|w5U(pvEvjiu!o?s0Gotc6ex_gsNp!MfFKbZw*~fKh9*Z6WiFT4 zUDdUE^w~e8zo$1|dn(Xh&{Jnu6r#8&5DB8*&dv^@ZJ7C5u*dyDRX9XFv0JF_SEm3tdkEvV0Saiwt^INHgJ3jUm z&yz^{+S|wXOW!^JHDs7fp13dPS)}PL-)piSd*n2ZNtls@nbRH+!1cfkf)a6Ck(UnF+BMw0_*dy%=2Lm!L zjHbXsBZ-bR3NJnzaj7Oa+hhd7jAIr7c^L{u zPDjJVSEuA>xYm&1CShR~PPB0UamG2vc?UU9mGpFam8cX7YvEiOlK!HF6(w1q_zey( z-7^0Hzg8g{^Dq$@RMVrg=m;2Nrs>MHy>uU_~tcjuJxO?U%)uT-dyM#NfaB)c`0goK8l)5 z6wsYZ-I+J0AtUU^Pk3|+r#wTnXLc`^oiSTYj9uM#zguD#shP(==e|Ds{$$Sm(Vd#| z%-jL~Qof_SoVO#X!sx~~rQ)sn9%xElephUM!+1PT;kzzomY?IJR_#?4%_Q1xhCmRQ^y;?gd>9xGouiQ?Co+;$M|rgK zG^gl0x>Lt_91)0?N6TXw%cEP0ulSbaT}h{;cYO0R{WKkoS!vB&Rcvls)`IheXcTK& zyM)qbX*%`{zBSf?V}1c_-yyUXUohTD40VQG;Z&nP?iVO5v3? zvl-&OL7LjOz?4D8dY53dDt~5Mh4j^54-?(R-OIx~3E`_P=K~rgK4u%i1!GJI9 zwYOYCqwS^!uT157N$3^@iYSUetqUEuapB=!Pgdd>*%rK|NEf_xy zlRLaWNPB{XJM(9V+H2s|%JL5zzp&=D7S8cKbRQS)D^$~WUX)+?LD&CaOPe*DkUZb7 T|3!kxE=3d5BueN#dY}FUsi3v9 literal 0 HcmV?d00001 diff --git a/rest_api/rest_api/settings_local.py b/rest_api/rest_api/settings_local.py index a62729a..d612550 100644 --- a/rest_api/rest_api/settings_local.py +++ b/rest_api/rest_api/settings_local.py @@ -7,7 +7,7 @@ 'USER': 'postgres', 'PASSWORD': 'password', 'HOST': '/var/run/postgresql' - #'HOST': '/tmp' + #'HOST': '/raid' } } diff --git a/rest_api/rest_api/settings_local.py.in b/rest_api/rest_api/settings_local.py.in index de91134..41d131e 100644 --- a/rest_api/rest_api/settings_local.py.in +++ b/rest_api/rest_api/settings_local.py.in @@ -7,7 +7,7 @@ DATABASES = { 'USER': 'chenzhang', 'PASSWORD': 'password', #'HOST': '/var/run/postgresql' - 'HOST': '/tmp' + 'HOST': '/raid' } }