ref: move generators into jobs & improvements

- format generated files with nixpkgs-fmt

Also unrelatedly embellish flake.nix
This commit is contained in:
David Arnold 2021-05-28 19:25:48 -05:00
parent 348d922b18
commit bf231d19fa
No known key found for this signature in database
GPG key ID: 6D6A936E69C59D08
7 changed files with 156 additions and 126 deletions

View file

@ -8,35 +8,38 @@
}; };
outputs = { self, nixpkgs, flake-utils, devshell-flake }: outputs = { self, nixpkgs, flake-utils, devshell-flake }:
(flake-utils.lib.eachDefaultSystem
(system: (flake-utils.lib.eachDefaultSystem (system:
let let
pkgs = import nixpkgs { pkgs = import nixpkgs {
inherit system; inherit system;
overlays = [ overlays = [
self.overlay self.overlay
devshell-flake.overlay devshell-flake.overlay
]; ];
config = { config = { allowUnsupportedSystem = true; };
allowUnsupportedSystem = true;
};
}; };
in in
rec { {
devShell = with pkgs; devshell.mkShell devShell = with pkgs; devshell.mkShell
{ imports = [ (devshell.importTOML ./devshell.toml) ]; }; { imports = [ (devshell.importTOML ./devshell.toml) ]; };
packages = flake-utils.lib.flattenTree { packages = flake-utils.lib.flattenTree {
inherit (pkgs) inherit (pkgs) kubernetes kubectl;
kubernetes
kubectl
;
}; };
defaultPackage = pkgs.kubenix; defaultPackage = pkgs.kubenix;
jobs = import ./jobs { inherit pkgs; };
} }
) ))
) //
//
{ {
modules = import ./src/modules; modules = import ./src/modules;
overlay = final: prev: { overlay = final: prev: {

4
jobs/default.nix Normal file
View file

@ -0,0 +1,4 @@
{ pkgs }:
{
generators = pkgs.callPackage ./generators { };
}

View file

@ -0,0 +1,54 @@
{ pkgs, lib }:
let
generateIstio = import ./istio {
inherit
pkgs
lib
;
};
generateK8S = name: spec: import ./k8s {
inherit
name
pkgs
lib
spec
;
};
in
{
istio = pkgs.linkFarm "istio-generated" [{
name = "latest.nix";
path = generateIstio;
}];
k8s = pkgs.linkFarm "k8s-generated" [
{
name = "v1.19.nix";
path = generateK8S "v1.19" (builtins.fetchurl {
url = "https://github.com/kubernetes/kubernetes/raw/v1.19.10/api/openapi-spec/swagger.json";
sha256 = "sha256-ZXxonUAUxRK6rhTgK62ytTdDKCuOoWPwxJmktiKgcJc=";
});
}
{
name = "v1.20.nix";
path = generateK8S "v1.20" (builtins.fetchurl {
url = "https://github.com/kubernetes/kubernetes/raw/v1.20.6/api/openapi-spec/swagger.json";
sha256 = "sha256-xzVOarQDSomHMimpt8H6MfpiQrLl9am2fDvk/GfLkDw=";
});
}
{
name = "v1.21.nix";
path = generateK8S "v1.21" (builtins.fetchurl {
url = "https://github.com/kubernetes/kubernetes/raw/v1.21.0/api/openapi-spec/swagger.json";
sha256 = "sha256-EoqYTbtaTlzs7vneoNtXUmdnjTM/U+1gYwCiEy0lOcw=";
});
}
];
}

View file

@ -231,8 +231,8 @@ values}]'';
swagger = fetchSpecs spec; swagger = fetchSpecs spec;
definitions = genDefinitions swagger; definitions = genDefinitions swagger;
in
pkgs.writeText "gen.nix" '' generated = ''
# This file was generated with kubenix k8s generator, do not edit # This file was generated with kubenix k8s generator, do not edit
{lib, config, ... }: {lib, config, ... }:
@ -241,8 +241,8 @@ pkgs.writeText "gen.nix" ''
let let
types = lib.types // rec { types = lib.types // rec {
str = mkOptionType { str = mkOptionType {
name = \"str\"; name = "str";
description = \"string\"; description = "string";
check = isString; check = isString;
merge = mergeEqualOption; merge = mergeEqualOption;
}; };
@ -251,8 +251,8 @@ pkgs.writeText "gen.nix" ''
# converted to `finalType` using `coerceFunc`. # converted to `finalType` using `coerceFunc`.
coercedTo = coercedType: coerceFunc: finalType: coercedTo = coercedType: coerceFunc: finalType:
mkOptionType rec { mkOptionType rec {
name = \"coercedTo\"; name = "coercedTo";
description = \"\${finalType.description} or \${coercedType.description}\"; description = "''${finalType.description} or ''${coercedType.description}";
check = x: finalType.check x || coercedType.check x; check = x: finalType.check x || coercedType.check x;
merge = loc: defs: merge = loc: defs:
let let
@ -280,34 +280,34 @@ pkgs.writeText "gen.nix" ''
mergeValuesByKey = mergeKey: values: mergeValuesByKey = mergeKey: values:
listToAttrs (map listToAttrs (map
(value: nameValuePair ( (value: nameValuePair (
if isAttrs value.\${mergeKey} if isAttrs value.''${mergeKey}
then toString value.\${mergeKey}.content then toString value.''${mergeKey}.content
else (toString value.\${mergeKey}) else (toString value.''${mergeKey})
) value) ) value)
values); values);
submoduleOf = ref: types.submodule ({name, ...}: { submoduleOf = ref: types.submodule ({name, ...}: {
options = definitions.\"\${ref}\".options; options = definitions."''${ref}".options;
config = definitions.\"\${ref}\".config; config = definitions."''${ref}".config;
}); });
submoduleWithMergeOf = ref: mergeKey: types.submodule ({name, ...}: let submoduleWithMergeOf = ref: mergeKey: types.submodule ({name, ...}: let
convertName = name: convertName = name:
if definitions.\"\${ref}\".options.\${mergeKey}.type == types.int if definitions."''${ref}".options.''${mergeKey}.type == types.int
then toInt name then toInt name
else name; else name;
in { in {
options = definitions.\"\${ref}\".options; options = definitions."''${ref}".options;
config = definitions.\"\${ref}\".config // { config = definitions."''${ref}".config // {
\${mergeKey} = mkOverride 1002 (convertName name); ''${mergeKey} = mkOverride 1002 (convertName name);
}; };
}); });
submoduleForDefinition = ref: resource: kind: group: version: submoduleForDefinition = ref: resource: kind: group: version:
types.submodule ({name, ...}: { types.submodule ({name, ...}: {
options = definitions.\"\${ref}\".options // extraOptions; options = definitions."''${ref}".options // extraOptions;
config = mkMerge ([ config = mkMerge ([
definitions.\"\${ref}\".config definitions."''${ref}".config
{ {
kind = mkOptionDefault kind; kind = mkOptionDefault kind;
apiVersion = mkOptionDefault version; apiVersion = mkOptionDefault version;
@ -315,7 +315,7 @@ pkgs.writeText "gen.nix" ''
# metdata.name cannot use option default, due deep config # metdata.name cannot use option default, due deep config
metadata.name = mkOptionDefault name; metadata.name = mkOptionDefault name;
} }
] ++ (config.defaults.\${resource} or []) ] ++ (config.defaults.''${resource} or [])
++ (config.defaults.all or [])); ++ (config.defaults.all or []));
}); });
@ -326,23 +326,20 @@ pkgs.writeText "gen.nix" ''
); );
definitions = { definitions = {
${concatStrings (mapAttrsToList ${concatStrings (mapAttrsToList (name: value: ''
(name: value: " "${name}" = {${optionalString (hasAttr "options" value) "
\"${name}\" = {${optionalString (hasAttr "options" value) " options = {${concatStrings (mapAttrsToList (name: value: ''
options = {${concatStrings (mapAttrsToList "${name}" = ${value};
(name: value: " '') value.options)}};
\"${name}\" = ${value}; "}
")
value.options)}}; ${optionalString (hasAttr "config" value) ''
"}${optionalString (hasAttr "config" value) " config = {${concatStrings (mapAttrsToList (name: value: ''
config = {${concatStrings (mapAttrsToList "${name}" = ${value};
(name: value: " '') value.config)}};
\"${name}\" = ${value}; ''}
") };
value.config)}}; '') definitions)}
"}};
")
definitions)}
} // (import ./overrides.nix {inheirt definitions lib;})); } // (import ./overrides.nix {inheirt definitions lib;}));
in { in {
kubernetes.customResources = [ kubernetes.customResources = [
@ -357,4 +354,16 @@ pkgs.writeText "gen.nix" ''
(genResources swagger)} (genResources swagger)}
]; ];
} }
'';
in
pkgs.runCommand "istio-gen.nix"
{
buildInputs = [ pkgs.nixpkgs-fmt ];
} ''
cat << 'GENERATED' > ./raw
"${generated}"
GENERATED
nixpkgs-fmt ./raw
cp ./raw $out
'' ''

View file

@ -1,8 +1,7 @@
{ name ? "k8s" { name
, pkgs ? import <nixpkgs> { } , pkgs
, lib ? pkgs.lib , lib
, spec ? ./specs/1.21/swagger.json , spec
, ...
}: }:
with lib; with lib;
@ -456,8 +455,12 @@ values}]'';
in in
pkgs.runCommand "k8s-${name}-gen.nix" pkgs.runCommand "k8s-${name}-gen.nix"
{ {
buildInputs = [ pkgs.haskellPackages.nixfmt ]; buildInputs = [ pkgs.nixpkgs-fmt ];
} '' } ''
cp ${builtins.toFile "k8s-${name}-gen-raw.nix" generated} $out cat << 'GENERATED' > ./raw
nixfmt -w 100 $out "${generated}"
GENERATED
nixpkgs-fmt ./raw
cp ./raw $out
'' ''

View file

@ -2,7 +2,6 @@ let
fetch = import ./lib/compat.nix; fetch = import ./lib/compat.nix;
in in
{ pkgs ? import (fetch "nixpkgs") { } { pkgs ? import (fetch "nixpkgs") { }
, nixosPath ? toString (fetch "nixpkgs") + "/nixos"
, lib ? pkgs.lib , lib ? pkgs.lib
, throwError ? true , throwError ? true
}: }:
@ -13,53 +12,11 @@ let
lib = kubenix.lib; lib = kubenix.lib;
generateK8S = name: spec: import ./generators/k8s {
inherit name;
inherit pkgs;
inherit (pkgs) lib;
inherit spec;
};
generateIstio = import ./generators/istio {
inherit pkgs;
inherit (pkgs) lib;
};
runK8STests = k8sVersion: import ./tests { runK8STests = k8sVersion: import ./tests {
inherit pkgs lib kubenix k8sVersion throwError nixosPath; inherit pkgs lib kubenix k8sVersion throwError nixosPath;
}; };
in in
rec { rec {
generate.k8s = pkgs.linkFarm "k8s-generated.nix" [
{
name = "v1.19.nix";
path = generateK8S "v1.19" (builtins.fetchurl {
url = "https://github.com/kubernetes/kubernetes/raw/v1.19.10/api/openapi-spec/swagger.json";
sha256 = "sha256-ZXxonUAUxRK6rhTgK62ytTdDKCuOoWPwxJmktiKgcJc=";
});
}
{
name = "v1.20.nix";
path = generateK8S "v1.20" (builtins.fetchurl {
url = "https://github.com/kubernetes/kubernetes/raw/v1.20.6/api/openapi-spec/swagger.json";
sha256 = "sha256-xzVOarQDSomHMimpt8H6MfpiQrLl9am2fDvk/GfLkDw=";
});
}
{
name = "v1.21.nix";
path = generateK8S "v1.21" (builtins.fetchurl {
url = "https://github.com/kubernetes/kubernetes/raw/v1.21.0/api/openapi-spec/swagger.json";
sha256 = "sha256-EoqYTbtaTlzs7vneoNtXUmdnjTM/U+1gYwCiEy0lOcw=";
});
}
];
generate.istio = pkgs.linkFarm "istio-generated.nix" [{
name = "latest.nix";
path = generateIstio;
}];
tests = { tests = {
k8s-1_19 = runK8STests "1.19"; k8s-1_19 = runK8STests "1.19";