Commit Graph

2839 Commits

Author SHA1 Message Date
joshsiv-mulga abf734ef18 docs: qualify the migrate split and record admin and Viperblock findings
The migrate row is a split, not an exact ADR-0001 map row, and needs a map
clarification. Correct the stale admin consumers, record the operator-only
admin files as movable, the vbwire prerequisite for the Viperblock adapter
and the capability decision encryption.go needs.
2026-10-09 13:08:16 +10:00
joshsiv-mulga 8bf162fb73 refactor: move the default-VPC subject into contracts/ec2/v1
utils.SubjectEnsureDefaultVpc becomes ec2v1.EnsureDefaultVpcSubject, the
request/reply route between gateway account creation and the daemon.
Only the subject moves; the request and reply bodies are still anonymous
structs on each side and are recorded as such in the contract README.
The layering freeze now allows two utils files.
2026-10-09 13:07:40 +10:00
joshsiv-mulga 2bacd5ba22 fix: update paths left stale by the package moves
The MariaDB image stamp test read the RDS engine from
handlers/rds/engine_mariadb.go, so test-images failed in CI; it now reads
domains/rds/engine/mariadb.go. Comments citing moved files now name
their new locations.
2026-10-09 12:47:58 +10:00
joshsiv-mulga 382699c563 refactor: move the layering test to module-root architecture/
The ADR-0001 layering ratchet is repository governance tooling, not
Spinifex product code, so it sits beside tests/ rather than under the
spinifex/ product tree. make test, test-cover and test-race now include
./architecture/..., and the graph walk excludes architecture/.
2026-10-09 12:36:47 +10:00
joshsiv-mulga 66b37e7b5d docs: record test-package-check and nilaway as unverified gates 2026-10-09 12:29:56 +10:00
joshsiv-mulga d4415515ec chore: mark spf13/pflag as a direct dependency
operator/cli/wiring.go imports pflag directly. Same version; no upgrade.
2026-10-09 12:29:56 +10:00
joshsiv-mulga c3c8e28f86 refactor: drop the legacy handlers_ecr import alias
Import domains/ecr under its package name, or as ecrdomain where the
file also imports the AWS SDK ecr package, matching acmdomain. Also fix
a stale daemon file reference in the integration ECR daemon comment.
2026-10-09 12:17:01 +10:00
joshsiv-mulga 5292bd22c9 test: enforce ADR-0001 layering with a blocking ratchet
Add spinifex/architecture/layering, a test-only package that parses the
module's import graph, maps every production package to an ADR-0001
layer and checks each dependency rule as its own subtest. Existing
violations are allow-listed against their recorded debt; a new forbidden
edge, an unmapped package, a stale allowlist entry or a new package
under a frozen legacy root fails local preflight and CI.

