feat(connection): add history_server_url config field

Add a new optional field to Connection for the Spark History Server
base URL. The field is stored as part of the connection but is not
yet consumed by any tool — for now it's a labeled place to record
where SHS lives on the cluster, and a hook for future SHS-specific
tools. To actually fetch SHS endpoints today, use fetch_url with the
SHS host added to url_allowlist.

The field is Optional[str], default None. Same nullability as
yarn_rm_url. The SHS host and the YARN RM host are usually
different, so this is independent of yarn_rm_url.

Schema:
  - models.py: Connection.history_server_url (str | None, default None)
  - requests.py:
    - SaveConnectionRequest.history_server_url (str | None, default None)
    - UpdateConnectionRequest.history_server_url (str | None, default None)
  - tools/connections.py: save_connection signature gains
    history_server_url with the _UNSET sentinel pattern (same as
    yarn_rm_url, url_allowlist, etc.) so the upsert path correctly
    distinguishes "not provided" from "explicitly None".
  - tools/connections.py: update_connection docstring lists the new
    field in the mutable fields set.

Tests (4 new in tests/unit/test_connection_tools.py):
  - test_save_connection_with_history_server_url
  - test_save_connection_history_server_url_defaults_to_none
  - test_update_connection_changes_history_server_url
  - test_update_connection_keeps_history_server_url_when_omitted

Tests: 398 passed (was 394, +4 net).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Claude
2026-07-09 16:24:05 +08:00
co-authored by Claude Fable 5
parent f43e5b6403
commit 8ededc50a9
4 changed files with 70 additions and 1 deletions
+17
View File
@@ -134,6 +134,14 @@ class SaveConnectionRequest(BaseModel):
"populated via update_connection."
),
)
history_server_url: str | None = Field(
default=None,
description=(
"Optional Spark History Server (SHS) base URL, e.g. "
"'http://history.prod.internal:18080'. Stored for reference. "
"Currently not consumed by any tool — see Connection.history_server_url."
),
)
class PrepareSubmitJobRequest(BaseModel):
connection: str = Field(
@@ -477,6 +485,15 @@ class UpdateConnectionRequest(BaseModel):
"Example: ['ccam*'] allows ccam1-ccam99."
),
)
history_server_url: str | None = Field(
default=None,
description=(
"New Spark History Server base URL. Omit to keep current. "
"Pass None to clear (use delete_connection + save_connection "
"if you need explicit clear semantics; same caveat as other "
"Optional fields in this tool)."
),
)
class ListApplicationsRequest(BaseModel):