diff --git a/pkg/plugins/policies/meshcircuitbreaker/plugin/v1alpha1/plugin.go b/pkg/plugins/policies/meshcircuitbreaker/plugin/v1alpha1/plugin.go index a02ecf5675d1..8347c3ed3064 100644 --- a/pkg/plugins/policies/meshcircuitbreaker/plugin/v1alpha1/plugin.go +++ b/pkg/plugins/policies/meshcircuitbreaker/plugin/v1alpha1/plugin.go @@ -8,6 +8,7 @@ import ( core_plugins "github.com/kumahq/kuma/pkg/core/plugins" core_mesh "github.com/kumahq/kuma/pkg/core/resources/apis/mesh" meshexternalservice_api "github.com/kumahq/kuma/pkg/core/resources/apis/meshexternalservice/api/v1alpha1" + core_model "github.com/kumahq/kuma/pkg/core/resources/model" core_xds "github.com/kumahq/kuma/pkg/core/xds" xds_types "github.com/kumahq/kuma/pkg/core/xds/types" "github.com/kumahq/kuma/pkg/plugins/policies/core/matchers" @@ -63,11 +64,11 @@ func (p plugin) Apply( return err } - if err := applyToGateways(policies.GatewayRules, clusters.Gateway, proxy); err != nil { + if err := applyToGateways(ctx.Mesh, proxy, rs, policies.GatewayRules, clusters.Gateway); err != nil { return err } - if err := applyToRealResources(rs, policies.ToRules.ResourceRules, ctx.Mesh); err != nil { + if err := applyToRealResources(ctx.Mesh, rs, policies.ToRules.ResourceRules); err != nil { return err } @@ -127,10 +128,14 @@ func applyToOutbounds( } func applyToGateways( + meshCtx xds_context.MeshContext, + proxy *core_xds.Proxy, + rs *core_xds.ResourceSet, gatewayRules core_rules.GatewayRules, gatewayClusters map[string]*envoy_cluster.Cluster, - proxy *core_xds.Proxy, ) error { + resourcesByOrigin := rs.IndexByOrigin(core_xds.NonMeshExternalService) + for _, listenerInfo := range gateway.ExtractGatewayListeners(proxy) { rules, ok := gatewayRules.ToRules.ByListener[core_rules.InboundListener{ Address: proxy.Dataplane.Spec.GetNetworking().Address, @@ -161,6 +166,21 @@ func applyToGateways( ); err != nil { return err } + + if dest.BackendRef == nil { + continue + } + if realRef := dest.BackendRef.ResourceOrNil(); realRef != nil { + resources := resourcesByOrigin[*realRef] + if err := applyToRealResource( + meshCtx, + rules.ResourceRules, + *realRef, + resources, + ); err != nil { + return err + } + } } } } @@ -216,26 +236,42 @@ func applyToEgressRealResources(rs *core_xds.ResourceSet, proxy *core_xds.Proxy) return nil } -func applyToRealResources(rs *core_xds.ResourceSet, rules core_rules.ResourceRules, meshCtx xds_context.MeshContext) error { - for uri, resType := range rs.IndexByOrigin(core_xds.NonMeshExternalService) { - conf := rules.Compute(uri, meshCtx.Resources) - if conf == nil { - continue - } +func applyToRealResource( + meshCtx xds_context.MeshContext, + rules core_rules.ResourceRules, + uri core_model.TypedResourceIdentifier, + resourcesByType core_xds.ResourcesByType, +) error { + conf := rules.Compute(uri, meshCtx.Resources) + if conf == nil { + return nil + } - for typ, resources := range resType { - switch typ { - case envoy_resource.ClusterType: - err := configureClusters(resources, conf.Conf[0].(api.Conf)) - if err != nil { - return err - } + for typ, resources := range resourcesByType { + switch typ { + case envoy_resource.ClusterType: + err := configureClusters(resources, conf.Conf[0].(api.Conf)) + if err != nil { + return err } } } return nil } +func applyToRealResources( + meshCtx xds_context.MeshContext, + rs *core_xds.ResourceSet, + rules core_rules.ResourceRules, +) error { + for uri, resType := range rs.IndexByOrigin(core_xds.NonMeshExternalService) { + if err := applyToRealResource(meshCtx, rules, uri, resType); err != nil { + return err + } + } + return nil +} + func configureClusters(resources []*core_xds.Resource, conf api.Conf) error { for _, resource := range resources { configurer := plugin_xds.Configurer{