Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(kuma-cp): allow using Dataplane kind in top level targetRef in all policies #12659

Merged
merged 14 commits into from
Jan 31, 2025
Merged
Show file tree
Hide file tree
Changes from 5 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
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,7 @@ var DoNothingResourceResourceTypeDescriptor = model.ResourceTypeDescriptor{
IsTargetRefBased: false,
HasToTargetRef: false,
HasFromTargetRef: false,
HasRulesTargetRef: false,
HasStatus: false,
AllowedOnSystemNamespaceOnly: false,
IsReferenceableInTo: false,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,7 @@ var HostnameGeneratorResourceTypeDescriptor = model.ResourceTypeDescriptor{
IsTargetRefBased: false,
HasToTargetRef: false,
HasFromTargetRef: false,
HasRulesTargetRef: false,
HasStatus: false,
AllowedOnSystemNamespaceOnly: true,
IsReferenceableInTo: false,
Expand Down
6 changes: 4 additions & 2 deletions pkg/core/resources/apis/mesh/validators.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import (
"sort"
"strings"

core_model "github.com/kumahq/kuma/pkg/core/resources/model"

"google.golang.org/protobuf/proto"
"google.golang.org/protobuf/types/known/durationpb"
"sigs.k8s.io/yaml"
Expand Down Expand Up @@ -64,7 +66,7 @@ type ValidateTargetRefOpts struct {
// includes a forward slash, but it's allowed as an exception to
// handle unresolved references.
AllowedInvalidNames []string
IsInboundPolicy bool
Descriptor core_model.ResourceTypeDescriptor
}

func ValidateSelectors(path validators.PathBuilder, sources []*mesh_proto.Selector, opts ValidateSelectorsOpts) validators.ValidationError {
Expand Down Expand Up @@ -384,7 +386,7 @@ func ValidateTargetRef(
if len(ref.Labels) > 0 && (ref.Name != "" || ref.Namespace != "") {
err.AddViolation("labels", "either labels or name and namespace must be specified")
}
if !opts.IsInboundPolicy && ref.SectionName != "" {
if !opts.Descriptor.HasFromTargetRef && !opts.Descriptor.HasRulesTargetRef && ref.SectionName != "" {
err.AddViolation("sectionName", "can only be used with inbound policies")
}
case common_api.MeshSubset:
Expand Down
5 changes: 4 additions & 1 deletion pkg/core/resources/apis/mesh/validators_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (

common_api "github.com/kumahq/kuma/api/common/v1alpha1"
. "github.com/kumahq/kuma/pkg/core/resources/apis/mesh"
"github.com/kumahq/kuma/pkg/core/resources/model"
"github.com/kumahq/kuma/pkg/core/validators"
)

Expand Down Expand Up @@ -207,7 +208,9 @@ sectionName: http-port
SupportedKinds: []common_api.TargetRefKind{
common_api.Dataplane,
},
IsInboundPolicy: true,
Descriptor: model.ResourceTypeDescriptor{
HasRulesTargetRef: true,
},
},
}),
Entry("MeshGateway", testCase{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,7 @@ var MeshExternalServiceResourceTypeDescriptor = model.ResourceTypeDescriptor{
IsTargetRefBased: false,
HasToTargetRef: false,
HasFromTargetRef: false,
HasRulesTargetRef: false,
HasStatus: true,
AllowedOnSystemNamespaceOnly: true,
IsReferenceableInTo: true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,7 @@ var MeshMultiZoneServiceResourceTypeDescriptor = model.ResourceTypeDescriptor{
IsTargetRefBased: false,
HasToTargetRef: false,
HasFromTargetRef: false,
HasRulesTargetRef: false,
HasStatus: true,
AllowedOnSystemNamespaceOnly: false,
IsReferenceableInTo: true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,7 @@ var MeshServiceResourceTypeDescriptor = model.ResourceTypeDescriptor{
IsTargetRefBased: false,
HasToTargetRef: false,
HasFromTargetRef: false,
HasRulesTargetRef: false,
HasStatus: true,
AllowedOnSystemNamespaceOnly: false,
IsReferenceableInTo: true,
Expand Down
4 changes: 3 additions & 1 deletion pkg/core/resources/model/resource.go
Original file line number Diff line number Diff line change
Expand Up @@ -186,8 +186,10 @@ type ResourceTypeDescriptor struct {
IsTargetRefBased bool
// HasToTargetRef indicates that the policy can be applied to outbound traffic
HasToTargetRef bool
// HasFromTargetRef indicates that the policy can be applied to outbound traffic
// HasFromTargetRef indicates that the policy can be applied to inbound traffic
HasFromTargetRef bool
// HasRulesTargetRef indicates that the policy can be applied to inbound traffic
HasRulesTargetRef bool
// HasStatus indicates that the policy has a status field
HasStatus bool
// IsProxy indicates if this resource is a proxy
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,7 @@ var DoNothingPolicyResourceTypeDescriptor = model.ResourceTypeDescriptor{
IsTargetRefBased: true,
HasToTargetRef: true,
HasFromTargetRef: true,
HasRulesTargetRef: false,
HasStatus: false,
AllowedOnSystemNamespaceOnly: false,
IsReferenceableInTo: false,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,14 @@ import (

common_api "github.com/kumahq/kuma/api/common/v1alpha1"
"github.com/kumahq/kuma/pkg/core/resources/apis/mesh"
core_model "github.com/kumahq/kuma/pkg/core/resources/model"
"github.com/kumahq/kuma/pkg/core/validators"
)

func (r *MeshAccessLogResource) validate() error {
var verr validators.ValidationError
path := validators.RootedAt("spec")
verr.AddErrorAt(path.Field("targetRef"), validateTop(r.Spec.GetTargetRef()))
verr.AddErrorAt(path.Field("targetRef"), validateTop(r.Spec.GetTargetRef(), r.Descriptor()))
if len(r.Spec.To) == 0 && len(r.Spec.From) == 0 {
verr.AddViolationAt(path, "at least one of 'from', 'to' has to be defined")
}
Expand All @@ -22,16 +23,18 @@ func (r *MeshAccessLogResource) validate() error {
return verr.OrNil()
}

func validateTop(targetRef common_api.TargetRef) validators.ValidationError {
func validateTop(targetRef common_api.TargetRef, descriptor core_model.ResourceTypeDescriptor) validators.ValidationError {
targetRefErr := mesh.ValidateTargetRef(targetRef, &mesh.ValidateTargetRefOpts{
SupportedKinds: []common_api.TargetRefKind{
common_api.Mesh,
common_api.MeshSubset,
common_api.MeshGateway,
common_api.MeshService,
common_api.MeshServiceSubset,
common_api.Dataplane,
},
GatewayListenerTagsAllowed: true,
Descriptor: descriptor,
})
return targetRefErr
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,7 @@ var MeshAccessLogResourceTypeDescriptor = model.ResourceTypeDescriptor{
IsTargetRefBased: true,
HasToTargetRef: true,
HasFromTargetRef: true,
HasRulesTargetRef: false,
HasStatus: false,
AllowedOnSystemNamespaceOnly: false,
IsReferenceableInTo: false,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,15 @@ import (

common_api "github.com/kumahq/kuma/api/common/v1alpha1"
"github.com/kumahq/kuma/pkg/core/resources/apis/mesh"
core_model "github.com/kumahq/kuma/pkg/core/resources/model"
"github.com/kumahq/kuma/pkg/core/validators"
"github.com/kumahq/kuma/pkg/util/pointer"
)

func (r *MeshCircuitBreakerResource) validate() error {
var verr validators.ValidationError
path := validators.RootedAt("spec")
verr.AddErrorAt(path.Field("targetRef"), validateTop(r.Spec.TargetRef))
verr.AddErrorAt(path.Field("targetRef"), validateTop(r.Spec.TargetRef, r.Descriptor()))
if len(r.Spec.To) == 0 && len(r.Spec.From) == 0 {
verr.AddViolationAt(path, "at least one of 'from', 'to' has to be defined")
}
Expand All @@ -21,7 +22,7 @@ func (r *MeshCircuitBreakerResource) validate() error {
return verr.OrNil()
}

func validateTop(targetRef *common_api.TargetRef) validators.ValidationError {
func validateTop(targetRef *common_api.TargetRef, descriptor core_model.ResourceTypeDescriptor) validators.ValidationError {
if targetRef == nil {
return validators.ValidationError{}
}
Expand All @@ -32,8 +33,10 @@ func validateTop(targetRef *common_api.TargetRef) validators.ValidationError {
common_api.MeshService,
common_api.MeshGateway,
common_api.MeshServiceSubset,
common_api.Dataplane,
},
GatewayListenerTagsAllowed: true,
Descriptor: descriptor,
})
return targetRefErr
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,7 @@ var MeshCircuitBreakerResourceTypeDescriptor = model.ResourceTypeDescriptor{
IsTargetRefBased: true,
HasToTargetRef: true,
HasFromTargetRef: true,
HasRulesTargetRef: false,
HasStatus: false,
AllowedOnSystemNamespaceOnly: false,
IsReferenceableInTo: false,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,14 @@ import (
func (r *MeshFaultInjectionResource) validate() error {
var verr validators.ValidationError
path := validators.RootedAt("spec")
verr.AddErrorAt(path.Field("targetRef"), r.validateTop(r.Spec.TargetRef))
verr.AddErrorAt(path.Field("targetRef"), r.validateTop(r.Spec.TargetRef, r.Descriptor()))
topLevel := pointer.DerefOr(r.Spec.TargetRef, common_api.TargetRef{Kind: common_api.Mesh})
verr.AddErrorAt(path, validateFrom(topLevel, r.Spec.From))
verr.AddErrorAt(path, validateTo(topLevel, r.Spec.To))
return verr.OrNil()
}

func (r *MeshFaultInjectionResource) validateTop(targetRef *common_api.TargetRef) validators.ValidationError {
func (r *MeshFaultInjectionResource) validateTop(targetRef *common_api.TargetRef, descriptor core_model.ResourceTypeDescriptor) validators.ValidationError {
Automaat marked this conversation as resolved.
Show resolved Hide resolved
if targetRef == nil {
return validators.ValidationError{}
}
Expand All @@ -32,8 +32,10 @@ func (r *MeshFaultInjectionResource) validateTop(targetRef *common_api.TargetRef
common_api.MeshGateway,
common_api.MeshService,
common_api.MeshServiceSubset,
common_api.Dataplane,
},
GatewayListenerTagsAllowed: true,
Descriptor: descriptor,
})
default:
return mesh.ValidateTargetRef(*targetRef, &mesh.ValidateTargetRefOpts{
Expand All @@ -42,7 +44,9 @@ func (r *MeshFaultInjectionResource) validateTop(targetRef *common_api.TargetRef
common_api.MeshSubset,
common_api.MeshService,
common_api.MeshServiceSubset,
common_api.Dataplane,
},
Descriptor: descriptor,
})
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,7 @@ var MeshFaultInjectionResourceTypeDescriptor = model.ResourceTypeDescriptor{
IsTargetRefBased: true,
HasToTargetRef: true,
HasFromTargetRef: true,
HasRulesTargetRef: false,
HasStatus: false,
AllowedOnSystemNamespaceOnly: false,
IsReferenceableInTo: false,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,20 @@ package v1alpha1
import (
common_api "github.com/kumahq/kuma/api/common/v1alpha1"
"github.com/kumahq/kuma/pkg/core/resources/apis/mesh"
core_model "github.com/kumahq/kuma/pkg/core/resources/model"
"github.com/kumahq/kuma/pkg/core/validators"
"github.com/kumahq/kuma/pkg/util/pointer"
)

func (r *MeshHealthCheckResource) validate() error {
var verr validators.ValidationError
path := validators.RootedAt("spec")
verr.AddErrorAt(path.Field("targetRef"), validateTop(r.Spec.TargetRef))
verr.AddErrorAt(path.Field("targetRef"), validateTop(r.Spec.TargetRef, r.Descriptor()))
verr.AddErrorAt(path, validateTo(pointer.DerefOr(r.Spec.TargetRef, common_api.TargetRef{Kind: common_api.Mesh}), r.Spec.To))
return verr.OrNil()
}

func validateTop(targetRef *common_api.TargetRef) validators.ValidationError {
func validateTop(targetRef *common_api.TargetRef, descriptor core_model.ResourceTypeDescriptor) validators.ValidationError {
Automaat marked this conversation as resolved.
Show resolved Hide resolved
if targetRef == nil {
return validators.ValidationError{}
}
Expand All @@ -26,8 +27,10 @@ func validateTop(targetRef *common_api.TargetRef) validators.ValidationError {
common_api.MeshGateway,
common_api.MeshService,
common_api.MeshServiceSubset,
common_api.Dataplane,
},
GatewayListenerTagsAllowed: true,
Descriptor: descriptor,
})
return targetRefErr
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,7 @@ var MeshHealthCheckResourceTypeDescriptor = model.ResourceTypeDescriptor{
IsTargetRefBased: true,
HasToTargetRef: true,
HasFromTargetRef: false,
HasRulesTargetRef: false,
HasStatus: false,
AllowedOnSystemNamespaceOnly: false,
IsReferenceableInTo: false,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,12 @@ import (
func (r *MeshHTTPRouteResource) validate() error {
var verr validators.ValidationError
path := validators.RootedAt("spec")
verr.AddErrorAt(path.Field("targetRef"), r.validateTop(r.Spec.TargetRef))
verr.AddErrorAt(path.Field("targetRef"), r.validateTop(r.Spec.TargetRef, r.Descriptor()))
verr.AddErrorAt(path.Field("to"), validateTos(pointer.DerefOr(r.Spec.TargetRef, common_api.TargetRef{Kind: common_api.Mesh}), r.Spec.To))
return verr.OrNil()
}

func (r *MeshHTTPRouteResource) validateTop(targetRef *common_api.TargetRef) validators.ValidationError {
func (r *MeshHTTPRouteResource) validateTop(targetRef *common_api.TargetRef, descriptor core_model.ResourceTypeDescriptor) validators.ValidationError {
if targetRef == nil {
return validators.ValidationError{}
}
Expand All @@ -38,8 +38,10 @@ func (r *MeshHTTPRouteResource) validateTop(targetRef *common_api.TargetRef) val
common_api.MeshSubset,
common_api.MeshService,
common_api.MeshServiceSubset,
common_api.Dataplane,
},
GatewayListenerTagsAllowed: true,
Descriptor: descriptor,
})
default:
return mesh.ValidateTargetRef(*targetRef, &mesh.ValidateTargetRefOpts{
Expand All @@ -48,7 +50,9 @@ func (r *MeshHTTPRouteResource) validateTop(targetRef *common_api.TargetRef) val
common_api.MeshSubset,
common_api.MeshService,
common_api.MeshServiceSubset,
common_api.Dataplane,
},
Descriptor: descriptor,
})
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,7 @@ var MeshHTTPRouteResourceTypeDescriptor = model.ResourceTypeDescriptor{
IsTargetRefBased: true,
HasToTargetRef: true,
HasFromTargetRef: false,
HasRulesTargetRef: false,
HasStatus: false,
AllowedOnSystemNamespaceOnly: false,
IsReferenceableInTo: false,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,15 @@ import (

common_api "github.com/kumahq/kuma/api/common/v1alpha1"
"github.com/kumahq/kuma/pkg/core/resources/apis/mesh"
core_model "github.com/kumahq/kuma/pkg/core/resources/model"
"github.com/kumahq/kuma/pkg/core/validators"
"github.com/kumahq/kuma/pkg/util/pointer"
)

func (r *MeshLoadBalancingStrategyResource) validate() error {
var verr validators.ValidationError
path := validators.RootedAt("spec")
verr.AddErrorAt(path.Field("targetRef"), validateTop(r.Spec.TargetRef))
verr.AddErrorAt(path.Field("targetRef"), validateTop(r.Spec.TargetRef, r.Descriptor()))
if len(r.Spec.To) == 0 {
verr.AddViolationAt(path.Field("to"), "needs at least one item")
}
Expand All @@ -22,7 +23,7 @@ func (r *MeshLoadBalancingStrategyResource) validate() error {
return verr.OrNil()
}

func validateTop(targetRef *common_api.TargetRef) validators.ValidationError {
func validateTop(targetRef *common_api.TargetRef, descriptor core_model.ResourceTypeDescriptor) validators.ValidationError {
if targetRef == nil {
return validators.ValidationError{}
}
Expand All @@ -33,8 +34,10 @@ func validateTop(targetRef *common_api.TargetRef) validators.ValidationError {
common_api.MeshGateway,
common_api.MeshService,
common_api.MeshServiceSubset,
common_api.Dataplane,
},
GatewayListenerTagsAllowed: true,
Descriptor: descriptor,
})
return targetRefErr
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,7 @@ var MeshLoadBalancingStrategyResourceTypeDescriptor = model.ResourceTypeDescript
IsTargetRefBased: true,
HasToTargetRef: true,
HasFromTargetRef: false,
HasRulesTargetRef: false,
HasStatus: false,
AllowedOnSystemNamespaceOnly: false,
IsReferenceableInTo: false,
Expand Down
Loading
Loading