0ab44e153c
This refactors the the config error handling based on nested context managers that add increasing amounts of information about error locations. In other words, when we start processing a Job object, we will: with ParseContext.errorContext(info about job): do some stuff with ParseContext.errorContext(info about job attr): do some stuff regarding the job attribute with ParseContext.errorContext(next job attr): do stuff with a different attr We store a stack of error contexts on the parse context, and at any point we can access the accumulator for the most recent one with ParseContext.accumulator in order to add a warning or error. If we have an attribute line number, we'll use it, otherwise we'll just use the object-level information. We also collapse the exception hnadlers into a single context manager which catches exceptions and adds them to the accumulator. This lets us decide when to catch an exception and skip to the next phase of processing separately from where we narrow our focus to a new object or attribute. These two actions often happen together, but not always. This should serve to simplify the configloader code and make it easier to have consistent error handling within. Change-Id: I180f9b271acd4b62039003fa8b38900f9863bad8
47 lines
1.3 KiB
Python
47 lines
1.3 KiB
Python
# Copyright 2017 Red Hat, Inc.
|
|
# Copyright 2023 Acme Gating, LLC
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
# Utility methods to promote consistent configuration among drivers.
|
|
|
|
import voluptuous as vs
|
|
|
|
from zuul.configloader import ZUUL_REGEX, make_regex # noqa
|
|
|
|
|
|
def time_to_seconds(s):
|
|
if s.endswith('s'):
|
|
return int(s[:-1])
|
|
if s.endswith('m'):
|
|
return int(s[:-1]) * 60
|
|
if s.endswith('h'):
|
|
return int(s[:-1]) * 60 * 60
|
|
if s.endswith('d'):
|
|
return int(s[:-1]) * 24 * 60 * 60
|
|
if s.endswith('w'):
|
|
return int(s[:-1]) * 7 * 24 * 60 * 60
|
|
raise Exception("Unable to parse time value: %s" % s)
|
|
|
|
|
|
def scalar_or_list(x):
|
|
return vs.Any([x], x)
|
|
|
|
|
|
def to_list(item):
|
|
if not item:
|
|
return []
|
|
if isinstance(item, list):
|
|
return item
|
|
return [item]
|