refactor: replace usage of v1alpha1 with v1beta1

v1alpha -> v1beta

fill in DenyAction where there is no ParameterNotFoundAction
This commit is contained in:
Alexander Zielenski 2023-07-19 15:53:31 -07:00
parent b3b775baa5
commit ef8670c946
14 changed files with 600 additions and 597 deletions

View File

@ -19,7 +19,7 @@ package app
import ( import (
"context" "context"
admissionregistrationv1alpha1 "k8s.io/api/admissionregistration/v1alpha1" admissionregistrationv1beta1 "k8s.io/api/admissionregistration/v1beta1"
pluginvalidatingadmissionpolicy "k8s.io/apiserver/pkg/admission/plugin/validatingadmissionpolicy" pluginvalidatingadmissionpolicy "k8s.io/apiserver/pkg/admission/plugin/validatingadmissionpolicy"
"k8s.io/apiserver/pkg/cel/openapi/resolver" "k8s.io/apiserver/pkg/cel/openapi/resolver"
"k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/kubernetes/scheme"
@ -28,7 +28,7 @@ import (
"k8s.io/kubernetes/pkg/generated/openapi" "k8s.io/kubernetes/pkg/generated/openapi"
) )
var validatingAdmissionPolicyResource = admissionregistrationv1alpha1.SchemeGroupVersion.WithResource("validatingadmissionpolicies") var validatingAdmissionPolicyResource = admissionregistrationv1beta1.SchemeGroupVersion.WithResource("validatingadmissionpolicies")
func startValidatingAdmissionPolicyStatusController(ctx context.Context, controllerContext ControllerContext) (controller.Interface, bool, error) { func startValidatingAdmissionPolicyStatusController(ctx context.Context, controllerContext ControllerContext) (controller.Interface, bool, error) {
// intended check against served resource but not feature gate. // intended check against served resource but not feature gate.
@ -41,8 +41,8 @@ func startValidatingAdmissionPolicyStatusController(ctx context.Context, control
RestMapper: controllerContext.RESTMapper, RestMapper: controllerContext.RESTMapper,
} }
c, err := validatingadmissionpolicystatus.NewController( c, err := validatingadmissionpolicystatus.NewController(
controllerContext.InformerFactory.Admissionregistration().V1alpha1().ValidatingAdmissionPolicies(), controllerContext.InformerFactory.Admissionregistration().V1beta1().ValidatingAdmissionPolicies(),
controllerContext.ClientBuilder.ClientOrDie("validatingadmissionpolicy-status-controller").AdmissionregistrationV1alpha1().ValidatingAdmissionPolicies(), controllerContext.ClientBuilder.ClientOrDie("validatingadmissionpolicy-status-controller").AdmissionregistrationV1beta1().ValidatingAdmissionPolicies(),
typeChecker, typeChecker,
) )

View File

@ -21,15 +21,15 @@ import (
"fmt" "fmt"
"time" "time"
"k8s.io/api/admissionregistration/v1alpha1" "k8s.io/api/admissionregistration/v1beta1"
kerrors "k8s.io/apimachinery/pkg/api/errors" kerrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
utilruntime "k8s.io/apimachinery/pkg/util/runtime" utilruntime "k8s.io/apimachinery/pkg/util/runtime"
"k8s.io/apimachinery/pkg/util/wait" "k8s.io/apimachinery/pkg/util/wait"
"k8s.io/apiserver/pkg/admission/plugin/validatingadmissionpolicy" "k8s.io/apiserver/pkg/admission/plugin/validatingadmissionpolicy"
admissionregistrationv1alpha1apply "k8s.io/client-go/applyconfigurations/admissionregistration/v1alpha1" admissionregistrationv1beta1apply "k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1"
informerv1alpha1 "k8s.io/client-go/informers/admissionregistration/v1alpha1" informerv1beta1 "k8s.io/client-go/informers/admissionregistration/v1beta1"
admissionregistrationv1alpha1 "k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1" admissionregistrationv1beta1 "k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1"
"k8s.io/client-go/tools/cache" "k8s.io/client-go/tools/cache"
"k8s.io/client-go/util/workqueue" "k8s.io/client-go/util/workqueue"
) )
@ -40,10 +40,10 @@ const ControllerName = "validatingadmissionpolicy-status"
// Controller is the ValidatingAdmissionPolicy Status controller that reconciles the Status field of each policy object. // Controller is the ValidatingAdmissionPolicy Status controller that reconciles the Status field of each policy object.
// This controller runs type checks against referred types for each policy definition. // This controller runs type checks against referred types for each policy definition.
type Controller struct { type Controller struct {
policyInformer informerv1alpha1.ValidatingAdmissionPolicyInformer policyInformer informerv1beta1.ValidatingAdmissionPolicyInformer
policyQueue workqueue.RateLimitingInterface policyQueue workqueue.RateLimitingInterface
policySynced cache.InformerSynced policySynced cache.InformerSynced
policyClient admissionregistrationv1alpha1.ValidatingAdmissionPolicyInterface policyClient admissionregistrationv1beta1.ValidatingAdmissionPolicyInterface
// typeChecker checks the policy's expressions for type errors. // typeChecker checks the policy's expressions for type errors.
// Type of params is defined in policy.Spec.ParamsKind // Type of params is defined in policy.Spec.ParamsKind
@ -66,7 +66,7 @@ func (c *Controller) Run(ctx context.Context, workers int) {
<-ctx.Done() <-ctx.Done()
} }
func NewController(policyInformer informerv1alpha1.ValidatingAdmissionPolicyInformer, policyClient admissionregistrationv1alpha1.ValidatingAdmissionPolicyInterface, typeChecker *validatingadmissionpolicy.TypeChecker) (*Controller, error) { func NewController(policyInformer informerv1beta1.ValidatingAdmissionPolicyInformer, policyClient admissionregistrationv1beta1.ValidatingAdmissionPolicyInterface, typeChecker *validatingadmissionpolicy.TypeChecker) (*Controller, error) {
c := &Controller{ c := &Controller{
policyInformer: policyInformer, policyInformer: policyInformer,
policyQueue: workqueue.NewRateLimitingQueueWithConfig(workqueue.DefaultControllerRateLimiter(), workqueue.RateLimitingQueueConfig{Name: ControllerName}), policyQueue: workqueue.NewRateLimitingQueueWithConfig(workqueue.DefaultControllerRateLimiter(), workqueue.RateLimitingQueueConfig{Name: ControllerName}),
@ -89,7 +89,7 @@ func NewController(policyInformer informerv1alpha1.ValidatingAdmissionPolicyInfo
} }
func (c *Controller) enqueuePolicy(policy any) { func (c *Controller) enqueuePolicy(policy any) {
if policy, ok := policy.(*v1alpha1.ValidatingAdmissionPolicy); ok { if policy, ok := policy.(*v1beta1.ValidatingAdmissionPolicy); ok {
// policy objects are cluster-scoped, no point include its namespace. // policy objects are cluster-scoped, no point include its namespace.
key := policy.ObjectMeta.Name key := policy.ObjectMeta.Name
if key == "" { if key == "" {
@ -138,7 +138,7 @@ func (c *Controller) processNextWorkItem(ctx context.Context) bool {
return true return true
} }
func (c *Controller) reconcile(ctx context.Context, policy *v1alpha1.ValidatingAdmissionPolicy) error { func (c *Controller) reconcile(ctx context.Context, policy *v1beta1.ValidatingAdmissionPolicy) error {
if policy == nil { if policy == nil {
return nil return nil
} }
@ -146,16 +146,16 @@ func (c *Controller) reconcile(ctx context.Context, policy *v1alpha1.ValidatingA
return nil return nil
} }
warnings := c.typeChecker.Check(policy) warnings := c.typeChecker.Check(policy)
warningsConfig := make([]*admissionregistrationv1alpha1apply.ExpressionWarningApplyConfiguration, 0, len(warnings)) warningsConfig := make([]*admissionregistrationv1beta1apply.ExpressionWarningApplyConfiguration, 0, len(warnings))
for _, warning := range warnings { for _, warning := range warnings {
warningsConfig = append(warningsConfig, admissionregistrationv1alpha1apply.ExpressionWarning(). warningsConfig = append(warningsConfig, admissionregistrationv1beta1apply.ExpressionWarning().
WithFieldRef(warning.FieldRef). WithFieldRef(warning.FieldRef).
WithWarning(warning.Warning)) WithWarning(warning.Warning))
} }
applyConfig := admissionregistrationv1alpha1apply.ValidatingAdmissionPolicy(policy.Name). applyConfig := admissionregistrationv1beta1apply.ValidatingAdmissionPolicy(policy.Name).
WithStatus(admissionregistrationv1alpha1apply.ValidatingAdmissionPolicyStatus(). WithStatus(admissionregistrationv1beta1apply.ValidatingAdmissionPolicyStatus().
WithObservedGeneration(policy.Generation). WithObservedGeneration(policy.Generation).
WithTypeChecking(admissionregistrationv1alpha1apply.TypeChecking(). WithTypeChecking(admissionregistrationv1beta1apply.TypeChecking().
WithExpressionWarnings(warningsConfig...))) WithExpressionWarnings(warningsConfig...)))
_, err := c.policyClient.ApplyStatus(ctx, applyConfig, metav1.ApplyOptions{FieldManager: ControllerName, Force: true}) _, err := c.policyClient.ApplyStatus(ctx, applyConfig, metav1.ApplyOptions{FieldManager: ControllerName, Force: true})
return err return err

View File

@ -23,7 +23,7 @@ import (
"time" "time"
admissionregistrationv1 "k8s.io/api/admissionregistration/v1" admissionregistrationv1 "k8s.io/api/admissionregistration/v1"
admissionregistrationv1alpha1 "k8s.io/api/admissionregistration/v1alpha1" admissionregistrationv1beta1 "k8s.io/api/admissionregistration/v1beta1"
"k8s.io/apimachinery/pkg/api/meta/testrestmapper" "k8s.io/apimachinery/pkg/api/meta/testrestmapper"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/wait" "k8s.io/apimachinery/pkg/util/wait"
@ -38,13 +38,13 @@ import (
func TestTypeChecking(t *testing.T) { func TestTypeChecking(t *testing.T) {
for _, tc := range []struct { for _, tc := range []struct {
name string name string
policy *admissionregistrationv1alpha1.ValidatingAdmissionPolicy policy *admissionregistrationv1beta1.ValidatingAdmissionPolicy
assertFieldRef func(warnings []admissionregistrationv1alpha1.ExpressionWarning, t *testing.T) // warning.fieldRef assertFieldRef func(warnings []admissionregistrationv1beta1.ExpressionWarning, t *testing.T) // warning.fieldRef
assertWarnings func(warnings []admissionregistrationv1alpha1.ExpressionWarning, t *testing.T) // warning.warning assertWarnings func(warnings []admissionregistrationv1beta1.ExpressionWarning, t *testing.T) // warning.warning
}{ }{
{ {
name: "deployment with correct expression", name: "deployment with correct expression",
policy: withGVRMatch([]string{"apps"}, []string{"v1"}, []string{"deployments"}, withValidations([]admissionregistrationv1alpha1.Validation{ policy: withGVRMatch([]string{"apps"}, []string{"v1"}, []string{"deployments"}, withValidations([]admissionregistrationv1beta1.Validation{
{ {
Expression: "object.spec.replicas > 1", Expression: "object.spec.replicas > 1",
}, },
@ -54,7 +54,7 @@ func TestTypeChecking(t *testing.T) {
}, },
{ {
name: "deployment with type confusion", name: "deployment with type confusion",
policy: withGVRMatch([]string{"apps"}, []string{"v1"}, []string{"deployments"}, withValidations([]admissionregistrationv1alpha1.Validation{ policy: withGVRMatch([]string{"apps"}, []string{"v1"}, []string{"deployments"}, withValidations([]admissionregistrationv1beta1.Validation{
{ {
Expression: "object.spec.replicas < 100", // this one passes Expression: "object.spec.replicas < 100", // this one passes
}, },
@ -67,7 +67,7 @@ func TestTypeChecking(t *testing.T) {
}, },
{ {
name: "two expressions different type checking errors", name: "two expressions different type checking errors",
policy: withGVRMatch([]string{"apps"}, []string{"v1"}, []string{"deployments"}, withValidations([]admissionregistrationv1alpha1.Validation{ policy: withGVRMatch([]string{"apps"}, []string{"v1"}, []string{"deployments"}, withValidations([]admissionregistrationv1beta1.Validation{
{ {
Expression: "object.spec.nonExistingFirst > 1", Expression: "object.spec.nonExistingFirst > 1",
}, },
@ -83,7 +83,7 @@ func TestTypeChecking(t *testing.T) {
}, },
{ {
name: "one expression, two warnings", name: "one expression, two warnings",
policy: withGVRMatch([]string{"apps"}, []string{"v1"}, []string{"deployments"}, withValidations([]admissionregistrationv1alpha1.Validation{ policy: withGVRMatch([]string{"apps"}, []string{"v1"}, []string{"deployments"}, withValidations([]admissionregistrationv1beta1.Validation{
{ {
Expression: "object.spec.replicas < 100", // this one passes Expression: "object.spec.replicas < 100", // this one passes
}, },
@ -107,8 +107,8 @@ func TestTypeChecking(t *testing.T) {
RestMapper: testrestmapper.TestOnlyStaticRESTMapper(scheme.Scheme), RestMapper: testrestmapper.TestOnlyStaticRESTMapper(scheme.Scheme),
} }
controller, err := NewController( controller, err := NewController(
informerFactory.Admissionregistration().V1alpha1().ValidatingAdmissionPolicies(), informerFactory.Admissionregistration().V1beta1().ValidatingAdmissionPolicies(),
client.AdmissionregistrationV1alpha1().ValidatingAdmissionPolicies(), client.AdmissionregistrationV1beta1().ValidatingAdmissionPolicies(),
typeChecker, typeChecker,
) )
if err != nil { if err != nil {
@ -120,7 +120,7 @@ func TestTypeChecking(t *testing.T) {
name := policy.Name name := policy.Name
// wait until the typeChecking is set, which means the type checking // wait until the typeChecking is set, which means the type checking
// is complete. // is complete.
updated, err := client.AdmissionregistrationV1alpha1().ValidatingAdmissionPolicies().Get(ctx, name, metav1.GetOptions{}) updated, err := client.AdmissionregistrationV1beta1().ValidatingAdmissionPolicies().Get(ctx, name, metav1.GetOptions{})
if err != nil { if err != nil {
return false, err return false, err
} }
@ -143,8 +143,8 @@ func TestTypeChecking(t *testing.T) {
} }
func toBe(expected ...string) func(warnings []admissionregistrationv1alpha1.ExpressionWarning, t *testing.T) { func toBe(expected ...string) func(warnings []admissionregistrationv1beta1.ExpressionWarning, t *testing.T) {
return func(warnings []admissionregistrationv1alpha1.ExpressionWarning, t *testing.T) { return func(warnings []admissionregistrationv1beta1.ExpressionWarning, t *testing.T) {
if len(expected) != len(warnings) { if len(expected) != len(warnings) {
t.Fatalf("mismatched length, expect %d, got %d", len(expected), len(warnings)) t.Fatalf("mismatched length, expect %d, got %d", len(expected), len(warnings))
} }
@ -156,8 +156,8 @@ func toBe(expected ...string) func(warnings []admissionregistrationv1alpha1.Expr
} }
} }
func toHaveSubstring(substrings ...string) func(warnings []admissionregistrationv1alpha1.ExpressionWarning, t *testing.T) { func toHaveSubstring(substrings ...string) func(warnings []admissionregistrationv1beta1.ExpressionWarning, t *testing.T) {
return func(warnings []admissionregistrationv1alpha1.ExpressionWarning, t *testing.T) { return func(warnings []admissionregistrationv1beta1.ExpressionWarning, t *testing.T) {
if len(substrings) != len(warnings) { if len(substrings) != len(warnings) {
t.Fatalf("mismatched length, expect %d, got %d", len(substrings), len(warnings)) t.Fatalf("mismatched length, expect %d, got %d", len(substrings), len(warnings))
} }
@ -169,8 +169,8 @@ func toHaveSubstring(substrings ...string) func(warnings []admissionregistration
} }
} }
func toHaveMultipleSubstrings(substrings ...[]string) func(warnings []admissionregistrationv1alpha1.ExpressionWarning, t *testing.T) { func toHaveMultipleSubstrings(substrings ...[]string) func(warnings []admissionregistrationv1beta1.ExpressionWarning, t *testing.T) {
return func(warnings []admissionregistrationv1alpha1.ExpressionWarning, t *testing.T) { return func(warnings []admissionregistrationv1beta1.ExpressionWarning, t *testing.T) {
if len(substrings) != len(warnings) { if len(substrings) != len(warnings) {
t.Fatalf("mismatched length, expect %d, got %d", len(substrings), len(warnings)) t.Fatalf("mismatched length, expect %d, got %d", len(substrings), len(warnings))
} }
@ -184,19 +184,19 @@ func toHaveMultipleSubstrings(substrings ...[]string) func(warnings []admissionr
} }
} }
func toHaveLengthOf(n int) func(warnings []admissionregistrationv1alpha1.ExpressionWarning, t *testing.T) { func toHaveLengthOf(n int) func(warnings []admissionregistrationv1beta1.ExpressionWarning, t *testing.T) {
return func(warnings []admissionregistrationv1alpha1.ExpressionWarning, t *testing.T) { return func(warnings []admissionregistrationv1beta1.ExpressionWarning, t *testing.T) {
if n != len(warnings) { if n != len(warnings) {
t.Fatalf("mismatched length, expect %d, got %d", n, len(warnings)) t.Fatalf("mismatched length, expect %d, got %d", n, len(warnings))
} }
} }
} }
func withGVRMatch(groups []string, versions []string, resources []string, policy *admissionregistrationv1alpha1.ValidatingAdmissionPolicy) *admissionregistrationv1alpha1.ValidatingAdmissionPolicy { func withGVRMatch(groups []string, versions []string, resources []string, policy *admissionregistrationv1beta1.ValidatingAdmissionPolicy) *admissionregistrationv1beta1.ValidatingAdmissionPolicy {
policy.Spec.MatchConstraints = &admissionregistrationv1alpha1.MatchResources{ policy.Spec.MatchConstraints = &admissionregistrationv1beta1.MatchResources{
ResourceRules: []admissionregistrationv1alpha1.NamedRuleWithOperations{ ResourceRules: []admissionregistrationv1beta1.NamedRuleWithOperations{
{ {
RuleWithOperations: admissionregistrationv1alpha1.RuleWithOperations{ RuleWithOperations: admissionregistrationv1beta1.RuleWithOperations{
Operations: []admissionregistrationv1.OperationType{ Operations: []admissionregistrationv1.OperationType{
"*", "*",
}, },
@ -212,13 +212,13 @@ func withGVRMatch(groups []string, versions []string, resources []string, policy
return policy return policy
} }
func withValidations(validations []admissionregistrationv1alpha1.Validation, policy *admissionregistrationv1alpha1.ValidatingAdmissionPolicy) *admissionregistrationv1alpha1.ValidatingAdmissionPolicy { func withValidations(validations []admissionregistrationv1beta1.Validation, policy *admissionregistrationv1beta1.ValidatingAdmissionPolicy) *admissionregistrationv1beta1.ValidatingAdmissionPolicy {
policy.Spec.Validations = validations policy.Spec.Validations = validations
return policy return policy
} }
func makePolicy(name string) *admissionregistrationv1alpha1.ValidatingAdmissionPolicy { func makePolicy(name string) *admissionregistrationv1beta1.ValidatingAdmissionPolicy {
return &admissionregistrationv1alpha1.ValidatingAdmissionPolicy{ return &admissionregistrationv1beta1.ValidatingAdmissionPolicy{
ObjectMeta: metav1.ObjectMeta{Name: name}, ObjectMeta: metav1.ObjectMeta{Name: name},
} }
} }

View File

@ -30,7 +30,7 @@ import (
admissionv1 "k8s.io/api/admission/v1" admissionv1 "k8s.io/api/admission/v1"
admissionRegistrationv1 "k8s.io/api/admissionregistration/v1" admissionRegistrationv1 "k8s.io/api/admissionregistration/v1"
"k8s.io/api/admissionregistration/v1alpha1" "k8s.io/api/admissionregistration/v1beta1"
v1 "k8s.io/api/core/v1" v1 "k8s.io/api/core/v1"
k8serrors "k8s.io/apimachinery/pkg/api/errors" k8serrors "k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/api/meta"
@ -78,7 +78,7 @@ var (
Kind: clusterScopedParamsGVK.Kind + "List", Kind: clusterScopedParamsGVK.Kind + "List",
}, &unstructured.UnstructuredList{}) }, &unstructured.UnstructuredList{})
if err := v1alpha1.AddToScheme(res); err != nil { if err := v1beta1.AddToScheme(res); err != nil {
panic(err) panic(err)
} }
@ -117,25 +117,25 @@ var (
return res return res
}() }()
definitionGVK schema.GroupVersionKind = must3(scheme.ObjectKinds(&v1alpha1.ValidatingAdmissionPolicy{}))[0] definitionGVK schema.GroupVersionKind = must3(scheme.ObjectKinds(&v1beta1.ValidatingAdmissionPolicy{}))[0]
bindingGVK schema.GroupVersionKind = must3(scheme.ObjectKinds(&v1alpha1.ValidatingAdmissionPolicyBinding{}))[0] bindingGVK schema.GroupVersionKind = must3(scheme.ObjectKinds(&v1beta1.ValidatingAdmissionPolicyBinding{}))[0]
definitionsGVR schema.GroupVersionResource = must(fakeRestMapper.RESTMapping(definitionGVK.GroupKind(), definitionGVK.Version)).Resource definitionsGVR schema.GroupVersionResource = must(fakeRestMapper.RESTMapping(definitionGVK.GroupKind(), definitionGVK.Version)).Resource
bindingsGVR schema.GroupVersionResource = must(fakeRestMapper.RESTMapping(bindingGVK.GroupKind(), bindingGVK.Version)).Resource bindingsGVR schema.GroupVersionResource = must(fakeRestMapper.RESTMapping(bindingGVK.GroupKind(), bindingGVK.Version)).Resource
// Common objects // Common objects
denyPolicy *v1alpha1.ValidatingAdmissionPolicy = &v1alpha1.ValidatingAdmissionPolicy{ denyPolicy *v1beta1.ValidatingAdmissionPolicy = &v1beta1.ValidatingAdmissionPolicy{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "denypolicy.example.com", Name: "denypolicy.example.com",
ResourceVersion: "1", ResourceVersion: "1",
}, },
Spec: v1alpha1.ValidatingAdmissionPolicySpec{ Spec: v1beta1.ValidatingAdmissionPolicySpec{
ParamKind: &v1alpha1.ParamKind{ ParamKind: &v1beta1.ParamKind{
APIVersion: paramsGVK.GroupVersion().String(), APIVersion: paramsGVK.GroupVersion().String(),
Kind: paramsGVK.Kind, Kind: paramsGVK.Kind,
}, },
FailurePolicy: ptrTo(v1alpha1.Fail), FailurePolicy: ptrTo(v1beta1.Fail),
Validations: []v1alpha1.Validation{ Validations: []v1beta1.Validation{
{ {
Expression: "messageId for deny policy", Expression: "messageId for deny policy",
}, },
@ -156,61 +156,61 @@ var (
}, },
} }
denyBinding *v1alpha1.ValidatingAdmissionPolicyBinding = &v1alpha1.ValidatingAdmissionPolicyBinding{ denyBinding *v1beta1.ValidatingAdmissionPolicyBinding = &v1beta1.ValidatingAdmissionPolicyBinding{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "denybinding.example.com", Name: "denybinding.example.com",
ResourceVersion: "1", ResourceVersion: "1",
}, },
Spec: v1alpha1.ValidatingAdmissionPolicyBindingSpec{ Spec: v1beta1.ValidatingAdmissionPolicyBindingSpec{
PolicyName: denyPolicy.Name, PolicyName: denyPolicy.Name,
ParamRef: &v1alpha1.ParamRef{ ParamRef: &v1beta1.ParamRef{
Name: fakeParams.GetName(), Name: fakeParams.GetName(),
Namespace: fakeParams.GetNamespace(), Namespace: fakeParams.GetNamespace(),
// fake object tracker does not populate defaults // fake object tracker does not populate defaults
ParameterNotFoundAction: ptrTo(v1alpha1.DenyAction), ParameterNotFoundAction: v1beta1.DenyAction,
}, },
ValidationActions: []v1alpha1.ValidationAction{v1alpha1.Deny}, ValidationActions: []v1beta1.ValidationAction{v1beta1.Deny},
}, },
} }
denyBindingWithNoParamRef *v1alpha1.ValidatingAdmissionPolicyBinding = &v1alpha1.ValidatingAdmissionPolicyBinding{ denyBindingWithNoParamRef *v1beta1.ValidatingAdmissionPolicyBinding = &v1beta1.ValidatingAdmissionPolicyBinding{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "denybinding.example.com", Name: "denybinding.example.com",
ResourceVersion: "1", ResourceVersion: "1",
}, },
Spec: v1alpha1.ValidatingAdmissionPolicyBindingSpec{ Spec: v1beta1.ValidatingAdmissionPolicyBindingSpec{
PolicyName: denyPolicy.Name, PolicyName: denyPolicy.Name,
ValidationActions: []v1alpha1.ValidationAction{v1alpha1.Deny}, ValidationActions: []v1beta1.ValidationAction{v1beta1.Deny},
}, },
} }
denyBindingWithAudit = &v1alpha1.ValidatingAdmissionPolicyBinding{ denyBindingWithAudit = &v1beta1.ValidatingAdmissionPolicyBinding{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "denybinding.example.com", Name: "denybinding.example.com",
ResourceVersion: "1", ResourceVersion: "1",
}, },
Spec: v1alpha1.ValidatingAdmissionPolicyBindingSpec{ Spec: v1beta1.ValidatingAdmissionPolicyBindingSpec{
PolicyName: denyPolicy.Name, PolicyName: denyPolicy.Name,
ValidationActions: []v1alpha1.ValidationAction{v1alpha1.Audit}, ValidationActions: []v1beta1.ValidationAction{v1beta1.Audit},
}, },
} }
denyBindingWithWarn = &v1alpha1.ValidatingAdmissionPolicyBinding{ denyBindingWithWarn = &v1beta1.ValidatingAdmissionPolicyBinding{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "denybinding.example.com", Name: "denybinding.example.com",
ResourceVersion: "1", ResourceVersion: "1",
}, },
Spec: v1alpha1.ValidatingAdmissionPolicyBindingSpec{ Spec: v1beta1.ValidatingAdmissionPolicyBindingSpec{
PolicyName: denyPolicy.Name, PolicyName: denyPolicy.Name,
ValidationActions: []v1alpha1.ValidationAction{v1alpha1.Warn}, ValidationActions: []v1beta1.ValidationAction{v1beta1.Warn},
}, },
} }
denyBindingWithAll = &v1alpha1.ValidatingAdmissionPolicyBinding{ denyBindingWithAll = &v1beta1.ValidatingAdmissionPolicyBinding{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "denybinding.example.com", Name: "denybinding.example.com",
ResourceVersion: "1", ResourceVersion: "1",
}, },
Spec: v1alpha1.ValidatingAdmissionPolicyBindingSpec{ Spec: v1beta1.ValidatingAdmissionPolicyBindingSpec{
PolicyName: denyPolicy.Name, PolicyName: denyPolicy.Name,
ValidationActions: []v1alpha1.ValidationAction{v1alpha1.Deny, v1alpha1.Warn, v1alpha1.Audit}, ValidationActions: []v1beta1.ValidationAction{v1beta1.Deny, v1beta1.Warn, v1beta1.Audit},
}, },
} }
) )
@ -275,7 +275,7 @@ func (f *fakeCompiler) Compile(
return &fakeFilter{} return &fakeFilter{}
} }
func (f *fakeCompiler) RegisterDefinition(definition *v1alpha1.ValidatingAdmissionPolicy, compileFunc func([]cel.ExpressionAccessor, cel.OptionalVariableDeclarations) cel.Filter) { func (f *fakeCompiler) RegisterDefinition(definition *v1beta1.ValidatingAdmissionPolicy, compileFunc func([]cel.ExpressionAccessor, cel.OptionalVariableDeclarations) cel.Filter) {
//Key must be something that we can decipher from the inputs to Validate so using expression which will be passed to validate on the filter //Key must be something that we can decipher from the inputs to Validate so using expression which will be passed to validate on the filter
key := definition.Spec.Validations[0].Expression key := definition.Spec.Validations[0].Expression
if compileFunc != nil { if compileFunc != nil {
@ -321,7 +321,7 @@ type fakeValidator struct {
ValidateFunc func(ctx context.Context, versionedAttr *admission.VersionedAttributes, versionedParams runtime.Object, namespace *v1.Namespace, runtimeCELCostBudget int64, authz authorizer.Authorizer) ValidateResult ValidateFunc func(ctx context.Context, versionedAttr *admission.VersionedAttributes, versionedParams runtime.Object, namespace *v1.Namespace, runtimeCELCostBudget int64, authz authorizer.Authorizer) ValidateResult
} }
func (f *fakeValidator) RegisterDefinition(definition *v1alpha1.ValidatingAdmissionPolicy, validateFunc func(ctx context.Context, versionedAttr *admission.VersionedAttributes, versionedParams runtime.Object, namespace *v1.Namespace, runtimeCELCostBudget int64, authz authorizer.Authorizer) ValidateResult) { func (f *fakeValidator) RegisterDefinition(definition *v1beta1.ValidatingAdmissionPolicy, validateFunc func(ctx context.Context, versionedAttr *admission.VersionedAttributes, versionedParams runtime.Object, namespace *v1.Namespace, runtimeCELCostBudget int64, authz authorizer.Authorizer) ValidateResult) {
//Key must be something that we can decipher from the inputs to Validate so using message which will be on the validationCondition object of evalResult //Key must be something that we can decipher from the inputs to Validate so using message which will be on the validationCondition object of evalResult
var key string var key string
if len(definition.Spec.Validations) > 0 { if len(definition.Spec.Validations) > 0 {
@ -354,11 +354,11 @@ func (f *fakeMatcher) GetNamespace(name string) (*v1.Namespace, error) {
type fakeMatcher struct { type fakeMatcher struct {
DefaultMatch bool DefaultMatch bool
DefinitionMatchFuncs map[namespacedName]func(*v1alpha1.ValidatingAdmissionPolicy, admission.Attributes) bool DefinitionMatchFuncs map[namespacedName]func(*v1beta1.ValidatingAdmissionPolicy, admission.Attributes) bool
BindingMatchFuncs map[namespacedName]func(*v1alpha1.ValidatingAdmissionPolicyBinding, admission.Attributes) bool BindingMatchFuncs map[namespacedName]func(*v1beta1.ValidatingAdmissionPolicyBinding, admission.Attributes) bool
} }
func (f *fakeMatcher) RegisterDefinition(definition *v1alpha1.ValidatingAdmissionPolicy, matchFunc func(*v1alpha1.ValidatingAdmissionPolicy, admission.Attributes) bool) { func (f *fakeMatcher) RegisterDefinition(definition *v1beta1.ValidatingAdmissionPolicy, matchFunc func(*v1beta1.ValidatingAdmissionPolicy, admission.Attributes) bool) {
namespace, name := definition.Namespace, definition.Name namespace, name := definition.Namespace, definition.Name
key := namespacedName{ key := namespacedName{
name: name, name: name,
@ -367,13 +367,13 @@ func (f *fakeMatcher) RegisterDefinition(definition *v1alpha1.ValidatingAdmissio
if matchFunc != nil { if matchFunc != nil {
if f.DefinitionMatchFuncs == nil { if f.DefinitionMatchFuncs == nil {
f.DefinitionMatchFuncs = make(map[namespacedName]func(*v1alpha1.ValidatingAdmissionPolicy, admission.Attributes) bool) f.DefinitionMatchFuncs = make(map[namespacedName]func(*v1beta1.ValidatingAdmissionPolicy, admission.Attributes) bool)
} }
f.DefinitionMatchFuncs[key] = matchFunc f.DefinitionMatchFuncs[key] = matchFunc
} }
} }
func (f *fakeMatcher) RegisterBinding(binding *v1alpha1.ValidatingAdmissionPolicyBinding, matchFunc func(*v1alpha1.ValidatingAdmissionPolicyBinding, admission.Attributes) bool) { func (f *fakeMatcher) RegisterBinding(binding *v1beta1.ValidatingAdmissionPolicyBinding, matchFunc func(*v1beta1.ValidatingAdmissionPolicyBinding, admission.Attributes) bool) {
namespace, name := binding.Namespace, binding.Name namespace, name := binding.Namespace, binding.Name
key := namespacedName{ key := namespacedName{
name: name, name: name,
@ -382,7 +382,7 @@ func (f *fakeMatcher) RegisterBinding(binding *v1alpha1.ValidatingAdmissionPolic
if matchFunc != nil { if matchFunc != nil {
if f.BindingMatchFuncs == nil { if f.BindingMatchFuncs == nil {
f.BindingMatchFuncs = make(map[namespacedName]func(*v1alpha1.ValidatingAdmissionPolicyBinding, admission.Attributes) bool) f.BindingMatchFuncs = make(map[namespacedName]func(*v1beta1.ValidatingAdmissionPolicyBinding, admission.Attributes) bool)
} }
f.BindingMatchFuncs[key] = matchFunc f.BindingMatchFuncs[key] = matchFunc
} }
@ -390,7 +390,7 @@ func (f *fakeMatcher) RegisterBinding(binding *v1alpha1.ValidatingAdmissionPolic
// Matches says whether this policy definition matches the provided admission // Matches says whether this policy definition matches the provided admission
// resource request // resource request
func (f *fakeMatcher) DefinitionMatches(a admission.Attributes, o admission.ObjectInterfaces, definition *v1alpha1.ValidatingAdmissionPolicy) (bool, schema.GroupVersionKind, error) { func (f *fakeMatcher) DefinitionMatches(a admission.Attributes, o admission.ObjectInterfaces, definition *v1beta1.ValidatingAdmissionPolicy) (bool, schema.GroupVersionKind, error) {
namespace, name := definition.Namespace, definition.Name namespace, name := definition.Namespace, definition.Name
key := namespacedName{ key := namespacedName{
name: name, name: name,
@ -406,7 +406,7 @@ func (f *fakeMatcher) DefinitionMatches(a admission.Attributes, o admission.Obje
// Matches says whether this policy definition matches the provided admission // Matches says whether this policy definition matches the provided admission
// resource request // resource request
func (f *fakeMatcher) BindingMatches(a admission.Attributes, o admission.ObjectInterfaces, binding *v1alpha1.ValidatingAdmissionPolicyBinding) (bool, error) { func (f *fakeMatcher) BindingMatches(a admission.Attributes, o admission.ObjectInterfaces, binding *v1beta1.ValidatingAdmissionPolicyBinding) (bool, error) {
namespace, name := binding.Namespace, binding.Name namespace, name := binding.Namespace, binding.Name
key := namespacedName{ key := namespacedName{
name: name, name: name,
@ -516,7 +516,7 @@ func setupTestCommon(t *testing.T, compiler cel.FilterCompiler, matcher Matcher,
i := 0 i := 0
dummyPolicy := &v1alpha1.ValidatingAdmissionPolicy{ dummyPolicy := &v1beta1.ValidatingAdmissionPolicy{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "dummypolicy.example.com", Name: "dummypolicy.example.com",
Annotations: map[string]string{ Annotations: map[string]string{
@ -525,7 +525,7 @@ func setupTestCommon(t *testing.T, compiler cel.FilterCompiler, matcher Matcher,
}, },
} }
dummyBinding := &v1alpha1.ValidatingAdmissionPolicyBinding{ dummyBinding := &v1beta1.ValidatingAdmissionPolicyBinding{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "dummybinding.example.com", Name: "dummybinding.example.com",
Annotations: map[string]string{ Annotations: map[string]string{
@ -581,7 +581,7 @@ func (c *celAdmissionController) getCurrentObject(obj runtime.Object) (runtime.O
defer c.policyController.mutex.RUnlock() defer c.policyController.mutex.RUnlock()
switch obj.(type) { switch obj.(type) {
case *v1alpha1.ValidatingAdmissionPolicyBinding: case *v1beta1.ValidatingAdmissionPolicyBinding:
nn := getNamespaceName(accessor.GetNamespace(), accessor.GetName()) nn := getNamespaceName(accessor.GetNamespace(), accessor.GetName())
info, ok := c.policyController.bindingInfos[nn] info, ok := c.policyController.bindingInfos[nn]
if !ok { if !ok {
@ -589,7 +589,7 @@ func (c *celAdmissionController) getCurrentObject(obj runtime.Object) (runtime.O
} }
return info.lastReconciledValue, nil return info.lastReconciledValue, nil
case *v1alpha1.ValidatingAdmissionPolicy: case *v1beta1.ValidatingAdmissionPolicy:
nn := getNamespaceName(accessor.GetNamespace(), accessor.GetName()) nn := getNamespaceName(accessor.GetNamespace(), accessor.GetName())
info, ok := c.policyController.definitionInfo[nn] info, ok := c.policyController.definitionInfo[nn]
if !ok { if !ok {
@ -601,7 +601,7 @@ func (c *celAdmissionController) getCurrentObject(obj runtime.Object) (runtime.O
// If test isn't trying to fetch a policy or binding, assume it is // If test isn't trying to fetch a policy or binding, assume it is
// fetching a param // fetching a param
paramSourceGVK := obj.GetObjectKind().GroupVersionKind() paramSourceGVK := obj.GetObjectKind().GroupVersionKind()
paramKind := v1alpha1.ParamKind{ paramKind := v1beta1.ParamKind{
APIVersion: paramSourceGVK.GroupVersion().String(), APIVersion: paramSourceGVK.GroupVersion().String(),
Kind: paramSourceGVK.Kind, Kind: paramSourceGVK.Kind,
} }
@ -915,7 +915,7 @@ func TestDefinitionDoesntMatch(t *testing.T) {
} }
}) })
matcher.RegisterDefinition(denyPolicy, func(vap *v1alpha1.ValidatingAdmissionPolicy, a admission.Attributes) bool { matcher.RegisterDefinition(denyPolicy, func(vap *v1beta1.ValidatingAdmissionPolicy, a admission.Attributes) bool {
// Match names with even-numbered length // Match names with even-numbered length
obj := a.GetObject() obj := a.GetObject()
@ -1030,19 +1030,19 @@ func TestReconfigureBinding(t *testing.T) {
} }
}) })
denyBinding2 := &v1alpha1.ValidatingAdmissionPolicyBinding{ denyBinding2 := &v1beta1.ValidatingAdmissionPolicyBinding{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "denybinding.example.com", Name: "denybinding.example.com",
ResourceVersion: "2", ResourceVersion: "2",
}, },
Spec: v1alpha1.ValidatingAdmissionPolicyBindingSpec{ Spec: v1beta1.ValidatingAdmissionPolicyBindingSpec{
PolicyName: denyPolicy.Name, PolicyName: denyPolicy.Name,
ParamRef: &v1alpha1.ParamRef{ ParamRef: &v1beta1.ParamRef{
Name: fakeParams2.GetName(), Name: fakeParams2.GetName(),
Namespace: fakeParams2.GetNamespace(), Namespace: fakeParams2.GetNamespace(),
ParameterNotFoundAction: ptrTo(v1alpha1.DenyAction), ParameterNotFoundAction: v1beta1.DenyAction,
}, },
ValidationActions: []v1alpha1.ValidationAction{v1alpha1.Deny}, ValidationActions: []v1beta1.ValidationAction{v1beta1.Deny},
}, },
} }
@ -1251,7 +1251,7 @@ func TestInvalidParamSourceGVK(t *testing.T) {
passedParams := make(chan *unstructured.Unstructured) passedParams := make(chan *unstructured.Unstructured)
badPolicy := *denyPolicy badPolicy := *denyPolicy
badPolicy.Spec.ParamKind = &v1alpha1.ParamKind{ badPolicy.Spec.ParamKind = &v1beta1.ParamKind{
APIVersion: paramsGVK.GroupVersion().String(), APIVersion: paramsGVK.GroupVersion().String(),
Kind: "BadParamKind", Kind: "BadParamKind",
} }
@ -1499,13 +1499,13 @@ func TestMultiplePoliciesSharedParamType(t *testing.T) {
// Use ConfigMap native-typed param // Use ConfigMap native-typed param
policy1 := *denyPolicy policy1 := *denyPolicy
policy1.Name = "denypolicy1.example.com" policy1.Name = "denypolicy1.example.com"
policy1.Spec = v1alpha1.ValidatingAdmissionPolicySpec{ policy1.Spec = v1beta1.ValidatingAdmissionPolicySpec{
ParamKind: &v1alpha1.ParamKind{ ParamKind: &v1beta1.ParamKind{
APIVersion: paramsGVK.GroupVersion().String(), APIVersion: paramsGVK.GroupVersion().String(),
Kind: paramsGVK.Kind, Kind: paramsGVK.Kind,
}, },
FailurePolicy: ptrTo(v1alpha1.Fail), FailurePolicy: ptrTo(v1beta1.Fail),
Validations: []v1alpha1.Validation{ Validations: []v1beta1.Validation{
{ {
Expression: "policy1", Expression: "policy1",
}, },
@ -1514,13 +1514,13 @@ func TestMultiplePoliciesSharedParamType(t *testing.T) {
policy2 := *denyPolicy policy2 := *denyPolicy
policy2.Name = "denypolicy2.example.com" policy2.Name = "denypolicy2.example.com"
policy2.Spec = v1alpha1.ValidatingAdmissionPolicySpec{ policy2.Spec = v1beta1.ValidatingAdmissionPolicySpec{
ParamKind: &v1alpha1.ParamKind{ ParamKind: &v1beta1.ParamKind{
APIVersion: paramsGVK.GroupVersion().String(), APIVersion: paramsGVK.GroupVersion().String(),
Kind: paramsGVK.Kind, Kind: paramsGVK.Kind,
}, },
FailurePolicy: ptrTo(v1alpha1.Fail), FailurePolicy: ptrTo(v1beta1.Fail),
Validations: []v1alpha1.Validation{ Validations: []v1beta1.Validation{
{ {
Expression: "policy2", Expression: "policy2",
}, },
@ -1665,7 +1665,7 @@ func TestNativeTypeParam(t *testing.T) {
// Use ConfigMap native-typed param // Use ConfigMap native-typed param
nativeTypeParamPolicy := *denyPolicy nativeTypeParamPolicy := *denyPolicy
nativeTypeParamPolicy.Spec.ParamKind = &v1alpha1.ParamKind{ nativeTypeParamPolicy.Spec.ParamKind = &v1beta1.ParamKind{
APIVersion: "v1", APIVersion: "v1",
Kind: "ConfigMap", Kind: "ConfigMap",
} }
@ -1800,7 +1800,7 @@ func TestAuditValidationAction(t *testing.T) {
expected := []validationFailureValue{{ expected := []validationFailureValue{{
ExpressionIndex: 0, ExpressionIndex: 0,
Message: "I'm sorry Dave", Message: "I'm sorry Dave",
ValidationActions: []v1alpha1.ValidationAction{v1alpha1.Audit}, ValidationActions: []v1beta1.ValidationAction{v1beta1.Audit},
Binding: "denybinding.example.com", Binding: "denybinding.example.com",
Policy: noParamSourcePolicy.Name, Policy: noParamSourcePolicy.Name,
}} }}
@ -1931,7 +1931,7 @@ func TestAllValidationActions(t *testing.T) {
expected := []validationFailureValue{{ expected := []validationFailureValue{{
ExpressionIndex: 0, ExpressionIndex: 0,
Message: "I'm sorry Dave", Message: "I'm sorry Dave",
ValidationActions: []v1alpha1.ValidationAction{v1alpha1.Deny, v1alpha1.Warn, v1alpha1.Audit}, ValidationActions: []v1beta1.ValidationAction{v1beta1.Deny, v1beta1.Warn, v1beta1.Audit},
Binding: "denybinding.example.com", Binding: "denybinding.example.com",
Policy: noParamSourcePolicy.Name, Policy: noParamSourcePolicy.Name,
}} }}
@ -1957,13 +1957,13 @@ func TestNamespaceParamRefName(t *testing.T) {
// Use ConfigMap native-typed param // Use ConfigMap native-typed param
nativeTypeParamPolicy := *denyPolicy nativeTypeParamPolicy := *denyPolicy
nativeTypeParamPolicy.Spec.ParamKind = &v1alpha1.ParamKind{ nativeTypeParamPolicy.Spec.ParamKind = &v1beta1.ParamKind{
APIVersion: "v1", APIVersion: "v1",
Kind: "ConfigMap", Kind: "ConfigMap",
} }
namespaceParamBinding := *denyBinding namespaceParamBinding := *denyBinding
namespaceParamBinding.Spec.ParamRef = &v1alpha1.ParamRef{ namespaceParamBinding.Spec.ParamRef = &v1beta1.ParamRef{
Name: "replicas-test.example.com", Name: "replicas-test.example.com",
} }
@ -2194,7 +2194,7 @@ func testParamRefCase(t *testing.T, paramIsClusterScoped, nameIsSet, namespaceIs
// Create a cluster scoped and a namespace scoped CRD // Create a cluster scoped and a namespace scoped CRD
policy := *denyPolicy policy := *denyPolicy
binding := *denyBinding binding := *denyBinding
binding.Spec.ParamRef = &v1alpha1.ParamRef{} binding.Spec.ParamRef = &v1beta1.ParamRef{}
paramRef := binding.Spec.ParamRef paramRef := binding.Spec.ParamRef
shouldErrorOnClusterScopedRequests := !namespaceIsSet && !paramIsClusterScoped shouldErrorOnClusterScopedRequests := !namespaceIsSet && !paramIsClusterScoped
@ -2208,12 +2208,12 @@ func testParamRefCase(t *testing.T, paramIsClusterScoped, nameIsSet, namespaceIs
otherNonmatchingLabels := labels.Set{"notaffiliated": "no"} otherNonmatchingLabels := labels.Set{"notaffiliated": "no"}
if paramIsClusterScoped { if paramIsClusterScoped {
policy.Spec.ParamKind = &v1alpha1.ParamKind{ policy.Spec.ParamKind = &v1beta1.ParamKind{
APIVersion: clusterScopedParamsGVK.GroupVersion().String(), APIVersion: clusterScopedParamsGVK.GroupVersion().String(),
Kind: clusterScopedParamsGVK.Kind, Kind: clusterScopedParamsGVK.Kind,
} }
} else { } else {
policy.Spec.ParamKind = &v1alpha1.ParamKind{ policy.Spec.ParamKind = &v1beta1.ParamKind{
APIVersion: paramsGVK.GroupVersion().String(), APIVersion: paramsGVK.GroupVersion().String(),
Kind: paramsGVK.Kind, Kind: paramsGVK.Kind,
} }
@ -2232,9 +2232,9 @@ func testParamRefCase(t *testing.T, paramIsClusterScoped, nameIsSet, namespaceIs
} }
if denyNotFound { if denyNotFound {
paramRef.ParameterNotFoundAction = ptrTo(v1alpha1.DenyAction) paramRef.ParameterNotFoundAction = v1beta1.DenyAction
} else { } else {
paramRef.ParameterNotFoundAction = ptrTo(v1alpha1.AllowAction) paramRef.ParameterNotFoundAction = v1beta1.AllowAction
} }
compiler := &fakeCompiler{} compiler := &fakeCompiler{}
@ -2486,13 +2486,13 @@ func TestNamespaceParamRefClusterScopedParamError(t *testing.T) {
// Use ValidatingAdmissionPolicy for param type since it is cluster-scoped // Use ValidatingAdmissionPolicy for param type since it is cluster-scoped
nativeTypeParamPolicy := *denyPolicy nativeTypeParamPolicy := *denyPolicy
nativeTypeParamPolicy.Spec.ParamKind = &v1alpha1.ParamKind{ nativeTypeParamPolicy.Spec.ParamKind = &v1beta1.ParamKind{
APIVersion: "admissionregistration.k8s.io/v1alpha1", APIVersion: "admissionregistration.k8s.io/v1beta1",
Kind: "ValidatingAdmissionPolicy", Kind: "ValidatingAdmissionPolicy",
} }
namespaceParamBinding := *denyBinding namespaceParamBinding := *denyBinding
namespaceParamBinding.Spec.ParamRef = &v1alpha1.ParamRef{ namespaceParamBinding.Spec.ParamRef = &v1beta1.ParamRef{
Name: "other-param-to-use-with-no-label.example.com", Name: "other-param-to-use-with-no-label.example.com",
Namespace: "mynamespace", Namespace: "mynamespace",
} }
@ -2507,7 +2507,7 @@ func TestNamespaceParamRefClusterScopedParamError(t *testing.T) {
validator.RegisterDefinition(&nativeTypeParamPolicy, func(ctx context.Context, versionedAttr *admission.VersionedAttributes, versionedParams runtime.Object, namespace *v1.Namespace, runtimeCELCostBudget int64, authz authorizer.Authorizer) ValidateResult { validator.RegisterDefinition(&nativeTypeParamPolicy, func(ctx context.Context, versionedAttr *admission.VersionedAttributes, versionedParams runtime.Object, namespace *v1.Namespace, runtimeCELCostBudget int64, authz authorizer.Authorizer) ValidateResult {
evaluations.Add(1) evaluations.Add(1)
if _, ok := versionedParams.(*v1alpha1.ValidatingAdmissionPolicy); ok { if _, ok := versionedParams.(*v1beta1.ValidatingAdmissionPolicy); ok {
return ValidateResult{ return ValidateResult{
Decisions: []PolicyDecision{ Decisions: []PolicyDecision{
{ {

View File

@ -25,7 +25,7 @@ import (
"sync/atomic" "sync/atomic"
"time" "time"
"k8s.io/api/admissionregistration/v1alpha1" "k8s.io/api/admissionregistration/v1beta1"
v1 "k8s.io/api/core/v1" v1 "k8s.io/api/core/v1"
k8serrors "k8s.io/apimachinery/pkg/api/errors" k8serrors "k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/api/meta"
@ -81,8 +81,8 @@ type policyData struct {
// that determined the decision // that determined the decision
type policyDecisionWithMetadata struct { type policyDecisionWithMetadata struct {
PolicyDecision PolicyDecision
Definition *v1alpha1.ValidatingAdmissionPolicy Definition *v1beta1.ValidatingAdmissionPolicy
Binding *v1alpha1.ValidatingAdmissionPolicyBinding Binding *v1beta1.ValidatingAdmissionPolicyBinding
} }
// namespaceName is used as a key in definitionInfo and bindingInfos // namespaceName is used as a key in definitionInfo and bindingInfos
@ -98,7 +98,7 @@ type definitionInfo struct {
// Last value seen by this controller to be used in policy enforcement // Last value seen by this controller to be used in policy enforcement
// May not be nil // May not be nil
lastReconciledValue *v1alpha1.ValidatingAdmissionPolicy lastReconciledValue *v1beta1.ValidatingAdmissionPolicy
} }
type bindingInfo struct { type bindingInfo struct {
@ -107,7 +107,7 @@ type bindingInfo struct {
// Last value seen by this controller to be used in policy enforcement // Last value seen by this controller to be used in policy enforcement
// May not be nil // May not be nil
lastReconciledValue *v1alpha1.ValidatingAdmissionPolicyBinding lastReconciledValue *v1beta1.ValidatingAdmissionPolicyBinding
} }
type paramInfo struct { type paramInfo struct {
@ -141,10 +141,10 @@ func NewAdmissionController(
informerFactory, informerFactory,
nil, nil,
NewMatcher(matching.NewMatcher(informerFactory.Core().V1().Namespaces().Lister(), client)), NewMatcher(matching.NewMatcher(informerFactory.Core().V1().Namespaces().Lister(), client)),
generic.NewInformer[*v1alpha1.ValidatingAdmissionPolicy]( generic.NewInformer[*v1beta1.ValidatingAdmissionPolicy](
informerFactory.Admissionregistration().V1alpha1().ValidatingAdmissionPolicies().Informer()), informerFactory.Admissionregistration().V1beta1().ValidatingAdmissionPolicies().Informer()),
generic.NewInformer[*v1alpha1.ValidatingAdmissionPolicyBinding]( generic.NewInformer[*v1beta1.ValidatingAdmissionPolicyBinding](
informerFactory.Admissionregistration().V1alpha1().ValidatingAdmissionPolicyBindings().Informer()), informerFactory.Admissionregistration().V1beta1().ValidatingAdmissionPolicyBindings().Informer()),
), ),
authz: authz, authz: authz,
} }
@ -192,21 +192,21 @@ func (c *celAdmissionController) Validate(
var deniedDecisions []policyDecisionWithMetadata var deniedDecisions []policyDecisionWithMetadata
addConfigError := func(err error, definition *v1alpha1.ValidatingAdmissionPolicy, binding *v1alpha1.ValidatingAdmissionPolicyBinding) { addConfigError := func(err error, definition *v1beta1.ValidatingAdmissionPolicy, binding *v1beta1.ValidatingAdmissionPolicyBinding) {
// we always default the FailurePolicy if it is unset and validate it in API level // we always default the FailurePolicy if it is unset and validate it in API level
var policy v1alpha1.FailurePolicyType var policy v1beta1.FailurePolicyType
if definition.Spec.FailurePolicy == nil { if definition.Spec.FailurePolicy == nil {
policy = v1alpha1.Fail policy = v1beta1.Fail
} else { } else {
policy = *definition.Spec.FailurePolicy policy = *definition.Spec.FailurePolicy
} }
// apply FailurePolicy specified in ValidatingAdmissionPolicy, the default would be Fail // apply FailurePolicy specified in ValidatingAdmissionPolicy, the default would be Fail
switch policy { switch policy {
case v1alpha1.Ignore: case v1beta1.Ignore:
// TODO: add metrics for ignored error here // TODO: add metrics for ignored error here
return return
case v1alpha1.Fail: case v1beta1.Fail:
var message string var message string
if binding == nil { if binding == nil {
message = fmt.Errorf("failed to configure policy: %w", err).Error() message = fmt.Errorf("failed to configure policy: %w", err).Error()
@ -336,17 +336,17 @@ func (c *celAdmissionController) Validate(
case ActionDeny: case ActionDeny:
for _, action := range binding.Spec.ValidationActions { for _, action := range binding.Spec.ValidationActions {
switch action { switch action {
case v1alpha1.Deny: case v1beta1.Deny:
deniedDecisions = append(deniedDecisions, policyDecisionWithMetadata{ deniedDecisions = append(deniedDecisions, policyDecisionWithMetadata{
Definition: definition, Definition: definition,
Binding: binding, Binding: binding,
PolicyDecision: decision, PolicyDecision: decision,
}) })
celmetrics.Metrics.ObserveRejection(ctx, decision.Elapsed, definition.Name, binding.Name, "active") celmetrics.Metrics.ObserveRejection(ctx, decision.Elapsed, definition.Name, binding.Name, "active")
case v1alpha1.Audit: case v1beta1.Audit:
c.publishValidationFailureAnnotation(binding, i, decision, versionedAttr) c.publishValidationFailureAnnotation(binding, i, decision, versionedAttr)
celmetrics.Metrics.ObserveAudit(ctx, decision.Elapsed, definition.Name, binding.Name, "active") celmetrics.Metrics.ObserveAudit(ctx, decision.Elapsed, definition.Name, binding.Name, "active")
case v1alpha1.Warn: case v1beta1.Warn:
warning.AddWarning(ctx, "", fmt.Sprintf("Validation failed for ValidatingAdmissionPolicy '%s' with binding '%s': %s", definition.Name, binding.Name, decision.Message)) warning.AddWarning(ctx, "", fmt.Sprintf("Validation failed for ValidatingAdmissionPolicy '%s' with binding '%s': %s", definition.Name, binding.Name, decision.Message))
celmetrics.Metrics.ObserveWarn(ctx, decision.Elapsed, definition.Name, binding.Name, "active") celmetrics.Metrics.ObserveWarn(ctx, decision.Elapsed, definition.Name, binding.Name, "active")
} }
@ -412,9 +412,9 @@ func (c *celAdmissionController) Validate(
// Returns objects to use to evaluate the policy // Returns objects to use to evaluate the policy
func (c *celAdmissionController) collectParams( func (c *celAdmissionController) collectParams(
paramKind *v1alpha1.ParamKind, paramKind *v1beta1.ParamKind,
info paramInfo, info paramInfo,
paramRef *v1alpha1.ParamRef, paramRef *v1beta1.ParamRef,
namespace string, namespace string,
) ([]runtime.Object, error) { ) ([]runtime.Object, error) {
// If definition has paramKind, paramRef is required in binding. // If definition has paramKind, paramRef is required in binding.
@ -520,14 +520,14 @@ func (c *celAdmissionController) collectParams(
} }
// Apply fail action for params not found case // Apply fail action for params not found case
if len(params) == 0 && paramRef.ParameterNotFoundAction != nil && *paramRef.ParameterNotFoundAction == v1alpha1.DenyAction { if len(params) == 0 && paramRef.ParameterNotFoundAction != nil && *paramRef.ParameterNotFoundAction == v1beta1.DenyAction {
return nil, errors.New("no params found for policy binding with `Deny` parameterNotFoundAction") return nil, errors.New("no params found for policy binding with `Deny` parameterNotFoundAction")
} }
return params, nil return params, nil
} }
func (c *celAdmissionController) publishValidationFailureAnnotation(binding *v1alpha1.ValidatingAdmissionPolicyBinding, expressionIndex int, decision PolicyDecision, attributes admission.Attributes) { func (c *celAdmissionController) publishValidationFailureAnnotation(binding *v1beta1.ValidatingAdmissionPolicyBinding, expressionIndex int, decision PolicyDecision, attributes admission.Attributes) {
key := "validation.policy.admission.k8s.io/validation_failure" key := "validation.policy.admission.k8s.io/validation_failure"
// Marshal to a list of failures since, in the future, we may need to support multiple failures // Marshal to a list of failures since, in the future, we may need to support multiple failures
valueJson, err := utiljson.Marshal([]validationFailureValue{{ valueJson, err := utiljson.Marshal([]validationFailureValue{{
@ -561,11 +561,11 @@ func (c *celAdmissionController) refreshPolicies() {
// validationFailureValue defines the JSON format of a "validation.policy.admission.k8s.io/validation_failure" audit // validationFailureValue defines the JSON format of a "validation.policy.admission.k8s.io/validation_failure" audit
// annotation value. // annotation value.
type validationFailureValue struct { type validationFailureValue struct {
Message string `json:"message"` Message string `json:"message"`
Policy string `json:"policy"` Policy string `json:"policy"`
Binding string `json:"binding"` Binding string `json:"binding"`
ExpressionIndex int `json:"expressionIndex"` ExpressionIndex int `json:"expressionIndex"`
ValidationActions []v1alpha1.ValidationAction `json:"validationActions"` ValidationActions []v1beta1.ValidationAction `json:"validationActions"`
} }
type auditAnnotationCollector struct { type auditAnnotationCollector struct {

View File

@ -23,7 +23,7 @@ import (
"time" "time"
v1 "k8s.io/api/admissionregistration/v1" v1 "k8s.io/api/admissionregistration/v1"
"k8s.io/api/admissionregistration/v1alpha1" "k8s.io/api/admissionregistration/v1beta1"
corev1 "k8s.io/api/core/v1" corev1 "k8s.io/api/core/v1"
apiequality "k8s.io/apimachinery/pkg/api/equality" apiequality "k8s.io/apimachinery/pkg/api/equality"
"k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/api/meta"
@ -49,8 +49,8 @@ type policyController struct {
dynamicClient dynamic.Interface dynamicClient dynamic.Interface
informerFactory informers.SharedInformerFactory informerFactory informers.SharedInformerFactory
restMapper meta.RESTMapper restMapper meta.RESTMapper
policyDefinitionsController generic.Controller[*v1alpha1.ValidatingAdmissionPolicy] policyDefinitionsController generic.Controller[*v1beta1.ValidatingAdmissionPolicy]
policyBindingController generic.Controller[*v1alpha1.ValidatingAdmissionPolicyBinding] policyBindingController generic.Controller[*v1beta1.ValidatingAdmissionPolicyBinding]
// Provided to the policy's Compile function as an injected dependency to // Provided to the policy's Compile function as an injected dependency to
// assist with compiling its expressions to CEL // assist with compiling its expressions to CEL
@ -70,7 +70,7 @@ type policyController struct {
cachedPolicies []policyData cachedPolicies []policyData
// controller and metadata // controller and metadata
paramsCRDControllers map[v1alpha1.ParamKind]*paramInfo paramsCRDControllers map[v1beta1.ParamKind]*paramInfo
// Index for each definition namespace/name, contains all binding // Index for each definition namespace/name, contains all binding
// namespace/names known to exist for that definition // namespace/names known to exist for that definition
@ -96,15 +96,15 @@ func newPolicyController(
informerFactory informers.SharedInformerFactory, informerFactory informers.SharedInformerFactory,
filterCompiler cel.FilterCompiler, filterCompiler cel.FilterCompiler,
matcher Matcher, matcher Matcher,
policiesInformer generic.Informer[*v1alpha1.ValidatingAdmissionPolicy], policiesInformer generic.Informer[*v1beta1.ValidatingAdmissionPolicy],
bindingsInformer generic.Informer[*v1alpha1.ValidatingAdmissionPolicyBinding], bindingsInformer generic.Informer[*v1beta1.ValidatingAdmissionPolicyBinding],
) *policyController { ) *policyController {
res := &policyController{} res := &policyController{}
*res = policyController{ *res = policyController{
filterCompiler: filterCompiler, filterCompiler: filterCompiler,
definitionInfo: make(map[namespacedName]*definitionInfo), definitionInfo: make(map[namespacedName]*definitionInfo),
bindingInfos: make(map[namespacedName]*bindingInfo), bindingInfos: make(map[namespacedName]*bindingInfo),
paramsCRDControllers: make(map[v1alpha1.ParamKind]*paramInfo), paramsCRDControllers: make(map[v1beta1.ParamKind]*paramInfo),
definitionsToBindings: make(map[namespacedName]sets.Set[namespacedName]), definitionsToBindings: make(map[namespacedName]sets.Set[namespacedName]),
matcher: matcher, matcher: matcher,
newValidator: NewValidator, newValidator: NewValidator,
@ -160,14 +160,14 @@ func (c *policyController) HasSynced() bool {
return c.policyDefinitionsController.HasSynced() && c.policyBindingController.HasSynced() return c.policyDefinitionsController.HasSynced() && c.policyBindingController.HasSynced()
} }
func (c *policyController) reconcilePolicyDefinition(namespace, name string, definition *v1alpha1.ValidatingAdmissionPolicy) error { func (c *policyController) reconcilePolicyDefinition(namespace, name string, definition *v1beta1.ValidatingAdmissionPolicy) error {
c.mutex.Lock() c.mutex.Lock()
defer c.mutex.Unlock() defer c.mutex.Unlock()
err := c.reconcilePolicyDefinitionSpec(namespace, name, definition) err := c.reconcilePolicyDefinitionSpec(namespace, name, definition)
return err return err
} }
func (c *policyController) reconcilePolicyDefinitionSpec(namespace, name string, definition *v1alpha1.ValidatingAdmissionPolicy) error { func (c *policyController) reconcilePolicyDefinitionSpec(namespace, name string, definition *v1beta1.ValidatingAdmissionPolicy) error {
c.cachedPolicies = nil // invalidate cachedPolicies c.cachedPolicies = nil // invalidate cachedPolicies
// Namespace for policydefinition is empty. // Namespace for policydefinition is empty.
@ -186,7 +186,7 @@ func (c *policyController) reconcilePolicyDefinitionSpec(namespace, name string,
return nil return nil
} }
var paramSource *v1alpha1.ParamKind var paramSource *v1beta1.ParamKind
if definition != nil { if definition != nil {
paramSource = definition.Spec.ParamKind paramSource = definition.Spec.ParamKind
} }
@ -266,7 +266,7 @@ func (c *policyController) reconcilePolicyDefinitionSpec(namespace, name string,
// Ensures that there is an informer started for the given GVK to be used as a // Ensures that there is an informer started for the given GVK to be used as a
// param // param
func (c *policyController) ensureParamInfo(paramSource *v1alpha1.ParamKind, mapping *meta.RESTMapping) *paramInfo { func (c *policyController) ensureParamInfo(paramSource *v1beta1.ParamKind, mapping *meta.RESTMapping) *paramInfo {
if info, ok := c.paramsCRDControllers[*paramSource]; ok { if info, ok := c.paramsCRDControllers[*paramSource]; ok {
return info return info
} }
@ -329,7 +329,7 @@ func (c *policyController) ensureParamInfo(paramSource *v1alpha1.ParamKind, mapp
} }
func (c *policyController) reconcilePolicyBinding(namespace, name string, binding *v1alpha1.ValidatingAdmissionPolicyBinding) error { func (c *policyController) reconcilePolicyBinding(namespace, name string, binding *v1beta1.ValidatingAdmissionPolicyBinding) error {
c.mutex.Lock() c.mutex.Lock()
defer c.mutex.Unlock() defer c.mutex.Unlock()
@ -432,7 +432,7 @@ func (c *policyController) latestPolicyData() []policyData {
} }
optionalVars := cel.OptionalVariableDeclarations{HasParams: hasParam, HasAuthorizer: true} optionalVars := cel.OptionalVariableDeclarations{HasParams: hasParam, HasAuthorizer: true}
expressionOptionalVars := cel.OptionalVariableDeclarations{HasParams: hasParam, HasAuthorizer: false} expressionOptionalVars := cel.OptionalVariableDeclarations{HasParams: hasParam, HasAuthorizer: false}
failurePolicy := convertv1alpha1FailurePolicyTypeTov1FailurePolicyType(definitionInfo.lastReconciledValue.Spec.FailurePolicy) failurePolicy := convertv1beta1FailurePolicyTypeTov1FailurePolicyType(definitionInfo.lastReconciledValue.Spec.FailurePolicy)
var matcher matchconditions.Matcher = nil var matcher matchconditions.Matcher = nil
matchConditions := definitionInfo.lastReconciledValue.Spec.MatchConditions matchConditions := definitionInfo.lastReconciledValue.Spec.MatchConditions
@ -441,7 +441,7 @@ func (c *policyController) latestPolicyData() []policyData {
compositedCompiler, err := cel.NewCompositedCompiler(environment.MustBaseEnvSet(environment.DefaultCompatibilityVersion())) compositedCompiler, err := cel.NewCompositedCompiler(environment.MustBaseEnvSet(environment.DefaultCompatibilityVersion()))
if err == nil { if err == nil {
filterCompiler = compositedCompiler filterCompiler = compositedCompiler
compositedCompiler.CompileAndStoreVariables(convertV1alpha1Variables(definitionInfo.lastReconciledValue.Spec.Variables), optionalVars, environment.StoredExpressions) compositedCompiler.CompileAndStoreVariables(convertv1beta1Variables(definitionInfo.lastReconciledValue.Spec.Variables), optionalVars, environment.StoredExpressions)
} else { } else {
utilruntime.HandleError(err) utilruntime.HandleError(err)
} }
@ -454,10 +454,10 @@ func (c *policyController) latestPolicyData() []policyData {
matcher = matchconditions.NewMatcher(filterCompiler.Compile(matchExpressionAccessors, optionalVars, environment.StoredExpressions), failurePolicy, "policy", "validate", definitionInfo.lastReconciledValue.Name) matcher = matchconditions.NewMatcher(filterCompiler.Compile(matchExpressionAccessors, optionalVars, environment.StoredExpressions), failurePolicy, "policy", "validate", definitionInfo.lastReconciledValue.Name)
} }
bindingInfo.validator = c.newValidator( bindingInfo.validator = c.newValidator(
filterCompiler.Compile(convertv1alpha1Validations(definitionInfo.lastReconciledValue.Spec.Validations), optionalVars, environment.StoredExpressions), filterCompiler.Compile(convertv1beta1Validations(definitionInfo.lastReconciledValue.Spec.Validations), optionalVars, environment.StoredExpressions),
matcher, matcher,
filterCompiler.Compile(convertv1alpha1AuditAnnotations(definitionInfo.lastReconciledValue.Spec.AuditAnnotations), optionalVars, environment.StoredExpressions), filterCompiler.Compile(convertv1beta1AuditAnnotations(definitionInfo.lastReconciledValue.Spec.AuditAnnotations), optionalVars, environment.StoredExpressions),
filterCompiler.Compile(convertV1Alpha1MessageExpressions(definitionInfo.lastReconciledValue.Spec.Validations), expressionOptionalVars, environment.StoredExpressions), filterCompiler.Compile(convertv1beta1MessageExpressions(definitionInfo.lastReconciledValue.Spec.Validations), expressionOptionalVars, environment.StoredExpressions),
failurePolicy, failurePolicy,
) )
} }
@ -482,21 +482,21 @@ func (c *policyController) latestPolicyData() []policyData {
return res return res
} }
func convertv1alpha1FailurePolicyTypeTov1FailurePolicyType(policyType *v1alpha1.FailurePolicyType) *v1.FailurePolicyType { func convertv1beta1FailurePolicyTypeTov1FailurePolicyType(policyType *v1beta1.FailurePolicyType) *v1.FailurePolicyType {
if policyType == nil { if policyType == nil {
return nil return nil
} }
var v1FailPolicy v1.FailurePolicyType var v1FailPolicy v1.FailurePolicyType
if *policyType == v1alpha1.Fail { if *policyType == v1beta1.Fail {
v1FailPolicy = v1.Fail v1FailPolicy = v1.Fail
} else if *policyType == v1alpha1.Ignore { } else if *policyType == v1beta1.Ignore {
v1FailPolicy = v1.Ignore v1FailPolicy = v1.Ignore
} }
return &v1FailPolicy return &v1FailPolicy
} }
func convertv1alpha1Validations(inputValidations []v1alpha1.Validation) []cel.ExpressionAccessor { func convertv1beta1Validations(inputValidations []v1beta1.Validation) []cel.ExpressionAccessor {
celExpressionAccessor := make([]cel.ExpressionAccessor, len(inputValidations)) celExpressionAccessor := make([]cel.ExpressionAccessor, len(inputValidations))
for i, validation := range inputValidations { for i, validation := range inputValidations {
validation := ValidationCondition{ validation := ValidationCondition{
@ -509,7 +509,7 @@ func convertv1alpha1Validations(inputValidations []v1alpha1.Validation) []cel.Ex
return celExpressionAccessor return celExpressionAccessor
} }
func convertV1Alpha1MessageExpressions(inputValidations []v1alpha1.Validation) []cel.ExpressionAccessor { func convertv1beta1MessageExpressions(inputValidations []v1beta1.Validation) []cel.ExpressionAccessor {
celExpressionAccessor := make([]cel.ExpressionAccessor, len(inputValidations)) celExpressionAccessor := make([]cel.ExpressionAccessor, len(inputValidations))
for i, validation := range inputValidations { for i, validation := range inputValidations {
if validation.MessageExpression != "" { if validation.MessageExpression != "" {
@ -522,7 +522,7 @@ func convertV1Alpha1MessageExpressions(inputValidations []v1alpha1.Validation) [
return celExpressionAccessor return celExpressionAccessor
} }
func convertv1alpha1AuditAnnotations(inputValidations []v1alpha1.AuditAnnotation) []cel.ExpressionAccessor { func convertv1beta1AuditAnnotations(inputValidations []v1beta1.AuditAnnotation) []cel.ExpressionAccessor {
celExpressionAccessor := make([]cel.ExpressionAccessor, len(inputValidations)) celExpressionAccessor := make([]cel.ExpressionAccessor, len(inputValidations))
for i, validation := range inputValidations { for i, validation := range inputValidations {
validation := AuditAnnotationCondition{ validation := AuditAnnotationCondition{
@ -534,7 +534,7 @@ func convertv1alpha1AuditAnnotations(inputValidations []v1alpha1.AuditAnnotation
return celExpressionAccessor return celExpressionAccessor
} }
func convertV1alpha1Variables(variables []v1alpha1.Variable) []cel.NamedExpressionAccessor { func convertv1beta1Variables(variables []v1beta1.Variable) []cel.NamedExpressionAccessor {
namedExpressions := make([]cel.NamedExpressionAccessor, len(variables)) namedExpressions := make([]cel.NamedExpressionAccessor, len(variables))
for i, variable := range variables { for i, variable := range variables {
namedExpressions[i] = &Variable{Name: variable.Name, Expression: variable.Expression} namedExpressions[i] = &Variable{Name: variable.Name, Expression: variable.Expression}

View File

@ -21,7 +21,7 @@ import (
celgo "github.com/google/cel-go/cel" celgo "github.com/google/cel-go/cel"
"k8s.io/api/admissionregistration/v1alpha1" "k8s.io/api/admissionregistration/v1beta1"
corev1 "k8s.io/api/core/v1" corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
@ -86,11 +86,11 @@ type Matcher interface {
// DefinitionMatches says whether this policy definition matches the provided admission // DefinitionMatches says whether this policy definition matches the provided admission
// resource request // resource request
DefinitionMatches(a admission.Attributes, o admission.ObjectInterfaces, definition *v1alpha1.ValidatingAdmissionPolicy) (bool, schema.GroupVersionKind, error) DefinitionMatches(a admission.Attributes, o admission.ObjectInterfaces, definition *v1beta1.ValidatingAdmissionPolicy) (bool, schema.GroupVersionKind, error)
// BindingMatches says whether this policy definition matches the provided admission // BindingMatches says whether this policy definition matches the provided admission
// resource request // resource request
BindingMatches(a admission.Attributes, o admission.ObjectInterfaces, definition *v1alpha1.ValidatingAdmissionPolicyBinding) (bool, error) BindingMatches(a admission.Attributes, o admission.ObjectInterfaces, definition *v1beta1.ValidatingAdmissionPolicyBinding) (bool, error)
// GetNamespace retrieves the Namespace resource by the given name. The name may be empty, in which case // GetNamespace retrieves the Namespace resource by the given name. The name may be empty, in which case
// GetNamespace must return nil, nil // GetNamespace must return nil, nil

View File

@ -17,7 +17,7 @@ limitations under the License.
package validatingadmissionpolicy package validatingadmissionpolicy
import ( import (
"k8s.io/api/admissionregistration/v1alpha1" "k8s.io/api/admissionregistration/v1beta1"
corev1 "k8s.io/api/core/v1" corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/labels"
@ -29,7 +29,7 @@ import (
var _ matching.MatchCriteria = &matchCriteria{} var _ matching.MatchCriteria = &matchCriteria{}
type matchCriteria struct { type matchCriteria struct {
constraints *v1alpha1.MatchResources constraints *v1beta1.MatchResources
} }
// GetParsedNamespaceSelector returns the converted LabelSelector which implements labels.Selector // GetParsedNamespaceSelector returns the converted LabelSelector which implements labels.Selector
@ -43,7 +43,7 @@ func (m *matchCriteria) GetParsedObjectSelector() (labels.Selector, error) {
} }
// GetMatchResources returns the matchConstraints // GetMatchResources returns the matchConstraints
func (m *matchCriteria) GetMatchResources() v1alpha1.MatchResources { func (m *matchCriteria) GetMatchResources() v1beta1.MatchResources {
return *m.constraints return *m.constraints
} }
@ -63,13 +63,13 @@ func (c *matcher) ValidateInitialization() error {
} }
// DefinitionMatches returns whether this ValidatingAdmissionPolicy matches the provided admission resource request // DefinitionMatches returns whether this ValidatingAdmissionPolicy matches the provided admission resource request
func (c *matcher) DefinitionMatches(a admission.Attributes, o admission.ObjectInterfaces, definition *v1alpha1.ValidatingAdmissionPolicy) (bool, schema.GroupVersionKind, error) { func (c *matcher) DefinitionMatches(a admission.Attributes, o admission.ObjectInterfaces, definition *v1beta1.ValidatingAdmissionPolicy) (bool, schema.GroupVersionKind, error) {
criteria := matchCriteria{constraints: definition.Spec.MatchConstraints} criteria := matchCriteria{constraints: definition.Spec.MatchConstraints}
return c.Matcher.Matches(a, o, &criteria) return c.Matcher.Matches(a, o, &criteria)
} }
// BindingMatches returns whether this ValidatingAdmissionPolicyBinding matches the provided admission resource request // BindingMatches returns whether this ValidatingAdmissionPolicyBinding matches the provided admission resource request
func (c *matcher) BindingMatches(a admission.Attributes, o admission.ObjectInterfaces, binding *v1alpha1.ValidatingAdmissionPolicyBinding) (bool, error) { func (c *matcher) BindingMatches(a admission.Attributes, o admission.ObjectInterfaces, binding *v1beta1.ValidatingAdmissionPolicyBinding) (bool, error) {
if binding.Spec.MatchResources == nil { if binding.Spec.MatchResources == nil {
return true, nil return true, nil
} }

View File

@ -20,7 +20,7 @@ import (
"fmt" "fmt"
v1 "k8s.io/api/admissionregistration/v1" v1 "k8s.io/api/admissionregistration/v1"
"k8s.io/api/admissionregistration/v1alpha1" "k8s.io/api/admissionregistration/v1beta1"
corev1 "k8s.io/api/core/v1" corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apiserver/pkg/admission" "k8s.io/apiserver/pkg/admission"
@ -36,7 +36,7 @@ type MatchCriteria interface {
namespace.NamespaceSelectorProvider namespace.NamespaceSelectorProvider
object.ObjectSelectorProvider object.ObjectSelectorProvider
GetMatchResources() v1alpha1.MatchResources GetMatchResources() v1beta1.MatchResources
} }
// Matcher decides if a request matches against matchCriteria // Matcher decides if a request matches against matchCriteria
@ -119,7 +119,7 @@ func (m *Matcher) Matches(attr admission.Attributes, o admission.ObjectInterface
return true, matchKind, nil return true, matchKind, nil
} }
func matchesResourceRules(namedRules []v1alpha1.NamedRuleWithOperations, matchPolicy *v1alpha1.MatchPolicyType, attr admission.Attributes, o admission.ObjectInterfaces) (bool, schema.GroupVersionKind, error) { func matchesResourceRules(namedRules []v1beta1.NamedRuleWithOperations, matchPolicy *v1beta1.MatchPolicyType, attr admission.Attributes, o admission.ObjectInterfaces) (bool, schema.GroupVersionKind, error) {
matchKind := attr.GetKind() matchKind := attr.GetKind()
for _, namedRule := range namedRules { for _, namedRule := range namedRules {
rule := v1.RuleWithOperations(namedRule.RuleWithOperations) rule := v1.RuleWithOperations(namedRule.RuleWithOperations)
@ -146,7 +146,7 @@ func matchesResourceRules(namedRules []v1alpha1.NamedRuleWithOperations, matchPo
// if match policy is undefined or exact, don't perform fuzzy matching // if match policy is undefined or exact, don't perform fuzzy matching
// note that defaulting to fuzzy matching is set by the API // note that defaulting to fuzzy matching is set by the API
if matchPolicy == nil || *matchPolicy == v1alpha1.Exact { if matchPolicy == nil || *matchPolicy == v1beta1.Exact {
return false, schema.GroupVersionKind{}, nil return false, schema.GroupVersionKind{}, nil
} }

View File

@ -22,7 +22,7 @@ import (
"testing" "testing"
v1 "k8s.io/api/admissionregistration/v1" v1 "k8s.io/api/admissionregistration/v1"
"k8s.io/api/admissionregistration/v1alpha1" "k8s.io/api/admissionregistration/v1beta1"
corev1 "k8s.io/api/core/v1" corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@ -38,10 +38,10 @@ import (
var _ MatchCriteria = &fakeCriteria{} var _ MatchCriteria = &fakeCriteria{}
type fakeCriteria struct { type fakeCriteria struct {
matchResources v1alpha1.MatchResources matchResources v1beta1.MatchResources
} }
func (fc *fakeCriteria) GetMatchResources() v1alpha1.MatchResources { func (fc *fakeCriteria) GetMatchResources() v1beta1.MatchResources {
return fc.matchResources return fc.matchResources
} }
@ -65,8 +65,8 @@ func TestMatcher(t *testing.T) {
a := &Matcher{namespaceMatcher: &namespace.Matcher{}, objectMatcher: &object.Matcher{}} a := &Matcher{namespaceMatcher: &namespace.Matcher{}, objectMatcher: &object.Matcher{}}
allScopes := v1.AllScopes allScopes := v1.AllScopes
exactMatch := v1alpha1.Exact exactMatch := v1beta1.Exact
equivalentMatch := v1alpha1.Equivalent equivalentMatch := v1beta1.Equivalent
mapper := runtime.NewEquivalentResourceRegistryWithIdentity(func(resource schema.GroupResource) string { mapper := runtime.NewEquivalentResourceRegistryWithIdentity(func(resource schema.GroupResource) string {
if resource.Resource == "deployments" { if resource.Resource == "deployments" {
@ -95,7 +95,7 @@ func TestMatcher(t *testing.T) {
testcases := []struct { testcases := []struct {
name string name string
criteria *v1alpha1.MatchResources criteria *v1beta1.MatchResources
attrs admission.Attributes attrs admission.Attributes
expectMatches bool expectMatches bool
@ -104,17 +104,17 @@ func TestMatcher(t *testing.T) {
}{ }{
{ {
name: "no rules (just write)", name: "no rules (just write)",
criteria: &v1alpha1.MatchResources{NamespaceSelector: &metav1.LabelSelector{}, ResourceRules: []v1alpha1.NamedRuleWithOperations{}}, criteria: &v1beta1.MatchResources{NamespaceSelector: &metav1.LabelSelector{}, ResourceRules: []v1beta1.NamedRuleWithOperations{}},
attrs: admission.NewAttributesRecord(nil, nil, gvk("apps", "v1", "Deployment"), "ns", "name", gvr("apps", "v1", "deployments"), "", admission.Create, &metav1.CreateOptions{}, false, nil), attrs: admission.NewAttributesRecord(nil, nil, gvk("apps", "v1", "Deployment"), "ns", "name", gvr("apps", "v1", "deployments"), "", admission.Create, &metav1.CreateOptions{}, false, nil),
expectMatches: false, expectMatches: false,
}, },
{ {
name: "wildcard rule, match as requested", name: "wildcard rule, match as requested",
criteria: &v1alpha1.MatchResources{ criteria: &v1beta1.MatchResources{
NamespaceSelector: &metav1.LabelSelector{}, NamespaceSelector: &metav1.LabelSelector{},
ObjectSelector: &metav1.LabelSelector{}, ObjectSelector: &metav1.LabelSelector{},
ResourceRules: []v1alpha1.NamedRuleWithOperations{{ ResourceRules: []v1beta1.NamedRuleWithOperations{{
RuleWithOperations: v1alpha1.RuleWithOperations{ RuleWithOperations: v1beta1.RuleWithOperations{
Operations: []v1.OperationType{"*"}, Operations: []v1.OperationType{"*"},
Rule: v1.Rule{APIGroups: []string{"*"}, APIVersions: []string{"*"}, Resources: []string{"*"}, Scope: &allScopes}, Rule: v1.Rule{APIGroups: []string{"*"}, APIVersions: []string{"*"}, Resources: []string{"*"}, Scope: &allScopes},
}, },
@ -125,21 +125,21 @@ func TestMatcher(t *testing.T) {
}, },
{ {
name: "specific rules, prefer exact match", name: "specific rules, prefer exact match",
criteria: &v1alpha1.MatchResources{ criteria: &v1beta1.MatchResources{
NamespaceSelector: &metav1.LabelSelector{}, NamespaceSelector: &metav1.LabelSelector{},
ObjectSelector: &metav1.LabelSelector{}, ObjectSelector: &metav1.LabelSelector{},
ResourceRules: []v1alpha1.NamedRuleWithOperations{{ ResourceRules: []v1beta1.NamedRuleWithOperations{{
RuleWithOperations: v1alpha1.RuleWithOperations{ RuleWithOperations: v1beta1.RuleWithOperations{
Operations: []v1.OperationType{"*"}, Operations: []v1.OperationType{"*"},
Rule: v1.Rule{APIGroups: []string{"extensions"}, APIVersions: []string{"v1beta1"}, Resources: []string{"deployments"}, Scope: &allScopes}, Rule: v1.Rule{APIGroups: []string{"extensions"}, APIVersions: []string{"v1beta1"}, Resources: []string{"deployments"}, Scope: &allScopes},
}, },
}, { }, {
RuleWithOperations: v1alpha1.RuleWithOperations{ RuleWithOperations: v1beta1.RuleWithOperations{
Operations: []v1.OperationType{"*"}, Operations: []v1.OperationType{"*"},
Rule: v1.Rule{APIGroups: []string{"apps"}, APIVersions: []string{"v1beta1"}, Resources: []string{"deployments"}, Scope: &allScopes}, Rule: v1.Rule{APIGroups: []string{"apps"}, APIVersions: []string{"v1beta1"}, Resources: []string{"deployments"}, Scope: &allScopes},
}, },
}, { }, {
RuleWithOperations: v1alpha1.RuleWithOperations{ RuleWithOperations: v1beta1.RuleWithOperations{
Operations: []v1.OperationType{"*"}, Operations: []v1.OperationType{"*"},
Rule: v1.Rule{APIGroups: []string{"apps"}, APIVersions: []string{"v1"}, Resources: []string{"deployments"}, Scope: &allScopes}, Rule: v1.Rule{APIGroups: []string{"apps"}, APIVersions: []string{"v1"}, Resources: []string{"deployments"}, Scope: &allScopes},
}, },
@ -150,16 +150,16 @@ func TestMatcher(t *testing.T) {
}, },
{ {
name: "specific rules, match miss", name: "specific rules, match miss",
criteria: &v1alpha1.MatchResources{ criteria: &v1beta1.MatchResources{
NamespaceSelector: &metav1.LabelSelector{}, NamespaceSelector: &metav1.LabelSelector{},
ObjectSelector: &metav1.LabelSelector{}, ObjectSelector: &metav1.LabelSelector{},
ResourceRules: []v1alpha1.NamedRuleWithOperations{{ ResourceRules: []v1beta1.NamedRuleWithOperations{{
RuleWithOperations: v1alpha1.RuleWithOperations{ RuleWithOperations: v1beta1.RuleWithOperations{
Operations: []v1.OperationType{"*"}, Operations: []v1.OperationType{"*"},
Rule: v1.Rule{APIGroups: []string{"extensions"}, APIVersions: []string{"v1beta1"}, Resources: []string{"deployments"}, Scope: &allScopes}, Rule: v1.Rule{APIGroups: []string{"extensions"}, APIVersions: []string{"v1beta1"}, Resources: []string{"deployments"}, Scope: &allScopes},
}, },
}, { }, {
RuleWithOperations: v1alpha1.RuleWithOperations{ RuleWithOperations: v1beta1.RuleWithOperations{
Operations: []v1.OperationType{"*"}, Operations: []v1.OperationType{"*"},
Rule: v1.Rule{APIGroups: []string{"apps"}, APIVersions: []string{"v1beta1"}, Resources: []string{"deployments"}, Scope: &allScopes}, Rule: v1.Rule{APIGroups: []string{"apps"}, APIVersions: []string{"v1beta1"}, Resources: []string{"deployments"}, Scope: &allScopes},
}, },
@ -169,17 +169,17 @@ func TestMatcher(t *testing.T) {
}, },
{ {
name: "specific rules, exact match miss", name: "specific rules, exact match miss",
criteria: &v1alpha1.MatchResources{ criteria: &v1beta1.MatchResources{
MatchPolicy: &exactMatch, MatchPolicy: &exactMatch,
NamespaceSelector: &metav1.LabelSelector{}, NamespaceSelector: &metav1.LabelSelector{},
ObjectSelector: &metav1.LabelSelector{}, ObjectSelector: &metav1.LabelSelector{},
ResourceRules: []v1alpha1.NamedRuleWithOperations{{ ResourceRules: []v1beta1.NamedRuleWithOperations{{
RuleWithOperations: v1alpha1.RuleWithOperations{ RuleWithOperations: v1beta1.RuleWithOperations{
Operations: []v1.OperationType{"*"}, Operations: []v1.OperationType{"*"},
Rule: v1.Rule{APIGroups: []string{"extensions"}, APIVersions: []string{"v1beta1"}, Resources: []string{"deployments"}, Scope: &allScopes}, Rule: v1.Rule{APIGroups: []string{"extensions"}, APIVersions: []string{"v1beta1"}, Resources: []string{"deployments"}, Scope: &allScopes},
}, },
}, { }, {
RuleWithOperations: v1alpha1.RuleWithOperations{ RuleWithOperations: v1beta1.RuleWithOperations{
Operations: []v1.OperationType{"*"}, Operations: []v1.OperationType{"*"},
Rule: v1.Rule{APIGroups: []string{"apps"}, APIVersions: []string{"v1beta1"}, Resources: []string{"deployments"}, Scope: &allScopes}, Rule: v1.Rule{APIGroups: []string{"apps"}, APIVersions: []string{"v1beta1"}, Resources: []string{"deployments"}, Scope: &allScopes},
}, },
@ -189,17 +189,17 @@ func TestMatcher(t *testing.T) {
}, },
{ {
name: "specific rules, equivalent match, prefer extensions", name: "specific rules, equivalent match, prefer extensions",
criteria: &v1alpha1.MatchResources{ criteria: &v1beta1.MatchResources{
MatchPolicy: &equivalentMatch, MatchPolicy: &equivalentMatch,
NamespaceSelector: &metav1.LabelSelector{}, NamespaceSelector: &metav1.LabelSelector{},
ObjectSelector: &metav1.LabelSelector{}, ObjectSelector: &metav1.LabelSelector{},
ResourceRules: []v1alpha1.NamedRuleWithOperations{{ ResourceRules: []v1beta1.NamedRuleWithOperations{{
RuleWithOperations: v1alpha1.RuleWithOperations{ RuleWithOperations: v1beta1.RuleWithOperations{
Operations: []v1.OperationType{"*"}, Operations: []v1.OperationType{"*"},
Rule: v1.Rule{APIGroups: []string{"extensions"}, APIVersions: []string{"v1beta1"}, Resources: []string{"deployments"}, Scope: &allScopes}, Rule: v1.Rule{APIGroups: []string{"extensions"}, APIVersions: []string{"v1beta1"}, Resources: []string{"deployments"}, Scope: &allScopes},
}, },
}, { }, {
RuleWithOperations: v1alpha1.RuleWithOperations{ RuleWithOperations: v1beta1.RuleWithOperations{
Operations: []v1.OperationType{"*"}, Operations: []v1.OperationType{"*"},
Rule: v1.Rule{APIGroups: []string{"apps"}, APIVersions: []string{"v1beta1"}, Resources: []string{"deployments"}, Scope: &allScopes}, Rule: v1.Rule{APIGroups: []string{"apps"}, APIVersions: []string{"v1beta1"}, Resources: []string{"deployments"}, Scope: &allScopes},
}, },
@ -210,17 +210,17 @@ func TestMatcher(t *testing.T) {
}, },
{ {
name: "specific rules, equivalent match, prefer apps", name: "specific rules, equivalent match, prefer apps",
criteria: &v1alpha1.MatchResources{ criteria: &v1beta1.MatchResources{
MatchPolicy: &equivalentMatch, MatchPolicy: &equivalentMatch,
NamespaceSelector: &metav1.LabelSelector{}, NamespaceSelector: &metav1.LabelSelector{},
ObjectSelector: &metav1.LabelSelector{}, ObjectSelector: &metav1.LabelSelector{},
ResourceRules: []v1alpha1.NamedRuleWithOperations{{ ResourceRules: []v1beta1.NamedRuleWithOperations{{
RuleWithOperations: v1alpha1.RuleWithOperations{ RuleWithOperations: v1beta1.RuleWithOperations{
Operations: []v1.OperationType{"*"}, Operations: []v1.OperationType{"*"},
Rule: v1.Rule{APIGroups: []string{"apps"}, APIVersions: []string{"v1beta1"}, Resources: []string{"deployments"}, Scope: &allScopes}, Rule: v1.Rule{APIGroups: []string{"apps"}, APIVersions: []string{"v1beta1"}, Resources: []string{"deployments"}, Scope: &allScopes},
}, },
}, { }, {
RuleWithOperations: v1alpha1.RuleWithOperations{ RuleWithOperations: v1beta1.RuleWithOperations{
Operations: []v1.OperationType{"*"}, Operations: []v1.OperationType{"*"},
Rule: v1.Rule{APIGroups: []string{"extensions"}, APIVersions: []string{"v1beta1"}, Resources: []string{"deployments"}, Scope: &allScopes}, Rule: v1.Rule{APIGroups: []string{"extensions"}, APIVersions: []string{"v1beta1"}, Resources: []string{"deployments"}, Scope: &allScopes},
}, },
@ -232,21 +232,21 @@ func TestMatcher(t *testing.T) {
{ {
name: "specific rules, subresource prefer exact match", name: "specific rules, subresource prefer exact match",
criteria: &v1alpha1.MatchResources{ criteria: &v1beta1.MatchResources{
NamespaceSelector: &metav1.LabelSelector{}, NamespaceSelector: &metav1.LabelSelector{},
ObjectSelector: &metav1.LabelSelector{}, ObjectSelector: &metav1.LabelSelector{},
ResourceRules: []v1alpha1.NamedRuleWithOperations{{ ResourceRules: []v1beta1.NamedRuleWithOperations{{
RuleWithOperations: v1alpha1.RuleWithOperations{ RuleWithOperations: v1beta1.RuleWithOperations{
Operations: []v1.OperationType{"*"}, Operations: []v1.OperationType{"*"},
Rule: v1.Rule{APIGroups: []string{"extensions"}, APIVersions: []string{"v1beta1"}, Resources: []string{"deployments", "deployments/scale"}, Scope: &allScopes}, Rule: v1.Rule{APIGroups: []string{"extensions"}, APIVersions: []string{"v1beta1"}, Resources: []string{"deployments", "deployments/scale"}, Scope: &allScopes},
}, },
}, { }, {
RuleWithOperations: v1alpha1.RuleWithOperations{ RuleWithOperations: v1beta1.RuleWithOperations{
Operations: []v1.OperationType{"*"}, Operations: []v1.OperationType{"*"},
Rule: v1.Rule{APIGroups: []string{"apps"}, APIVersions: []string{"v1beta1"}, Resources: []string{"deployments", "deployments/scale"}, Scope: &allScopes}, Rule: v1.Rule{APIGroups: []string{"apps"}, APIVersions: []string{"v1beta1"}, Resources: []string{"deployments", "deployments/scale"}, Scope: &allScopes},
}, },
}, { }, {
RuleWithOperations: v1alpha1.RuleWithOperations{ RuleWithOperations: v1beta1.RuleWithOperations{
Operations: []v1.OperationType{"*"}, Operations: []v1.OperationType{"*"},
Rule: v1.Rule{APIGroups: []string{"apps"}, APIVersions: []string{"v1"}, Resources: []string{"deployments", "deployments/scale"}, Scope: &allScopes}, Rule: v1.Rule{APIGroups: []string{"apps"}, APIVersions: []string{"v1"}, Resources: []string{"deployments", "deployments/scale"}, Scope: &allScopes},
}, },
@ -257,16 +257,16 @@ func TestMatcher(t *testing.T) {
}, },
{ {
name: "specific rules, subresource match miss", name: "specific rules, subresource match miss",
criteria: &v1alpha1.MatchResources{ criteria: &v1beta1.MatchResources{
NamespaceSelector: &metav1.LabelSelector{}, NamespaceSelector: &metav1.LabelSelector{},
ObjectSelector: &metav1.LabelSelector{}, ObjectSelector: &metav1.LabelSelector{},
ResourceRules: []v1alpha1.NamedRuleWithOperations{{ ResourceRules: []v1beta1.NamedRuleWithOperations{{
RuleWithOperations: v1alpha1.RuleWithOperations{ RuleWithOperations: v1beta1.RuleWithOperations{
Operations: []v1.OperationType{"*"}, Operations: []v1.OperationType{"*"},
Rule: v1.Rule{APIGroups: []string{"extensions"}, APIVersions: []string{"v1beta1"}, Resources: []string{"deployments", "deployments/scale"}, Scope: &allScopes}, Rule: v1.Rule{APIGroups: []string{"extensions"}, APIVersions: []string{"v1beta1"}, Resources: []string{"deployments", "deployments/scale"}, Scope: &allScopes},
}, },
}, { }, {
RuleWithOperations: v1alpha1.RuleWithOperations{ RuleWithOperations: v1beta1.RuleWithOperations{
Operations: []v1.OperationType{"*"}, Operations: []v1.OperationType{"*"},
Rule: v1.Rule{APIGroups: []string{"apps"}, APIVersions: []string{"v1beta1"}, Resources: []string{"deployments", "deployments/scale"}, Scope: &allScopes}, Rule: v1.Rule{APIGroups: []string{"apps"}, APIVersions: []string{"v1beta1"}, Resources: []string{"deployments", "deployments/scale"}, Scope: &allScopes},
}, },
@ -276,17 +276,17 @@ func TestMatcher(t *testing.T) {
}, },
{ {
name: "specific rules, subresource exact match miss", name: "specific rules, subresource exact match miss",
criteria: &v1alpha1.MatchResources{ criteria: &v1beta1.MatchResources{
MatchPolicy: &exactMatch, MatchPolicy: &exactMatch,
NamespaceSelector: &metav1.LabelSelector{}, NamespaceSelector: &metav1.LabelSelector{},
ObjectSelector: &metav1.LabelSelector{}, ObjectSelector: &metav1.LabelSelector{},
ResourceRules: []v1alpha1.NamedRuleWithOperations{{ ResourceRules: []v1beta1.NamedRuleWithOperations{{
RuleWithOperations: v1alpha1.RuleWithOperations{ RuleWithOperations: v1beta1.RuleWithOperations{
Operations: []v1.OperationType{"*"}, Operations: []v1.OperationType{"*"},
Rule: v1.Rule{APIGroups: []string{"extensions"}, APIVersions: []string{"v1beta1"}, Resources: []string{"deployments", "deployments/scale"}, Scope: &allScopes}, Rule: v1.Rule{APIGroups: []string{"extensions"}, APIVersions: []string{"v1beta1"}, Resources: []string{"deployments", "deployments/scale"}, Scope: &allScopes},
}, },
}, { }, {
RuleWithOperations: v1alpha1.RuleWithOperations{ RuleWithOperations: v1beta1.RuleWithOperations{
Operations: []v1.OperationType{"*"}, Operations: []v1.OperationType{"*"},
Rule: v1.Rule{APIGroups: []string{"apps"}, APIVersions: []string{"v1beta1"}, Resources: []string{"deployments", "deployments/scale"}, Scope: &allScopes}, Rule: v1.Rule{APIGroups: []string{"apps"}, APIVersions: []string{"v1beta1"}, Resources: []string{"deployments", "deployments/scale"}, Scope: &allScopes},
}, },
@ -296,17 +296,17 @@ func TestMatcher(t *testing.T) {
}, },
{ {
name: "specific rules, subresource equivalent match, prefer extensions", name: "specific rules, subresource equivalent match, prefer extensions",
criteria: &v1alpha1.MatchResources{ criteria: &v1beta1.MatchResources{
MatchPolicy: &equivalentMatch, MatchPolicy: &equivalentMatch,
NamespaceSelector: &metav1.LabelSelector{}, NamespaceSelector: &metav1.LabelSelector{},
ObjectSelector: &metav1.LabelSelector{}, ObjectSelector: &metav1.LabelSelector{},
ResourceRules: []v1alpha1.NamedRuleWithOperations{{ ResourceRules: []v1beta1.NamedRuleWithOperations{{
RuleWithOperations: v1alpha1.RuleWithOperations{ RuleWithOperations: v1beta1.RuleWithOperations{
Operations: []v1.OperationType{"*"}, Operations: []v1.OperationType{"*"},
Rule: v1.Rule{APIGroups: []string{"extensions"}, APIVersions: []string{"v1beta1"}, Resources: []string{"deployments", "deployments/scale"}, Scope: &allScopes}, Rule: v1.Rule{APIGroups: []string{"extensions"}, APIVersions: []string{"v1beta1"}, Resources: []string{"deployments", "deployments/scale"}, Scope: &allScopes},
}, },
}, { }, {
RuleWithOperations: v1alpha1.RuleWithOperations{ RuleWithOperations: v1beta1.RuleWithOperations{
Operations: []v1.OperationType{"*"}, Operations: []v1.OperationType{"*"},
Rule: v1.Rule{APIGroups: []string{"apps"}, APIVersions: []string{"v1beta1"}, Resources: []string{"deployments", "deployments/scale"}, Scope: &allScopes}, Rule: v1.Rule{APIGroups: []string{"apps"}, APIVersions: []string{"v1beta1"}, Resources: []string{"deployments", "deployments/scale"}, Scope: &allScopes},
}, },
@ -317,17 +317,17 @@ func TestMatcher(t *testing.T) {
}, },
{ {
name: "specific rules, subresource equivalent match, prefer apps", name: "specific rules, subresource equivalent match, prefer apps",
criteria: &v1alpha1.MatchResources{ criteria: &v1beta1.MatchResources{
MatchPolicy: &equivalentMatch, MatchPolicy: &equivalentMatch,
NamespaceSelector: &metav1.LabelSelector{}, NamespaceSelector: &metav1.LabelSelector{},
ObjectSelector: &metav1.LabelSelector{}, ObjectSelector: &metav1.LabelSelector{},
ResourceRules: []v1alpha1.NamedRuleWithOperations{{ ResourceRules: []v1beta1.NamedRuleWithOperations{{
RuleWithOperations: v1alpha1.RuleWithOperations{ RuleWithOperations: v1beta1.RuleWithOperations{
Operations: []v1.OperationType{"*"}, Operations: []v1.OperationType{"*"},
Rule: v1.Rule{APIGroups: []string{"apps"}, APIVersions: []string{"v1beta1"}, Resources: []string{"deployments", "deployments/scale"}, Scope: &allScopes}, Rule: v1.Rule{APIGroups: []string{"apps"}, APIVersions: []string{"v1beta1"}, Resources: []string{"deployments", "deployments/scale"}, Scope: &allScopes},
}, },
}, { }, {
RuleWithOperations: v1alpha1.RuleWithOperations{ RuleWithOperations: v1beta1.RuleWithOperations{
Operations: []v1.OperationType{"*"}, Operations: []v1.OperationType{"*"},
Rule: v1.Rule{APIGroups: []string{"extensions"}, APIVersions: []string{"v1beta1"}, Resources: []string{"deployments", "deployments/scale"}, Scope: &allScopes}, Rule: v1.Rule{APIGroups: []string{"extensions"}, APIVersions: []string{"v1beta1"}, Resources: []string{"deployments", "deployments/scale"}, Scope: &allScopes},
}, },
@ -338,12 +338,12 @@ func TestMatcher(t *testing.T) {
}, },
{ {
name: "specific rules, prefer exact match and name match", name: "specific rules, prefer exact match and name match",
criteria: &v1alpha1.MatchResources{ criteria: &v1beta1.MatchResources{
NamespaceSelector: &metav1.LabelSelector{}, NamespaceSelector: &metav1.LabelSelector{},
ObjectSelector: &metav1.LabelSelector{}, ObjectSelector: &metav1.LabelSelector{},
ResourceRules: []v1alpha1.NamedRuleWithOperations{{ ResourceRules: []v1beta1.NamedRuleWithOperations{{
ResourceNames: []string{"name"}, ResourceNames: []string{"name"},
RuleWithOperations: v1alpha1.RuleWithOperations{ RuleWithOperations: v1beta1.RuleWithOperations{
Operations: []v1.OperationType{"*"}, Operations: []v1.OperationType{"*"},
Rule: v1.Rule{APIGroups: []string{"apps"}, APIVersions: []string{"v1"}, Resources: []string{"deployments"}, Scope: &allScopes}, Rule: v1.Rule{APIGroups: []string{"apps"}, APIVersions: []string{"v1"}, Resources: []string{"deployments"}, Scope: &allScopes},
}, },
@ -354,12 +354,12 @@ func TestMatcher(t *testing.T) {
}, },
{ {
name: "specific rules, prefer exact match and name match miss", name: "specific rules, prefer exact match and name match miss",
criteria: &v1alpha1.MatchResources{ criteria: &v1beta1.MatchResources{
NamespaceSelector: &metav1.LabelSelector{}, NamespaceSelector: &metav1.LabelSelector{},
ObjectSelector: &metav1.LabelSelector{}, ObjectSelector: &metav1.LabelSelector{},
ResourceRules: []v1alpha1.NamedRuleWithOperations{{ ResourceRules: []v1beta1.NamedRuleWithOperations{{
ResourceNames: []string{"wrong-name"}, ResourceNames: []string{"wrong-name"},
RuleWithOperations: v1alpha1.RuleWithOperations{ RuleWithOperations: v1beta1.RuleWithOperations{
Operations: []v1.OperationType{"*"}, Operations: []v1.OperationType{"*"},
Rule: v1.Rule{APIGroups: []string{"apps"}, APIVersions: []string{"v1"}, Resources: []string{"deployments"}, Scope: &allScopes}, Rule: v1.Rule{APIGroups: []string{"apps"}, APIVersions: []string{"v1"}, Resources: []string{"deployments"}, Scope: &allScopes},
}, },
@ -369,13 +369,13 @@ func TestMatcher(t *testing.T) {
}, },
{ {
name: "specific rules, subresource equivalent match, prefer extensions and name match", name: "specific rules, subresource equivalent match, prefer extensions and name match",
criteria: &v1alpha1.MatchResources{ criteria: &v1beta1.MatchResources{
MatchPolicy: &equivalentMatch, MatchPolicy: &equivalentMatch,
NamespaceSelector: &metav1.LabelSelector{}, NamespaceSelector: &metav1.LabelSelector{},
ObjectSelector: &metav1.LabelSelector{}, ObjectSelector: &metav1.LabelSelector{},
ResourceRules: []v1alpha1.NamedRuleWithOperations{{ ResourceRules: []v1beta1.NamedRuleWithOperations{{
ResourceNames: []string{"name"}, ResourceNames: []string{"name"},
RuleWithOperations: v1alpha1.RuleWithOperations{ RuleWithOperations: v1beta1.RuleWithOperations{
Operations: []v1.OperationType{"*"}, Operations: []v1.OperationType{"*"},
Rule: v1.Rule{APIGroups: []string{"apps"}, APIVersions: []string{"v1"}, Resources: []string{"deployments", "deployments/scale"}, Scope: &allScopes}, Rule: v1.Rule{APIGroups: []string{"apps"}, APIVersions: []string{"v1"}, Resources: []string{"deployments", "deployments/scale"}, Scope: &allScopes},
}, },
@ -386,13 +386,13 @@ func TestMatcher(t *testing.T) {
}, },
{ {
name: "specific rules, subresource equivalent match, prefer extensions and name match miss", name: "specific rules, subresource equivalent match, prefer extensions and name match miss",
criteria: &v1alpha1.MatchResources{ criteria: &v1beta1.MatchResources{
MatchPolicy: &equivalentMatch, MatchPolicy: &equivalentMatch,
NamespaceSelector: &metav1.LabelSelector{}, NamespaceSelector: &metav1.LabelSelector{},
ObjectSelector: &metav1.LabelSelector{}, ObjectSelector: &metav1.LabelSelector{},
ResourceRules: []v1alpha1.NamedRuleWithOperations{{ ResourceRules: []v1beta1.NamedRuleWithOperations{{
ResourceNames: []string{"wrong-name"}, ResourceNames: []string{"wrong-name"},
RuleWithOperations: v1alpha1.RuleWithOperations{ RuleWithOperations: v1beta1.RuleWithOperations{
Operations: []v1.OperationType{"*"}, Operations: []v1.OperationType{"*"},
Rule: v1.Rule{APIGroups: []string{"apps"}, APIVersions: []string{"v1"}, Resources: []string{"deployments", "deployments/scale"}, Scope: &allScopes}, Rule: v1.Rule{APIGroups: []string{"apps"}, APIVersions: []string{"v1"}, Resources: []string{"deployments", "deployments/scale"}, Scope: &allScopes},
}, },
@ -402,17 +402,17 @@ func TestMatcher(t *testing.T) {
}, },
{ {
name: "exclude resource match on miss", name: "exclude resource match on miss",
criteria: &v1alpha1.MatchResources{ criteria: &v1beta1.MatchResources{
NamespaceSelector: &metav1.LabelSelector{}, NamespaceSelector: &metav1.LabelSelector{},
ObjectSelector: &metav1.LabelSelector{}, ObjectSelector: &metav1.LabelSelector{},
ResourceRules: []v1alpha1.NamedRuleWithOperations{{ ResourceRules: []v1beta1.NamedRuleWithOperations{{
RuleWithOperations: v1alpha1.RuleWithOperations{ RuleWithOperations: v1beta1.RuleWithOperations{
Operations: []v1.OperationType{"*"}, Operations: []v1.OperationType{"*"},
Rule: v1.Rule{APIGroups: []string{"*"}, APIVersions: []string{"*"}, Resources: []string{"*"}, Scope: &allScopes}, Rule: v1.Rule{APIGroups: []string{"*"}, APIVersions: []string{"*"}, Resources: []string{"*"}, Scope: &allScopes},
}, },
}}, }},
ExcludeResourceRules: []v1alpha1.NamedRuleWithOperations{{ ExcludeResourceRules: []v1beta1.NamedRuleWithOperations{{
RuleWithOperations: v1alpha1.RuleWithOperations{ RuleWithOperations: v1beta1.RuleWithOperations{
Operations: []v1.OperationType{"*"}, Operations: []v1.OperationType{"*"},
Rule: v1.Rule{APIGroups: []string{"extensions"}, APIVersions: []string{"v1beta1"}, Resources: []string{"deployments"}, Scope: &allScopes}, Rule: v1.Rule{APIGroups: []string{"extensions"}, APIVersions: []string{"v1beta1"}, Resources: []string{"deployments"}, Scope: &allScopes},
}, },
@ -424,17 +424,17 @@ func TestMatcher(t *testing.T) {
}, },
{ {
name: "exclude resource miss on match", name: "exclude resource miss on match",
criteria: &v1alpha1.MatchResources{ criteria: &v1beta1.MatchResources{
NamespaceSelector: &metav1.LabelSelector{}, NamespaceSelector: &metav1.LabelSelector{},
ObjectSelector: &metav1.LabelSelector{}, ObjectSelector: &metav1.LabelSelector{},
ResourceRules: []v1alpha1.NamedRuleWithOperations{{ ResourceRules: []v1beta1.NamedRuleWithOperations{{
RuleWithOperations: v1alpha1.RuleWithOperations{ RuleWithOperations: v1beta1.RuleWithOperations{
Operations: []v1.OperationType{"*"}, Operations: []v1.OperationType{"*"},
Rule: v1.Rule{APIGroups: []string{"*"}, APIVersions: []string{"*"}, Resources: []string{"*"}, Scope: &allScopes}, Rule: v1.Rule{APIGroups: []string{"*"}, APIVersions: []string{"*"}, Resources: []string{"*"}, Scope: &allScopes},
}, },
}}, }},
ExcludeResourceRules: []v1alpha1.NamedRuleWithOperations{{ ExcludeResourceRules: []v1beta1.NamedRuleWithOperations{{
RuleWithOperations: v1alpha1.RuleWithOperations{ RuleWithOperations: v1beta1.RuleWithOperations{
Operations: []v1.OperationType{"*"}, Operations: []v1.OperationType{"*"},
Rule: v1.Rule{APIGroups: []string{"extensions"}, APIVersions: []string{"v1beta1"}, Resources: []string{"deployments"}, Scope: &allScopes}, Rule: v1.Rule{APIGroups: []string{"extensions"}, APIVersions: []string{"v1beta1"}, Resources: []string{"deployments"}, Scope: &allScopes},
}, },
@ -445,11 +445,11 @@ func TestMatcher(t *testing.T) {
}, },
{ {
name: "treat empty ResourceRules as match", name: "treat empty ResourceRules as match",
criteria: &v1alpha1.MatchResources{ criteria: &v1beta1.MatchResources{
NamespaceSelector: &metav1.LabelSelector{}, NamespaceSelector: &metav1.LabelSelector{},
ObjectSelector: &metav1.LabelSelector{}, ObjectSelector: &metav1.LabelSelector{},
ExcludeResourceRules: []v1alpha1.NamedRuleWithOperations{{ ExcludeResourceRules: []v1beta1.NamedRuleWithOperations{{
RuleWithOperations: v1alpha1.RuleWithOperations{ RuleWithOperations: v1beta1.RuleWithOperations{
Operations: []v1.OperationType{"*"}, Operations: []v1.OperationType{"*"},
Rule: v1.Rule{APIGroups: []string{"extensions"}, APIVersions: []string{"v1beta1"}, Resources: []string{"deployments"}, Scope: &allScopes}, Rule: v1.Rule{APIGroups: []string{"extensions"}, APIVersions: []string{"v1beta1"}, Resources: []string{"deployments"}, Scope: &allScopes},
}, },
@ -460,23 +460,23 @@ func TestMatcher(t *testing.T) {
}, },
{ {
name: "treat non-empty ResourceRules as no match", name: "treat non-empty ResourceRules as no match",
criteria: &v1alpha1.MatchResources{ criteria: &v1beta1.MatchResources{
NamespaceSelector: &metav1.LabelSelector{}, NamespaceSelector: &metav1.LabelSelector{},
ObjectSelector: &metav1.LabelSelector{}, ObjectSelector: &metav1.LabelSelector{},
ResourceRules: []v1alpha1.NamedRuleWithOperations{{}}, ResourceRules: []v1beta1.NamedRuleWithOperations{{}},
}, },
attrs: admission.NewAttributesRecord(nil, nil, gvk("autoscaling", "v1", "Scale"), "ns", "name", gvr("apps", "v1", "deployments"), "", admission.Create, &metav1.CreateOptions{}, false, nil), attrs: admission.NewAttributesRecord(nil, nil, gvk("autoscaling", "v1", "Scale"), "ns", "name", gvr("apps", "v1", "deployments"), "", admission.Create, &metav1.CreateOptions{}, false, nil),
expectMatches: false, expectMatches: false,
}, },
{ {
name: "erroring namespace selector on otherwise non-matching rule doesn't error", name: "erroring namespace selector on otherwise non-matching rule doesn't error",
criteria: &v1alpha1.MatchResources{ criteria: &v1beta1.MatchResources{
NamespaceSelector: &metav1.LabelSelector{MatchExpressions: []metav1.LabelSelectorRequirement{{Key: "key ", Operator: "In", Values: []string{"bad value"}}}}, NamespaceSelector: &metav1.LabelSelector{MatchExpressions: []metav1.LabelSelectorRequirement{{Key: "key ", Operator: "In", Values: []string{"bad value"}}}},
ObjectSelector: &metav1.LabelSelector{}, ObjectSelector: &metav1.LabelSelector{},
ResourceRules: []v1alpha1.NamedRuleWithOperations{{ ResourceRules: []v1beta1.NamedRuleWithOperations{{
RuleWithOperations: v1alpha1.RuleWithOperations{ RuleWithOperations: v1beta1.RuleWithOperations{
Rule: v1alpha1.Rule{APIGroups: []string{"*"}, APIVersions: []string{"*"}, Resources: []string{"deployments"}}, Rule: v1beta1.Rule{APIGroups: []string{"*"}, APIVersions: []string{"*"}, Resources: []string{"deployments"}},
Operations: []v1alpha1.OperationType{"*"}, Operations: []v1beta1.OperationType{"*"},
}, },
}}, }},
}, },
@ -486,13 +486,13 @@ func TestMatcher(t *testing.T) {
}, },
{ {
name: "erroring namespace selector on otherwise matching rule errors", name: "erroring namespace selector on otherwise matching rule errors",
criteria: &v1alpha1.MatchResources{ criteria: &v1beta1.MatchResources{
NamespaceSelector: &metav1.LabelSelector{MatchExpressions: []metav1.LabelSelectorRequirement{{Key: "key", Operator: "In", Values: []string{"bad value"}}}}, NamespaceSelector: &metav1.LabelSelector{MatchExpressions: []metav1.LabelSelectorRequirement{{Key: "key", Operator: "In", Values: []string{"bad value"}}}},
ObjectSelector: &metav1.LabelSelector{}, ObjectSelector: &metav1.LabelSelector{},
ResourceRules: []v1alpha1.NamedRuleWithOperations{{ ResourceRules: []v1beta1.NamedRuleWithOperations{{
RuleWithOperations: v1alpha1.RuleWithOperations{ RuleWithOperations: v1beta1.RuleWithOperations{
Rule: v1alpha1.Rule{APIGroups: []string{"*"}, APIVersions: []string{"*"}, Resources: []string{"pods"}}, Rule: v1beta1.Rule{APIGroups: []string{"*"}, APIVersions: []string{"*"}, Resources: []string{"pods"}},
Operations: []v1alpha1.OperationType{"*"}, Operations: []v1beta1.OperationType{"*"},
}, },
}}, }},
}, },
@ -502,13 +502,13 @@ func TestMatcher(t *testing.T) {
}, },
{ {
name: "erroring object selector on otherwise non-matching rule doesn't error", name: "erroring object selector on otherwise non-matching rule doesn't error",
criteria: &v1alpha1.MatchResources{ criteria: &v1beta1.MatchResources{
NamespaceSelector: &metav1.LabelSelector{}, NamespaceSelector: &metav1.LabelSelector{},
ObjectSelector: &metav1.LabelSelector{MatchExpressions: []metav1.LabelSelectorRequirement{{Key: "key", Operator: "In", Values: []string{"bad value"}}}}, ObjectSelector: &metav1.LabelSelector{MatchExpressions: []metav1.LabelSelectorRequirement{{Key: "key", Operator: "In", Values: []string{"bad value"}}}},
ResourceRules: []v1alpha1.NamedRuleWithOperations{{ ResourceRules: []v1beta1.NamedRuleWithOperations{{
RuleWithOperations: v1alpha1.RuleWithOperations{ RuleWithOperations: v1beta1.RuleWithOperations{
Rule: v1alpha1.Rule{APIGroups: []string{"*"}, APIVersions: []string{"*"}, Resources: []string{"deployments"}}, Rule: v1beta1.Rule{APIGroups: []string{"*"}, APIVersions: []string{"*"}, Resources: []string{"deployments"}},
Operations: []v1alpha1.OperationType{"*"}, Operations: []v1beta1.OperationType{"*"},
}, },
}}, }},
}, },
@ -518,13 +518,13 @@ func TestMatcher(t *testing.T) {
}, },
{ {
name: "erroring object selector on otherwise matching rule errors", name: "erroring object selector on otherwise matching rule errors",
criteria: &v1alpha1.MatchResources{ criteria: &v1beta1.MatchResources{
NamespaceSelector: &metav1.LabelSelector{}, NamespaceSelector: &metav1.LabelSelector{},
ObjectSelector: &metav1.LabelSelector{MatchExpressions: []metav1.LabelSelectorRequirement{{Key: "key", Operator: "In", Values: []string{"bad value"}}}}, ObjectSelector: &metav1.LabelSelector{MatchExpressions: []metav1.LabelSelectorRequirement{{Key: "key", Operator: "In", Values: []string{"bad value"}}}},
ResourceRules: []v1alpha1.NamedRuleWithOperations{{ ResourceRules: []v1beta1.NamedRuleWithOperations{{
RuleWithOperations: v1alpha1.RuleWithOperations{ RuleWithOperations: v1beta1.RuleWithOperations{
Rule: v1alpha1.Rule{APIGroups: []string{"*"}, APIVersions: []string{"*"}, Resources: []string{"pods"}}, Rule: v1beta1.Rule{APIGroups: []string{"*"}, APIVersions: []string{"*"}, Resources: []string{"pods"}},
Operations: []v1alpha1.OperationType{"*"}, Operations: []v1beta1.OperationType{"*"},
}, },
}}, }},
}, },
@ -579,7 +579,7 @@ func (f fakeNamespaceLister) Get(name string) (*corev1.Namespace, error) {
func BenchmarkMatcher(b *testing.B) { func BenchmarkMatcher(b *testing.B) {
allScopes := v1.AllScopes allScopes := v1.AllScopes
equivalentMatch := v1alpha1.Equivalent equivalentMatch := v1beta1.Equivalent
namespace1Labels := map[string]string{"ns": "ns1"} namespace1Labels := map[string]string{"ns": "ns1"}
namespace1 := corev1.Namespace{ namespace1 := corev1.Namespace{
@ -620,19 +620,19 @@ func BenchmarkMatcher(b *testing.B) {
nsSelector[fmt.Sprintf("key-%d", i)] = fmt.Sprintf("val-%d", i) nsSelector[fmt.Sprintf("key-%d", i)] = fmt.Sprintf("val-%d", i)
} }
mr := v1alpha1.MatchResources{ mr := v1beta1.MatchResources{
MatchPolicy: &equivalentMatch, MatchPolicy: &equivalentMatch,
NamespaceSelector: &metav1.LabelSelector{MatchLabels: nsSelector}, NamespaceSelector: &metav1.LabelSelector{MatchLabels: nsSelector},
ObjectSelector: &metav1.LabelSelector{}, ObjectSelector: &metav1.LabelSelector{},
ResourceRules: []v1alpha1.NamedRuleWithOperations{ ResourceRules: []v1beta1.NamedRuleWithOperations{
{ {
RuleWithOperations: v1alpha1.RuleWithOperations{ RuleWithOperations: v1beta1.RuleWithOperations{
Operations: []v1.OperationType{"*"}, Operations: []v1.OperationType{"*"},
Rule: v1.Rule{APIGroups: []string{"apps"}, APIVersions: []string{"v1beta1"}, Resources: []string{"deployments", "deployments/scale"}, Scope: &allScopes}, Rule: v1.Rule{APIGroups: []string{"apps"}, APIVersions: []string{"v1beta1"}, Resources: []string{"deployments", "deployments/scale"}, Scope: &allScopes},
}, },
}, },
{ {
RuleWithOperations: v1alpha1.RuleWithOperations{ RuleWithOperations: v1beta1.RuleWithOperations{
Operations: []v1.OperationType{"*"}, Operations: []v1.OperationType{"*"},
Rule: v1.Rule{APIGroups: []string{"extensions"}, APIVersions: []string{"v1beta1"}, Resources: []string{"deployments", "deployments/scale"}, Scope: &allScopes}, Rule: v1.Rule{APIGroups: []string{"extensions"}, APIVersions: []string{"v1beta1"}, Resources: []string{"deployments", "deployments/scale"}, Scope: &allScopes},
}, },
@ -652,7 +652,7 @@ func BenchmarkMatcher(b *testing.B) {
func BenchmarkShouldCallHookWithComplexRule(b *testing.B) { func BenchmarkShouldCallHookWithComplexRule(b *testing.B) {
allScopes := v1.AllScopes allScopes := v1.AllScopes
equivalentMatch := v1alpha1.Equivalent equivalentMatch := v1beta1.Equivalent
namespace1Labels := map[string]string{"ns": "ns1"} namespace1Labels := map[string]string{"ns": "ns1"}
namespace1 := corev1.Namespace{ namespace1 := corev1.Namespace{
@ -688,16 +688,16 @@ func BenchmarkShouldCallHookWithComplexRule(b *testing.B) {
mapper.RegisterKindFor(gvr("apps", "v1beta1", "statefulset"), "scale", gvk("apps", "v1beta1", "Scale")) mapper.RegisterKindFor(gvr("apps", "v1beta1", "statefulset"), "scale", gvk("apps", "v1beta1", "Scale"))
mapper.RegisterKindFor(gvr("apps", "v1alpha2", "statefulset"), "scale", gvk("apps", "v1beta2", "Scale")) mapper.RegisterKindFor(gvr("apps", "v1alpha2", "statefulset"), "scale", gvk("apps", "v1beta2", "Scale"))
mr := v1alpha1.MatchResources{ mr := v1beta1.MatchResources{
MatchPolicy: &equivalentMatch, MatchPolicy: &equivalentMatch,
NamespaceSelector: &metav1.LabelSelector{MatchLabels: map[string]string{"a": "b"}}, NamespaceSelector: &metav1.LabelSelector{MatchLabels: map[string]string{"a": "b"}},
ObjectSelector: &metav1.LabelSelector{}, ObjectSelector: &metav1.LabelSelector{},
ResourceRules: []v1alpha1.NamedRuleWithOperations{}, ResourceRules: []v1beta1.NamedRuleWithOperations{},
} }
for i := 0; i < 100; i++ { for i := 0; i < 100; i++ {
rule := v1alpha1.NamedRuleWithOperations{ rule := v1beta1.NamedRuleWithOperations{
RuleWithOperations: v1alpha1.RuleWithOperations{ RuleWithOperations: v1beta1.RuleWithOperations{
Operations: []v1.OperationType{"*"}, Operations: []v1.OperationType{"*"},
Rule: v1.Rule{ Rule: v1.Rule{
APIGroups: []string{fmt.Sprintf("app-%d", i)}, APIGroups: []string{fmt.Sprintf("app-%d", i)},
@ -722,7 +722,7 @@ func BenchmarkShouldCallHookWithComplexRule(b *testing.B) {
func BenchmarkShouldCallHookWithComplexSelectorAndRule(b *testing.B) { func BenchmarkShouldCallHookWithComplexSelectorAndRule(b *testing.B) {
allScopes := v1.AllScopes allScopes := v1.AllScopes
equivalentMatch := v1alpha1.Equivalent equivalentMatch := v1beta1.Equivalent
namespace1Labels := map[string]string{"ns": "ns1"} namespace1Labels := map[string]string{"ns": "ns1"}
namespace1 := corev1.Namespace{ namespace1 := corev1.Namespace{
@ -763,16 +763,16 @@ func BenchmarkShouldCallHookWithComplexSelectorAndRule(b *testing.B) {
nsSelector[fmt.Sprintf("key-%d", i)] = fmt.Sprintf("val-%d", i) nsSelector[fmt.Sprintf("key-%d", i)] = fmt.Sprintf("val-%d", i)
} }
mr := v1alpha1.MatchResources{ mr := v1beta1.MatchResources{
MatchPolicy: &equivalentMatch, MatchPolicy: &equivalentMatch,
NamespaceSelector: &metav1.LabelSelector{MatchLabels: nsSelector}, NamespaceSelector: &metav1.LabelSelector{MatchLabels: nsSelector},
ObjectSelector: &metav1.LabelSelector{}, ObjectSelector: &metav1.LabelSelector{},
ResourceRules: []v1alpha1.NamedRuleWithOperations{}, ResourceRules: []v1beta1.NamedRuleWithOperations{},
} }
for i := 0; i < 100; i++ { for i := 0; i < 100; i++ {
rule := v1alpha1.NamedRuleWithOperations{ rule := v1beta1.NamedRuleWithOperations{
RuleWithOperations: v1alpha1.RuleWithOperations{ RuleWithOperations: v1beta1.RuleWithOperations{
Operations: []v1.OperationType{"*"}, Operations: []v1.OperationType{"*"},
Rule: v1.Rule{ Rule: v1.Rule{
APIGroups: []string{fmt.Sprintf("app-%d", i)}, APIGroups: []string{fmt.Sprintf("app-%d", i)},

View File

@ -25,7 +25,7 @@ import (
"github.com/google/cel-go/cel" "github.com/google/cel-go/cel"
"k8s.io/api/admissionregistration/v1alpha1" "k8s.io/api/admissionregistration/v1beta1"
"k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/api/meta"
"k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/sets"
@ -102,18 +102,18 @@ func (r *TypeCheckingResult) String() string {
// as []ExpressionWarning that is ready to be set in policy.Status // as []ExpressionWarning that is ready to be set in policy.Status
// The result is nil if type checking returns no warning. // The result is nil if type checking returns no warning.
// The policy object is NOT mutated. The caller should update Status accordingly // The policy object is NOT mutated. The caller should update Status accordingly
func (c *TypeChecker) Check(policy *v1alpha1.ValidatingAdmissionPolicy) []v1alpha1.ExpressionWarning { func (c *TypeChecker) Check(policy *v1beta1.ValidatingAdmissionPolicy) []v1beta1.ExpressionWarning {
ctx := c.CreateContext(policy) ctx := c.CreateContext(policy)
// warnings to return, note that the capacity is optimistically set to zero // warnings to return, note that the capacity is optimistically set to zero
var warnings []v1alpha1.ExpressionWarning // intentionally not setting capacity var warnings []v1beta1.ExpressionWarning // intentionally not setting capacity
// check main validation expressions and their message expressions, located in spec.validations[*] // check main validation expressions and their message expressions, located in spec.validations[*]
fieldRef := field.NewPath("spec", "validations") fieldRef := field.NewPath("spec", "validations")
for i, v := range policy.Spec.Validations { for i, v := range policy.Spec.Validations {
results := c.CheckExpression(ctx, v.Expression) results := c.CheckExpression(ctx, v.Expression)
if len(results) != 0 { if len(results) != 0 {
warnings = append(warnings, v1alpha1.ExpressionWarning{ warnings = append(warnings, v1beta1.ExpressionWarning{
FieldRef: fieldRef.Index(i).Child("expression").String(), FieldRef: fieldRef.Index(i).Child("expression").String(),
Warning: results.String(), Warning: results.String(),
}) })
@ -124,7 +124,7 @@ func (c *TypeChecker) Check(policy *v1alpha1.ValidatingAdmissionPolicy) []v1alph
} }
results = c.CheckExpression(ctx, v.MessageExpression) results = c.CheckExpression(ctx, v.MessageExpression)
if len(results) != 0 { if len(results) != 0 {
warnings = append(warnings, v1alpha1.ExpressionWarning{ warnings = append(warnings, v1beta1.ExpressionWarning{
FieldRef: fieldRef.Index(i).Child("messageExpression").String(), FieldRef: fieldRef.Index(i).Child("messageExpression").String(),
Warning: results.String(), Warning: results.String(),
}) })
@ -135,7 +135,7 @@ func (c *TypeChecker) Check(policy *v1alpha1.ValidatingAdmissionPolicy) []v1alph
} }
// CreateContext resolves all types and their schemas from a policy definition and creates the context. // CreateContext resolves all types and their schemas from a policy definition and creates the context.
func (c *TypeChecker) CreateContext(policy *v1alpha1.ValidatingAdmissionPolicy) *TypeCheckingContext { func (c *TypeChecker) CreateContext(policy *v1beta1.ValidatingAdmissionPolicy) *TypeCheckingContext {
ctx := new(TypeCheckingContext) ctx := new(TypeCheckingContext)
allGvks := c.typesToCheck(policy) allGvks := c.typesToCheck(policy)
gvks := make([]schema.GroupVersionKind, 0, len(allGvks)) gvks := make([]schema.GroupVersionKind, 0, len(allGvks))
@ -203,7 +203,7 @@ func (c *TypeChecker) declType(gvk schema.GroupVersionKind) (*apiservercel.DeclT
return common.SchemaDeclType(&openapi.Schema{Schema: s}, true).MaybeAssignTypeName(generateUniqueTypeName(gvk.Kind)), nil return common.SchemaDeclType(&openapi.Schema{Schema: s}, true).MaybeAssignTypeName(generateUniqueTypeName(gvk.Kind)), nil
} }
func (c *TypeChecker) paramsGVK(policy *v1alpha1.ValidatingAdmissionPolicy) schema.GroupVersionKind { func (c *TypeChecker) paramsGVK(policy *v1beta1.ValidatingAdmissionPolicy) schema.GroupVersionKind {
if policy.Spec.ParamKind == nil { if policy.Spec.ParamKind == nil {
return schema.GroupVersionKind{} return schema.GroupVersionKind{}
} }
@ -233,7 +233,7 @@ func (c *TypeChecker) checkExpression(expression string, hasParams, hasAuthorize
// typesToCheck extracts a list of GVKs that needs type checking from the policy // typesToCheck extracts a list of GVKs that needs type checking from the policy
// the result is sorted in the order of Group, Version, and Kind // the result is sorted in the order of Group, Version, and Kind
func (c *TypeChecker) typesToCheck(p *v1alpha1.ValidatingAdmissionPolicy) []schema.GroupVersionKind { func (c *TypeChecker) typesToCheck(p *v1beta1.ValidatingAdmissionPolicy) []schema.GroupVersionKind {
gvks := sets.New[schema.GroupVersionKind]() gvks := sets.New[schema.GroupVersionKind]()
if p.Spec.MatchConstraints == nil || len(p.Spec.MatchConstraints.ResourceRules) == 0 { if p.Spec.MatchConstraints == nil || len(p.Spec.MatchConstraints.ResourceRules) == 0 {
return nil return nil
@ -294,7 +294,7 @@ func (c *TypeChecker) typesToCheck(p *v1alpha1.ValidatingAdmissionPolicy) []sche
return sortGVKList(gvks.UnsortedList()) return sortGVKList(gvks.UnsortedList())
} }
func extractGroups(rule *v1alpha1.Rule) []string { func extractGroups(rule *v1beta1.Rule) []string {
groups := make([]string, 0, len(rule.APIGroups)) groups := make([]string, 0, len(rule.APIGroups))
for _, group := range rule.APIGroups { for _, group := range rule.APIGroups {
// give up if wildcard // give up if wildcard
@ -306,7 +306,7 @@ func extractGroups(rule *v1alpha1.Rule) []string {
return groups return groups
} }
func extractVersions(rule *v1alpha1.Rule) []string { func extractVersions(rule *v1beta1.Rule) []string {
versions := make([]string, 0, len(rule.APIVersions)) versions := make([]string, 0, len(rule.APIVersions))
for _, version := range rule.APIVersions { for _, version := range rule.APIVersions {
if strings.ContainsAny(version, "*") { if strings.ContainsAny(version, "*") {
@ -317,7 +317,7 @@ func extractVersions(rule *v1alpha1.Rule) []string {
return versions return versions
} }
func extractResources(rule *v1alpha1.Rule) []string { func extractResources(rule *v1beta1.Rule) []string {
resources := make([]string, 0, len(rule.Resources)) resources := make([]string, 0, len(rule.Resources))
for _, resource := range rule.Resources { for _, resource := range rule.Resources {
// skip wildcard and subresources // skip wildcard and subresources

View File

@ -22,7 +22,7 @@ import (
"strings" "strings"
"testing" "testing"
"k8s.io/api/admissionregistration/v1alpha1" "k8s.io/api/admissionregistration/v1beta1"
appsv1 "k8s.io/api/apps/v1" appsv1 "k8s.io/api/apps/v1"
corev1 "k8s.io/api/core/v1" corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/api/meta"
@ -34,21 +34,21 @@ import (
func TestExtractTypeNames(t *testing.T) { func TestExtractTypeNames(t *testing.T) {
for _, tc := range []struct { for _, tc := range []struct {
name string name string
policy *v1alpha1.ValidatingAdmissionPolicy policy *v1beta1.ValidatingAdmissionPolicy
expected []schema.GroupVersionKind // must be sorted expected []schema.GroupVersionKind // must be sorted
}{ }{
{ {
name: "empty", name: "empty",
policy: &v1alpha1.ValidatingAdmissionPolicy{}, policy: &v1beta1.ValidatingAdmissionPolicy{},
expected: nil, expected: nil,
}, },
{ {
name: "specific", name: "specific",
policy: &v1alpha1.ValidatingAdmissionPolicy{Spec: v1alpha1.ValidatingAdmissionPolicySpec{ policy: &v1beta1.ValidatingAdmissionPolicy{Spec: v1beta1.ValidatingAdmissionPolicySpec{
MatchConstraints: &v1alpha1.MatchResources{ResourceRules: []v1alpha1.NamedRuleWithOperations{ MatchConstraints: &v1beta1.MatchResources{ResourceRules: []v1beta1.NamedRuleWithOperations{
{ {
RuleWithOperations: v1alpha1.RuleWithOperations{ RuleWithOperations: v1beta1.RuleWithOperations{
Rule: v1alpha1.Rule{ Rule: v1beta1.Rule{
APIGroups: []string{"apps"}, APIGroups: []string{"apps"},
APIVersions: []string{"v1"}, APIVersions: []string{"v1"},
Resources: []string{"deployments"}, Resources: []string{"deployments"},
@ -65,19 +65,19 @@ func TestExtractTypeNames(t *testing.T) {
}, },
{ {
name: "multiple", name: "multiple",
policy: &v1alpha1.ValidatingAdmissionPolicy{Spec: v1alpha1.ValidatingAdmissionPolicySpec{ policy: &v1beta1.ValidatingAdmissionPolicy{Spec: v1beta1.ValidatingAdmissionPolicySpec{
MatchConstraints: &v1alpha1.MatchResources{ResourceRules: []v1alpha1.NamedRuleWithOperations{ MatchConstraints: &v1beta1.MatchResources{ResourceRules: []v1beta1.NamedRuleWithOperations{
{ {
RuleWithOperations: v1alpha1.RuleWithOperations{ RuleWithOperations: v1beta1.RuleWithOperations{
Rule: v1alpha1.Rule{ Rule: v1beta1.Rule{
APIGroups: []string{"apps"}, APIGroups: []string{"apps"},
APIVersions: []string{"v1"}, APIVersions: []string{"v1"},
Resources: []string{"deployments"}, Resources: []string{"deployments"},
}, },
}, },
}, { }, {
RuleWithOperations: v1alpha1.RuleWithOperations{ RuleWithOperations: v1beta1.RuleWithOperations{
Rule: v1alpha1.Rule{ Rule: v1beta1.Rule{
APIGroups: []string{""}, APIGroups: []string{""},
APIVersions: []string{"v1"}, APIVersions: []string{"v1"},
Resources: []string{"pods"}, Resources: []string{"pods"},
@ -98,11 +98,11 @@ func TestExtractTypeNames(t *testing.T) {
}, },
{ {
name: "all resources", name: "all resources",
policy: &v1alpha1.ValidatingAdmissionPolicy{Spec: v1alpha1.ValidatingAdmissionPolicySpec{ policy: &v1beta1.ValidatingAdmissionPolicy{Spec: v1beta1.ValidatingAdmissionPolicySpec{
MatchConstraints: &v1alpha1.MatchResources{ResourceRules: []v1alpha1.NamedRuleWithOperations{ MatchConstraints: &v1beta1.MatchResources{ResourceRules: []v1beta1.NamedRuleWithOperations{
{ {
RuleWithOperations: v1alpha1.RuleWithOperations{ RuleWithOperations: v1beta1.RuleWithOperations{
Rule: v1alpha1.Rule{ Rule: v1beta1.Rule{
APIGroups: []string{"apps"}, APIGroups: []string{"apps"},
APIVersions: []string{"v1"}, APIVersions: []string{"v1"},
Resources: []string{"*"}, Resources: []string{"*"},
@ -115,11 +115,11 @@ func TestExtractTypeNames(t *testing.T) {
}, },
{ {
name: "sub resources", name: "sub resources",
policy: &v1alpha1.ValidatingAdmissionPolicy{Spec: v1alpha1.ValidatingAdmissionPolicySpec{ policy: &v1beta1.ValidatingAdmissionPolicy{Spec: v1beta1.ValidatingAdmissionPolicySpec{
MatchConstraints: &v1alpha1.MatchResources{ResourceRules: []v1alpha1.NamedRuleWithOperations{ MatchConstraints: &v1beta1.MatchResources{ResourceRules: []v1beta1.NamedRuleWithOperations{
{ {
RuleWithOperations: v1alpha1.RuleWithOperations{ RuleWithOperations: v1beta1.RuleWithOperations{
Rule: v1alpha1.Rule{ Rule: v1beta1.Rule{
APIGroups: []string{"apps"}, APIGroups: []string{"apps"},
APIVersions: []string{"v1"}, APIVersions: []string{"v1"},
Resources: []string{"pods/*"}, Resources: []string{"pods/*"},
@ -132,11 +132,11 @@ func TestExtractTypeNames(t *testing.T) {
}, },
{ {
name: "mixtures", name: "mixtures",
policy: &v1alpha1.ValidatingAdmissionPolicy{Spec: v1alpha1.ValidatingAdmissionPolicySpec{ policy: &v1beta1.ValidatingAdmissionPolicy{Spec: v1beta1.ValidatingAdmissionPolicySpec{
MatchConstraints: &v1alpha1.MatchResources{ResourceRules: []v1alpha1.NamedRuleWithOperations{ MatchConstraints: &v1beta1.MatchResources{ResourceRules: []v1beta1.NamedRuleWithOperations{
{ {
RuleWithOperations: v1alpha1.RuleWithOperations{ RuleWithOperations: v1beta1.RuleWithOperations{
Rule: v1alpha1.Rule{ Rule: v1beta1.Rule{
APIGroups: []string{"apps"}, APIGroups: []string{"apps"},
APIVersions: []string{"v1"}, APIVersions: []string{"v1"},
Resources: []string{"deployments"}, Resources: []string{"deployments"},
@ -144,8 +144,8 @@ func TestExtractTypeNames(t *testing.T) {
}, },
}, },
{ {
RuleWithOperations: v1alpha1.RuleWithOperations{ RuleWithOperations: v1beta1.RuleWithOperations{
Rule: v1alpha1.Rule{ Rule: v1beta1.Rule{
APIGroups: []string{"apps"}, APIGroups: []string{"apps"},
APIVersions: []string{"*"}, APIVersions: []string{"*"},
Resources: []string{"deployments"}, Resources: []string{"deployments"},
@ -172,16 +172,16 @@ func TestExtractTypeNames(t *testing.T) {
} }
func TestTypeCheck(t *testing.T) { func TestTypeCheck(t *testing.T) {
deploymentPolicy := &v1alpha1.ValidatingAdmissionPolicy{Spec: v1alpha1.ValidatingAdmissionPolicySpec{ deploymentPolicy := &v1beta1.ValidatingAdmissionPolicy{Spec: v1beta1.ValidatingAdmissionPolicySpec{
Validations: []v1alpha1.Validation{ Validations: []v1beta1.Validation{
{ {
Expression: "object.foo == 'bar'", Expression: "object.foo == 'bar'",
}, },
}, },
MatchConstraints: &v1alpha1.MatchResources{ResourceRules: []v1alpha1.NamedRuleWithOperations{ MatchConstraints: &v1beta1.MatchResources{ResourceRules: []v1beta1.NamedRuleWithOperations{
{ {
RuleWithOperations: v1alpha1.RuleWithOperations{ RuleWithOperations: v1beta1.RuleWithOperations{
Rule: v1alpha1.Rule{ Rule: v1beta1.Rule{
APIGroups: []string{"apps"}, APIGroups: []string{"apps"},
APIVersions: []string{"v1"}, APIVersions: []string{"v1"},
Resources: []string{"deployments"}, Resources: []string{"deployments"},
@ -194,8 +194,8 @@ func TestTypeCheck(t *testing.T) {
deploymentPolicyWithBadMessageExpression := deploymentPolicy.DeepCopy() deploymentPolicyWithBadMessageExpression := deploymentPolicy.DeepCopy()
deploymentPolicyWithBadMessageExpression.Spec.Validations[0].MessageExpression = "object.foo + 114514" // confusion deploymentPolicyWithBadMessageExpression.Spec.Validations[0].MessageExpression = "object.foo + 114514" // confusion
multiExpressionPolicy := &v1alpha1.ValidatingAdmissionPolicy{Spec: v1alpha1.ValidatingAdmissionPolicySpec{ multiExpressionPolicy := &v1beta1.ValidatingAdmissionPolicy{Spec: v1beta1.ValidatingAdmissionPolicySpec{
Validations: []v1alpha1.Validation{ Validations: []v1beta1.Validation{
{ {
Expression: "object.foo == 'bar'", Expression: "object.foo == 'bar'",
}, },
@ -203,10 +203,10 @@ func TestTypeCheck(t *testing.T) {
Expression: "object.bar == 'foo'", Expression: "object.bar == 'foo'",
}, },
}, },
MatchConstraints: &v1alpha1.MatchResources{ResourceRules: []v1alpha1.NamedRuleWithOperations{ MatchConstraints: &v1beta1.MatchResources{ResourceRules: []v1beta1.NamedRuleWithOperations{
{ {
RuleWithOperations: v1alpha1.RuleWithOperations{ RuleWithOperations: v1beta1.RuleWithOperations{
Rule: v1alpha1.Rule{ Rule: v1beta1.Rule{
APIGroups: []string{"apps"}, APIGroups: []string{"apps"},
APIVersions: []string{"v1"}, APIVersions: []string{"v1"},
Resources: []string{"deployments"}, Resources: []string{"deployments"},
@ -215,20 +215,20 @@ func TestTypeCheck(t *testing.T) {
}, },
}}, }},
}} }}
paramsRefPolicy := &v1alpha1.ValidatingAdmissionPolicy{Spec: v1alpha1.ValidatingAdmissionPolicySpec{ paramsRefPolicy := &v1beta1.ValidatingAdmissionPolicy{Spec: v1beta1.ValidatingAdmissionPolicySpec{
ParamKind: &v1alpha1.ParamKind{ ParamKind: &v1beta1.ParamKind{
APIVersion: "v1", APIVersion: "v1",
Kind: "DoesNotMatter", Kind: "DoesNotMatter",
}, },
Validations: []v1alpha1.Validation{ Validations: []v1beta1.Validation{
{ {
Expression: "object.foo == params.bar", Expression: "object.foo == params.bar",
}, },
}, },
MatchConstraints: &v1alpha1.MatchResources{ResourceRules: []v1alpha1.NamedRuleWithOperations{ MatchConstraints: &v1beta1.MatchResources{ResourceRules: []v1beta1.NamedRuleWithOperations{
{ {
RuleWithOperations: v1alpha1.RuleWithOperations{ RuleWithOperations: v1beta1.RuleWithOperations{
Rule: v1alpha1.Rule{ Rule: v1beta1.Rule{
APIGroups: []string{"apps"}, APIGroups: []string{"apps"},
APIVersions: []string{"v1"}, APIVersions: []string{"v1"},
Resources: []string{"deployments"}, Resources: []string{"deployments"},
@ -237,16 +237,16 @@ func TestTypeCheck(t *testing.T) {
}, },
}}, }},
}} }}
authorizerPolicy := &v1alpha1.ValidatingAdmissionPolicy{Spec: v1alpha1.ValidatingAdmissionPolicySpec{ authorizerPolicy := &v1beta1.ValidatingAdmissionPolicy{Spec: v1beta1.ValidatingAdmissionPolicySpec{
Validations: []v1alpha1.Validation{ Validations: []v1beta1.Validation{
{ {
Expression: "authorizer.group('').resource('endpoints').check('create').allowed()", Expression: "authorizer.group('').resource('endpoints').check('create').allowed()",
}, },
}, },
MatchConstraints: &v1alpha1.MatchResources{ResourceRules: []v1alpha1.NamedRuleWithOperations{ MatchConstraints: &v1beta1.MatchResources{ResourceRules: []v1beta1.NamedRuleWithOperations{
{ {
RuleWithOperations: v1alpha1.RuleWithOperations{ RuleWithOperations: v1beta1.RuleWithOperations{
Rule: v1alpha1.Rule{ Rule: v1beta1.Rule{
APIGroups: []string{"apps"}, APIGroups: []string{"apps"},
APIVersions: []string{"v1"}, APIVersions: []string{"v1"},
Resources: []string{"deployments"}, Resources: []string{"deployments"},
@ -255,16 +255,16 @@ func TestTypeCheck(t *testing.T) {
}, },
}}, }},
}} }}
authorizerInvalidPolicy := &v1alpha1.ValidatingAdmissionPolicy{Spec: v1alpha1.ValidatingAdmissionPolicySpec{ authorizerInvalidPolicy := &v1beta1.ValidatingAdmissionPolicy{Spec: v1beta1.ValidatingAdmissionPolicySpec{
Validations: []v1alpha1.Validation{ Validations: []v1beta1.Validation{
{ {
Expression: "authorizer.allowed()", Expression: "authorizer.allowed()",
}, },
}, },
MatchConstraints: &v1alpha1.MatchResources{ResourceRules: []v1alpha1.NamedRuleWithOperations{ MatchConstraints: &v1beta1.MatchResources{ResourceRules: []v1beta1.NamedRuleWithOperations{
{ {
RuleWithOperations: v1alpha1.RuleWithOperations{ RuleWithOperations: v1beta1.RuleWithOperations{
Rule: v1alpha1.Rule{ Rule: v1beta1.Rule{
APIGroups: []string{"apps"}, APIGroups: []string{"apps"},
APIVersions: []string{"v1"}, APIVersions: []string{"v1"},
Resources: []string{"deployments"}, Resources: []string{"deployments"},
@ -276,12 +276,12 @@ func TestTypeCheck(t *testing.T) {
for _, tc := range []struct { for _, tc := range []struct {
name string name string
schemaToReturn *spec.Schema schemaToReturn *spec.Schema
policy *v1alpha1.ValidatingAdmissionPolicy policy *v1beta1.ValidatingAdmissionPolicy
assertions []assertionFunc assertions []assertionFunc
}{ }{
{ {
name: "empty", name: "empty",
policy: &v1alpha1.ValidatingAdmissionPolicy{}, policy: &v1beta1.ValidatingAdmissionPolicy{},
assertions: []assertionFunc{toBeEmpty}, assertions: []assertionFunc{toBeEmpty},
}, },
{ {
@ -451,14 +451,14 @@ func (r *fakeSchemaResolver) ResolveSchema(gvk schema.GroupVersionKind) (*spec.S
return r.schemaToReturn, nil return r.schemaToReturn, nil
} }
func toBeEmpty(warnings []v1alpha1.ExpressionWarning, t *testing.T) { func toBeEmpty(warnings []v1beta1.ExpressionWarning, t *testing.T) {
if len(warnings) != 0 { if len(warnings) != 0 {
t.Fatalf("expected empty but got %v", warnings) t.Fatalf("expected empty but got %v", warnings)
} }
} }
func toContain(substring string) func(warnings []v1alpha1.ExpressionWarning, t *testing.T) { func toContain(substring string) func(warnings []v1beta1.ExpressionWarning, t *testing.T) {
return func(warnings []v1alpha1.ExpressionWarning, t *testing.T) { return func(warnings []v1beta1.ExpressionWarning, t *testing.T) {
if len(warnings) == 0 { if len(warnings) == 0 {
t.Errorf("expected containing %q but got empty", substring) t.Errorf("expected containing %q but got empty", substring)
} }
@ -470,8 +470,8 @@ func toContain(substring string) func(warnings []v1alpha1.ExpressionWarning, t *
} }
} }
func toHaveLengthOf(expected int) func(warnings []v1alpha1.ExpressionWarning, t *testing.T) { func toHaveLengthOf(expected int) func(warnings []v1beta1.ExpressionWarning, t *testing.T) {
return func(warnings []v1alpha1.ExpressionWarning, t *testing.T) { return func(warnings []v1beta1.ExpressionWarning, t *testing.T) {
got := len(warnings) got := len(warnings)
if expected != got { if expected != got {
t.Errorf("expect warnings to have length of %d, but got %d", expected, got) t.Errorf("expect warnings to have length of %d, but got %d", expected, got)
@ -479,8 +479,8 @@ func toHaveLengthOf(expected int) func(warnings []v1alpha1.ExpressionWarning, t
} }
} }
func toHaveFieldRef(paths ...string) func(warnings []v1alpha1.ExpressionWarning, t *testing.T) { func toHaveFieldRef(paths ...string) func(warnings []v1beta1.ExpressionWarning, t *testing.T) {
return func(warnings []v1alpha1.ExpressionWarning, t *testing.T) { return func(warnings []v1beta1.ExpressionWarning, t *testing.T) {
if len(paths) != len(warnings) { if len(paths) != len(warnings) {
t.Errorf("expect warnings to have length of %d, but got %d", len(paths), len(warnings)) t.Errorf("expect warnings to have length of %d, but got %d", len(paths), len(warnings))
} }
@ -492,4 +492,4 @@ func toHaveFieldRef(paths ...string) func(warnings []v1alpha1.ExpressionWarning,
} }
} }
type assertionFunc func(warnings []v1alpha1.ExpressionWarning, t *testing.T) type assertionFunc func(warnings []v1beta1.ExpressionWarning, t *testing.T)

View File

@ -25,7 +25,7 @@ import (
"github.com/onsi/gomega" "github.com/onsi/gomega"
admissionregistrationv1 "k8s.io/api/admissionregistration/v1" admissionregistrationv1 "k8s.io/api/admissionregistration/v1"
admissionregistrationv1alpha1 "k8s.io/api/admissionregistration/v1alpha1" admissionregistrationv1beta1 "k8s.io/api/admissionregistration/v1beta1"
appsv1 "k8s.io/api/apps/v1" appsv1 "k8s.io/api/apps/v1"
v1 "k8s.io/api/core/v1" v1 "k8s.io/api/core/v1"
apierrors "k8s.io/apimachinery/pkg/api/errors" apierrors "k8s.io/apimachinery/pkg/api/errors"
@ -46,10 +46,10 @@ var _ = SIGDescribe("ValidatingAdmissionPolicy [Privileged:ClusterAdmin][Alpha][
var err error var err error
client, err = clientset.NewForConfig(f.ClientConfig()) client, err = clientset.NewForConfig(f.ClientConfig())
framework.ExpectNoError(err, "initializing client") framework.ExpectNoError(err, "initializing client")
_, err = client.AdmissionregistrationV1alpha1().ValidatingAdmissionPolicies().List(context.Background(), metav1.ListOptions{}) _, err = client.AdmissionregistrationV1beta1().ValidatingAdmissionPolicies().List(context.Background(), metav1.ListOptions{})
if apierrors.IsNotFound(err) { if apierrors.IsNotFound(err) {
// TODO: feature check should fail after GA graduation // TODO: feature check should fail after GA graduation
ginkgo.Skip(fmt.Sprintf("server does not support ValidatingAdmissionPolicy v1alpha1: %v, feature gate not enabled?", err)) ginkgo.Skip(fmt.Sprintf("server does not support ValidatingAdmissionPolicy v1beta1: %v, feature gate not enabled?", err))
} }
}) })
@ -68,25 +68,25 @@ var _ = SIGDescribe("ValidatingAdmissionPolicy [Privileged:ClusterAdmin][Alpha][
StartResourceRule(). StartResourceRule().
MatchResource([]string{"apps"}, []string{"v1"}, []string{"deployments"}). MatchResource([]string{"apps"}, []string{"v1"}, []string{"deployments"}).
EndResourceRule(). EndResourceRule().
WithValidation(admissionregistrationv1alpha1.Validation{ WithValidation(admissionregistrationv1beta1.Validation{
Expression: "object.spec.replicas > 1", Expression: "object.spec.replicas > 1",
MessageExpression: "'wants replicas > 1, got ' + object.spec.replicas", MessageExpression: "'wants replicas > 1, got ' + object.spec.replicas",
}). }).
WithValidation(admissionregistrationv1alpha1.Validation{ WithValidation(admissionregistrationv1beta1.Validation{
Expression: "namespaceObject.metadata.name == '" + f.UniqueName + "'", Expression: "namespaceObject.metadata.name == '" + f.UniqueName + "'",
Message: "Internal error! Other namespace should not be allowed.", Message: "Internal error! Other namespace should not be allowed.",
}). }).
Build() Build()
policy, err := client.AdmissionregistrationV1alpha1().ValidatingAdmissionPolicies().Create(ctx, policy, metav1.CreateOptions{}) policy, err := client.AdmissionregistrationV1beta1().ValidatingAdmissionPolicies().Create(ctx, policy, metav1.CreateOptions{})
framework.ExpectNoError(err, "create policy") framework.ExpectNoError(err, "create policy")
ginkgo.DeferCleanup(func(ctx context.Context, name string) error { ginkgo.DeferCleanup(func(ctx context.Context, name string) error {
return client.AdmissionregistrationV1alpha1().ValidatingAdmissionPolicies().Delete(ctx, name, metav1.DeleteOptions{}) return client.AdmissionregistrationV1beta1().ValidatingAdmissionPolicies().Delete(ctx, name, metav1.DeleteOptions{})
}, policy.Name) }, policy.Name)
binding := createBinding(f.UniqueName+".binding.example.com", f.UniqueName, policy.Name) binding := createBinding(f.UniqueName+".binding.example.com", f.UniqueName, policy.Name)
binding, err = client.AdmissionregistrationV1alpha1().ValidatingAdmissionPolicyBindings().Create(ctx, binding, metav1.CreateOptions{}) binding, err = client.AdmissionregistrationV1beta1().ValidatingAdmissionPolicyBindings().Create(ctx, binding, metav1.CreateOptions{})
framework.ExpectNoError(err, "create policy binding") framework.ExpectNoError(err, "create policy binding")
ginkgo.DeferCleanup(func(ctx context.Context, name string) error { ginkgo.DeferCleanup(func(ctx context.Context, name string) error {
return client.AdmissionregistrationV1alpha1().ValidatingAdmissionPolicyBindings().Delete(ctx, name, metav1.DeleteOptions{}) return client.AdmissionregistrationV1beta1().ValidatingAdmissionPolicyBindings().Delete(ctx, name, metav1.DeleteOptions{})
}, binding.Name) }, binding.Name)
}) })
ginkgo.By("waiting until the marker is denied", func() { ginkgo.By("waiting until the marker is denied", func() {
@ -119,27 +119,27 @@ var _ = SIGDescribe("ValidatingAdmissionPolicy [Privileged:ClusterAdmin][Alpha][
}) })
ginkgo.It("should type check validation expressions", func(ctx context.Context) { ginkgo.It("should type check validation expressions", func(ctx context.Context) {
var policy *admissionregistrationv1alpha1.ValidatingAdmissionPolicy var policy *admissionregistrationv1beta1.ValidatingAdmissionPolicy
ginkgo.By("creating the policy with correct types", func() { ginkgo.By("creating the policy with correct types", func() {
policy = newValidatingAdmissionPolicyBuilder(f.UniqueName+".correct-policy.example.com"). policy = newValidatingAdmissionPolicyBuilder(f.UniqueName+".correct-policy.example.com").
MatchUniqueNamespace(f.UniqueName). MatchUniqueNamespace(f.UniqueName).
StartResourceRule(). StartResourceRule().
MatchResource([]string{"apps"}, []string{"v1"}, []string{"deployments"}). MatchResource([]string{"apps"}, []string{"v1"}, []string{"deployments"}).
EndResourceRule(). EndResourceRule().
WithValidation(admissionregistrationv1alpha1.Validation{ WithValidation(admissionregistrationv1beta1.Validation{
Expression: "object.spec.replicas > 1", Expression: "object.spec.replicas > 1",
}). }).
Build() Build()
var err error var err error
policy, err = client.AdmissionregistrationV1alpha1().ValidatingAdmissionPolicies().Create(ctx, policy, metav1.CreateOptions{}) policy, err = client.AdmissionregistrationV1beta1().ValidatingAdmissionPolicies().Create(ctx, policy, metav1.CreateOptions{})
framework.ExpectNoError(err, "create policy") framework.ExpectNoError(err, "create policy")
ginkgo.DeferCleanup(func(ctx context.Context, name string) error { ginkgo.DeferCleanup(func(ctx context.Context, name string) error {
return client.AdmissionregistrationV1alpha1().ValidatingAdmissionPolicies().Delete(ctx, name, metav1.DeleteOptions{}) return client.AdmissionregistrationV1beta1().ValidatingAdmissionPolicies().Delete(ctx, name, metav1.DeleteOptions{})
}, policy.Name) }, policy.Name)
}) })
ginkgo.By("waiting for the type check to finish without any warnings", func() { ginkgo.By("waiting for the type check to finish without any warnings", func() {
err := wait.PollUntilContextCancel(ctx, 100*time.Millisecond, true, func(ctx context.Context) (done bool, err error) { err := wait.PollUntilContextCancel(ctx, 100*time.Millisecond, true, func(ctx context.Context) (done bool, err error) {
policy, err = client.AdmissionregistrationV1alpha1().ValidatingAdmissionPolicies().Get(ctx, policy.Name, metav1.GetOptions{}) policy, err = client.AdmissionregistrationV1beta1().ValidatingAdmissionPolicies().Get(ctx, policy.Name, metav1.GetOptions{})
if err != nil { if err != nil {
return false, err return false, err
} }
@ -157,21 +157,21 @@ var _ = SIGDescribe("ValidatingAdmissionPolicy [Privileged:ClusterAdmin][Alpha][
StartResourceRule(). StartResourceRule().
MatchResource([]string{"apps"}, []string{"v1"}, []string{"deployments"}). MatchResource([]string{"apps"}, []string{"v1"}, []string{"deployments"}).
EndResourceRule(). EndResourceRule().
WithValidation(admissionregistrationv1alpha1.Validation{ WithValidation(admissionregistrationv1beta1.Validation{
Expression: "object.spec.replicas > '1'", // confusion: int > string Expression: "object.spec.replicas > '1'", // confusion: int > string
MessageExpression: "'wants replicas > 1, got ' + object.spec.replicas", // confusion: string + int MessageExpression: "'wants replicas > 1, got ' + object.spec.replicas", // confusion: string + int
}). }).
Build() Build()
var err error var err error
policy, err = client.AdmissionregistrationV1alpha1().ValidatingAdmissionPolicies().Create(ctx, policy, metav1.CreateOptions{}) policy, err = client.AdmissionregistrationV1beta1().ValidatingAdmissionPolicies().Create(ctx, policy, metav1.CreateOptions{})
framework.ExpectNoError(err, "create policy") framework.ExpectNoError(err, "create policy")
ginkgo.DeferCleanup(func(ctx context.Context, name string) error { ginkgo.DeferCleanup(func(ctx context.Context, name string) error {
return client.AdmissionregistrationV1alpha1().ValidatingAdmissionPolicies().Delete(ctx, name, metav1.DeleteOptions{}) return client.AdmissionregistrationV1beta1().ValidatingAdmissionPolicies().Delete(ctx, name, metav1.DeleteOptions{})
}, policy.Name) }, policy.Name)
}) })
ginkgo.By("waiting for the type check to finish with warnings", func() { ginkgo.By("waiting for the type check to finish with warnings", func() {
err := wait.PollUntilContextCancel(ctx, 100*time.Millisecond, true, func(ctx context.Context) (done bool, err error) { err := wait.PollUntilContextCancel(ctx, 100*time.Millisecond, true, func(ctx context.Context) (done bool, err error) {
policy, err = client.AdmissionregistrationV1alpha1().ValidatingAdmissionPolicies().Get(ctx, policy.Name, metav1.GetOptions{}) policy, err = client.AdmissionregistrationV1beta1().ValidatingAdmissionPolicies().Get(ctx, policy.Name, metav1.GetOptions{})
if err != nil { if err != nil {
return false, err return false, err
} }
@ -200,28 +200,28 @@ var _ = SIGDescribe("ValidatingAdmissionPolicy [Privileged:ClusterAdmin][Alpha][
StartResourceRule(). StartResourceRule().
MatchResource([]string{"apps"}, []string{"v1"}, []string{"deployments"}). MatchResource([]string{"apps"}, []string{"v1"}, []string{"deployments"}).
EndResourceRule(). EndResourceRule().
WithVariable(admissionregistrationv1alpha1.Variable{ WithVariable(admissionregistrationv1beta1.Variable{
Name: "replicas", Name: "replicas",
Expression: "object.spec.replicas", Expression: "object.spec.replicas",
}). }).
WithVariable(admissionregistrationv1alpha1.Variable{ WithVariable(admissionregistrationv1beta1.Variable{
Name: "replicasReminder", // a bit artificial but good for testing purpose Name: "replicasReminder", // a bit artificial but good for testing purpose
Expression: "variables.replicas % 2", Expression: "variables.replicas % 2",
}). }).
WithValidation(admissionregistrationv1alpha1.Validation{ WithValidation(admissionregistrationv1beta1.Validation{
Expression: "variables.replicas > 1 && variables.replicasReminder == 1", Expression: "variables.replicas > 1 && variables.replicasReminder == 1",
}). }).
Build() Build()
policy, err := client.AdmissionregistrationV1alpha1().ValidatingAdmissionPolicies().Create(ctx, policy, metav1.CreateOptions{}) policy, err := client.AdmissionregistrationV1beta1().ValidatingAdmissionPolicies().Create(ctx, policy, metav1.CreateOptions{})
framework.ExpectNoError(err, "create policy") framework.ExpectNoError(err, "create policy")
ginkgo.DeferCleanup(func(ctx context.Context, name string) error { ginkgo.DeferCleanup(func(ctx context.Context, name string) error {
return client.AdmissionregistrationV1alpha1().ValidatingAdmissionPolicies().Delete(ctx, name, metav1.DeleteOptions{}) return client.AdmissionregistrationV1beta1().ValidatingAdmissionPolicies().Delete(ctx, name, metav1.DeleteOptions{})
}, policy.Name) }, policy.Name)
binding := createBinding(f.UniqueName+".binding.example.com", f.UniqueName, policy.Name) binding := createBinding(f.UniqueName+".binding.example.com", f.UniqueName, policy.Name)
binding, err = client.AdmissionregistrationV1alpha1().ValidatingAdmissionPolicyBindings().Create(ctx, binding, metav1.CreateOptions{}) binding, err = client.AdmissionregistrationV1beta1().ValidatingAdmissionPolicyBindings().Create(ctx, binding, metav1.CreateOptions{})
framework.ExpectNoError(err, "create policy binding") framework.ExpectNoError(err, "create policy binding")
ginkgo.DeferCleanup(func(ctx context.Context, name string) error { ginkgo.DeferCleanup(func(ctx context.Context, name string) error {
return client.AdmissionregistrationV1alpha1().ValidatingAdmissionPolicyBindings().Delete(ctx, name, metav1.DeleteOptions{}) return client.AdmissionregistrationV1beta1().ValidatingAdmissionPolicyBindings().Delete(ctx, name, metav1.DeleteOptions{})
}, binding.Name) }, binding.Name)
}) })
ginkgo.By("waiting until the marker is denied", func() { ginkgo.By("waiting until the marker is denied", func() {
@ -254,17 +254,17 @@ var _ = SIGDescribe("ValidatingAdmissionPolicy [Privileged:ClusterAdmin][Alpha][
}) })
}) })
func createBinding(bindingName string, uniqueLabel string, policyName string) *admissionregistrationv1alpha1.ValidatingAdmissionPolicyBinding { func createBinding(bindingName string, uniqueLabel string, policyName string) *admissionregistrationv1beta1.ValidatingAdmissionPolicyBinding {
return &admissionregistrationv1alpha1.ValidatingAdmissionPolicyBinding{ return &admissionregistrationv1beta1.ValidatingAdmissionPolicyBinding{
ObjectMeta: metav1.ObjectMeta{Name: bindingName}, ObjectMeta: metav1.ObjectMeta{Name: bindingName},
Spec: admissionregistrationv1alpha1.ValidatingAdmissionPolicyBindingSpec{ Spec: admissionregistrationv1beta1.ValidatingAdmissionPolicyBindingSpec{
PolicyName: policyName, PolicyName: policyName,
MatchResources: &admissionregistrationv1alpha1.MatchResources{ MatchResources: &admissionregistrationv1beta1.MatchResources{
NamespaceSelector: &metav1.LabelSelector{ NamespaceSelector: &metav1.LabelSelector{
MatchLabels: map[string]string{uniqueLabel: "true"}, MatchLabels: map[string]string{uniqueLabel: "true"},
}, },
}, },
ValidationActions: []admissionregistrationv1alpha1.ValidationAction{admissionregistrationv1alpha1.Deny}, ValidationActions: []admissionregistrationv1beta1.ValidationAction{admissionregistrationv1beta1.Deny},
}, },
} }
} }
@ -324,17 +324,17 @@ func basicReplicaSet(name string, replicas int32) *appsv1.ReplicaSet {
} }
type validatingAdmissionPolicyBuilder struct { type validatingAdmissionPolicyBuilder struct {
policy *admissionregistrationv1alpha1.ValidatingAdmissionPolicy policy *admissionregistrationv1beta1.ValidatingAdmissionPolicy
} }
type resourceRuleBuilder struct { type resourceRuleBuilder struct {
policyBuilder *validatingAdmissionPolicyBuilder policyBuilder *validatingAdmissionPolicyBuilder
resourceRule *admissionregistrationv1alpha1.NamedRuleWithOperations resourceRule *admissionregistrationv1beta1.NamedRuleWithOperations
} }
func newValidatingAdmissionPolicyBuilder(policyName string) *validatingAdmissionPolicyBuilder { func newValidatingAdmissionPolicyBuilder(policyName string) *validatingAdmissionPolicyBuilder {
return &validatingAdmissionPolicyBuilder{ return &validatingAdmissionPolicyBuilder{
policy: &admissionregistrationv1alpha1.ValidatingAdmissionPolicy{ policy: &admissionregistrationv1beta1.ValidatingAdmissionPolicy{
ObjectMeta: metav1.ObjectMeta{Name: policyName}, ObjectMeta: metav1.ObjectMeta{Name: policyName},
}, },
} }
@ -342,7 +342,7 @@ func newValidatingAdmissionPolicyBuilder(policyName string) *validatingAdmission
func (b *validatingAdmissionPolicyBuilder) MatchUniqueNamespace(uniqueLabel string) *validatingAdmissionPolicyBuilder { func (b *validatingAdmissionPolicyBuilder) MatchUniqueNamespace(uniqueLabel string) *validatingAdmissionPolicyBuilder {
if b.policy.Spec.MatchConstraints == nil { if b.policy.Spec.MatchConstraints == nil {
b.policy.Spec.MatchConstraints = &admissionregistrationv1alpha1.MatchResources{} b.policy.Spec.MatchConstraints = &admissionregistrationv1beta1.MatchResources{}
} }
b.policy.Spec.MatchConstraints.NamespaceSelector = &metav1.LabelSelector{ b.policy.Spec.MatchConstraints.NamespaceSelector = &metav1.LabelSelector{
MatchLabels: map[string]string{ MatchLabels: map[string]string{
@ -355,10 +355,10 @@ func (b *validatingAdmissionPolicyBuilder) MatchUniqueNamespace(uniqueLabel stri
func (b *validatingAdmissionPolicyBuilder) StartResourceRule() *resourceRuleBuilder { func (b *validatingAdmissionPolicyBuilder) StartResourceRule() *resourceRuleBuilder {
return &resourceRuleBuilder{ return &resourceRuleBuilder{
policyBuilder: b, policyBuilder: b,
resourceRule: &admissionregistrationv1alpha1.NamedRuleWithOperations{ resourceRule: &admissionregistrationv1beta1.NamedRuleWithOperations{
RuleWithOperations: admissionregistrationv1alpha1.RuleWithOperations{ RuleWithOperations: admissionregistrationv1beta1.RuleWithOperations{
Operations: []admissionregistrationv1.OperationType{admissionregistrationv1.Create, admissionregistrationv1.Update}, Operations: []admissionregistrationv1.OperationType{admissionregistrationv1.Create, admissionregistrationv1.Update},
Rule: admissionregistrationv1alpha1.Rule{ Rule: admissionregistrationv1beta1.Rule{
APIGroups: []string{"apps"}, APIGroups: []string{"apps"},
APIVersions: []string{"v1"}, APIVersions: []string{"v1"},
Resources: []string{"deployments"}, Resources: []string{"deployments"},
@ -374,7 +374,7 @@ func (rb *resourceRuleBuilder) CreateAndUpdate() *resourceRuleBuilder {
} }
func (rb *resourceRuleBuilder) MatchResource(groups []string, versions []string, resources []string) *resourceRuleBuilder { func (rb *resourceRuleBuilder) MatchResource(groups []string, versions []string, resources []string) *resourceRuleBuilder {
rb.resourceRule.Rule = admissionregistrationv1alpha1.Rule{ rb.resourceRule.Rule = admissionregistrationv1beta1.Rule{
APIGroups: groups, APIGroups: groups,
APIVersions: versions, APIVersions: versions,
Resources: resources, Resources: resources,
@ -385,22 +385,22 @@ func (rb *resourceRuleBuilder) MatchResource(groups []string, versions []string,
func (rb *resourceRuleBuilder) EndResourceRule() *validatingAdmissionPolicyBuilder { func (rb *resourceRuleBuilder) EndResourceRule() *validatingAdmissionPolicyBuilder {
b := rb.policyBuilder b := rb.policyBuilder
if b.policy.Spec.MatchConstraints == nil { if b.policy.Spec.MatchConstraints == nil {
b.policy.Spec.MatchConstraints = &admissionregistrationv1alpha1.MatchResources{} b.policy.Spec.MatchConstraints = &admissionregistrationv1beta1.MatchResources{}
} }
b.policy.Spec.MatchConstraints.ResourceRules = append(b.policy.Spec.MatchConstraints.ResourceRules, *rb.resourceRule) b.policy.Spec.MatchConstraints.ResourceRules = append(b.policy.Spec.MatchConstraints.ResourceRules, *rb.resourceRule)
return b return b
} }
func (b *validatingAdmissionPolicyBuilder) WithValidation(validation admissionregistrationv1alpha1.Validation) *validatingAdmissionPolicyBuilder { func (b *validatingAdmissionPolicyBuilder) WithValidation(validation admissionregistrationv1beta1.Validation) *validatingAdmissionPolicyBuilder {
b.policy.Spec.Validations = append(b.policy.Spec.Validations, validation) b.policy.Spec.Validations = append(b.policy.Spec.Validations, validation)
return b return b
} }
func (b *validatingAdmissionPolicyBuilder) WithVariable(variable admissionregistrationv1alpha1.Variable) *validatingAdmissionPolicyBuilder { func (b *validatingAdmissionPolicyBuilder) WithVariable(variable admissionregistrationv1beta1.Variable) *validatingAdmissionPolicyBuilder {
b.policy.Spec.Variables = append(b.policy.Spec.Variables, variable) b.policy.Spec.Variables = append(b.policy.Spec.Variables, variable)
return b return b
} }
func (b *validatingAdmissionPolicyBuilder) Build() *admissionregistrationv1alpha1.ValidatingAdmissionPolicy { func (b *validatingAdmissionPolicyBuilder) Build() *admissionregistrationv1beta1.ValidatingAdmissionPolicy {
return b.policy return b.policy
} }