Files
lingniu-vehicle-ingest/reports/mileage-all-20260915-18/http-smoke.py
T

53 lines
3.9 KiB
Python

# coding: utf-8
import subprocess,json,urllib.request,urllib.error,datetime
pid=subprocess.check_output(['systemctl','show','-p','MainPID','lingniu-vehicle-platform'],universal_newlines=True).strip().split('=',1)[1]
env=dict(x.decode().split('=',1) for x in open('/proc/'+pid+'/environ','rb').read().split(b'\0') if b'=' in x)
admin_token=next(x['token'] for x in json.loads(env['AUTH_TOKENS_JSON']) if x.get('role')=='admin')
def call(base,path,token,data=None,method=None):
req=urllib.request.Request(base+path,data=None if data is None else json.dumps(data).encode(),headers={'Authorization':'Bearer '+token,'Content-Type':'application/json'},method=method)
with urllib.request.urlopen(req,timeout=25) as r:return json.load(r)
def admin(path,data=None,method=None):
return call('http://127.0.0.1:20300','/api/v2/open-platform/apps'+path,admin_token,data,method)['data']
expiry=(datetime.datetime.now(datetime.timezone.utc)+datetime.timedelta(days=1)).isoformat()
app_input=dict(name='release-smoke-mileage-all-20260915-18',status='enabled',validFrom='2026-09-08T00:00:00+08:00',validTo=expiry)
app=admin('',app_input,'POST');aid=str(app['id']);key=app['appKey'];out={'temporaryAppId':app['id']}
try:
admin('/'+aid+'/vehicles',{'vehicles':[dict(vin=v,validFrom=app_input['validFrom'],validTo=expiry) for v in ['LB9A32A26R0LS1055','LB9A32A29R0LS1065','LMRKH9AC8R1004109']]},'PUT')
out['single']=[];out['platform']=[]
for plate,vin,day,want in [('粤AGH6240','LB9A32A26R0LS1055','2026-09-08',0.2),('粤AGH6240','LB9A32A26R0LS1055','2026-09-15',0),('粤AGG5043','LB9A32A29R0LS1065','2026-09-17',70.7)]:
body={'date':day,'plateNumbers':[plate],'protocolPriority':['GB32960']}
single=call('https://open.d.lnoneos.com','/api/v1/vehicles/mileage/query',key,body)
item=single['data'][0]
assert item['dailyMileageKm']==want and item['status']=='NORMAL' and not item.get('dataQuality'),single
out['single'].append(single)
path='/api/mileage/daily?vin='+vin+'&dateFrom='+day+'&dateTo='+day+'&protocol=GB32960&limit=10'
platform=call('http://127.0.0.1:20300',path,admin_token)
out['platform'].append(platform)
query={'startDate':'2026-09-08','endDate':'2026-09-17','plateNumbers':['粤AGH6240'],'protocolPriority':['GB32960'],'pageSize':3}
pages=[]
for i in range(5):
page=call('https://open.d.lnoneos.com','/api/v1/vehicles/mileage/range/query',key,query);pages.append(page)
if not page.get('nextCursor'):break
query['cursor']=page['nextCursor']
else:raise AssertionError('pagination did not complete')
rows=[x for page in pages for x in page['data']]
assert len(rows)==10,rows
target=next(x for x in rows if x['date']=='2026-09-15')
assert target['dailyMileageKm']==0 and target['status']=='NORMAL',target
assert next(x for x in rows if x['date']=='2026-09-08')['dailyMileageKm']==0.2
out['rangePages']=pages
out['correctedJT808']=call('https://open.d.lnoneos.com','/api/v1/vehicles/mileage/query',key,{'date':'2026-09-16','plateNumbers':['沪A68019F'],'protocolPriority':['JT808']})
assert out['correctedJT808']['data'][0]['dailyMileageKm']==0.1 and out['correctedJT808']['data'][0]['status']=='NORMAL'
out['today']=call('https://open.d.lnoneos.com','/api/v1/vehicles/mileage/query',key,{'date':'2026-09-18','plateNumbers':['粤AGH6240','粤AGG5043'],'protocolPriority':['GB32960']})
baselines={'LB9A32A26R0LS1055':75453.7,'LB9A32A29R0LS1065':42077}
for item in out['today']['data']:
assert item['status']=='NORMAL' and item['dailyMileageKm']>=0,item
assert abs(item['totalMileageKm']-baselines[item['vin']]-item['dailyMileageKm'])<0.001,item
out['platformDefault']=call('http://127.0.0.1:20300','/api/mileage/daily?vin=LB9A32A26R0LS1055&dateFrom=2026-09-15&dateTo=2026-09-15&deduplicate=1&limit=10',admin_token)
finally:
app_input['status']='disabled';disabled=admin('/'+aid,app_input,'PUT');assert disabled['status']=='disabled'
admin('/'+aid+'/vehicles',{'vehicles':[]},'PUT')
out['temporaryAppDisabled']=True;out['temporaryGrantsRemoved']=True
print(json.dumps(out))