The lab answers the installer's questions the unattended way
The installer asks where a human must choose, and this bed has no human — so every choice arrives as a flag, and a required choice with no flag is the installer refusing, which is the behaviour rather than a lab problem. Both choices have one option today, so the flags are redundant on purpose: the day a second filter exists this bed keeps working instead of refusing, and choosing becomes a thing it visibly does. Claude-Session: https://claude.ai/code/session_01D6qtiYU3P9jk3pnAXyAFyx
This commit is contained in:
+12
-12
@@ -7,7 +7,7 @@
|
|||||||
"code": "R1",
|
"code": "R1",
|
||||||
"title": "a bare machine becomes a mesh of one, raised by the installer",
|
"title": "a bare machine becomes a mesh of one, raised by the installer",
|
||||||
"status": "pass",
|
"status": "pass",
|
||||||
"seconds": 141,
|
"seconds": 122,
|
||||||
"why": ""
|
"why": ""
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -56,35 +56,35 @@
|
|||||||
"code": "P1",
|
"code": "P1",
|
||||||
"title": "the mesh builds the shared base from source",
|
"title": "the mesh builds the shared base from source",
|
||||||
"status": "pass",
|
"status": "pass",
|
||||||
"seconds": 77,
|
"seconds": 85,
|
||||||
"why": ""
|
"why": ""
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"code": "P2",
|
"code": "P2",
|
||||||
"title": "the mesh builds and runs a store of its own",
|
"title": "the mesh builds and runs a store of its own",
|
||||||
"status": "pass",
|
"status": "pass",
|
||||||
"seconds": 49,
|
"seconds": 38,
|
||||||
"why": ""
|
"why": ""
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"code": "P3",
|
"code": "P3",
|
||||||
"title": "the mesh builds and runs its own catalogue",
|
"title": "the mesh builds and runs its own catalogue",
|
||||||
"status": "pass",
|
"status": "pass",
|
||||||
"seconds": 26,
|
"seconds": 31,
|
||||||
"why": ""
|
"why": ""
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"code": "P4",
|
"code": "P4",
|
||||||
"title": "the mesh rebuilds its own control plane from source",
|
"title": "the mesh rebuilds its own control plane from source",
|
||||||
"status": "pass",
|
"status": "pass",
|
||||||
"seconds": 33,
|
"seconds": 32,
|
||||||
"why": ""
|
"why": ""
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"code": "N1",
|
"code": "N1",
|
||||||
"title": "the mesh puts itself on a private network, and its machine has a name",
|
"title": "the mesh puts itself on a private network, and its machine has a name",
|
||||||
"status": "pass",
|
"status": "pass",
|
||||||
"seconds": 12,
|
"seconds": 6,
|
||||||
"why": ""
|
"why": ""
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -98,14 +98,14 @@
|
|||||||
"code": "U1",
|
"code": "U1",
|
||||||
"title": "the mesh builds a module standing on that base",
|
"title": "the mesh builds a module standing on that base",
|
||||||
"status": "pass",
|
"status": "pass",
|
||||||
"seconds": 14,
|
"seconds": 13,
|
||||||
"why": ""
|
"why": ""
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"code": "U2",
|
"code": "U2",
|
||||||
"title": "the mesh runs a broker for that module to talk to",
|
"title": "the mesh runs a broker for that module to talk to",
|
||||||
"status": "pass",
|
"status": "pass",
|
||||||
"seconds": 20,
|
"seconds": 24,
|
||||||
"why": ""
|
"why": ""
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -140,22 +140,22 @@
|
|||||||
"code": "V4",
|
"code": "V4",
|
||||||
"title": "every resource the mesh declared is true on the machine",
|
"title": "every resource the mesh declared is true on the machine",
|
||||||
"status": "pass",
|
"status": "pass",
|
||||||
"seconds": 12,
|
"seconds": 11,
|
||||||
"why": ""
|
"why": ""
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"code": "E1",
|
"code": "E1",
|
||||||
"title": "a change to a module's source reaches the machine on its own",
|
"title": "a change to a module's source reaches the machine on its own",
|
||||||
"status": "pass",
|
"status": "pass",
|
||||||
"seconds": 14,
|
"seconds": 13,
|
||||||
"why": ""
|
"why": ""
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"code": "E2",
|
"code": "E2",
|
||||||
"title": "the mesh comes back after the machine reboots",
|
"title": "the mesh comes back after the machine reboots",
|
||||||
"status": "fail",
|
"status": "fail",
|
||||||
"seconds": 30,
|
"seconds": 31,
|
||||||
"why": "every container came back and no host agent did, so the machine is running the right things and can no longer be told anything:\namqp-ping\tUp 3 seconds\nmesh-lavinmq\tUp 3 seconds\nlavinmq\tUp 3 seconds (health: starting)\nmesh-control\tUp 3 seconds\nmesh-catalog\tUp 3 seconds\nmesh-postgres\tUp 3 seconds\npostgres\tUp 3 seconds\nmesh-builder\tUp 3 seconds\nmesh-registry\tUp 3 seconds\nmesh-broker\tUp 4 seconds (health: starting)\nmesh-store\tUp 4 seconds\n"
|
"why": "every container came back and no host agent did, so the machine is running the right things and can no longer be told anything:\namqp-ping\tUp 3 seconds\nmesh-lavinmq\tUp 3 seconds\nlavinmq\tUp 4 seconds (health: starting)\nmesh-control\tUp 3 seconds\nmesh-catalog\tUp 1 second\nmesh-postgres\tUp 4 seconds\npostgres\tUp 3 seconds\nmesh-builder\tUp 2 seconds\nmesh-registry\tUp 3 seconds\nmesh-broker\tUp 3 seconds (health: starting)\nmesh-store\tUp 3 seconds\n"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -329,6 +329,9 @@ before(async () => {
|
|||||||
registry: REGISTRY,
|
registry: REGISTRY,
|
||||||
source,
|
source,
|
||||||
sourceRef,
|
sourceRef,
|
||||||
|
toolsSource: forgeUrl(BASE.repo),
|
||||||
|
catalogSource: forgeUrl(MODULE.repo),
|
||||||
|
catalogRef: refFor(MODULE.repo),
|
||||||
log: (m) => console.log(m),
|
log: (m) => console.log(m),
|
||||||
});
|
});
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
|||||||
@@ -81,6 +81,9 @@ before(async () => {
|
|||||||
bundleTemplate: substrateBundle(bundle, []),
|
bundleTemplate: substrateBundle(bundle, []),
|
||||||
source,
|
source,
|
||||||
sourceRef,
|
sourceRef,
|
||||||
|
// Phase two builds from the same forge; the repositories sit beside the control plane's.
|
||||||
|
toolsSource: source.replace(/[^/]+\.git$/, "mesh-tools.git"),
|
||||||
|
catalogSource: source.replace(/[^/]+\.git$/, "mesh-catalog.git"),
|
||||||
log: (m) => console.log(m),
|
log: (m) => console.log(m),
|
||||||
});
|
});
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
|||||||
@@ -53,6 +53,18 @@ export interface GenesisOptions {
|
|||||||
*/
|
*/
|
||||||
source: string;
|
source: string;
|
||||||
sourceRef: string;
|
sourceRef: string;
|
||||||
|
/**
|
||||||
|
* Phase two: where the shared base and the catalogue's modules are built from.
|
||||||
|
*
|
||||||
|
* The installer no longer stops at a mesh that runs — it builds the base, a store, the
|
||||||
|
* catalogue, chooses the network and the filter, and asks a human where one must choose. This
|
||||||
|
* bed has no human, so every choice arrives as a flag, and a required choice with no flag is
|
||||||
|
* the installer refusing — which is the behaviour, not a lab problem.
|
||||||
|
*/
|
||||||
|
toolsSource: string;
|
||||||
|
catalogSource: string;
|
||||||
|
/** What of the catalogue to build. A branch under test is the usual reason this is not main. */
|
||||||
|
catalogRef?: string;
|
||||||
log?: (m: string) => void;
|
log?: (m: string) => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -118,6 +130,14 @@ export async function genesis(o: GenesisOptions): Promise<GenesisResult> {
|
|||||||
`--catalog ${catalogueOnMachine}`,
|
`--catalog ${catalogueOnMachine}`,
|
||||||
`--node ${node}`,
|
`--node ${node}`,
|
||||||
`--registry ${registry}`,
|
`--registry ${registry}`,
|
||||||
|
`--tools-source ${o.toolsSource}`,
|
||||||
|
`--catalog-source ${o.catalogSource}`,
|
||||||
|
`--catalog-ref ${o.catalogRef ?? "main"}`,
|
||||||
|
// The choices, answered the unattended way. Both have one option today, so these are
|
||||||
|
// redundant on purpose: the day a second filter exists, this bed keeps working instead of
|
||||||
|
// refusing, and choosing becomes a thing it visibly does.
|
||||||
|
`--private-network wireguard`,
|
||||||
|
`--packet-filter nftables`,
|
||||||
`--host ${HOST_PATH}`,
|
`--host ${HOST_PATH}`,
|
||||||
// The lab has no unit to supervise the host with, and the installer refuses to invent one — a
|
// The lab has no unit to supervise the host with, and the installer refuses to invent one — a
|
||||||
// unit file is a packaging decision. A host started this way does not survive a reboot.
|
// unit file is a packaging decision. A host started this way does not survive a reboot.
|
||||||
|
|||||||
@@ -467,6 +467,9 @@ before(async () => {
|
|||||||
registry: REGISTRY,
|
registry: REGISTRY,
|
||||||
source,
|
source,
|
||||||
sourceRef,
|
sourceRef,
|
||||||
|
toolsSource: forgeUrl(BASE.repo),
|
||||||
|
catalogSource: forgeUrl(MODULE.repo),
|
||||||
|
catalogRef: refFor(MODULE.repo),
|
||||||
log: (m) => console.log(m),
|
log: (m) => console.log(m),
|
||||||
});
|
});
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
|||||||
Reference in New Issue
Block a user