xref: /linux/tools/net/ynl/pyynl/lib/specdir.py (revision 91ec2035134982b98fab0609a9fd8480e8217dc1)
1*10c90f1bSJakub Kicinski# SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
2*10c90f1bSJakub Kicinski
3*10c90f1bSJakub Kicinski"""
4*10c90f1bSJakub KicinskiLocating YNL spec and schema files on disk.
5*10c90f1bSJakub Kicinski
6*10c90f1bSJakub KicinskiResolves the directory holding the YAML specs (preferring an in-tree copy
7*10c90f1bSJakub Kicinskiover the installed system path) and maps family names to spec files.
8*10c90f1bSJakub Kicinski"""
9*10c90f1bSJakub Kicinski
10*10c90f1bSJakub Kicinskiimport os
11*10c90f1bSJakub Kicinski
12*10c90f1bSJakub KicinskiSYS_SCHEMA_DIR='/usr/share/ynl'
13*10c90f1bSJakub KicinskiRELATIVE_SCHEMA_DIR='../../../../../Documentation/netlink'
14*10c90f1bSJakub Kicinski
15*10c90f1bSJakub Kicinski
16*10c90f1bSJakub Kicinskidef schema_dir():
17*10c90f1bSJakub Kicinski    """
18*10c90f1bSJakub Kicinski    Return the effective schema directory, preferring in-tree before
19*10c90f1bSJakub Kicinski    system schema directory.
20*10c90f1bSJakub Kicinski    """
21*10c90f1bSJakub Kicinski    script_dir = os.path.dirname(os.path.abspath(__file__))
22*10c90f1bSJakub Kicinski    schema_dir_ = os.path.abspath(f"{script_dir}/{RELATIVE_SCHEMA_DIR}")
23*10c90f1bSJakub Kicinski    if not os.path.isdir(schema_dir_):
24*10c90f1bSJakub Kicinski        schema_dir_ = SYS_SCHEMA_DIR
25*10c90f1bSJakub Kicinski    if not os.path.isdir(schema_dir_):
26*10c90f1bSJakub Kicinski        raise FileNotFoundError(f"Schema directory {schema_dir_} does not exist")
27*10c90f1bSJakub Kicinski    return schema_dir_
28*10c90f1bSJakub Kicinski
29*10c90f1bSJakub Kicinskidef spec_dir():
30*10c90f1bSJakub Kicinski    """
31*10c90f1bSJakub Kicinski    Return the effective spec directory, relative to the effective
32*10c90f1bSJakub Kicinski    schema directory.
33*10c90f1bSJakub Kicinski    """
34*10c90f1bSJakub Kicinski    spec_dir_ = schema_dir() + '/specs'
35*10c90f1bSJakub Kicinski    if not os.path.isdir(spec_dir_):
36*10c90f1bSJakub Kicinski        raise FileNotFoundError(f"Spec directory {spec_dir_} does not exist")
37*10c90f1bSJakub Kicinski    return spec_dir_
38*10c90f1bSJakub Kicinski
39*10c90f1bSJakub Kicinski
40*10c90f1bSJakub Kicinskidef find_spec(family):
41*10c90f1bSJakub Kicinski    """ Return the path to the YAML spec file for a family by name. """
42*10c90f1bSJakub Kicinski    spec = f"{spec_dir()}/{family}.yaml"
43*10c90f1bSJakub Kicinski    if not os.path.isfile(spec):
44*10c90f1bSJakub Kicinski        raise FileNotFoundError(f"Spec for family '{family}' not found at {spec}")
45*10c90f1bSJakub Kicinski    return spec
46*10c90f1bSJakub Kicinski
47*10c90f1bSJakub Kicinski
48*10c90f1bSJakub Kicinskidef list_families():
49*10c90f1bSJakub Kicinski    """ Return the sorted names of all families with an installed spec. """
50*10c90f1bSJakub Kicinski    return sorted(f.removesuffix('.yaml')
51*10c90f1bSJakub Kicinski                  for f in os.listdir(spec_dir()) if f.endswith('.yaml'))
52