summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
l---------automated/bin/post-to-squad1
-rwxr-xr-xautomated/utils/post-to-squad.py123
-rw-r--r--automated/utils/requirements.txt1
3 files changed, 125 insertions, 0 deletions
diff --git a/automated/bin/post-to-squad b/automated/bin/post-to-squad
new file mode 120000
index 0000000..ce78057
--- /dev/null
+++ b/automated/bin/post-to-squad
@@ -0,0 +1 @@
+../utils/post-to-squad.py \ No newline at end of file
diff --git a/automated/utils/post-to-squad.py b/automated/utils/post-to-squad.py
new file mode 100755
index 0000000..07fa454
--- /dev/null
+++ b/automated/utils/post-to-squad.py
@@ -0,0 +1,123 @@
+#!/usr/bin/env python
+
+import argparse
+import datetime
+import decimal
+import json
+import logging
+import os
+import requests
+from collections import OrderedDict
+
+
+def parse_args():
+ parser = argparse.ArgumentParser()
+ parser.add_argument('-r', '--result-file', dest='result_file',
+ required=True, default='./result.json',
+ help='Specify test result file.')
+ parser.add_argument('-a', '--attachment', dest='attachment',
+ action='append', help='Specify attachment file.')
+ parser.add_argument('-t', '--team', dest='team', required=True,
+ help='Team identifier. Defaults to "erp"')
+ parser.add_argument('-p', '--project', dest='project',
+ help='Project identifier. Defaults to the name of the Linux distribution.')
+ parser.add_argument('-b', '--build', dest='build', required=True,
+ help='Build identifier.')
+ parser.add_argument('-e', '--test-env', dest='test_env',
+ help='Environment identifier. Defaults to board name.')
+ parser.add_argument('-u', '--url', dest='url',
+ default='https://qa-reports.linaro.org',
+ help='Dashboard URL. Defaults to https://qa-reports.linaro.org.')
+ parser.add_argument('-v', '--verbose', action='store_true', dest='verbose',
+ default=True, help='Set log level.')
+
+ args = parser.parse_args()
+ return args
+
+
+def squad_result(results):
+ squad_tests = OrderedDict()
+ squad_metrics = OrderedDict()
+ for result in results:
+ for metric in result['metrics']:
+ key = '%s/%s' % (result['name'], metric['test_case_id'])
+ if not metric['measurement']:
+ # Collect pass/fail test results.
+ squad_tests[key] = metric['result']
+ else:
+ # Collect performance test results.
+ try:
+ measurement = decimal.Decimal(metric['measurement'])
+ squad_metrics[key] = float(measurement)
+ except decimal.InvalidOperation:
+ logger.info('Invalid measurement: %s' % metric['measurement'])
+ logger.info('Skipped adding: %s' % metric)
+ assert squad_tests or squad_metrics, 'No valid result found!'
+ return (squad_tests, squad_metrics)
+
+
+def squad_metadata(results):
+ test_plan = list(set(i['test_plan'] for i in results))
+ test_version = list(set(i['version'] for i in results))
+
+ assert len(test_plan) == 1, 'More then one test plan found!'
+ assert len(test_version) == 1, 'More then one test version found!'
+
+ squad_metadata = OrderedDict()
+ test_plan = test_plan[0]
+ test_plan_name = os.path.splitext(os.path.basename(test_plan))[0]
+ squad_metadata['job_id'] = '{}_{}'.format(test_plan_name, datetime.datetime.utcnow().isoformat())
+ squad_metadata['test_plan'] = test_plan
+ squad_metadata['test_version'] = test_version[0]
+ for key, value in results[-1]['environment'].items():
+ if key != 'packages':
+ squad_metadata[key] = value
+ return squad_metadata
+
+
+def main():
+ auth_token = os.environ.get("SQUAD_AUTH_TOKEN")
+ assert auth_token, "SQUAD_AUTH_TOKEN not provided in environment"
+
+ with open(args.result_file, 'r') as f:
+ results = json.load(f)
+ metadata = squad_metadata(results)
+ tests, metrics = squad_result(results)
+
+ files = [('metadata', json.dumps(metadata)),
+ ('tests', json.dumps(tests)),
+ ('metrics', json.dumps(metrics)),
+ ('attachment', open(args.result_file, 'rb'))]
+ if args.attachment is not None:
+ for item in args.attachment:
+ if os.path.exists(item):
+ logger.info('Adding {} to attachment list...'.format(item))
+ files.append(tuple(['attachment', open(item, 'rb')]))
+ else:
+ logger.info('Attachment %s Not found' % args.attachment)
+ logger.info('Skipped uploading %s' % args.attachment)
+ logger.debug('Data to post: %s' % files)
+
+ project = args.project or metadata['linux_distribution']
+ test_env = args.test_env or metadata['board_name']
+ url = '{}/api/submit/{}/{}/{}/{}'.format(args.url, args.team, project, args.build, test_env)
+ logger.info('Posting to {}'.format(url))
+
+ headers = {'Auth-Token': auth_token}
+ r = requests.post(url, headers=headers, files=files)
+ print(r.text)
+
+if __name__ == "__main__":
+ args = parse_args()
+
+ logger = logging.getLogger('post-to-squad')
+ logger.setLevel(logging.INFO)
+ if args.verbose:
+ logger.setLevel(logging.DEBUG)
+ ch = logging.StreamHandler()
+ ch.setLevel(logging.DEBUG)
+ formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
+ ch.setFormatter(formatter)
+ logger.addHandler(ch)
+
+ main()
diff --git a/automated/utils/requirements.txt b/automated/utils/requirements.txt
index 867cb6f..0c8495d 100644
--- a/automated/utils/requirements.txt
+++ b/automated/utils/requirements.txt
@@ -1,2 +1,3 @@
pexpect
pyyaml
+requests