The shipped examples had drifted from the code that parses them:
- configs/cluster.json was still in the pre-v3 format: no top-level "name",
"numberOfNodes" instead of the required "nodes" node-list expression, plain
numbers instead of MetricValue objects for flopRateScalar/flopRateSimd/
memoryBandwidth, unit strings instead of unit objects, "aggregation": null,
and hwthread 72 missing from the core topology. It neither validated against
cluster.schema.json nor decoded into schema.Cluster. Rewritten in the current
format and extended with the accelerator metrics the GPU subclusters need.
- archive.retention.location is not a field of taskmanager.Retention. That
decode is not strict, so the key was silently dropped and a "move" policy ran
with an empty target path. Replaced with target-kind/target-path.
- "ui-file" pointed at ui-config.json while the shipped file is uiConfig.json,
so ccConfig logged a load error and the UI fell back to defaults.
- Added the options introduced since the examples were written: checkpoint
file-format/interval/max-wal-size, api-subjects concurrency, db-config,
nodestate-retention, archive retention/compression, smoothing-window and the
resample policy/algo defaults.
The config written by -init had no metric-store section, so a server started
right after -init aborted with "missing metricstore configuration".
internal/configexample guards all of this: it resolves "-file" references the
way ccConfig does, strict-decodes every section into the struct that actually
parses it, and validates the cluster configs against the cc-lib schema.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Average consolidation makes every plotted point the true arithmetic mean of
its interval, which is what the Ganglia-style plot appearance depends on.
LTTB deliberately keeps extremes instead, so a plot downsampled with it
cannot be read as interval means.
resolveResampleAlgo used to return an empty string when neither the user nor
the config had chosen an algorithm, and cc-lib's GetResampler maps that to
LTTB. Route every fallback through config.ResampleAlgo() and ship "average"
as the generated and example default.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Add a "main.footer-links" config option so the footer Imprint and
Privacy Policy links can point at internal pages (default) or external
URLs. External http(s) targets open in a new tab; empty/unset values
fall back to the built-in /imprint and /privacy routes, keeping the
existing ./var/*.tmpl override mechanism intact.
Closes#517
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Entire-Checkpoint: c5dca72c848f
Secrets (JWT keys, LDAP sync password, OIDC client id/secret, cross-login
keys) are now configured directly in config.json under the auth section
where they are used. Each secret can still be supplied via its existing
environment variable, which takes precedence over the config value.
The godotenv dependency, the .env file, configs/env-template.txt and the
loadEnvironment() bootstrap step are removed. -init now writes the demo
JWT keys into config.json instead of a .env file.
Closes#283
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Entire-Checkpoint: 3a7cb814c53f
If there is an external service like an AuthAPI that can generate JWTs and
hand them over to ClusterCockpit via cookies, CC can be configured to
accept them