fune/taskcluster/taskgraph/parameters.py
Wes Kocher e0340aa82f Backed out 2 changesets (bug 1342392) for bustage a=backout
Backed out changeset b0e86286b173 (bug 1342392)
Backed out changeset 01bf0c29331e (bug 1342392)

MozReview-Commit-ID: 71fcOZ2RgEp

--HG--
rename : taskcluster/docker/partial-update-generator/Dockerfile => taskcluster/docker/funsize-update-generator/Dockerfile
rename : taskcluster/docker/partial-update-generator/Makefile => taskcluster/docker/funsize-update-generator/Makefile
rename : taskcluster/docker/partial-update-generator/README => taskcluster/docker/funsize-update-generator/README
rename : taskcluster/docker/partial-update-generator/dep.pubkey => taskcluster/docker/funsize-update-generator/dep.pubkey
rename : taskcluster/docker/partial-update-generator/nightly_sha1.pubkey => taskcluster/docker/funsize-update-generator/nightly_sha1.pubkey
rename : taskcluster/docker/partial-update-generator/nightly_sha384.pubkey => taskcluster/docker/funsize-update-generator/nightly_sha384.pubkey
rename : taskcluster/docker/partial-update-generator/release_sha1.pubkey => taskcluster/docker/funsize-update-generator/release_sha1.pubkey
rename : taskcluster/docker/partial-update-generator/release_sha384.pubkey => taskcluster/docker/funsize-update-generator/release_sha384.pubkey
rename : taskcluster/docker/partial-update-generator/requirements.txt => taskcluster/docker/funsize-update-generator/requirements.txt
rename : taskcluster/docker/partial-update-generator/runme.sh => taskcluster/docker/funsize-update-generator/runme.sh
rename : taskcluster/docker/partial-update-generator/scripts/funsize.py => taskcluster/docker/funsize-update-generator/scripts/funsize.py
rename : taskcluster/docker/partial-update-generator/scripts/mbsdiff_hook.sh => taskcluster/docker/funsize-update-generator/scripts/mbsdiff_hook.sh
2017-09-11 17:35:09 -07:00

102 lines
2.9 KiB
Python

# -*- coding: utf-8 -*-
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
from __future__ import absolute_import, print_function, unicode_literals
import json
import yaml
from mozbuild.util import ReadOnlyDict
# Please keep this list sorted and in sync with taskcluster/docs/parameters.rst
PARAMETER_NAMES = set([
'base_repository',
'build_date',
'filters',
'head_ref',
'head_repository',
'head_rev',
'include_nightly',
'level',
'message',
'morph_templates',
'moz_build_date',
'optimize_target_tasks',
'owner',
'project',
'pushdate',
'pushlog_id',
'target_task_labels',
'target_tasks_method',
])
TRY_ONLY_PARAMETERS = set([
'morph_templates',
'target_task_labels',
])
class Parameters(ReadOnlyDict):
"""An immutable dictionary with nicer KeyError messages on failure"""
def check(self):
names = set(self)
msg = []
missing = PARAMETER_NAMES - TRY_ONLY_PARAMETERS - names
if missing:
msg.append("missing parameters: " + ", ".join(missing))
extra = names - PARAMETER_NAMES
if extra:
msg.append("extra parameters: " + ", ".join(extra))
if msg:
raise Exception("; ".join(msg))
def __getitem__(self, k):
if k not in PARAMETER_NAMES:
raise KeyError("no such parameter {!r}".format(k))
try:
return super(Parameters, self).__getitem__(k)
except KeyError:
raise KeyError("taskgraph parameter {!r} not found".format(k))
def load_parameters_file(filename):
"""
Load parameters from a path, url, decision task-id or project.
Examples:
task-id=fdtgsD5DQUmAQZEaGMvQ4Q
project=mozilla-central
"""
import urllib
from taskgraph.util.taskcluster import get_artifact_url, find_task_id
if not filename:
return Parameters()
try:
# reading parameters from a local parameters.yml file
f = open(filename)
except IOError:
# fetching parameters.yml using task task-id, project or supplied url
task_id = None
if filename.startswith("task-id="):
task_id = filename.split("=")[1]
elif filename.startswith("project="):
index = "gecko.v2.{}.latest.firefox.decision".format(filename.split("=")[1])
task_id = find_task_id(index)
if task_id:
filename = get_artifact_url(task_id, 'public/parameters.yml')
f = urllib.urlopen(filename)
if filename.endswith('.yml'):
return Parameters(**yaml.safe_load(f))
elif filename.endswith('.json'):
return Parameters(**json.load(f))
else:
raise TypeError("Parameters file `{}` is not JSON or YAML".format(filename))