feat(reverse-proxy): derive backends from endpoints
This commit was merged in pull request #52.
This commit is contained in:
@@ -34,12 +34,15 @@ let
|
||||
) (builtins.readDir dir)
|
||||
);
|
||||
|
||||
specialArgs = {
|
||||
inherit inputs self;
|
||||
my = self.lib;
|
||||
networkFleetEndpoints = self.lib.networkEndpoints.collectFleetEndpoints self.nixosConfigurations;
|
||||
reverseProxyFleetRoutes = self.lib.reverseProxyRoutes.collectFleetRoutes self.nixosConfigurations;
|
||||
};
|
||||
specialArgs =
|
||||
let
|
||||
networkFleetEndpoints = self.lib.networkEndpoints.collectFleetEndpoints self.nixosConfigurations;
|
||||
in
|
||||
{
|
||||
inherit inputs networkFleetEndpoints self;
|
||||
my = self.lib;
|
||||
reverseProxyFleetRoutes = self.lib.reverseProxyRoutes.collectFleetRoutes self.nixosConfigurations networkFleetEndpoints;
|
||||
};
|
||||
|
||||
bridgeName = id: "br-vlan${toString id}";
|
||||
|
||||
|
||||
@@ -295,7 +295,12 @@ let
|
||||
};
|
||||
|
||||
modules.reverse-proxy.routes.${machineName} = lib.mkIf cfg.reverseProxy.enable (
|
||||
reverseProxyRoutes.routeFields cfg.reverseProxy
|
||||
reverseProxyRoutes.routeFields (
|
||||
cfg.reverseProxy
|
||||
// lib.optionalAttrs (cfg.reverseProxy.backend == null && cfg.reverseProxy.endpoint == null) {
|
||||
endpoint = "${config.networking.hostName}-${machineName}";
|
||||
}
|
||||
)
|
||||
);
|
||||
|
||||
assertions = [
|
||||
|
||||
@@ -37,10 +37,30 @@ let
|
||||
};
|
||||
|
||||
backend = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
type = lib.types.nullOr lib.types.str;
|
||||
default = null;
|
||||
description = "Full HTTP backend URL that receives proxied traffic.";
|
||||
};
|
||||
|
||||
endpoint = lib.mkOption {
|
||||
type = lib.types.nullOr lib.types.str;
|
||||
default = null;
|
||||
description = "Fleet network endpoint key used to derive the backend URL.";
|
||||
};
|
||||
|
||||
port = lib.mkOption {
|
||||
type = lib.types.nullOr (lib.types.ints.between 1 65535);
|
||||
default = null;
|
||||
example = 3923;
|
||||
description = "Backend TCP port used with the fleet network endpoint.";
|
||||
};
|
||||
|
||||
scheme = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
default = "http";
|
||||
description = "Backend URL scheme used with the fleet network endpoint.";
|
||||
};
|
||||
|
||||
tls = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = true;
|
||||
@@ -60,22 +80,45 @@ let
|
||||
aliases
|
||||
path
|
||||
backend
|
||||
endpoint
|
||||
port
|
||||
scheme
|
||||
tls
|
||||
websockets
|
||||
;
|
||||
};
|
||||
|
||||
endpointBackend = endpoints: route:
|
||||
let
|
||||
endpoint = endpoints.${route.endpoint} or (
|
||||
throw "Unknown reverse-proxy endpoint `${route.endpoint}`. Known endpoints: ${lib.concatStringsSep ", " (lib.attrNames endpoints)}"
|
||||
);
|
||||
in
|
||||
"${route.scheme}://${endpoint.address}:${toString route.port}";
|
||||
|
||||
resolvedRouteFields = endpoints: route:
|
||||
let
|
||||
routeWithBackend =
|
||||
if route.backend != null then
|
||||
route
|
||||
else if route.endpoint != null && route.port != null then
|
||||
route // { backend = endpointBackend endpoints route; }
|
||||
else
|
||||
throw "Reverse-proxy route `${route.host}${route.path}` needs either backend or endpoint plus port.";
|
||||
in
|
||||
routeFields routeWithBackend;
|
||||
|
||||
collectFleetRoutes =
|
||||
hosts:
|
||||
hosts: endpoints:
|
||||
lib.concatMapAttrs (
|
||||
hostName: host:
|
||||
lib.mapAttrs' (
|
||||
routeName: route: lib.nameValuePair "${hostName}-${routeName}" route
|
||||
routeName: route: lib.nameValuePair "${hostName}-${routeName}" (resolvedRouteFields endpoints route)
|
||||
) host.config.modules.reverse-proxy.routes
|
||||
) hosts;
|
||||
in
|
||||
{
|
||||
inherit collectFleetRoutes mkRouteOptions routeFields;
|
||||
inherit collectFleetRoutes mkRouteOptions resolvedRouteFields routeFields;
|
||||
|
||||
routeType = lib.types.submodule (
|
||||
{ name, ... }:
|
||||
|
||||
Reference in New Issue
Block a user