diff --git a/docs/agents/ARCHITECTURE.md b/docs/agents/ARCHITECTURE.md index 3c8736df..eea223d0 100644 --- a/docs/agents/ARCHITECTURE.md +++ b/docs/agents/ARCHITECTURE.md @@ -466,10 +466,10 @@ any shared, per-attachment kernel/CRD state — see the `cmdDel` note in | `internal/metadata` | every binary | Build-time vars (`Version`, `GitCommit`, `GitTreeState`, `BuildDate`) stamped via `-ldflags` | No | | `internal/gc` | galactic-router | Collects orphaned `BGPAdvertisement`/`BGPVRFInstance` CRDs, stale kernel VRFs, and stale eBPF `vrf_table` entries; invoked by the GC controller's ticker | No | | `internal/cni` | galactic-cni | Veth master plugin: `cmdAdd`/`cmdDel`/`cmdCheck`/`cmdStatus`; PluginConf parsing; NAD annotation; host-device delegation; delegates kernel work to plumbing | No | -| `internal/cni/hostconf` | every CNI-chain binary | Shared `HostConf` schema + static-conflist loader, plus API-based node-name auto-detect | No | +| `internal/hostconf` | every CNI-chain binary | Shared `HostConf` schema + static-conflist loader, plus API-based node-name auto-detect | No | | `internal/cni/hostgw` | galactic-cni, galactic-tap-cni | Host-side gateway address/route configuration for a VPC attachment's allocated IPAM addresses | No | -| `internal/cni/crdnames` | galactic-cni, galactic-bgp, galactic-router (gc) | Deterministic `BGPVRFInstance`/`BGPAdvertisement` CRD name + annotation-key derivation | No | -| `internal/cni/nadpatch` | galactic-cni, galactic-tap-cni | NAD annotation patch (host interface name) + pod-namespace parsing from `CNI_ARGS` | No | +| `internal/crdnames` | galactic-cni, galactic-bgp, galactic-router (gc) | Deterministic `BGPVRFInstance`/`BGPAdvertisement` CRD name + annotation-key derivation | No | +| `internal/nadpatch` | galactic-cni, galactic-tap-cni | NAD annotation patch (host interface name) + pod-namespace parsing from `CNI_ARGS` | No | | `internal/cni/ipam` | galactic-ipam | IPv6/IPv4 pool allocators + static IP allocator; on-disk marker-file persistence (flock-guarded, keyed by containerID) | Yes (pool allocations + marker files) | | `internal/cni/route` | galactic-route | Host-side static route add/delete via netlink | No | | `internal/cni/tap` | galactic-tap-cni | Tap interface create/delete for VM workloads (Kata, Firecracker, kraftlet/Unikraft) | No | @@ -576,7 +576,7 @@ Runs on every PR and push to `main`. Two tiers: |--------------------------------------------|--------------------------------------------------------------| | CNI master-plugin attach/detach flow (veth) | `internal/cni/ops_add.go:cmdAdd`, `internal/cni/ops_del.go:cmdDel` (`internal/cni/cni.go` only holds `RunPlugin`) | | CNI master-plugin attach/detach flow (tap) | `internal/cnitap/ops_add.go:cmdAdd`, `internal/cnitap/ops_del.go:cmdDel` (mirrors `internal/cni`) | -| CNI runtime config resolution (conflist/env/API auto-detect) | `internal/cni/config.go:parseConf`, `loadHostConf`, `internal/cni/hostconf.DetectNodeNameFromAPI` | +| CNI runtime config resolution (conflist/env/API auto-detect) | `internal/cni/config.go:parseConf`, `loadHostConf`, `internal/hostconf.DetectNodeNameFromAPI` | | IPAM delegation (master plugin side) | `internal/cni/result.go:configureIPAM` (`ipam.ExecAdd`), `internal/cni/ops_del.go:cmdDel` (`ipam.ExecDel`) | | IPAM delegation protocol (delegate side) | `internal/cniipam/ops.go:cmdAdd`/`cmdDel`, `internal/cniipam/allocate.go` | | Termination-route chain stage | `internal/cniroute/ops_add.go:cmdAdd`, `internal/cni/route/route.go` | diff --git a/internal/cni/config.go b/internal/cni/config.go index 0950de51..2f52a63d 100644 --- a/internal/cni/config.go +++ b/internal/cni/config.go @@ -17,8 +17,8 @@ import ( "github.com/containernetworking/cni/pkg/types" type100 "github.com/containernetworking/cni/pkg/types/100" - "go.datum.net/galactic/internal/cni/hostconf" "go.datum.net/galactic/internal/config" + "go.datum.net/galactic/internal/hostconf" ) var ConfFile = config.DefaultConfFile diff --git a/internal/cni/doc.go b/internal/cni/doc.go index 8c9c896c..0813e35a 100644 --- a/internal/cni/doc.go +++ b/internal/cni/doc.go @@ -2,21 +2,30 @@ // // SPDX-License-Identifier: AGPL-3.0-or-later -// Package cni implements the Galactic CNI plugin for wiring containers into -// SRv6-backed VPC networks. +// Package cni implements galactic-cni, the veth master plugin for wiring +// container workloads into SRv6-backed VPC networks. Tap-based workloads +// (Kata, Firecracker, kraftlet/Unikraft) are galactic-tap-cni's own master +// plugin (internal/cnitap) — interface kind is which binary is invoked now, +// not a config field either binary branches on. // -// On ADD the plugin creates a VRF, a veth or tap interface, installs -// termination routes in the VRF table, allocates a pod subnet via IPAM, -// and publishes BGPAdvertisement/BGPVRFInstance CRDs for route distribution. -// On DEL it performs best-effort cleanup in reverse order. CHECK and STATUS -// validate that managed kernel resources are intact. +// On ADD the plugin creates a VRF, a veth pair, and patches the pod's NAD +// with the host interface name. On DEL it performs best-effort cleanup in +// reverse order. CHECK and STATUS validate that managed kernel resources are +// intact. IPAM allocation, termination-route installation, and +// BGPAdvertisement/BGPVRFInstance publish are no longer this package's +// concern — they're galactic-ipam's, galactic-route's, and galactic-bgp's +// own, chained after this plugin per the conflist (see +// internal/cniipam, internal/cniroute, internal/cnibgp). // // Subpackages isolate kernel primitives: // -// - ipam: IPv6 subnet allocation from a CIDR pool or static address -// - route: VRF route add/delete for termination gateways // - veth: veth pair creation for container workloads -// - tap: TAP device creation for VM workloads (Kata, Firecracker) +// +// internal/cni/ipam, internal/cni/route, and internal/cni/tap are the same +// kind of kernel-primitive package, but are no longer used by this package +// itself — they're used exclusively by internal/cniipam, internal/cniroute, +// and internal/cnitap respectively, now that IPAM, termination routes, and +// tap are each their own chain-invoked binary. // // Usage: // diff --git a/internal/cni/ops_add.go b/internal/cni/ops_add.go index 3fdd47ff..3e490ba7 100644 --- a/internal/cni/ops_add.go +++ b/internal/cni/ops_add.go @@ -14,8 +14,8 @@ import ( "github.com/containernetworking/cni/pkg/types" "github.com/vishvananda/netlink" - "go.datum.net/galactic/internal/cni/nadpatch" "go.datum.net/galactic/internal/cni/veth" + "go.datum.net/galactic/internal/nadpatch" "go.datum.net/galactic/internal/plumbing/intf" "go.datum.net/galactic/internal/plumbing/vrf" ) diff --git a/internal/cni/types.go b/internal/cni/types.go index 3f6e6e65..1d910ee0 100644 --- a/internal/cni/types.go +++ b/internal/cni/types.go @@ -7,8 +7,8 @@ package cni import ( "github.com/containernetworking/cni/pkg/types" - "go.datum.net/galactic/internal/cni/hostconf" "go.datum.net/galactic/internal/cniipam" + "go.datum.net/galactic/internal/hostconf" ) // PluginConf is the CNI plugin configuration passed via stdin on each diff --git a/internal/cnibgp/bgp.go b/internal/cnibgp/bgp.go index 5cf74f6b..560ad365 100644 --- a/internal/cnibgp/bgp.go +++ b/internal/cnibgp/bgp.go @@ -29,8 +29,8 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" - "go.datum.net/galactic/internal/cni/crdnames" "go.datum.net/galactic/internal/cniipam" + "go.datum.net/galactic/internal/crdnames" "go.datum.net/galactic/internal/plumbing/ebpf/uformat" "go.datum.net/galactic/internal/plumbing/ebpf/usidmap" "go.datum.net/galactic/internal/plumbing/vrf" diff --git a/internal/cnibgp/bgp_test.go b/internal/cnibgp/bgp_test.go index 322e47c9..aa95068f 100644 --- a/internal/cnibgp/bgp_test.go +++ b/internal/cnibgp/bgp_test.go @@ -23,8 +23,8 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client/fake" - "go.datum.net/galactic/internal/cni/crdnames" "go.datum.net/galactic/internal/cniipam" + "go.datum.net/galactic/internal/crdnames" "go.datum.net/galactic/internal/plumbing/ebpf/uformat" "go.datum.net/galactic/internal/plumbing/ebpf/usidmap" bgpv1alpha1 "go.datum.net/network/api/v1alpha1" diff --git a/internal/cnibgp/config.go b/internal/cnibgp/config.go index a6200cd9..8ffbc656 100644 --- a/internal/cnibgp/config.go +++ b/internal/cnibgp/config.go @@ -17,8 +17,8 @@ import ( "github.com/containernetworking/cni/pkg/types" type100 "github.com/containernetworking/cni/pkg/types/100" - "go.datum.net/galactic/internal/cni/hostconf" "go.datum.net/galactic/internal/config" + "go.datum.net/galactic/internal/hostconf" ) var ConfFile = config.DefaultConfFile @@ -31,7 +31,7 @@ var ConfFile = config.DefaultConfFile // are shared node-level settings, not domain-specific behavior the way // galactic-ipam's own enable-local-ipam flag is — every binary in the chain // resolves them from the same static conflist file (see -// go.datum.net/galactic/internal/cni/hostconf's doc comment). +// go.datum.net/galactic/internal/hostconf's doc comment). var cniConfig *config.CNIConfig // InitCNIConfig initializes the shared config resolver for CNI env var diff --git a/internal/cnibgp/ops_check.go b/internal/cnibgp/ops_check.go index e9419aae..3cb973bc 100644 --- a/internal/cnibgp/ops_check.go +++ b/internal/cnibgp/ops_check.go @@ -20,8 +20,8 @@ import ( ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" - "go.datum.net/galactic/internal/cni/crdnames" "go.datum.net/galactic/internal/config" + "go.datum.net/galactic/internal/crdnames" "go.datum.net/galactic/internal/plumbing/ebpf/uformat" "go.datum.net/galactic/internal/plumbing/ebpf/usidmap" "go.datum.net/galactic/internal/plumbing/vrf" diff --git a/internal/cnibgp/resource.go b/internal/cnibgp/resource.go index c912ee93..1faea64e 100644 --- a/internal/cnibgp/resource.go +++ b/internal/cnibgp/resource.go @@ -16,7 +16,7 @@ import ( ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" - "go.datum.net/galactic/internal/cni/crdnames" + "go.datum.net/galactic/internal/crdnames" bgpv1alpha1 "go.datum.net/network/api/v1alpha1" ) diff --git a/internal/cnibgp/resource_test.go b/internal/cnibgp/resource_test.go index 2737e2bb..5ace8647 100644 --- a/internal/cnibgp/resource_test.go +++ b/internal/cnibgp/resource_test.go @@ -12,7 +12,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/controller-runtime/pkg/client" - "go.datum.net/galactic/internal/cni/crdnames" + "go.datum.net/galactic/internal/crdnames" bgpv1alpha1 "go.datum.net/network/api/v1alpha1" ) diff --git a/internal/cnibgp/types.go b/internal/cnibgp/types.go index d92745eb..f2c34fa4 100644 --- a/internal/cnibgp/types.go +++ b/internal/cnibgp/types.go @@ -7,7 +7,7 @@ package cnibgp import ( "github.com/containernetworking/cni/pkg/types" - "go.datum.net/galactic/internal/cni/hostconf" + "go.datum.net/galactic/internal/hostconf" ) // PluginConf is the CNI plugin configuration passed via stdin on each diff --git a/internal/cniroute/config.go b/internal/cniroute/config.go index f78622af..9af40d4c 100644 --- a/internal/cniroute/config.go +++ b/internal/cniroute/config.go @@ -17,8 +17,8 @@ import ( "github.com/containernetworking/cni/pkg/types" type100 "github.com/containernetworking/cni/pkg/types/100" - "go.datum.net/galactic/internal/cni/hostconf" "go.datum.net/galactic/internal/config" + "go.datum.net/galactic/internal/hostconf" ) var ConfFile = config.DefaultConfFile @@ -30,7 +30,7 @@ var ConfFile = config.DefaultConfFile // the chain — it never resolves NodeName or Kubeconfig. It uses // config.CNIConfig purely for LogFile/LogLevel's env-var > conflist > // default precedence, so logging behaves the same way here as everywhere -// else in the chain (see internal/cni/hostconf's doc comment on the one +// else in the chain (see internal/hostconf's doc comment on the one // static conflist file every binary shares). var cniConfig *config.CNIConfig diff --git a/internal/cniroute/types.go b/internal/cniroute/types.go index 03ce538f..f24613f6 100644 --- a/internal/cniroute/types.go +++ b/internal/cniroute/types.go @@ -18,7 +18,7 @@ package cniroute import ( "github.com/containernetworking/cni/pkg/types" - "go.datum.net/galactic/internal/cni/hostconf" + "go.datum.net/galactic/internal/hostconf" ) // Termination represents a network termination point with a destination diff --git a/internal/cnitap/config.go b/internal/cnitap/config.go index f1832631..6f242807 100644 --- a/internal/cnitap/config.go +++ b/internal/cnitap/config.go @@ -17,8 +17,8 @@ import ( "github.com/containernetworking/cni/pkg/types" type100 "github.com/containernetworking/cni/pkg/types/100" - "go.datum.net/galactic/internal/cni/hostconf" "go.datum.net/galactic/internal/config" + "go.datum.net/galactic/internal/hostconf" ) var ConfFile = config.DefaultConfFile diff --git a/internal/cnitap/ops_add.go b/internal/cnitap/ops_add.go index dce35c21..153f0f6d 100644 --- a/internal/cnitap/ops_add.go +++ b/internal/cnitap/ops_add.go @@ -16,9 +16,9 @@ import ( "github.com/vishvananda/netlink" "go.datum.net/galactic/internal/cni/hostgw" - "go.datum.net/galactic/internal/cni/nadpatch" "go.datum.net/galactic/internal/cni/tap" "go.datum.net/galactic/internal/cniipam" + "go.datum.net/galactic/internal/nadpatch" "go.datum.net/galactic/internal/plumbing/intf" "go.datum.net/galactic/internal/plumbing/vrf" ) diff --git a/internal/cnitap/types.go b/internal/cnitap/types.go index 5cffc104..5cb726be 100644 --- a/internal/cnitap/types.go +++ b/internal/cnitap/types.go @@ -12,8 +12,8 @@ package cnitap import ( "github.com/containernetworking/cni/pkg/types" - "go.datum.net/galactic/internal/cni/hostconf" "go.datum.net/galactic/internal/cniipam" + "go.datum.net/galactic/internal/hostconf" ) // PluginConf is the CNI plugin configuration passed via stdin on each diff --git a/internal/cni/crdnames/crdnames.go b/internal/crdnames/crdnames.go similarity index 100% rename from internal/cni/crdnames/crdnames.go rename to internal/crdnames/crdnames.go diff --git a/internal/cni/crdnames/crdnames_test.go b/internal/crdnames/crdnames_test.go similarity index 100% rename from internal/cni/crdnames/crdnames_test.go rename to internal/crdnames/crdnames_test.go diff --git a/internal/cni/hostconf/hostconf.go b/internal/hostconf/hostconf.go similarity index 100% rename from internal/cni/hostconf/hostconf.go rename to internal/hostconf/hostconf.go diff --git a/internal/cni/hostconf/hostconf_test.go b/internal/hostconf/hostconf_test.go similarity index 100% rename from internal/cni/hostconf/hostconf_test.go rename to internal/hostconf/hostconf_test.go diff --git a/internal/cni/nadpatch/nadpatch.go b/internal/nadpatch/nadpatch.go similarity index 100% rename from internal/cni/nadpatch/nadpatch.go rename to internal/nadpatch/nadpatch.go diff --git a/internal/cni/nadpatch/nadpatch_test.go b/internal/nadpatch/nadpatch_test.go similarity index 100% rename from internal/cni/nadpatch/nadpatch_test.go rename to internal/nadpatch/nadpatch_test.go