From b543bb13236ddaa2edb3ae55e62a83848257a434 Mon Sep 17 00:00:00 2001 From: Kiara Grouwstra Date: Fri, 1 Aug 2025 17:56:35 +0200 Subject: [PATCH] factor out function wrapper to module function --- deployment/data-model-test.nix | 13 ++++++------ deployment/data-model.nix | 39 ++++++++++++++++++++++------------ deployment/function.nix | 22 +++++++++++++++++++ 3 files changed, 53 insertions(+), 21 deletions(-) diff --git a/deployment/data-model-test.nix b/deployment/data-model-test.nix index c65e37ae..32de523b 100644 --- a/deployment/data-model-test.nix +++ b/deployment/data-model-test.nix @@ -98,20 +98,18 @@ in { options.enable = lib.mkEnableOption "Hello in the shell"; }; - implementation = cfg: { - input = cfg; - output = lib.optionalAttrs cfg.enable { + implementation = + cfg: + lib.optionalAttrs cfg.enable { resources.hello.login-shell.packages.hello = pkgs.hello; }; - }; }; environments.single-nixos-vm = { config, ... }: { resources.operator-environment.login-shell.username = "operator"; implementation = requests: { - input = requests; - output.nixops4 = + nixops4 = ( { providers, ... }: { providers = { @@ -130,7 +128,8 @@ in ); }; }; - }; + } + ); }; }; }; diff --git a/deployment/data-model.nix b/deployment/data-model.nix index 2a1818ac..c010b75b 100644 --- a/deployment/data-model.nix +++ b/deployment/data-model.nix @@ -109,11 +109,11 @@ in }; resources = mkOption { description = "Compute resources required by an application"; - type = functionTo application.config.config-mapping.output-type; + type = application.config.config-mapping.function-type; readOnly = true; - default = input: (application.config.implementation input).output; + default = application.config.config-mapping.apply; }; - # TODO(@fricklerhandwerk): this needs a better name, it's just the type + # TODO(@fricklerhandwerk): this needs a better name config-mapping = mkOption { description = "Function type for the mapping from application configuration to required resources"; type = functionType; @@ -121,6 +121,7 @@ in default = { input-type = submodule application.config.module; output-type = application-resources; + implementation = application.config.implementation; }; }; }; @@ -157,6 +158,25 @@ in default = { input-type = application-resources; output-type = deployment; + implementation = environment.config.implementation; + }; + }; + config-mapping = mkOption { + description = "Mapping from a configuration to a deployment"; + type = submodule functionType; + readOnly = true; + default = { + input-type = config.configuration; + output-type = nixops4Deployment; + implementation = + cfg: + # TODO: check cfg.enable.true + let + required-resources = lib.mapAttrs ( + name: application-settings: config.applications.${name}.resources application-settings + ) cfg.applications; + in + environment.config.resource-mapping.apply required-resources; }; }; # TODO(@fricklerhandwerk): maybe this should be a separate thing such as `fediversity-setup`, @@ -164,18 +184,9 @@ in # then the deployments can simply be the result of the function application baked into this module. deployment = mkOption { description = "Generate a deployment from a configuration, by applying an environment's resource policies to the applications' resource mappings"; - type = functionTo (environment.config.resource-mapping.output-type); + type = environment.config.config-mapping.function-type; readOnly = true; - default = - cfg: - # TODO: check cfg.enable.true - let - required-resources = lib.mapAttrs ( - name: application-settings: config.applications.${name}.resources application-settings - ) cfg.applications; - in - (environment.config.implementation required-resources).output; - + default = environment.config.config-mapping.apply; }; }; }) diff --git a/deployment/function.nix b/deployment/function.nix index f0210a34..76795e68 100644 --- a/deployment/function.nix +++ b/deployment/function.nix @@ -19,6 +19,11 @@ in type = optionType; }; function-type = mkOption { + type = optionType; + readOnly = true; + default = functionTo config.output-type; + }; + wrapper-type = mkOption { type = optionType; readOnly = true; default = functionTo (submodule { @@ -32,5 +37,22 @@ in }; }); }; + implementation = mkOption { + type = config.function-type; + default = _: { }; + }; + wrapper = mkOption { + type = config.wrapper-type; + readOnly = true; + default = input: fn: { + inherit input; + output = config.implementation fn.config.input; + }; + }; + apply = mkOption { + type = config.function-type; + readOnly = true; + default = input: (config.wrapper input).output; + }; }; }