#!/usr/bin/env python import os import json import xmlrpclib # Map a TARGET_PRODUCT to LAVA parameters. PRODUCT_MAP = { "pandaboard": { "test_target": "panda", "test_stream": "/anonymous/android-daily/", "image_path": "%s%s" % ( "target/product/", "pandaboard")}, "full_panda": { "test_target": "panda", "test_stream": "/anonymous/android-daily/", "image_path": "%s%s" % ( "target/product/", "panda")}, "beagleboard" : { "test_target": "beaglexm", "test_stream": "/anonymous/android-daily/", "image_path": "%s%s" % ( "target/product/", "beagleboard")}, "snowball" : { "test_target": "snowball_sd", "test_stream": "/anonymous/android-daily/", "image_path": "%s%s" % ( "target/product/", "snowball")}, "iMX53" : { "test_target": "mx53loco", "test_stream": "/anonymous/android-daily/", "image_path": "%s%s" % ( "target/product/", "iMX53")}, "origen" : { "test_target": "origen", "test_stream": "/anonymous/android-daily/", "image_path": "%s%s" % ( "target/product/", "origen")}, } def gen_lava_android_test_actions(tests=[]): actions = [] if len(tests) == 0: return actions inst_action = { "command": "lava_android_test_install", "parameters": { # ensure only unique test names "tests": list(set(tests)) } } actions.append(inst_action) for test in tests: run_action = { "command": "lava_android_test_run", "parameters": { "test_name": test } } actions.append(run_action) return actions def main(): """Script entry point: return some JSON based on calling args. We should be called from Jenkins and expect the following to be defined: $TARGET_PRODUCT $JOB_NAME $BUILD_NUMBER $BUILD_URL""" # Target product name, user defined, e.g. pandaboard target_product = os.environ.get("TARGET_PRODUCT") # Job name, defined by android-build, e.g. linaro-android_leb-panda job_name = os.environ.get("JOB_NAME") frontend_job_name = "~" + job_name.replace("_", "/", 1) # Build number, defined by android-build, e.g. 61 build_number = os.environ.get("BUILD_NUMBER") # Build url, defined by android-build, e.g. # https://android-build.linaro.org/jenkins/job/linaro-android_leb-panda/61/ build_url = os.environ.get("BUILD_URL") # download base URL, this may differ from job URL if we don't host downloads in Jenkins any more download_url = "http://snapshots.linaro.org/android/%s/%s/" % (frontend_job_name, build_number) test_plan = os.environ.get("LAVA_TEST_PLAN") if test_plan == None: test_plan = '0xbench, monkey' test_plans = test_plan.split(',') for index in range(len(test_plans)): test_plans[index] = test_plans[index].strip() if test_plans[index] == "test_android_0xbench": test_plans[index] = "0xbench" # Board-specific parameters if target_product not in PRODUCT_MAP: # We don't know how to test this job, so skip testing. print "Don't know how to test this board. Skip testing." return android_test_actions = gen_lava_android_test_actions(test_plans) actions = [ { "command": "deploy_linaro_android_image", "parameters": { "boot": "%s%s%s" % (download_url, PRODUCT_MAP[target_product]["image_path"], "/boot.tar.bz2"), "system":"%s%s%s" % (download_url, PRODUCT_MAP[target_product]["image_path"], "/system.tar.bz2"), "data":"%s%s%s" % (download_url, PRODUCT_MAP[target_product]["image_path"], "/userdata.tar.bz2") }, "metadata": { "android.name": job_name, "android.build": '%s' % build_number, "android.url": build_url } }, { "command": "boot_linaro_android_image" }, ] actions.extend(android_test_actions) actions.append( { "command": "submit_results_on_host", "parameters": { "server": "http://validation.linaro.org/lava-server/RPC2/", "stream": PRODUCT_MAP[target_product]["test_stream"] } }) config = json.dumps({"job_name": build_url, "image_type": 'android', "device_type": PRODUCT_MAP[target_product]["test_target"], "timeout": 18000, "actions":actions }, indent=4) print config lava_user = os.environ.get("LAVA_USER") if lava_user == None: f = open('/var/run/lava/lava-user') lava_user = f.read().strip() f.close() lava_token = os.environ.get("LAVA_TOKEN") if lava_token == None: f = open('/var/run/lava/lava-token') lava_token = f.read().strip() f.close() lava_server = os.environ.get("LAVA_SERVER") if lava_server == None: lava_server = "validation.linaro.org/lava-server/RPC2/" server = xmlrpclib.ServerProxy("https://%(lava_user)s:%(lava_token)s@%(lava_server)s" % \ dict(lava_user=lava_user, lava_token=lava_token, lava_server=lava_server)) lava_job_id = server.scheduler.submit_job(config) lava_server_root = lava_server.rstrip("/") if lava_server_root.endswith("/RPC2"): lava_server_root = lava_server_root[:-len("/RPC2")] print "LAVA Job Id: %s, URL: http://%s/scheduler/job/%s" % (lava_job_id, lava_server_root, lava_job_id) json.dump({ 'lava_url': "http://" + lava_server_root, 'job_id': lava_job_id, }, open('out/lava-job-info', 'w')) if __name__ == "__main__": main()