]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/common/options/validate-options.py
import quincy beta 17.1.0
[ceph.git] / ceph / src / common / options / validate-options.py
diff --git a/ceph/src/common/options/validate-options.py b/ceph/src/common/options/validate-options.py
new file mode 100755 (executable)
index 0000000..5bc5d4d
--- /dev/null
@@ -0,0 +1,49 @@
+#!/usr/bin/env python3
+
+import argparse
+import fileinput
+import sys
+import yaml
+from typing import Any, Dict
+
+
+class ValidationError(Exception):
+    pass
+
+
+OptionType = Dict[str, Any]
+
+
+def validate_see_also(opt: OptionType, opts: Dict[str, OptionType]) -> None:
+    see_also = opt.get('see_also')
+    if see_also is None:
+        return
+    for ref in see_also:
+        if ref not in opts:
+            msg = f'see_also contains "{ref}". But it is not found.'
+            raise ValidationError(msg)
+
+
+def main() -> None:
+    parser = argparse.ArgumentParser(
+        formatter_class=argparse.ArgumentDefaultsHelpFormatter)
+    parser.add_argument('yamls', nargs='*')
+    opts = parser.parse_args()
+    options = {}
+    for yaml_file in opts.yamls:
+        with open(yaml_file) as f:
+            yml = yaml.load(f, yaml.SafeLoader)
+            options.update({opt['name']: opt for opt in yml['options']})
+    for name, opt in options.items():
+        try:
+            validate_see_also(opt, options)
+        except ValidationError as e:
+            raise Exception(f'failed to validate "{name}": {e}')
+
+
+if __name__ == '__main__':
+    try:
+        main()
+    except Exception as e:
+        print(e, file=sys.stderr)
+        sys.exit(1)