Skip to content
Merged
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
20 changes: 20 additions & 0 deletions examples/sds-test-server/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
FROM golang:1.26.5@sha256:63f132d58c1f589f0dcda584933a9bb44bfda1150f1506377f5a902f34d86033 AS builder

ARG GO_LDFLAGS=""

WORKDIR /workspace
COPY go.mod go.sum ./
RUN --mount=type=cache,target=/root/.cache/go-build --mount=type=cache,target=/go/pkg/mod \
go mod download

COPY . ./
RUN --mount=type=cache,target=/root/.cache/go-build --mount=type=cache,target=/go/pkg/mod \
CGO_ENABLED=0 \
GOOS=${TARGETOS} \
GOARCH=${TARGETARCH} \
go build -o /bin/sds-test-server -ldflags "${GO_LDFLAGS}" .

FROM gcr.io/distroless/static-debian11
COPY --from=builder /bin/sds-test-server /

ENTRYPOINT ["/sds-test-server"]
9 changes: 9 additions & 0 deletions examples/sds-test-server/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@

IMAGE_PREFIX ?= envoyproxy/gateway-
APP_NAME ?= sds-test-server
TAG ?= latest
GO_LDFLAGS ?=

.PHONY: docker-buildx
docker-buildx:
docker buildx build . -t $(IMAGE_PREFIX)$(APP_NAME):$(TAG) --build-arg GO_LDFLAGS="$(GO_LDFLAGS)" --load
28 changes: 28 additions & 0 deletions examples/sds-test-server/go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
module github.com/envoyproxy/gateway-sds-test-server

go 1.26.5

require (
github.com/envoyproxy/go-control-plane v0.14.1-0.20260409050421-3f47accd6e14
github.com/envoyproxy/go-control-plane/envoy v1.37.1-0.20260627225610-70ff85c381ff
github.com/stretchr/testify v1.11.1
google.golang.org/grpc v1.82.1
google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af
)

