Thread (31 messages) 31 messages, 6 authors, 2023-01-20

Re: [PATCH net-next v3 2/8] netlink: add schemas for YAML specs

From: Jakub Kicinski <kuba@kernel.org>
Date: 2023-01-20 05:29:24
Also in: linux-doc

On Thu, 19 Jan 2023 08:07:31 -0600 Rob Herring wrote:
On Wed, Jan 18, 2023 at 6:36 PM Jakub Kicinski [off-list ref] wrote:
quoted
Add schemas for Netlink spec files. As described in the docs
we have 4 "protocols" or compatibility levels, and each one
comes with its own schema, but the more general / legacy
schemas are superset of more modern ones: genetlink is
the smallest followed by genetlink-c and genetlink-legacy.
There is no schema for raw netlink, yet, I haven't found the time..

I don't know enough jsonschema to do inheritance or something
but the repetition is not too bad. I hope.  
Generally you put common schemas under '$defs' and the then reference
them with '$ref'.

$defs:
  some-prop-type:
    type: integer
    minimum: 0

properties:
  foo:
    $ref: '#/$defs/some-prop-type'
  bar:
    $ref: '#/$defs/some-prop-type'
Thanks! Is it possible to move the common definitions to a separate
file? I tried to create a file called defs.yaml and change the ref to:

  $ref: "defs.yaml#/$defs/len-or-define"

But:

  File "/usr/lib/python3.11/site-packages/jsonschema/validators.py", line 257, in iter_errors
    for error in errors:
  File "/usr/lib/python3.11/site-packages/jsonschema/_validators.py", line 294, in ref
    scope, resolved = validator.resolver.resolve(ref)
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/jsonschema/validators.py", line 856, in resolve
    return url, self._remote_cache(url)
                ^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/jsonschema/validators.py", line 870, in resolve_from_url
    raise exceptions.RefResolutionError(exc)
jsonschema.exceptions.RefResolutionError: Expecting value: line 1 column 1 (char 0)
If you have objects with common sets of properties, you can do the
same thing, but then you need 'unevaluatedProperties' if you want to
define a base set of properties and add to them. We do that frequently
in DT schemas. Unlike typical inheritance, you can't override the
'base' schema. It's an AND operation.
This is hard to comprehend :o Most of the time I seem to need only the
ability to add a custom "description" to the object, so for example:

$defs:
  len-or-define:
    oneOf:
      -
        type: string
        pattern: ^[0-9A-Za-z_-]*( - 1)?$
      -
        type: integer
        minimum: 0

Then:

       min-len:
         description: Min length for a binary attribute.
         $ref: '#/$defs/len-or-define'

And that seems to work. Should I be using unevaluatedProperties somehow
as well here?
quoted
+          description: |
+            Name used when referring to this space in other definitions, not used outside of YAML.
+          type: string
+        # Strictly speaking 'name-prefix' and 'subset-of' should be mutually exclusive.  
If one is required:

oneOf:
  - required: [ name-prefix ]
  - required: [ subset-of ]

Or if both are optional:

dependencies:
  name-prefix:
    not:
      required: [ subset-of ]
  subset-of:
    not:
      required: [ name-prefix ]
Nice, let me try this.
quoted
+                  min-len:
+                    description: Min length for a binary attribute.
+                    oneOf:
+                      - type: string
+                        pattern: ^[0-9A-Za-z_-]*( - 1)?$
+                      - type: integer  
How can a length be a string?
For readability in C I wanted to allow using a define for the length.
Then the name of the define goes here, and the value can be fetched
from the "definitions" section of the spec.
Anyways, this is something you could pull out into a $defs entry and
reference. It will also work without the oneOf because 'pattern' will
just be ignored for an integer. That's one gotcha with json-schema. If
a keyword doesn't apply to the instance, it is silently ignored. (That
includes unknown keywords such as ones with typos. Fun!). 'oneOf' will
give you pretty crappy error messages, so it's good to avoid when
possible.
Oh, interesting. Changed to:

$defs:
  len-or-define:
    type: [ string, integer ]
    pattern: ^[0-9A-Za-z_-]*( - 1)?$
    minimum: 0
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help