real-probe.py 3.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. from pathlib import Path
  2. import json
  3. import urllib.request
  4. import urllib.error
  5. import urllib.parse
  6. from datetime import datetime, timezone
  7. root = Path(__file__).parent
  8. base = 'http://192.168.110.96:8301/api/cockpit/v1/'
  9. keys = ['ALARM','WARNING','WORK_ORDER','NORMAL','OFFLINE','EMPTY','UNKNOWN','UNASSOCIATED']
  10. rows = []
  11. checks = []
  12. def get(endpoint, params):
  13. url = base + endpoint + '?' + urllib.parse.urlencode(params, doseq=True)
  14. try:
  15. with urllib.request.urlopen(url, timeout=15) as response:
  16. status, raw = response.status, response.read()
  17. except urllib.error.HTTPError as error:
  18. status, raw = error.code, error.read()
  19. envelope = json.loads(raw)
  20. data = envelope.get('data') or {}
  21. row = {'endpoint':endpoint,'params':params,'http':status,'business':envelope.get('code'),
  22. 'category':data.get('category'),'total':data.get('total', (data.get('pagination') or {}).get('total')),
  23. 'mapFilter':data.get('mapFilter'),'distribution':data.get('pointStatusDistribution'),
  24. 'snapshotAt':data.get('snapshotAt'),'monitoringPoints':data.get('monitoringPoints'),
  25. 'unassociatedEquipment':data.get('unassociatedEquipment')}
  26. rows.append(row)
  27. return row
  28. def check(name, passed):
  29. checks.append({'name':name,'passed':bool(passed)})
  30. baselines = {}
  31. for endpoint in ['map-snapshot','monitoring/distribution']:
  32. first = get(endpoint, [('pageSize',2)])
  33. baselines[endpoint] = first
  34. dist = first['distribution'] or []
  35. check(endpoint+'-eight-buckets', [r['status'] for r in dist] == keys and all(isinstance(r['count'],int) and r['count'] >= 0 for r in dist))
  36. check(endpoint+'-total-partition', sum(r['count'] for r in dist)==first['total'])
  37. for raw in ['ALARM,WARNING','UNKNOWN','UNASSOCIATED','UNASSOCIATED,ALARM','EMPTY','NORMAL']:
  38. selected = get(endpoint, [('pageSize',2),('pointStatus',raw)])
  39. check(endpoint+'-'+raw+'-accepted', selected['http']==200 and selected['business']==200)
  40. check(endpoint+'-'+raw+'-global-unchanged', selected['distribution']==dist)
  41. if 'UNASSOCIATED' in raw:
  42. check(endpoint+'-'+raw+'-only-devices', not selected['monitoringPoints'])
  43. csv = get(endpoint,[('pointStatus','WARNING,ALARM')])
  44. repeat = get(endpoint,[('pointStatus','ALARM'),('pointStatus','WARNING')])
  45. check(endpoint+'-repeat-csv-equivalent', csv['mapFilter']==repeat['mapFilter'] and csv['total']==repeat['total'])
  46. check(endpoint+'-effective-status-filter', csv['total'] < first['total'])
  47. for raw in ['BOGUS','ALARM,BOGUS']:
  48. rejected = get(endpoint,[('pointStatus',raw)])
  49. check(endpoint+'-'+raw+'-invalid-400', rejected['http']==400 and rejected['category']=='INVALID_REQUEST')
  50. scoped = get(endpoint,[('district','0'),('pointStatus','UNASSOCIATED')])
  51. check(endpoint+'-district-global-unchanged', scoped['distribution']==dist)
  52. first = baselines['map-snapshot']
  53. second = get('map-snapshot',[('page',2),('pageSize',2),('snapshotAt',first['snapshotAt'])])
  54. check('map-page2-token-retained', second['http']==200 and second['snapshotAt']==first['snapshotAt'] and second['distribution']==first['distribution'])
  55. check('cross-endpoint-global-identical', baselines['map-snapshot']['distribution']==baselines['monitoring/distribution']['distribution'])
  56. check('cross-endpoint-mapFilter-identical', get('map-snapshot',[('pointStatus','UNASSOCIATED,ALARM')])['mapFilter']==get('monitoring/distribution',[('pointStatus','UNASSOCIATED,ALARM')])['mapFilter'])
  57. result={'checkedAt':datetime.now(timezone.utc).isoformat(),'baseUrl':base,'checks':checks,'requests':rows}
  58. (root/'real-probe-new-runtime.json').write_text(json.dumps(result,ensure_ascii=False,indent=2),encoding='utf-8')
  59. for item in checks:
  60. print(('PASS ' if item['passed'] else 'FAIL ')+item['name'])
  61. print(f'{sum(c["passed"] for c in checks)}/{len(checks)} passed')
  62. raise SystemExit(0 if all(c['passed'] for c in checks) else 1)