add jsonschema validation for project data
This change adds a tool to perform basic JSONSchema validation of the reference/projects.yaml file. Change-Id: I28ff94af37d7f4de07c1d282bf3c37c77eeea101 Signed-off-by: Doug Hellmann <doug@doughellmann.com> Co-Authored-by: Zane Bitter <zbitter@redhat.com>
This commit is contained in:
parent
b24d958367
commit
96e8407730
47
openstack_governance/_check_schema.py
Normal file
47
openstack_governance/_check_schema.py
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
# 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.
|
||||||
|
|
||||||
|
"""Verify that all data files match the schema."""
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import pkgutil
|
||||||
|
|
||||||
|
import jsonschema
|
||||||
|
|
||||||
|
from openstack_governance import yamltools
|
||||||
|
|
||||||
|
|
||||||
|
_yaml = yamltools.YAML()
|
||||||
|
|
||||||
|
_PROJECTS_SCHEMA = _yaml.load(
|
||||||
|
pkgutil.get_data('openstack_governance',
|
||||||
|
'projects_schema.yaml').decode('utf-8')
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
parser = argparse.ArgumentParser()
|
||||||
|
parser.parse_args()
|
||||||
|
|
||||||
|
errors = []
|
||||||
|
|
||||||
|
with open('reference/projects.yaml', 'r', encoding='utf-8') as f:
|
||||||
|
all_projects = _yaml.load(f.read())
|
||||||
|
|
||||||
|
validator = jsonschema.Draft4Validator(_PROJECTS_SCHEMA)
|
||||||
|
|
||||||
|
errors = False
|
||||||
|
for e in validator.iter_errors(all_projects):
|
||||||
|
errors = True
|
||||||
|
print(e)
|
||||||
|
|
||||||
|
return 1 if errors else 0
|
95
openstack_governance/projects_schema.yaml
Normal file
95
openstack_governance/projects_schema.yaml
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
---
|
||||||
|
$schema: "http://json-schema.org/schema#"
|
||||||
|
$id: "https://opendev.org/openstack/releases/src/branch/master/README.rst"
|
||||||
|
|
||||||
|
|
||||||
|
additionalProperties:
|
||||||
|
# Do not allow any properties not defined here. This lets us catch
|
||||||
|
# typos.
|
||||||
|
additionalProperties: false
|
||||||
|
required:
|
||||||
|
- ptl
|
||||||
|
- deliverables
|
||||||
|
properties:
|
||||||
|
ptl:
|
||||||
|
type: "object"
|
||||||
|
required:
|
||||||
|
- name
|
||||||
|
- email
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
name:
|
||||||
|
type: "string"
|
||||||
|
irc:
|
||||||
|
type: "string"
|
||||||
|
email:
|
||||||
|
type: "string"
|
||||||
|
format: "email"
|
||||||
|
appointed:
|
||||||
|
type: "array"
|
||||||
|
items:
|
||||||
|
type: "string"
|
||||||
|
irc-channel:
|
||||||
|
type: "string"
|
||||||
|
service:
|
||||||
|
type: "string"
|
||||||
|
url:
|
||||||
|
type: "string"
|
||||||
|
liaisons:
|
||||||
|
type: "array"
|
||||||
|
uniqueItems: true
|
||||||
|
items:
|
||||||
|
type: "string"
|
||||||
|
mission:
|
||||||
|
type: "string"
|
||||||
|
deliverables:
|
||||||
|
type: "object"
|
||||||
|
additionalProperties:
|
||||||
|
type: "object"
|
||||||
|
required:
|
||||||
|
- repos
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
repos:
|
||||||
|
type: "array"
|
||||||
|
items:
|
||||||
|
type: "string"
|
||||||
|
pattern: "^[^/]+/[^/]+$"
|
||||||
|
minItems: 1
|
||||||
|
uniqueItems: true
|
||||||
|
tags:
|
||||||
|
type: "array"
|
||||||
|
items:
|
||||||
|
type: "string"
|
||||||
|
release-management:
|
||||||
|
type: "string"
|
||||||
|
enum:
|
||||||
|
- none
|
||||||
|
- deprecated
|
||||||
|
- external
|
||||||
|
tags:
|
||||||
|
type: "array"
|
||||||
|
items:
|
||||||
|
type: "string"
|
||||||
|
extra-atcs:
|
||||||
|
type: "array"
|
||||||
|
items:
|
||||||
|
type: "object"
|
||||||
|
required:
|
||||||
|
- name
|
||||||
|
- email
|
||||||
|
- expires-in
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
name:
|
||||||
|
type: "string"
|
||||||
|
email:
|
||||||
|
type: "string"
|
||||||
|
format: "email"
|
||||||
|
expires-in:
|
||||||
|
type: "string"
|
||||||
|
pattern: >-
|
||||||
|
^(January |February |March |April |May |June |July |August
|
||||||
|
|September |October |November |December )2[0-9]{3}$
|
||||||
|
comment:
|
||||||
|
type: "string"
|
@ -6,4 +6,5 @@ PyYAML>=3.1.0
|
|||||||
six>=1.9.0
|
six>=1.9.0
|
||||||
yamlordereddictloader
|
yamlordereddictloader
|
||||||
mwclient==0.8.1
|
mwclient==0.8.1
|
||||||
ruamel.yaml
|
ruamel.yaml
|
||||||
|
jsonschema>=2.6.0
|
||||||
|
@ -22,4 +22,8 @@ warning-is-error = 1
|
|||||||
warnerrors = True
|
warnerrors = True
|
||||||
|
|
||||||
[flake8]
|
[flake8]
|
||||||
ignore = E501,E226,H405
|
ignore = E501,E226,H405
|
||||||
|
|
||||||
|
[entry_points]
|
||||||
|
console_scripts =
|
||||||
|
osg-check-schema = openstack_governance._check_schema:main
|
||||||
|
1
tox.ini
1
tox.ini
@ -27,6 +27,7 @@ commands =
|
|||||||
basepython = python3
|
basepython = python3
|
||||||
whitelist_externals = bash
|
whitelist_externals = bash
|
||||||
commands =
|
commands =
|
||||||
|
osg-check-schema
|
||||||
bash -c "find {toxinidir} \
|
bash -c "find {toxinidir} \
|
||||||
\( -name .tox -prune \) \
|
\( -name .tox -prune \) \
|
||||||
-o -type f -name '*.yaml' \
|
-o -type f -name '*.yaml' \
|
||||||
|
Loading…
Reference in New Issue
Block a user