2014-11-14 04:20:42 +00:00
/ *
2016-06-03 00:25:58 +00:00
Copyright 2014 The Kubernetes Authors .
2014-11-14 04:20:42 +00:00
Licensed under the Apache License , Version 2.0 ( the "License" ) ;
you may not use this file except in compliance with the License .
You may obtain a copy of the License at
http : //www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing , software
distributed under the License is distributed on an "AS IS" BASIS ,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
See the License for the specific language governing permissions and
limitations under the License .
* /
package validation
import (
2016-08-12 19:38:22 +00:00
"fmt"
2015-08-05 22:03:47 +00:00
"k8s.io/kubernetes/pkg/api"
2016-08-12 19:38:22 +00:00
"k8s.io/kubernetes/pkg/api/meta"
"k8s.io/kubernetes/pkg/api/unversioned"
apiutil "k8s.io/kubernetes/pkg/api/util"
"k8s.io/kubernetes/pkg/apimachinery/registered"
2015-09-10 22:48:28 +00:00
"k8s.io/kubernetes/pkg/util/validation"
2015-11-06 23:30:52 +00:00
"k8s.io/kubernetes/pkg/util/validation/field"
2014-11-14 04:20:42 +00:00
)
// ValidateEvent makes sure that the event makes sense.
2015-11-06 23:30:52 +00:00
func ValidateEvent ( event * api . Event ) field . ErrorList {
allErrs := field . ErrorList { }
2016-08-12 19:38:22 +00:00
// Make sure event.Namespace and the involvedObject.Namespace agree
if len ( event . InvolvedObject . Namespace ) == 0 {
// event.Namespace must also be empty (or "default", for compatibility with old clients)
if event . Namespace != api . NamespaceNone && event . Namespace != api . NamespaceDefault {
allErrs = append ( allErrs , field . Invalid ( field . NewPath ( "involvedObject" , "namespace" ) , event . InvolvedObject . Namespace , "does not match event.namespace" ) )
}
} else {
// event namespace must match
if event . Namespace != event . InvolvedObject . Namespace {
allErrs = append ( allErrs , field . Invalid ( field . NewPath ( "involvedObject" , "namespace" ) , event . InvolvedObject . Namespace , "does not match event.namespace" ) )
}
2015-11-26 07:54:42 +00:00
}
2016-08-12 19:38:22 +00:00
// For kinds we recognize, make sure involvedObject.Namespace is set for namespaced kinds
if namespaced , err := isNamespacedKind ( event . InvolvedObject . Kind , event . InvolvedObject . APIVersion ) ; err == nil {
if namespaced && len ( event . InvolvedObject . Namespace ) == 0 {
allErrs = append ( allErrs , field . Required ( field . NewPath ( "involvedObject" , "namespace" ) , fmt . Sprintf ( "required for kind %s" , event . InvolvedObject . Kind ) ) )
}
if ! namespaced && len ( event . InvolvedObject . Namespace ) > 0 {
allErrs = append ( allErrs , field . Invalid ( field . NewPath ( "involvedObject" , "namespace" ) , event . InvolvedObject . Namespace , fmt . Sprintf ( "not allowed for kind %s" , event . InvolvedObject . Kind ) ) )
}
2014-11-14 04:20:42 +00:00
}
2016-08-12 19:38:22 +00:00
2015-12-17 05:58:09 +00:00
for _ , msg := range validation . IsDNS1123Subdomain ( event . Namespace ) {
allErrs = append ( allErrs , field . Invalid ( field . NewPath ( "namespace" ) , event . Namespace , msg ) )
2014-11-14 04:20:42 +00:00
}
return allErrs
}
2016-08-12 19:38:22 +00:00
// Check whether the kind in groupVersion is scoped at the root of the api hierarchy
func isNamespacedKind ( kind , groupVersion string ) ( bool , error ) {
group := apiutil . GetGroup ( groupVersion )
g , err := registered . Group ( group )
if err != nil {
return false , err
}
restMapping , err := g . RESTMapper . RESTMapping ( unversioned . GroupKind { Group : group , Kind : kind } , apiutil . GetVersion ( groupVersion ) )
if err != nil {
return false , err
}
scopeName := restMapping . Scope . Name ( )
if scopeName == meta . RESTScopeNameNamespace {
return true , nil
}
return false , nil
}