Skip to content

Commit de506ce

Browse files
committed
Promote ValidatingAdmissionPolicy to GA.
1 parent 1e4124b commit de506ce

File tree

52 files changed

+1568
-766
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+1568
-766
lines changed

cmd/kube-apiserver/app/server.go

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,7 @@ func CreateKubeAPIServerConfig(opts options.CompletedOptions) (
299299
CloudConfigFile: opts.CloudProvider.CloudConfigFile,
300300
}
301301
serviceResolver := buildServiceResolver(opts.EnableAggregatorRouting, genericConfig.LoopbackClientConfig.Host, versionedInformers)
302-
pluginInitializers, admissionPostStartHook, err := admissionConfig.New(proxyTransport, genericConfig.EgressSelector, serviceResolver, genericConfig.TracerProvider)
302+
pluginInitializers, err := admissionConfig.New(proxyTransport, genericConfig.EgressSelector, serviceResolver, genericConfig.TracerProvider)
303303
if err != nil {
304304
return nil, nil, nil, fmt.Errorf("failed to create admission plugin initializer: %v", err)
305305
}
@@ -321,9 +321,6 @@ func CreateKubeAPIServerConfig(opts options.CompletedOptions) (
321321
if err != nil {
322322
return nil, nil, nil, fmt.Errorf("failed to apply admission: %w", err)
323323
}
324-
if err := config.GenericConfig.AddPostStartHook("start-kube-apiserver-admission-initializer", admissionPostStartHook); err != nil {
325-
return nil, nil, nil, err
326-
}
327324

328325
if config.GenericConfig.EgressSelector != nil {
329326
// Use the config.GenericConfig.EgressSelector lookup to find the dialer to connect to the kubelet

cmd/kube-controller-manager/app/validatingadmissionpolicystatus.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,8 @@ func startValidatingAdmissionPolicyStatusController(ctx context.Context, control
5252
RestMapper: controllerContext.RESTMapper,
5353
}
5454
c, err := validatingadmissionpolicystatus.NewController(
55-
controllerContext.InformerFactory.Admissionregistration().V1beta1().ValidatingAdmissionPolicies(),
56-
controllerContext.ClientBuilder.ClientOrDie(names.ValidatingAdmissionPolicyStatusController).AdmissionregistrationV1beta1().ValidatingAdmissionPolicies(),
55+
controllerContext.InformerFactory.Admissionregistration().V1().ValidatingAdmissionPolicies(),
56+
controllerContext.ClientBuilder.ClientOrDie(names.ValidatingAdmissionPolicyStatusController).AdmissionregistrationV1().ValidatingAdmissionPolicies(),
5757
typeChecker,
5858
)
5959

pkg/api/testing/defaulting_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,10 @@ func TestDefaulting(t *testing.T) {
151151
{Group: "admissionregistration.k8s.io", Version: "v1beta1", Kind: "ValidatingAdmissionPolicyList"}: {},
152152
{Group: "admissionregistration.k8s.io", Version: "v1beta1", Kind: "ValidatingAdmissionPolicyBinding"}: {},
153153
{Group: "admissionregistration.k8s.io", Version: "v1beta1", Kind: "ValidatingAdmissionPolicyBindingList"}: {},
154+
{Group: "admissionregistration.k8s.io", Version: "v1", Kind: "ValidatingAdmissionPolicy"}: {},
155+
{Group: "admissionregistration.k8s.io", Version: "v1", Kind: "ValidatingAdmissionPolicyList"}: {},
156+
{Group: "admissionregistration.k8s.io", Version: "v1", Kind: "ValidatingAdmissionPolicyBinding"}: {},
157+
{Group: "admissionregistration.k8s.io", Version: "v1", Kind: "ValidatingAdmissionPolicyBindingList"}: {},
154158
{Group: "admissionregistration.k8s.io", Version: "v1", Kind: "ValidatingWebhookConfiguration"}: {},
155159
{Group: "admissionregistration.k8s.io", Version: "v1", Kind: "ValidatingWebhookConfigurationList"}: {},
156160
{Group: "admissionregistration.k8s.io", Version: "v1", Kind: "MutatingWebhookConfiguration"}: {},

pkg/apis/admissionregistration/v1/defaults.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,3 +93,27 @@ func SetDefaults_ServiceReference(obj *admissionregistrationv1.ServiceReference)
9393
obj.Port = utilpointer.Int32(443)
9494
}
9595
}
96+
97+
// SetDefaults_ValidatingAdmissionPolicySpec sets defaults for ValidatingAdmissionPolicySpec
98+
func SetDefaults_ValidatingAdmissionPolicySpec(obj *admissionregistrationv1.ValidatingAdmissionPolicySpec) {
99+
if obj.FailurePolicy == nil {
100+
policy := admissionregistrationv1.Fail
101+
obj.FailurePolicy = &policy
102+
}
103+
}
104+
105+
// SetDefaults_MatchResources sets defaults for MatchResources
106+
func SetDefaults_MatchResources(obj *admissionregistrationv1.MatchResources) {
107+
if obj.MatchPolicy == nil {
108+
policy := admissionregistrationv1.Equivalent
109+
obj.MatchPolicy = &policy
110+
}
111+
if obj.NamespaceSelector == nil {
112+
selector := metav1.LabelSelector{}
113+
obj.NamespaceSelector = &selector
114+
}
115+
if obj.ObjectSelector == nil {
116+
selector := metav1.LabelSelector{}
117+
obj.ObjectSelector = &selector
118+
}
119+
}

pkg/apis/admissionregistration/v1/defaults_test.go

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,3 +132,91 @@ func TestDefaultAdmissionWebhook(t *testing.T) {
132132
})
133133
}
134134
}
135+
136+
func TestDefaultAdmissionPolicy(t *testing.T) {
137+
fail := v1.Fail
138+
equivalent := v1.Equivalent
139+
allScopes := v1.AllScopes
140+
141+
tests := []struct {
142+
name string
143+
original runtime.Object
144+
expected runtime.Object
145+
}{
146+
{
147+
name: "ValidatingAdmissionPolicy",
148+
original: &v1.ValidatingAdmissionPolicy{
149+
Spec: v1.ValidatingAdmissionPolicySpec{
150+
MatchConstraints: &v1.MatchResources{},
151+
},
152+
},
153+
expected: &v1.ValidatingAdmissionPolicy{
154+
Spec: v1.ValidatingAdmissionPolicySpec{
155+
MatchConstraints: &v1.MatchResources{
156+
MatchPolicy: &equivalent,
157+
NamespaceSelector: &metav1.LabelSelector{},
158+
ObjectSelector: &metav1.LabelSelector{},
159+
},
160+
FailurePolicy: &fail,
161+
},
162+
},
163+
},
164+
{
165+
name: "ValidatingAdmissionPolicyBinding",
166+
original: &v1.ValidatingAdmissionPolicyBinding{
167+
Spec: v1.ValidatingAdmissionPolicyBindingSpec{
168+
MatchResources: &v1.MatchResources{},
169+
},
170+
},
171+
expected: &v1.ValidatingAdmissionPolicyBinding{
172+
Spec: v1.ValidatingAdmissionPolicyBindingSpec{
173+
MatchResources: &v1.MatchResources{
174+
MatchPolicy: &equivalent,
175+
NamespaceSelector: &metav1.LabelSelector{},
176+
ObjectSelector: &metav1.LabelSelector{},
177+
},
178+
},
179+
},
180+
},
181+
{
182+
name: "scope=*",
183+
original: &v1.ValidatingAdmissionPolicy{
184+
Spec: v1.ValidatingAdmissionPolicySpec{
185+
MatchConstraints: &v1.MatchResources{
186+
ResourceRules: []v1.NamedRuleWithOperations{{}},
187+
},
188+
},
189+
},
190+
expected: &v1.ValidatingAdmissionPolicy{
191+
Spec: v1.ValidatingAdmissionPolicySpec{
192+
MatchConstraints: &v1.MatchResources{
193+
MatchPolicy: &equivalent,
194+
NamespaceSelector: &metav1.LabelSelector{},
195+
ObjectSelector: &metav1.LabelSelector{},
196+
ResourceRules: []v1.NamedRuleWithOperations{
197+
{
198+
RuleWithOperations: v1.RuleWithOperations{
199+
Rule: v1.Rule{
200+
Scope: &allScopes, // defaulted
201+
},
202+
},
203+
},
204+
},
205+
},
206+
FailurePolicy: &fail,
207+
},
208+
},
209+
},
210+
}
211+
212+
for _, test := range tests {
213+
t.Run(test.name, func(t *testing.T) {
214+
original := test.original
215+
expected := test.expected
216+
legacyscheme.Scheme.Default(original)
217+
if !apiequality.Semantic.DeepEqual(original, expected) {
218+
t.Error(cmp.Diff(expected, original))
219+
}
220+
})
221+
}
222+
}

