Skip to content
Merged
Show file tree
Hide file tree
Changes from 65 commits
Commits
Show all changes
146 commits
Select commit Hold shift + click to select a range
658a04d
Establish fleet HTTPS network-boot as a join of the existing four-axi…
Sep 18, 2026
7e6ed21
PXE-FABRIC 0C: site UEFI ARM64 discovery edge with observed DHCP and …
Sep 18, 2026
041ccc9
Bind network-boot join to existing architecture and DHCP authorities.
Sep 18, 2026
2a64d22
Merge remote-tracking branch 'origin/session/sleek-carp-159' into ses…
Sep 18, 2026
a09d8af
Keep the 0WET subject a parameter: propose Mt. Jade, not a minted Uni…
Sep 18, 2026
ff441f5
WIP: SitePxeEdgeConverge module and witnesses
Sep 18, 2026
8722188
Edge admission reads the RFC 4578 arch code, not mtcollins1's observa…
Sep 18, 2026
3558d2c
Merge branch 'session/fierce-ferret-123' into session/fierce-ferret-1…
Sep 18, 2026
a3bbed8
Consume the predecessor census in the network-boot join.
Sep 18, 2026
54278e9
WIP: site PXE edge workflow modes
Sep 18, 2026
e2a2bf3
Merge remote-tracking branch 'origin/session/sleek-carp-159' into ses…
Sep 18, 2026
f26c63c
Spell the census optional as Present, not some.
Sep 18, 2026
9754417
Restore ipxe_chainloading_authority: the edge config cites it
Sep 18, 2026
0f5f9ce
Merge remote-tracking branch 'origin/session/sleek-carp-159' into ses…
Sep 18, 2026
b211809
Merge branch 'session/fierce-ferret-123' into session/fierce-ferret-1…
Sep 18, 2026
4abce24
Address review 67724: locate join refusals, consume DHCP arch coproduct.
Sep 18, 2026
d8dec87
Merge #11602 head 4abce24b661; extdeps.firmware.ipxe is now edge-owne…
Sep 18, 2026
3920838
Address review 67731: evidence kind on receipts, refuse as its own arm.
Sep 18, 2026
74ee25d
Import String from std.string_type in extdeps.linux.edac.
Sep 18, 2026
8855020
Merge #11604; gate the pinned chainloader on the iPXE arm64 build target
Sep 18, 2026
2871513
Merge remote-tracking branch 'origin/session/sleek-carp-159' into ses…
Sep 18, 2026
8f7d33f
Merge branch 'session/fierce-ferret-123' into session/fierce-ferret-1…
Sep 18, 2026
3572a10
Establish artifacts only from a verified ticket, against observed time.
Sep 18, 2026
e18a3eb
Keep site architecture refusal located on the delivery join.
Sep 18, 2026
0784b71
Merge remote-tracking branch 'origin/session/sleek-carp-159' into ses…
Sep 18, 2026
926e897
Locate MAC-refused tickets on the artifacts axis; restate the join fr…
Sep 18, 2026
13545c4
Merge branch 'session/fierce-ferret-123' into session/fierce-ferret-1…
Sep 18, 2026
5ef8028
Refuse observed join mismatches; do not report them as missing axes.
Sep 18, 2026
44cfccf
Merge remote-tracking branch 'origin/session/sleek-carp-159' into ses…
Sep 18, 2026
73e18ae
Distinguish HMAC firmware-class refusal from architecture.
Sep 18, 2026
90b0d9e
Locate the edge architecture refusal; state consumers and triggers fo…
Sep 18, 2026
cf0c207
Make predecessor observations a distinct standing, not a field.
Sep 18, 2026
83da661
Merge branch 'session/fierce-ferret-123' into session/fierce-ferret-1…
Sep 18, 2026
307b65e
Merge remote-tracking branch 'origin/session/sleek-carp-159' into ses…
Sep 18, 2026
73aed5e
Merge branch 'session/fierce-ferret-123' into session/fierce-ferret-1…
Sep 18, 2026
53e1fb1
Keep why discovery did not answer: typed, located discovery refusals …
Sep 18, 2026
58b5adb
Merge branch 'session/fierce-ferret-123' into session/fierce-ferret-1…
Sep 18, 2026
c98dad9
Join the site chainloader and fleet signing key, and return both witn…
Sep 18, 2026
4e85b0d
Join bootstrap trust and locate a missing site separately from missin…
Sep 18, 2026
0c20ad1
Merge remote-tracking branch 'origin/session/sleek-carp-159' into ses…
Sep 18, 2026
a9c4295
Merge branch 'session/fierce-ferret-123' into session/fierce-ferret-1…
Sep 18, 2026
3093291
Drop join architecture refusals that first_slice already makes unwrit…
Sep 18, 2026
a3bff13
Read the HTTPS fetch probe once in boot-network reachability (review …
Sep 18, 2026
4877bf6
Merge branch 'session/fierce-ferret-123' into session/fierce-ferret-1…
Sep 18, 2026
06ecfd8
Stop re-deriving DHCP class after the join has already required UefiA…
Sep 18, 2026
b8df6e4
Merge remote-tracking branch 'origin/session/sleek-carp-159' into ses…
Sep 18, 2026
d64313a
Merge branch 'session/fierce-ferret-123' into session/fierce-ferret-1…
Sep 18, 2026
42c877a
Delete unused discovery-hint and join-architecture constructors.
Sep 18, 2026
5117280
Merge remote-tracking branch 'origin/session/sleek-carp-159' into ses…
Sep 18, 2026
2e63728
Drop the deleted PresignedUrlAvailabilityFence arm
Sep 18, 2026
bd13fdd
Merge branch 'session/fierce-ferret-123' into session/fierce-ferret-1…
Sep 18, 2026
85be112
Drop the deleted PresignedUrlAvailabilityFence arm from the chainload…
Sep 18, 2026
c01af8b
Split client, chainloader, and ticket architecture refusals.
Sep 18, 2026
f93470d
Merge remote-tracking branch 'origin/session/sleek-carp-159' into ses…
Sep 18, 2026
3f61bec
Split the edge architecture refusal into client-not-admitted and chai…
Sep 18, 2026
7a8e499
Merge branch 'session/fierce-ferret-123' into session/fierce-ferret-1…
Sep 18, 2026
c9d199a
Keep site, fleet, manifest identity, and trust grade on an establishe…
Sep 18, 2026
c6fcc87
Merge remote-tracking branch 'origin/session/sleek-carp-159' into ses…
Sep 18, 2026
33d4b6c
Fix extra whitespace in the controlled-trust join witness.
Sep 18, 2026
7207225
Consume DhcpBootDirection for site discovery instead of renaming Nati…
Sep 18, 2026
32c9b6f
Reachability deficits carry their cause: failed with its observation,…
Sep 18, 2026
9b65125
Merge remote-tracking branch 'origin/session/sleek-carp-159' into ses…
Sep 18, 2026
925fd86
Witness uses SiteAnsweredDhcp { direction: ProxyDhcp } after 0A's dis…
Sep 18, 2026
5598e6d
Merge branch 'session/fierce-ferret-123' into session/fierce-ferret-1…
Sep 18, 2026
3dc0ce0
Put ClientNetworkBootMode on the signed ticket identity and join it t…
Sep 18, 2026
8632d66
Mint bootstrap trust from independent HTTPS and Secure Boot observati…
Sep 18, 2026
0d53efa
Merge remote-tracking branch 'origin/main' into session/fierce-ferret…
Sep 18, 2026
7e02e27
Ground production bootstrap trust in a grounds coproduct and derive t…
Sep 18, 2026
a16ed27
Restore the extdeps.uri import that the axis-refusal commit overwrote
Sep 18, 2026
8692402
site_pxe_edge: drop dangling site_pxe_edge_file_needs_write; regen fl…
Sep 18, 2026
cebb1ba
Regenerate fleet-converge.yml through the generated-artifact gate; de…
Sep 18, 2026
53ec0be
Merge remote-tracking branch 'origin/session/fierce-ferret-123-edge-c…
Sep 18, 2026
92f828b
network_boot_delivery: compare SiteIdentity through site_identity_eq …
Sep 18, 2026
53405b0
site PXE edge: segment address is an Ipv4Address; unit path derived f…
Sep 18, 2026
2adc557
Edge ProxyDHCP config takes an extdeps.network.ipv4 Ipv4Address and r…
Sep 18, 2026
733dce9
network_boot_delivery: ObservedDhcpPxeClient annotation states what t…
Sep 18, 2026
014b358
network_boot_delivery: the join's unexecuted production route is a ty…
Sep 18, 2026
95247a0
Merge branch 'session/fierce-ferret-123' into session/fierce-ferret-1…
Sep 18, 2026
38bd3b4
Merge remote-tracking branch 'origin/session/fierce-ferret-123-edge-c…
Sep 18, 2026
ac525e6
network_boot_delivery: manifest receipt on the establishment; site mi…
Sep 18, 2026
8d8edfb
Merge remote-tracking branch 'origin/session/sleek-carp-159' into ses…
Sep 18, 2026
6d5ad44
0A: trust grounds bound to boot mode and subject; route identity; bun…
Sep 18, 2026
3cce12a
Edge MACs are Eui48Address parsed from the measured observation; unex…
Sep 18, 2026
05fa7ba
Merge remote-tracking branch 'origin/session/sleek-carp-159' into ses…
Sep 18, 2026
9d71a89
Merge #11602 6d5ad44: edge chainloader carries tftp_root; boot-networ…
Sep 18, 2026
35c32bc
network_boot_delivery: optional if-branches return none, not Absent
Sep 18, 2026
d85148e
Merge #11604: converge takes the parsed Eui48Address roster (gate ref…
Sep 18, 2026
0f3d01c
Merge branches 'main' and 'session/fierce-ferret-123' of https://gith…
Sep 18, 2026
220766a
dhcp-boot target derives from ipxe_arm64_efi_snponly, the image the c…
Sep 18, 2026
a9c0a88
Merge remote-tracking branch 'origin/session/sleek-carp-159' into ses…
Sep 18, 2026
15a2efc
0A: trust admission as a closed result; established trust has no ungr…
Sep 18, 2026
2f4b669
Merge branch 'session/fierce-ferret-123' into session/fierce-ferret-1…
Sep 18, 2026
06e8c10
Merge remote-tracking branch 'origin/session/sleek-carp-159' into ses…
Sep 18, 2026
9b6b208
Merge branch 'session/fierce-ferret-123' into session/fierce-ferret-1…
Sep 18, 2026
fcee9bf
Edge chainloader transport is derived from the iPXE build target; the…
Sep 19, 2026
87efd14
Split the authored SiteEdgeRoster from the per-admission SiteEdgeObse…
Sep 19, 2026
dfdc8b9
Merge branch 'session/fierce-ferret-123' into session/fierce-ferret-1…
Sep 19, 2026
f541c32
GlobalHttpsEndpointReachable is minted from an empty deficit fold, th…
Sep 19, 2026
92cf5a3
Merge branch 'session/fierce-ferret-123' into session/fierce-ferret-1…
Sep 19, 2026
76253ce
0A: one discriminating witness per refusal arm (review 67992); one ma…
Sep 19, 2026
c3ad4cc
0A: closed manifest window result (review 68020); observed bundle ref…
Sep 19, 2026
656bf7a
network_boot_delivery: BootBundleAvailabilityStanding's producer is a…
Sep 19, 2026
375bba4
Merge remote-tracking branch 'origin/main' into session/fierce-ferret…
Sep 19, 2026
5cfdea1
Merge remote-tracking branch 'origin/session/sleek-carp-159' into ses…
Sep 19, 2026
67b9313
Merge branch 'session/fierce-ferret-123' into session/fierce-ferret-1…
Sep 19, 2026
bee93bc
network_boot_delivery witness: production fixture's ground is Secure …
Sep 19, 2026
409e473
Merge remote-tracking branch 'origin/session/sleek-carp-159' into ses…
Sep 19, 2026
0d8e217
Merge branch 'session/fierce-ferret-123' into session/fierce-ferret-1…
Sep 19, 2026
95fb87e
network_boot_delivery: signing_key_identity is MacKeyId, compared bra…
Sep 19, 2026
188f727
Merge remote-tracking branch 'origin/session/sleek-carp-159' into ses…
Sep 19, 2026
6af529b
Merge branch 'session/fierce-ferret-123' into session/fierce-ferret-1…
Sep 19, 2026
b6473b4
Sequence the unit ActiveState read-back by a let after activation (re…
Sep 19, 2026
db84c3d
Merge remote-tracking branch 'origin/main' into session/fierce-ferret…
Sep 19, 2026
68a06c7
Merge branch 'session/fierce-ferret-123' into session/fierce-ferret-1…
Sep 19, 2026
c43c87c
dhcp-boot names the TFTP server; the edge's tftp_root route identity …
Sep 19, 2026
6620c70
Merge branch 'session/fierce-ferret-123' into session/fierce-ferret-1…
Sep 19, 2026
ddb1247
Gate causes are a typed SitePxeEdgeGateCause coproduct carrying their…
Sep 19, 2026
0a54d18
A tagged dhcp-boot carries at least one tag by construction (review 6…
Sep 19, 2026
e7395ee
Merge branch 'session/fierce-ferret-123' into session/fierce-ferret-1…
Sep 19, 2026
ea1b833
The not-the-iPXE-build refusal reports the filename the gate compares…
Sep 19, 2026
1dcce89
Paired witness: pinning the refusal's reported expected filename clea…
Sep 19, 2026
392dd6e
Observe refuses gate causes that are failures to observe (review 68371)
Sep 19, 2026
64c9e68
One declaration of the site PXE edge receipt path, in ci_spec, import…
Sep 19, 2026
1438b26
The edge segment is parsed from fleet_intent_network operator_lan_seg…
Sep 19, 2026
a175d3a
The gate takes the TFTP-server and segment parse results as parameter…
Sep 19, 2026
c67f617
Merge remote-tracking branch 'origin/main' into session/fierce-ferret…
Sep 19, 2026
10b2266
Keep the site_edge_proxy_dhcp_config frontier row: converge renders i…
Sep 19, 2026
41ff791
Chainloader pin is a build receipt checked field by field; post-activ…
Sep 19, 2026
19475b1
Merge remote-tracking branch 'origin/main' into session/fierce-ferret…
Sep 19, 2026
3f5b692
An executed sudo refusal is a finding, not a failure to observe (side…
Sep 19, 2026
c4dc50d
Merge remote-tracking branch 'origin/main' into session/fierce-ferret…
Sep 20, 2026
bec747c
Merge main into the site PXE edge converge branch; review 68773 fixes
Sep 20, 2026
c9ce25c
Merge main into session/fierce-ferret-123-edge-converge
Sep 20, 2026
b5814fe
The site PXE edge modes were missing from the fleet SSH key demand fold
Sep 20, 2026
aff8bba
chore: regenerate drifted generated artifacts (ci auto-heal)
gunbai-bot[bot] Sep 20, 2026
a819e30
Merge remote-tracking branch 'origin/main' into HEAD
Sep 20, 2026
4c83fed
Regenerate fleet-converge.yml with the site PXE edge modes
Sep 20, 2026
399e1da
Merge main into session/fierce-ferret-123-edge-converge
Sep 20, 2026
bc47ff8
Merge the ci auto-heal commit from origin
Sep 20, 2026
08ebb2f
Merge the regenerated fleet-converge.yml projection
Sep 20, 2026
d68fe5f
Restore the three rung-drop rows my merge resolution dropped
Sep 20, 2026
1acb2f6
Regenerate docs/design-rung-drops.md: three declared drops had vanished
Sep 20, 2026
7f8da0d
Merge the gate-derived rung-drop projection restore
Sep 20, 2026
4edc691
The converge module did not resolve: a wrong import home and two miss…
Sep 20, 2026
c63ae64
Merge remote-tracking branch 'origin/main' into HEAD
Sep 20, 2026
7df883b
Regenerate fleet-converge.yml after merging main
Sep 20, 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
34 changes: 31 additions & 3 deletions .github/workflows/fleet-converge.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
# Generated by gunbc.fleet_converge_workflow expected_fleet_converge_yml — do not hand-edit.
# Authority: gunbc.fleet_converge_workflow fleet_converge_workflow; regen via tools.generated_artifact_gate main_wet.
name: fleet-converge
run-name: fleet-converge ${{ inputs.mode }} ${{ inputs.host }} nonce=${{ inputs.transaction_nonce }}
on:
Expand All @@ -13,7 +11,7 @@ on:
mode:
description: plan shows membership hunks; apply executes a prior plan artifact; org_actions_observe validates the org credential and refuses on runner-group drift; app_control_plane_observe reads the gunbai-ci App registration and webhook config with a short-lived App JWT and refuses on hook-config drift; microvm_host_converge installs the cited Firecracker release on the selected host and refuses the kvm grant by name; guest_image_observe reports the micro-VM base artifacts and their measured digests on the selected host and builds nothing; guest_image_converge builds the runner guest image there; microvm_boot_probe boots that image and reads its serial console; spark_grants and spark_bootstrap prepare the selected Spark; spark_serving_apply applies the promoted fabric groups' vLLM units over the password session, workers before heads; spark_runtime_image_probe pulls the pinned runtime image on the selected Spark and reads its capabilities from inside its own digest, changing nothing; host_reset_return drives a rostered reset subject through its controller and measures the return FROM A PEER, and takes reset_observer rather than host because the observer must not be the subject; runner_host_file_observe reads the runner teardown drop-in, the needrestart deferral and the loaded teardown on the selected host as its administrator and writes nothing; runner_host_file_converge writes whichever of those two files differs, reloads systemd only if the drop-in changed, and refuses unless the manager then reports the declared teardown
required: true
options: [plan, launch_environment_plan, allocation_store_plan, apply, org_actions_observe, app_control_plane_observe, microvm_host_converge, guest_image_observe, guest_image_converge, microvm_boot_probe, spark_grants, spark_bootstrap, spark_serving_apply, spark_runtime_image_probe, dashboard_deploy, rlm_launch_deployment_receipt, host_reset_return, runner_host_file_observe, runner_host_file_converge, runner_password_session_tool_converge, r2_mint_preflight, r2_object_write_mint]
options: [plan, launch_environment_plan, allocation_store_plan, apply, org_actions_observe, app_control_plane_observe, microvm_host_converge, guest_image_observe, guest_image_converge, microvm_boot_probe, spark_grants, spark_bootstrap, spark_serving_apply, spark_runtime_image_probe, dashboard_deploy, rlm_launch_deployment_receipt, host_reset_return, runner_host_file_observe, runner_host_file_converge, site_pxe_edge_observe, site_pxe_edge_converge, runner_password_session_tool_converge, r2_mint_preflight, r2_object_write_mint]
type: choice
target:
description: "Spark target host for the spark_* modes, naming the administrator credential the run materializes (any rostered Spark: srv5, srv6, srv7, srv8, srv9, srv10, srv11, srv12); apply reads the subject off the plan artifact"
Expand Down Expand Up @@ -661,6 +659,36 @@ jobs:
retention-days: 30
if: always() && (github.event.inputs.mode == 'runner_host_file_observe' || github.event.inputs.mode == 'runner_host_file_converge')
timeout-minutes: 10
- name: "Site PXE edge: observe the chainloader digest, dnsmasq, the edge config and unit (no writes)"
id: site_pxe_edge_observe
run: |
ROOT=$(git rev-parse --show-toplevel 2>/dev/null || pwd)
"$ROOT/target/release/gunbc" run --source-root "$ROOT/dag" --source-root "$ROOT/src/v2" --entry dag/gunbc/fleet/site_pxe_edge_converge.dag --function site_pxe_edge_observe_ci_wet
cat "$ROOT/target/site-pxe-edge-converge-receipt.txt"
env:
FLEET_CONVERGE_EXPECTED_HOST: ${{ github.event.inputs.host }}
if: github.event.inputs.mode == 'site_pxe_edge_observe'
timeout-minutes: 15
- name: "Site PXE edge: if the gate is open, write what differs, restart the unit, read its active state back"
id: site_pxe_edge_converge
run: |
ROOT=$(git rev-parse --show-toplevel 2>/dev/null || pwd)
"$ROOT/target/release/gunbc" run --source-root "$ROOT/dag" --source-root "$ROOT/src/v2" --entry dag/gunbc/fleet/site_pxe_edge_converge.dag --function site_pxe_edge_converge_ci_wet
cat "$ROOT/target/site-pxe-edge-converge-receipt.txt"
env:
FLEET_CONVERGE_EXPECTED_HOST: ${{ github.event.inputs.host }}
if: github.event.inputs.mode == 'site_pxe_edge_converge'
timeout-minutes: 15
- name: Upload site PXE edge converge receipt
id: site_pxe_edge_receipt_upload
uses: actions/upload-artifact@v4
with:
name: site-pxe-edge-converge-receipt
path: target/site-pxe-edge-converge-receipt.txt
if-no-files-found: error
retention-days: 30
if: always() && (github.event.inputs.mode == 'site_pxe_edge_observe' || github.event.inputs.mode == 'site_pxe_edge_converge')
timeout-minutes: 10
- name: Kill the in-run ssh-agent (key never outlives the job)
run: |
if [ -n "${SSH_AGENT_PID:-}" ]; then ssh-agent -k || true; fi
Expand Down
1 change: 0 additions & 1 deletion dag/extdeps/cloudflare/r2.dag
Original file line number Diff line number Diff line change
Expand Up @@ -480,7 +480,6 @@ fn r2_published_location_citations() -> List<FactCitation> {
]
}


// THE r2_s3_endpoint_url ROW IS RETIRED: gunbc.cloudflare.r2_origin_object reaches it through
// r2_object_url on the executing put_origin_object and fetch_origin_object entries, which is the
// consumer the row named. The list is the membership of what remains. r2_tokens_doc_as_of stays:
Expand Down
36 changes: 36 additions & 0 deletions dag/extdeps/firmware/ipxe.dag
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
module extdeps.firmware.ipxe

import std.types { NonEmptyStr }
import extdeps.uri { Uri, Https }
import extdeps.external_authority { ExternalAuthority }

data extdeps_external_authority_anchor: ExternalAuthority = ExternalAuthority {
uri: Uri {
scheme: Https
locator: "ipxe.org/docs"
}
}

data ipxe_chainloading_authority: ExternalAuthority = ExternalAuthority {
uri: Uri {
scheme: Https
locator: "ipxe.org/howto/chainloading"
}
}

// iPXE's own build grammar: `make <platform>/<image>` from src/, e.g. bin-arm64-efi/snponly.efi.
// snponly.efi drives the NIC through the firmware's SNP protocol instead of a native iPXE driver,
// which is the image the chainloading how-to names for UEFI.
type IpxeBuildTarget {
platform: NonEmptyStr
image: NonEmptyStr
}

data ipxe_arm64_efi_snponly: IpxeBuildTarget = IpxeBuildTarget {
platform: "bin-arm64-efi",
image: "snponly.efi",
}

fn ipxe_build_target_path(target: IpxeBuildTarget) -> NonEmptyStr {
join([target.platform as String, "/", target.image as String], "") as NonEmptyStr
}
15 changes: 12 additions & 3 deletions dag/extdeps/formats/dnsmasq.dag
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,11 @@ type DnsmasqDirective =
| DnsmasqDhcpRangeProxy { network_address: String }
| DnsmasqDhcpMatchSet { tag: String, option: String, value: String }
| DnsmasqDhcpOptionForceTag { tag: String, option: String, value: String }
| DnsmasqDhcpBootTag { tag: String, target: String }
| DnsmasqDhcpHostSetTag { mac: String, tag: String }
| DnsmasqDhcpBootTags { tags: List<String>, target: String }
| DnsmasqLogDhcp
| DnsmasqEnableTftp
| DnsmasqTftpRoot { path: String }

data dnsmasq_protocol: LayoutProtocol = LayoutProtocol { indent_unit: "" }

Expand All @@ -36,8 +40,13 @@ fn dnsmasq_directive_line(d: DnsmasqDirective) -> String {
concat(concat(concat("dhcp-match=set:", tag), concat(",", option)), concat(",", value))
DnsmasqDhcpOptionForceTag { tag: tag, option: option, value: value } =>
concat(concat(concat("dhcp-option-force=tag:", tag), concat(",", option)), concat(",", value))
DnsmasqDhcpBootTag { tag: tag, target: target } =>
concat(concat("dhcp-boot=tag:", tag), concat(",", target))
DnsmasqDhcpHostSetTag { mac: mac, tag: tag } =>
concat(concat("dhcp-host=", mac), concat(",set:", tag))
DnsmasqDhcpBootTags { tags: tags, target: target } =>
concat(concat("dhcp-boot=", fold(tags, init: "", f: (acc, t) => concat(acc, concat(concat("tag:", t), ",")))), target)
DnsmasqLogDhcp => "log-dhcp"
DnsmasqEnableTftp => "enable-tftp"
DnsmasqTftpRoot { path: path } => concat("tftp-root=", path)
}
}

Expand Down
3 changes: 2 additions & 1 deletion dag/extdeps/linux/edac.dag
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ import extdeps.uri { Uri, Https }
import std.decl_ref { DeclarationRef, WholeDeclaration }
import std.measure { MemoryControllerCount, memory_controller_count, memory_controller_count_value }
import v2.std.optional { Absent, Present }
import std.types { Bool, NonEmptyStr, String }
import std.string_type { String }
import std.types { Bool, NonEmptyStr }
data extdeps_external_authority_anchor: ExternalAuthority = ExternalAuthority {
uri: Uri {
scheme: Https
Expand Down
45 changes: 44 additions & 1 deletion dag/gunbc/boot_artifact_delivery.dag
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@ module gunbc.boot_artifact_delivery
import std.types { Bool, EpochMs, Int, List, NonEmptyStr, String, Port, list_length }
import std.decl_ref { DeclarationRef, WholeDeclaration }
import std.content_hash { ContentHash }
import extdeps.uri { Uri }
import product.placement_supply { SiteIdentity }
import extdeps.provisioning.dhcp_client_arch { DhcpProcessorArchitecture }
import extdeps.toolchain.types { Architecture, X86_64, Aarch64, X86, Arm, Armv7, Mips, Mipsel, Mips64, Mips64el, Riscv64, Wasm32 }
import extdeps.bmc.endpoint { BmcControllerEndpoint }
import extdeps.bmc.capability {
Expand Down Expand Up @@ -102,10 +103,20 @@ import gunbc.install_transport_qualification {
TransportProbeObservation,
}
import gunbc.network_boot_delivery {
NetworkBootArchitectureRefusal,
NetworkBootDeliveryArchitectureRefused,
NetworkBootDeliveryClientModeRefused,
NetworkBootDeliveryEstablished,
NetworkBootDeliveryEstablishment,
NetworkBootDeliveryEvidenceRefused,
NetworkBootDeliveryManifestRefused,
NetworkBootDeliverySiteMismatch,
NetworkBootDeliverySiteUnestablished,
NetworkBootDeliveryStanding,
NetworkBootDeliveryTargetMismatch,
NetworkBootDeliveryTrustUnestablished,
NetworkBootDeliveryUnestablished,
NetworkBootManifestRefusal,
NetworkBootRequirement,
}

Expand Down Expand Up @@ -345,6 +356,14 @@ type BootDeliveryCandidateIneligibility
| CandidateConfigfsRefused { observed_absent: List<ConfigfsTransportRequirement> }
| CandidateUefiHttpUnestablished { missing: List<UefiHttpRequirement> }
| CandidateNetworkBootUnestablished { missing: List<NetworkBootRequirement> }
| CandidateNetworkBootEvidenceRefused { axis: NetworkBootRequirement, observation: DeclarationRef }
| CandidateNetworkBootArchitectureRefused { cause: NetworkBootArchitectureRefusal }
| CandidateNetworkBootClientModeRefused { arch: DhcpProcessorArchitecture }
| CandidateNetworkBootTargetMismatch { axis: NetworkBootRequirement }
| CandidateNetworkBootManifestRefused { cause: NetworkBootManifestRefusal }
| CandidateNetworkBootSiteUnestablished
| CandidateNetworkBootSiteMismatch { expected: SiteIdentity, observed: SiteIdentity }
| CandidateNetworkBootTrustUnestablished

type BootDeliveryCandidateStanding
= CandidateEligible
Expand Down Expand Up @@ -654,6 +673,22 @@ fn pxe_chain_candidate(ev: BoundBootDeliveryEvidence, request: BootDeliveryReque
staged_digest_standing(offered: e.artifact_digest, requested: request.artifact.digest)
}
NetworkBootDeliveryUnestablished { missing: m } => CandidateIneligible { cause: CandidateNetworkBootUnestablished { missing: m } }
NetworkBootDeliveryEvidenceRefused { axis: axis, observation: observation } =>
CandidateIneligible { cause: CandidateNetworkBootEvidenceRefused { axis: axis, observation: observation } }
NetworkBootDeliveryArchitectureRefused { cause: cause } =>
CandidateIneligible { cause: CandidateNetworkBootArchitectureRefused { cause: cause } }
NetworkBootDeliveryClientModeRefused { arch: arch } =>
CandidateIneligible { cause: CandidateNetworkBootClientModeRefused { arch: arch } }
NetworkBootDeliveryTargetMismatch { axis: axis } =>
CandidateIneligible { cause: CandidateNetworkBootTargetMismatch { axis: axis } }
NetworkBootDeliveryManifestRefused { cause: cause } =>
CandidateIneligible { cause: CandidateNetworkBootManifestRefused { cause: cause } }
NetworkBootDeliverySiteUnestablished =>
CandidateIneligible { cause: CandidateNetworkBootSiteUnestablished }
NetworkBootDeliverySiteMismatch { expected: expected, observed: observed } =>
CandidateIneligible { cause: CandidateNetworkBootSiteMismatch { expected: expected, observed: observed } }
NetworkBootDeliveryTrustUnestablished =>
CandidateIneligible { cause: CandidateNetworkBootTrustUnestablished }
}
}

Expand Down Expand Up @@ -799,6 +834,14 @@ fn build_boot_artifact_delivery(
NetworkBootDeliveryEstablished { evidence: e } =>
Present { value: BuiltBootArtifactDelivery { candidate: candidate, delivery: PxeChainBoot { evidence: e }, selected: SelectedFromNetworkBootEstablishment { establishment: e } } }
NetworkBootDeliveryUnestablished { missing: _ } => none
NetworkBootDeliveryEvidenceRefused { axis: _, observation: _ } => none
NetworkBootDeliveryArchitectureRefused { cause: _ } => none
NetworkBootDeliveryClientModeRefused { arch: _ } => none
NetworkBootDeliveryTargetMismatch { axis: _ } => none
NetworkBootDeliveryManifestRefused { cause: _ } => none
NetworkBootDeliverySiteUnestablished => none
NetworkBootDeliverySiteMismatch { expected: _, observed: _ } => none
NetworkBootDeliveryTrustUnestablished => none
}
}
}
Expand Down
32 changes: 32 additions & 0 deletions dag/gunbc/ci/ci_spec.dag
Original file line number Diff line number Diff line change
Expand Up @@ -818,6 +818,16 @@ data gunbc_ci_runner_host_file_converge_target: GunbcRunStepTarget = GunbcRunSte
function: "runner_host_file_converge_ci_wet",
}

