diff --git a/pkg/deployer/agentgateway_values.go b/pkg/deployer/agentgateway_values.go new file mode 100644 index 00000000000..f54562c9167 --- /dev/null +++ b/pkg/deployer/agentgateway_values.go @@ -0,0 +1,52 @@ +package deployer + +import ( + corev1 "k8s.io/api/core/v1" + + "github.com/kgateway-dev/kgateway/v2/api/v1alpha1/kgateway" +) + +// AgentgatewayHelmConfig stores the top-level helm values used by the deployer +// for agentgateway deployments. +type AgentgatewayHelmConfig struct { + Gateway *AgentgatewayHelmGateway `json:"gateway,omitempty"` +} + +// AgentgatewayHelmGateway contains helm values specific to agentgateway deployments. +type AgentgatewayHelmGateway struct { + // naming + Name *string `json:"name,omitempty"` + GatewayName *string `json:"gatewayName,omitempty"` + GatewayNamespace *string `json:"gatewayNamespace,omitempty"` + GatewayClassName *string `json:"gatewayClassName,omitempty"` + GatewayAnnotations map[string]string `json:"gatewayAnnotations,omitempty"` + GatewayLabels map[string]string `json:"gatewayLabels,omitempty"` + + // deployment values + Ports []HelmPort `json:"ports,omitempty"` + + // pod template values + PodSecurityContext *corev1.PodSecurityContext `json:"podSecurityContext,omitempty"` + StartupProbe *corev1.Probe `json:"startupProbe,omitempty"` + ReadinessProbe *corev1.Probe `json:"readinessProbe,omitempty"` + GracefulShutdown *kgateway.GracefulShutdownSpec `json:"gracefulShutdown,omitempty"` + TerminationGracePeriodSeconds *int64 `json:"terminationGracePeriodSeconds,omitempty"` + + // agentgateway container values + Image *HelmImage `json:"image,omitempty"` + Resources *corev1.ResourceRequirements `json:"resources,omitempty"` + SecurityContext *corev1.SecurityContext `json:"securityContext,omitempty"` + Env []corev1.EnvVar `json:"env,omitempty"` + + // agentgateway xds values + // Note: agentgateway uses agwXds for its xds connection, but the helm template + // also references xds.host for constructing the XDS_ADDRESS + Xds *HelmXds `json:"xds,omitempty"` + AgwXds *HelmXds `json:"agwXds,omitempty"` + + // agentgateway-specific config + // LogFormat specifies the logging format for agentgateway (Json or Text) + LogFormat *string `json:"logFormat,omitempty"` + // RawConfig provides opaque config to be merged into config.yaml + RawConfig map[string]any `json:"rawConfig,omitempty"` +} diff --git a/pkg/deployer/deployer.go b/pkg/deployer/deployer.go index 0c67ac29328..71979ed6e75 100644 --- a/pkg/deployer/deployer.go +++ b/pkg/deployer/deployer.go @@ -59,7 +59,6 @@ type Deployer struct { agwControllerName string agwGatewayClassName string chart *chart.Chart - agentgatewayChart *chart.Chart scheme *runtime.Scheme client apiclient.Client helmValues HelmValuesGenerator @@ -82,7 +81,7 @@ func WithGVKToGVRMapper(m map[schema.GroupVersionKind]schema.GroupVersionResourc } } -// NewDeployer creates a new gateway/inference pool/etc +// NewDeployer creates a new gateway/inference pool/etc deployer with a single chart. // TODO [danehans]: Reloading the chart for every reconciliation is inefficient. // See https://github.com/kgateway-dev/kgateway/issues/10672 for details. func NewDeployer( @@ -101,36 +100,6 @@ func NewDeployer( scheme: scheme, client: client, chart: chart, - agentgatewayChart: nil, - helmValues: hvg, - helmReleaseNameAndNamespaceGenerator: helmReleaseNameAndNamespaceGenerator, - patcher: applyPatch, - } - for _, o := range opts { - o(d) - } - return d -} - -// NewDeployerWithMultipleCharts creates a new gateway deployer that supports both envoy and agentgateway charts -func NewDeployerWithMultipleCharts( - controllerName, agwControllerName, agwGatewayClassName string, - scheme *runtime.Scheme, - client apiclient.Client, - envoyChart *chart.Chart, - agentgatewayChart *chart.Chart, - hvg HelmValuesGenerator, - helmReleaseNameAndNamespaceGenerator func(obj client.Object) (string, string), - opts ...Option, -) *Deployer { - d := &Deployer{ - controllerName: controllerName, - agwControllerName: agwControllerName, - agwGatewayClassName: agwGatewayClassName, - scheme: scheme, - client: client, - chart: envoyChart, - agentgatewayChart: agentgatewayChart, helmValues: hvg, helmReleaseNameAndNamespaceGenerator: helmReleaseNameAndNamespaceGenerator, patcher: applyPatch, @@ -158,6 +127,14 @@ func JsonConvert(in *HelmConfig, out any) error { return json.Unmarshal(b, out) } +func AgentgatewayJsonConvert(in *AgentgatewayHelmConfig, out any) error { + b, err := json.Marshal(in) + if err != nil { + return err + } + return json.Unmarshal(b, out) +} + func (d *Deployer) RenderChartToObjects(ns, name string, vals map[string]any) ([]client.Object, error) { objs, err := d.RenderToObjects(ns, name, vals) if err != nil { @@ -203,19 +180,7 @@ func (d *Deployer) RenderManifest(ns, name string, vals map[string]any) ([]byte, install.ClientOnly = true installCtx := context.Background() - // Select the appropriate chart based on whether agentgateway is enabled - chartToUse := d.chart - if d.agentgatewayChart != nil { - if gateway, ok := vals["gateway"].(map[string]any); ok { - if dataPlaneType, ok := gateway["dataPlaneType"].(string); ok { - if dataPlaneType == string(DataPlaneAgentgateway) { - chartToUse = d.agentgatewayChart - } - } - } - } - - release, err := install.RunWithContext(installCtx, chartToUse, vals) + release, err := install.RunWithContext(installCtx, d.chart, vals) if err != nil { return nil, fmt.Errorf("failed to render helm chart for %s.%s: %w", ns, name, err) } diff --git a/pkg/deployer/deployer_test.go b/pkg/deployer/deployer_test.go index e43e80dcc50..97462471a05 100644 --- a/pkg/deployer/deployer_test.go +++ b/pkg/deployer/deployer_test.go @@ -390,13 +390,13 @@ var _ = Describe("Deployer", func() { AgentgatewayClassName: wellknown.DefaultAgwClassName, AgentgatewayControllerName: wellknown.DefaultAgwControllerName, }) - d, err := deployerinternal.NewGatewayDeployer( + d, err := deployerinternal.NewEnvoyGatewayDeployer( wellknown.DefaultGatewayControllerName, wellknown.DefaultAgwControllerName, wellknown.DefaultAgwClassName, scheme, fakeClient, - gwp, + gwp.EnvoyHelmValuesGenerator(), ) Expect(err).NotTo(HaveOccurred()) fakeClient.RunAndWait(context.Background().Done()) @@ -477,13 +477,13 @@ var _ = Describe("Deployer", func() { AgentgatewayClassName: wellknown.DefaultAgwClassName, AgentgatewayControllerName: wellknown.DefaultAgwControllerName, }) - d, err = deployerinternal.NewGatewayDeployer( + d, err = deployerinternal.NewEnvoyGatewayDeployer( wellknown.DefaultGatewayControllerName, wellknown.DefaultAgwControllerName, wellknown.DefaultAgwClassName, scheme, fakeClient, - gwParams, + gwParams.EnvoyHelmValuesGenerator(), ) Expect(err).NotTo(HaveOccurred()) fakeClient.RunAndWait(context.Background().Done()) @@ -557,13 +557,13 @@ var _ = Describe("Deployer", func() { AgentgatewayClassName: wellknown.DefaultAgwClassName, AgentgatewayControllerName: wellknown.DefaultAgwControllerName, }) - d, err := deployerinternal.NewGatewayDeployer( + d, err := deployerinternal.NewAgentgatewayDeployer( wellknown.DefaultGatewayControllerName, wellknown.DefaultAgwControllerName, wellknown.DefaultAgwClassName, scheme, fakeClient, - gwParams, + gwParams.AgentgatewayParametersHelmValuesGenerator(), ) Expect(err).NotTo(HaveOccurred()) fakeClient.RunAndWait(context.Background().Done()) @@ -675,13 +675,13 @@ var _ = Describe("Deployer", func() { AgentgatewayClassName: wellknown.DefaultAgwClassName, AgentgatewayControllerName: wellknown.DefaultAgwControllerName, }) - d, err := deployerinternal.NewGatewayDeployer( + d, err := deployerinternal.NewEnvoyGatewayDeployer( wellknown.DefaultGatewayControllerName, wellknown.DefaultAgwControllerName, wellknown.DefaultAgwClassName, scheme, fakeClient, - gwParams, + gwParams.EnvoyHelmValuesGenerator(), ) Expect(err).NotTo(HaveOccurred()) fakeClient.RunAndWait(context.Background().Done()) @@ -748,13 +748,13 @@ var _ = Describe("Deployer", func() { AgentgatewayClassName: wellknown.DefaultAgwClassName, AgentgatewayControllerName: wellknown.DefaultAgwControllerName, }) - d, err := deployerinternal.NewGatewayDeployer( + d, err := deployerinternal.NewEnvoyGatewayDeployer( wellknown.DefaultGatewayControllerName, wellknown.DefaultAgwControllerName, wellknown.DefaultAgwClassName, scheme, fakeClient, - gwParams, + gwParams.EnvoyHelmValuesGenerator(), ) Expect(err).NotTo(HaveOccurred()) fakeClient.RunAndWait(context.Background().Done()) @@ -837,13 +837,13 @@ var _ = Describe("Deployer", func() { AgentgatewayClassName: wellknown.DefaultAgwClassName, AgentgatewayControllerName: wellknown.DefaultAgwControllerName, }) - d, err := deployerinternal.NewGatewayDeployer( + d, err := deployerinternal.NewEnvoyGatewayDeployer( wellknown.DefaultGatewayControllerName, wellknown.DefaultAgwControllerName, wellknown.DefaultAgwClassName, scheme, fakeClient, - gwParams, + gwParams.EnvoyHelmValuesGenerator(), ) Expect(err).NotTo(HaveOccurred()) fakeClient.RunAndWait(context.Background().Done()) @@ -932,13 +932,13 @@ var _ = Describe("Deployer", func() { AgentgatewayClassName: wellknown.DefaultAgwClassName, AgentgatewayControllerName: wellknown.DefaultAgwControllerName, }) - d, err := deployerinternal.NewGatewayDeployer( + d, err := deployerinternal.NewEnvoyGatewayDeployer( wellknown.DefaultGatewayControllerName, wellknown.DefaultAgwControllerName, wellknown.DefaultAgwClassName, scheme, fakeClient, - gwParams, + gwParams.EnvoyHelmValuesGenerator(), ) Expect(err).NotTo(HaveOccurred()) fakeClient.RunAndWait(context.Background().Done()) @@ -1023,13 +1023,13 @@ var _ = Describe("Deployer", func() { AgentgatewayClassName: wellknown.DefaultAgwClassName, AgentgatewayControllerName: wellknown.DefaultAgwControllerName, }) - d1, err := deployerinternal.NewGatewayDeployer( + d1, err := deployerinternal.NewEnvoyGatewayDeployer( wellknown.DefaultGatewayControllerName, wellknown.DefaultAgwControllerName, wellknown.DefaultAgwClassName, scheme, fakeClient, - gwParams1, + gwParams1.EnvoyHelmValuesGenerator(), ) Expect(err).NotTo(HaveOccurred()) @@ -1050,13 +1050,13 @@ var _ = Describe("Deployer", func() { AgentgatewayClassName: wellknown.DefaultAgwClassName, AgentgatewayControllerName: wellknown.DefaultAgwControllerName, }) - d2, err := deployerinternal.NewGatewayDeployer( + d2, err := deployerinternal.NewEnvoyGatewayDeployer( wellknown.DefaultGatewayControllerName, wellknown.DefaultAgwControllerName, wellknown.DefaultAgwClassName, scheme, fakeClient, - gwParams2, + gwParams2.EnvoyHelmValuesGenerator(), ) Expect(err).NotTo(HaveOccurred()) fakeClient.RunAndWait(context.Background().Done()) @@ -1123,13 +1123,13 @@ var _ = Describe("Deployer", func() { Tag: "bar", }, }) - d, err := deployerinternal.NewGatewayDeployer( + d, err := deployerinternal.NewEnvoyGatewayDeployer( wellknown.DefaultGatewayControllerName, wellknown.DefaultAgwControllerName, wellknown.DefaultAgwClassName, scheme, fakeClient, - gwParams, + gwParams.EnvoyHelmValuesGenerator(), ) Expect(err).NotTo(HaveOccurred()) fakeClient.RunAndWait(context.Background().Done()) @@ -1171,13 +1171,13 @@ var _ = Describe("Deployer", func() { Tag: "bar", }, }) - d, err := deployerinternal.NewGatewayDeployer( + d, err := deployerinternal.NewEnvoyGatewayDeployer( wellknown.DefaultGatewayControllerName, wellknown.DefaultAgwControllerName, wellknown.DefaultAgwClassName, scheme, fakeClient, - gwParams, + gwParams.EnvoyHelmValuesGenerator(), ) Expect(err).NotTo(HaveOccurred()) fakeClient.RunAndWait(context.Background().Done()) @@ -1232,13 +1232,13 @@ var _ = Describe("Deployer", func() { Tag: tag, }, }) - d, err = deployerinternal.NewGatewayDeployer( + d, err = deployerinternal.NewEnvoyGatewayDeployer( wellknown.DefaultGatewayControllerName, wellknown.DefaultAgwControllerName, wellknown.DefaultAgwClassName, scheme, fakeClient, - gwParams, + gwParams.EnvoyHelmValuesGenerator(), ) Expect(err).NotTo(HaveOccurred()) fakeClient.RunAndWait(context.Background().Done()) @@ -1323,13 +1323,13 @@ var _ = Describe("Deployer", func() { Tag: tag, }, }) - d, err = deployerinternal.NewGatewayDeployer( + d, err = deployerinternal.NewEnvoyGatewayDeployer( wellknown.DefaultGatewayControllerName, wellknown.DefaultAgwControllerName, wellknown.DefaultAgwClassName, scheme, fakeClient, - gwParams, + gwParams.EnvoyHelmValuesGenerator(), ) Expect(err).NotTo(HaveOccurred()) fakeClient.RunAndWait(context.Background().Done()) @@ -1418,13 +1418,13 @@ var _ = Describe("Deployer", func() { Tag: tag, }, }) - d, err = deployerinternal.NewGatewayDeployer( + d, err = deployerinternal.NewEnvoyGatewayDeployer( wellknown.DefaultGatewayControllerName, wellknown.DefaultAgwControllerName, wellknown.DefaultAgwClassName, scheme, fakeClient, - gwParams, + gwParams.EnvoyHelmValuesGenerator(), ) Expect(err).NotTo(HaveOccurred()) fakeClient.RunAndWait(context.Background().Done()) @@ -2045,13 +2045,13 @@ var _ = Describe("Deployer", func() { fakeClient := fake.NewClient(GinkgoT(), gwc, defaultGwp, overrideGwp) gwParams := deployerinternal.NewGatewayParameters(fakeClient, inp.dInputs) - d, err := deployerinternal.NewGatewayDeployer( + d, err := deployerinternal.NewEnvoyGatewayDeployer( wellknown.DefaultGatewayControllerName, wellknown.DefaultAgwControllerName, wellknown.DefaultAgwClassName, scheme, fakeClient, - gwParams, + gwParams.EnvoyHelmValuesGenerator(), ) Expect(err).NotTo(HaveOccurred()) fakeClient.RunAndWait(context.Background().Done()) @@ -2472,13 +2472,13 @@ var _ = Describe("Deployer", func() { Tag: "bar", }, }) - d, err := deployerinternal.NewGatewayDeployer( + d, err := deployerinternal.NewEnvoyGatewayDeployer( wellknown.DefaultGatewayControllerName, wellknown.DefaultAgwControllerName, wellknown.DefaultAgwClassName, scheme, fakeClient, - gwParams, + gwParams.EnvoyHelmValuesGenerator(), ) Expect(err).NotTo(HaveOccurred()) fakeClient.RunAndWait(context.Background().Done()) @@ -2709,7 +2709,7 @@ var _ = Describe("DeployObjs", func() { ) getDeployer := func(fc apiclient.Client, patcher deployer.Patcher) *deployer.Deployer { - d, err := deployerinternal.NewGatewayDeployer( + d, err := deployerinternal.NewEnvoyGatewayDeployer( wellknown.DefaultGatewayControllerName, wellknown.DefaultAgwControllerName, wellknown.DefaultAgwClassName, diff --git a/pkg/deployer/values.go b/pkg/deployer/values.go index 4a00f44588c..f41fb5a39a6 100644 --- a/pkg/deployer/values.go +++ b/pkg/deployer/values.go @@ -7,24 +7,14 @@ import ( "github.com/kgateway-dev/kgateway/v2/api/v1alpha1/kgateway" ) -type DataPlaneType string - -const ( - DataPlaneAgentgateway DataPlaneType = "agentgateway" - DataPlaneEnvoy DataPlaneType = "envoy" -) - -// helmConfig stores the top-level helm values used by the deployer. +// HelmConfig stores the top-level helm values used by the deployer for Envoy deployments. type HelmConfig struct { Gateway *HelmGateway `json:"gateway,omitempty"` InferenceExtension *HelmInferenceExtension `json:"inferenceExtension,omitempty"` } +// HelmGateway contains helm values specific to Envoy gateway deployments. type HelmGateway struct { - // not needed by the helm charts, but by the code that select the correct - // helm chart: - DataPlaneType DataPlaneType `json:"dataPlaneType"` - // naming Name *string `json:"name,omitempty"` GatewayName *string `json:"gatewayName,omitempty"` @@ -69,12 +59,8 @@ type HelmGateway struct { Istio *HelmIstio `json:"istio,omitempty"` // envoy container values - ComponentLogLevel *string `json:"componentLogLevel,omitempty"` - - // envoy or agentgateway container values - // Note: ideally, these should be mapped to container specific values, but right now they - // map to the proxy container LogLevel *string `json:"logLevel,omitempty"` + ComponentLogLevel *string `json:"componentLogLevel,omitempty"` Image *HelmImage `json:"image,omitempty"` Resources *corev1.ResourceRequirements `json:"resources,omitempty"` SecurityContext *corev1.SecurityContext `json:"securityContext,omitempty"` @@ -83,16 +69,9 @@ type HelmGateway struct { // xds values Xds *HelmXds `json:"xds,omitempty"` - // agentgateway xds values - AgwXds *HelmXds `json:"agwXds,omitempty"` // stats values Stats *HelmStatsConfig `json:"stats,omitempty"` - - // LogFormat specifies the logging format for agentgateway (Json or Text) - LogFormat *string `json:"logFormat,omitempty"` - // RawConfig provides opaque config to be merged into config.yaml - RawConfig map[string]any `json:"rawConfig,omitempty"` } // helmPort represents a Gateway Listener port diff --git a/pkg/kgateway/controller/controller.go b/pkg/kgateway/controller/controller.go index cca6495e38f..af597ea77d1 100644 --- a/pkg/kgateway/controller/controller.go +++ b/pkg/kgateway/controller/controller.go @@ -115,17 +115,30 @@ func watchGw( gwParams.WithHelmValuesGeneratorOverride(helmValuesGeneratorOverride(inputs)) } - d, err := internaldeployer.NewGatewayDeployer( + // Create separate deployers for envoy and agentgateway + envoyDeployer, err := internaldeployer.NewEnvoyGatewayDeployer( cfg.ControllerName, cfg.AgwControllerName, cfg.AgentgatewayClassName, cfg.Mgr.GetScheme(), cfg.Client, - gwParams, + gwParams.EnvoyHelmValuesGenerator(), ) if err != nil { return err } - return cfg.Mgr.Add(NewGatewayReconciler(cfg, d, gwParams, gatewayControllerExtension)) + agwDeployer, err := internaldeployer.NewAgentgatewayDeployer( + cfg.ControllerName, + cfg.AgwControllerName, + cfg.AgentgatewayClassName, + cfg.Mgr.GetScheme(), + cfg.Client, + gwParams.AgentgatewayParametersHelmValuesGenerator(), + ) + if err != nil { + return err + } + + return cfg.Mgr.Add(NewGatewayReconciler(cfg, envoyDeployer, agwDeployer, gwParams, gatewayControllerExtension)) } diff --git a/pkg/kgateway/controller/gw_controller.go b/pkg/kgateway/controller/gw_controller.go index 9c01f4f33c2..d53b6d30189 100644 --- a/pkg/kgateway/controller/gw_controller.go +++ b/pkg/kgateway/controller/gw_controller.go @@ -51,7 +51,8 @@ var logger = logging.New("gateway-controller") var _ manager.LeaderElectionRunnable = (*gatewayReconciler)(nil) type gatewayReconciler struct { - deployer *deployer.Deployer + envoyDeployer *deployer.Deployer + agwDeployer *deployer.Deployer gwParams *internaldeployer.GatewayParameters scheme *runtime.Scheme controllerName string @@ -76,13 +77,15 @@ type gatewayReconciler struct { func NewGatewayReconciler( cfg GatewayConfig, - deployer *deployer.Deployer, + envoyDeployer *deployer.Deployer, + agwDeployer *deployer.Deployer, gwParams *internaldeployer.GatewayParameters, controllerExtension pluginsdk.GatewayControllerExtension, ) *gatewayReconciler { filter := kclient.Filter{ObjectFilter: cfg.Client.ObjectFilter()} r := &gatewayReconciler{ - deployer: deployer, + envoyDeployer: envoyDeployer, + agwDeployer: agwDeployer, gwParams: gwParams, scheme: cfg.Mgr.GetScheme(), controllerName: cfg.ControllerName, @@ -362,7 +365,16 @@ func (r *gatewayReconciler) Reconcile(req types.NamespacedName) (rErr error) { logger.Info("reconciling Gateway", "ref", req) ctx := context.Background() - objs, err := r.deployer.GetObjsToDeploy(ctx, gw) + + // Select the appropriate deployer based on the GatewayClass controller + var d *deployer.Deployer + if isEnvoyGateway { + d = r.envoyDeployer + } else { + d = r.agwDeployer + } + + objs, err := d.GetObjsToDeploy(ctx, gw) if err != nil { if errors.Is(err, internaldeployer.ErrNoValidPorts) { // status is reported from translator, so return normally @@ -397,8 +409,8 @@ func (r *gatewayReconciler) Reconcile(req types.NamespacedName) (rErr error) { return fmt.Errorf("failed to update status for Gateway %s: %w", req, statusErr) } } - objs = r.deployer.SetNamespaceAndOwnerWithGVK(gw, wellknown.GatewayGVK, objs) - err = r.deployer.DeployObjsWithSource(ctx, objs, gw) + objs = d.SetNamespaceAndOwnerWithGVK(gw, wellknown.GatewayGVK, objs) + err = d.DeployObjsWithSource(ctx, objs, gw) if err != nil { return err } diff --git a/pkg/kgateway/deployer/agentgateway_parameters.go b/pkg/kgateway/deployer/agentgateway_parameters.go index 2bdde478720..ccceb23edf2 100644 --- a/pkg/kgateway/deployer/agentgateway_parameters.go +++ b/pkg/kgateway/deployer/agentgateway_parameters.go @@ -35,7 +35,7 @@ func NewAgentgatewayParametersApplier(params *agentgateway.AgentgatewayParameter // ApplyToHelmValues applies the AgentgatewayParameters configs to the helm // values. This is called before rendering the helm chart. (We render a helm // chart, but we do not use helm beyond that point.) -func (a *AgentgatewayParametersApplier) ApplyToHelmValues(vals *deployer.HelmConfig) { +func (a *AgentgatewayParametersApplier) ApplyToHelmValues(vals *deployer.AgentgatewayHelmConfig) { if a.params == nil || vals == nil || vals.Gateway == nil { return } @@ -146,14 +146,14 @@ func (a *AgentgatewayParametersApplier) ApplyOverlaysToObjects(objs []client.Obj return applier.ApplyOverlays(objs) } -type agentgatewayParametersHelmValuesGenerator struct { +type AgentgatewayParametersHelmValuesGenerator struct { agwParamClient kclient.Client[*agentgateway.AgentgatewayParameters] gwClassClient kclient.Client[*gwv1.GatewayClass] inputs *deployer.Inputs } -func newAgentgatewayParametersHelmValuesGenerator(cli apiclient.Client, inputs *deployer.Inputs) *agentgatewayParametersHelmValuesGenerator { - return &agentgatewayParametersHelmValuesGenerator{ +func NewAgentgatewayParametersHelmValuesGenerator(cli apiclient.Client, inputs *deployer.Inputs) *AgentgatewayParametersHelmValuesGenerator { + return &AgentgatewayParametersHelmValuesGenerator{ agwParamClient: kclient.NewFilteredDelayed[*agentgateway.AgentgatewayParameters](cli, wellknown.AgentgatewayParametersGVR, kclient.Filter{ObjectFilter: cli.ObjectFilter()}), gwClassClient: kclient.NewFilteredDelayed[*gwv1.GatewayClass](cli, wellknown.GatewayClassGVR, kclient.Filter{ObjectFilter: cli.ObjectFilter()}), inputs: inputs, @@ -161,7 +161,7 @@ func newAgentgatewayParametersHelmValuesGenerator(cli apiclient.Client, inputs * } // GetValues returns helm values derived from AgentgatewayParameters. -func (g *agentgatewayParametersHelmValuesGenerator) GetValues(ctx context.Context, obj client.Object) (map[string]any, error) { +func (g *AgentgatewayParametersHelmValuesGenerator) GetValues(ctx context.Context, obj client.Object) (map[string]any, error) { gw, ok := obj.(*gwv1.Gateway) if !ok { return nil, fmt.Errorf("expected a Gateway resource, got %s", obj.GetObjectKind().GroupVersionKind().String()) @@ -189,13 +189,13 @@ func (g *agentgatewayParametersHelmValuesGenerator) GetValues(ctx context.Contex } if g.inputs.ControlPlane.XdsTLS { - if err := injectXdsCACertificate(g.inputs.ControlPlane.XdsTlsCaPath, vals); err != nil { + if err := injectXdsCACertificate(g.inputs.ControlPlane.XdsTlsCaPath, vals.Gateway.Xds, vals.Gateway.AgwXds); err != nil { return nil, fmt.Errorf("failed to inject xDS CA certificate: %w", err) } } var jsonVals map[string]any - err = deployer.JsonConvert(vals, &jsonVals) + err = deployer.AgentgatewayJsonConvert(vals, &jsonVals) return jsonVals, err } @@ -211,7 +211,7 @@ type resolvedParameters struct { // resolveParameters resolves the AgentgatewayParameters for the Gateway. // It returns both GatewayClass-level and Gateway-level // separately to support ordered overlay merging (GatewayClass first, then Gateway). -func (g *agentgatewayParametersHelmValuesGenerator) resolveParameters(gw *gwv1.Gateway) (*resolvedParameters, error) { +func (g *AgentgatewayParametersHelmValuesGenerator) resolveParameters(gw *gwv1.Gateway) (*resolvedParameters, error) { result := &resolvedParameters{} // Get GatewayClass parameters first @@ -258,26 +258,58 @@ func (g *agentgatewayParametersHelmValuesGenerator) resolveParameters(gw *gwv1.G return result, nil } -func (g *agentgatewayParametersHelmValuesGenerator) GetCacheSyncHandlers() []cache.InformerSynced { +func (g *AgentgatewayParametersHelmValuesGenerator) GetCacheSyncHandlers() []cache.InformerSynced { return []cache.InformerSynced{g.agwParamClient.HasSynced, g.gwClassClient.HasSynced} } +// PostProcessObjects implements deployer.ObjectPostProcessor. +// It applies AgentgatewayParameters overlays to the rendered objects. +// When both GatewayClass and Gateway have AgentgatewayParameters, the overlays +// are applied in order: GatewayClass first, then Gateway on top. +func (g *AgentgatewayParametersHelmValuesGenerator) PostProcessObjects(ctx context.Context, obj client.Object, rendered []client.Object) error { + gw, ok := obj.(*gwv1.Gateway) + if !ok { + return nil + } + + resolved, err := g.GetResolvedParametersForGateway(gw) + if err != nil { + return nil + } + + // Apply overlays in order: GatewayClass first, then Gateway. + // This allows Gateway-level overlays to override GatewayClass-level overlays. + if resolved.gatewayClassAGWP != nil { + applier := NewAgentgatewayParametersApplier(resolved.gatewayClassAGWP) + if err := applier.ApplyOverlaysToObjects(rendered); err != nil { + return err + } + } + if resolved.gatewayAGWP != nil { + applier := NewAgentgatewayParametersApplier(resolved.gatewayAGWP) + if err := applier.ApplyOverlaysToObjects(rendered); err != nil { + return err + } + } + + return nil +} + // GetResolvedParametersForGateway returns both the GatewayClass-level and Gateway-level // AgentgatewayParameters for the given Gateway. This allows callers to apply overlays // in order (GatewayClass first, then Gateway). -func (g *agentgatewayParametersHelmValuesGenerator) GetResolvedParametersForGateway(gw *gwv1.Gateway) (*resolvedParameters, error) { +func (g *AgentgatewayParametersHelmValuesGenerator) GetResolvedParametersForGateway(gw *gwv1.Gateway) (*resolvedParameters, error) { return g.resolveParameters(gw) } -func (g *agentgatewayParametersHelmValuesGenerator) getDefaultAgentgatewayHelmValues(gw *gwv1.Gateway) (*deployer.HelmConfig, error) { +func (g *AgentgatewayParametersHelmValuesGenerator) getDefaultAgentgatewayHelmValues(gw *gwv1.Gateway) (*deployer.AgentgatewayHelmConfig, error) { irGW := deployer.GetGatewayIR(gw, g.inputs.CommonCollections) ports := deployer.GetPortsValues(irGW, nil, true) // true = agentgateway if len(ports) == 0 { return nil, ErrNoValidPorts } - gtw := &deployer.HelmGateway{ - DataPlaneType: deployer.DataPlaneAgentgateway, + gtw := &deployer.AgentgatewayHelmGateway{ Name: &gw.Name, GatewayName: &gw.Name, GatewayNamespace: &gw.Namespace, @@ -315,7 +347,6 @@ func (g *agentgatewayParametersHelmValuesGenerator) getDefaultAgentgatewayHelmVa Tag: ptr.To(deployer.AgentgatewayDefaultTag), PullPolicy: ptr.To(""), } - gtw.DataPlaneType = deployer.DataPlaneAgentgateway gtw.TerminationGracePeriodSeconds = ptr.To(int64(60)) gtw.GracefulShutdown = &kgateway.GracefulShutdownSpec{ @@ -363,5 +394,5 @@ func (g *agentgatewayParametersHelmValuesGenerator) getDefaultAgentgatewayHelmVa RunAsUser: ptr.To(int64(10101)), } - return &deployer.HelmConfig{Gateway: gtw}, nil + return &deployer.AgentgatewayHelmConfig{Gateway: gtw}, nil } diff --git a/pkg/kgateway/deployer/agentgateway_parameters_test.go b/pkg/kgateway/deployer/agentgateway_parameters_test.go index b8e95956dc7..e8af546b053 100644 --- a/pkg/kgateway/deployer/agentgateway_parameters_test.go +++ b/pkg/kgateway/deployer/agentgateway_parameters_test.go @@ -19,16 +19,16 @@ import ( func TestAgentgatewayParametersApplier_ApplyToHelmValues_NilParams(t *testing.T) { applier := NewAgentgatewayParametersApplier(nil) - vals := &deployer.HelmConfig{ - Gateway: &deployer.HelmGateway{ - LogLevel: ptr.To("info"), + vals := &deployer.AgentgatewayHelmConfig{ + Gateway: &deployer.AgentgatewayHelmGateway{ + LogFormat: ptr.To("json"), }, } applier.ApplyToHelmValues(vals) // Values should be unchanged - assert.Equal(t, "info", *vals.Gateway.LogLevel) + assert.Equal(t, "json", *vals.Gateway.LogFormat) } func TestAgentgatewayParametersApplier_ApplyToHelmValues_Image(t *testing.T) { @@ -45,8 +45,8 @@ func TestAgentgatewayParametersApplier_ApplyToHelmValues_Image(t *testing.T) { } applier := NewAgentgatewayParametersApplier(params) - vals := &deployer.HelmConfig{ - Gateway: &deployer.HelmGateway{}, + vals := &deployer.AgentgatewayHelmConfig{ + Gateway: &deployer.AgentgatewayHelmGateway{}, } applier.ApplyToHelmValues(vals) @@ -76,8 +76,8 @@ func TestAgentgatewayParametersApplier_ApplyToHelmValues_Resources(t *testing.T) } applier := NewAgentgatewayParametersApplier(params) - vals := &deployer.HelmConfig{ - Gateway: &deployer.HelmGateway{}, + vals := &deployer.AgentgatewayHelmConfig{ + Gateway: &deployer.AgentgatewayHelmGateway{}, } applier.ApplyToHelmValues(vals) @@ -100,8 +100,8 @@ func TestAgentgatewayParametersApplier_ApplyToHelmValues_Env(t *testing.T) { } applier := NewAgentgatewayParametersApplier(params) - vals := &deployer.HelmConfig{ - Gateway: &deployer.HelmGateway{ + vals := &deployer.AgentgatewayHelmConfig{ + Gateway: &deployer.AgentgatewayHelmGateway{ Env: []corev1.EnvVar{ {Name: "EXISTING_VAR", Value: "existing_value"}, }, @@ -128,8 +128,8 @@ func TestAgentgatewayParametersApplier_ApplyToHelmValues_Logging(t *testing.T) { } applier := NewAgentgatewayParametersApplier(params) - vals := &deployer.HelmConfig{ - Gateway: &deployer.HelmGateway{}, + vals := &deployer.AgentgatewayHelmConfig{ + Gateway: &deployer.AgentgatewayHelmGateway{}, } applier.ApplyToHelmValues(vals) @@ -227,8 +227,8 @@ func TestAgentgatewayParametersApplier_ApplyToHelmValues_RawConfig(t *testing.T) } applier := NewAgentgatewayParametersApplier(params) - vals := &deployer.HelmConfig{ - Gateway: &deployer.HelmGateway{}, + vals := &deployer.AgentgatewayHelmConfig{ + Gateway: &deployer.AgentgatewayHelmGateway{}, } applier.ApplyToHelmValues(vals) @@ -267,8 +267,8 @@ func TestAgentgatewayParametersApplier_ApplyToHelmValues_RawConfigWithLogging(t } applier := NewAgentgatewayParametersApplier(params) - vals := &deployer.HelmConfig{ - Gateway: &deployer.HelmGateway{}, + vals := &deployer.AgentgatewayHelmConfig{ + Gateway: &deployer.AgentgatewayHelmGateway{}, } applier.ApplyToHelmValues(vals) diff --git a/pkg/kgateway/deployer/deployer_factory.go b/pkg/kgateway/deployer/deployer_factory.go index 6935cb22b6b..06f1d697c49 100644 --- a/pkg/kgateway/deployer/deployer_factory.go +++ b/pkg/kgateway/deployer/deployer_factory.go @@ -7,15 +7,36 @@ import ( "github.com/kgateway-dev/kgateway/v2/pkg/deployer" ) -func NewGatewayDeployer(controllerName, agwControllerName, agwGatewayClassName string, scheme *runtime.Scheme, client apiclient.Client, gwParams *GatewayParameters, opts ...deployer.Option) (*deployer.Deployer, error) { +// NewEnvoyGatewayDeployer creates a deployer for Envoy-based gateways. +func NewEnvoyGatewayDeployer( + controllerName, agwControllerName, agwGatewayClassName string, + scheme *runtime.Scheme, + client apiclient.Client, + hvg deployer.HelmValuesGenerator, + opts ...deployer.Option, +) (*deployer.Deployer, error) { envoyChart, err := LoadEnvoyChart() if err != nil { return nil, err } + return deployer.NewDeployer( + controllerName, agwControllerName, agwGatewayClassName, + scheme, client, envoyChart, hvg, GatewayReleaseNameAndNamespace, opts...), nil +} + +// NewAgentgatewayDeployer creates a deployer for agentgateway-based gateways. +func NewAgentgatewayDeployer( + controllerName, agwControllerName, agwGatewayClassName string, + scheme *runtime.Scheme, + client apiclient.Client, + hvg deployer.HelmValuesGenerator, + opts ...deployer.Option, +) (*deployer.Deployer, error) { agentgatewayChart, err := LoadAgentgatewayChart() if err != nil { return nil, err } - return deployer.NewDeployerWithMultipleCharts( - controllerName, agwControllerName, agwGatewayClassName, scheme, client, envoyChart, agentgatewayChart, gwParams, GatewayReleaseNameAndNamespace, opts...), nil + return deployer.NewDeployer( + controllerName, agwControllerName, agwGatewayClassName, + scheme, client, agentgatewayChart, hvg, GatewayReleaseNameAndNamespace, opts...), nil } diff --git a/pkg/kgateway/deployer/gateway_parameters.go b/pkg/kgateway/deployer/gateway_parameters.go index a93a6721402..39455b0e9f4 100644 --- a/pkg/kgateway/deployer/gateway_parameters.go +++ b/pkg/kgateway/deployer/gateway_parameters.go @@ -38,12 +38,12 @@ func NewGatewayParameters(cli apiclient.Client, inputs *deployer.Inputs) *Gatewa // Only create the kgateway parameters client if Envoy is enabled if inputs.CommonCollections.Settings.EnableEnvoy { - gp.kgwParameters = newkgatewayParameters(cli, inputs) + gp.kgwParameters = NewEnvoyGatewayParameters(cli, inputs) } // Only create the agentgateway parameters client if agentgateway is enabled if inputs.CommonCollections.Settings.EnableAgentgateway { - gp.agwHelmValuesGenerator = newAgentgatewayParametersHelmValuesGenerator(cli, inputs) + gp.agwHelmValuesGenerator = NewAgentgatewayParametersHelmValuesGenerator(cli, inputs) } return gp @@ -52,11 +52,12 @@ func NewGatewayParameters(cli apiclient.Client, inputs *deployer.Inputs) *Gatewa type GatewayParameters struct { inputs *deployer.Inputs helmValuesGeneratorOverride deployer.HelmValuesGenerator - kgwParameters *kgatewayParameters - agwHelmValuesGenerator *agentgatewayParametersHelmValuesGenerator + kgwParameters *EnvoyGatewayParameters + agwHelmValuesGenerator *AgentgatewayParametersHelmValuesGenerator } -type kgatewayParameters struct { +// EnvoyGatewayParameters generates helm values for Envoy-based gateways. +type EnvoyGatewayParameters struct { gwParamClient kclient.Client[*kgateway.GatewayParameters] gwClassClient kclient.Client[*gwv1.GatewayClass] inputs *deployer.Inputs @@ -117,37 +118,18 @@ func (gp *GatewayParameters) GetCacheSyncHandlers() []cache.InformerSynced { return handlers } -// PostProcessObjects implements deployer.ObjectPostProcessor. -// It applies AgentgatewayParameters overlays to the rendered objects. -// When both GatewayClass and Gateway have AgentgatewayParameters, the overlays -// are applied in order: GatewayClass first, then Gateway on top. -func (gp *GatewayParameters) PostProcessObjects(ctx context.Context, obj client.Object, rendered []client.Object) error { - gw, ok := obj.(*gwv1.Gateway) - if !ok || gp.agwHelmValuesGenerator == nil { - return nil - } - - resolved, err := gp.agwHelmValuesGenerator.GetResolvedParametersForGateway(gw) - if err != nil { - return nil - } - - // Apply overlays in order: GatewayClass first, then Gateway. - // This allows Gateway-level overlays to override GatewayClass-level overlays. - if resolved.gatewayClassAGWP != nil { - applier := NewAgentgatewayParametersApplier(resolved.gatewayClassAGWP) - if err := applier.ApplyOverlaysToObjects(rendered); err != nil { - return err - } - } - if resolved.gatewayAGWP != nil { - applier := NewAgentgatewayParametersApplier(resolved.gatewayAGWP) - if err := applier.ApplyOverlaysToObjects(rendered); err != nil { - return err - } +// EnvoyHelmValuesGenerator returns the helm values generator for Envoy-based gateways. +// If a helm values generator override is set, it returns that instead. +func (gp *GatewayParameters) EnvoyHelmValuesGenerator() deployer.HelmValuesGenerator { + if gp.helmValuesGeneratorOverride != nil { + return gp.helmValuesGeneratorOverride } + return gp.kgwParameters +} - return nil +// AgentgatewayParametersHelmValuesGenerator returns the helm values generator for agentgateway-based gateways. +func (gp *GatewayParameters) AgentgatewayParametersHelmValuesGenerator() deployer.HelmValuesGenerator { + return gp.agwHelmValuesGenerator } func GatewayReleaseNameAndNamespace(obj client.Object) (string, string) { @@ -211,15 +193,16 @@ func (gp *GatewayParameters) getHelmValuesGenerator(obj client.Object) (deployer return gp.kgwParameters, nil } -func newkgatewayParameters(cli apiclient.Client, inputs *deployer.Inputs) *kgatewayParameters { - return &kgatewayParameters{ +// NewEnvoyGatewayParameters creates a new EnvoyGatewayParameters. +func NewEnvoyGatewayParameters(cli apiclient.Client, inputs *deployer.Inputs) *EnvoyGatewayParameters { + return &EnvoyGatewayParameters{ gwParamClient: kclient.NewFilteredDelayed[*kgateway.GatewayParameters](cli, wellknown.GatewayParametersGVR, kclient.Filter{ObjectFilter: cli.ObjectFilter()}), gwClassClient: kclient.NewFilteredDelayed[*gwv1.GatewayClass](cli, wellknown.GatewayClassGVR, kclient.Filter{ObjectFilter: cli.ObjectFilter()}), inputs: inputs, } } -func (h *kgatewayParameters) GetValues(ctx context.Context, obj client.Object) (map[string]any, error) { +func (h *EnvoyGatewayParameters) GetValues(ctx context.Context, obj client.Object) (map[string]any, error) { gw, ok := obj.(*gwv1.Gateway) if !ok { return nil, fmt.Errorf("expected a Gateway resource, got %s", obj.GetObjectKind().GroupVersionKind().String()) @@ -243,13 +226,13 @@ func (h *kgatewayParameters) GetValues(ctx context.Context, obj client.Object) ( return jsonVals, err } -func (k *kgatewayParameters) GetCacheSyncHandlers() []cache.InformerSynced { +func (k *EnvoyGatewayParameters) GetCacheSyncHandlers() []cache.InformerSynced { return []cache.InformerSynced{k.gwClassClient.HasSynced, k.gwParamClient.HasSynced} } // getGatewayParametersForGateway returns the merged GatewayParameters object resulting from the default GwParams object and // the GwParam object specifically associated with the given Gateway (if one exists). -func (k *kgatewayParameters) getGatewayParametersForGateway(gw *gwv1.Gateway) (*kgateway.GatewayParameters, error) { +func (k *EnvoyGatewayParameters) getGatewayParametersForGateway(gw *gwv1.Gateway) (*kgateway.GatewayParameters, error) { // attempt to get the GatewayParameters name from the Gateway. If we can't find it, // we'll check for the default GWP for the GatewayClass. if gw.Spec.Infrastructure == nil || gw.Spec.Infrastructure.ParametersRef == nil { @@ -315,7 +298,7 @@ func (k *kgatewayParameters) getGatewayParametersForGateway(gw *gwv1.Gateway) (* } // gets the default GatewayParameters associated with the GatewayClass of the provided Gateway -func (k *kgatewayParameters) getDefaultGatewayParameters(gw *gwv1.Gateway) (*kgateway.GatewayParameters, error) { +func (k *EnvoyGatewayParameters) getDefaultGatewayParameters(gw *gwv1.Gateway) (*kgateway.GatewayParameters, error) { gwc, err := getGatewayClassFromGateway(k.gwClassClient, gw) if err != nil { return nil, err @@ -324,7 +307,7 @@ func (k *kgatewayParameters) getDefaultGatewayParameters(gw *gwv1.Gateway) (*kga } // Gets the GatewayParameters object associated with a given GatewayClass. -func (k *kgatewayParameters) getGatewayParametersForGatewayClass(gwc *gwv1.GatewayClass) (*kgateway.GatewayParameters, error) { +func (k *EnvoyGatewayParameters) getGatewayParametersForGatewayClass(gwc *gwv1.GatewayClass) (*kgateway.GatewayParameters, error) { // Our defaults depend on OmitDefaultSecurityContext, but these are the defaults // when not OmitDefaultSecurityContext: defaultGwp, err := deployer.GetInMemoryGatewayParameters(deployer.InMemoryGatewayParametersConfig{ @@ -400,9 +383,8 @@ func (k *kgatewayParameters) getGatewayParametersForGatewayClass(gwc *gwv1.Gatew return mergedGwp, nil } -func (k *kgatewayParameters) getValues(gw *gwv1.Gateway, gwParam *kgateway.GatewayParameters) (*deployer.HelmConfig, error) { +func (k *EnvoyGatewayParameters) getValues(gw *gwv1.Gateway, gwParam *kgateway.GatewayParameters) (*deployer.HelmConfig, error) { irGW := deployer.GetGatewayIR(gw, k.inputs.CommonCollections) - // kgatewayParameters is only used for envoy gateways (agentgateway uses agentgatewayParametersHelmValuesGenerator) ports := deployer.GetPortsValues(irGW, gwParam, false) if len(ports) == 0 { return nil, ErrNoValidPorts @@ -436,7 +418,7 @@ func (k *kgatewayParameters) getValues(gw *gwv1.Gateway, gwParam *kgateway.Gatew // Inject xDS CA certificate into Helm values if TLS is enabled if k.inputs.ControlPlane.XdsTLS { - if err := injectXdsCACertificate(k.inputs.ControlPlane.XdsTlsCaPath, vals); err != nil { + if err := injectXdsCACertificate(k.inputs.ControlPlane.XdsTlsCaPath, vals.Gateway.Xds); err != nil { return nil, fmt.Errorf("failed to inject xDS CA certificate: %w", err) } } @@ -501,8 +483,6 @@ func (k *kgatewayParameters) getValues(gw *gwv1.Gateway, gwParam *kgateway.Gatew gateway.ExtraVolumes = podConfig.GetExtraVolumes() gateway.PriorityClassName = podConfig.GetPriorityClassName() - // kgatewayParameters is only used for envoy gateways (agentgateway uses agentgatewayParametersHelmValuesGenerator) - gateway.DataPlaneType = deployer.DataPlaneEnvoy logLevel := envoyContainerConfig.GetBootstrap().GetLogLevel() gateway.LogLevel = logLevel compLogLevels := envoyContainerConfig.GetBootstrap().GetComponentLogLevels() diff --git a/pkg/kgateway/deployer/tls.go b/pkg/kgateway/deployer/tls.go index 82dc4ab4320..3dace1c66a3 100644 --- a/pkg/kgateway/deployer/tls.go +++ b/pkg/kgateway/deployer/tls.go @@ -9,7 +9,8 @@ import ( // injectXdsCACertificate reads the CA certificate from the control plane's mounted TLS Secret // and injects it into the Helm values so it can be used by the proxy templates. -func injectXdsCACertificate(caCertPath string, vals *deployer.HelmConfig) error { +// It accepts variadic HelmXds pointers to support both Envoy (single Xds) and agentgateway (Xds + AgwXds). +func injectXdsCACertificate(caCertPath string, xdsConfigs ...*deployer.HelmXds) error { if _, err := os.Stat(caCertPath); os.IsNotExist(err) { return fmt.Errorf("xDS TLS is enabled but CA certificate file not found at %s. "+ "Ensure the xDS TLS secret is properly mounted and contains ca.crt", caCertPath, @@ -25,11 +26,10 @@ func injectXdsCACertificate(caCertPath string, vals *deployer.HelmConfig) error } caCertStr := string(caCert) - if vals.Gateway.Xds != nil && vals.Gateway.Xds.Tls != nil { - vals.Gateway.Xds.Tls.CaCert = &caCertStr - } - if vals.Gateway.AgwXds != nil && vals.Gateway.AgwXds.Tls != nil { - vals.Gateway.AgwXds.Tls.CaCert = &caCertStr + for _, xds := range xdsConfigs { + if xds != nil && xds.Tls != nil { + xds.Tls.CaCert = &caCertStr + } } return nil diff --git a/test/deployer/deployer_helm.go b/test/deployer/deployer_helm.go index 36ad159ff18..4b606a5b20e 100644 --- a/test/deployer/deployer_helm.go +++ b/test/deployer/deployer_helm.go @@ -108,6 +108,18 @@ func ExtractCommonObjs(t *testing.T, objs []client.Object) ([]client.Object, *gw return commonObjs, gtw } +// isAgentgatewayClass returns true if the Gateway's GatewayClass uses the agentgateway controller. +func (dt DeployerTester) isAgentgatewayClass(gw *gwv1.Gateway, objs []client.Object) bool { + for _, obj := range objs { + if gwc, ok := obj.(*gwv1.GatewayClass); ok { + if gwc.Name == string(gw.Spec.GatewayClassName) { + return string(gwc.Spec.ControllerName) == dt.AgwControllerName + } + } + } + return false +} + func (dt DeployerTester) GetObjects( t *testing.T, tt HelmTestCase, @@ -158,14 +170,30 @@ func (dt DeployerTester) RunHelmChartTest( if tt.HelmValuesGeneratorOverride != nil { gwParams.WithHelmValuesGeneratorOverride(tt.HelmValuesGeneratorOverride(inputs)) } - deployer, err := internaldeployer.NewGatewayDeployer( - dt.ControllerName, - dt.AgwControllerName, - dt.AgwClassName, - scheme, - fakeClient, - gwParams, - ) + + // Determine which deployer to use based on the GatewayClass + var deployer *pkgdeployer.Deployer + var err error + isAgentgateway := dt.isAgentgatewayClass(gtw, commonObjs) + if isAgentgateway { + deployer, err = internaldeployer.NewAgentgatewayDeployer( + dt.ControllerName, + dt.AgwControllerName, + dt.AgwClassName, + scheme, + fakeClient, + gwParams.AgentgatewayParametersHelmValuesGenerator(), + ) + } else { + deployer, err = internaldeployer.NewEnvoyGatewayDeployer( + dt.ControllerName, + dt.AgwControllerName, + dt.AgwClassName, + scheme, + fakeClient, + gwParams.EnvoyHelmValuesGenerator(), + ) + } assert.NoError(t, err, "error creating gateway deployer") ctx := t.Context() diff --git a/test/e2e/features/oauth/suite.go b/test/e2e/features/oauth/suite.go index 6c95ad650dc..c00203b1bdb 100644 --- a/test/e2e/features/oauth/suite.go +++ b/test/e2e/features/oauth/suite.go @@ -160,7 +160,7 @@ func (s *tsuite) TestOIDC() { resp, err = client.Get(ctx, logoutURL, true) r.NoError(err) r.NotNil(resp) - // TODO: enable this check after determining why somtimes the /logout returns invalid_redirect_uri + // TODO: enable this check after determining why sometimes the /logout returns invalid_redirect_uri // r.Equal(http.StatusOK, resp.StatusCode) }