5271b592af
The schema validator for zuul.artifacts returned via zuul_return did not allow for extra return data (outside of the zuul hierarchy). Correct the validator to allow that, and update the test to exercise it. Change-Id: Ia8d7ed212b03d978bec1a7de1a2647b0c87b7cf9
73 lines
2.1 KiB
Python
73 lines
2.1 KiB
Python
# Copyright 2018-2019 Red Hat, Inc.
|
|
#
|
|
# 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.
|
|
|
|
import voluptuous as v
|
|
import urllib.parse
|
|
|
|
artifact = {
|
|
'name': v.Required(str),
|
|
'url': v.Required(str),
|
|
'metadata': dict,
|
|
}
|
|
|
|
zuul_data = {
|
|
'zuul': {
|
|
'log_url': str,
|
|
'artifacts': [artifact],
|
|
v.Extra: object,
|
|
},
|
|
v.Extra: object,
|
|
}
|
|
|
|
artifact_schema = v.Schema(zuul_data)
|
|
|
|
|
|
def validate_artifact_schema(data):
|
|
try:
|
|
artifact_schema(data)
|
|
except Exception:
|
|
return False
|
|
return True
|
|
|
|
|
|
def get_artifacts_from_result_data(result_data, logger=None):
|
|
ret = []
|
|
if validate_artifact_schema(result_data):
|
|
artifacts = result_data.get('zuul', {}).get(
|
|
'artifacts', [])
|
|
default_url = result_data.get('zuul', {}).get(
|
|
'log_url')
|
|
if default_url:
|
|
if default_url[-1] != '/':
|
|
default_url += '/'
|
|
for artifact in artifacts:
|
|
url = artifact['url']
|
|
if default_url:
|
|
# If the artifact url is relative, it will be combined
|
|
# with the log_url; if it is absolute, it will replace
|
|
# it.
|
|
try:
|
|
url = urllib.parse.urljoin(default_url, url)
|
|
except Exception:
|
|
if logger:
|
|
logger.debug("Error parsing URL:",
|
|
exc_info=1)
|
|
d = artifact.copy()
|
|
d['url'] = url
|
|
ret.append(d)
|
|
else:
|
|
logger.debug("Result data did not pass artifact schema "
|
|
"validation: %s", result_data)
|
|
return ret
|