data gunbc_ci_site_pxe_edge_observe_target: GunbcRunStepTarget = GunbcRunStepTarget {
entry: "dag/gunbc/fleet/site_pxe_edge_converge.dag",
function: "site_pxe_edge_observe_ci_wet",
}

data gunbc_ci_site_pxe_edge_converge_target: GunbcRunStepTarget = GunbcRunStepTarget {
entry: "dag/gunbc/fleet/site_pxe_edge_converge.dag",
function: "site_pxe_edge_converge_ci_wet",
}

data gunbc_ci_runner_password_session_tool_converge_target: GunbcRunStepTarget = GunbcRunStepTarget {
entry: "dag/gunbc/runner/runner_password_session_tool_converge.dag",
function: "runner_password_session_tool_converge_ci_wet",
Expand Down Expand Up @@ -1003,6 +1013,8 @@ fn gunbc_run_step_targets() -> List<GunbcRunStepTarget> {
gunbc_ci_runner_microvm_host_converge_target,
gunbc_ci_runner_host_file_observe_target,
gunbc_ci_runner_host_file_converge_target,
gunbc_ci_site_pxe_edge_observe_target,
gunbc_ci_site_pxe_edge_converge_target,
gunbc_ci_runner_password_session_tool_converge_target,
gunbc_ci_runner_microvm_boot_probe_target,
gunbc_ci_host_reset_return_target,
Expand Down Expand Up @@ -1821,6 +1833,26 @@ fn gunbc_ci_runner_host_file_converge_invoke() -> String {
)
}

fn gunbc_ci_site_pxe_edge_observe_invoke() -> String {
gunbc_run_step_script(
source_roots: witness_layer_roots,
entry: gunbc_ci_site_pxe_edge_observe_target.entry,
function: gunbc_ci_site_pxe_edge_observe_target.function,
claim_run: false,
receipt_rel: "target/site-pxe-edge-converge-receipt.txt"
)
}

fn gunbc_ci_site_pxe_edge_converge_invoke() -> String {
gunbc_run_step_script(
source_roots: witness_layer_roots,
entry: gunbc_ci_site_pxe_edge_converge_target.entry,
function: gunbc_ci_site_pxe_edge_converge_target.function,
claim_run: false,
receipt_rel: "target/site-pxe-edge-converge-receipt.txt"
)
}

fn gunbc_ci_runner_password_session_tool_converge_invoke() -> String {
gunbc_run_step_script(
source_roots: witness_layer_roots,
Expand Down
Loading
Loading