Skip to content

Commit 5530bb8

Browse files
committed
add gateway configuration
1 parent e7d3cd8 commit 5530bb8

File tree

7 files changed

+372
-65
lines changed

7 files changed

+372
-65
lines changed

Taskfile.yaml

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,7 @@ tasks:
4848
runCommand:
4949
- platformservice
5050
- run
51-
extraVolumes:
52-
- name: webhooks-tls
53-
secret:
54-
defaultMode: 420
55-
secretName: project-workspace-operator-webhooks-tls
56-
extraVolumeMounts:
57-
- mountPath: /tmp/k8s-webhook-server/serving-certs
58-
name: webhooks-tls
59-
readOnly: true
51+
webhook:
52+
enabled: true
6053
EOF
6154
silent: true

cmd/project-workspace-operator/app/app.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,20 @@
11
package app
22

33
import (
4+
"context"
45
"fmt"
56
"os"
67

8+
corev1 "k8s.io/api/core/v1"
9+
"k8s.io/apimachinery/pkg/util/intstr"
710
ctrl "sigs.k8s.io/controller-runtime"
11+
"sigs.k8s.io/controller-runtime/pkg/client"
812

913
"github.com/spf13/cobra"
1014

1115
"github.com/openmcp-project/controller-utils/pkg/clusters"
1216
"github.com/openmcp-project/controller-utils/pkg/logging"
17+
openmcpconst "github.com/openmcp-project/openmcp-operator/api/constants"
1318
)
1419