require (
cel.dev/expr v0.25.1 // indirect
github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 // indirect
github.com/envoyproxy/protoc-gen-validate v1.3.3 // indirect
github.com/kr/text v0.2.0 // indirect
github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
golang.org/x/net v0.55.0 // indirect
golang.org/x/sys v0.45.0 // indirect
golang.org/x/text v0.37.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
74 changes: 74 additions & 0 deletions examples/sds-test-server/go.sum
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
cel.dev/expr v0.25.1 h1:1KrZg61W6TWSxuNZ37Xy49ps13NUovb66QLprthtwi4=
cel.dev/expr v0.25.1/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4=
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 h1:aBangftG7EVZoUb69Os8IaYg++6uMOdKK83QtkkvJik=
github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2/go.mod h1:qwXFYgsP6T7XnJtbKlf1HP8AjxZZyzxMmc+Lq5GjlU4=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/envoyproxy/go-control-plane v0.14.1-0.20260409050421-3f47accd6e14 h1:7g8SJv4OrVcLT4yfkzIbsTcwLBwyLu8gKb/yCf3Loxk=
github.com/envoyproxy/go-control-plane v0.14.1-0.20260409050421-3f47accd6e14/go.mod h1:18SVzvkoF8AL2O7baVikhojMZ+7rFPh3o8tOOsBVyok=
github.com/envoyproxy/go-control-plane/envoy v1.37.1-0.20260627225610-70ff85c381ff h1:stwP9x94QfAFs+RF+YFkSrSuTxBuVrj6Sv+PJXJkXzo=
github.com/envoyproxy/go-control-plane/envoy v1.37.1-0.20260627225610-70ff85c381ff/go.mod h1:RgJXVdNtBhId0AeGnDEqPRSejRMoz//JumYvSTcJTvM=
github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI=
github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4=
github.com/envoyproxy/protoc-gen-validate v1.3.3 h1:MVQghNeW+LZcmXe7SY1V36Z+WFMDjpqGAGacLe2T0ds=
github.com/envoyproxy/protoc-gen-validate v1.3.3/go.mod h1:TsndJ/ngyIdQRhMcVVGDDHINPLWB7C82oDArY51KfB0=
github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo=
github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=
github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64=
go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y=
go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I=
go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0=
go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM=
go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY=
go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg=
go.opentelemetry.io/otel/sdk v1.43.0/go.mod h1:P+IkVU3iWukmiit/Yf9AWvpyRDlUeBaRg6Y+C58QHzg=
go.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfCGLEo89fDkw=
go.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A=
go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A=
go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
golang.org/x/net v0.55.0 h1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8=
golang.org/x/net v0.55.0/go.mod h1:L5U2KuzuOe1lY7Z+aWVIKK6qEeJXnXV9yzGA+WCHJww=
golang.org/x/sys v0.45.0 h1:dO4czNzziLiiXplLQgBCEpCvXQ3dnkn0SdaZSYdQ+FY=
golang.org/x/sys v0.45.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc=
golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38=
gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4=
gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E=
google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478 h1:yQugLulqltosq0B/f8l4w9VryjV+N/5gcW0jQ3N8Qec=
google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478/go.mod h1:C6ADNqOxbgdUUeRTU+LCHDPB9ttAMCTff6auwCVa4uc=
google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478 h1:RmoJA1ujG+/lRGNfUnOMfhCy5EipVMyvUE+KNbPbTlw=
google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8=
google.golang.org/grpc v1.82.1 h1:NnAxzGRA0677vCa4BUkOAnO5+FfQqVl9iUXeD0IqcGE=
google.golang.org/grpc v1.82.1/go.mod h1:yzTZ1TB1Z3SG+LIYaI+WiE8D5+PZ3ArnrSp8zF3+/ZA=
google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af h1:+5/Sw3GsDNlEmu7TfklWKPdQ0Ykja5VEmq2i817+jbI=
google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
143 changes: 143 additions & 0 deletions examples/sds-test-server/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
// Copyright Envoy Gateway Authors
// SPDX-License-Identifier: Apache-2.0
// The full text of the Apache license is available in the LICENSE file at
// the root of the repo.

package main

import (
"context"
"errors"
"flag"
"fmt"
"log"
"net"
"os"
"os/signal"
"syscall"

corev3 "github.com/envoyproxy/go-control-plane/envoy/config/core/v3"
tlsv3 "github.com/envoyproxy/go-control-plane/envoy/extensions/transport_sockets/tls/v3"
secretservicev3 "github.com/envoyproxy/go-control-plane/envoy/service/secret/v3"
cachetypes "github.com/envoyproxy/go-control-plane/pkg/cache/types"
cachev3 "github.com/envoyproxy/go-control-plane/pkg/cache/v3"
logv3 "github.com/envoyproxy/go-control-plane/pkg/log"
resourcev3 "github.com/envoyproxy/go-control-plane/pkg/resource/v3"
serverv3 "github.com/envoyproxy/go-control-plane/pkg/server/v3"
"google.golang.org/grpc"
)

const snapshotKey = "sds-test-server"

type config struct {
socketPath string
secretName string
certificatePath string
privateKeyPath string
}

type staticNodeHash struct{}

func (staticNodeHash) ID(*corev3.Node) string {
return snapshotKey
}

func main() {
var cfg config
flag.StringVar(&cfg.socketPath, "socket-path", "", "path to the SDS Unix domain socket")
flag.StringVar(&cfg.secretName, "secret-name", "", "name of the SDS TLS secret")
flag.StringVar(&cfg.certificatePath, "cert-path", "", "path to the PEM certificate chain")
flag.StringVar(&cfg.privateKeyPath, "key-path", "", "path to the PEM private key")
flag.Parse()

ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM)
defer stop()

if err := run(ctx, cfg); err != nil {
log.Fatalf("SDS server failed: %v", err)
}
}

