diff --git a/lib/inventory/distributed-service/api-feature.nix b/lib/inventory/distributed-service/api-feature.nix index 095b674bc..1266bb68a 100644 --- a/lib/inventory/distributed-service/api-feature.nix +++ b/lib/inventory/distributed-service/api-feature.nix @@ -1,7 +1,7 @@ # This module enables itself if # manifest.features.API = true # It converts the roles.interface to a json-schema -{ clanLib }: +{ clanLib, attrName }: let converter = clanLib.jsonschema { includeDefaults = true; @@ -11,38 +11,41 @@ in { options.result.api = lib.mkOption { default = { }; - type = lib.types.submodule ( - lib.optionalAttrs config.manifest.features.API { - options.schema = lib.mkOption { - description = '' - The API schema for configuring the service. + type = lib.types.submodule ({ + options.schema = lib.mkOption { + description = '' + The API schema for configuring the service. - Each 'role..interface' is converted to a json-schema. - This can be used to generate and type check the API relevant objects. - ''; - defaultText = lib.literalExpression '' - { - peer = { $schema" = "http://json-schema.org/draft-07/schema#"; ... } - commuter = { $schema" = "http://json-schema.org/draft-07/schema#"; ... } - distributor = { $schema" = "http://json-schema.org/draft-07/schema#"; ... } - } - ''; - default = lib.mapAttrs (_roleName: v: converter.parseModule v.interface) config.roles; - }; - } - ); + Each 'role..interface' is converted to a json-schema. + This can be used to generate and type check the API relevant objects. + ''; + defaultText = lib.literalExpression '' + { + peer = { $schema" = "http://json-schema.org/draft-07/schema#"; ... } + commuter = { $schema" = "http://json-schema.org/draft-07/schema#"; ... } + distributor = { $schema" = "http://json-schema.org/draft-07/schema#"; ... } + } + ''; + default = lib.mapAttrs (_roleName: v: converter.parseModule v.interface) config.roles; + }; + }); }; - config.result.assertions = lib.optionalAttrs (config.manifest.features.API) ( + config.result.assertions = ( lib.mapAttrs' (roleName: _role: { name = "${roleName}"; value = { + # TODO: make the path to access the schema shorter message = '' `roles.${roleName}.interface` is not JSON serializable. - but 'manifest.features.API' is enabled, which requires all 'roles-interfaces' of this module to be a subset of JSON. + 'clan.services' modules require all 'roles.*.interfaces' to be subset of JSON. - clan.service module '${config.manifest.name} + : clan.service module '${config.manifest.name} + + To see the evaluation problem run + + nix eval .#clanInternals.inventoryClass.distributedServices.importedModulesEvaluated.${attrName}.config.result.api.schema.${roleName} ''; assertion = (builtins.tryEval (lib.deepSeq config.result.api.schema.${roleName} true)).success; }; diff --git a/lib/inventory/distributed-service/inventory-adapter.nix b/lib/inventory/distributed-service/inventory-adapter.nix index 2e6978952..03447ca65 100644 --- a/lib/inventory/distributed-service/inventory-adapter.nix +++ b/lib/inventory/distributed-service/inventory-adapter.nix @@ -118,7 +118,7 @@ let # TODO: Eagerly check the _class of the resolved module importedModulesEvaluated = lib.mapAttrs ( - _module_ident: instances: + module_ident: instances: (lib.evalModules { class = "clan.service"; modules = @@ -128,7 +128,10 @@ let (builtins.head instances).instance.resolvedModule # feature modules - (lib.modules.importApply ./api-feature.nix { inherit clanLib; }) + (lib.modules.importApply ./api-feature.nix { + inherit clanLib; + attrName = module_ident; + }) ] # Include all the instances that correlate to the resolved module ++ (builtins.map (v: {