Skip to content

Commit 1899555

Browse files
committed
UPSTREAM: <carry>: Add validation plugin for CRD-based route parity.
1 parent fad59a8 commit 1899555

File tree

5 files changed

+488
-0
lines changed

5 files changed

+488
-0
lines changed

openshift-kube-apiserver/admission/customresourcevalidation/attributes.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
configv1 "github.com/openshift/api/config/v1"
1111
operatorv1 "github.com/openshift/api/operator/v1"
1212
quotav1 "github.com/openshift/api/quota/v1"
13+
routev1 "github.com/openshift/api/route/v1"
1314
securityv1 "github.com/openshift/api/security/v1"
1415
)
1516

@@ -54,4 +55,5 @@ func init() {
5455
utilruntime.Must(securityv1.Install(supportedObjectsScheme))
5556
utilruntime.Must(authorizationv1.Install(supportedObjectsScheme))
5657
utilruntime.Must(apiv1.Install(supportedObjectsScheme))
58+
utilruntime.Must(routev1.Install(supportedObjectsScheme))
5759
}

openshift-kube-apiserver/admission/customresourcevalidation/customresourcevalidationregistration/cr_validation_registration.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"k8s.io/kubernetes/openshift-kube-apiserver/admission/customresourcevalidation/oauth"
1919
"k8s.io/kubernetes/openshift-kube-apiserver/admission/customresourcevalidation/project"
2020
"k8s.io/kubernetes/openshift-kube-apiserver/admission/customresourcevalidation/rolebindingrestriction"
21+
"k8s.io/kubernetes/openshift-kube-apiserver/admission/customresourcevalidation/route"
2122
"k8s.io/kubernetes/openshift-kube-apiserver/admission/customresourcevalidation/scheduler"
2223
"k8s.io/kubernetes/openshift-kube-apiserver/admission/customresourcevalidation/securitycontextconstraints"
2324
)
@@ -40,6 +41,7 @@ var AllCustomResourceValidators = []string{
4041
network.PluginName,
4142
apirequestcount.PluginName,
4243
node.PluginName,
44+
route.PluginName,
4345

4446
// the kubecontrollermanager operator resource has to exist in order to run deployments to deploy admission webhooks.
4547
kubecontrollermanager.PluginName,
@@ -77,4 +79,9 @@ func RegisterCustomResourceValidation(plugins *admission.Plugins) {
7779

7880
// this one is special because we don't work without it.
7981
securitycontextconstraints.RegisterDefaulting(plugins)
82+
83+
// Requests to route.openshift.io/v1 should only go through kube-apiserver admission if
84+
// served via CRD. Most OpenShift flavors (including vanilla) will continue to do validation
85+
// and defaulting inside openshift-apiserver.
86+
route.Register(plugins)
8087
}
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package route
2+
3+
import (
4+
"fmt"
5+
"io"
6+
7+
"k8s.io/apimachinery/pkg/runtime"
8+
"k8s.io/apimachinery/pkg/runtime/schema"
9+
"k8s.io/apimachinery/pkg/util/validation/field"
10+
"k8s.io/apiserver/pkg/admission"
11+
12+
routev1 "github.com/openshift/api/route/v1"
13+
routevalidation "github.com/openshift/library-go/pkg/route/validation"
14+
"k8s.io/kubernetes/openshift-kube-apiserver/admission/customresourcevalidation"
15+
)
16+
17+
const PluginName = "route.openshift.io/ValidateRoute"
18+
19+
func Register(plugins *admission.Plugins) {
20+
plugins.Register(PluginName, func(config io.Reader) (admission.Interface, error) {
21+
return customresourcevalidation.NewValidator(
22+
map[schema.GroupResource]bool{
23+
{Group: routev1.GroupName, Resource: "routes"}: true,
24+
},
25+
map[schema.GroupVersionKind]customresourcevalidation.ObjectValidator{
26+
routev1.GroupVersion.WithKind("Route"): routeV1{},
27+
})
28+
})
29+
}
30+
31+
func toRoute(uncastObj runtime.Object) (*routev1.Route, field.ErrorList) {
32+
if uncastObj == nil {
33+
return nil, nil
34+
}
35+
36+
obj, ok := uncastObj.(*routev1.Route)
37+
if !ok {
38+
return nil, field.ErrorList{
39+
field.NotSupported(field.NewPath("kind"), fmt.Sprintf("%T", uncastObj), []string{"Route"}),
40+
field.NotSupported(field.NewPath("apiVersion"), fmt.Sprintf("%T", uncastObj), []string{routev1.GroupVersion.String()}),
41+
}
42+
}
43+
44+
return obj, nil
45+
}
46+
47+
type routeV1 struct {
48+
}
49+
50+
func (routeV1) ValidateCreate(obj runtime.Object) field.ErrorList {
51+
routeObj, errs := toRoute(obj)
52+
if len(errs) > 0 {
53+
return errs
54+
}
55+
56+
return routevalidation.ValidateRoute(routeObj)
57+
}
58+
59+
func (routeV1) ValidateUpdate(obj runtime.Object, oldObj runtime.Object) field.ErrorList {
60+
routeObj, errs := toRoute(obj)
61+
if len(errs) > 0 {
62+
return errs
63+
}
64+
65+
routeOldObj, errs := toRoute(oldObj)
66+
if len(errs) > 0 {
67+
return errs
68+
}
69+
70+
return routevalidation.ValidateRouteUpdate(routeObj, routeOldObj)
71+
}
72+
73+
func (c routeV1) ValidateStatusUpdate(obj runtime.Object, oldObj runtime.Object) field.ErrorList {
74+
routeObj, errs := toRoute(obj)
75+
if len(errs) > 0 {
76+
return errs
77+
}
78+
79+
routeOldObj, errs := toRoute(oldObj)
80+
if len(errs) > 0 {
81+
return errs
82+
}
83+
84+
return routevalidation.ValidateRouteStatusUpdate(routeObj, routeOldObj)
85+
}

0 commit comments

Comments
 (0)