swarm-ui: build authelia/grafana/metrics/logs links from swarm domains
The swarm-controller module builds the Authelia, Grafana, Metrics and Logs quick links from services.hyperhive.swarm.<service>.domain, on the controller's host, instead of each service module adding its entry only on the host that runs it. A controller whose swarm runs those services on other hosts lists them in its /api/links popover. Forge, matrix and bao links are not moved yet: forge waits on #4891, matrix and bao on whether their GUI gate becomes swarm-level. Refs #4885
This commit is contained in:
parent
f63ab954c9
commit
8628e0ecdd
7 changed files with 108 additions and 57 deletions
|
|
@ -95,6 +95,34 @@ let
|
|||
deploy.forgejo.mirrors = [ aMirror ];
|
||||
};
|
||||
|
||||
# The controller with every shared service on another host, and the same
|
||||
# controller hosting them all: the swarm UI's links must not tell the two
|
||||
# apart.
|
||||
controllerAlone = hive { deploy.swarm-controller.enable = true; };
|
||||
controllerWithServices = hive {
|
||||
deploy.swarm-controller.enable = true;
|
||||
deploy.allSwarmServices = true;
|
||||
};
|
||||
|
||||
# Each shared service with a web UI, and the link it must have: the label
|
||||
# and the swarm-level domain the URL is built from.
|
||||
swarmServiceLinkDomains =
|
||||
let
|
||||
s = controllerAlone.services.hyperhive.swarm;
|
||||
in
|
||||
{
|
||||
Authelia = s.authelia.domain;
|
||||
Grafana = s.grafana.domain;
|
||||
Metrics = s.victoriametrics.domain;
|
||||
Logs = s.victorialogs.domain;
|
||||
# forge: added once hive-forge/default.nix drops its per-host link
|
||||
# matrix: added once its GUI gate is settled
|
||||
# bao: added once its UI gate is settled
|
||||
};
|
||||
swarmServiceLinksOf =
|
||||
cfg:
|
||||
lib.filter (l: swarmServiceLinkDomains ? ${l.label}) cfg.services.hyperhive.swarm.controller.links;
|
||||
|
||||
# Every service container at once: the services-only host plus the CI
|
||||
# runner, the one container on a netns of its own.
|
||||
serviceContainersWithCi = hive {
|
||||
|
|
@ -194,6 +222,23 @@ let
|
|||
&& !(swarmServicesOnly.systemd.sockets ? hive-priv)
|
||||
&& !(s ? swarm-bao-queue-agent);
|
||||
}
|
||||
{
|
||||
# On a controller that runs none of them, so the link cannot come from
|
||||
# the service's own module.
|
||||
name = "the swarm UI links every shared service with a web UI at its swarm domain";
|
||||
ok =
|
||||
lib.listToAttrs (map (l: lib.nameValuePair l.label l.url) (swarmServiceLinksOf controllerAlone))
|
||||
== lib.mapAttrs (_: domain: "https://${domain}/") swarmServiceLinkDomains;
|
||||
}
|
||||
{
|
||||
# Exact list equality also catches an entry rendered twice where the
|
||||
# service runs on the controller's own host.
|
||||
name = "the swarm UI's service links are the same whichever host runs the services";
|
||||
ok =
|
||||
lib.length (swarmServiceLinksOf controllerAlone)
|
||||
== lib.length (lib.attrNames swarmServiceLinkDomains)
|
||||
&& swarmServiceLinksOf controllerWithServices == swarmServiceLinksOf controllerAlone;
|
||||
}
|
||||
{
|
||||
# The in-container option drives the container's firewall, and host
|
||||
# `false` with container `true` would let the container's
|
||||
|
|
|
|||
Loading…
Reference in a new issue