package validation import ( "reflect" "strings" "testing" kapi "k8s.io/kubernetes/pkg/api" "github.com/openshift/origin/pkg/api" authorizationapi "github.com/openshift/origin/pkg/authorization/api" buildapi "github.com/openshift/origin/pkg/build/api" deployapi "github.com/openshift/origin/pkg/deploy/api" imageapi "github.com/openshift/origin/pkg/image/api" quotaapi "github.com/openshift/origin/pkg/quota/api" ) // KnownValidationExceptions is the list of API types that do NOT have corresponding validation // If you add something to this list, explain why it doesn't need validation. waaaa is not a valid // reason. var KnownValidationExceptions = []reflect.Type{ reflect.TypeOf(&buildapi.BuildLog{}), // masks calls to a build subresource reflect.TypeOf(&deployapi.DeploymentLog{}), // masks calls to a deploymentConfig subresource reflect.TypeOf(&imageapi.ImageStreamImage{}), // this object is only returned, never accepted reflect.TypeOf(&imageapi.ImageStreamTag{}), // this object is only returned, never accepted reflect.TypeOf(&authorizationapi.IsPersonalSubjectAccessReview{}), // only an api type for runtime.EmbeddedObject, never accepted reflect.TypeOf(&authorizationapi.SubjectAccessReviewResponse{}), // this object is only returned, never accepted reflect.TypeOf(&authorizationapi.ResourceAccessReviewResponse{}), // this object is only returned, never accepted reflect.TypeOf("aapi.AppliedClusterResourceQuota{}), // this object is only returned, never accepted } // MissingValidationExceptions is the list of types that were missing validation methods when I started // You should never add to this list var MissingValidationExceptions = []reflect.Type{ reflect.TypeOf(&buildapi.BuildLogOptions{}), // TODO, looks like this one should have validation reflect.TypeOf(&buildapi.BinaryBuildRequestOptions{}), // TODO, looks like this one should have validation reflect.TypeOf(&imageapi.DockerImage{}), // TODO, I think this type is ok to skip validation (internal), but needs review } func TestCoverage(t *testing.T) { for kind, apiType := range kapi.Scheme.KnownTypes(api.SchemeGroupVersion) { if strings.HasPrefix(apiType.PkgPath(), "github.com/openshift/origin/vendor/") { continue } if strings.HasSuffix(kind, "List") { continue } ptrType := reflect.PtrTo(apiType) if _, exists := Validator.typeToValidator[ptrType]; !exists { allowed := false for _, exception := range KnownValidationExceptions { if ptrType == exception { allowed = true break } } for _, exception := range MissingValidationExceptions { if ptrType == exception { allowed = true } } if !allowed { t.Errorf("%v is not registered. Look in pkg/api/validation/register.go.", apiType) } } } }