Record the nine edges the test found missing from the migration record
(quota -> EC2 instance types, STS/Ochre/ELBv2 -> IAM, ELBv2
cross-domain, installer UI -> admin), name the importers of the utils
residuals and gateway/ec2_idempotency.go, and correct the handlers/iam
consumer list.
2026-10-09 12:01:28 +10:00
joshsiv-mulga 903c92e260 docs: record migrate move to operator/upgrade 2026-10-09 11:22:50 +10:00
joshsiv-mulga 919d5bfa67 refactor: move config and object-store upgrade workflow to operator/upgrade
Relocate spinifex/migrate, the operator-driven config-file and object-store
upgrade workflow behind spx admin upgrade, to operator/upgrade. Package
renamed to upgrade (imported as opupgrade where a local upgrade identifier
exists). It stays distinct from foundation/state/migrate, the generic KV
migration engine; no registry types, migration names, versions, file
formats or command names change.
2026-10-09 11:22:40 +10:00
joshsiv-mulga 8cd9cff75e test: move KV migration engine tests to foundation/state/migrate
The Registry and RunKV tests exercise foundation/state/migrate exclusively
but lived in spinifex/migrate's test file. Relocate them, with their NATS
helpers, to the package that owns the engine. No test name, assertion or
behaviour changes.
2026-10-09 11:17:40 +10:00
joshsiv-mulga 8dacfc157c docs: reconcile package-boundary record for ADR-0001 close-out
Add the missing slice rows (the commits that dissolved spinifex/types, the
ECR repository projection, the stale-path fix and the quota move), correct
stale entries, record the dependency-rule breaks found in the import graph
with removal conditions, add the close-out table of remaining legacy paths
with their decided target owners, recount the mulga-side follow-ups, and
fix stale old-path references in docs and comments.
2026-10-09 11:15:08 +10:00
joshsiv-mulga d5849c6b3a refactor: move quota admission to domains/admission/quota
Relocate the quota service, live counters and vCPU records from
handlers/quota to domains/admission/quota. Package renamed from
handlers_quota to quota; callers with a local quota identifier import it
as admissionquota. KV buckets, subjects and error codes are unchanged, and
the package's existing debt edges move with it unchanged.
2026-10-09 11:08:28 +10:00
joshsiv-mulga 0fc4d449bf docs: record EKS add-on activation review decisions 2026-10-09 10:54:26 +10:00
joshsiv-mulga 7e504c1dd2 fix: point UI build, CI and lint rules at moved package paths 2026-10-09 10:52:58 +10:00
joshsiv-mulga 2da6ea452e docs: add EKS add-on release membership and activation case study 2026-10-09 10:44:17 +10:00
joshsiv-mulga 25b3efdec4 docs: record EKS internal-route and role-ARN security corrections 2026-10-09 10:27:04 +10:00
joshsiv-mulga 642cb48898 fix(eks): validate add-on serviceAccountRoleArn syntax
CreateAddon and UpdateAddon stored serviceAccountRoleArn without
checking it was an ARN, and the guest renders the value into the
add-on's manifests. A non-empty value must now be syntactically an IAM
role ARN (12-digit account, no region, role resource, IAM name and path
rules); anything else returns InvalidParameterException before any
record is written or manifest staged.

The syntax check is foundation/aws/arn.ValidateRoleARN. iam:PassRole at
the gateway remains the permission and existence check. Stored values
are not rewritten, and an UpdateAddon that omits the field still
succeeds on a record holding a legacy value.
2026-10-09 10:26:23 +10:00
joshsiv-mulga a23e1ccf59 fix(eks): bind webhook token review to the caller's cluster
WebhookTokenReview took its account from the request body and was
authorised by IAM policy alone, with the control-plane role granting it
on "*". A control-plane VM, any tenant holding eks:*, or static system
credentials could resolve a token against another cluster or account
and learn the Kubernetes groups it maps to there. Error responses also
distinguished absent accounts from absent clusters.

WebhookTokenReview now passes the same internal-route gate as
PublishInternal: a control-plane instance-role session that is a member
of the URL cluster in the body account. The gate and the handler share
one body decoder, each body-scoped internal route must declare its
reader, and every unauthorised target returns the same AccessDenied
without reaching STS verification. Same-cluster responses are unchanged.
2026-10-09 10:09:49 +10:00
joshsiv-mulga ee13be9501 fix(eks): bind internal report publishing to the caller's cluster
PublishInternal was authorised by IAM policy alone, with its resource
built from the body accountId and the URL cluster. The control-plane
role grants it on "*", so any control-plane VM session, any tenant
holding eks:*, or static system credentials could publish cluster
state, bootstrap and add-on reports for another cluster or account.

