Flake attributes
Fediversity is split across per-directory flake entrypoints. This site documents
the core entrypoint (NixOS configurations, deployment packages and checks) and
the thin repo root (the cross-cutting infra checks). The api and panel
leaves document their own flake attributes in their own docs sites.
This page is generated from the core and root entrypoints themselves every
time the docs are built, so it always reflects the current outputs -- both the
lists at the end and the tables that describe the generated names. Descriptions
come from each attribute's meta.description; a few attributes that evaluate to
null (placeholder slots in a deployment group) are listed without one.
The naming grammar
core exposes on the order of a thousand packages, but they are not a thousand
separate things: they are a handful of axes crossed with each other. Every
generated attribute name follows one of four shapes.
<group>-<deployment-method>-<machine>[-<verb>] deployment packages
<group>-<effect>[-<verb>] standalone operator effects
<group>-<machine> nixosConfigurations
<name>[-<verb>] hand-bound standalone effects
The last shape is the exception. A handful of effects precede the deployment that would generate them, so they belong to no group and are written out by name. They are listed in full further down.
Read against that grammar:
hosting-provider-tf-incus-netboxdeploys thenetboxmachine of thehosting-providergroup with thetf-incusdeployment method: provision its Incus container and deploy onto it.operator-tf-incus-operator-all-plantakes theoperatorgroup, thetf-incus-operatordeployment method and thealltarget, and runs theplanverb: show what deploying every machine of the group would change, without doing it.hosting-provider-octodns-zone-applyruns theoctodns-zonestandalone effect for thehosting-providergroup with theapplyverb: publish the group's DNS records.operator-mastodonis the NixOS system configuration of theoperatorgroup'smastodonmachine -- the system the deployment attributes above build and activate.netbox-seed-planis the group-less NetBox seed with theplanverb: show what the seed would create in the NetBox a deploy then reads from.
all and combined
Besides its own machines, every group has two aggregate deploy targets:
alldeploys each machine of the group to its own host, in one run.combineddeploys the whole group as a single all-in-one host, with every service merged onto one machine.
combined is also a nixosConfiguration, but only for the groups that can
actually collapse onto one host; for the others there is no such system to
build, only the deploy targets listed above.
Apps and dev shells
apps.<name> mirrors packages.<name> one for one -- every deployment package
is also runnable directly:
nix run ./core#operator-tf-incus-operator-all-plan
devShells.<name> mirrors it as well (plus a default shell), dropping you
into an environment with that deployment's tooling on PATH:
nix develop ./core#operator-tf-incus-operator-all
Neither is enumerated on this page: the names are exactly the package names.
Getting the literal list
When you do need the flat enumeration rather than the pattern:
nix eval --json ./core#packages.x86_64-linux --apply builtins.attrNames
nix flake show ./core
Prefer the first: it forces only the attrset spine. nix flake show also
reports each attribute's type and description, which means building out every
one of the ~1400 deployment packages far enough to read its meta.
The legacyPackages output (the full nixpkgs package set) is omitted here.
Attribute families
Almost every attribute is generated: the grammar above is filled in from a handful of axes, listed below. These tables are generated from those same axes, so they always describe the current surface.
Groups and machines
A group is one deployment unit: a set of machines deployed together. Its roster splits those machines in two, and the split decides one thing: whether the machine gets a public identity. A published machine is given a record in the group's public zone and an ACME certificate for the names it serves; an internal machine is neither, and its peers reach it by its instance FQDN. Both kinds are deployed, both are allocated an address, and resource requests are gathered from both -- so moving a machine between the buckets changes its zone record and its certificate and nothing else.
That is deliberately not the application-versus-infrastructure distinction,
which lives on the component instead, as
components.<name>.optional. The two are separate because they
disagree, and because they are answered at different scales:
optional is true of mastodon in every group that runs it, while
publication is a property of one machine in one group, which is the only
place the answer can differ. They also cross. The hosting provider's garage,
openbao and netbox are infrastructure by any reading and every one of them
is published, because operator nodes and administrators dial them by name
from outside that group; an operator group's own valkey, authelia, smtp and
lldap are internal, reached only from within its deployment.
dev
Published machines:
dev2dev3dev4fediversity-ciforgejo
Deploy targets: the machines above, plus all, combined. NixOS configurations: the machines above.
hosting-provider
Published machines:
autheliabindgaragelldapnetboxopenbaootel-collectoroverviewpostgresqlsmtpspiretelemetryterraform-backendvalkeywindmill
Deploy targets: the machines above, plus all, combined. NixOS configurations: the machines above.
hypervisor
Published machines:
incus
Deploy targets: the machines above, plus all, combined. NixOS configurations: the machines above.
operator
Published machines:
mastodonpeertubepixelfed
Internal machines:
authelialldapsmtpvalkey
Deploy targets: the machines above, plus all, combined. NixOS configurations: the machines above.
Each machine above is named by just two things -- its group and its own name -- and those two generate all of its attributes:
nixosConfigurations.<group>-<machine> the system itself
packages.<group>-<deployment-method>-<machine> deploy that system
packages.<group>-<deployment-method>-<machine>-<verb> one per verb of it
So the operator group's mastodon machine is the operator-mastodon NixOS
configuration, deployed by operator-tf-incus-mastodon (and inspected with
operator-tf-incus-mastodon-plan, and so on). The nixosConfigurations are
not enumerated anywhere else on this page: the lists above already are that
enumeration.
Standalone effects
Effects are imperative actions exposed thru our CLI's nix run commands.
Stateful operations are typically run using
OpenTofu. If an effect uses NixOS configurations,
we call it a deployment method. Stand-alone efects are our lower-level
construct, that without being wrapped by setups have no notions of our
components.
| Effect | Setup | Groups | Verbs | What it does |
|---|---|---|---|---|
octodns-zone |
core/setups/tf-incus-hosts.nix |
hosting-provider |
validate, plan, sync, verify |
Publish the group's DNS records to its authoritative service (octodns-sync). |
tf-incus-image |
core/setups/tf-incus-image.nix |
dev (hand-bound), hosting-provider, hypervisor, operator |
the tofu verbs |
Run the tf-incus-image operator effect (OpenTofu apply). |
Hand-bound standalone effects
A few attributes are written out one by one in
core/render/catalog.nix's standaloneEffects instead of coming from a
group. Two of them are named for the dev group but are not generated
from it, and the third is named for no group at all, so its attribute is
the bare <name>, plus <name>-<verb> where the effect is an OpenTofu
graph.
What keeps them out of the cross-product is that each one precedes what
would generate it. The base image every Incus container is created from is
a prerequisite of the terraform-backend node itself, so it can keep no
state behind that node, and it is built from a fixed local-dev
configuration rather than a group's roster. The bootstrap that mints the
local-dev deployer's credentials is a shell runner and not an OpenTofu
graph, which is why it has no verbs. The NetBox seed creates the cluster
and the tag a tf-incus deploy then reads by name, so it cannot be one of
that deploy's own steps.
| Attribute | Built from | Verbs | What it does |
|---|---|---|---|
dev-tf-incus-bootstrap |
core/effects/tf/incus/common.nix |
none | Provision the local-dev deployer's incus credentials + image (writes the TF_VAR_* env file at OUT_TF_ENV). |
dev-tf-incus-image |
core/setups/dev-tf-incus-image.nix |
the tofu verbs |
Upload the local-dev Incus base image (OpenTofu apply). |
netbox-seed |
core/effects/tf/netbox/seed/effect.nix |
the tofu verbs |
Seed a NetBox instance with the cluster, cluster type and attribution tag the incus deploy reads (OpenTofu apply). |
Verbs
Every OpenTofu-backed deployment method also exposes one attribute per tofu
subcommand, appended to the deployment attribute name:
apply, destroy, plan, refresh, validate, output, show, state-list, state-show, import, force-unlock. The verb-less attribute runs the deployment
end to end; ssh has no verbs because it does not go through OpenTofu.
Deployment methods
A deployment method is an effect involving NixOS configurations. Setup modules
in core/setups/ wrap these to plug in given groups' NixOS configurations, so
that their exposed options may be serializable to facilitate UI generation
through JSON-Schema.
| Deployment method | Setup | Verbs | What it does |
|---|---|---|---|
k8s |
core/setups/k8s-hosts.nix |
the tofu verbs |
Deploy each node as a pod to a Kubernetes cluster through OpenTofu, from an image of its configuration, and roll back to the previous image if the pod does not become ready. |
migration |
core/setups/migration.nix |
none | Mint fresh migration snapshots on a running source's Incus containers; deploys nothing. |
ssh |
core/setups/ssh-hosts.nix |
none | Deploy to machines that already exist, over SSH (nixos-rebuild-style); provisions nothing. |
tf |
core/setups/tf-hosts.nix |
the tofu verbs |
Deploy to existing machines through OpenTofu, so the deploy is state-tracked and replayable. |
tf-incus |
core/setups/tf-incus-hosts.nix |
the tofu verbs |
Provision the group's Incus containers and deploy onto them, in one OpenTofu graph. |
tf-incus-operator |
core/setups/tf-incus-operator-hosts.nix |
the tofu verbs |
As tf-incus, and additionally handles domains/DNS by OpenProvider, and mints the group's per-tenant valkey/openbao resources; generated only for a group that runs an application. |
|
Environment variables
No deployment coordinate is written in the repository: which Incus host to
provision on, which NetBox holds the addresses, which DNS service serves
the zone and where the state lives are all read from the environment at
evaluation time, through core/lib/lib.nix's optionalEnv (the raw
string, or null when unset) and envOr (the JSON value, or a default).
That is what lets one code base deploy for more than one hosting provider:
the operator states the coordinates, and the same attribute builds a
different deployment.
An unset variable is not an error, unless its default below is "the deploy stops". Each reader turns it into "not stated", and the option behind it keeps its default -- so a deployment states only the coordinates that differ from the defaults.
Every variable below is declared as data, beside the reader that consumes
it (core/effects/env-config.nix for the methods, the pseudo-modules in
core/effects/common/ for the variables every method reads,
core/effects/common/standalone-env.nix for the standalone effects,
core/effects/common/node-identity.nix for the nodes). The same
declarations are published as core.lib.deployEnvKeys for the front-end to
forward, and the tables here are generated from them, so a reader that
gains a variable gains a row.
Read by every deployment method
| Variable | Default | Description |
|---|---|---|
ADMIN_EMAIL |
The option default. | The email addresses (;-delimited) deployments use as the administrative contact. |
ADMIN_USERS |
No administrator account, and root accepts the deploy key alone. |
The administrators of every node, as JSON: { "<name>": { "keys": [ "<ssh public key>" ], "hashedPassword": "<crypt hash>" } }. Each one gets a wheel account, and root accepts the keys of all of them. |
DNS_RESOLVERS |
Quad9 without filtering (fediversity.resolvers in core/setups/nixos/networking.nix). |
The recursive resolvers (space-separated IPv4 and IPv6 addresses) every node asks for names outside its own zone. |
ENVIRONMENTS |
Derived from the roster, with a HOSTING_CONFIG .environments section merged on top. |
JSON escape hatch that replaces the roster-derived environments set; a consumer override belongs on the extraModules rail instead. |
HOSTING_CONFIG |
No curation, so the operator form offers every leaf and no effect default is fixed. | Path to the file curating the operator deployment as data, in an .environments section and an .effect-defaults section (core/lib/hosting.nix). |
HOSTING_ENV_CONFIG |
No override: an in-tree run passes the same module through render's extraModules seam instead. |
Path to a .nix, .toml or .json file that render re-expresses as the environments module a hosting provider hooks its existing resources into. |
INTERNAL_HOSTS |
Derived from the group's roster, in the same way. | JSON map of app name to the internal FQDN the app answers at. |
OPERATOR_MODULE_SOURCE |
No separate pin, which is the common case. | A fetchTree-compatible JSON pin of a separately-pinned operator source, for the deploying-vs-deployed boundary. |
PUBLISHED_HOSTS |
Derived from the group's roster, scoped by the namespace where the group states fqdnFor. |
JSON map of app name to the public FQDN the app answers at. |
SELF_MODULE_SOURCE |
The source floats, which is acceptable for an unreproducible local build. | A fetchTree-compatible JSON pin of the repository's own revision, which freezes a deployment submitted with no module_source to it. |
SSH_PRIVATE_KEY_FILE |
No key file, so the deploy uses the deployer's own ssh configuration. |
Path on the deployer to the private key the deploy reaches the nodes with. |
VERSION_LAYERS |
provider. |
The newest-of-two decision for the contested layers (core/resources, core/effects), resolved by the caller and threaded in as JSON. |
Read by some deployment methods
| Variable | k8s |
migration |
ssh |
tf |
tf-incus |
tf-incus-operator |
|---|---|---|---|---|---|---|
ADMIN_SOURCES |
yes | -- | yes | yes | yes | yes |
BOOTSTRAP |
yes | -- | -- | yes | yes | yes |
CD_OIDC_ISSUER |
yes | -- | yes | yes | yes | yes |
CD_OIDC_REPOSITORY |
yes | -- | yes | yes | yes | yes |
DEPLOYER_IN_CLUSTER |
-- | -- | -- | -- | -- | yes |
DNS_API_TOKEN_FILE |
yes | -- | yes | yes | yes | yes |
DNS_DOMAIN |
yes | -- | yes | yes | yes | yes |
DNS_PROVIDER |
yes | -- | yes | yes | yes | yes |
DNS_SERVER_URL |
yes | -- | yes | yes | yes | yes |
DNS_TSIG_SECRET_FILE |
yes | -- | yes | yes | yes | yes |
INCUS_HOST_SSH_KEY_FILE |
-- | -- | -- | -- | yes | yes |
INCUS_HOST_SSH_OPTS |
-- | -- | -- | -- | yes | yes |
INCUS_HOST_SSH_USER |
-- | -- | -- | -- | yes | yes |
INCUS_NIX_SIGNING_KEY_FILE |
-- | -- | -- | -- | yes | yes |
INCUS_SHARED_STORE |
-- | -- | -- | -- | yes | yes |
K8S_NAMESPACE |
yes | -- | -- | -- | -- | -- |
K8S_REGISTRY |
yes | -- | -- | -- | -- | -- |
K8S_SPIRE_API_SERVER |
yes | -- | -- | -- | -- | -- |
KUBE_CONFIG_PATH |
yes | -- | -- | -- | -- | -- |
NETBOX_ALLOCATE_IPV4 |
-- | -- | -- | -- | yes | yes |
NETBOX_API_TOKEN_FILE |
-- | -- | -- | -- | yes | yes |
NETBOX_CLUSTER_NAME |
-- | -- | -- | -- | yes | yes |
NETBOX_CUSTOM_FIELDS |
-- | -- | -- | -- | yes | yes |
NETBOX_PREFIX_SELECTOR |
-- | -- | -- | -- | yes | yes |
NETBOX_RANGE_SELECTOR |
-- | -- | -- | -- | yes | yes |
NETBOX_SERVER_URL |
-- | -- | -- | -- | yes | yes |
NETBOX_TAGS |
-- | -- | -- | -- | yes | yes |
NETBOX_TENANT |
-- | -- | -- | -- | yes | yes |
OPENBAO_ADDR |
yes | -- | yes | yes | yes | yes |
OPENBAO_CACERT_FILE |
yes | -- | yes | yes | yes | yes |
OPENBAO_KV_MOUNT |
yes | -- | yes | yes | yes | yes |
OPENBAO_KV_PREFIX |
yes | -- | yes | yes | yes | yes |
OPENBAO_TOKEN_FILE |
yes | -- | yes | yes | yes | yes |
OPENPROVIDER_BASE_URL |
-- | -- | -- | -- | yes | yes |
OPENPROVIDER_PASSWORD |
-- | -- | -- | -- | -- | yes |
OPENPROVIDER_PASSWORD_FILE |
-- | -- | -- | -- | yes | -- |
OPENPROVIDER_USERNAME |
-- | -- | -- | -- | -- | yes |
OPENPROVIDER_USERNAME_FILE |
-- | -- | -- | -- | yes | -- |
OPERATOR_DNS_API_TOKEN_FILE |
yes | -- | yes | yes | yes | -- |
OPERATOR_DNS_PROVIDER |
yes | -- | yes | yes | yes | -- |
OPERATOR_DNS_SERVER_URL |
yes | -- | yes | yes | yes | -- |
OPERATOR_NETBOX_RANGE_SELECTOR |
yes | -- | yes | yes | yes | -- |
OPERATOR_REGISTRAR_AUTORENEW |
-- | -- | -- | -- | yes | -- |
OPERATOR_REGISTRAR_MAX_COST |
-- | -- | -- | -- | yes | -- |
OPERATOR_REGISTRAR_OWNER_HANDLE |
-- | -- | -- | -- | yes | -- |
OPERATOR_ZONES_MANAGER_TOKEN_FILE |
-- | -- | -- | -- | yes | -- |
OPERATOR_ZONES_PROVIDER |
-- | -- | -- | -- | yes | -- |
OPERATOR_ZONES_SERVER_URL |
-- | -- | -- | -- | yes | -- |
PUBLIC_UPLINK |
-- | -- | -- | -- | yes | yes |
PUBLIC_UPLINK_GATEWAY |
-- | -- | yes | -- | yes | yes |
PUBLIC_UPLINK_GATEWAY6 |
-- | -- | -- | -- | yes | yes |
PUBLIC_UPLINK_HOST_ADDRESS |
-- | -- | yes | -- | yes | -- |
PUBLIC_UPLINK_PARENT |
-- | -- | yes | -- | yes | yes |
REGISTRY_AUTH_FILE |
yes | -- | -- | -- | -- | -- |
SSH_NODES |
yes | -- | yes | yes | -- | -- |
SSH_USER |
yes | -- | yes | yes | -- | -- |
TF_BACKEND_HTPASSWD |
yes | -- | yes | yes | yes | -- |
TF_BACKEND_OPERATOR_PASSWORD_FILE |
-- | -- | -- | -- | yes | -- |
TF_HTTP_ADDRESS |
yes | -- | -- | yes | yes | yes |
TF_HTTP_PASSWORD |
yes | -- | -- | yes | yes | yes |
TF_HTTP_USERNAME |
yes | -- | -- | yes | yes | yes |
TF_VAR_namespace |
-- | -- | -- | -- | -- | yes |
What each of those variables is for, and what applies when it is not set:
| Variable | Default | Description |
|---|---|---|
ADMIN_SOURCES |
Permissive: a node publishes :22 instead of gating it, and the deployment has no operator lane. |
Comma-separated addresses or CIDRs, dual-stack, that every node admits to every port it serves. |
BOOTSTRAP |
The apply goes straight to the stated backend. | 1 selects the local-then-migrate state path in tf/common/bootstrap-apply.sh. |
CD_OIDC_ISSUER |
No CD role: the issuer and the repository are required together, and half a pair reads as none. | The forge Actions issuer whose CI may authenticate to this deployment's OpenBao. |
CD_OIDC_REPOSITORY |
No CD role: the issuer and the repository are required together, and half a pair reads as none. | The owner/name whose runs that role accepts. |
DEPLOYER_IN_CLUSTER |
Off: the deployer dials the routed address. | Whether the deployer runs inside the hosting provider's cluster, 1 or 0. On, it dials the provider's nodes at their bridge lease; off, at their routed address. |
DNS_API_TOKEN_FILE |
The option default, or a HOSTING_CONFIG effect-defaults leaf, which core/render/env.nix merges per leaf. |
Path on the deployer to that service's API token, read at run time so the token never reaches the store. For a desec apex, cd-env.sh sets it to the staged OPERATOR_ZONES_MANAGER_TOKEN. |
DNS_DOMAIN |
No zone, and with no zone there is nothing to publish. | The zone the deployment publishes its names in. |
DNS_PROVIDER |
The option default, or a HOSTING_CONFIG effect-defaults leaf, which core/render/env.nix merges per leaf. |
The octoDNS provider that reaches that service (powerdns, desec, ...). A desec apex is in the deSEC account of the operator lane. |
DNS_SERVER_URL |
The self-hosted path: the deployment's own bind node holds the zone. |
The authoritative-DNS API that serves the group's zone, with scheme, host and port; it also selects the external path. |
DNS_TSIG_SECRET_FILE |
The publisher reads the key out of the deployment's own KV, which is the ordering a cold walk needs. | Path on the deployer to the RFC2136 TSIG secret that authenticates a publish to the deployment's own named. |
INCUS_HOST_SSH_KEY_FILE |
The option default, or a HOSTING_CONFIG effect-defaults leaf, which core/render/env.nix merges per leaf. No key file reads as no way into the store. |
Path on the deployer to the private half of that identity, which also tells the operator lane it has a way into the store. |
INCUS_HOST_SSH_OPTS |
The option default, or a HOSTING_CONFIG effect-defaults leaf, which core/render/env.nix merges per leaf. core/effects/incus/run.sh applies its own defaults. |
Space-separated ssh options for that hop, such as a ProxyJump, a ConnectTimeout or a pinned host key. |
INCUS_HOST_SSH_USER |
The option default, or a HOSTING_CONFIG effect-defaults leaf, which core/render/env.nix merges per leaf. A provider deploying its own hypervisor reaches it as root, the identity it deployed it with. |
The user this deployer reaches the Incus host's filesystem as, which is what a shared-store node needs. |
INCUS_NIX_SIGNING_KEY_FILE |
The option default, or a HOSTING_CONFIG effect-defaults leaf, which core/render/env.nix merges per leaf. |
Path on the deployer to the key that signs the closures it copies into the Incus host's store. |
INCUS_SHARED_STORE |
Derived from whether INCUS_HOST_SSH_KEY_FILE names a way into the host's store. |
0 forces every container onto the image path; any other non-empty value forces the shared store. |
K8S_NAMESPACE |
fediversity. |
The kubernetes namespace of the deployment of the group. A deployment of one application uses <namespace>-<application>. |
K8S_REGISTRY |
None: the deploy stops. | The image registry, as host[:port][/path], that the deployer pushes the images of the nodes to and that the cluster pulls them from. |
K8S_SPIRE_API_SERVER |
The address in the kubeconfig of the deploy. | The address of the kubernetes API server as the spire node of the hosting provider reaches it, for the review of the tokens of the pods. |
KUBE_CONFIG_PATH |
The deploy cannot connect to the cluster. | The kubeconfig file of the cluster, which the hosting provider keeps as a secret. |
NETBOX_ALLOCATE_IPV4 |
The option default, or a HOSTING_CONFIG effect-defaults leaf, which core/render/env.nix merges per leaf. |
Whether a public node is allocated an IPv4 address from the NetBox pool, 1 or 0. Off, the deployment is IPv6-only, apart from an IPv4 address that a node's machines entry pins. |
NETBOX_API_TOKEN_FILE |
Resolves the token from OpenBao KV; TF_VAR_netbox_api_token wins over both. |
Path on the deployer to the NetBox API token, read at apply time so the token never reaches the store. |
NETBOX_CLUSTER_NAME |
The option default, or a HOSTING_CONFIG effect-defaults leaf, which core/render/env.nix merges per leaf. |
The NetBox cluster that holds this deployment's virtual machines, which is per-deployment: NetBox keys a virtual machine's uniqueness on cluster, tenant and name together. |
NETBOX_CUSTOM_FIELDS |
No custom fields. | JSON custom fields keyed by object kind then field name, for an instance that refuses a create without them; a literal $node becomes the node's name. |
NETBOX_PREFIX_SELECTOR |
The option default, or a HOSTING_CONFIG effect-defaults leaf, which core/render/env.nix merges per leaf. |
Which NetBox prefixes to allocate addresses from, as <kind>:<value> -- tag:<slug>, id:<n>[,<n>...] or cidr:<a.b.c.d/n>. A change applies only to new allocations: a node that has an address keeps it. |
NETBOX_RANGE_SELECTOR |
The option default, or a HOSTING_CONFIG effect-defaults leaf, which core/render/env.nix merges per leaf. |
Which NetBox IP ranges to allocate from, in the same <kind>:<value> shape. A change applies only to new allocations: a node that has an address keeps it. |
NETBOX_SERVER_URL |
Discovers the self-hosted node's URL from published TF state, which exists from the second apply onward. | The NetBox API, with scheme, host and port. |
NETBOX_TAGS |
The option default, or a HOSTING_CONFIG effect-defaults leaf, which core/render/env.nix merges per leaf. [] stays distinct from unset. |
JSON list of the tags the deploy puts on the objects it creates. |
NETBOX_TENANT |
The option default, or a HOSTING_CONFIG effect-defaults leaf, which core/render/env.nix merges per leaf. |
The NetBox tenant that owns this deployment's objects, which separates two deployments sharing one cluster. |
OPENBAO_ADDR |
The deployer reads nothing back from KV, and an effect skips the records that would have come from it. | The deployment's own OpenBao, with scheme, host and port. |
OPENBAO_CACERT_FILE |
The option default. | Path on the deployer to the CA certificate that validates that OpenBao. |
OPENBAO_KV_MOUNT |
The option default. | The KV mount the nodes' vars-openbao writes under. |
OPENBAO_KV_PREFIX |
The option default. | The path prefix inside that mount. |
OPENBAO_TOKEN_FILE |
The option default. | Path on the deployer to the OpenBao token, read at run time so no token value reaches the store. |
OPENPROVIDER_BASE_URL |
The production API. | The Openprovider API, with scheme, host and port. |
OPENPROVIDER_PASSWORD |
The operator deploy registers no domain. | The registrar account's password, taken from the environment by the same provider. |
OPENPROVIDER_PASSWORD_FILE |
The option default. | Path on the deployer to the account's password, staged by cd-env.sh. |
OPENPROVIDER_USERNAME |
The operator deploy registers no domain. | The registrar account's user name, which the openprovider provider takes from the environment (operator/registrar.tf). |
OPENPROVIDER_USERNAME_FILE |
The option default. | Path on the deployer to the account's user name, staged by cd-env.sh. |
OPERATOR_DNS_API_TOKEN_FILE |
The option default. | Path on the deployer to that service's API token, which the provider's deploy publishes to KV for the front-end node to forward. |
OPERATOR_DNS_PROVIDER |
The option default. | The octoDNS provider that reaches that service. |
OPERATOR_DNS_SERVER_URL |
The curation follows the provider's own dns result. |
The DNS API that operator deploys publish their app names to, when that is not the provider's own service. |
OPERATOR_NETBOX_RANGE_SELECTOR |
The curation hands the operators the provider's own NETBOX_RANGE_SELECTOR, and both groups draw on one pool. |
The NetBox IP range that operator deployments allocate public addresses from, as <kind>:<value>, when that is not the range the provider's own nodes draw on. Must match one range per address family the deployment allocates. |
OPERATOR_REGISTRAR_AUTORENEW |
A registration lapses at its expiry. | true to let the registrar renew a registration at its expiry, at the renewal price of the extension. OPERATOR_REGISTRAR_MAX_COST does not apply to a renewal. A destroy of the deployment turns the renewal off. |
OPERATOR_REGISTRAR_MAX_COST |
Operator deploys register no domain. | The switch for operator domain registration, and the bound in EUR cents on any one registration. |
OPERATOR_REGISTRAR_OWNER_HANDLE |
The option default. | The registrar account contact that a registration names as the owner. |
OPERATOR_ZONES_MANAGER_TOKEN_FILE |
The option default. | Path on the deployer to the token of that zone service, staged by cd-env.sh. The token must be able to create domains. |
OPERATOR_ZONES_PROVIDER |
The provider's named holds the registered domains. |
The zone service that holds the registered domains in place of the provider's named: desec. |
OPERATOR_ZONES_SERVER_URL |
https://desec.io. |
The API of that zone service, with scheme and host, and without the /api/v1 path. |
PUBLIC_UPLINK |
nat: an alias on a NAT-only bridge, delivered nowhere. |
How a public address reaches a container: nat or bridged (the segment is on PUBLIC_UPLINK_PARENT). |
PUBLIC_UPLINK_GATEWAY |
The option default. | The IPv4 first hop for addresses on the public segment. |
PUBLIC_UPLINK_GATEWAY6 |
The option default. | The IPv6 first hop for addresses on the public segment. |
PUBLIC_UPLINK_HOST_ADDRESS |
The bridge stays addressless, the shape the test suite and CI get. | The address the bridging host answers on, as a CIDR whose prefix length tells the kernel which neighbours are on-link. |
PUBLIC_UPLINK_PARENT |
The option default. | The host interface that carries the public segment. |
REGISTRY_AUTH_FILE |
The deploy pushes without credentials. | The credentials of the registry, in the containers-auth.json format. |
SSH_NODES |
No override: each node uses the base identity at its roster FQDN. | JSON map {defaults, nodes.<name>} of the SSH identity of each node, over SSH_USER and SSH_PRIVATE_KEY_FILE; a null field inherits the layer below. |
SSH_USER |
root. |
The user the deploy reaches every node as, below the SSH_NODES layers. |
TF_BACKEND_HTPASSWD |
The group data tfBackendHtpasswd; with no value, the evaluation of the state backend node stops. |
The credentials of the deployers at the front of the state backend, one <user>:<bcrypt hash> line for each of cd, operator and each workstation-<person>, with <person> in [a-z0-9]. |
TF_BACKEND_OPERATOR_PASSWORD_FILE |
The deploy publishes no password, and the front refuses the operator deploys. | Path on the deployer to the password of the operator deployer at the front of the state backend, staged by cd-env.sh. The deploy publishes it to KV for the api. |
TF_HTTP_ADDRESS |
http://localhost:8080/state/project1/example, unpinned: the migrate derives the reachable incus-bridge lease. |
The HTTP backend that holds the deployment's OpenTofu state, with scheme, host and port. |
TF_HTTP_PASSWORD |
fake-secret, which the front refuses. |
The password of that deployer at the front of the state backend. |
TF_HTTP_USERNAME |
basic, which the front refuses. |
The deployer that the front of the state backend authenticates: cd, workstation-<person> or operator. |
TF_VAR_namespace |
Un-namespaced, which is what the hosting provider's own graph and grants use. | The deployment id an operator apply is scoped with, which names its instances, buckets and KV paths. |
Read by the standalone effects
An effect projected out of a deployment's setup reads that deployment's
coordinates, because it acts on exactly what the deployment allocated. An
effect with none of its own is built from stated values. These are the
variables each attribute reads: most of them at evaluation, and the
switches of the octodns-zone verbs and the inputs of
dev-tf-incus-bootstrap at run time.
| Effect | Variables |
|---|---|
octodns-zone |
the tf-incus set, plus OCTODNS_KV_TXT_OPTIONAL, OCTODNS_NO_WITHDRAWALS |
tf-incus-image |
TF_INCUS_IMAGE_ALIAS, TF_INCUS_IMAGE_NODE, TF_INCUS_IMAGE_STATE |
dev-tf-incus-bootstrap |
IMAGE_FLAKE, INCUS_CONFIG_DIR, OUT_TF_ENV |
dev-tf-incus-image |
none |
netbox-seed |
NETBOX_API_TOKEN_FILE, NETBOX_CLUSTER_NAME, NETBOX_CLUSTER_TYPE_NAME, NETBOX_SEED_STATE, NETBOX_SERVER_URL, NETBOX_TAGS, NETBOX_TENANT |
What each of those variables is for, and what applies when it is not set:
| Variable | Default | Description |
|---|---|---|
IMAGE_FLAKE |
., the flake in the working directory. |
The flake reference the runner builds dev-tf-incus-image from. |
INCUS_CONFIG_DIR |
None: the runner stops at once. | The directory the image upload writes its incus client certificate and key to. The runner writes it to the env file as TF_VAR_incus_config_dir. |
NETBOX_API_TOKEN_FILE |
The effect's own default (core/effects/tf/netbox/seed/effect.nix). |
The file holding the API token the seed authenticates with. |
NETBOX_CLUSTER_NAME |
The effect's own default (core/effects/tf/netbox/seed/effect.nix). |
The cluster the deploy files its virtual machines under. |
NETBOX_CLUSTER_TYPE_NAME |
The effect's own default (core/effects/tf/netbox/seed/effect.nix). |
The type of the cluster the seed creates. |
NETBOX_SEED_STATE |
A keyed local file. | Names the HTTP backend the seed keeps its state in -- not TF_HTTP_ADDRESS, which is the deploy's own state key. |
NETBOX_SERVER_URL |
None: the seed still evaluates and tofu fails on the empty URL, rather than contacting some default host. |
The NetBox instance the seed creates its objects in. The one required coordinate. |
NETBOX_TAGS |
The effect's own default (core/effects/tf/netbox/seed/effect.nix). |
The attribution tags the seed creates, as a JSON array. JSON rather than a separated list, because the empty list has to be expressible: an instance whose token may not create tags needs NETBOX_TAGS='[]', distinct from an unset variable. |
NETBOX_TENANT |
The effect's own default (core/effects/tf/netbox/seed/effect.nix). |
The tenant that scopes the deploy's virtual machines within the cluster. |
OCTODNS_KV_TXT_OPTIONAL |
With KV coordinates stated, the verb fails on a KV-sourced record whose value it cannot read, after it processes all records. | When 1, a KV-sourced record whose value the verb cannot read is skipped, and the verb continues with the other records. |
OCTODNS_NO_WITHDRAWALS |
The plan keeps its deletes. | When not empty, the no-withdrawals processor removes each delete from the plan and names it, so a publish leaves standing a record that an earlier publish wrote. |
OUT_TF_ENV |
None: the runner stops at once. | The path the runner writes the TF_VAR_* env file to. The incus deploy loads this file. |
REGISTRAR |
The whole registrar surface is absent -- a deployment whose apex somebody else registered has no such effect to offer. | Names the registrar the applies act on. |
REGISTRAR_DNSKEY |
No DNSKEY, for the reason REGISTRAR_DS has none. |
The same key as REGISTRAR_DS, in the form a registry takes when it derives the DS itself, which INWX and Openprovider both do. |
REGISTRAR_DS |
No DS, which keeps the publish behind the mint: a DS naming a key nobody holds is the whole domain SERVFAIL. |
The apex DS, read off the node that holds the key (/var/lib/named/<domain>.ds, written by named-apex-ds). |
REGISTRAR_MAX_COST |
The registration is off the surface and the rest stays. | The spending bound, in US cents. An apply that spends money is asked for by stating the ceiling it refuses itself above; the records under an already-registered domain cost nothing. |
REGISTRAR_OWNER_HANDLE |
No owner is stated. | The contact a registration is held by, as a handle made once in the registrar's account. A handle rather than the person: an owner held as data would put a name, an address and a telephone number into the module and into the state file. |
REGISTRAR_STATE |
The whole surface is absent, as for REGISTRAR itself, rather than falling back to a local file. There is no local key per leaf -- every generated module keys as generated-module -- so a fallback would put all four applies in one state file. |
Names the HTTP backend these applies keep their state in, as NETBOX_SEED_STATE does for the seed -- not TF_HTTP_ADDRESS, which is the deploy's own state key. Each leaf derives its own key from it, so the registration and the records under it are separate applies (setups/hosts-common.nix). |
TF_INCUS_IMAGE_ALIAS |
The effect's own default name. | The alias the built image is filed under. |
TF_INCUS_IMAGE_NODE |
No node: the image holds no node configuration. | Which node to put in the image. |
TF_INCUS_IMAGE_STATE |
A keyed local file, because the upload of a fresh provider occurs before its TF backend exists. | The address of the HTTP backend that keeps the state of the upload. This is not TF_HTTP_ADDRESS, which is the state of the deploy. CD sets it, because a runner keeps no local file from one run to the next. |
Read by a deployed node
A node's own closure reads a second, smaller set, outside any method's reader: the names and addresses it has to know about itself and its peers. These are inputs to the system it builds, so changing one rebuilds the node.
| Variable | Default | Description |
|---|---|---|
ADMIN_EMAIL |
The option default. | The email addresses (;-delimited) deployments use as the administrative contact. |
ADMIN_USERS |
No administrator account, and root accepts the deploy key alone. |
The administrators of every node, as JSON: { "<name>": { "keys": [ "<ssh public key>" ], "hashedPassword": "<crypt hash>" } }. Each one gets a wheel account, and root accepts the keys of all of them. |
BIND2_IPV4 |
No second nameserver, so the fleet keeps one. | The IPv4 address of a second nameserver node (ns2); a stated address is what makes the group stand that node up. |
BIND2_IPV6 |
The second nameserver answers on IPv4 alone. | The IPv6 address of the second nameserver node. |
BIND_IPV4 |
None for a deploy; an eval without one takes the documentation address 192.0.2.53 (core/setups/groups/hosting-provider.nix). |
The IPv4 address of the first nameserver node (ns1), which NetBox allocates and the zone publishes. |
BIND_IPV6 |
None for a deploy; an eval without one takes the documentation address 2001:db8::53. |
The IPv6 address of the first nameserver node (ns1). |
DEPLOYMENT |
The baked default-configuration stands, which is the hosting provider's own deploy. |
The JSON deployment that a front-end submits, which merges over the baked default-configuration when the deploy shell is evaluated to give the applications, the domain and the contact address. |
DNS_APEX_NAMESERVERS |
The group's own nameserver nodes, so the zone delegates to ns1.<domain>. and to ns2.<domain>. where that node stands up. |
Comma-separated FQDNs the self-held zone publishes as its apex NS set, and an Openprovider registration hands its delegation to. |
DNS_DOMAIN |
No zone, and with no zone there is nothing to publish. | The zone the deployment publishes its names in. |
DNS_RESOLVERS |
Quad9 without filtering (fediversity.resolvers in core/setups/nixos/networking.nix). |
The recursive resolvers (space-separated IPv4 and IPv6 addresses) every node asks for names outside its own zone. |
DNS_SECONDARIES |
No outside secondary, so the zone grants no transfer key and notifies the group's own nameservers alone. | Comma-separated <tsig key name>=<address>[+<address>] entries for the outside secondaries that transfer the self-held zone. |
DNS_SECONDARIES_BY_ADDRESS |
Each secondary transfers with its key. | The subset of the DNS_SECONDARIES key names that transfers by address, for an incumbent that cannot hold a TSIG key. |
DNS_SIGN_APEX |
The apex is served unsigned, and its DS waits for the registrar hand-off. |
Set to 1 to sign the self-held apex with DNSSEC; the key is minted as soon as the apex is ours, whatever this states. |
HOSTING_ENV_CONFIG |
No override: an in-tree run passes the same module through render's extraModules seam instead. |
Path to a .nix, .toml or .json file that render re-expresses as the environments module a hosting provider hooks its existing resources into. |
OPERATOR_MODULE_SOURCE |
No separate pin, which is the common case. | A fetchTree-compatible JSON pin of a separately-pinned operator source, for the deploying-vs-deployed boundary. |
SELF_MODULE_SOURCE |
The source floats, which is acceptable for an unreproducible local build. | A fetchTree-compatible JSON pin of the repository's own revision, which freezes a deployment submitted with no module_source to it. |
VERSION_LAYERS |
provider. |
The newest-of-two decision for the contested layers (core/resources, core/effects), resolved by the caller and threaded in as JSON. |
How many attributes each family contributes
| Family | Shape | Attributes |
|---|---|---|
| Deployment runs | <group>-<deployment-method>-<machine> |
189 |
| Deployment verbs | <group>-<deployment-method>-<machine>-<verb> |
1287 |
| Standalone effects | <group>-<effect>[-<verb>] |
41 |
| Hand-bound standalone effects | <name>[-<verb>] |
25 |
| Other packages | (no pattern; listed below) | 18 |
| Total | packages |
1560 |
Other packages
- applications-catalog: What the components an operator deploys are called and look like.
- configuration-renames: The operator form's structured option-rename table (
{ from; to; }entries), for migrating a stored configuration across renames. - core-docs: Generate static site docs of nix options
- deployment-attributes: JSON list of the deployment attributes (
<group>-<effect>-<machine>) this source exposes, for a detect-at-submit guard. - frontend-configuration-schema: The front-end configuration JSON schema (the operator form that a front-end renders and validates against).
- garage-runtime-provider-schema
- incus-runtime-provider-schema
- inwx-provider-schema: The pinned INWX provider's resource schemas, filtered to the types the
tf-inwx-*effects wrap. - lldap-runtime-provider-schema
- netbox-provider-schema: The pinned NetBox provider's resource schemas, filtered to the types the
tf-netbox-*effects wrap. - openbao-runtime-provider-schema
- openprovider-provider-schema: The pinned Openprovider provider's resource schemas, filtered to the types the
tf-openprovider-*effects wrap. - porkbun-provider-schema: The pinned Porkbun provider's resource schemas, filtered to the types the
tf-porkbun-*effects wrap. - postgresql-runtime-provider-schema
- provider-application-schemas: JSON object of the schema of each application of
provider-configuration-schema, keyed by the application name. Each schema validates a value for its application without the full schema. - provider-configuration-schema: The operator form's JSON schema as the provider validates submissions against it:
frontend-configuration-schemawith this build'sPIN_EFFECTcollapse andHOSTING_CONFIGleaf prune applied. - renames-log: Regenerate
core/renames-log.json: the committed log of every option rename this tree has declared, so one retired from the pinned tree still migrates. - settings-rename-candidates: Rank which added key each key a pinned upstream JSON Schema dropped most likely became, and emit the
settings-renames.jsonentries that would carry a stored value across.
Checks
- applications-catalog: Hold the applications catalog to its index: every component has the artwork the index names.
- apps-tf: Deploy all services via OpenTofu and verify the result.
- apps-tf-incus: Deploy all services via OpenTofu into Incus containers and verify.
- contracts-chaining: NixOS test: contract chaining (multiple providers in sequence).
- contracts-credential-environmentfile: NixOS test pinning that a systemd credential cannot be consumed as an
EnvironmentFile=. - contracts-credentials-creds-openbao-ordering
- contracts-credentials-hardcoded-credential: NixOS test:
credentialscontract with hardcoded-credential provider. - contracts-creds-openbao
- contracts-cross-node: NixOS test: cross-node contract evaluation.
- contracts-filebackup-hardcoded-file-backup: NixOS test: file-backup contract with hardcoded provider.
- contracts-filebackup-restic: NixOS test: file-backup contract with the restic provider, on a local repository.
- contracts-filesecrets-hardcoded-secret: NixOS test:
fileSecretscontract with hardcoded-secret provider. - contracts-generatefiles-vars: NixOS test:
generateFilescontract withvarsprovider. - contracts-generatefiles-vars-independent: NixOS test:
generateFilesinstance growing a file withindependent = true. - contracts-generatefiles-vars-openbao: NixOS test:
generateFilescontract withvars-openbaoprovider. - contracts-ldap-lldap: NixOS test of the lldap-backed
ldapcontract provider. - contracts-ldap-openldap: NixOS test:
ldapcontract with the openldap reference provider. - contracts-oidc-dex: NixOS test:
oidccontract with the dex reference provider. - contracts-postgresql: NixOS test of the postgres-backed
postgresqlcontract provider. - contracts-postgresql-rotation
- contracts-redis-valkey:
rediscontract behavior test with the referencevalkeyprovider (ACL-isolated namespaces). - contracts-s3-garage: NixOS test:
s3contract with the garage reference provider. - contracts-secrets-openbao: NixOS test: the
secrets-openbaoenvSecrets/fileSecretsproviders. - contracts-smtp-maddy:
smtpcontract behavior test for the maddy-backed relay provider. - contracts-smtp-opensmtpd: NixOS test:
smtpcontract with the opensmtpd reference provider. - contracts-ssl-self-signed: NixOS test: SSL contract with self-signed provider.
- contracts-streamingbackup-hardcoded: NixOS test: streaming-backup contract with hardcoded provider.
- contracts-streamingbackup-restic: NixOS test: streaming-backup contract with the restic provider, on a local repository.
- core-docs: Generate static site docs of nix options
- deployment-cd-env-credentials: Unit-test the private directory CD stages credentials into and its lifetime, which is what keeps a deployer credential off a shared runner's disk past the job.
- deployment-cd-env-host-key: Unit-test the hypervisor host-key pin CD stages, which is what keeps a shared-store deploy from trusting whatever answers on the address.
- deployment-cd-env-incus-identity: Unit-test the shared-store identity CD stages, which is what a deploy of a hosting provider's containers lands each closure over.
- deployment-cd-env-kv: Unit-test the KV read CD stages coordinates by, which is the one path every value read back out of a deployment's own OpenBao takes.
- deployment-cd-env-oidc: Unit-test the OIDC exchange CD mints its deployer token by, which is what keeps every deployer credential short-lived and off the forge, and the SSO login a workstation mints it by.
- deployment-cd-env-profile: Unit-test the profile dispatch of the CD coordinate staging: which coordinates each profile trims and which it refuses to deploy without.
- deployment-domain-claim-probe: Unit-test the read of the operator lane's domain ledger, which decides whether a deploy registers a name, adopts it, or refuses.
- deployment-eval-cache: Unit-test the record that lets the seed pass and the deploy pass of one node share a single NixOS evaluation, the key material that must make that record miss, and the SBOM build that the deploy starts and collects.
- deployment-k8s-hosts: NixOS test of the
k8s-hostsdeploy method: it pushes the image of one node to a registry, applies the Deployment to k3s with OpenTofu, keeps the address of the pod oneth0, lets only pods in the namespace of the target connect to the node, keeps/var/libon a volume and the machine ID from the pod, has no changes to plan after, and sets the Deployment back to the previous image when the new pod does not become ready, with the state and the machine ID of the node. - deployment-migration-quiesce: Unit-test the quiesce of the export of a migration: the services of each node stop before the first mint, and a failed export starts them again.
- deployment-nixos-hosts: Sanity-check direct NixOS deployment of a trivial host.
- deployment-registrar-domains: Unit-test the read of the domains of the registrar account, which gives the alert rules the expiry, the renewal and the holder of each domain.
- deployment-registrar-transfer: Unit-test the command that gives the auth code of a domain of the registrar account for a migration, and that makes the code invalid again.
- deployment-remote-path-fallback: Unit-test the
PATHfallback a remote command carries, which is what reaches a node whose ownPATHresolves nothing. - deployment-ssh-host-key: Unit-test the host-key options of the SSH deploy, which are what make a deploy refuse a node that shows a different key.
- deployment-ssh-hosts: Sanity-check SSH-based deployment of a trivial host to two targets that take a login only on a port that is not 22: the deploy reaches one target through the
sshOptsof its ownSSH_NODESentry and the other throughSSH_CONFIG_FILE, and accepts only the pinned host key of each target. - deployment-ssh-recovery
- deployment-tf-hosts: Sanity-check OpenTofu deployment of a trivial host.
- deployment-tf-hosts-bootstrap: Graceful fresh-provider TF-backend bootstrap (local-then-migrate, #336/#882).
- deployment-tf-incus-decisions: Plan the incus graph with mocked providers and assert on what it decides from its tfvars: the shared store only for a container, from the stub image and with no
shift, the form of the public NICeth1per uplink mode, and the NetBox records only for the nodes withneeds_public_ip. - deployment-tf-incus-hosts: Sanity-check OpenTofu deployment into Incus containers.
- deployment-tf-incus-operator: Run the operator graph's garage/OpenBao half: mint a namespace's cache-backup bucket and key, and a media bucket with CORS rules, on a shared garage node, check the CORS rules, publish the pair into OpenBao KV over the
:8200TLS listener, then destroy and check that the buckets and the deployment's KV are gone. - deployment-tf-incus-operator-decisions: Plan the operator graph with mocked providers and assert on what it decides from its tfvars: the plan fails when the NetBox prefix of the operator deployments on the bridge is not the prefix of the firewall gate of the hosting provider, the bridge ACL limits each node of the hosting provider with a known address to its own ports and fails on an address outside the prefix of the hosting provider, and the plan selects the registrar resources from the domain registration, the claim in KV and the state of the name at the registrar, and
suspended,migration_exportedand the DNS lane decide the hold of the zone, the resume gate, the migration marker, the records, and the start or stop of the instances, and the graph publishes a garage key to KV with write-only arguments whose version comes from the key ID. - deployment-tf-self-state-reachable: Unit-test the netbox self-state reachability probe (fresh-provider DHCP fallthrough, #833/#882).
- deployment-tld-handles-probe: Unit-test the read of which contact roles a domain's extension has at Openprovider, which decides the contacts the operator lane's registration names, and of whether the account holds the nameserver group the registration names, which decides whether the deploy adopts the group or creates it.
- deployment-unit-parsers: Unit-test the readers of the shared deploy body that turn
systemctloutput into unit sets, ages, periods and verdict inputs. - deployment-verdict-chain: NixOS test of the secret-chain gate a verdict-only pass runs before judging, through an SSH deploy of one host: it waits for the chain to converge, gives up early on a member that took its terminal branch or stopped moving, names the member at fault, and sweeps only once the chain is up.
- deployment-verdict-failed: NixOS test of the deploy verdict's failed-unit reading, through an SSH deploy of one host: a deploy that leaves a unit failed exits non-zero and names it, on this apply and on the next;
DEPLOY_STRICT_UNITS=0keeps the name and drops the exit code; a verdict-only pass judges the node without deploying to it; the sweep revives a unit parked instart-limit-hitonce what it waited for has arrived; and a verdict-only pass does the reloads, restarts and starts an interrupted switch left in/run/nixos, unless a switch holds the lock. - deployment-verdict-loop: NixOS test of the deploy verdict's restart-loop watch, through an SSH deploy of one host: a loop is reported without failing a deploy, a verdict-only pass fails every loop still attempting in windows sized from the widest declared
RestartSec, a declaredDEPLOY_LOOP_BUDGETdelays that verdict and never lifts it, the one loop no window can measure is forgiven out loud, a start job is judged by its age, a unit cycled by something other than systemd is named with no restart to show for it, and a unit systemd retries is not named there but given to the loop watch. - deployment-verdict-spawn: NixOS test of the deploy verdict's host spawn fault reading, through an SSH deploy of one host: a unit the manager never spawned is named without blaming the closure, a
Result=resourceswith nothing said about spawning keeps its ordinary attribution, and a verdict-only pass retries the fault and reports the recovery. - deployment-zone-keys-probe: Unit-test the read of the key-signing keys of a zone that deSEC holds, which a registration hands the registry for the
DSrecords of the delegation: the operator lane's, with the token of the zone read from the KV subtree of the deployment, and the apex's, with the token read from the file the deploy names. - integrations-acme-rate-limit: NixOS test of
core/setups/nixos/acme-rate-limit: a stub ACME server refuses each order withrateLimitedand aRetry-After. The boot completes asdegraded, the order unit isfailedwith status 75, and the end of the limit is in the state directory and in the gaugeacme_rate_limited_until_seconds. A start before that time sends no order, and the transient retry timer orders again when the limit ends. An order that fails for another reason removes the limit, the gauge and the timer. - integrations-apex-key-mint: Runs the apex signing key's
generateFilesgenerator under exactly the PATH the vars backend gives it --unset PATH; PATH=<runtimeInputs>, which REPLACES the environment rather than prepending to it -- and asserts it emits a DNSKEY plus a state file carrying theKSK:/ZSK:rolesdnssec-policyadopts a key by. Every other assertion about this generator is made against its text, and a generator whose declared inputs do not cover its script is invisible to those: it fails only when it runs, as exit 127 on the node. - integrations-audit-shipper-series: NixOS test of the guard on the version of the OpenTelemetry collector of the audit shipper: a node with no record records the version of the package without a copy, an upgrade copies the state directory while the shipper is stopped and keeps only that copy, a downgrade is refused with exit status 78 until the copy is put back, after which the lines in the queue and the lines after the cursor of the copy arrive, and an upgrade without room for the copy is refused with exit status 78.
- integrations-authelia-series: NixOS test of the guard on the version of authelia: a fresh installation records the version of the package without a dump, an upgrade dumps the database through the backup command of the
streamingBackupcontract and keeps only that dump, and a downgrade is refused with exit status 78 while authelia stays stopped and the data stays. - integrations-await-incus-static-address:
await-incus.shrestarts the DHCP client of a running guest that does not have the staticeth0address of its NIC. - integrations-bind-series: NixOS test of the guard on the version of BIND: a node with no record records the version of the package without a copy, an upgrade copies the state directory while named is stopped and keeps only that copy, a downgrade starts named with a warning and records the older version, and an upgrade without room for the copy is refused with exit status 78 while the zone stays.
- integrations-boot-counting: NixOS test of the boot counting of
core/setups/nixos/boot.nix: the first boot of a host is counted, andsystemd-bless-bootmarks its entry good only afterboot-check-gatewaygets an answer from the default gateway. A new generation whose gateway does not answer fails its check, reboots, and afterbootCounting.triesboots systemd-boot boots the good generation again, on which the check does not run. PID 1 arms the emulated hardware watchdog. A generation whose check waits for a unit that never gets ready reboots at the job timeout ofboot-complete.target, and systemd-boot then boots the good generation. - integrations-bootstrap-backup: NixOS test that the bootstrap backups restore on the node that made them and on a new node: the raft snapshot of OpenBao with its escrowed unseal key, and the states of the terraform backend with their
kmsKey. On a new node the restore without the key fails with a hint, and with the key that an admin decrypts and adds to the archive it gives the data of the old node. OpenBao seals the restored key to the new TPM, thus it unseals after a reboot. - integrations-bridge-dns: NixOS test that the incus bridge dnsmasq, holding the deployment apex authoritatively, answers a served alias with an ADDRESS rather than a bare CNAME: a node's own lease under its instance FQDN, an alias onto that lease, a bucket under the garage wildcard, and the UI name that has no lease of its own; with a name it holds no record for still refused rather than forwarded. Every served domain of a deployment is such an alias, and a reply carrying the CNAME alone reads to a stub resolver as no such host -- which is what the hypervisor's own OIDC discovery fetch failed on.
- integrations-cd-jwt-login: NixOS test that CD can actually log in as the deployer: a stand-in forge publishes an OIDC discovery document and a JWKS over TLS and signs Actions-shaped tokens, and the
fediversity-deployerrole admits a run of this repository on the deploy ref with the deployer policy attached. Nothing else in the tree performs this login, so a broken role write -- a map-typedbound_claimssent as a string, or abound_subjecta later partial update left stale -- is an error no evaluation, plan or deploy verdict can see, and it deadlocks CD. The refusals are asserted too, a role that admits everything being the other way this write goes wrong: apull_requestrun, a run on another branch, a run of another repository on the same forge, and a token minted for another audience all fail to authenticate. - integrations-cold-start: NixOS test that a node deployed before its spire-server and OpenBao PKI exist still finishes activating: the cold-start fetches give up on a name that does not resolve, and the units waiting on them land in
failedrather than holdingswitch-to-configuration's lock open forever, whilespire-agentis left restarting on purpose -- its cold-start cycle is measured against the start-limit window, because a limit narrow enough to fire here would also cut off a deployment that is merely still converging. Also that the node keeps a usable trust store while its CA is absent, folds one in unattended when it lands, and re-runs the CA fetch on a timer rather than giving it a single attempt. - integrations-destroy-detaches-state: A
destroyof a graph that deploys its own state backend migrates the state down to the deployer first, so the teardown reaches the resources the backend node's death would otherwise strand. - integrations-destroy-reports-left-behind: A failed destroy step of
bootstrap-apply.shdoes not stop the run, and makes it list the object and exit 4. In an apply, the same failure is not listed and the apply stays green when a create step of the replace writes the object again. - integrations-dns-key-render: NixOS test that a
fediversity.dns-masterTSIG key render fails rather than emittingsecret "";when the secret it renders from has not landed yet. The producer of that path is backend-specific and the component cannot order on it, so the render can lose the race -- and losing it used to be silent, leavingnamedreloaded onto an empty key with the unit green andcmpmatching from then on so nothing re-rendered. Also that the same unit renders once the secret arrives, and that the key it writes actually authenticates a signed update to the apex. - integrations-dry-run-runs-nothing:
DRY_RUN=1makes a deploy package evaluate the system of each node and print its command, and run nothing. - integrations-forgejo-series: NixOS test of the guard on the release series of forgejo: a node with no record records the release series of the package, an upgrade dumps the database while forgejo is stopped and keeps only that dump, a downgrade and an upgrade without room for the dump are refused with exit status 78 while the user stays, and a fresh installation is recorded without a dump.
- integrations-garage-provision: NixOS test of the garage node's own OpenTofu reconciler: it adopts a bucket and a key made with the
garageCLI and keeps their ids, a bucket gets the CORS rules ofcorsand the run leaves no key, a second apply has nothing to change, a state with onefor_eachresource for the buckets moves to one resource per bucket without a change, a key with no render is pending until the render lands, a key in the state stays when its render goes missing, and a bucket and a key that leave the config are deleted, the bucket emptied first. - integrations-garage-series: NixOS test of the guard on the release series of garage: a node with no record records the release series of the package without a copy, an upgrade copies the metadata directory while garage is stopped and keeps only that copy, and a downgrade and an upgrade without room for the copy are refused with exit status 78 while the layout and the buckets stay, and a fresh installation is recorded without a copy.
- integrations-garage-snapshots: NixOS test of the snapshots of the metadata of garage: garage makes snapshots of its metadata database in a directory outside the metadata directory and keeps the two newest snapshots, and a snapshot replaces a lost database while the buckets stay.
- integrations-grafana-series: NixOS test of the guard on the version of grafana: a fresh installation records the version of the package without a copy, an upgrade copies the SQLite database and keeps only that copy, and a downgrade is refused with exit status 78 while grafana stays stopped and the data stays.
- integrations-incus-bridge-acl: NixOS test of the isolation of operator deployments on the shared incus bridge: OpenTofu creates the ACLs of two deployments with the module of the operator deploy, each ACL drops exactly the rest of the operator prefix and the ports of the provider that are not in
operator-reach.nix, and imageless containers with the NIC keys ofinstance.tfget their static addresses over DHCP. The nodes of a deployment reach each other, the nodes of the provider in the two directions, and the gateway and its DNS; they do not reach a port of the provider that is not in the list, or the nodes of a different deployment, the egress rules and the ingress rules each drop on their own, and a rule for one node of the provider limits only that node. - integrations-incus-oci: NixOS test that Incus runs our NixOS guest as an OCI container from a locally imported image, own-store and shared-store, with systemd as PID 1, the Incus
/etcbinds removed, and noraw.lxc, also in a restricted project; it records how the DHCP client of Incus and the guest's networkd work together. - integrations-incus-shared-store: NixOS test that an imageless incus container boots off the host's own
/nix/store, bind-mounted read-only the waynixos-containerdoes it under systemd-nspawn: no image, LXC's init pointed at a per-container profile the host owns and which doubles as the host-side GC root, and a rootfs holding no copy of the closure it is running. Booted in two device shapes -- store-only, and store plus the nix daemon socket and database -- because sharing the daemon lets any tenant drive builds on the hypervisor and enumerate every other tenant's closure; the check records which in-guest nix usage the store-only shape costs, which is the evidence that decision is made on. - integrations-incus-token-publish: NixOS test that
incus-deploy-token-publishproves both ends before it mints: with the KV endpoint away, the unit fails having minted no trust token, which is what makes its unbounded retry safe on work that is not idempotent. Also that it publishes again once the endpoint is up, and keeps publishing across the two ways its work is undone without it ever failing -- the KV emptied by a cold rebuild of the fleet, and the token revoked at the daemon -- while a run with the pair still whole mints nothing, which is what makes the refresh timer safe. - integrations-k3s-oci: NixOS test that k3s runs the rootfs of our OCI node image as a pod with systemd as PID 1, and that the node takes its allocated addresses and peers from a ConfigMap volume at boot and on each change.
- integrations-lldap-provision: NixOS test of the lldap node's own OpenTofu reconciler: it adopts a seeded user, group and membership that exist and does not make them again, a second apply has nothing to change, a state from before the per-object labels moves to them without a change, a seeded user, a group and a membership that leave the config are deleted, users, groups and memberships that it did not seed stay, and a retained user and membership that leave the config stay and leave the state.
- integrations-lldap-series: NixOS test of the guard on the version of lldap: a fresh installation records the version of the package without a dump, an upgrade dumps the database through the backup command of the
streamingBackupcontract and keeps only that dump, and a downgrade is refused with exit status 78 while lldap stays stopped and the data stays. - integrations-maddy-series: NixOS test of the guard on the version of maddy: a node with no record records the version of the package without a copy, an upgrade copies the state directory while maddy is stopped and keeps only that copy, a downgrade starts maddy with a warning and records the older version, and an upgrade without room for the copy is refused with exit status 78 while the mailboxes stay.
- integrations-mariadb-series: NixOS test of the guard on the release series of MariaDB: a node with no record records the release series of the package, an upgrade copies the data directory while MariaDB is stopped, keeps only that copy, and runs
mariadb-upgradewhile it keeps the data, a downgrade and an upgrade without room for the copy are refused with exit status 78, and a fresh installation is recorded without a copy. - integrations-media-backup: NixOS test of the media backup of an application on a garage node: a backup encrypts the names and the content of the objects and leaves out the excluded ones, a second backup with no change transfers nothing, an empty credential stops the backup, a restore puts back a deleted object, an overwritten object with its content type and a bucket that was deleted and made again, a restore at a stamp puts back the versions of that backup, an erasure deletes an object from the backup and all of its history, and a retention of 0 days keeps no history.
- integrations-migrate-after-failed-apply: A cold
bootstrap-apply.shwhose apply fails after allocating still migrates its state to the HTTP backend, and still reports the failure. - integrations-migrate-target-hint: The bootstrap's migrate wait names
BOOTSTRAP_TUNNEL_SSHwhen it is waiting on a host-internal bridge lease, and stays quiet when it is not. - integrations-migration-restore: NixOS test of the migration of the state of an application to another network:
mintgives the public HTTPS endpoint of the S3 API and the bucket with the path of the repository in it, or the internal endpoint withoutmigrationRepository, andrestore-foreignon a target that cannot get to the internal endpoint restores the files through the public endpoint. - integrations-migration-restore-boot-wait: When the boot of a node does not complete after the restore of a migration, the restore tells that the boot did not complete and names the start jobs that still run. A complete boot is ok, and a boot with a failed unit names the unit.
- integrations-octodns-bind: NixOS test of the OctoDNS bind provider into our own
namedover RFC2136: the group-derived zone pushed into the live primary, transferred to the group's second nameserver with its challenge delegation and refused to anyone else, a peer resolving group nodes through the primary, andverifyfinding both nameservers serving every record, naming one the primary dropped, and setting aside the glue address the deployer has no route to; then the self-held apex rendered from NetBox under a publisher key read out of the KV, keeping its delegation at the short TTL, withdrawing a record it no longer names, failing on a credential the store does not hold, and relaxing the record but not the credential under the additive switch. - integrations-octodns-desec: The octoDNS
desecprovider at a stub of the deSEC API, as a provider apex at deSEC publishes: each TTL under the minimum TTL of the domain is raised to it, the ownership markers too, so that the bulk write is not refused; the record that no config names survives; a second sync writes nothing; and the token is the one thatservice.tokenFilenames. - integrations-octodns-kv-txt: NixOS test of the KV-sourced TXT record in every way its read fails, at a third party's PowerDNS: a value the store does not hold and one that is not a key both fail the render after rendering the rest and fail the verbs before anything is published; a refused token names the token rather than the record; a deployer with no coordinates skips the record out loud and publishes the rest; and
OCTODNS_NO_WITHDRAWALSleaves a record an earlier publish owned standing while the same sync without it withdraws it. - integrations-octodns-netbox: NixOS test of the zone rendered at run time from what NetBox recorded and pushed at a third party's PowerDNS: allocated addresses at the short node TTL, served-name aliases including a wildcard, a static host, a multi-label
_acme-challengedelegation answered as a referral, the mail policy TXT records, and the DKIM key read back out of the deployment's KV in two character-strings -- each reaching the live zone with its ownership marker, an unallocated or foreign node skipped out loud, and the next plan a genuine no-op. - integrations-octodns-powerdns: NixOS test of the OctoDNS PowerDNS provider at a third party's PowerDNS, on MariaDB: a whole zone pushed at an empty one, then partial-zone
ownershipover zones that already hold records nobody here wrote -- the unowned sibling and apexNSsurvive, a record that would land on an unowned one is refused until an operator deletes it or adopts it by marker, and a publish that moves every record it owns is not refused for its size. - integrations-openbao-pki: Test the OpenBao PKI secrets engine as an internal-CA
contracts.sslprovider, for an nginx vhost and for the LDAPS listener of lldap. - integrations-openbao-series: NixOS test of the guard on the release series of OpenBao: a node with no record records the release series of the package and does not restart, a switch to a newer release series does not restart OpenBao, a restart of OpenBao copies its state directory while OpenBao is stopped and keeps only that copy, and a restart after a failure on an older release series and an upgrade without room for the copy are refused with exit status 78 while the secrets stay.
- integrations-openbao-spire-ca-bundle: OpenBao installs a SPIRE CA bundle from its own agent only when each block parses and a CA is valid now, and otherwise keeps the bundle and the
certauth roles it has. - integrations-operator-registrar: Applies the registration of the
tf-incus-operatoreffect (registrar.tf) against a fake registrar API and a dev OpenBao: a premium name or a quote abovemax_costorders nothing, a quote at the bound registers with the renewal of the lane, and a destroy keeps the registration in the account with its renewal off. Withclaim_held_domain, a name that the account holds is adopted with no order. With the auth code of a migration import, a name that a different account holds is transferred once, the deploy fails until the transfer is complete or when the registry refused it, and the auth code is deleted from KV when the transfer is complete. - integrations-plan-does-not-apply: A
planagainst an effect that declares no HTTP backend stays a plan, even withTF_HTTP_ADDRESSset. - integrations-podman-oci: NixOS test that podman runs the rootfs of our OCI node image with systemd as PID 1, and that the node takes its allocated addresses and peers from a bind-mounted directory at boot and on each change.
- integrations-postgres-upgrade-dump: NixOS test of the dump of the guard of an application on the path of a live node: the backup command comes from the routed
postgresqlresult throughcore/components/shared/postgres-backup.nix, an upgrade dumps the database of a different node over TLS with the rendered password and keeps only that dump, a dump that fails keeps the application stopped until a retry dumps the database. With an offsite backup, an upgrade makes a restic snapshot of the version before and removes the local copies, a snapshot that fails keeps the application stopped until a retry makes the snapshot, a snapshot that fails forUPGRADE_BACKUP_TIMEOUTseconds refuses the upgrade with exit status 78 until a start of the target, and a deploy of the version before an upgrade that did not finish restores the snapshot of that version. - integrations-postgresql-major: NixOS test of the guard on the major of PostgreSQL: a fresh installation records its major, a switch to the next major upgrades the cluster with
pg_upgradeand keeps the data and the old cluster, also after an upgrade that stopped halfway, a skipped major and a downgrade are refused with exit status 78, and a node with no record records the cluster in use and warns about the cluster that is not in use, but refuses when only a cluster of another major is on disk. - integrations-postgresql-provision: NixOS test of the postgres node's own OpenTofu reconciler: it adopts a role and a database made the way
ensureUsers/ensureDBOwnershipmade them and keeps their data, a second apply has nothing to change, a state with onefor_eachresource per type moves to one resource per object without a change, group roles get theirBYPASSRLS, database privileges and memberships, a password, aVALID UNTIL, a membership and a role setting written by the engine or an app'sbootstrapSQLare not drift, and a database, a role, a grant and a membership that leave the config are dropped, the database first, so an owner role that owns a table in its database drops too. - integrations-publish-records: The publisher walks up to the zone that holds a name, and stops rather than climbing past a refusal that never reached the zone API. A retire fails when it cannot find the zone, when the key may not read the zone, or when it cannot release the record, writes the record that it left to
LEFT_BEHIND_FILE, and is green when nothing holds the record any more. A publish writes the record that it wrote toWRITTEN_FILE. On the deSEC lane, the publisher writes at the minimum TTL of the domain, waits out a rate limit, creates the domain on a hold and keeps it on a release, and reads its token from the KV subtree of the deployment. - integrations-publish-records-follow: NixOS test of
named-operator-zones-followon the provider'snamedprimary, with a parent zone and the nameserver of a new provider: an operator zone with a migration marker that the parent delegates to other nameservers followed, copied from the new provider by a zone transfer that includes a name the zone did not have, by a walk of the NSEC chain that also gives such a name and deletes a name the new provider does not have when the new provider refuses the transfer of a zone it signs with NSEC, or by authoritative queries for the names the zone has when the new provider refuses the transfer of a zone it does not sign, and given the NS set of the new provider; the primary letting only the addresses of the transfer property transfer the zone; its release deferred until the parent moved the delegation, the copy is done and resolvers can no longer follow the old delegation, with the cache time from the TTL of the parent's NS records, also when the parent moved before the job saw the zone, and up todelegation_wait_secondswhen the parent does not move; a resume refused while the zone is away, and a zone whose delegation comes back served as before; a zone that moved without a migration marker not followed, and dropped at once on release when the job never saw it delegated here; and the owner marker, so that only the last deployment that holds a zone releases it, and a hold by a different deployment removes the migration marker; and the transfer property and its time removed after the longest time that the follow job of the source needs it, which is the time of the job or the time property when that is longer, and by a release; and the TSIG keys of a migration, kept in a keys zone that only the apex key and the operator key may read: the export key, with which the job signs the transfer of a zone that the new provider lets no address transfer, and the transfer key, which the primary lets transfer the zone while the transfer property stays, both refused when not the base64 of 32 bytes and removed with the transfer property or by a release. - integrations-publish-records-named: NixOS test of the operator graph's record publisher over its RFC2136 lane, against the provider's own
namedprimary and secondary as the bind component renders them: an app name published, repointed and released at any depth below the apex; the provider's own names and the apex refused by the server even with the publisher's own refusal list bypassed; every type but the address types refused to the operator key while the zone publisher's key still writes anything; a wrong secret, a name under no zone, and a retirement whose address moved on all leaving the zone as it was; then the operator zone lane: a domain of the operator's own added to the catalog, rendered into a zone the primary serves and the secondary provisions, a zone above the apex, above an admitted zone or below the catalog refused, the operator key held to member entries, and a member the provider prunes dropping the zone from both. - integrations-reclaim-own-lock: A steady-state
bootstrap-apply.shwithTF_RECLAIM_OWN_LOCK=1releases a state lock left under its own identity and no other, and releases none without the flag. - integrations-register-ek-evidence: A deploy that finds no EK reader in the container it stood up prints what that container runs, rather than naming one of the three faults the
incus execmessage covers, and a deploy gives the container only a trust bundle that holds a valid CA. - integrations-registrar-guards: Applies the Porkbun and Openprovider
domaineffects against a fake registrar API: a quote abovemax_costorders nothing, a quote at the bound registers, and aplan -destroyof the registration is refused. An Openprovider registration with noperiodis quoted and ordered for one year. - integrations-retire-records-follow-openbao: The retire of the DNS records of a node on the deSEC lane reads the OpenBao of the last apply, also after OpenBao moves, and the move of
publish_app_recordsfrom anull_resourceto aterraform_datareplaces no record and publishes no record again. - integrations-smtp-dkim: NixOS test that outbound mail leaves the relay with a DKIM signature a receiver can act on: the envelope sender arrives at the upstream rewritten to the smarthost account while the message still carries its original
From:and a signature verifying as the organizational domain, in alignment with it. - integrations-smtp-reports: NixOS test that the address the zone's DMARC
rua=points at receives: a report arrives from a second container on:25, opened by the firewall only because reports are enabled, and leaves again for the operator's inbox while every other recipient is still refused. - integrations-spire-incus: Test SPIRE TPM attestation of an incus-deployed node via its incus vTPM.
- integrations-spire-openbao: Test the SPIRE and OpenBao secret/identity integration.
- integrations-spire-register-name:
spire-register-namecreates, re-points or updates the entry of a name, and exits non-zero, with the error and with no new entry, whenspire-servercannot read, delete or create an entry. - integrations-spire-retire-name:
spire-retire-nameis a no-op with exit 0 for a name with no entry, deletes each entry of a name, and exits non-zero, with the error and with the drop-file kept, whenspire-servercannot read or delete an entry. A destroy whose retire fails lists the host as left behind, with the error of the retire. - integrations-spire-series: NixOS test of the guard on the release series of SPIRE: a node with no record records the release series of the package without a copy, an upgrade copies the datastore without the CA key while the server is stopped and keeps only that copy, a downgrade starts the server with a warning and records the older release series, and an upgrade without room for the copy is refused with exit status 78 while the registration entries stay.
- integrations-state-migrations: NixOS test of
systemd.stateMigrationson a fake application: a fresh installation is initialized once, an upgrade runs only the steps in its version range before and after the restart of the application, a failed step restores its backup and keeps the application stopped, a downgrade or a skipped release series is refused with exit status 78, an existing installation without a version record is recorded, not initialized again, and a failed run thatRestart=on-failurewithRestartMode=directretries keeps the start job of the application while a refusal is not retried. A second application with arestoreand aprivilegedBackupmakes its backup as root, records a failed upgrade asupgrading, keeps the first backup when the upgrade is retried, refuses a third version with exit status 78, and restores the backup on a deploy of the previous version. - integrations-steady-backend-freshness: A steady-state bootstrap re-run tunnels past a backend name that does not resolve to this fleet's
tf-backend, and honors one that does. - integrations-steady-refuses-backend-replace: A steady-state apply of a graph that deploys its own state backend refuses a plan that deletes or replaces the backend node, and applies every other plan.
- integrations-steady-refuses-lost-state: A steady-state
bootstrap-apply.shrefuses to apply when the backend holds no state for a key this deployer has a fleet's worth of local state for. - integrations-suspend-power: A suspended instance stops and does not start at boot, and a resumed one starts at boot and is waited for.
- integrations-tf-backend-front: Runs the state backend with its nginx front in a VM, and asserts that the front accepts a request for a state only from the deployer of that state, and that a state written through the front is stored under the ID that the existing states on a live deployment have.
- integrations-tf-backend-series: NixOS test of the guard on the version of the state backend: a node with no record records the version of the package without a restart of the backend, a switch to a later version does not restart the backend and a restart by hand copies the state directory and keeps only that copy, a restart on an earlier version is refused with exit status 78 until the copy is put back, and a restart without room for the copy is refused with exit status 78 while the states stay.
- integrations-tf-backend-state-id: The state backend stores a state under the ID that the existing states on a live deployment have.
- integrations-valkey-series: NixOS test of the guard on the release series of valkey: a node with no record records the release series of the package without a copy, an upgrade copies the RDB snapshot and the AOF directory while valkey is stopped and keeps only that copy, a downgrade starts valkey with a warning and records the older release series, and an upgrade without room for the copy is refused with exit status 78 while the keys stay.
- integrations-windmill-grants: Runs the bootstrap SQL of the windmill database request against a windmill database whose older tables belong to
windmill_adminand whose newer tables belong to the login role, and asserts that theSECURITY DEFINERtrigger ofconfigfails withpermission denied for table notify_eventbefore it, and passes after it is applied twice, and thatwindmill_userandwindmill_admincan write to a table that the login role makes later. - integrations-windmill-series: NixOS test of the guard on the version of windmill: a fresh installation records the version of the package without a dump, an upgrade dumps the database through the backup command of the
streamingBackupcontract and keeps only that dump, and a downgrade is refused with exit status 78 while the three windmill units stay stopped and the data stays. - lib-settings-rename-candidates: Unit tests for the rename-candidate suggestion tool: which schema paths it enumerates, how it ranks an added key against a removed one, and that the block it prints parses as JSON with the
upstreamfield left for a human. - license-report: Unit-test the license report of a node: the verdict of each component in a fixture SBOM, the license of the files that the configuration generates, the exit status, and the form of the license allowlist.
- nix-unit-components: Every
nix-unit-components-*suite in one evaluation, as CI builds them. - nix-unit-components-authelia: Unit tests for the authelia component: the operator sets the portal policy, with only a duration that the schema admits, but not the storage or the session cookies, the node gets the settings without
nullvalues, the storage takes theautheliaresult of thepostgresqlrequest, with TLS and the assertion that follow itssslMode, and the sessions take theautheliaresult of theredisrequest, with TLS that follows the result and a restart on a rotation of the password, or stay in memory without a result. - nix-unit-components-hosting-provider-helpers: Unit tests holding the contract of the helpers that
core.lib.components.hosting-providerexports for a front end that runs the hosting-provider group: the exports are the ones the spec names,operatorCurationneeds only thenetboxanddnsresults and refuses a missing or mistyped one,deployCredentialsputs its KV paths on the stem of the coordinates given and refuses a missing or mistyped curation, andmachinenames the node for its application and refuses a name that is not a string. - nix-unit-components-incus-deploy-tokens: Unit tests for when
incus-deploy-token-publishmints the trust token pair of a deploy runner again: only when one of the two KV entries or one of the two daemon-side names of that runner is missing, with the guard of the rendered shell the same checks joined by&&, and the mint writing the same names and KV paths the guard reads. - nix-unit-components-incus-oidc: Unit tests for what the incus server takes from the
oidcresult: the issuer and the scopes of theincusresult only, nothing without that result, and the PKI bundle only for anhttps://issuer with a PKI CA file. - nix-unit-components-incus-store-identity: Unit test holding the store-serve identity constants the windmill worker's
_jobenv.pyrestates toincus-store-identity.nix, the file its nix-side consumers read. - nix-unit-components-mastodon-oidc: Unit tests holding the mastodon OIDC client secret env file to the units that serve logins: the migration oneshots, which never read it and hold back every unit that they order before, are not given it.
- nix-unit-components-netbox-consumers: Unit tests for what the netbox node renders from the
oidc,smtp,otelandpostgresqlresults ofnetbox, and nothing without them: each unit loads the credentials it reads under keys that do not collide, the OTel wrapper keeps the configured package, the database replaces the local one, the API token goes to a KV instance that the node can write only on a node with the OpenBao vars backend, and the version guard dumps the database before an upgrade, and puts the dump back with its restore, only on a node with the offsite backup. - nix-unit-components-openbao-init: Unit tests holding what Nix puts into the
openbao-initunit: the script enables only thesecretKV v2 mount with one key share, seals at an owner TPM handle that is not the endorsement key, waits for the TPM for less time than the start timeout, and wants rather than requiresopenbao.service; theopenbao-root-tokencommand dialsservices.openbao.runtimeApi. - nix-unit-components-openbao-spire-auth: Unit tests holding the cert-auth policies and roles of a small roster to the grants each roster entry kind gives: a write only on the own instances and never on a stem of the host name, a read only on what is named for the host, a namespaced host only under its own deployment, and one role per roster key bound to its SPIFFE ID and policy. A host that only an OIDC client, a relay or a DNS, ACME or incus-store roster names gets no policy and no role.
- nix-unit-components-operator-curation: Unit tests holding the provider's curation of the operator form to the deploy's own IPAM and DNS coordinates: the NetBox instance, cluster, tenant and pool an operator deploy allocates from, and the zone service it publishes app names to, are the ones the front-end node's
netboxanddnsrequests resolved; a self-hostednamedopens no write lane, and the curation restates none of its own. - nix-unit-components-windmill-workspace-imports: Unit tests holding the windmill scripts' workspace imports to the set the bootstrap uploads, and holding the deploy and destroy scripts to one shared job environment: a module nobody uploads fails a job at its first line, and an environment written twice drifts into a destroy the deploy's credentials never reach.
- nix-unit-contracts: Every
nix-unit-contracts-*suite in one evaluation, as CI builds them. - nix-unit-contracts-lib: Unit tests for the vendored contracts lib extensions (
nestedAttrsOf,evalOption, etc.). - nix-unit-contracts-vendored: Guard test keeping the vendored copies of nixpkgs code (the
dischargePropertiescopy in the contracts lib, the replaced restic module) in step with the pinned nixpkgs, so a pin bump that changes upstream fails here rather than drifting silently. - nix-unit-deployment-plan: Every
nix-unit-deployment-plan-*suite in one evaluation, as CI builds them. - nix-unit-effects: Every
nix-unit-effects-*suite in one evaluation, as CI builds them. - nix-unit-effects-common-lib: Unit tests for the common deployment-effect helpers.
- nix-unit-effects-octodns-types: Unit tests for the types of the
octodns-zoneoptionszoneandproviders.<name>.configuration: a record type that DNS does not have, aSOAinzone, a providerconfigurationvalue in place of an option declaration, a value of the wrong type, and a provider name thatprovidersdoes not declare all fail at evaluation. Also that each provider makes itsconfigurationand token secret from the sameservicecoordinates, and thatbindrefuses aservice. - nix-unit-effects-registry: Unit tests for the effect registry: each effect declares an
effect-metaor is inbuildingBlocks, not both and not neither, and each name inbuildingBlocksis an effect. - nix-unit-effects-ssh-option: Unit tests for the form of an
sshOptsitem: a bareKey=Valuepasses, and an item in argv form such as-o Port=2222fails at evaluation, in thehost-sshsubmodule and in thessh-hostssettings. The form schema gives each item apatternthat admits the same items. - nix-unit-effects-submitted-config: Unit tests for how a submitted configuration resolves against the baked one, which decides both the node configurations a deploy builds and which nodes it stands up.
- nix-unit-effects-tf-destroy-provisioner: Unit test holding every
when = destroyprovisioner in the graphs to taking its command off the environment rather than off the state: the deployer that destroys is not the one that created, so a runner or a key path recorded at create time names a store path from before the fix and a credential the job that staged it has since removed. Also that each such provisioner withon_failure = continuewrites what it left toLEFT_BEHIND_FILE, that no destroy step reads atriggerskey thatignore_changesholds (such a key keeps the value of the create, not a moved coordinate such as the address of OpenBao) other than as the fallback of a read ofself.output, and that the effect of each graph with alifecycle { destroy = false }resource, and no other effect, destroys with-suppress-forget-errors. - nix-unit-effects-tf-incus-bootstrap: Unit test that
dev-tf-incus-bootstrapgives its script the image alias ofdev-tf-incus-imageand the dev TF-backend address ofcore.lib.devTfBackend, and that the script holds no copy of them. - nix-unit-effects-tf-incus-image-hostname: Unit tests that the image of
tf-incus-image, evaluated as the effect does, has no/etc/hostname, thus each container keeps the name that Incus gives it, and that the image keeps the node name innetworking.hostName. The node configuration without the image changes has the file. - nix-unit-effects-tf-incus-plan-inputs: Unit test for the tfvars from which the incus graph makes its instance plan, rendered from real setups: which nodes go on the shared store, the probe of the replace guard, the uplink mode, which nodes ask for a NetBox address, the persistent volume of the state backend and its place in the wrapper guard, and that the self-read of the state of the hosting provider takes the credential of the deployer from the deploy runtime, not from the baked config, and that only a deploy with an
httpbackend writes the addresses document that an operator deploy reads. Also that each rendered tfvar and node field is declared by the graph, because the graph does not fail on a name that it does not declare. - nix-unit-effects-tf-provider-pins: Guard test asserting the OpenTofu provider versions written into
tf/still match the npins pins (derivedrev/constraint, and no version literal in the HCL ofnetbox-seed). - nix-unit-effects-tf-registrar-render: Guard test forcing each registrar effect's generated OpenTofu module to evaluate. Of these effects, only the Porkbun and Openprovider
domaineffects also reach an integration test,integrations-registrar-guards, which applies them against a fake registrar API. - nix-unit-effects-tf-ssh-triggers: Unit tests that each node input of the
tf/sshprovisioner, other thanusernameandkey_file, is intriggers_replace, thus a change of it alone deploys the node again. - nix-unit-effects-write-config: Unit tests for the files that the deployer evaluates at apply time: the deploy-time
configuration.nixkeeps its store path across runs that differ only in the credential-staging directory of the deployer, each generated file defines the variables it uses, and the plan of a setup outside the tree resolves. - nix-unit-env-adapter: Unit tests for the name-free env-adapter fold (pluggable
getEnv, multi-module folding, recursive merge). - nix-unit-env-config: Guard test asserting each effect reader's
getEnvkeys are declared in itsenvKeys(thecore.lib.deployEnvKeysDRY invariant). - nix-unit-lib: Every
nix-unit-lib-*suite in one evaluation, as CI builds them. - nix-unit-lib-application-schemas: Unit tests for the schema of each application, re-rooted from the provider schema.
- nix-unit-lib-data-model: Unit tests for the data model (
core/lib/data-model.nix). A call ofapplyorprocesswith an argument of the wrong outer shape fails. - nix-unit-lib-function: Unit tests for the type-checked function type.
- nix-unit-lib-json-schema: Unit tests for JSON Schema draft 2020-12 (validating a value against a published schema, restating a schema of configuration keys as one of environment variables, narrowing one to what an operator is offered, upgrading an older draft, and the option type that carries a schema instead of being converted from one).
- nix-unit-lib-json-schema-suite: The JSON Schema draft 2020-12 implementation against the specification's own conformance suite, with a checked ledger of what it refuses and where it diverges.
- nix-unit-lib-lib: Unit tests for the general utility library.
- nix-unit-lib-nixos-service-options: Unit tests for wrapping an upstream NixOS service's options onto an application (a selection says what is exposed, ours shadow theirs at any depth, only operator-set values are forwarded back).
- nix-unit-lib-option-selection: Unit tests for stating which parts of a nested option structure we want: allow-lists and deny-lists at every layer, names ending in
*that select by prefix, and a selected name the structure does not have throwing. - nix-unit-lib-option-title: Unit tests for GUI-facing option titles and the word dictionary.
- nix-unit-lib-renames-for-source: Unit tests for structured option-rename extraction and schema pruning.
- nix-unit-render: Every
nix-unit-render-*suite in one evaluation, as CI builds them. - nix-unit-render-catalog-source: Unit tests holding that the
sourceof each hand-bound standalone deployment of the catalog names a file of the repository that is not undercore/checks/: an operator runs the attribute outside the checks, and the docs site names that file as its origin. - nix-unit-render-env: Unit tests holding that every deploy coordinate the provider's curation fixes for the operator method reaches that method's setup arguments, the registrar lane (
domainRegistration) included: the front-end node forwards the registrar login on the strength of the served curation, so a leaf the render never lifts opens the lane on one node and shuts it on the other. - nix-unit-render-image-state: Unit tests holding that the generated image effect of the catalog bakes no HTTP backend and reads no
TF_HTTP_ADDRESS, so its state is a local file on every provider: the image is uploaded before the TF backend exists. - nix-unit-render-unset-apex: Unit tests holding that the name of each package and the description of each app evaluate when the apex is not set:
nix flake showis a pure eval, whereDNS_DOMAINis not available, and one attribute that needs the apex for its name stops the whole listing. - nix-unit-resources: Every
nix-unit-resources-*suite in one evaluation, as CI builds them. - nix-unit-resources-coordinate-consumer: Unit tests for the consumer side of the dns and netbox resources: each request resolves on the node to the contract result under its consumer name as plain data.
- nix-unit-resources-firewall: Unit tests for the firewall resource: dual-stack source classification, which ports are published rather than merely served, the fail-closed guards, the allocated addresses at the gate, the operator sources that reach only their own ports, then the bridge interfaces that reach only their own ports, before the trusted interfaces and the internal sources, the bridge ports that
nixos-fwserves only on the bridge interfaces, and the component-request / environment-policy split. - nix-unit-resources-garage-consumer: Unit tests for the consumer side of the garage resource: each requested bucket resolves on the node to an
s3contract result with its tenant-prefixed name and endpoints, as plain data. AnensureAccessentry with no permission stops the evaluation. - nix-unit-resources-garage-forward-compat: Regression test for the #972 forward-compatibility rule: an old-shaped garage config evaluates against the renamed option and the value lands at the new path.
- nix-unit-resources-generateFiles: Unit tests for the generateFiles resource's
varsprovider wiring andfileSecretsbridge. - nix-unit-resources-ldap-consumer: Unit tests for the consumer side of the ldap resource: a routed request gives the contract result as plain data on the node.
- nix-unit-resources-ldap-provider: Unit tests for the provider side of the ldap resource: the wants, the bind password and the key seed of the lldap node, and no output without a routed provider.
- nix-unit-resources-network: Unit tests for the apply of the network resource: the host name check, the CIDR split, the resolver order, the gateway suppression and the allocated address that replaces the address of the settings.
- nix-unit-resources-nixos-module: Unit tests for the apply of the nixos-module resource: the policy module and each requested module land on the node.
- nix-unit-resources-oidc-consumer: Unit tests for the consumer side of the oidc resource: a client request gives the contract result as plain data on the node, equal to the result that the provider gives.
- nix-unit-resources-oidc-ldap-backend: Unit tests for the account that Authelia binds to the directory as:
authelia-bindwith the OpenBao LDAP engine, theadminbindDNof the contract result without it. - nix-unit-resources-oidc-policy: Unit tests for the apply of the oidc resource: clients versus forward-auth protections, the name of each protected UI, the admin-UI gate, and what the authelia node gets.
- nix-unit-resources-otel: Unit tests for the OpenTelemetry resource module.
- nix-unit-resources-plain-requests: Unit tests that every request to a resource whose clients render from resolved data holds only data, which survives a JSON round trip.
- nix-unit-resources-postgresql-converge: Unit tests for the postgresql resource's rotation convergers: which agent render restarts which consumer, in both credential modes.
- nix-unit-resources-redis-port: Unit tests for the deterministic per-namespace valkey port helper (known-answer + collision-freedom).
- nix-unit-resources-secrets: Unit tests for the secrets resource's agenix
fileSecretsrouting. - nix-unit-resources-secrets-recipients: Unit tests for the recipients of the
.agesecrets: each secret goes to the host keys of the machines whose components request it, and the recipients stay equal to the ones that the.agefiles are encrypted to. - nix-unit-resources-smtp: Unit tests for the process and the apply of the smtp resource: one want per application, the consumer result, the relay daemon and its secrets.
applytakes the requests by app and refuses a list. - nix-unit-resources-spiffe: Unit tests for the apply of the spiffe resource: an enabled request gives one spire-agent with the routing context, and no request gives nothing.
- nix-unit-resources-ssl: Unit tests for the apply of the ssl resource: the nginx vhost and port for each domain, no vhost for a self-terminated domain, and the request defaults.
- nix-unit-resources-ssl-openbao-pki-login: Unit tests for the order of the OpenBao login on an
openbao-pkinode: it starts before the issuing unit of each domain on the private CA, whose names need not match the host name, and before no unit when no domain is on the private CA. - nix-unit-setups: Every
nix-unit-setups-*suite in one evaluation, as CI builds them. - nix-unit-setups-admin-emails: Unit tests on the realised nodes of the hosting-provider group for the consumers of the deployment
email: on thetelemetrynode it gives one alert recipient for each;-delimited address and has priority over the group dataalertEmails, which gives the list whenemailis empty, and with neither the evaluation stops with an error that namesADMIN_EMAIL. The seeded directory administrator, the DMARC report forward and the ACME account get the first address. - nix-unit-setups-apex-cohesion: Guard test asserting the deployment serves one apex: every served name across the group is a label under
core/apex.nix, each alias of the static table ofserved-domains.nixis a vhost of the node it points to, and no other source file names that apex. - nix-unit-setups-apex-group: Unit tests for the shape of a deployment's apex DNS group -- its nameservers, the secondaries it offers a transfer to, the keys its
namedmints per node, and whether it holds and uses a signing key -- under an external apex, a held one, and a held one with signing on. - nix-unit-setups-apex-resolution: Unit tests on the realised incus node for where it resolves the apex: the routing domain pinning the split-horizon apex to the bridge link, that it lands on the same unit that carries the address, and the flat resolver list that makes the pin load-bearing.
- nix-unit-setups-apex-signing: Unit tests on the realised
bindnode for the unit placing the apex signing key: scoped to a signed apex we hold, fail-closed againstnamedbecause a keyless policy mints a replacement, and -- being fail-closed over a secret that lands minutes later -- owning a retry and re-pulling the daemon whose start job its own failure discards. - nix-unit-setups-app-vars-grant: Unit tests holding what an application node uploads to the central OpenBao KV against what that node's policy lets it write: the two are separate groups' evals, so an instance a component declares for itself and no roster grants shows up only as a
403on a live deploy. Also that each node generates the repository password its restic backups read, else the credential is empty and the backups fail, and that only the backups of OpenBao and of the terraform backend have a fixed password. - nix-unit-setups-backup-retention: Unit tests on the retention of the restic backups of the realised nodes of the hosting provider and of the shared operator services: the database backups of lldap and Authelia, which hold personal data, prune with
backupRetention.application(30 days), and the backups of NetBox, Windmill, OpenBao, BIND, Grafana and the terraform backend, which restore the infrastructure, prune withbackupRetention.infrastructure; and the shared PostgreSQL node has only the backup of its clusters before an upgrade, with no scheduled prune. - nix-unit-setups-caller-groups: Unit tests for the groups from which the central group evaluates the model of an operator group or a central-login group: the groups of the caller, so a group that only the caller defines has a model, and an in-tree group that the caller does not give is not selected.
- nix-unit-setups-capability-node-lookup: Unit tests holding the values found by the capability of a component against the fixed names they replace: the OpenBao cert-auth roster, the node roster of the per-node form schema, the groups that get
tf-incus-operator, and the OpenBao and NetBox nodes of thetf-incus-hostsself-read. - nix-unit-setups-central-ldap: Unit tests on the realised nodes of the hosting-provider group for its LDAP setup: the
lldapnode seeds the administrator that the group data names inldap.adminUser, a group with an lldap node that names none fails the eval, and the LDAP engine of the centralopenbaonode serves its own directory at the bareldapmount and gets the directories of the operator groups. - nix-unit-setups-central-postgresql: Unit tests on the realised nodes of the central group for its PostgreSQL setup: the
postgresqlnode accepts connections fromsamenet, and the database engine of theopenbaonode gets the roles of the roster. - nix-unit-setups-default-configuration: Unit tests holding the group evaluation to one definition of
default-configuration, with the configuration derived from the roster or stated by the caller, because a second definition of the same value doubles eachlistOfoption in it. - nix-unit-setups-delegated-zones: Unit tests on the realised
bindnode for the zones delegated inward to it: one per DNS-01 challenge name, each granting its own TSIG key one owner and one record type, and reachable from beyond the deployment either way -- for the validator's resolver, and for whoever answers for an apex we hold ourselves. - nix-unit-setups-deployer-kv: Unit tests for the KV publish of the deployer coordinates an operator deploy reads back: which deployer publishes (the provider's own, holding a token) and which does not (an operator graph, a cold walk), that a CD deploy publishes the password of the
operatordeployer at the front of the state backend, that the deployer policy is widened to exactly the published keys, and that the deploy runners read each published key back but the manager token of the zone service. - nix-unit-setups-dev-config: Unit tests on the realised forge and runner nodes of the
devgroup: the forge domain, the addresses its nginx listens on, the mail sender and thesecurity.txtof the forge, the URL the runners connect to, the UUID and token of each runner, and the host labels. - nix-unit-setups-dns-routing: Unit tests for the DNS self-hosted-vs-external gate: roster filtering, contract provider routing, the
_acme-challengezones delegated inward to the deployment's ownnamedfor a wildcard leaf's DNS-01 challenge, and the write lane an operator deploy publishes its app names over. - nix-unit-setups-domain-claim-grant: Unit tests for who may write the operator domain claim ledger: the SSO policy a person logs in with may hand a name over, the operator graph's own token writes the same path, the rest of the central KV stays read-only from the UI, and the reader of the registrar account reads a claim by its name but cannot list or write the ledger.
- nix-unit-setups-firewall-policy: Unit tests for the environment's half of a node's
firewallresource: the ACME and DNS additions concatenate their published ports on a node that has both roles, the public uplink still takes the default:22off a node it delivers to, and the hypervisor adds the incus API, limits its container bridge to the ports ofhypervisor-reach.nixand does not trust it, and limits the operator sources to the ports of the resources of the node. - nix-unit-setups-forgejo-runner-pool: Unit tests for the CI runner pool of the
devgroup: the roster machines in the pool and the machine name of each, the instances, names andMemoryMaxof each memory tier, the labels of each instance, thehost-not-<peer>labels as the complement of the machine in the pool, and the assertion that the machine is in its own pool. - nix-unit-setups-garage-key-minter: Unit tests for the deploy targets of a deployment on
tfgarage provisioning without the operator graph: the target fails when a key with pair files has no minter in the group, and evaluates when each key has one. - nix-unit-setups-garage-kv-stems: Unit tests for the KV stems a garage request publishes into, and the OpenBao grants derived from them: the operator deployer may write every stem the graph publishes, the app node may read its own back, and both are granted again under the per-deployment KV prefix a namespaced deployment uses. Also the grants on the secrets that a retained
*-backupsbucket keeps: the deployer cannot reach them and can only create a retention record, and the garage node can delete them and the record with the bucket when the grace period of seven days ends, but cannot read a secret value. - nix-unit-setups-group-zone: Unit tests for the hosting-provider group's derived DNS zone: which node records it carries, the static seam publishing the bare-IP hypervisor's browser-facing name.
- nix-unit-setups-hypervisor-config: Unit tests on the realised hypervisor node: the served UI port survives the firewall resource's own definition, the published UI name is the one its nginx terminates, the bridge dnsmasq answers for every name the central garage node serves,
tpm2.targetdoes not wait out a start timeout on a resource-manager device this host has no chip for, the wait where it is pulled in anyway is bounded, the wait of a container guest for its TPM devices is bounded, no TPM is left as the host's hardware-RNG source, the shared-store login identity lingers, the incus reconciler holds no hard edge on incus or its preseed, so that its retry also covers a failed start of either, and an OpenBao reconciler wantsopenbao-initbut does not require it or restart with it. - nix-unit-setups-hypervisor-reach: Unit tests on the realised nodes of the hosting provider and the realised hypervisor for the ports of the hypervisor that the nodes on its container bridge dial: each dial to the bridge address or to a name that the bridge dnsmasq resolves to it is in
core/components/hosting-provider/hypervisor-reach.nix, each port in that list has a dial, the gate of the hypervisor accepts only these ports fromincusbr0and then drops all but ICMP, an unused port is closed to the bridge, the bridge is not a trusted interface, and the operator prefix reaches only the ports ofinstances. - nix-unit-setups-internal-reach: Unit tests on the realised garage node for what the deployer can reach: the v2 admin API is served but unpublished, and the deployment's own peers cover both the incus bridge subnet and the routed public-segment addresses, and the operator deployments on the bridge reach only the ports of the object store.
- nix-unit-setups-k8s-config: Unit tests on the network of a realised
k8s-hostsnode:systemd-networkddoes not manageeth0, the interface of the pod network, also whennetworking.interfacesdeclares it, the node does not runsystemd-networkd-wait-online, and the gate of thefirewallresource does not filtereth0, while it filterseth0on the same node underssh-hosts. Also that the host keys ofsshdare on the volume of the state of the node (/var/lib), and that the SPIRE agent of the node attests withk8s_psatand reads the trust bundle from the ConfigMap of the deployment. Also that the OpenBao node of thehosting-providergroup fails its assertions underk8s-hosts, as a pod has no TPM to seal the unseal key to, while itsgaragenode passes them. - nix-unit-setups-ldap-directory: Unit tests on the realised nodes for the KV path a group's lldap publishes its bind coordinates to and the central LDAP engine reads them back from: the engine cannot derive them, and an entry nobody writes is skipped in silence. Also the LDAPS leaf and the stop time limit of each lldap node.
- nix-unit-setups-ldap-grant: Unit tests on the realised hosting-provider
openbaonode for which cert-auth policy is granted read on which group's rotated LDAP bind credential: the grant is keyed by roster label, and a label naming no host emits no grant at all, which shows up only as that group's Authelia looping on an empty credential. - nix-unit-setups-lldap-mail: Unit tests on both groups' realised lldap and relay nodes: the password-reset mail settings, the credential the submission password arrives by, the relay's account and local sender domain, and the publicly trusted leaf the relay's submission listener has to carry.
- nix-unit-setups-mastodon-trust: Unit tests for the mastodon node's PKI trust seam: the default hiredis driver reads no CA from the environment, which the TLS-only valkey connection needs.
- nix-unit-setups-migration-keys: Unit tests for the
varsinstances that a migration carries as thekeysof a backup, on the realised operator nodes: the keys of mastodon, pixelfed and peertube that encrypt or sign data in their databases, the key seed of lldap, and the storage and OIDC keys of authelia. - nix-unit-setups-migration-pointers-grant: Unit tests for the grant on the state pointers of a migration import: the operator deployer token may write, read and delete them under each deployment's KV prefix, the operator graph builds the path the policy names, and the token may rotate the bind user of authelia on the ldap mount of each deployment but not read its password.
- nix-unit-setups-minted-garage-keys: Unit tests for the own-group garage keys the group's garage node mints itself: that no bucket the provisioner creates is left without a key, that the pair renders where the import reads it, and which keys with pair files no route mints when a deployment on
tfprovisioning does not use the operator graph. - nix-unit-setups-netbox-pinning: Unit tests for the NetBox register-vs-allocate rule: which nodes pin the address the group data names, and with which mask.
- nix-unit-setups-netbox-routing: Unit tests for the NetBox self-hosted-vs-external gate: roster filtering, contract provider routing, and the token-as-path secret seam.
- nix-unit-setups-node-selection: Unit tests for which roster nodes a deployment stands up: the component a node runs, the module-driven enablement backing the group-deploy default, that an explicit configuration is passed through and leaves unnamed nodes enabled, and the nodes an external NetBox or DNS service makes redundant -- including the wildcard that keeps
bindanyway. - nix-unit-setups-openbao-scoped-tokens: Unit tests on the realised hosting-provider
openbaonode for its scoped OpenBao tokens: each reconciler, the PKI leaf, the snapshot and the deployer token unit read their own token and no unit reads the root token. The policy of each token is held to the paths its unit uses, only the units that use root-protected paths getsudo, and no policy grants all paths, the ACL policies of other units, raw storage or tokens of any role. The deployer policies have nosudo,sys/orauth/path other than the child token, the CD and workstation deployer cannot write the token of the front-end node, and the SSO deployer login gives only the deployer policy. - nix-unit-setups-operator-config: Unit tests on the realised operator application nodes: each runs the spire-agent it logs in to OpenBao with, carries the
get_tpm_pubhashthe operator deploy execs to allow-list its TPM, and keeps the data of the application in all its backups for 30 days: each restic backup prunes with--keep-within 30d(backupRetention.application), and the media backup keeps its history for the same number of days; and the media buckets of Mastodon and Pixelfed allow CORSGETonly from the origin of the application, the media buckets of PeerTube from any origin for the players of other instances, and the backup buckets have no CORS rules. - nix-unit-setups-operator-peers: Unit tests on the gate of a realised node of an operator deployment: it trusts the provider prefix of the incus bridge and not the bridge subnet, no source covers a node of another operator deployment, and it admits the addresses of its own deployment from the guest API sets.
- nix-unit-setups-operator-publish: Unit tests on a realised operator deployment: which names it publishes an address record for, which the hosting provider's own names hold back, and that its nodes allocate an address rather than pinning one, that the plan of each node holds only data, and that its nodes dial the central OpenBao by the static name its leaf carries.
- nix-unit-setups-operator-reach: Unit tests on a realised operator deployment for the ports of the hosting provider that its nodes dial: each dial to a node of the provider or to the bridge gateway is in
core/components/hosting-provider/operator-reach.nixfor a resource that the node supplies, each port in that list has a dial, the ACL of the bridge limits each node of the provider to the ports of the resources that the node supplies, and its nodes reach the object store atgarage.<apex>, the FQDN of the central garage node. - nix-unit-setups-overview-uis: Unit tests on the realised
overviewnode for the browser UIs its page lists: only the nodes the deployment deploys, so an external NetBox gets no tile. - nix-unit-setups-pixelfed-database: Unit tests for the pixelfed node's database: the central postgres from the
postgresqlresult when routed, a local postgres on its socket when not, no mariadb in either case, the password only in the agent-composed.env, a backup that follows the database, and a refusedverify-*sslMode. - nix-unit-setups-pixelfed-rotation: Unit tests for the pixelfed node's secret rotation seam: the agent restarts
pixelfed-data-setuponly while active, so it must stay active and pass the restart to php-fpm and horizon; the list of oldAPP_KEYvalues is a file that the node generates. - nix-unit-setups-pixelfed-trust: Unit tests for the pixelfed node's PKI trust seam: php-fpm's
clear_envdrops the manager'sSSL_CERT_FILE, which the TLS-only valkey connection needs. - nix-unit-setups-pki-trust: Unit tests asserting the runtime OpenBao PKI CA bundle is named to systemd units and not only to login shells, and that both names resolve to a file the node's own writes produce.
- nix-unit-setups-plan-data: Unit tests on the plan of each node of each tester group: it holds only data, thus no function, derivation, string with a store context, or path outside the repository. The JSON writer and reader of
core/lib/plan-json.nixgive the same plan back. - nix-unit-setups-postgresql-render-gate: Unit tests asserting every unit that reads a database credential the openbao agent renders waits for that very file to carry a password, gives the render a bounded budget, and retries the run its own gate failed.
- nix-unit-setups-postgresql-roster: Unit tests for the two halves of one PostgreSQL roster -- what the shared postgres node pre-creates and what the central OpenBao database engine leases -- asserted against each other, a disagreement between them being invisible until runtime.
- nix-unit-setups-public-uplink: Unit tests for the public-uplink seam: which nodes the uplink delivers to, and the interface/gateway overrides that follow.
- nix-unit-setups-registrar: Unit tests for the delegation records a deployment publishes AT the registrar: that the surface is absent until a registrar is named and each spending or ordering coordinate is stated, that every resource gets its own state key, and that the apex
DSreads the same as four fields or as the whole record the node writes. - nix-unit-setups-resource-routing: Unit tests for which contract resources a deployment provides -- including the three routes that provide one while standing up no node of ours -- and for the eval-time assertion that fires where a node insists on a resource its deployment cannot provide.
- nix-unit-setups-served-aliases: Unit tests for the aliases and the mail records the hosting-provider setup derives from its components: each alias of the static table of
served-domains.nixis in the derived aliases, an SPF record for each sender name at the CNAME target, and the relay label and the DMARCruafrom the node that providessmtp. - nix-unit-setups-served-domains: Unit tests for the served-domain map and the public zone built from it: which names are published, and which are dropped for want of a record to alias.
- nix-unit-setups-shared-reads-grant: Unit tests on the realised hosting-provider
openbaonode for which cert-auth policies read the credentials of the hosting provider's own services: each instance only by the nodes that use it, as a grant to every host gives each tenant node the keys to the deploy runners, the database engine and the telemetry bucket. - nix-unit-setups-shared-store: Unit tests for which nodes boot off the Incus host's own
/nix/store: the provider lane sharing by virtue of the lane, the operator lane keying on the scoped store-serve identity reaching it, and the per-node opt-out for a component needing a writable store. - nix-unit-setups-smtp-relay-grant: Unit tests on the realised hosting-provider
openbaonode for which cert-auth policies are SMTP relays: the nodes that providesmtpin each group, by roster label, which alone read the upstream submission password and whose submission passwords only the nodes of the same group that send mail read, and which generate the authelia and lldap submission passwords. - nix-unit-setups-smtp-routing: Unit tests for the SMTP provider policy: which provider a group submits through, which upstream account its relay authenticates as, and the DKIM domain that is the only identifier on this path DMARC can align.
- nix-unit-setups-spire-registration: Unit tests for which deployments register their nodes' EKs with a SPIRE server, and against which node: the provider's own, the operator's cross-group resolution of it, the group under the per-app method that registers nothing, and the evaluation failure where no roster publishes a spire node.
- nix-unit-setups-spire-roster: Unit tests for the SPIRE host roster the server prunes stale identities against: which nodes are on it, and under which name.
- nix-unit-setups-ssh-defaults: Unit tests for the per-node SSH identity the
sshdeployment method resolves: the setup's own defaults, the operator map's defaults over them, and the per-node entry over both -- field by field, withsshOptsoverriding rather than appending, the operator-facingkeyFilerenamed to the submodule'skey-file, and ahostKeythat only the per-node entry gives. - nix-unit-setups-ssl-key-accounts: Unit tests for the accounts an
sslrequest names -- the user and the group the provider is asked to give the private key -- asserted against the account table of the node that issues the certificate, the request and the account being spelled in separate modules andinstallrefusing a name it cannot resolve. - nix-unit-setups-supporting-requests: Unit tests for the cross-group collection of supporting requests -- what the hosting provider's shared garage, postgres, openbao and authelia nodes read of the operator and hypervisor groups' requests -- including that a collection forces only the group it reads and that the raw machine facts force no model.
- nix-unit-setups-terraform-backend-config: Unit tests on the realised terraform-backend node, the component alone: the backend binds loopback only, the nginx front sends the requests for a state and the health check to it and serves only TLS, the bootstrap port of the front serves the same locations and is open to the internal sources but not published, a request for a state needs a password and a permission and the backend gets
basic:fake-secretin place of the credential of the deployer, the state key is the file thatgenerateFilesmakes on the node and not an OpenBao secret, the service waits forgenerate-varsand not for an OpenBao agent, and a switch does not restart the service that holds the locks. - nix-unit-setups-tf-backend-htpasswd: Unit tests on the realised state backend node of the hosting-provider group for the credentials of the deployers at its front: the
TF_BACKEND_HTPASSWDenv key has priority over the group datatfBackendHtpasswd, with neither the evaluation stops with an error that namesTF_BACKEND_HTPASSWD, a user that is not a deployer fails an assertion, and the in-tree evaluation gives the test credentials. - nix-unit-setups-tls-routing: Unit tests for the certificate-audience split: which served names stay on the private CA, which move to the public issuer, and where they go when there is no issuer -- including the names that reach a node without an
sslrequest at all. - nix-unit-setups-tls-trust: Unit tests for which served domains a node trusts at the private CA root: a redis consumer trusts the node that provides
redis, and a group with no provider ofredisgives no valkey address to trust; the node that providesoteltrusts the telemetry ingest CA, and so does a node whose component setswiring.auditLog; the node that providespkifetches no CA, and every other node fetches it. - nix-unit-setups-valkey-config: Unit tests on the realised valkey node: every unit that reads the PKI CA off disk at start is ordered after the runtime fetch that writes it, the redis-commander config renderer owns a retry and re-pulls the UI whose start job its own failure discards, and each instance keeps its user set in an ACL file under its own state directory, rewrites that file's
defaultline at every start, and saves theapppassword it repairs. Also that the redis-commander UI is behind the forward-auth vhost, which sends each request to the address that the UI binds, that the UI port is not open in the firewall, and that a node without theforwardAuthentry of the UI runs no UI. Also that its cache backups prune to the retention of the applications (backupRetention.application). - nix-unit-setups-valkey-coordinates: Unit tests on the seam between the central OpenBao valkey-database engine and the valkey nodes it brokers for: the engine states no instance address of its own, never names the hosting provider's own valkey node, reads each address back from exactly the KV path that namespace's valkey node publishes it to, and renders each static role only together with its connection.
- nix-unit-setups-valkey-gate: Unit tests asserting an application's migration runner waits for a verified TLS connection to the cache it dispatches jobs on, and probes the address its own client uses.
- nix-unit-setups-valkey-tls-agreement: Unit tests asserting the valkey node and its pixelfed client agree on TLS: both read
resources."cache".redis.tls.enable, with TLS turned off as well as under the PKI plan. - nix-unit-setups-vars-prefix: Unit tests for the vars KV prefix rules: the shared prefix, the per-deployment subtree a namespaced deploy carries its id in, the
+glob the provider's policies name it with, the cache-backup bucket name, and that the operator TF graph writes the subtree Nix names. - nix-unit-setups-vars-reload: Unit tests for the converge a rendered vars file carries -- the units the openbao agent signals after it writes a file again, over each value a reader takes once and then holds -- asserted on the realised nodes, the render path and the reader being spelled in separate modules with nothing else to hold them together.
- nix-unit-setups-wildcard-tls: Unit tests on the realised garage node for the wildcard bucket-endpoint names: routed to the public issuer over DNS-01 where the deployment can answer one and to the private CA where it cannot, always under a cert name carrying no
*. - nix-unit-setups-windmill-config: Unit tests on the realised windmill node: its UI -- whose open-source build can do no SSO of its own -- is fronted by an authelia forward-auth vhost that redirects an unauthenticated browser to the portal, passes the job-log websocket through, and no longer registers a dead OIDC client with windmill's own settings API; it reads for itself, from its own OpenBao render files, each credential the front-end node keeps off the job it submits; and each worker gives every
root:windmillrender file to its dynamic group again before it starts. - nix-unit-setups-zone-publication: Unit tests for the two independent questions behind one zone publication: where the records come from (external IPAM, read back at deploy time, or the eval-time zone) and where they go (an external service's API under a token, or this deployment's own
namedover RFC2136 under a TSIG key) -- including the apex delegation, which a self-held zone must state or plan for deletion. - nix-unit-testers: Every
nix-unit-testers-*suite in one evaluation, as CI builds them. - nix-unit-testers-leaf-boundary: Guard test holding that no Nix file under
core/refers to a path of theapiorpanelleaves or imports the repository root entrypoint, and that no source file undercore/outside the specs and the docs names a source file, a node or an option namespace of these leaves in its text, with the samples that each scan must find and must not find. - nix-unit-testers-machine-kind: Guard test holding that each VM of a NixOS test under
core/states, in the comment directly above it, the feature for which it cannot be a container, with the samples that the scan must find and must not find. - nix-unit-testers-oidc-routing: Unit tests for what an app node templates in for single sign-on: a test deployment carrying no authelia node asks for no client secret, one carrying authelia does, and a production node keeps it regardless.
- nix-unit-testers-openbao-pki: Unit tests asserting the test OpenBao
serverNodePkiruns the PKI engine of production with a role for the bare test names, and that a test node issues its leaf at and fetches the CA from theopenbaocontainer only when that container serves the PKI engine. - resources-secrets-agenix:
fileSecretscontract conformance test for the agenix provider. - sbom-vendored: Unit-test the step of the SBOM of a node that adds the npm packages, the Rust crates and the Go modules that a package vendors, against a fixture store, and the parents that the license report gives for them.
- test-forgejo-service: NixOS test of the forge node at run time: forgejo with MariaDB behind nginx and its Anubis gate,
security.txt, the mailer against a stand-in relay, the access log, the dispatch of a job to a runner while another runner claims the oldest job, and a git-pages site that a forge user with push access uploads. It pins that the machine-readable repo paths (/raw/,info/refs, ...) reach forgejo unchallenged for a browser user agent carrying no Anubis cookie, while the expensive HTML views are still gated. - test-incus-oidc-login: NixOS test of the OIDC login of the Incus UI and API through authelia and its lldap directory, with a script in place of the browser.
- test-incus-service: NixOS test of the hosting-provider Incus host.
- test-ldap-engine: NixOS test of the OpenBao LDAP secrets engine rotating the dedicated
authelia-bindaccount in the lldap directory (mint, real bind, rotation survival). - test-lldap-admin-release: NixOS test that a changed
adminUserreleases the recovery address from the account holding it, so the seeded directory admin lands under its new name instead of the create being rejected on every start. - test-lldap-mail: NixOS test of lldap's password-reset mail against the real maddy relay: the rendered settings, the submission password staged as a unit credential, lldap's own transaction reaching certificate validation, a live authenticated send under its identity, and the reset through the forward-auth vhost of lldap's UI with no session.
- test-lldap-seed-isolation: NixOS test that an unseedable lldap user is reported without withholding another seeded user's groups.
- test-mastodon-service: NixOS test deploying the Mastodon service.
- test-monitoring-storage: NixOS test that collector signals reach the garage-backed Loki/Tempo/Mimir stores through the ingest vhost and are queryable back, that Grafana's datasources, dashboards and alert rules are provisioned with a live drilldown panel behind each rule, and that the provisioned datasources and contact points work after a change of Grafana's secret key, that a deliberately failed backup unit drives its rule to
Alerting, and that the database and bucket sizes reach Mimir labelled with their deployment. - test-netbox-consumers: NixOS test of the NetBox component on a running node: the
postgresql,oidc,smtpandotelconsumers, and the API token that the node writes to OpenBao KV. - test-netbox-service: NixOS test of the hosting-provider Netbox service.
- test-otel-collector-service: NixOS test of the OpenTelemetry collector service.
- test-otel-wiring: NixOS test of OpenTelemetry collection wired across services.
- test-peertube-service: NixOS test deploying the PeerTube service.
- test-pixelfed-service: NixOS test deploying the Pixelfed service.
- test-valkey-service: NixOS test of the hosting-provider valkey node + OpenBao valkey-database engine (per-tenant ACL, rotation).
- tf-providers: Build the from-source OpenTofu providers, assert the plugin mirror holds each one at its pinned version, assert the lock file of
netbox-seedselects the pinned netbox version, and assert each vendored schema still matches its provider, also the schemas of the declarative-runtime pairings. - treefmt: Check that the project tree is formatted
- vulnix-report: Unit-test the report of the
vulnixscan against a fixture and a stub forge: the summary, one issue for each new CVE of high or critical severity, and the check for an open issue.
Repo-root checks
- reuse
- treefmt: Check that the project tree is formatted