ansible/test/sanity/code-smell/botmeta.py

78 lines
2.6 KiB
Python
Raw Normal View History

#!/usr/bin/env python
"""Make sure the data in BOTMETA.yml is valid"""
import os.path
import glob
import sys
import yaml
from voluptuous import Any, MultipleInvalid, Required, Schema
from voluptuous.humanize import humanize_error
from ansible.module_utils.six import string_types
list_string_types = list(string_types)
def main():
"""Validate BOTMETA"""
path = '.github/BOTMETA.yml'
with open(path, 'r') as f_path:
botmeta = yaml.safe_load(f_path)
f_path.close()
files_schema = Any(
Schema(*string_types),
Schema({
'ignored': Any(list_string_types, *string_types),
'keywords': Any(list_string_types, *string_types),
'labels': Any(list_string_types, *string_types),
'maintainers': Any(list_string_types, *string_types),
'notified': Any(list_string_types, *string_types),
'support': Any("core", "network", "community"),
})
)
list_dict_file_schema = [{str_type: files_schema}
for str_type in string_types]
schema = Schema({
Required('automerge'): bool,
Required('files'): Any(None, *list_dict_file_schema),
Required('macros'): dict, # Any(*list_macros_schema),
})
# Ensure schema is valid
try:
schema(botmeta)
except MultipleInvalid as ex:
for error in ex.errors:
# No way to get line numbers
print('%s: %s' % (path, humanize_error(botmeta, error)))
# We have two macros to define locations, ensure they haven't been removed
if botmeta['macros']['module_utils'] != 'lib/ansible/module_utils':
print('%s: [macros][module_utils] has been removed' % path)
if botmeta['macros']['modules'] != 'lib/ansible/modules':
print('%s: [macros][modules] has been removed' % path)
# See if all `files:` are valid
for file in botmeta['files']:
file = file.replace('$module_utils', botmeta['macros']['module_utils'])
file = file.replace('$modules', botmeta['macros']['modules'])
if not os.path.exists(file):
# Not a file or directory, though maybe the prefix to one?
# https://github.com/ansible/ansibullbot/pull/1023
if not glob.glob('%s*' % file):
print("%s: Can't find '%s.*' in this branch" % (path, file))
if __name__ == '__main__':
main()
# Possible future work
# * Schema for `macros:` - currently ignored due to team_ansible
# * Ensure that all $teams mention in `files:` exist in `$macros`
# * Validate GitHub names - possibly expensive lookup needed