diff --git a/flake.nix b/flake.nix index dfedee7..9b00cf2 100644 --- a/flake.nix +++ b/flake.nix @@ -8,35 +8,38 @@ }; outputs = { self, nixpkgs, flake-utils, devshell-flake }: - (flake-utils.lib.eachDefaultSystem - (system: - let - pkgs = import nixpkgs { - inherit system; - overlays = [ - self.overlay - devshell-flake.overlay - ]; - config = { - allowUnsupportedSystem = true; - }; - }; - in - rec { - devShell = with pkgs; devshell.mkShell - { imports = [ (devshell.importTOML ./devshell.toml) ]; }; - packages = flake-utils.lib.flattenTree { - inherit (pkgs) - kubernetes - kubectl - ; - }; + (flake-utils.lib.eachDefaultSystem (system: + let + + pkgs = import nixpkgs { + inherit system; + overlays = [ + self.overlay + devshell-flake.overlay + ]; + config = { allowUnsupportedSystem = true; }; + }; + + in + { + + devShell = with pkgs; devshell.mkShell + { imports = [ (devshell.importTOML ./devshell.toml) ]; }; + + packages = flake-utils.lib.flattenTree { + inherit (pkgs) kubernetes kubectl; + }; + + defaultPackage = pkgs.kubenix; + + jobs = import ./jobs { inherit pkgs; }; + + } + )) + + // - defaultPackage = pkgs.kubenix; - } - ) - ) // { modules = import ./src/modules; overlay = final: prev: { diff --git a/jobs/default.nix b/jobs/default.nix new file mode 100644 index 0000000..be97fe6 --- /dev/null +++ b/jobs/default.nix @@ -0,0 +1,4 @@ +{ pkgs }: +{ + generators = pkgs.callPackage ./generators { }; +} diff --git a/jobs/generators/default.nix b/jobs/generators/default.nix new file mode 100644 index 0000000..7ef48a4 --- /dev/null +++ b/jobs/generators/default.nix @@ -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="; + }); + } + ]; + +} diff --git a/src/generators/istio/default.nix b/jobs/generators/istio/default.nix similarity index 88% rename from src/generators/istio/default.nix rename to jobs/generators/istio/default.nix index e09e02e..5acecba 100644 --- a/src/generators/istio/default.nix +++ b/jobs/generators/istio/default.nix @@ -231,28 +231,28 @@ values}]''; swagger = fetchSpecs spec; definitions = genDefinitions swagger; -in -pkgs.writeText "gen.nix" '' + + generated = '' # This file was generated with kubenix k8s generator, do not edit {lib, config, ... }: - + with lib; - + let types = lib.types // rec { str = mkOptionType { - name = \"str\"; - description = \"string\"; + name = "str"; + description = "string"; check = isString; merge = mergeEqualOption; }; - + # Either value of type `finalType` or `coercedType`, the latter is # converted to `finalType` using `coerceFunc`. coercedTo = coercedType: coerceFunc: finalType: mkOptionType rec { - name = \"coercedTo\"; - description = \"\${finalType.description} or \${coercedType.description}\"; + name = "coercedTo"; + description = "''${finalType.description} or ''${coercedType.description}"; check = x: finalType.check x || coercedType.check x; merge = loc: defs: let @@ -261,7 +261,7 @@ pkgs.writeText "gen.nix" '' else let coerced = coerceFunc val; in assert finalType.check coerced; coerced; - + in finalType.merge loc (map (def: def // { value = coerceVal def.value; }) defs); getSubOptions = finalType.getSubOptions; getSubModules = finalType.getSubModules; @@ -270,79 +270,76 @@ pkgs.writeText "gen.nix" '' functor = (defaultFunctor name) // { wrapped = finalType; }; }; }; - + mkOptionDefault = mkOverride 1001; - + extraOptions = { kubenix = {}; }; - + mergeValuesByKey = mergeKey: values: listToAttrs (map (value: nameValuePair ( - if isAttrs value.\${mergeKey} - then toString value.\${mergeKey}.content - else (toString value.\${mergeKey}) + if isAttrs value.''${mergeKey} + then toString value.''${mergeKey}.content + else (toString value.''${mergeKey}) ) value) values); - + submoduleOf = ref: types.submodule ({name, ...}: { - options = definitions.\"\${ref}\".options; - config = definitions.\"\${ref}\".config; + options = definitions."''${ref}".options; + config = definitions."''${ref}".config; }); - + submoduleWithMergeOf = ref: mergeKey: types.submodule ({name, ...}: let convertName = name: - if definitions.\"\${ref}\".options.\${mergeKey}.type == types.int + if definitions."''${ref}".options.''${mergeKey}.type == types.int then toInt name else name; in { - options = definitions.\"\${ref}\".options; - config = definitions.\"\${ref}\".config // { - \${mergeKey} = mkOverride 1002 (convertName name); + options = definitions."''${ref}".options; + config = definitions."''${ref}".config // { + ''${mergeKey} = mkOverride 1002 (convertName name); }; }); - + submoduleForDefinition = ref: resource: kind: group: version: types.submodule ({name, ...}: { - options = definitions.\"\${ref}\".options // extraOptions; + options = definitions."''${ref}".options // extraOptions; config = mkMerge ([ - definitions.\"\${ref}\".config + definitions."''${ref}".config { kind = mkOptionDefault kind; apiVersion = mkOptionDefault version; - + # metdata.name cannot use option default, due deep config metadata.name = mkOptionDefault name; } - ] ++ (config.defaults.\${resource} or []) + ] ++ (config.defaults.''${resource} or []) ++ (config.defaults.all or [])); }); - + coerceAttrsOfSubmodulesToListByKey = ref: mergeKey: (types.coercedTo (types.listOf (submoduleOf ref)) (mergeValuesByKey mergeKey) (types.attrsOf (submoduleWithMergeOf ref mergeKey)) ); - + definitions = { - ${concatStrings (mapAttrsToList - (name: value: " - \"${name}\" = {${optionalString (hasAttr "options" value) " - options = {${concatStrings (mapAttrsToList - (name: value: " - \"${name}\" = ${value}; - ") - value.options)}}; - "}${optionalString (hasAttr "config" value) " - config = {${concatStrings (mapAttrsToList - (name: value: " - \"${name}\" = ${value}; - ") - value.config)}}; - "}}; - ") - definitions)} + ${concatStrings (mapAttrsToList (name: value: '' + "${name}" = {${optionalString (hasAttr "options" value) " + options = {${concatStrings (mapAttrsToList (name: value: '' + "${name}" = ${value}; + '') value.options)}}; + "} + + ${optionalString (hasAttr "config" value) '' + config = {${concatStrings (mapAttrsToList (name: value: '' + "${name}" = ${value}; + '') value.config)}}; + ''} + }; + '') definitions)} } // (import ./overrides.nix {inheirt definitions lib;})); in { kubernetes.customResources = [ @@ -357,4 +354,16 @@ pkgs.writeText "gen.nix" '' (genResources swagger)} ]; } +''; +in +pkgs.runCommand "istio-gen.nix" +{ + buildInputs = [ pkgs.nixpkgs-fmt ]; +} '' + cat << 'GENERATED' > ./raw + "${generated}" + GENERATED + + nixpkgs-fmt ./raw + cp ./raw $out '' diff --git a/src/generators/istio/istio-schema.json b/jobs/generators/istio/istio-schema.json similarity index 100% rename from src/generators/istio/istio-schema.json rename to jobs/generators/istio/istio-schema.json diff --git a/src/generators/k8s/default.nix b/jobs/generators/k8s/default.nix similarity index 98% rename from src/generators/k8s/default.nix rename to jobs/generators/k8s/default.nix index 74b0f65..fdf3902 100644 --- a/src/generators/k8s/default.nix +++ b/jobs/generators/k8s/default.nix @@ -1,8 +1,7 @@ -{ name ? "k8s" -, pkgs ? import { } -, lib ? pkgs.lib -, spec ? ./specs/1.21/swagger.json -, ... +{ name +, pkgs +, lib +, spec }: with lib; @@ -456,8 +455,12 @@ values}]''; in pkgs.runCommand "k8s-${name}-gen.nix" { - buildInputs = [ pkgs.haskellPackages.nixfmt ]; + buildInputs = [ pkgs.nixpkgs-fmt ]; } '' - cp ${builtins.toFile "k8s-${name}-gen-raw.nix" generated} $out - nixfmt -w 100 $out + cat << 'GENERATED' > ./raw + "${generated}" + GENERATED + + nixpkgs-fmt ./raw + cp ./raw $out '' diff --git a/release.nix b/release.nix index 7f67f9b..0f1a947 100644 --- a/release.nix +++ b/release.nix @@ -2,7 +2,6 @@ let fetch = import ./lib/compat.nix; in { pkgs ? import (fetch "nixpkgs") { } -, nixosPath ? toString (fetch "nixpkgs") + "/nixos" , lib ? pkgs.lib , throwError ? true }: @@ -13,53 +12,11 @@ let 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 { inherit pkgs lib kubenix k8sVersion throwError nixosPath; }; in 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 = { k8s-1_19 = runK8STests "1.19";