diff --git a/pkg/validate/validate.go b/pkg/validate/validate.go index ec1be1f6..7095451b 100644 --- a/pkg/validate/validate.go +++ b/pkg/validate/validate.go @@ -29,6 +29,7 @@ import ( runtimeschema "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/util/validation/field" celconfig "k8s.io/apiserver/pkg/apis/cel" + kubescheme "k8s.io/client-go/kubernetes/scheme" "github.com/crossplane/crossplane-runtime/v2/pkg/errors" "github.com/crossplane/crossplane-runtime/v2/pkg/xcrd" @@ -86,6 +87,10 @@ func validateResource( sv, ok := schemaValidators[gvk] if !ok { + if kubescheme.Scheme.Recognizes(gvk) { + rvr.Status = ValidationStatusValid + return rvr + } rvr.Status = ValidationStatusMissingSchema return rvr } diff --git a/pkg/validate/validate_test.go b/pkg/validate/validate_test.go index 6b604ac5..0b32998f 100644 --- a/pkg/validate/validate_test.go +++ b/pkg/validate/validate_test.go @@ -167,6 +167,16 @@ func TestSchemaValidate(t *testing.T) { "kind": "Unknown", "metadata": map[string]any{"name": "no-crd"}, }} + kubernetesCoreResource := &unstructured.Unstructured{Object: map[string]any{ + "apiVersion": "v1", + "kind": "Secret", + "metadata": map[string]any{"name": "connection-details"}, + }} + kubernetesGroupedResource := &unstructured.Unstructured{Object: map[string]any{ + "apiVersion": "apps/v1", + "kind": "Deployment", + "metadata": map[string]any{"name": "workload"}, + }} unknownFieldResource := &unstructured.Unstructured{Object: map[string]any{ "apiVersion": "test.org/v1alpha1", "kind": "Test", @@ -260,6 +270,19 @@ func TestSchemaValidate(t *testing.T) { perRes: []expect{{status: ValidationStatusMissingSchema}}, }, }, + "KubernetesBuiltIn": { + reason: "Built-in Kubernetes resources should not require CRD schemas.", + args: args{ + resources: []*unstructured.Unstructured{kubernetesCoreResource, kubernetesGroupedResource}, + }, + want: want{ + summary: ValidationSummary{Total: 2, Valid: 2}, + perRes: []expect{ + {status: ValidationStatusValid}, + {status: ValidationStatusValid}, + }, + }, + }, "UnknownField": { reason: "A resource with a field not declared in the schema should surface an unknownField error on the offending field path.", args: args{