Settings
Settings is the admin-only, central environment-profile editor. An
environment (env) is a named settings blob — base URLs, credentials,
emulator/ACS targets, MCP services, ClickHouse, Platform DB, Log Server,
TestRail — stored centrally in the gateway profiles table (not in any
single container’s run-reports/settings.json). A run picks an env from the
environment dropdown that opens the run bar in Test cases; the gateway then materializes that env’s
settings onto a worker (PUT /api/settings as admin) immediately before
starting the run.
The screen is split into five sections, each with its own link
(#settings/<id>) so a colleague can be sent straight to the right one:
| Section | Anchor | What lives there |
|---|---|---|
Profile & portals |
|
Support / Management portal URLs, Backend UI URL, username and password, and
the ISP mode policy ( |
Emulator & ACS |
|
TR emulator URL, ACS URL, IoT emulator URL, and the USP ACS target (host, port, MTP, controller Endpoint ID). |
Stand services |
|
Configs Service, and the collapsible blocks: ClickHouse, Platform DB (with Test connection), Log server (SSH), NBI, and File server (FTP and HTTP addresses plus credentials). |
Run behaviour |
|
Pause between steps (entered in seconds), Sweep foreign domains before a run, and the domain skip-list. |
Integrations |
|
TestRail URL / email / API key / auto-sync interval, plus the Validation scan card. |
|
Non-admins cannot see this section at all. They still select an env per run from the environment dropdown in the Test cases run bar — they just cannot view or edit the profiles behind it. See Accounts, Roles & Audit and Running Tests for the run-time selection. |
|
At a glance
|
A profile populates defaults — individual YAML cases still override
per-test via their own base_url / credentials / emulator_serial fields.
For the full env model, gateway routing, and stand binding see
Environments & the Gateway.
|
Environment Profiles
The profile bar at the top of the tab manages the central profile set. All
profile mutations are admin-only and persist in the gateway profiles table
(scripts/auth_db.py — name, settings_json, created_by, updated_at).
| Control | Behaviour |
|---|---|
Environment profile (dropdown) |
Lists every central profile ( |
Save |
Upserts the current form as the selected (or newly named) profile
( |
Delete profile |
Removes the selected profile. The button sits at the right end of the row and asks first. The button calls |
Export all / Export selected |
Downloads a JSON backup — all profiles, or just the selected one — for versioning or transfer to another gateway. |
Import |
Uploads a previously exported JSON file and upserts the profiles it contains. |
A profile can be bound to a stand so that stand defaults to that env. Stand binding and worker provisioning are covered in Environments & the Gateway.
What Lives in an Env Profile
These are the core fields stored in each profile. Switching environments is a matter of selecting (or authoring) a profile with the right set — you no longer hand-edit four URLs on a shared container.
| Field | Notes |
|---|---|
Support Portal URL |
Where the agent navigates for tests with |
Management Portal URL |
Same for |
Backend UI URL |
|
TR Emulator URL |
TR-069 emulator HTTP API base. |
TR Emulator MCP URL |
|
ACS URL |
The ACS endpoint the emulated device reports to (written to
|
ACS Username / Password |
Basic/Digest credentials for authenticated CWMP registration. Empty = no auth
(use the plain |
IoT Emulator URL |
REST base of the IoT emulator (USP / LwM2M / MQTT agents). Unlike the
TR-069 sidecar, |
USP ACS Target |
Host, port, MTP and controller Endpoint ID the emulated USP agent connects
to. In a k8s env the emulator runs next to the ACS, so the in-cluster service
name is right ( |
MQTT Broker |
Host, port, username, and password of the broker the emulated MQTT device connects to.
The default port is |
Username / Password |
Default portal credentials when a YAML leaves them blank. Default:
|
| Keep the portal, backend, emulator, and ACS hosts inside one environment within a single profile. A mixed profile sets parameters on one emulator and reads state from another. |
Platform DB
Drives the db_query step type (scripts/platform_db.py) — a state-read
against the platform’s primary relational DB (one of MySQL / Oracle).
| Field | Notes |
|---|---|
Platform DB Type |
|
Platform DB Host |
DB host. Default |
Platform DB Port |
Blank/invalid falls back to the engine default (MySQL 3306, Oracle 1521). Default |
Platform DB Name |
Schema name for MySQL; the service_name for Oracle thin-mode DSN ( |
Platform DB User / Password |
Connection credentials. |
Log Server
Drives the log_check step type (scripts/log_server.py) — an SSH login that
greps device/server logs for error patterns after a test runs. Stand-specific:
an empty host disables the feature.
| Field | Notes |
|---|---|
Log SSH Host |
SSH host. Empty = log checks disabled. |
Log SSH Port |
Default |
Log SSH User / Password |
SSH credentials. |
Log Dir |
Directory the log files live in. |
Log Error Pattern |
Regex / substring the check scans for. |
MCP Services
| Field | Used by |
|---|---|
BBF Tree MCP URL |
The Generate Tree button in the Editor (NL → XML tree) and the converter’s
Stage 2 LLM enrichment ( |
Qdrant MCP URL |
Direct Qdrant access for the converter’s |
Knowledge MCP URL |
Stateless retrieval over |
The TR-069 emulator MCP and the Playwright MCP are launched inside the worker container — no URL configuration needed.
ClickHouse
Optional block (collapsed by default — click the ▸ arrow to expand).
Used only when INTERFERENCE_DASHBOARD_SEED=true and a test has the
RUN_INTERFERENCE_DIAGNOSTICS UI precondition. The agent writes synthetic
points into ftacs_qoe_ui_data so the interference history widget renders
deterministic colours / counts.
| Field | Default |
|---|---|
ClickHouse URL |
|
Database |
|
User |
|
Password |
(redacted in GET responses) |
TestRail Credentials & Links
Mandatory before any TestRail-import / reimport flow works.
| Field | Notes |
|---|---|
TestRail URL |
|
TestRail Email |
Personal SSO email or team account. |
TestRail API Key |
Generated from TestRail user profile → API Keys. Redacted in GET responses. |
Auto-sync Interval (min) |
|
Jira Base URL ( |
Browse-URL prefix used to render a case’s Reference field as a clickable
link. Default |
The connection pill on the Tests tab and inside the TestRail modal reflects the current credential validity.
Secret Redaction
Secret fields are never returned verbatim over the Settings HTTP API — a GET
masks each non-empty secret as **. The redacted keys are password,
acs_password, clickhouse_password, platform_db_password,
log_ssh_password, nbi_password, and testrail_api_key.
When the UI re-submits a profile it round-trips the mask for any secret the user
did not change; the server swaps the mask back for the stored value on save, so
a save never overwrites a real secret with the mask. An empty secret stays
empty (so the UI can tell "unset" from "set"). Internal callers read the real
values directly via load_settings().
Saving
-
Save — upserts the form as the selected/named central profile (
POST /api/gateway/profiles). URLs are validated (must parse ashttp(s)://…). -
Reload / profile re-select — re-reads the profile from the gateway.
-
The status text next to the buttons shows the result (green = saved, red = validation error).
Settings take effect for new runs (the env is materialized onto the worker at run start) and new conversions. Already-running tests are not interrupted.
Environment Variable Overrides
For Docker Compose / Portainer deployments where a worker’s local
settings.json is the source of truth (e.g. the gateway is not materializing an
env), most fields can be set via environment variables.
|
The file wins over the environment
The layers merge as hardcoded defaults < environment < If an override "does not take", that is why. Change it in the profile, or clear the key from the file. Two related behaviours: saving writes only the keys that actually changed, and a profile key left deliberately blank disables the layer beneath it rather than falling through to it. |
Not every field has an override. step_delay_ms, sweep_foreign_domains,
sweep_domain_allowlist and isp_mode_policy are profile-only.
| Field | Env variable |
|---|---|
Support Portal URL |
|
Management Portal URL |
|
Backend UI URL |
|
TR Emulator URL |
|
TR Emulator MCP URL |
|
ACS URL |
|
ACS Username |
|
ACS Password |
|
IoT Emulator URL |
|
IoT Emulator MCP URL |
|
USP ACS host |
|
USP ACS port |
|
USP MTP |
|
USP controller Endpoint ID |
|
MQTT broker host |
|
MQTT broker port |
|
MQTT username |
|
MQTT password |
|
Username |
|
Password |
|
BBF Tree MCP URL |
|
Qdrant MCP URL |
|
Knowledge MCP URL |
|
ClickHouse URL |
|
ClickHouse Database |
|
ClickHouse User |
|
ClickHouse Password |
|
Platform DB Type |
|
Platform DB Host |
|
Platform DB Port |
|
Platform DB Name |
|
Platform DB User |
|
Platform DB Password |
|
Log SSH Host |
|
Log SSH Port |
|
Log SSH User |
|
Log SSH Password |
|
Log Dir |
|
Log Error Pattern |
|
Jira Base URL |
|
TestRail URL |
|
TestRail Email |
|
TestRail API Key |
|
TestRail Auto-sync minutes |
|
Behaviour Flags (worker environment, not profile fields)
Separate from the settings layer, a set of FT_* variables switches runner
behaviour. They are read from the worker’s process environment only — they are
not profile fields and do not appear in the Settings screen. The ones worth
knowing:
| Variable | Default | Effect |
|---|---|---|
|
on |
An LLM PASS that quotes nothing the capture contains is recorded as
|
|
on |
Keep the viewport image of the first failing step of a run. Set to |
|
on |
Photograph every step with an expectation right after the step. The first
inconclusive step keeps its image. The first failing step prefers its own image
to the live capture. Set to |
|
on |
Keep the device parameter tree of a failed run. The runner keeps the tree
only when the run applied parameters to the emulator. Set to |
|
off |
Enables the failure-diagnosis helper and the whole Learning surface
( |
|
|
|
|
on |
Wait out a spent Claude usage quota instead of abandoning the batch. The wave
card and the report header show a PAUSED … quota resumes pill while it waits.
|
|
on |
The generated Playwright script reports step progress back mid-segment, so a long navigation segment does not look frozen. |
|
|
Read deadline for every TestRail API call — the time one response may go without sending a byte before the call fails. The connect deadline is the smaller of 10 s and this value. There is no way to switch the deadline off (an unbounded call is what wedged an import): to make it effectively unlimited, set a large number of seconds. A value that is not a positive number is logged and ignored. |
|
|
The same, for downloading or uploading an attachment — a file transfer gets
its own, larger read budget. Never smaller than |