Commit 2ce992a1 authored by Jakub Kicinski's avatar Jakub Kicinski
Browse files

Merge branch 'tools-ynl-add-schema-checking'

Donald Hunter says:

====================
tools: ynl: add schema checking

Add schema checking and yaml linting for the YNL specs.

Patch 1 adds a schema_check make target using a pyynl --validate option
Patch 2 adds a lint make target using yamllint
Patches 3,4 fix issues reported by make -C tools/net/ynl lint schema_check
====================

Link: https://patch.msgid.link/20251127123502.89142-1-donald.hunter@gmail.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents 2c80116b 1adc241f
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -457,7 +457,7 @@ attribute-sets:
        name: labels
        type: binary
      -
        name: labels mask
        name: labels-mask
        type: binary
      -
        name: synproxy
+1 −1
Original line number Diff line number Diff line
@@ -1269,7 +1269,7 @@ attribute-sets:
      -
        name: hist
        type: nest
        multi-attr: True
        multi-attr: true
        nested-attributes: fec-hist
  -
    name: fec
+1 −1
Original line number Diff line number Diff line
@@ -915,7 +915,7 @@ attribute-sets:
        type: string
        doc: Name of set to use
      -
        name: set id
        name: set-id
        type: u32
        byte-order: big-endian
        doc: ID of set to use
+21 −1
Original line number Diff line number Diff line
@@ -12,6 +12,8 @@ endif
libdir  ?= $(prefix)/$(libdir_relative)
includedir ?= $(prefix)/include

SPECDIR=../../../Documentation/netlink/specs

SUBDIRS = lib generated samples ynltool tests

all: $(SUBDIRS) libynl.a
@@ -54,4 +56,22 @@ install: libynl.a lib/*.h
run_tests:
	@$(MAKE) -C tests run_tests

.PHONY: all clean distclean install run_tests $(SUBDIRS)
lint:
	yamllint $(SPECDIR)

schema_check:
	@N=1; \
	for spec in $(SPECDIR)/*.yaml ; do \
		NAME=$$(basename $$spec) ; \
		OUTPUT=$$(./pyynl/cli.py --spec $$spec --validate) ; \
		if [ $$? -eq 0 ] ; then \
			echo "ok $$N $$NAME schema validation" ; \
		else \
			echo "not ok $$N $$NAME schema validation" ; \
			echo "$$OUTPUT" ; \
			echo ; \
		fi ; \
		N=$$((N+1)) ; \
	done

.PHONY: all clean distclean install run_tests lint schema_check $(SUBDIRS)
+16 −5
Original line number Diff line number Diff line
@@ -10,7 +10,7 @@ import sys
import textwrap

sys.path.append(pathlib.Path(__file__).resolve().parent.as_posix())
from lib import YnlFamily, Netlink, NlError
from lib import YnlFamily, Netlink, NlError, SpecFamily

sys_schema_dir='/usr/share/ynl'
relative_schema_dir='../../../../Documentation/netlink'
@@ -127,6 +127,7 @@ def main():
    group.add_argument('--list-msgs', action='store_true')
    group.add_argument('--list-attrs', dest='list_attrs', metavar='OPERATION', type=str,
                       help='List attributes for an operation')
    group.add_argument('--validate', action='store_true')

    parser.add_argument('--duration', dest='duration', type=int,
                        help='when subscribed, watch for DURATION seconds')
@@ -168,15 +169,25 @@ def main():

    if args.family:
        spec = f"{spec_dir()}/{args.family}.yaml"
        if args.schema is None and spec.startswith(sys_schema_dir):
            args.schema = '' # disable schema validation when installed
        if args.process_unknown is None:
            args.process_unknown = True
    else:
        spec = args.spec
    if not os.path.isfile(spec):
        raise Exception(f"Spec file {spec} does not exist")

    if args.validate:
        try:
            SpecFamily(spec, args.schema)
        except Exception as error:
            print(error)
            exit(1)
        return

    if args.family: # set behaviour when using installed specs
        if args.schema is None and spec.startswith(sys_schema_dir):
            args.schema = '' # disable schema validation when installed
        if args.process_unknown is None:
            args.process_unknown = True

    ynl = YnlFamily(spec, args.schema, args.process_unknown,
                    recv_size=args.dbg_small_recv)
    if args.dbg_small_recv: