blob: 6ab275b80258ce9e4e4f60541ce24529e73d4e7a [file] [log] [blame]
#!/usr/bin/python
import os
import sys
import json
import xmlrpclib
import urllib2
import re
tests_nano = [
'device-tree',
'gatortests',
'perf',
'pwrmgmt',
]
def obfuscate_credentials(s):
return re.sub(r"([^ ]:).+?(@)", r"\1xxx\2", s)
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:
$HWPACK_BUILD_NUMBER $HWPACK_JOB_NAME HWPACK_FILE_NAME $DEVICE_TYPE
"""
# CI base URL
ci_base_url = "https://ci.linaro.org/jenkins/job/"
# Snapshots base URL
snapshots_url = "http://snapshots.linaro.org"
# Name of the hardware pack project
hwpack_job_name = os.environ.get("HWPACK_JOB_NAME")
# The hardware pack build number
hwpack_build_number = os.environ.get("HWPACK_BUILD_NUMBER")
# Hardware pack file name
hwpack_file_name = os.environ.get("HWPACK_FILE_NAME", "Undefined")
if hwpack_file_name == "Undefined":
sys.exit("Hardware pack is not defined.")
# Device type
device_type = os.environ.get("DEVICE_TYPE", "Undefined")
if device_type == "Undefined":
sys.exit("Device type is not defined.")
# Distribution, architecture and hardware pack type
if hwpack_job_name.startswith('package-and-publish'):
ret_split = hwpack_job_name.split("-", 3)
distribution = 'precise'
architecture = 'armhf'
hwpack_type = ret_split[3]
else:
ret_split = hwpack_job_name.split("-", 2)
(distribution, architecture, hwpack_type) = \
ret_split[0], ret_split[1], ret_split[2]
# Rootfs type, default is nano-lava
rootfs_type = os.getenv("ROOTFS_TYPE", "nano-lava")
# Bundle stream name
bundle_stream_name = os.environ.get("BUNDLE_STREAM_NAME", \
"/private/team/linaro/developers-and-community-builds/")
# LAVA user
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
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 URL
lava_server = os.environ.get("LAVA_SERVER", \
"validation.linaro.org/lava-server/RPC2/")
# LAVA server base URL
lava_server_root = lava_server.rstrip("/")
if lava_server_root.endswith("/RPC2"):
lava_server_root = lava_server_root[:-len("/RPC2")]
# Rootfs last successful build number
ci_url = "%s%s-%s-%s%s" % \
(ci_base_url, \
distribution, \
architecture, \
rootfs_type, \
"/lastSuccessfulBuild/buildNumber")
request = urllib2.Request(ci_url)
try:
response = urllib2.urlopen(request)
except urllib2.URLError, e:
if hasattr(e, 'reason'):
print 'Failed to reach %s.' % ci_url
print 'Reason: ', e.reason
elif hasattr(e, 'code'):
print 'ci.linaro.org could not fulfill the request.'
print 'Error code: ', e.code
sys.exit("Failed to get last successful rootfs build number.")
rootfs_build_number = eval(response.read())
# Rootfs last successful build timestamp
ci_url = "%s%s-%s-%s%s" % \
(ci_base_url, \
distribution, \
architecture, \
rootfs_type, \
"/lastSuccessfulBuild/buildTimestamp?format=yyyyMMdd")
request = urllib2.Request(ci_url)
try:
response = urllib2.urlopen(request)
except urllib2.URLError, e:
if hasattr(e, 'reason'):
print 'Failed to reach %s.' % ci_url
print 'Reason: ', e.reason
elif hasattr(e, 'code'):
print 'ci.linaro.org could not fulfill the request.'
print 'Error code: ', e.code
sys.exit("Failed to get last successful rootfs build timestamp.")
rootfs_build_timestamp = eval(response.read())
rootfs_file_name = "linaro-%s-%s-%s-%s.tar.gz" % \
(distribution, \
rootfs_type, \
rootfs_build_timestamp, \
rootfs_build_number)
# Convert CI URLs to snapshots URLs
if hwpack_job_name.startswith('package-and-publish'):
hwpack_job_name_fixup = hwpack_job_name.replace('.', '_')
hwpack_url = "%s/%s/%s/%s/%s/%s" % \
(snapshots_url, \
"kernel-hwpack",\
hwpack_job_name_fixup, \
hwpack_job_name, \
hwpack_build_number, \
hwpack_file_name)
else:
hwpack_url = "%s/%s/%s/%s/%s/%s" % \
(snapshots_url, \
distribution, \
"hwpacks", \
hwpack_type, \
hwpack_build_number, \
hwpack_file_name)
rootfs_url = "%s/%s/%s/%s/%s/%s" % \
(snapshots_url, \
distribution, \
"images", \
rootfs_type, \
rootfs_build_number, \
rootfs_file_name)
# tests set specific to an image
tests = tests_nano
# vexpress doesn't support PM, so disable pwrmgmt
if device_type in ['vexpress-a9']:
try:
tests.remove('pwrmgmt')
except ValueError:
pass
actions = [{
"command": "deploy_linaro_image",
"parameters": {
"hwpack": "%s" % hwpack_url,
"rootfs": "%s" % rootfs_url
},
"metadata": {
"hwpack.type": "%s" % hwpack_type,
"hwpack.build": "%s" % hwpack_build_number,
"rootfs.type": "%s" % rootfs_type,
"rootfs.build": "%s" % rootfs_build_number,
"distribution": "%s" % distribution
}
},
{
"command": "boot_linaro_image"
}]
for test in tests:
actions.append({
"command": "lava_test_run",
"parameters": {
"test_name": test
}
})
actions.append({
"command": "submit_results",
"parameters": {
"stream": bundle_stream_name,
"server": "%s%s" % ("http://", lava_server)
}
})
config = json.dumps({"timeout": 18000,
"actions": actions,
"job_name": "%s%s/%s/" % (ci_base_url, \
hwpack_job_name, \
hwpack_build_number),
"device_type": device_type,
}, indent=2)
print config
skip_lava = os.environ.get("SKIP_LAVA")
if skip_lava == None:
try:
server_url = \
"https://{lava_user:>s}:{lava_token:>s}@{lava_server:>s}"
server = \
xmlrpclib.ServerProxy(server_url.format(\
lava_user=lava_user, \
lava_token=lava_token, \
lava_server=lava_server))
lava_job_id = server.scheduler.submit_job(config)
except xmlrpclib.ProtocolError, e:
print "Error making a LAVA request:", obfuscate_credentials(str(e))
sys.exit(1)
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('lava-job-info', 'w'))
else:
print "LAVA job submission skipped."
if __name__ == "__main__":
main()