func run(ctx context.Context, cfg config) error {
grpcServer, listener, err := newSDSServer(ctx, cfg)
if err != nil {
return err
}
defer func() {
_ = listener.Close()
_ = os.Remove(cfg.socketPath)
}()

serveErr := make(chan error, 1)
go func() {
serveErr <- grpcServer.Serve(listener)
}()

select {
case <-ctx.Done():
grpcServer.Stop()
return nil
case err := <-serveErr:
return fmt.Errorf("serve SDS requests: %w", err)
}
}

func newSDSServer(ctx context.Context, cfg config) (*grpc.Server, net.Listener, error) {
certificate, err := os.ReadFile(cfg.certificatePath)
if err != nil {
return nil, nil, fmt.Errorf("read certificate: %w", err)
}
privateKey, err := os.ReadFile(cfg.privateKeyPath)
if err != nil {
return nil, nil, fmt.Errorf("read private key: %w", err)
}

secret := &tlsv3.Secret{
Name: cfg.secretName,
Type: &tlsv3.Secret_TlsCertificate{
TlsCertificate: &tlsv3.TlsCertificate{
CertificateChain: inlineBytes(certificate),
PrivateKey: inlineBytes(privateKey),
},
},
}
snapshot, err := cachev3.NewSnapshot("1", map[resourcev3.Type][]cachetypes.Resource{
resourcev3.SecretType: {secret},
})
if err != nil {
return nil, nil, fmt.Errorf("create SDS snapshot: %w", err)
}
if err := snapshot.Consistent(); err != nil {
return nil, nil, fmt.Errorf("validate SDS snapshot: %w", err)
}

snapshotCache := cachev3.NewSnapshotCache(false, staticNodeHash{}, logv3.NewDefaultLogger())
if err := snapshotCache.SetSnapshot(ctx, snapshotKey, snapshot); err != nil {
return nil, nil, fmt.Errorf("store SDS snapshot: %w", err)
}

if err := os.Remove(cfg.socketPath); err != nil && !errors.Is(err, os.ErrNotExist) {
return nil, nil, fmt.Errorf("remove stale socket: %w", err)
}
listener, err := net.Listen("unix", cfg.socketPath)
if err != nil {
return nil, nil, fmt.Errorf("listen on SDS socket: %w", err)
}
if err := os.Chmod(cfg.socketPath, 0o666); err != nil {
_ = listener.Close()
return nil, nil, fmt.Errorf("set SDS socket permissions: %w", err)
}

grpcServer := grpc.NewServer()
secretservicev3.RegisterSecretDiscoveryServiceServer(
grpcServer,
serverv3.NewServer(ctx, snapshotCache, nil),
)
return grpcServer, listener, nil
}

func inlineBytes(data []byte) *corev3.DataSource {
return &corev3.DataSource{
Specifier: &corev3.DataSource_InlineBytes{InlineBytes: data},
}
}
81 changes: 81 additions & 0 deletions examples/sds-test-server/main_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
// Copyright Envoy Gateway Authors
// SPDX-License-Identifier: Apache-2.0
// The full text of the Apache license is available in the LICENSE file at
// the root of the repo.

package main

import (
"context"
"net"
"os"
"path/filepath"
"testing"

corev3 "github.com/envoyproxy/go-control-plane/envoy/config/core/v3"
tlsv3 "github.com/envoyproxy/go-control-plane/envoy/extensions/transport_sockets/tls/v3"
discoveryv3 "github.com/envoyproxy/go-control-plane/envoy/service/discovery/v3"
secretservicev3 "github.com/envoyproxy/go-control-plane/envoy/service/secret/v3"
resourcev3 "github.com/envoyproxy/go-control-plane/pkg/resource/v3"
"github.com/stretchr/testify/require"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
"google.golang.org/protobuf/proto"
)

