diff --git a/pkg/webhook/core.oam.dev/v1alpha2/applicationconfiguration/validating_handler.go b/pkg/webhook/core.oam.dev/v1alpha2/applicationconfiguration/validating_handler.go index 679bccf02..e25ece462 100644 --- a/pkg/webhook/core.oam.dev/v1alpha2/applicationconfiguration/validating_handler.go +++ b/pkg/webhook/core.oam.dev/v1alpha2/applicationconfiguration/validating_handler.go @@ -8,10 +8,10 @@ import ( "github.com/oam-dev/kubevela/apis/core.oam.dev/v1alpha2" - "github.com/oam-dev/kubevela/pkg/oam" "github.com/oam-dev/kubevela/pkg/oam/discoverymapper" admissionv1beta1 "k8s.io/api/admission/v1beta1" + "k8s.io/apimachinery/pkg/runtime/schema" utilerrors "k8s.io/apimachinery/pkg/util/errors" "k8s.io/apimachinery/pkg/util/validation/field" "k8s.io/klog" @@ -168,13 +168,20 @@ func ValidateTraitAppliableToWorkloadFn(_ context.Context, v ValidatingAppConfig klog.Info("validate trait is appliable to workload", "name", v.appConfig.Name) var allErrs []error for _, c := range v.validatingComps { - workloadType := c.component.GetLabels()[oam.WorkloadTypeLabel] - workloadDefRefName := c.workloadDefinition.Spec.Reference.Name // TODO(roywang) consider a CRD group could have multiple versions // and maybe we need to specify the minimum version here in the future - workloadGroup := c.workloadDefinition.GetObjectKind().GroupVersionKind().Group + workloadDefRefName := c.workloadDefinition.Spec.Reference.Name + workloadDefName := c.workloadDefinition.GetName() + workloadGroup := schema.ParseGroupResource(workloadDefRefName).Group + + klog.Info("validate trait is appliable to workload: ", + fmt.Sprintf("workloadDefRefName:%s, workloadDefName(type):%s, workloadGroup:%s", + workloadDefRefName, workloadDefName, workloadGroup)) ValidateApplyTo: for _, t := range c.validatingTraits { + klog.Info("validate trait is appliable to workload: ", + fmt.Sprintf("trait %q is allowed to apply to %s", + t.traitDefinition.GetName(), t.traitDefinition.Spec.AppliesToWorkloads)) if len(t.traitDefinition.Spec.AppliesToWorkloads) == 0 { // AppliesToWorkloads is empty, the trait can be applied to ANY workload continue @@ -187,14 +194,14 @@ func ValidateTraitAppliableToWorkloadFn(_ context.Context, v ValidatingAppConfig if strings.HasPrefix(applyTo, "*.") && workloadGroup == applyTo[2:] { continue ValidateApplyTo } - if workloadType == applyTo || - workloadDefRefName == applyTo { + if workloadDefRefName == applyTo || + workloadDefName == applyTo { continue ValidateApplyTo } } allErrs = append(allErrs, fmt.Errorf(errFmtUnappliableTrait, - t.traitDefinition.GetObjectKind().GroupVersionKind().String(), - c.workloadDefinition.GetObjectKind().GroupVersionKind().String(), + t.traitDefinition.GetName(), + c.workloadDefinition.GetName(), c.compName, t.traitDefinition.Spec.AppliesToWorkloads)) } } diff --git a/pkg/webhook/core.oam.dev/v1alpha2/applicationconfiguration/validating_handler_test.go b/pkg/webhook/core.oam.dev/v1alpha2/applicationconfiguration/validating_handler_test.go index 8fb6a5530..36c768175 100644 --- a/pkg/webhook/core.oam.dev/v1alpha2/applicationconfiguration/validating_handler_test.go +++ b/pkg/webhook/core.oam.dev/v1alpha2/applicationconfiguration/validating_handler_test.go @@ -9,8 +9,6 @@ import ( "github.com/oam-dev/kubevela/apis/core.oam.dev/v1alpha2" - "github.com/oam-dev/kubevela/pkg/oam" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" utilerrors "k8s.io/apimachinery/pkg/util/errors" @@ -260,13 +258,13 @@ func TestValidateTraitAppliableToWorkloadFn(t *testing.T) { want: nil, }, { - caseName: "apply trait to workload with specific type", + caseName: "apply trait to workload with specific workloadDefinition name", validatingAppConfig: ValidatingAppConfig{ validatingComps: []ValidatingComponent{ { - component: v1alpha2.Component{ObjectMeta: v1.ObjectMeta{ - Labels: map[string]string{oam.WorkloadTypeLabel: "TestWorkload"}, - }}, + workloadDefinition: v1alpha2.WorkloadDefinition{ + ObjectMeta: v1.ObjectMeta{Name: "TestWorkload"}, + }, validatingTraits: []ValidatingTrait{ {traitDefinition: v1alpha2.TraitDefinition{ Spec: v1alpha2.TraitDefinitionSpec{ @@ -309,9 +307,26 @@ func TestValidateTraitAppliableToWorkloadFn(t *testing.T) { validatingComps: []ValidatingComponent{ { workloadDefinition: v1alpha2.WorkloadDefinition{ - TypeMeta: v1.TypeMeta{ - APIVersion: "example.com/v1", - Kind: "TestWorkload", + Spec: v1alpha2.WorkloadDefinitionSpec{ + Reference: v1alpha2.DefinitionReference{ + Name: "testworkloads.example.com", + }, + }, + }, + validatingTraits: []ValidatingTrait{ + {traitDefinition: v1alpha2.TraitDefinition{ + Spec: v1alpha2.TraitDefinitionSpec{ + AppliesToWorkloads: []string{"*.example.com"}, + }, + }}, + }, + }, + { + workloadDefinition: v1alpha2.WorkloadDefinition{ + Spec: v1alpha2.WorkloadDefinitionSpec{ + Reference: v1alpha2.DefinitionReference{ + Name: "testworkload2s.example.com", + }, }, }, validatingTraits: []ValidatingTrait{ @@ -332,28 +347,19 @@ func TestValidateTraitAppliableToWorkloadFn(t *testing.T) { validatingComps: []ValidatingComponent{ { compName: "example-comp", - component: v1alpha2.Component{ObjectMeta: v1.ObjectMeta{ - Labels: map[string]string{oam.WorkloadTypeLabel: "TestWorkload0"}, - }}, workloadDefinition: v1alpha2.WorkloadDefinition{ - TypeMeta: v1.TypeMeta{ - APIVersion: "unknown.group/v1", - Kind: "TestWorkload1", - }, + ObjectMeta: v1.ObjectMeta{Name: "TestWorkload"}, Spec: v1alpha2.WorkloadDefinitionSpec{ Reference: v1alpha2.DefinitionReference{ - Name: "TestWorkload2", + Name: "TestWorkload1", }, }, }, validatingTraits: []ValidatingTrait{ {traitDefinition: v1alpha2.TraitDefinition{ - TypeMeta: v1.TypeMeta{ - APIVersion: "example.com/v1", - Kind: "TestTrait", - }, + ObjectMeta: v1.ObjectMeta{Name: "TestTrait"}, Spec: v1alpha2.TraitDefinitionSpec{ - AppliesToWorkloads: []string{"example.com", "TestWorkload"}, + AppliesToWorkloads: []string{"example.com", "TestWorkload2"}, }, }}, }, @@ -361,8 +367,8 @@ func TestValidateTraitAppliableToWorkloadFn(t *testing.T) { }, }, want: []error{fmt.Errorf(errFmtUnappliableTrait, - "example.com/v1, Kind=TestTrait", "unknown.group/v1, Kind=TestWorkload1", "example-comp", - []string{"example.com", "TestWorkload"})}, + "TestTrait", "TestWorkload", "example-comp", + []string{"example.com", "TestWorkload2"})}, }, }