Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
7 changes: 4 additions & 3 deletions .github/workflows/helm-e2e.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,9 @@ jobs:
- name: Install CSI NFS driver
run: hack/install-ate-kind.sh --setup-csi=nfs
- name: Deploy micro-VM counter demo
# The deploy creates the substrate ActorTemplate and waits for its golden
# snapshot internally; the ActorTemplate CRD (and its Ready condition)
# no longer exists to wait on.
run: hack/run-microvm-demo-kind.sh --skip-control-plane
- name: Deploy gVisor counter demo
run: hack/install-ate-kind.sh --deploy-demo-counter
Expand All @@ -101,9 +104,7 @@ jobs:
run: hack/run-e2e-kind.sh -v -args --no-color
- name: Run E2E tests (micro-VM)
env:
E2E_TEMPLATE_NAMESPACE: ate-demo-counter-microvm
E2E_TEMPLATE_NAME: counter-microvm
E2E_TEMPLATE_READY_TIMEOUT: 600s
E2E_SANDBOX_CLASS: microvm
run: hack/run-e2e-kind.sh ./internal/e2e/suites/demo -v -args --no-color
- name: Dump diagnostics on failure
if: failure()
Expand Down
6 changes: 5 additions & 1 deletion .github/workflows/pr-workflow.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,11 @@ jobs:
- name: Create cluster
run: hack/create-kind-cluster.sh
- name: Install Agent Substrate
run: hack/install-ate-kind.sh --deploy-ate-system --atenet-router=agentgateway
# The default 60s per-workload rollout wait assumes warm image caches; on a
# fresh runner every image (postgres, the agentgateway proxy for router and
# egress, ...) is cold-pulled from public registries concurrently, and the
# first wait in line regularly exceeds 60s on pull latency alone.
run: hack/install-ate-kind.sh --deploy-ate-system --atenet-router=agentgateway --rollout-timeout=300s
- name: Enable NFS
# Load NFS kernel modules so in-cluster NFS server and CSI driver can run.
run: |
Expand Down
20 changes: 11 additions & 9 deletions charts/substrate/templates/atenet-egress.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,16 @@ data:
accessLog:
add:
substrate.connect.authority: source.connectHeaders["host"]
# Authorize the actor identity at CONNECT-accept, before any tunnel
# (HTTP, TLS, or opaque TCP) is terminated. Fails closed when the
# control plane is unreachable.
substrateEgress:
host: {{ include "substrate.fullname" (list "api" .) }}.{{ .Release.Namespace }}.svc:443
policies:
backendTLS:
cert: /run/podidentity.podcert.ate.dev/credential-bundle.pem
key: /run/podidentity.podcert.ate.dev/credential-bundle.pem
root: /run/servicedns.podcert.ate.dev/trust-bundle.pem

binds:
- port: 8443
Expand All @@ -54,15 +64,7 @@ data:
target: source.connectHeaders["host"]
- protocol: HTTP
routes:
- policies:
substrateEgress:
host: {{ include "substrate.fullname" (list "api" .) }}.{{ .Release.Namespace }}.svc:443
policies:
backendTLS:
cert: /run/podidentity.podcert.ate.dev/credential-bundle.pem
key: /run/podidentity.podcert.ate.dev/credential-bundle.pem
root: /run/servicedns.podcert.ate.dev/trust-bundle.pem
backends:
- backends:
- dynamic:
target: source.connectHeaders["host"]
- protocol: TCP
Expand Down
2 changes: 1 addition & 1 deletion charts/substrate/values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,6 @@ images:
postgres: postgres:18-alpine@sha256:9a8afca54e7861fd90fab5fdf4c42477a6b1cb7d293595148e674e0a3181de15
rustfs: rustfs/rustfs:1.0.0-beta.3@sha256:378642b05b7dcb4849fb77ebe6aca4ced1c3f66e7e504247df95a5c9018d3358
awsCli: amazon/aws-cli:2.17.0@sha256:643507c10ada7964ca6157b3d799f030b90577643da9955d319a77399ed80d73
agentgateway: ghcr.io/kagent-dev/substrate/agentgateway:c0f5597c7cb8
agentgateway: ghcr.io/agentgateway/agentgateway:v0.0.0-alpha.8cbb254d
coredns: coredns/coredns:1.11.1
busybox: busybox:1.36
56 changes: 56 additions & 0 deletions internal/e2e/dataplane.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
// Copyright 2026 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package e2e