pkg/controller/validatingadmissionpolicystatus/controller.go

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,15 @@ import (
2121
"fmt"
2222
"time"
2323

24-
"k8s.io/api/admissionregistration/v1beta1"
24+
"k8s.io/api/admissionregistration/v1"
2525
kerrors "k8s.io/apimachinery/pkg/api/errors"
2626
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2727
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
2828
"k8s.io/apimachinery/pkg/util/wait"
2929
validatingadmissionpolicy "k8s.io/apiserver/pkg/admission/plugin/policy/validating"
30-
admissionregistrationv1beta1apply "k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1"
31-
informerv1beta1 "k8s.io/client-go/informers/admissionregistration/v1beta1"
32-
admissionregistrationv1beta1 "k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1"
30+
admissionregistrationv1apply "k8s.io/client-go/applyconfigurations/admissionregistration/v1"
31+
informerv1 "k8s.io/client-go/informers/admissionregistration/v1"
32+
admissionregistrationv1 "k8s.io/client-go/kubernetes/typed/admissionregistration/v1"
3333
"k8s.io/client-go/tools/cache"
3434
"k8s.io/client-go/util/workqueue"
3535
)
@@ -40,10 +40,10 @@ const ControllerName = "validatingadmissionpolicy-status"
4040
// Controller is the ValidatingAdmissionPolicy Status controller that reconciles the Status field of each policy object.
4141
// This controller runs type checks against referred types for each policy definition.
4242
type Controller struct {
43-
policyInformer informerv1beta1.ValidatingAdmissionPolicyInformer
43+
policyInformer informerv1.ValidatingAdmissionPolicyInformer
4444
policyQueue workqueue.RateLimitingInterface
4545
policySynced cache.InformerSynced
46-
policyClient admissionregistrationv1beta1.ValidatingAdmissionPolicyInterface
46+
policyClient admissionregistrationv1.ValidatingAdmissionPolicyInterface
4747

4848
// typeChecker checks the policy's expressions for type errors.
4949
// Type of params is defined in policy.Spec.ParamsKind
@@ -66,7 +66,7 @@ func (c *Controller) Run(ctx context.Context, workers int) {
6666
<-ctx.Done()
6767
}
6868

69-
func NewController(policyInformer informerv1beta1.ValidatingAdmissionPolicyInformer, policyClient admissionregistrationv1beta1.ValidatingAdmissionPolicyInterface, typeChecker *validatingadmissionpolicy.TypeChecker) (*Controller, error) {
69+
func NewController(policyInformer informerv1.ValidatingAdmissionPolicyInformer, policyClient admissionregistrationv1.ValidatingAdmissionPolicyInterface, typeChecker *validatingadmissionpolicy.TypeChecker) (*Controller, error) {
7070
c := &Controller{
7171
policyInformer: policyInformer,
7272
policyQueue: workqueue.NewRateLimitingQueueWithConfig(workqueue.DefaultControllerRateLimiter(), workqueue.RateLimitingQueueConfig{Name: ControllerName}),
@@ -89,7 +89,7 @@ func NewController(policyInformer informerv1beta1.ValidatingAdmissionPolicyInfor
8989
}
9090

9191
func (c *Controller) enqueuePolicy(policy any) {
92-
if policy, ok := policy.(*v1beta1.ValidatingAdmissionPolicy); ok {
92+
if policy, ok := policy.(*v1.ValidatingAdmissionPolicy); ok {
9393
// policy objects are cluster-scoped, no point include its namespace.
9494
key := policy.ObjectMeta.Name
9595
if key == "" {
@@ -138,24 +138,24 @@ func (c *Controller) processNextWorkItem(ctx context.Context) bool {
138138
return true
139139
}
140140

141-
func (c *Controller) reconcile(ctx context.Context, policy *v1beta1.ValidatingAdmissionPolicy) error {
141+
func (c *Controller) reconcile(ctx context.Context, policy *v1.ValidatingAdmissionPolicy) error {
142142
if policy == nil {
143143
return nil
144144
}
145145
if policy.Generation <= policy.Status.ObservedGeneration {
146146
return nil
147147
}
148148
warnings := c.typeChecker.Check(policy)
149-
warningsConfig := make([]*admissionregistrationv1beta1apply.ExpressionWarningApplyConfiguration, 0, len(warnings))
149+
warningsConfig := make([]*admissionregistrationv1apply.ExpressionWarningApplyConfiguration, 0, len(warnings))
150150
for _, warning := range warnings {
151-
warningsConfig = append(warningsConfig, admissionregistrationv1beta1apply.ExpressionWarning().
151+
warningsConfig = append(warningsConfig, admissionregistrationv1apply.ExpressionWarning().
152152
WithFieldRef(warning.FieldRef).
153153
WithWarning(warning.Warning))
154154
}
155-
applyConfig := admissionregistrationv1beta1apply.ValidatingAdmissionPolicy(policy.Name).
156-
WithStatus(admissionregistrationv1beta1apply.ValidatingAdmissionPolicyStatus().
155+
applyConfig := admissionregistrationv1apply.ValidatingAdmissionPolicy(policy.Name).
156+
WithStatus(admissionregistrationv1apply.ValidatingAdmissionPolicyStatus().
157157
WithObservedGeneration(policy.Generation).
158-
WithTypeChecking(admissionregistrationv1beta1apply.TypeChecking().
158+
WithTypeChecking(admissionregistrationv1apply.TypeChecking().
159159
WithExpressionWarnings(warningsConfig...)))
160160
_, err := c.policyClient.ApplyStatus(ctx, applyConfig, metav1.ApplyOptions{FieldManager: ControllerName, Force: true})
161161
return err

pkg/controller/validatingadmissionpolicystatus/controller_test.go

Lines changed: 25 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ import (
2323
"time"
2424

2525
admissionregistrationv1 "k8s.io/api/admissionregistration/v1"
26-
admissionregistrationv1beta1 "k8s.io/api/admissionregistration/v1beta1"
2726
"k8s.io/apimachinery/pkg/api/meta/testrestmapper"
2827
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2928
"k8s.io/apimachinery/pkg/util/wait"
@@ -38,13 +37,13 @@ import (
3837
func TestTypeChecking(t *testing.T) {
3938
for _, tc := range []struct {
4039
name string
41-
policy *admissionregistrationv1beta1.ValidatingAdmissionPolicy
42-
assertFieldRef func(warnings []admissionregistrationv1beta1.ExpressionWarning, t *testing.T) // warning.fieldRef
43-
assertWarnings func(warnings []admissionregistrationv1beta1.ExpressionWarning, t *testing.T) // warning.warning
40+
policy *admissionregistrationv1.ValidatingAdmissionPolicy
41+
assertFieldRef func(warnings []admissionregistrationv1.ExpressionWarning, t *testing.T) // warning.fieldRef
42+
assertWarnings func(warnings []admissionregistrationv1.ExpressionWarning, t *testing.T) // warning.warning
4443
}{
4544
{
4645
name: "deployment with correct expression",
47-
policy: withGVRMatch([]string{"apps"}, []string{"v1"}, []string{"deployments"}, withValidations([]admissionregistrationv1beta1.Validation{
46+
policy: withGVRMatch([]string{"apps"}, []string{"v1"}, []string{"deployments"}, withValidations([]admissionregistrationv1.Validation{
4847
{
4948
Expression: "object.spec.replicas > 1",
5049
},
@@ -54,7 +53,7 @@ func TestTypeChecking(t *testing.T) {
5453
},
5554
{
5655
name: "deployment with type confusion",
57-
policy: withGVRMatch([]string{"apps"}, []string{"v1"}, []string{"deployments"}, withValidations([]admissionregistrationv1beta1.Validation{
56+
policy: withGVRMatch([]string{"apps"}, []string{"v1"}, []string{"deployments"}, withValidations([]admissionregistrationv1.Validation{
5857
{
5958
Expression: "object.spec.replicas < 100", // this one passes
6059
},
@@ -67,7 +66,7 @@ func TestTypeChecking(t *testing.T) {
6766
},
6867
{
6968
name: "two expressions different type checking errors",
70-
policy: withGVRMatch([]string{"apps"}, []string{"v1"}, []string{"deployments"}, withValidations([]admissionregistrationv1beta1.Validation{
69+
policy: withGVRMatch([]string{"apps"}, []string{"v1"}, []string{"deployments"}, withValidations([]admissionregistrationv1.Validation{
7170
{
7271
Expression: "object.spec.nonExistingFirst > 1",
7372
},
@@ -83,7 +82,7 @@ func TestTypeChecking(t *testing.T) {
8382
},
8483
{
8584
name: "one expression, two warnings",
86-
policy: withGVRMatch([]string{"apps"}, []string{"v1"}, []string{"deployments"}, withValidations([]admissionregistrationv1beta1.Validation{
85+
policy: withGVRMatch([]string{"apps"}, []string{"v1"}, []string{"deployments"}, withValidations([]admissionregistrationv1.Validation{
8786
{
8887
Expression: "object.spec.replicas < 100", // this one passes
8988
},
@@ -107,8 +106,8 @@ func TestTypeChecking(t *testing.T) {
107106
RestMapper: testrestmapper.TestOnlyStaticRESTMapper(scheme.Scheme),
108107
}
109108
controller, err := NewController(
110-
informerFactory.Admissionregistration().V1beta1().ValidatingAdmissionPolicies(),
111-
client.AdmissionregistrationV1beta1().ValidatingAdmissionPolicies(),
109+
informerFactory.Admissionregistration().V1().ValidatingAdmissionPolicies(),
110+
client.AdmissionregistrationV1().ValidatingAdmissionPolicies(),
112111
typeChecker,
113112
)
114113
if err != nil {
@@ -120,7 +119,7 @@ func TestTypeChecking(t *testing.T) {
120119
name := policy.Name
121120
// wait until the typeChecking is set, which means the type checking
122121
// is complete.
123-
updated, err := client.AdmissionregistrationV1beta1().ValidatingAdmissionPolicies().Get(ctx, name, metav1.GetOptions{})
122+
updated, err := client.AdmissionregistrationV1().ValidatingAdmissionPolicies().Get(ctx, name, metav1.GetOptions{})
124123
if err != nil {
125124
return false, err
126125
}
@@ -143,8 +142,8 @@ func TestTypeChecking(t *testing.T) {
143142

144143
}
145144

146-
func toBe(expected ...string) func(warnings []admissionregistrationv1beta1.ExpressionWarning, t *testing.T) {
147-
return func(warnings []admissionregistrationv1beta1.ExpressionWarning, t *testing.T) {
145+
func toBe(expected ...string) func(warnings []admissionregistrationv1.ExpressionWarning, t *testing.T) {
146+
return func(warnings []admissionregistrationv1.ExpressionWarning, t *testing.T) {
148147
if len(expected) != len(warnings) {
149148
t.Fatalf("mismatched length, expect %d, got %d", len(expected), len(warnings))
150149
}
@@ -156,8 +155,8 @@ func toBe(expected ...string) func(warnings []admissionregistrationv1beta1.Expre
156155
}
157156
}
158157

159-
func toHaveSubstring(substrings ...string) func(warnings []admissionregistrationv1beta1.ExpressionWarning, t *testing.T) {
160-
return func(warnings []admissionregistrationv1beta1.ExpressionWarning, t *testing.T) {
158+
func toHaveSubstring(substrings ...string) func(warnings []admissionregistrationv1.ExpressionWarning, t *testing.T) {
159+
return func(warnings []admissionregistrationv1.ExpressionWarning, t *testing.T) {
161160
if len(substrings) != len(warnings) {
162161
t.Fatalf("mismatched length, expect %d, got %d", len(substrings), len(warnings))
163162
}
@@ -169,8 +168,8 @@ func toHaveSubstring(substrings ...string) func(warnings []admissionregistration
169168
}
170169
}
171170

172-
func toHaveMultipleSubstrings(substrings ...[]string) func(warnings []admissionregistrationv1beta1.ExpressionWarning, t *testing.T) {
173-
return func(warnings []admissionregistrationv1beta1.ExpressionWarning, t *testing.T) {
171+
func toHaveMultipleSubstrings(substrings ...[]string) func(warnings []admissionregistrationv1.ExpressionWarning, t *testing.T) {
172+
return func(warnings []admissionregistrationv1.ExpressionWarning, t *testing.T) {
174173
if len(substrings) != len(warnings) {
175174
t.Fatalf("mismatched length, expect %d, got %d", len(substrings), len(warnings))
176175
}
@@ -184,19 +183,19 @@ func toHaveMultipleSubstrings(substrings ...[]string) func(warnings []admissionr
184183
}
185184
}
186185

187-
func toHaveLengthOf(n int) func(warnings []admissionregistrationv1beta1.ExpressionWarning, t *testing.T) {
188-
return func(warnings []admissionregistrationv1beta1.ExpressionWarning, t *testing.T) {
186+
func toHaveLengthOf(n int) func(warnings []admissionregistrationv1.ExpressionWarning, t *testing.T) {
187+
return func(warnings []admissionregistrationv1.ExpressionWarning, t *testing.T) {
189188
if n != len(warnings) {
190189
t.Fatalf("mismatched length, expect %d, got %d", n, len(warnings))
191190
}
192191
}
193192
}
194193

195-
func withGVRMatch(groups []string, versions []string, resources []string, policy *admissionregistrationv1beta1.ValidatingAdmissionPolicy) *admissionregistrationv1beta1.ValidatingAdmissionPolicy {
196-
policy.Spec.MatchConstraints = &admissionregistrationv1beta1.MatchResources{
197-
ResourceRules: []admissionregistrationv1beta1.NamedRuleWithOperations{
194+
func withGVRMatch(groups []string, versions []string, resources []string, policy *admissionregistrationv1.ValidatingAdmissionPolicy) *admissionregistrationv1.ValidatingAdmissionPolicy {
195+
policy.Spec.MatchConstraints = &admissionregistrationv1.MatchResources{
196+
ResourceRules: []admissionregistrationv1.NamedRuleWithOperations{
198197
{
199-
RuleWithOperations: admissionregistrationv1beta1.RuleWithOperations{
198+
RuleWithOperations: admissionregistrationv1.RuleWithOperations{
200199
Operations: []admissionregistrationv1.OperationType{
201200
"*",
202201
},
@@ -212,13 +211,13 @@ func withGVRMatch(groups []string, versions []string, resources []string, policy
212211
return policy
213212
}
214213

215-
func withValidations(validations []admissionregistrationv1beta1.Validation, policy *admissionregistrationv1beta1.ValidatingAdmissionPolicy) *admissionregistrationv1beta1.ValidatingAdmissionPolicy {
214+
func withValidations(validations []admissionregistrationv1.Validation, policy *admissionregistrationv1.ValidatingAdmissionPolicy) *admissionregistrationv1.ValidatingAdmissionPolicy {
216215
policy.Spec.Validations = validations
217216
return policy
218217
}
219218

220-
func makePolicy(name string) *admissionregistrationv1beta1.ValidatingAdmissionPolicy {
221-
return &admissionregistrationv1beta1.ValidatingAdmissionPolicy{
219+
func makePolicy(name string) *admissionregistrationv1.ValidatingAdmissionPolicy {
220+
return &admissionregistrationv1.ValidatingAdmissionPolicy{
222221
ObjectMeta: metav1.ObjectMeta{Name: name},
223222
}
224223
}

0 commit comments

Comments
 (0)