diff options
author | Nikolay Amiantov <ab@fmap.me> | 2022-01-10 00:43:00 +0300 |
---|---|---|
committer | Nikolay Amiantov <ab@fmap.me> | 2022-01-16 11:25:44 +0300 |
commit | 3c7e78cc6ab73ca9b0dbcb376122befa59098300 (patch) | |
tree | 88f9ce21ec48f0d3620857bfbfd04887ae0e7a3a /nixos/modules/services/web-apps | |
parent | 9bbcc98e304962e4b9b6a911707b87d1cedf8b83 (diff) | |
download | nixlib-3c7e78cc6ab73ca9b0dbcb376122befa59098300.tar nixlib-3c7e78cc6ab73ca9b0dbcb376122befa59098300.tar.gz nixlib-3c7e78cc6ab73ca9b0dbcb376122befa59098300.tar.bz2 nixlib-3c7e78cc6ab73ca9b0dbcb376122befa59098300.tar.lz nixlib-3c7e78cc6ab73ca9b0dbcb376122befa59098300.tar.xz nixlib-3c7e78cc6ab73ca9b0dbcb376122befa59098300.tar.zst nixlib-3c7e78cc6ab73ca9b0dbcb376122befa59098300.zip |
keycloak service: ordering for CLI script
Allow update commands in the script to be ordered using `mkOrder`. If we encounter ordered sub-objects we sort them by priority. To implement this we now explicitly pass current node in `recurse`, which also allows us to clean up edge case for top-level node. Also refactor `recurse` to avoid passing result text argument; we weren't tail recursive before anyway.
Diffstat (limited to 'nixos/modules/services/web-apps')
-rw-r--r-- | nixos/modules/services/web-apps/keycloak.nix | 51 |
1 files changed, 28 insertions, 23 deletions
diff --git a/nixos/modules/services/web-apps/keycloak.nix b/nixos/modules/services/web-apps/keycloak.nix index e08f6dcabd2f..12111633919b 100644 --- a/nixos/modules/services/web-apps/keycloak.nix +++ b/nixos/modules/services/web-apps/keycloak.nix @@ -441,9 +441,9 @@ in # with `expression` to evaluate. prefixExpression = string: let - match = (builtins.match ''"\$\{.*}"'' string); + matchResult = builtins.match ''"\$\{.*}"'' string; in - if match != null then + if matchResult != null then "expression " + string else string; @@ -508,52 +508,57 @@ in "" else throw "Unsupported type '${type}' for attribute '${attribute}'!"; + in lib.concatStringsSep ", " (lib.mapAttrsToList makeArg set); - /* Recurses into the `attrs` attrset, beginning at the path - resolved from `state.path ++ node`; if `node` is `null`, - starts from `state.path`. Only subattrsets that are JBoss - paths, i.e. follows the `key=value` format, are recursed + /* Recurses into the `nodeValue` attrset. Only subattrsets that + are JBoss paths, i.e. follows the `key=value` format, are recursed into - the rest are considered JBoss attributes / maps. */ - recurse = state: node: + recurse = nodePath: nodeValue: let - path = state.path ++ (lib.optional (node != null) node); + nodeContent = + if builtins.isAttrs nodeValue && nodeValue._type or "" == "order" then + nodeValue.content + else + nodeValue; isPath = name: let - value = lib.getAttrFromPath (path ++ [ name ]) attrs; + value = nodeContent.${name}; in if (builtins.match ".*([=]).*" name) == [ "=" ] then if builtins.isAttrs value || value == null then true else - throw "Parsing path '${lib.concatStringsSep "." (path ++ [ name ])}' failed: JBoss attributes cannot contain '='!" + throw "Parsing path '${lib.concatStringsSep "." (nodePath ++ [ name ])}' failed: JBoss attributes cannot contain '='!" else false; - jbossPath = "/" + (lib.concatStringsSep "/" path); - nodeValue = lib.getAttrFromPath path attrs; - children = if !builtins.isAttrs nodeValue then {} else nodeValue; + jbossPath = "/" + lib.concatStringsSep "/" nodePath; + children = if !builtins.isAttrs nodeContent then {} else nodeContent; subPaths = builtins.filter isPath (builtins.attrNames children); + getPriority = name: + let value = children.${name}; + in if value._type or "" == "order" then value.priority else 1000; + orderedSubPaths = lib.sort (a: b: getPriority a < getPriority b) subPaths; jbossAttrs = lib.filterAttrs (name: _: !(isPath name)) children; - in - state // { - text = state.text + ( - if nodeValue != null then '' + text = + if nodeContent != null then + '' if (outcome != success) of ${jbossPath}:read-resource() ${jbossPath}:add(${makeArgList jbossAttrs}) end-if - '' + (writeAttributes jbossPath jbossAttrs) - else '' + '' + writeAttributes jbossPath jbossAttrs + else + '' if (outcome == success) of ${jbossPath}:read-resource() ${jbossPath}:remove() end-if - '') + (builtins.foldl' recurse { text = ""; inherit path; } subPaths).text; - }; + ''; + in text + lib.concatMapStringsSep "\n" (name: recurse (nodePath ++ [name]) children.${name}) orderedSubPaths; in - (recurse { text = ""; path = []; } null).text; - + recurse [] attrs; jbossCliScript = pkgs.writeText "jboss-cli-script" (mkJbossScript keycloakConfig'); |