import (
"context"
"sync"
"testing"

metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

var (
routerDataplaneOnce sync.Once
routerIsAgentgateway bool
routerDataplaneErr error
)

// RouterIsAgentgateway reports whether the atenet-router Deployment runs the
// agentgateway dataplane. In that mode the pod has no Envoy and no
// atenet-router ext_proc process, so router-internal surfaces — the statusz
// page, atenet_router_* metrics, and Envoy's protocol mirroring to atunnel —
// do not exist. Suites gate assertions on those surfaces with this instead of
// a per-lane env knob: the deployed containers are the source of truth.
func RouterIsAgentgateway(ctx context.Context, t *testing.T) bool {
t.Helper()
routerDataplaneOnce.Do(func() {
deploy, err := GetClients().K8s.AppsV1().Deployments(routerNamespace).Get(ctx, routerService, metav1.GetOptions{})
if err != nil {
routerDataplaneErr = err
return
}
for _, c := range deploy.Spec.Template.Spec.Containers {
if c.Name == "agentgateway" {
routerIsAgentgateway = true
return
}
}
})
if routerDataplaneErr != nil {
t.Fatalf("detecting the router dataplane: %v", routerDataplaneErr)
}
return routerIsAgentgateway
}
3 changes: 3 additions & 0 deletions internal/e2e/suites/networking/grpcingress_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,9 @@ var grpcEchoFixtureManifests = e2e.SubstrateFixtureManifests{
// actor that really does speak gRPC.
func TestIngressProtocolDowngrade(t *testing.T) {
ctx := context.Background()
if e2e.RouterIsAgentgateway(ctx, t) {
t.Skip("the downgrade contract is Envoy's protocol mirroring to atunnel (xds.go); agentgateway does not implement it")
}
actorName, _ := createAndResumeSubstrateActor(t, ctx, "protodowngrade", e2e.SubstrateCounterFixture())
actorRef := resources.ActorRef{Atespace: networkingAtespace, Name: actorName}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,15 @@ patches:
accessLog:
add:
substrate.connect.authority: source.connectHeaders["host"]
# Authorize the actor identity at CONNECT-accept, before any tunnel
# is terminated. Fails closed when the control plane is unreachable.
substrateEgress:
host: api.ate-system.svc:443
policies:
backendTLS:
cert: /run/podidentity.podcert.ate.dev/credential-bundle.pem
key: /run/podidentity.podcert.ate.dev/credential-bundle.pem
root: /run/servicedns-ca/trust-bundle.pem

binds:
- port: 8443
Expand All @@ -53,29 +62,18 @@ patches:
cert: /run/egress-mitm/tls.crt
key: /run/egress-mitm/tls.key
routes:
- policies:
substrateEgress:
host: api.ate-system.svc:443
policies:
backendTLS:
cert: /run/podidentity.podcert.ate.dev/credential-bundle.pem
key: /run/podidentity.podcert.ate.dev/credential-bundle.pem
root: /run/servicedns-ca/trust-bundle.pem
backends:
- backends:
- dynamic: {}
policies:
backendTLS: {}
- protocol: HTTP
routes:
- policies:
substrateEgress:
host: api.ate-system.svc:443
policies:
backendTLS:
cert: /run/podidentity.podcert.ate.dev/credential-bundle.pem
key: /run/podidentity.podcert.ate.dev/credential-bundle.pem
root: /run/servicedns-ca/trust-bundle.pem
backends:
- backends:
- dynamic:
target: source.connectHeaders["host"]
- protocol: TCP
tcpRoutes:
- backends:
- dynamic:
target: source.connectHeaders["host"]
- protocol: TCP
Expand Down
20 changes: 11 additions & 9 deletions manifests/ate-install/components/agentgateway/configmap.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,16 @@ data:
accessLog:
add:
substrate.connect.authority: source.connectHeaders["host"]
# Authorize the actor identity at CONNECT-accept, before any tunnel
# (HTTP, TLS, or opaque TCP) is terminated. Fails closed when the
# control plane is unreachable.
substrateEgress:
host: api.ate-system.svc:443
policies:
backendTLS:
cert: /run/podidentity.podcert.ate.dev/credential-bundle.pem
key: /run/podidentity.podcert.ate.dev/credential-bundle.pem
root: /run/servicedns-ca/trust-bundle.pem

binds:
# Authenticate the actor before accepting CONNECT.
Expand All @@ -207,15 +217,7 @@ data:
target: source.connectHeaders["host"]
- protocol: HTTP
routes:
- policies:
substrateEgress:
host: api.ate-system.svc:443
policies:
backendTLS:
cert: /run/podidentity.podcert.ate.dev/credential-bundle.pem
key: /run/podidentity.podcert.ate.dev/credential-bundle.pem
root: /run/servicedns-ca/trust-bundle.pem
backends:
- backends:
- dynamic:
target: source.connectHeaders["host"]
- protocol: TCP
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ patches:
path: /spec/template/spec/containers/0
value:
name: agentgateway
image: ghcr.io/kagent-dev/substrate/agentgateway:c0f5597c7cb8
image: ghcr.io/agentgateway/agentgateway:v0.0.0-alpha.8cbb254d
args:
- -f
- /etc/agentgateway/config.yaml
Expand Down Expand Up @@ -115,7 +115,7 @@ patches:
path: /spec/template/spec/containers/0
value:
name: agentgateway
image: ghcr.io/kagent-dev/substrate/agentgateway:c0f5597c7cb8
image: ghcr.io/agentgateway/agentgateway:v0.0.0-alpha.8cbb254d
args:
- -f
- /etc/agentgateway/config.yaml
Expand Down
Loading