diff --git a/flake.nix b/flake.nix index 03460e4..cc2bccf 100644 --- a/flake.nix +++ b/flake.nix @@ -246,6 +246,51 @@ touch $out ''; + generic-registry-fleet-view = + let + hosts = { + alpha = lib.nixosSystem { + system = "x86_64-linux"; + specialArgs.registry = registry; + modules = [ + self.lib.registry.module + { + registry.address.alpha.service = "10.0.0.5"; + system.stateVersion = "26.11"; + } + ]; + }; + beta = lib.nixosSystem { + system = "x86_64-linux"; + specialArgs.registry = registry; + modules = [ + self.lib.registry.module + ( + { registry, ... }: + { + environment.etc."registry-address-check".text = registry.address.alpha.service; + system.stateVersion = "26.11"; + } + ) + ]; + }; + }; + registry = self.lib.registry.collect { inherit hosts; }; + betaConfig = hosts.beta.config; + in + pkgs.runCommand "generic-registry-fleet-view-check" { } '' + ${ + lib.optionalString ( + !( + registry.address.alpha.service == "10.0.0.5" + && betaConfig.environment.etc."registry-address-check".text == "10.0.0.5" + && !(registry.address ? alpha-service) + ) + ) "exit 1" + } + touch $out + ''; + network-endpoint-fleet-registry = let hostEndpointConfig = diff --git a/lib/default.nix b/lib/default.nix index b577a64..7a6ad30 100644 --- a/lib/default.nix +++ b/lib/default.nix @@ -14,6 +14,11 @@ let ; serviceIdentityRegistry = import ./service-identities.nix { inherit lib; }; + registryLib = import ./registry.nix { inherit lib; }; + registry = registryLib.load { + dir = self + "/registry"; + args = { inherit lib; }; + }; networkEndpoints = import ./network-endpoints.nix { inherit lib; }; reverseProxyRoutes = import ./reverse-proxy-routes.nix { inherit lib; }; @@ -41,6 +46,7 @@ let { inherit inputs networkFleetEndpoints self; my = self.lib; + registry = self.lib.registry.collect { hosts = self.nixosConfigurations; }; reverseProxyFleetRoutes = self.lib.reverseProxyRoutes.collectFleetRoutes self.nixosConfigurations networkFleetEndpoints; }; @@ -71,6 +77,7 @@ let inputs.disko.nixosModules.disko inputs.sops-nix.nixosModules.sops inputs.stylix.nixosModules.stylix + registry.module (self + "/system.nix") (self + "/hosts/${hostName}") { networking.hostName = hostName; } @@ -90,6 +97,7 @@ in mkHost mkHosts bridgeName + registry networkEndpoints reverseProxyRoutes ; diff --git a/lib/registry.nix b/lib/registry.nix new file mode 100644 index 0000000..aa44f6d --- /dev/null +++ b/lib/registry.nix @@ -0,0 +1,53 @@ +{ lib }: +let + inherit (lib) + filterAttrs + hasSuffix + mapAttrs + mapAttrs' + mkOption + nameValuePair + removeSuffix + types + ; + + registryName = fileName: removeSuffix ".nix" fileName; + + registryOption = registry: mkOption { + type = types.attrsOf (types.attrsOf registry.type); + default = { }; + description = '' + Lazily collected fleet-visible registry entries, nested by host and entry name. + ''; + }; +in +{ + load = + { + dir, + args ? { }, + }: + let + definitions = mapAttrs' ( + name: type: + let + path = dir + "/${name}"; + in + nameValuePair (registryName name) (import path args) + ) (filterAttrs (name: type: type == "regular" && hasSuffix ".nix" name) (builtins.readDir dir)); + in + { + inherit definitions; + + module = { + options.registry = mapAttrs (_name: registry: registryOption registry) definitions; + }; + + collect = + { hosts }: + mapAttrs ( + registryName: _registry: + mapAttrs (hostName: host: host.config.registry.${registryName}.${hostName} or { }) hosts + ) definitions; + }; +} diff --git a/registry/address.nix b/registry/address.nix new file mode 100644 index 0000000..dab4003 --- /dev/null +++ b/registry/address.nix @@ -0,0 +1,4 @@ +{ lib }: +{ + type = lib.types.str; +}