Repository navigation
fix: Keel screens follow the appliance manifest, and fit 80x24 - #19
Merged
Merged
Conversation
added 3 commits
October 2, 2026 13:47
The maintainer's screenshots of the Keel Web step 8 image on Proxmox showed Database mode on an appliance with no database, WireGuard in the first menu of a simple installation, a Keel Cloud screen asking for a key nobody can generate, and descriptions cut at the box edge. keelmenu.py reads the appliance the spec names, resolved along its chain by keel itself (keel.manifest.facts.gather, decision 0041), and the installation mode: Database mode only with a mariadb or postgresql data service in the chain; Overlay network in the menu in the cloud modes or once the overlay is in use, behind a new Advanced entry otherwise; Keel Cloud only once /etc/keel/cloud-endpoint names the service, which also gates the first boot step 80keel-cloud runs. A chain that cannot be read keeps the screens a machine had. keelfit.py sizes the boxes: a menu as wide as its widest choice or line, a message box as its text, both up to what the terminal leaves, so nothing is cut and nothing is drawn over the backtitle. Show drift stacks its table when it is wider than the box, the overlay screen lists one line a peer, and the Keel descriptions fit 80 columns, held by a test. The overlay address text says it is this node's address on Keel's private mesh, randomly generated, not a LAN address.
On a terminal of 8 columns the box had 0 columns for its text, so text_rows was asked to wrap at 0, and a box height of 0 is dialog's own autosize, which draws over the backtitle. The text gets at least one column and box() at least one row and one column; text_box goes through box(). Review of confconsole#19.
…gine Review of confconsole#19 and the maintainer's Redis request. /etc/keel/cloud-endpoint turns Keel Cloud on only when it holds one https URL with a host (a bracketed IPv6 literal allowed), in a regular file root owns that neither group nor others can write. Anything else keeps the screens hidden and logs why; no file stays quiet. docs/Instance.rst gives the format. Database mode shows for a mariadb, postgresql or redis data service, one set (keelmenu.DATA_ENGINES), and wherever the description declares database.server, even when the chain resolves with no engine. Its Cloud roles are offered only for an engine whose replication keel applies: keel validates a Redis or PostgreSQL primary and replica but converges MariaDB's alone (system/database.py notes the others and changes nothing), so those engines get Standalone, and the first boot asks them no role instead of writing one nothing makes.
marcos-mendez
pushed a commit
that referenced
this pull request
Oct 2, 2026
The role screen change moves to keel13: master's keel12 is the Instance menu from the appliance manifest (#19).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The maintainer's review of the Keel Web step 8 image on Proxmox: Database mode on an appliance with no database, WireGuard in the first menu of a simple installation, a Keel Cloud screen asking for a key nobody can generate yet, and menu descriptions cut at the box edge.
What changes
Menus from the manifest (decision 0041).
keelmenu.pyreadsappliance.nameandinstallation.modefrom the spec and asks keel to resolve the chain (keel.manifest.facts.gather, the resolution behindkeel manifest show --resolvedandkeel spec validate), so confconsole holds no second copy of the rules.mariadborpostgresqldata service is in the chain (an overlay thatprovidesit, or an application service). Not on Keel Core or Keel Webwireguardis in the chain; in the Instance menu incloud_simple/cloud_advancedor once the spec enables or configures the overlay, otherwise behind a new Advanced entry/etc/keel/cloud-endpointholds an endpoint; hidden by defaultA chain that cannot be read (no keel, no manifests as on pre-0041 images such as the WordPress templates, no
appliance.name) keeps the screens as before, the overlay behind Advanced.Keel Cloud gated. The Instance entry is hidden, run by name it says Keel Cloud is not available, and
keelfirstboot.py cloud, which inithooks'80keel-cloudruns, asks and stores nothing (keel-init and a preseededHUB_APIKEYincluded). The screen, its tests and the first boot step stay; writing/etc/keel/cloud-endpointturns them on. inithooks is not changed:80keel-cloudonly callskeelfirstboot.py cloud, which carries the gate, so there is nothing to merge after inithooks keel17.Nothing cut at 80x24.
keelfit.py: a menu is as wide as its widest choice or text line, a message box as its text, both up to what the terminal leaves (keelbanner.available), so no box is drawn over the backtitle; an item is shortened with an ellipsis only past the full width. Show drift stacks its table two lines a field when it is wider than the box (every row wrapped in two at 80 columns). The overlay screen lists one line a peer, at most three, so its menu keeps its rows (two peers drew the menu over its buttons). The Keel descriptions were shortened and a test holds every Instance menu to 80 columns.Overlay address wording. The Address form says the suggestion is this node's address on Keel's private mesh, randomly generated, not a LAN address; the first node keeps it, the others take
::2,::3on the same /64; the port is the UDP port the other nodes reach.Found, not changed here
The installed overlay manifests name screens confconsole does not ship:
wireguard.yamlhasscreen: /usr/lib/confconsole/plugins.d/Networking/wireguard.py(the screen isInstance/Overlay_network.py) andcrowdsec.yamlhasSecurity/crowdsec.py(no CrowdSec screen exists). The rules here key on the overlay and the engine, not on that path.Test plan
set -o pipefail; coverage run --branch -m pytest tests: 789 passed, 7 skipped; 100 percent lines and branches over the measured package, which gainskeelfitandkeelmenu; with keel's library on the path 796 passed (the real-resolution tests run)keelmenu.machine()resolves web (core, web) and core with no data engine;keelfirstboot.py cloudskips with and without_TURNKEY_INITcloud_simple(Overlay in the menu), Keel Cloud with the flag on, and run by name with it offReview follow-ups (9d80eda, 1f96eb9)
/etc/keel/cloud-endpointmust hold onehttpsURL with a host (bracketed IPv6 allowed), in a root-owned regular file not writable by group or others; anything else keeps Keel Cloud hidden and is logged. Format in docs/Instance.rst.keelfitnever passes dialog a size of 0 (tested at 8 columns).database.server, and for Redis: the engines are one set,keelmenu.DATA_ENGINES = {"mariadb", "postgresql", "redis"}.primary/replicafor Redis (and PostgreSQL) butkeel spec applyconverges MariaDB only (system/database.pyreturns a note for any other engine), and keel-redis's boot test expectsstandaloneonly. So Redis gets Database mode > Standalone, no Cloud submenu, and the first boot asks it no role. PostgreSQL loses the Cloud submenu for the same reason. Adding an engine toREPLICATING_ENGINESturns it on once keel applies it.