PublishInternal now passes the existing internal-route gate: the caller
must be a control-plane instance-role session that is a member of the
URL cluster in the body account. The gate and the handler decode the
body through one shared decoder, so the account checked is the account
the subject is built from. Every unauthorised target returns the same
AccessDenied, and invalid account or cluster names are treated as not
found. Valid publishes keep their subjects and payload bytes.
2026-10-09 10:08:43 +10:00
joshsiv-mulga 7eedc555d7 docs: apply review decisions and ADR-0006 to EKS add-on v2 design 2026-10-09 09:30:43 +10:00
joshsiv-mulga 84c8c754dd docs: qualify historical architecture references 2026-10-09 08:59:41 +10:00
joshsiv-mulga 5582054bc5 docs: draft EKS add-on v2 guest contract design for review 2026-10-09 08:45:07 +10:00
joshsiv-mulga ce359fcefb docs: add EKS add-on executor, bundle, v1 compatibility and release inventories 2026-10-09 08:37:42 +10:00
joshsiv-mulga 4e822fa347 test: characterize EKS add-on v1 compatibility with added fields
Pin which owner writes drop unknown record and manifest fields, that
reads and deletes ignore or erase them, that one undecodable entry fails
a listing, and that v1 wire consumers ignore extra fields.
2026-10-09 08:37:42 +10:00
joshsiv-mulga 3a55e2ee19 docs: apply review decisions to EKS add-on lifecycle design 2026-10-09 07:48:54 +10:00
joshsiv-mulga 09b1a29a45 chore: run contracts tests in the default test, coverage and race targets 2026-10-09 07:48:23 +10:00
joshsiv-mulga 6cfb01b47d docs: draft EKS add-on lifecycle correction design for review 2026-10-08 23:12:30 +10:00
joshsiv-mulga e274814b46 docs: update EKS add-on inventory and remaining edges 2026-10-08 23:12:30 +10:00
joshsiv-mulga 18794e0173 docs: record EKS add-on wire contract extraction 2026-10-08 23:02:20 +10:00
joshsiv-mulga 692d929b4a refactor: extract EKS add-on guest wire contract
Move the add-on status subject, delivery phase, status report, staged
manifest and internal add-ons response into contracts/eks/v1 and use it
from the handler, gateway and gatewayfetch, replacing the agent's
duplicate. Wire bytes are unchanged, including the internal add-ons body
that the SDK renderer emits with Go field names; compatibility tests pin
the JSON, the guest printf form and the TSV.
2026-10-08 23:02:20 +10:00
joshsiv-mulga 3e1abc027e docs: record EKS add-on owner extraction 2026-10-08 22:54:39 +10:00
joshsiv-mulga d899630542 refactor: extract EKS add-on owner
Move the add-on catalogue, record and manifest keys, CAS, status
transitions and staging into domains/eks/addon behind an Owner that is
the sole writer. The handler keeps AWS validation, error mapping and
projection; the cluster reconciler delegates reports through the narrow
addonReports interface; node groups call EnsureGPUDevicePlugin. Stored
keys, JSON shape, wire types and lifecycle behaviour are unchanged.
2026-10-08 22:54:27 +10:00
joshsiv-mulga 15a05d6c2c docs: record EKS add-on PassRole check 2026-10-08 22:40:30 +10:00
joshsiv-mulga 097e19109a fix: require iam:PassRole for EKS add-on service account role
CreateAddon and UpdateAddon now pass serviceAccountRoleArn through the
existing EKS PassedRoleARNs path, so the caller needs iam:PassRole on the
role for eks.amazonaws.com, matching CreateCluster and CreateNodegroup.
2026-10-08 22:40:30 +10:00
joshsiv-mulga 675341b561 docs: record EKS add-on lifecycle contract 2026-10-08 22:33:28 +10:00
joshsiv-mulga 52de5e517f test: characterize EKS add-on lifecycle and guest wire
Pin the persisted record and manifest layout, create/update/delete and
status-report transitions, the ignored client token and report version,
the missing serviceAccountRoleArn PassRole check, and the exact internal
add-ons HTTP body and agent TSV output as they stand today.
2026-10-08 22:33:28 +10:00
joshsiv-mulga d804f5ac30 docs: record RDS DB parameter group owner extraction 2026-10-08 21:51:43 +10:00
joshsiv-mulga d9c3f3ca6f refactor: extract RDS DB parameter group owner
Move the parameter group and override records, keys and listing into
domains/rds/parametergroup behind an Owner. Delete asks an owner-declared
Dependants interface; instance-side resolution reads through its own
parameterGroupValues interface. SetOverrides refuses an unknown group so
no override key is written without its group. Stored shape, keys, public
errors and propagation are unchanged.
2026-10-08 21:51:08 +10:00
joshsiv-mulga 5548a7039f docs: record RDS DB parameter group lifecycle contract 2026-10-08 20:43:59 +10:00
joshsiv-mulga ca1dd9aa90 test: characterize RDS DB parameter group lifecycle before extraction 2026-10-08 20:43:59 +10:00
joshsiv-mulga 15d11aff08 docs: record RDS engine catalogue owner move 2026-10-08 17:33:30 +10:00
joshsiv-mulga 4b55247819 refactor: extract RDS engine catalogue into domains/rds/engine
Move engine identity and validation, the per-engine parameter catalogues,
effective-parameter resolution, db.* instance classes and engine/orderable
selection into an engine package. Behaviour, error codes and ordering are
unchanged.

