#!/usr/bin/env nu # Generate taskserv skeleton structure for rapid creation # Creates all required files: flake.nix, nixos-module.nix, Nickel files use std # Taskserv metadata def taskserv-metadata [] { { # Batch 2: Container runtimes containerd: { category: "container", type: "container-runtime", description: "containerd container runtime for NixOS", nixos_module: "virtualisation.containerd", complexity: "moderate", }, podman: { category: "container", type: "container-runtime", description: "Podman daemon-less container engine", nixos_module: "virtualisation.podman", complexity: "simple", }, # Batch 3: Cluster base etcd: { category: "cluster", type: "distributed-kv", description: "etcd distributed key-value store for Kubernetes", nixos_module: "services.etcd", complexity: "moderate", }, coredns: { category: "cluster", type: "dns-server", description: "CoreDNS for Kubernetes service discovery", nixos_module: "services.coredns", complexity: "simple", }, # Batch 4: Kubernetes kubernetes: { category: "cluster", type: "orchestrator", description: "Kubernetes control plane and node components", nixos_module: "services.kubernetes", complexity: "complex", }, # Batch 5: Storage and networking cilium: { category: "network", type: "cni", description: "Cilium eBPF-based networking for Kubernetes", nixos_module: "services.cilium", complexity: "complex", }, external_nfs: { category: "storage", type: "nfs-client", description: "External NFS client mount configuration", nixos_module: "fileSystems", complexity: "simple", }, rook_ceph: { category: "storage", type: "distributed-storage", description: "Rook operator for Ceph distributed storage", nixos_module: "services.kubernetes", complexity: "complex", }, # Batch 6: Services postgres: { category: "services", type: "database", description: "PostgreSQL relational database", nixos_module: "services.postgresql", complexity: "simple", }, redis: { category: "services", type: "cache", description: "Redis in-memory data store", nixos_module: "services.redis", complexity: "simple", }, proxy: { category: "services", type: "load-balancer", description: "HAProxy network proxy and load balancer", nixos_module: "services.haproxy", complexity: "simple", }, webhook: { category: "services", type: "webhook-handler", description: "Webhook handler service", nixos_module: "custom", complexity: "simple", }, } } # Generate flake.nix template def generate-flake [taskserv: string, description: string] { $" { description = \"$description\"; inputs = { nixpkgs.url = \"github:NixOS/nixpkgs/nixos-24.11\"; flake-utils.url = \"github:numtide/flake-utils\"; }; outputs = { self, nixpkgs, flake-utils }: flake-utils.lib.eachDefaultSystem (system: let pkgs = nixpkgs.legacyPackages.\${system}; in { checks = { format = pkgs.runCommand \"($taskserv)-format-check\" { buildInputs = with pkgs; [ nixpkgs-fmt ]; } '' nixpkgs-fmt --check \${./.} mkdir \$out ''; }; devShells.default = pkgs.mkShell { buildInputs = with pkgs; [ nixpkgs-fmt ]; }; } ) // { nixosModules = { default = import ./nixos-module.nix; }; }; } " } # Generate nixos-module.nix template def generate-module [taskserv: string, nixos_module: string] { let cfg_name = ($taskserv | str replace "_" "-") $" { config, lib, pkgs, ... }: with lib; let cfg = config.provisioning.taskservs.$taskserv; in { options.provisioning.taskservs.$taskserv = { enable = mkEnableOption \"$taskserv service\"; }; config = mkIf cfg.enable { # NixOS module configuration goes here # Reference: services.$nixos_module or virtualisation.* # Metadata assertions = [ { assertion = true; message = \"$taskserv properly configured\"; } ]; }; } " } # Generate main.ncl def generate-main-ncl [taskserv: string, description: string] { $" # $taskserv Taskserv Main Configuration let defaults = import \"defaults.ncl\" in { taskserv_name | doc \"Taskserv identifier\" = \"$taskserv\", taskserv_type | doc \"Taskserv category\" = \"$description\", taskserv_version | doc \"Taskserv version\" = \"1.0.0\", config | doc \"Default taskserv configuration\" = defaults.${taskserv}_config, metadata | doc \"Taskserv documentation\" = { description | doc \"What this taskserv provides\" = \"$description for NixOS\", author | doc \"Taskserv author\" = \"Provisioning Team\", documentation_path | doc \"Path to documentation\" = \"./README.md\", }, } " } # Generate defaults.ncl def generate-defaults-ncl [taskserv: string] { $" # $taskserv Taskserv Defaults { ${taskserv}_config | default = { enable | doc \"Enable $taskserv\" | default = true, }, } " } # Generate contracts.ncl def generate-contracts-ncl [taskserv: string] { $" # $taskserv Taskserv Contracts { ${(($taskserv | str capitalize) + "Config")} = { enable | Bool | doc \"Enable $taskserv\", }, } " } # Main function export def main [ taskservs: list = ["containerd", "podman", "etcd", "coredns", "kubernetes", "cilium", "external_nfs", "rook_ceph", "postgres", "redis", "proxy", "webhook"] --output-dir: string = "provisioning/extensions/taskservs" ] { let metadata = taskserv-metadata print $"Generating taskserv skeletons for ($taskservs | length) services..." for taskserv in $taskservs { if not ($metadata | has $taskserv) { print $"⚠ ($taskserv): not in metadata, skipping" continue } let meta = $metadata | get $taskserv let taskserv_dir = $"($output_dir)/($meta.category)/($taskserv)" mkdir $taskserv_dir mkdir $"($taskserv_dir)/nickel" mkdir $"($taskserv_dir)/modules" mkdir $"($taskserv_dir)/templates" mkdir $"($taskserv_dir)/scripts" # Generate flake.nix let flake_content = (generate-flake $taskserv $meta.description) $flake_content | save --force $"($taskserv_dir)/flake.nix" # Generate nixos-module.nix let module_content = (generate-module $taskserv $meta.nixos_module) $module_content | save --force $"($taskserv_dir)/nixos-module.nix" # Generate Nickel files let main_content = (generate-main-ncl $taskserv $meta.type) $main_content | save --force $"($taskserv_dir)/nickel/main.ncl" let defaults_content = (generate-defaults-ncl $taskserv) $defaults_content | save --force $"($taskserv_dir)/nickel/defaults.ncl" let contracts_content = (generate-contracts-ncl $taskserv) $contracts_content | save --force $"($taskserv_dir)/nickel/contracts.ncl" print $"✓ ($taskserv): skeleton generated at ($taskserv_dir)" } print "All taskserv skeletons generated successfully" }