Skip to content

Commit

Permalink
Use name as fallback merge-key (#21)
Browse files Browse the repository at this point in the history
This change uses the attribute `name` if
`x-kubernetes-patch-merge-key` is not the full
`x-kubernetes-list-map-keys` to avoid data corruption.
  • Loading branch information
herwigstuetz committed May 25, 2023
1 parent a90fdc0 commit dc1c994
Show file tree
Hide file tree
Showing 9 changed files with 942 additions and 610 deletions.
53 changes: 39 additions & 14 deletions jobs/generators/k8s/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ with lib; let

submoduleForDefinition = ref: name: kind: group: version: ''(submoduleForDefinition "${ref}" "${name}" "${kind}" "${group}" "${version}")'';

coerceAttrsOfSubmodulesToListByKey = ref: mergeKey: ''(coerceAttrsOfSubmodulesToListByKey "${ref}" "${mergeKey}")'';
coerceAttrsOfSubmodulesToListByKey = ref: attrMergeKey: listMergeKeys: ''(coerceAttrsOfSubmodulesToListByKey "${ref}" "${attrMergeKey}" [${concatStringsSep " " (map (key: "\"${toString key}\"") listMergeKeys)}])'';

attrsToList = "attrsToList";

Expand Down Expand Up @@ -157,16 +157,28 @@ with lib; let
}
# if a reference is to complex type
else
# if x-kubernetes-patch-merge-key is set then make it an
# attribute set of submodules
if hasAttr "x-kubernetes-patch-merge-key" property
# make it an attribute set of submodules if only x-kubernetes-patch-merge-key is present, or
# x-kubernetes-patch-merge-key == x-kubernetes-list-map-keys.
if (hasAttr "x-kubernetes-patch-merge-key" property) && (!(hasAttr "x-kubernetes-list-map-keys" property) || (property."x-kubernetes-list-map-keys" == [property."x-kubernetes-patch-merge-key"]))
then let
mergeKey = property."x-kubernetes-patch-merge-key";
in {
type = requiredOrNot (coerceAttrsOfSubmodulesToListByKey (refDefinition property.items) mergeKey);
type = requiredOrNot (coerceAttrsOfSubmodulesToListByKey (refDefinition property.items) mergeKey []);
apply = attrsToList;
}
# in other case it's a simple list
else
# make it an attribute set of submodules if only x-kubernetes-patch-merge-key is present, or
# x-kubernetes-patch-merge-key == x-kubernetes-list-map-keys.
if hasAttr "properties" swagger.definitions.${refDefinition property.items} &&
hasAttr "name" swagger.definitions.${refDefinition property.items}.properties
then let
mergeKey = "name";
in {
type = requiredOrNot (coerceAttrsOfSubmodulesToListByKey (refDefinition property.items) mergeKey (if hasAttr "x-kubernetes-list-map-keys" property then property."x-kubernetes-list-map-keys" else []));
apply = attrsToList;
}

else {
type =
if (refDefinition property.items) == _name
Expand Down Expand Up @@ -387,13 +399,21 @@ with lib; let
mkOptionDefault = mkOverride 1001;
# todo: can we use mkOrder
mergeValuesByKey = mergeKey: values:
mergeValuesByKey = attrMergeKey: listMergeKeys: values:
listToAttrs (imap0
(i: value: nameValuePair (
if isAttrs value.''${mergeKey}
then toString value.''${mergeKey}.content
else (toString value.''${mergeKey})
if hasAttr attrMergeKey value
then
if isAttrs value.''${attrMergeKey}
then toString value.''${attrMergeKey}.content
else (toString value.''${attrMergeKey})
else
# generate merge key for list elements if it's not present
"__kubenix_list_merge_key_" + (concatStringsSep "" (map (key:
if isAttrs value.''${key}
then toString value.''${key}.content
else (toString value.''${key})
) listMergeKeys))
) (value // { _priority = i; }))
values);
Expand All @@ -413,7 +433,12 @@ with lib; let
_priority = mkOption { type = types.nullOr types.int; default = null; };
};
config = definitions."''${ref}".config // {
''${mergeKey} = mkOverride 1002 (convertName name);
''${mergeKey} = mkOverride 1002 (
# use name as mergeKey only if it is not coming from mergeValuesByKey
if (!hasPrefix "__kubenix_list_merge_key_" name)
then convertName name
else null
);
};
});
Expand All @@ -434,10 +459,10 @@ with lib; let
];
});
coerceAttrsOfSubmodulesToListByKey = ref: mergeKey: (types.coercedTo
coerceAttrsOfSubmodulesToListByKey = ref: attrMergeKey: listMergeKeys: (types.coercedTo
(types.listOf (submoduleOf ref))
(mergeValuesByKey mergeKey)
(types.attrsOf (submoduleWithMergeOf ref mergeKey))
(mergeValuesByKey attrMergeKey listMergeKeys)
(types.attrsOf (submoduleWithMergeOf ref attrMergeKey))
);
definitions = {
Expand Down
Loading

0 comments on commit dc1c994

Please sign in to comment.