func TestSDSServerServesTLSSecretOverUnixSocket(t *testing.T) {
// Given a server configured with certificate material on disk.
tempDir := t.TempDir()
socketFile, err := os.CreateTemp("", "sds-*.sock")
require.NoError(t, err)
socketPath := socketFile.Name()
require.NoError(t, socketFile.Close())
require.NoError(t, os.Remove(socketPath))
t.Cleanup(func() { _ = os.Remove(socketPath) })
certificate := []byte("test certificate")
privateKey := []byte("test private key")
certificatePath := filepath.Join(tempDir, "tls.crt")
privateKeyPath := filepath.Join(tempDir, "tls.key")
require.NoError(t, os.WriteFile(certificatePath, certificate, 0o600))
require.NoError(t, os.WriteFile(privateKeyPath, privateKey, 0o600))
cfg := config{
socketPath: socketPath,
secretName: "listener-certificate",
certificatePath: certificatePath,
privateKeyPath: privateKeyPath,
}
grpcServer, listener, err := newSDSServer(t.Context(), cfg)
require.NoError(t, err)
t.Cleanup(grpcServer.Stop)
t.Cleanup(func() { require.NoError(t, listener.Close()) })
go func() { _ = grpcServer.Serve(listener) }()

connection, err := grpc.NewClient(
"passthrough:///sds-test-server",
grpc.WithTransportCredentials(insecure.NewCredentials()),
grpc.WithContextDialer(func(ctx context.Context, _ string) (net.Conn, error) {
return (&net.Dialer{}).DialContext(ctx, "unix", cfg.socketPath)
}),
)
require.NoError(t, err)
t.Cleanup(func() { require.NoError(t, connection.Close()) })
stream, err := secretservicev3.NewSecretDiscoveryServiceClient(connection).StreamSecrets(t.Context())
require.NoError(t, err)

// When the listener certificate is requested through the SDS stream.
require.NoError(t, stream.Send(&discoveryv3.DiscoveryRequest{
Node: &corev3.Node{Id: "envoy-test-node"},
ResourceNames: []string{cfg.secretName},
TypeUrl: resourcev3.SecretType,
}))
response, err := stream.Recv()
require.NoError(t, err)

// Then the named secret contains the configured certificate and key.
require.Len(t, response.Resources, 1)
secret := &tlsv3.Secret{}
require.NoError(t, response.Resources[0].UnmarshalTo(secret))
require.Equal(t, cfg.secretName, secret.Name)
require.True(t, proto.Equal(inlineBytes(certificate), secret.GetTlsCertificate().CertificateChain))
require.True(t, proto.Equal(inlineBytes(privateKey), secret.GetTlsCertificate().PrivateKey))
}
8 changes: 6 additions & 2 deletions internal/gatewayapi/helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -590,8 +590,7 @@ func irTLSConfigs(config *ListenerTLSConfig) *ir.TLSConfig {
Certificates: make([]ir.TLSCertificate, len(config.secrets)),
}
for i, tlsSecret := range config.secrets {
cert := getTLSCertificateFromSecret(tlsSecret)
tlsListenerConfigs.Certificates[i] = cert
tlsListenerConfigs.Certificates[i] = getTLSCertificateFromSecret(tlsSecret)
}

if config.frontendTLSValidation != nil && config.frontendTLSValidation.ValidateError == nil {
Expand Down Expand Up @@ -629,6 +628,11 @@ func isValidClientCertificateRef(tlsSecret *corev1.Secret) bool {
}

func getTLSCertificateFromSecret(tlsSecret *corev1.Secret) ir.TLSCertificate {
if tlsSecret.Type == egv1a1.SDSSecretType {
sdsConfig, _ := ir.NewSDSConfig(tlsSecret)
return ir.TLSCertificate{Name: irTLSListenerConfigName(tlsSecret), SDS: sdsConfig}
}

cert := ir.TLSCertificate{
Name: irTLSListenerConfigName(tlsSecret),
Certificate: tlsSecret.Data[corev1.TLSCertKey],
Expand Down
Loading
Loading