1520
func NewPlatformServiceProjectWorkspaceCommand() *cobra.Command {
@@ -80,3 +85,39 @@ func (o *SharedOptions) Complete() error {
8085

8186
return nil
8287
}
88+
89+
func resolveWebhookPort(ctx context.Context, platformClusterClient client.Client, targetPort intstr.IntOrString) (int, error) {
90+
log := logging.FromContextOrDiscard(ctx)
91+
webhookPort := targetPort.IntValue()
92+
if webhookPort == 0 {
93+
// this should only have happened if the user configured a named port
94+
portName := targetPort.StrVal
95+
if portName == "" {
96+
return 0, fmt.Errorf("invalid webhook target port configuration: %v", targetPort)
97+
}
98+
log.Info("Resolving webhook port from named port", "portName", portName)
99+
pod := &corev1.Pod{}
100+
pod.Name = os.Getenv(openmcpconst.EnvVariablePodName)
101+
pod.Namespace = os.Getenv(openmcpconst.EnvVariablePodNamespace)
102+
if pod.Name == "" || pod.Namespace == "" {
103+
return 0, fmt.Errorf("environment variables %s and %s must be set to resolve webhook port from named port", openmcpconst.EnvVariablePodName, openmcpconst.EnvVariablePodNamespace)
104+
}
105+
if err := platformClusterClient.Get(ctx, client.ObjectKey{Name: pod.Name, Namespace: pod.Namespace}, pod); err != nil {
106+
return 0, fmt.Errorf("unable to get pod '%s/%s' to resolve webhook port from named port: %w", pod.Namespace, pod.Name, err)
107+
}
108+
namedPorts := pod.Spec.Containers[0].Ports
109+
found := false
110+
for _, p := range namedPorts {
111+
if p.Name == portName {
112+
webhookPort = int(p.ContainerPort)
113+
found = true
114+
log.Info("Resolved webhook port from named port", "portName", portName, "port", webhookPort)
115+
break
116+
}
117+
}
118+
if !found {
119+
return 0, fmt.Errorf("unable to find named port '%s' in pod '%s/%s' to resolve webhook port", portName, pod.Namespace, pod.Name)
120+
}
121+
}
122+
return webhookPort, nil
123+
}

cmd/project-workspace-operator/app/init.go

Lines changed: 67 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"github.com/spf13/cobra"
1010
rbacv1 "k8s.io/api/rbac/v1"
1111
"k8s.io/apimachinery/pkg/runtime"
12+
"k8s.io/apimachinery/pkg/util/wait"
1213
"sigs.k8s.io/controller-runtime/pkg/client"
1314

1415
ctrlutils "github.com/openmcp-project/controller-utils/pkg/controller"
@@ -17,11 +18,13 @@ import (
1718
clustersv1alpha1 "github.com/openmcp-project/openmcp-operator/api/clusters/v1alpha1"
1819
openmcpconst "github.com/openmcp-project/openmcp-operator/api/constants"
1920
"github.com/openmcp-project/openmcp-operator/lib/clusteraccess"
21+
libutils "github.com/openmcp-project/openmcp-operator/lib/utils"
2022

2123
pwv1alpha1 "github.com/openmcp-project/project-workspace-operator/api/core/v1alpha1"
2224
"github.com/openmcp-project/project-workspace-operator/api/crds"
2325
providerscheme "github.com/openmcp-project/project-workspace-operator/api/install"
2426
"github.com/openmcp-project/project-workspace-operator/internal/controller/core"
27+
"github.com/openmcp-project/project-workspace-operator/internal/dns"
2528
)
2629

2730
func NewInitCommand(so *SharedOptions) *cobra.Command {
@@ -140,8 +143,70 @@ func (o *InitOptions) Run(ctx context.Context) error {
140143

141144
suffix := "-webhook"
142145
whServiceName := ctrlutils.ShortenToXCharactersUnsafe(o.ProviderName, ctrlutils.K8sMaxNameLength-len(suffix)) + suffix
143-
suffix = "-webhook-tls"
144-
whSecretName := ctrlutils.ShortenToXCharactersUnsafe(o.ProviderName, ctrlutils.K8sMaxNameLength-len(suffix)) + suffix
146+
whSecretName, err := libutils.WebhookSecretName(o.ProviderName)
147+
if err != nil {
148+
return fmt.Errorf("unable to determine webhook secret name: %w", err)
149+
}
150+
151+
webhookPort, err := resolveWebhookPort(ctx, o.PlatformCluster.Client(), *pwc.Spec.Webhook.TargetPort)
152+
if err != nil {
153+
return err
154+
}
155+
156+
// setup gateway for webhooks
157+
dnsInstance := &dns.Instance{
158+
Name: whServiceName,
159+
Namespace: providerSystemNamespace,
160+
SubDomainPrefix: "pwo-webhooks",
161+
BackendName: whServiceName,
162+
BackendPort: int32(webhookPort),
163+
}
164+
dnsReconciler := dns.NewReconciler()
165+
timeout := 3 * time.Minute
166+
log.Info("Verifying default Gateway is available", "timeout", timeout.String())
167+
waitCtx, cancelCtx := context.WithTimeout(ctx, timeout)
168+
defer cancelCtx()
169+
var gatewayResult dns.GatewayReconcileResult
170+
err = wait.PollUntilContextTimeout(waitCtx, 10*time.Second, timeout, true, func(ctx context.Context) (bool, error) {
171+
gatewayResult, err = dnsReconciler.ReconcileGateway(ctx, dnsInstance, o.PlatformCluster)
172+
if err != nil {
173+
log.Error(err, "Error reconciling Gateway, retrying...")
174+
return false, nil
175+
}
176+
if gatewayResult.RequeueAfter > 0 {
177+
log.Debug("Default Gateway is not yet available, retrying...")
178+
return false, nil
179+
}
180+
return true, nil
181+
})
182+
if err != nil {
183+
return fmt.Errorf("default Gateway did not become available within %s: %w", timeout.String(), err)
184+
}
185+
log.Info("Default Gateway is available", "hostName", gatewayResult.HostName)
186+
187+
log.Info("Waiting for TLS route to become ready", "timeout", timeout.String())
188+
waitCtx, cancelCtx = context.WithTimeout(ctx, timeout)
189+
defer cancelCtx()
190+
err = wait.PollUntilContextTimeout(waitCtx, 10*time.Second, timeout, true, func(ctx context.Context) (bool, error) {
191+
if err := dnsReconciler.ReconcileTLSRoute(ctx, dnsInstance, o.PlatformCluster); err != nil {
192+
log.Error(err, "Error reconciling TLS route, retrying...")
193+
return false, nil
194+
}
195+
tlsReady, err := dnsReconciler.IsTLSRouteReady(ctx, dnsInstance, o.PlatformCluster)
196+
if err != nil {
197+
log.Error(err, "Error checking TLS route readiness, retrying...")
198+
return false, nil
199+
}
200+
if !tlsReady {
201+
log.Debug("TLS route is not yet ready, retrying...")
202+
return false, nil
203+
}
204+
return true, nil
205+
})
206+
if err != nil {
207+
return fmt.Errorf("TLS route did not become ready within %s: %w", timeout.String(), err)
208+
}
209+
log.Info("TLS route is ready")
145210

146211
opts := []webhooks.InstallOption{
147212
webhooks.WithWebhookService{Name: whServiceName, Namespace: providerSystemNamespace},

cmd/project-workspace-operator/app/run.go

Lines changed: 3 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import (
1010

1111
"github.com/spf13/cobra"
1212

13-
corev1 "k8s.io/api/core/v1"
1413
rbacv1 "k8s.io/api/rbac/v1"
1514
apiextv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
1615
"k8s.io/apimachinery/pkg/runtime"
@@ -310,36 +309,9 @@ func (o *RunOptions) Run(ctx context.Context) error {
310309
}
311310
}
312311

313-
webhookPort := pwc.Spec.Webhook.TargetPort.IntValue()
314-
if webhookPort == 0 {
315-
// this should only have happened if the user configured a named port
316-
portName := pwc.Spec.Webhook.TargetPort.StrVal
317-
if portName == "" {
318-
return fmt.Errorf("invalid webhook target port configuration: %v", pwc.Spec.Webhook.TargetPort)
319-
}
320-
setupLog.Info("Resolving webhook port from named port", "portName", portName)
321-
pod := &corev1.Pod{}
322-
pod.Name = os.Getenv(openmcpconst.EnvVariablePodName)
323-
pod.Namespace = os.Getenv(openmcpconst.EnvVariablePodNamespace)
324-
if pod.Name == "" || pod.Namespace == "" {
325-
return fmt.Errorf("environment variables %s and %s must be set to resolve webhook port from named port", openmcpconst.EnvVariablePodName, openmcpconst.EnvVariablePodNamespace)
326-
}
327-
if err := o.PlatformCluster.Client().Get(ctx, client.ObjectKey{Name: pod.Name, Namespace: pod.Namespace}, pod); err != nil {
328-
return fmt.Errorf("unable to get pod '%s/%s' to resolve webhook port from named port: %w", pod.Namespace, pod.Name, err)
329-
}
330-
namedPorts := pod.Spec.Containers[0].Ports
331-
found := false
332-
for _, p := range namedPorts {
333-
if p.Name == portName {
334-
webhookPort = int(p.ContainerPort)
335-
found = true
336-
setupLog.Info("Resolved webhook port from named port", "portName", portName, "port", webhookPort)
337-
break
338-
}
339-
}
340-
if !found {
341-
return fmt.Errorf("unable to find named port '%s' in pod '%s/%s' to resolve webhook port", portName, pod.Namespace, pod.Name)
342-
}
312+
webhookPort, err := resolveWebhookPort(ctx, o.PlatformCluster.Client(), *pwc.Spec.Webhook.TargetPort)
313+
if err != nil {
314+
return err
343315
}
344316

345317
webhookServer := webhook.NewServer(webhook.Options{

go.mod

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,22 +34,22 @@ require (
3434
github.com/x448/float16 v0.8.4 // indirect
3535
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
3636
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0 // indirect
37-
go.opentelemetry.io/otel v1.35.0 // indirect
37+
go.opentelemetry.io/otel v1.37.0 // indirect
3838
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 // indirect
3939
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 // indirect
40-
go.opentelemetry.io/otel/metric v1.35.0 // indirect
41-
go.opentelemetry.io/otel/sdk v1.34.0 // indirect
42-
go.opentelemetry.io/otel/trace v1.35.0 // indirect
40+
go.opentelemetry.io/otel/metric v1.37.0 // indirect
41+
go.opentelemetry.io/otel/sdk v1.37.0 // indirect
42+
go.opentelemetry.io/otel/trace v1.37.0 // indirect
4343
go.opentelemetry.io/proto/otlp v1.5.0 // indirect
4444
go.uber.org/automaxprocs v1.6.0 // indirect
4545
go.yaml.in/yaml/v2 v2.4.2 // indirect
4646
go.yaml.in/yaml/v3 v3.0.4 // indirect
4747
golang.org/x/exp v0.0.0-20251002181428-27f1f14c8bb9 // indirect
4848
golang.org/x/mod v0.28.0 // indirect
4949
golang.org/x/sync v0.17.0 // indirect
50-
google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb // indirect
51-
google.golang.org/genproto/googleapis/rpc v0.0.0-20250303144028-a0af3efb3deb // indirect
52-
google.golang.org/grpc v1.72.1 // indirect
50+
google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7 // indirect
51+
google.golang.org/genproto/googleapis/rpc v0.0.0-20250826171959-ef028d996bc1 // indirect
52+
google.golang.org/grpc v1.75.1 // indirect
5353
gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect
5454
k8s.io/apiserver v0.34.1 // indirect
5555
k8s.io/component-base v0.34.1 // indirect
@@ -110,6 +110,7 @@ require (
110110
k8s.io/klog/v2 v2.130.1 // indirect
111111
k8s.io/kube-openapi v0.0.0-20250814151709-d7b6acb124c3 // indirect
112112
k8s.io/utils v0.0.0-20251002143259-bc988d571ff4
113+
sigs.k8s.io/gateway-api v1.4.0
113114
sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect
114115
sigs.k8s.io/yaml v1.6.0
115116
)

go.sum

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -177,20 +177,20 @@ go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJyS
177177
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
178178
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0 h1:yd02MEjBdJkG3uabWP9apV+OuWRIXGDuJEUJbOHmCFU=
179179
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0/go.mod h1:umTcuxiv1n/s/S6/c2AT/g2CQ7u5C59sHDNmfSwgz7Q=
180-
go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ=
181-
go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y=
180+
go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ=
181+
go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I=
182182
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 h1:OeNbIYk/2C15ckl7glBlOBp5+WlYsOElzTNmiPW/x60=
183183
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0/go.mod h1:7Bept48yIeqxP2OZ9/AqIpYS94h2or0aB4FypJTc8ZM=
184184
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 h1:tgJ0uaNS4c98WRNUEx5U3aDlrDOI5Rs+1Vifcw4DJ8U=
185185
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0/go.mod h1:U7HYyW0zt/a9x5J1Kjs+r1f/d4ZHnYFclhYY2+YbeoE=
186-
go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M=
187-
go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE=
188-
go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A=
189-
go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU=
190-
go.opentelemetry.io/otel/sdk/metric v1.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce1EK0Gyvahk=
191-
go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w=
192-
go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs=
193-
go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc=
186+
go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE=
187+
go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E=
188+
go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI=
189+
go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg=
190+
go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc=
191+
go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps=
192+
go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4=
193+
go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0=
194194
go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4=
195195
go.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4=
196196
go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs=
@@ -252,12 +252,14 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T
252252
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
253253
gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw=
254254
gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY=
255-
google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb h1:p31xT4yrYrSM/G4Sn2+TNUkVhFCbG9y8itM2S6Th950=
256-
google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:jbe3Bkdp+Dh2IrslsFCklNhweNTBgSYanP1UXhJDhKg=
257-
google.golang.org/genproto/googleapis/rpc v0.0.0-20250303144028-a0af3efb3deb h1:TLPQVbx1GJ8VKZxz52VAxl1EBgKXXbTiU9Fc5fZeLn4=
258-
google.golang.org/genproto/googleapis/rpc v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I=
259-
google.golang.org/grpc v1.72.1 h1:HR03wO6eyZ7lknl75XlxABNVLLFc2PAb6mHlYh756mA=
260-
google.golang.org/grpc v1.72.1/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM=
255+
gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=
256+
gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E=
257+
google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7 h1:FiusG7LWj+4byqhbvmB+Q93B/mOxJLN2DTozDuZm4EU=
258+
google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:kXqgZtrWaf6qS3jZOCnCH7WYfrvFjkC51bM8fz3RsCA=
259+
google.golang.org/genproto/googleapis/rpc v0.0.0-20250826171959-ef028d996bc1 h1:pmJpJEvT846VzausCQ5d7KreSROcDqmO388w5YbnltA=
260+
google.golang.org/genproto/googleapis/rpc v0.0.0-20250826171959-ef028d996bc1/go.mod h1:GmFNa4BdJZ2a8G+wCe9Bg3wwThLrJun751XstdJt5Og=
261+
google.golang.org/grpc v1.75.1 h1:/ODCNEuf9VghjgO3rqLcfg8fiOP0nSluljWFlDxELLI=
262+
google.golang.org/grpc v1.75.1/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ=
261263
google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc=
262264
google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU=
263265
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
@@ -294,6 +296,8 @@ sigs.k8s.io/controller-runtime v0.22.3 h1:I7mfqz/a/WdmDCEnXmSPm8/b/yRTy6JsKKENTi
294296
sigs.k8s.io/controller-runtime v0.22.3/go.mod h1:+QX1XUpTXN4mLoblf4tqr5CQcyHPAki2HLXqQMY6vh8=
295297
sigs.k8s.io/e2e-framework v0.6.0 h1:p7hFzHnLKO7eNsWGI2AbC1Mo2IYxidg49BiT4njxkrM=
296298
sigs.k8s.io/e2e-framework v0.6.0/go.mod h1:IREnCHnKgRCioLRmNi0hxSJ1kJ+aAdjEKK/gokcZu4k=
299+
sigs.k8s.io/gateway-api v1.4.0 h1:ZwlNM6zOHq0h3WUX2gfByPs2yAEsy/EenYJB78jpQfQ=
300+
sigs.k8s.io/gateway-api v1.4.0/go.mod h1:AR5RSqciWP98OPckEjOjh2XJhAe2Na4LHyXD2FUY7Qk=
297301
sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg=
298302
sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg=
299303
sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU=

0 commit comments

Comments
 (0)