Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
800a77c
refactor: hoist the duplicated _configure_mock_accelerator to base Co…
devyubin Jun 16, 2026
d72cba0
refactor: drop the no-op python.py and dead pkg.py modules
devyubin Jun 16, 2026
3979844
refactor: extract a shared _build_install_info for Dev/Package hydrate
devyubin Jun 16, 2026
1b2662a
fix: start the install in non-interactive PACKAGE mode
devyubin Jun 16, 2026
7246d6d
refactor: drop 59 type:ignore by typing tomlkit documents as Any
devyubin Jun 16, 2026
f9ea1bc
refactor: type the hydrate extra-service kwargs with a TypedDict
devyubin Jun 16, 2026
ded53e9
fix: re-raise CancelledError in run_exec after reaping the child
devyubin Jun 16, 2026
228bd57
Merge branch 'main' into refactor/installer-cleanup
devyubin Jun 17, 2026
f75915d
docs: add changelog fragment for installer cleanup (#12242)
devyubin Jun 17, 2026
24e6a1c
Merge branch 'main' into refactor/installer-cleanup
devyubin Jun 17, 2026
2cede2c
Merge branch 'main' into refactor/installer-cleanup
devyubin Jul 3, 2026
0618750
Merge branch 'main' into refactor/installer-cleanup
devyubin Jul 3, 2026
4e1354f
Revert "refactor: drop 59 type:ignore by typing tomlkit documents as …
devyubin Jul 3, 2026
e40cdae
refactor: group harbor and sftp-agent service options into dataclasses
devyubin Jul 3, 2026
826a810
chore: address installer PR review feedback
devyubin Jul 3, 2026
ed9400b
refactor: freeze the installer harbor/sftp option dataclasses
devyubin Jul 3, 2026
a074c8d
refactor: require all fields on installer option dataclasses
devyubin Jul 3, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changes/12242.enhance.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Clean up the single-host TUI installer internals, and fix two install-flow bugs: `--non-interactive --mode PACKAGE` never starting the install, and an aborted install continuing instead of stopping.
25 changes: 17 additions & 8 deletions src/ai/backend/install/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -442,8 +442,9 @@ def compose(self) -> ComposeResult:
"""
)
)
if service.harbor_enabled:
harbor_url = f"http://{service.harbor_hostname}:{service.harbor_http_port}"
if service.harbor is not None:
harbor = service.harbor
harbor_url = f"http://{harbor.hostname}:{harbor.http_port}"
with TabPane("Harbor", id="harbor"):
yield Markdown(
textwrap.dedent(
Expand All @@ -462,7 +463,7 @@ def compose(self) -> ComposeResult:

Admin credentials:
- Username: `admin`
- Password: `{service.harbor_admin_password}`
- Password: `{harbor.admin_password}`

The Harbor instance is also pre-registered as a Backend.AI
container registry named `local-harbor` (project `library`)
Expand All @@ -474,14 +475,15 @@ def compose(self) -> ComposeResult:
"""
)
)
if service.sftp_agent_enabled:
if service.sftp_agent is not None:
sftp = service.sftp_agent
with TabPane("SFTP Agent", id="sftp-agent"):
yield Markdown(
textwrap.dedent(
f"""
A dedicated SFTP agent has been configured alongside the
regular compute agent, assigned to the
`{service.sftp_agent_scaling_group}` scaling group.
`{sftp.scaling_group}` scaling group.

Start it in a separate shell (or via the `./dev` helper):
```console
Expand All @@ -496,8 +498,8 @@ def compose(self) -> ComposeResult:
```

The SFTP agent listens on:
- RPC: `{service.sftp_agent_rpc_addr.bind.host}:{service.sftp_agent_rpc_addr.bind.port}`
- Watcher: `{service.sftp_agent_watcher_addr.bind.host}:{service.sftp_agent_watcher_addr.bind.port}`
- RPC: `{sftp.rpc_addr.bind.host}:{sftp.rpc_addr.bind.port}`
- Watcher: `{sftp.watcher_addr.bind.host}:{sftp.watcher_addr.bind.port}`

SFTP upload sessions created via the web UI will be routed
to this agent; regular compute sessions continue to run on
Expand Down Expand Up @@ -662,7 +664,14 @@ def start_package_mode(self) -> None:
pkg_type_menu._dist_info = self._dist_info
pkg_type_menu._install_variable = self.install_variable
switcher.current = "pkg-type-menu"
self.app.query_one("#pkg-type-list", ListView).focus()
lv = self.app.query_one("#pkg-type-list", ListView)
lv.focus()
if self._non_interactive:
# The package-type submenu has no separate non-interactive
# auto-select, so a `--non-interactive` run would stall here. Pick
# the only option (RELEASE PACKAGE) to actually start the install.
li = self.app.query_one("#pkg-type-release", ListItem)
lv.post_message(ListView.Selected(lv, li, list(lv.children).index(li)))

@on(ListView.Selected, "#mode-list", item="#mode-maintain")
def start_maintain_mode(self) -> None:
Expand Down
Loading
Loading