The package imports no EC2 package: instance-class memory comes from an
immutable Sizing value built from an engine-declared InstanceTypes
interface, backed by the fixed instance-type table in handlers/rds.
Effective parameters leave as an engine-owned Setting, converted to
Parameter in handlers/rds. AWS output building, paging, apply-method
mapping, storage limits and the gateway runnable check stay in the
adapter path.

The RDS agent declares its own EngineCatalog interface and types and
receives an engine-backed implementation from cmd/rds-agent, so agent
code does not import the catalogue. Cross-engine tests use the two real
engines instead of a registered fake.
2026-10-08 17:33:11 +10:00
joshsiv-mulga 292803bb1c docs: record RDS engine catalogue boundary and evidence 2026-10-08 14:43:46 +10:00
joshsiv-mulga f1f194b16a fix: return InvalidParameterValue for a missing RDS master password
ValidateMasterUserPassword built the empty-password error with a bare
errors.New carrying the code only in its text, which awserrors does not
resolve, so CreateDBInstance without MasterUserPassword returned HTTP 500
ServerInternal. Build it with awserrors.Errorf like the other branches so
the gateway returns 400 InvalidParameterValue, and cover the full gateway
to RDS service path with a regression test.
2026-10-08 14:43:25 +10:00
joshsiv-mulga 955486421b test: characterize RDS engine catalogue before extraction 2026-10-08 13:58:27 +10:00
joshsiv-mulga 2b877b01a0 docs: record EKS access entry owner extraction 2026-10-08 12:34:24 +10:00
joshsiv-mulga 68ee6f620c refactor: extract EKS access entry owner into domains/eks/access
Move the access entry record, associated policy and scope types, keys,
PrincipalARNHash, the policy catalogue and group mapping into a resource
owner package. Stored JSON field names and KV keys are unchanged.

Owner is the only writer: Create, SeedCreatorAdmin, Update, Associate,
Disassociate and Delete carry the existing logic verbatim, and the put,
compare-and-set and delete primitives are private. The handler keeps AWS
validation, the cluster existence check, error mapping and projection.
Token review still reads records through the exported Get, and the cluster
prefix purge still sweeps entry keys.

List handlers/eks and the new package under spinifex_daemon so EKS-only
changes select the EKS suites.
2026-10-08 12:33:46 +10:00
joshsiv-mulga 2dec7b0de7 docs: record EKS access entry lifecycle contract 2026-10-08 11:53:52 +10:00
joshsiv-mulga b36d70b222 test: characterize EKS access entry lifecycle before extraction 2026-10-08 11:53:52 +10:00