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