Skip to content

Move public APIs under api/<api-name>/v1. - #2996

Merged
Eitan Yarmush (EItanya) merged 1 commit into
agent-substrate:mainfrom
juli4n:api-layout
Oct 23, 2026
Merged

Eitan Yarmush (EItanya) merged 1 commit into
agent-substrate:mainfrom
juli4n:api-layout

Conversation

@juli4n

@juli4n Julian Gutierrez Oschmann (juli4n) commented Oct 20, 2026 •

Copy link
Copy Markdown
Collaborator

All public APIs now live in one tree, with a version in every package,
so a future version can sit next to v1.

  • Proto packages are substrate.<api-name>.v1, so gRPC method names change, for example to /substrate.ateapi.v1.Control/GetActor.
  • Go packages for the protos are named after the API, for example
    package ateapi.
  • CRDs move from ate.dev/v1alpha1 to ate.dev/v1. They live in
    api/infra/k8s/ate/v1.

AI use: AI-assisted, I reviewed and tested it (test automation).
Fixes #2753

@juli4n Julian Gutierrez Oschmann (juli4n) changed the title Move public APIs under api/<api-name>/v1. Move public APIs under api/<api-name>/v1. Oct 20, 2026

@thockin Tim Hockin (thockin) left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"api/infra" feels wrong to me. In my mind there's a distinct difference between layers, and the "kubernetes layer plugin" is not the same as the others. I know it's a bit vague. Sort of: the core of substrate calls out to credential providers and to objectstores, but the kubernetes "infra" calls into substrate. I know it needs to be in a place we can support it and others can get at it, so I am not blocking it, but it feels like we need a bit more distance between the pieces.

What if "infra" was a top-level thing, suggesting that there could be other infra besides k8s?
/api/ateapi/v1/...
/infra/k8s/ate/v1/...

Then the CRD types would be ate.WorkerPool or atek8s.WorkerPool or kates.WorkerPool :)

I also suspect that we will want to decouple the proto files from language-specific generated code, but not enough to argue harder for it.

Comment thread api/ateapi/v1/ateapi.proto Resolved
@juli4n

Copy link
Copy Markdown
Collaborator Author

I moved the CRDs to api/infra/k8s/ate/v1. The group is nowate.dev.

@juli4n
Julian Gutierrez Oschmann (juli4n) marked this pull request as ready for review October 22, 2026 16:51

@thockin Tim Hockin (thockin) left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@thockin

Copy link
Copy Markdown
Collaborator

Needs rebase

All public APIs now live in one tree, with a version in every package,
so a future version can sit next to v1.

* Proto packages are substrate.<api-name>.v1, so gRPC method names
  change, for example to /substrate.ateapi.v1.Control/GetActor.
* Go packages for the protos are named after the API, for example
  package ateapi.
* CRDs move from ate.dev/v1alpha1 to ate.dev/v1. They live in
  api/infra/k8s/ate/v1.

AI use: AI-assisted, I reviewed and tested it (test automation).
Anna Pendleton (annapendleton) pushed a commit to ai-on-gke/substrate-gke that referenced this pull request Nov 3, 2026
…before the step changes anything (#132)

On a v1.0.0-rc.1 cluster the optional Filestore step failed at "Apply
Kustomize overlay": upstream's overlay writes its CSIDriverConfig against
ate.dev/v1alpha1, and agent-substrate/substrate#2996 moved the CRDs to
ate.dev/v1, which is all the cluster serves. By then deploy.sh had granted
roles/file.editor and bound Workload Identity, the step had turned off the
managed Filestore addon, and the apply had created the namespace,
Deployment and DaemonSet (node pods crash-looping) without the config. The
wizard's [s] moved on and both summaries said "filestore skipped".

The script now clones the overlay first and reads the apiVersion from its
csi_driver_config.yaml, compares it with the served versions of
csidriverconfigs.ate.dev, and fails there — naming both versions, saying
nothing was changed, and pointing at kubernetes-sigs/gcp-filestore-csi-
driver#1416 — before any gcloud call. A cluster without the CRD fails the
same way. The clone stays at HEAD rather than a pin: no revision of the
overlay serves v1 yet, so a pin would only fix the failure in place, while
HEAD picks up the upstream fix when it lands and the check keeps the step
honest until then. The checklist rows follow the new order, and the addon
row lights on "nothing to disable" instead of staying unlit on a cluster
without the managed driver.

A run that fails and is skipped from the failure is recorded
(FilestoreCSIFailed) and reported as "failed" by the completion panel and
the exit summary, which points at the namespace a partial apply leaves
behind; a later run that succeeds clears it. The README row says what the
step checks and that it stops on this pin.

Tests run the check as written against a fake kubectl (v1alpha1 against
v1 fails with the full message, v1 passes, both served passes, no CRD
fails), assert the script's ordering with no gcloud ahead of the check,
cover the checklist order and the failed-check stop, and drive the
Filestore screen through a failure, the skip, and a successful rerun.

Fixes #114

Co-authored-by: Aditya Shantanu <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Define how higher order systems will consume Substrate API protos

3 participants