Bug 1296842: check parameters; r=jmaher

MozReview-Commit-ID: 1JCpufowNHD
This commit is contained in:
Dustin J. Mitchell
2016-11-07 19:13:40 +00:00
parent 45eb10a983
commit 8d20917cdf
3 changed files with 63 additions and 7 deletions

View File

@@ -217,6 +217,7 @@ class MachCommands(MachCommandBase):
try:
self.setup_logging(quiet=options['quiet'], verbose=options['verbose'])
parameters = taskgraph.parameters.load_parameters_file(options)
parameters.check()
target_tasks_method = parameters.get('target_tasks_method', 'all_tasks')
target_tasks_method = taskgraph.target_tasks.get_method(target_tasks_method)

View File

@@ -10,10 +10,46 @@ 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',
'head_ref',
'head_repository',
'head_rev',
'level',
'message',
'moz_build_date',
'optimize_target_tasks',
'owner',
'project',
'pushdate',
'pushlog_id',
'target_tasks_method',
'triggered_by',
])
class Parameters(ReadOnlyDict):
"""An immutable dictionary with nicer KeyError messages on failure"""
def check(self):
names = set(self)
msg = []
missing = PARAMETER_NAMES - 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:

View File

@@ -6,26 +6,45 @@ from __future__ import absolute_import, print_function, unicode_literals
import unittest
from ..parameters import Parameters, load_parameters_file
from ..parameters import Parameters, load_parameters_file, PARAMETER_NAMES
from mozunit import main, MockedOpen
class TestParameters(unittest.TestCase):
vals = {n: n for n in PARAMETER_NAMES}
def test_Parameters_immutable(self):
p = Parameters(x=10, y=20)
p = Parameters(**self.vals)
def assign():
p['x'] = 20
p['head_ref'] = 20
self.assertRaises(Exception, assign)
def test_Parameters_KeyError(self):
p = Parameters(x=10, y=20)
def test_Parameters_missing_KeyError(self):
p = Parameters(**self.vals)
self.assertRaises(KeyError, lambda: p['z'])
def test_Parameters_invalid_KeyError(self):
"""even if the value is present, if it's not a valid property, raise KeyError"""
p = Parameters(xyz=10, **self.vals)
self.assertRaises(KeyError, lambda: p['xyz'])
def test_Parameters_get(self):
p = Parameters(x=10, y=20)
self.assertEqual(p['x'], 10)
p = Parameters(head_ref=10, level=20)
self.assertEqual(p['head_ref'], 10)
def test_Parameters_check(self):
p = Parameters(**self.vals)
p.check() # should not raise
def test_Parameters_check_missing(self):
p = Parameters()
self.assertRaises(Exception, lambda: p.check())
def test_Parameters_check_extra(self):
p = Parameters(xyz=10, **self.vals)
self.assertRaises(Exception, lambda: p.check())
def test_load_parameters_file_yaml(self):
with MockedOpen({"params.yml": "some: data\n"}):