1
0
Fork 0
mirror of https://github.com/kyverno/kyverno.git synced 2025-03-05 15:37:19 +00:00

refactor: switch to admission v1 (#3526)

Signed-off-by: Charles-Edouard Brétéché <charled.breteche@gmail.com>

Co-authored-by: shuting <shuting@nirmata.com>
This commit is contained in:
Charles-Edouard Brétéché 2022-04-06 22:43:07 +02:00 committed by GitHub
parent c8275b7c00
commit 06c2b2bb79
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
21 changed files with 108 additions and 109 deletions

View file

@ -1,7 +1,7 @@
package v1 package v1
import ( import (
"k8s.io/api/admission/v1beta1" admissionv1 "k8s.io/api/admission/v1"
authenticationv1 "k8s.io/api/authentication/v1" authenticationv1 "k8s.io/api/authentication/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
) )
@ -55,7 +55,7 @@ type AdmissionRequestInfoObject struct {
// +optional // +optional
AdmissionRequest string `json:"admissionRequest,omitempty" yaml:"admissionRequest,omitempty"` AdmissionRequest string `json:"admissionRequest,omitempty" yaml:"admissionRequest,omitempty"`
// +optional // +optional
Operation v1beta1.Operation `json:"operation,omitempty" yaml:"operation,omitempty"` Operation admissionv1.Operation `json:"operation,omitempty" yaml:"operation,omitempty"`
} }
// RequestInfo contains permission info carried in an admission request. // RequestInfo contains permission info carried in an admission request.

View file

@ -110,8 +110,8 @@ string
<td> <td>
<code>operation</code></br> <code>operation</code></br>
<em> <em>
<a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.18/#operation-v1beta1-admission"> <a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.18/#operation-v1-admission">
Kubernetes admission/v1beta1.Operation Kubernetes admission/v1.Operation
</a> </a>
</em> </em>
</td> </td>

View file

@ -10,7 +10,7 @@ import (
jsonpatch "github.com/evanphx/json-patch/v5" jsonpatch "github.com/evanphx/json-patch/v5"
"github.com/go-logr/logr" "github.com/go-logr/logr"
kyverno "github.com/kyverno/kyverno/api/kyverno/v1" kyverno "github.com/kyverno/kyverno/api/kyverno/v1"
"k8s.io/api/admission/v1beta1" admissionv1 "k8s.io/api/admission/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/log"
) )
@ -19,7 +19,7 @@ import (
type Interface interface { type Interface interface {
// AddRequest marshals and adds the admission request to the context // AddRequest marshals and adds the admission request to the context
AddRequest(request *v1beta1.AdmissionRequest) error AddRequest(request *admissionv1.AdmissionRequest) error
// AddJSON merges the json with context // AddJSON merges the json with context
AddJSON(dataRaw []byte) error AddJSON(dataRaw []byte) error
@ -97,7 +97,7 @@ func (ctx *Context) AddJSONObject(jsonData interface{}) error {
} }
// AddRequest adds an admission request to context // AddRequest adds an admission request to context
func (ctx *Context) AddRequest(request *v1beta1.AdmissionRequest) error { func (ctx *Context) AddRequest(request *admissionv1.AdmissionRequest) error {
modifiedResource := struct { modifiedResource := struct {
Request interface{} `json:"request"` Request interface{} `json:"request"`
}{ }{

View file

@ -4,7 +4,7 @@ import (
"testing" "testing"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"k8s.io/api/admission/v1beta1" admissionv1 "k8s.io/api/admission/v1"
) )
func TestHasChanged(t *testing.T) { func TestHasChanged(t *testing.T) {
@ -27,7 +27,7 @@ func TestHasChanged(t *testing.T) {
} }
func TestRequestNotInitialize(t *testing.T) { func TestRequestNotInitialize(t *testing.T) {
request := &v1beta1.AdmissionRequest{} request := &admissionv1.AdmissionRequest{}
ctx := NewContext() ctx := NewContext()
ctx.AddRequest(request) ctx.AddRequest(request)
@ -36,7 +36,7 @@ func TestRequestNotInitialize(t *testing.T) {
} }
func TestMissingOldObject(t *testing.T) { func TestMissingOldObject(t *testing.T) {
request := &v1beta1.AdmissionRequest{} request := &admissionv1.AdmissionRequest{}
ctx := NewContext() ctx := NewContext()
ctx.AddRequest(request) ctx.AddRequest(request)
request.Object.Raw = []byte(`{"a": {"b": 1, "c": 2}, "d": 3}`) request.Object.Raw = []byte(`{"a": {"b": 1, "c": 2}, "d": 3}`)
@ -46,7 +46,7 @@ func TestMissingOldObject(t *testing.T) {
} }
func TestMissingObject(t *testing.T) { func TestMissingObject(t *testing.T) {
request := &v1beta1.AdmissionRequest{} request := &admissionv1.AdmissionRequest{}
ctx := NewContext() ctx := NewContext()
ctx.AddRequest(request) ctx.AddRequest(request)
request.OldObject.Raw = []byte(`{"a": {"b": 1, "c": 2}, "d": 3}`) request.OldObject.Raw = []byte(`{"a": {"b": 1, "c": 2}, "d": 3}`)
@ -56,7 +56,7 @@ func TestMissingObject(t *testing.T) {
} }
func createTestContext(obj, oldObj string) *Context { func createTestContext(obj, oldObj string) *Context {
request := &v1beta1.AdmissionRequest{} request := &admissionv1.AdmissionRequest{}
request.Operation = "UPDATE" request.Operation = "UPDATE"
request.Object.Raw = []byte(obj) request.Object.Raw = []byte(obj)
request.OldObject.Raw = []byte(oldObj) request.OldObject.Raw = []byte(oldObj)

View file

@ -13,7 +13,7 @@ import (
"github.com/kyverno/kyverno/pkg/kyverno/store" "github.com/kyverno/kyverno/pkg/kyverno/store"
utils2 "github.com/kyverno/kyverno/pkg/utils" utils2 "github.com/kyverno/kyverno/pkg/utils"
"gotest.tools/assert" "gotest.tools/assert"
"k8s.io/api/admission/v1beta1" admissionv1 "k8s.io/api/admission/v1"
) )
func TestGetAnchorsFromMap_ThereAreAnchors(t *testing.T) { func TestGetAnchorsFromMap_ThereAreAnchors(t *testing.T) {
@ -2104,7 +2104,7 @@ func executeTest(t *testing.T, err error, test testCase) {
t.Fatal(err) t.Fatal(err)
} }
var request *v1beta1.AdmissionRequest var request *admissionv1.AdmissionRequest
err = json.Unmarshal(test.request, &request) err = json.Unmarshal(test.request, &request)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)

View file

@ -23,7 +23,7 @@ import (
"github.com/kyverno/kyverno/pkg/engine/utils" "github.com/kyverno/kyverno/pkg/engine/utils"
"github.com/kyverno/kyverno/pkg/engine/variables" "github.com/kyverno/kyverno/pkg/engine/variables"
kyvernoutils "github.com/kyverno/kyverno/pkg/utils" kyvernoutils "github.com/kyverno/kyverno/pkg/utils"
"k8s.io/api/admission/v1beta1" admissionv1 "k8s.io/api/admission/v1"
apierrors "k8s.io/apimachinery/pkg/api/errors" apierrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
@ -146,13 +146,13 @@ func (c *Controller) applyGenerate(resource unstructured.Unstructured, gr kyvern
} }
requestString := gr.Spec.Context.AdmissionRequestInfo.AdmissionRequest requestString := gr.Spec.Context.AdmissionRequestInfo.AdmissionRequest
var request v1beta1.AdmissionRequest var request admissionv1.AdmissionRequest
err = json.Unmarshal([]byte(requestString), &request) err = json.Unmarshal([]byte(requestString), &request)
if err != nil { if err != nil {
logger.Error(err, "error parsing the request string") logger.Error(err, "error parsing the request string")
} }
if gr.Spec.Context.AdmissionRequestInfo.Operation == v1beta1.Update { if gr.Spec.Context.AdmissionRequestInfo.Operation == admissionv1.Update {
request.Operation = gr.Spec.Context.AdmissionRequestInfo.Operation request.Operation = gr.Spec.Context.AdmissionRequestInfo.Operation
} }

View file

@ -4,11 +4,8 @@ import (
"reflect" "reflect"
"time" "time"
kyverno "github.com/kyverno/kyverno/api/kyverno/v1"
"k8s.io/api/admission/v1beta1"
"k8s.io/client-go/kubernetes"
"github.com/go-logr/logr" "github.com/go-logr/logr"
kyverno "github.com/kyverno/kyverno/api/kyverno/v1"
"github.com/kyverno/kyverno/pkg/autogen" "github.com/kyverno/kyverno/pkg/autogen"
kyvernoclient "github.com/kyverno/kyverno/pkg/client/clientset/versioned" kyvernoclient "github.com/kyverno/kyverno/pkg/client/clientset/versioned"
kyvernoinformer "github.com/kyverno/kyverno/pkg/client/informers/externalversions/kyverno/v1" kyvernoinformer "github.com/kyverno/kyverno/pkg/client/informers/externalversions/kyverno/v1"
@ -16,12 +13,14 @@ import (
"github.com/kyverno/kyverno/pkg/config" "github.com/kyverno/kyverno/pkg/config"
dclient "github.com/kyverno/kyverno/pkg/dclient" dclient "github.com/kyverno/kyverno/pkg/dclient"
"github.com/kyverno/kyverno/pkg/event" "github.com/kyverno/kyverno/pkg/event"
admissionv1 "k8s.io/api/admission/v1"
apierrors "k8s.io/apimachinery/pkg/api/errors" apierrors "k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
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/client-go/dynamic/dynamicinformer" "k8s.io/client-go/dynamic/dynamicinformer"
"k8s.io/client-go/informers" "k8s.io/client-go/informers"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/cache" "k8s.io/client-go/tools/cache"
"k8s.io/client-go/util/workqueue" "k8s.io/client-go/util/workqueue"
) )
@ -237,7 +236,7 @@ func (c *Controller) updateGenericResource(old, cur interface{}) {
// re-evaluate the GR as the resource was updated // re-evaluate the GR as the resource was updated
for _, gr := range grs { for _, gr := range grs {
gr.Spec.Context.AdmissionRequestInfo.Operation = v1beta1.Update gr.Spec.Context.AdmissionRequestInfo.Operation = admissionv1.Update
c.enqueueGenerateRequest(gr) c.enqueueGenerateRequest(gr)
} }
} }
@ -294,7 +293,7 @@ func (c *Controller) updatePolicy(old, cur interface{}) {
// re-evaluate the GR as the policy was updated // re-evaluate the GR as the policy was updated
for _, gr := range grs { for _, gr := range grs {
gr.Spec.Context.AdmissionRequestInfo.Operation = v1beta1.Update gr.Spec.Context.AdmissionRequestInfo.Operation = admissionv1.Update
c.enqueueGenerateRequest(gr) c.enqueueGenerateRequest(gr)
} }
} }

View file

@ -22,7 +22,7 @@ import (
"github.com/kyverno/kyverno/pkg/utils" "github.com/kyverno/kyverno/pkg/utils"
kubeutils "github.com/kyverno/kyverno/pkg/utils/kube" kubeutils "github.com/kyverno/kyverno/pkg/utils/kube"
"github.com/pkg/errors" "github.com/pkg/errors"
v1beta1 "k8s.io/api/admission/v1beta1" admissionv1 "k8s.io/api/admission/v1"
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions" "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/sets"
@ -78,7 +78,7 @@ func validateJSONPatchPathForForwardSlash(patch string) error {
} }
// Validate checks the policy and rules declarations for required configurations // Validate checks the policy and rules declarations for required configurations
func Validate(policy kyverno.PolicyInterface, client *dclient.Client, mock bool, openAPIController *openapi.Controller) (*v1beta1.AdmissionResponse, error) { func Validate(policy kyverno.PolicyInterface, client *dclient.Client, mock bool, openAPIController *openapi.Controller) (*admissionv1.AdmissionResponse, error) {
namespaced := policy.IsNamespaced() namespaced := policy.IsNamespaced()
spec := policy.GetSpec() spec := policy.GetSpec()
background := spec.BackgroundProcessingEnabled() background := spec.BackgroundProcessingEnabled()
@ -122,7 +122,7 @@ func Validate(policy kyverno.PolicyInterface, client *dclient.Client, mock bool,
if jsonPatchOnPod(rule) { if jsonPatchOnPod(rule) {
log.Log.V(1).Info("Pods managed by workload controllers cannot be mutated using policies. Use the autogen feature or write policies that match Pod controllers.") log.Log.V(1).Info("Pods managed by workload controllers cannot be mutated using policies. Use the autogen feature or write policies that match Pod controllers.")
return &v1beta1.AdmissionResponse{ return &admissionv1.AdmissionResponse{
Allowed: true, Allowed: true,
Warnings: []string{"Pods managed by workload controllers cannot be mutated using policies. Use the autogen feature or write policies that match Pod controllers."}, Warnings: []string{"Pods managed by workload controllers cannot be mutated using policies. Use the autogen feature or write policies that match Pod controllers."},
}, nil }, nil
@ -237,7 +237,7 @@ func Validate(policy kyverno.PolicyInterface, client *dclient.Client, mock bool,
podOnlyMap["Pod"] = true podOnlyMap["Pod"] = true
if reflect.DeepEqual(common.GetKindsFromRule(rule), podOnlyMap) && podControllerAutoGenExclusion(policy) { if reflect.DeepEqual(common.GetKindsFromRule(rule), podOnlyMap) && podControllerAutoGenExclusion(policy) {
log.Log.V(4).Info("Pod controllers excluded from autogen require adding of preconditions to also exclude the desired controller(s).") log.Log.V(4).Info("Pod controllers excluded from autogen require adding of preconditions to also exclude the desired controller(s).")
return &v1beta1.AdmissionResponse{ return &admissionv1.AdmissionResponse{
Allowed: true, Allowed: true,
Warnings: []string{"Pod controllers excluded from autogen require adding of preconditions to also exclude the desired controller(s)."}, Warnings: []string{"Pod controllers excluded from autogen require adding of preconditions to also exclude the desired controller(s)."},
}, nil }, nil

View file

@ -6,7 +6,7 @@ import (
"github.com/kyverno/kyverno/pkg/config" "github.com/kyverno/kyverno/pkg/config"
"github.com/kyverno/kyverno/pkg/utils" "github.com/kyverno/kyverno/pkg/utils"
v1beta1 "k8s.io/api/admission/v1beta1" admissionv1 "k8s.io/api/admission/v1"
authenticationv1 "k8s.io/api/authentication/v1" authenticationv1 "k8s.io/api/authentication/v1"
rbacv1 "k8s.io/api/rbac/v1" rbacv1 "k8s.io/api/rbac/v1"
labels "k8s.io/apimachinery/pkg/labels" labels "k8s.io/apimachinery/pkg/labels"
@ -31,7 +31,7 @@ type allRolesStruct struct {
var allRoles []allRolesStruct var allRoles []allRolesStruct
//GetRoleRef gets the list of roles and cluster roles for the incoming api-request //GetRoleRef gets the list of roles and cluster roles for the incoming api-request
func GetRoleRef(rbLister rbaclister.RoleBindingLister, crbLister rbaclister.ClusterRoleBindingLister, request *v1beta1.AdmissionRequest, dynamicConfig config.Interface) (roles []string, clusterRoles []string, err error) { func GetRoleRef(rbLister rbaclister.RoleBindingLister, crbLister rbaclister.ClusterRoleBindingLister, request *admissionv1.AdmissionRequest, dynamicConfig config.Interface) (roles []string, clusterRoles []string, err error) {
keys := append(request.UserInfo.Groups, request.UserInfo.Username) keys := append(request.UserInfo.Groups, request.UserInfo.Username)
if utils.SliceContains(keys, dynamicConfig.GetExcludeGroupRole()...) { if utils.SliceContains(keys, dynamicConfig.GetExcludeGroupRole()...) {
return return
@ -139,7 +139,7 @@ func matchUserOrGroup(subject rbacv1.Subject, userInfo authenticationv1.UserInfo
} }
//IsRoleAuthorize is role authorize or not //IsRoleAuthorize is role authorize or not
func IsRoleAuthorize(rbLister rbaclister.RoleBindingLister, crbLister rbaclister.ClusterRoleBindingLister, rLister rbaclister.RoleLister, crLister rbaclister.ClusterRoleLister, request *v1beta1.AdmissionRequest, dynamicConfig config.Interface) (bool, error) { func IsRoleAuthorize(rbLister rbaclister.RoleBindingLister, crbLister rbaclister.ClusterRoleBindingLister, rLister rbaclister.RoleLister, crLister rbaclister.ClusterRoleLister, request *admissionv1.AdmissionRequest, dynamicConfig config.Interface) (bool, error) {
if strings.Contains(request.UserInfo.Username, SaPrefix) { if strings.Contains(request.UserInfo.Username, SaPrefix) {
roles, clusterRoles, err := GetRoleRef(rbLister, crbLister, request, dynamicConfig) roles, clusterRoles, err := GetRoleRef(rbLister, crbLister, request, dynamicConfig)
if err != nil { if err != nil {

View file

@ -5,7 +5,7 @@ import (
"fmt" "fmt"
kyverno "github.com/kyverno/kyverno/api/kyverno/v1" kyverno "github.com/kyverno/kyverno/api/kyverno/v1"
v1beta1 "k8s.io/api/admission/v1beta1" admissionv1 "k8s.io/api/admission/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
) )
@ -26,30 +26,30 @@ func UnmarshalPolicy(kind string, raw []byte) (kyverno.PolicyInterface, error) {
return nil, fmt.Errorf("admission request does not contain a policy") return nil, fmt.Errorf("admission request does not contain a policy")
} }
func GetPolicy(request *v1beta1.AdmissionRequest) (kyverno.PolicyInterface, error) { func GetPolicy(request *admissionv1.AdmissionRequest) (kyverno.PolicyInterface, error) {
return UnmarshalPolicy(request.Kind.Kind, request.Object.Raw) return UnmarshalPolicy(request.Kind.Kind, request.Object.Raw)
} }
func GetPolicies(request *v1beta1.AdmissionRequest) (kyverno.PolicyInterface, kyverno.PolicyInterface, error) { func GetPolicies(request *admissionv1.AdmissionRequest) (kyverno.PolicyInterface, kyverno.PolicyInterface, error) {
policy, err := UnmarshalPolicy(request.Kind.Kind, request.Object.Raw) policy, err := UnmarshalPolicy(request.Kind.Kind, request.Object.Raw)
if err != nil { if err != nil {
return policy, nil, err return policy, nil, err
} }
if request.Operation == v1beta1.Update { if request.Operation == admissionv1.Update {
oldPolicy, err := UnmarshalPolicy(request.Kind.Kind, request.OldObject.Raw) oldPolicy, err := UnmarshalPolicy(request.Kind.Kind, request.OldObject.Raw)
return policy, oldPolicy, err return policy, oldPolicy, err
} }
return policy, nil, nil return policy, nil, nil
} }
func Response(allowed bool) *v1beta1.AdmissionResponse { func Response(allowed bool) *admissionv1.AdmissionResponse {
r := &v1beta1.AdmissionResponse{ r := &admissionv1.AdmissionResponse{
Allowed: allowed, Allowed: allowed,
} }
return r return r
} }
func ResponseWithMessage(allowed bool, msg string) *v1beta1.AdmissionResponse { func ResponseWithMessage(allowed bool, msg string) *admissionv1.AdmissionResponse {
r := Response(allowed) r := Response(allowed)
r.Result = &metav1.Status{ r.Result = &metav1.Status{
Message: msg, Message: msg,
@ -57,13 +57,13 @@ func ResponseWithMessage(allowed bool, msg string) *v1beta1.AdmissionResponse {
return r return r
} }
func ResponseWithMessageAndPatch(allowed bool, msg string, patch []byte) *v1beta1.AdmissionResponse { func ResponseWithMessageAndPatch(allowed bool, msg string, patch []byte) *admissionv1.AdmissionResponse {
r := ResponseWithMessage(allowed, msg) r := ResponseWithMessage(allowed, msg)
r.Patch = patch r.Patch = patch
return r return r
} }
func ResponseStatus(allowed bool, status, msg string) *v1beta1.AdmissionResponse { func ResponseStatus(allowed bool, status, msg string) *admissionv1.AdmissionResponse {
r := Response(allowed) r := Response(allowed)
r.Result = &metav1.Status{ r.Result = &metav1.Status{
Status: status, Status: status,
@ -72,15 +72,15 @@ func ResponseStatus(allowed bool, status, msg string) *v1beta1.AdmissionResponse
return r return r
} }
func ResponseFailure(allowed bool, msg string) *v1beta1.AdmissionResponse { func ResponseFailure(allowed bool, msg string) *admissionv1.AdmissionResponse {
return ResponseStatus(allowed, metav1.StatusFailure, msg) return ResponseStatus(allowed, metav1.StatusFailure, msg)
} }
func ResponseSuccess(allowed bool, msg string) *v1beta1.AdmissionResponse { func ResponseSuccess(allowed bool, msg string) *admissionv1.AdmissionResponse {
return ResponseStatus(allowed, metav1.StatusSuccess, msg) return ResponseStatus(allowed, metav1.StatusSuccess, msg)
} }
func ResponseSuccessWithPatch(allowed bool, msg string, patch []byte) *v1beta1.AdmissionResponse { func ResponseSuccessWithPatch(allowed bool, msg string, patch []byte) *admissionv1.AdmissionResponse {
r := ResponseSuccess(allowed, msg) r := ResponseSuccess(allowed, msg)
if len(patch) > 0 { if len(patch) > 0 {
r.Patch = patch r.Patch = patch
@ -88,7 +88,7 @@ func ResponseSuccessWithPatch(allowed bool, msg string, patch []byte) *v1beta1.A
return r return r
} }
func GetResourceName(request *v1beta1.AdmissionRequest) string { func GetResourceName(request *admissionv1.AdmissionRequest) string {
resourceName := request.Kind.Kind + "/" + request.Name resourceName := request.Kind.Kind + "/" + request.Name
if request.Namespace != "" { if request.Namespace != "" {
resourceName = request.Namespace + "/" + resourceName resourceName = request.Namespace + "/" + resourceName

View file

@ -14,7 +14,7 @@ import (
wildcard "github.com/kyverno/go-wildcard" wildcard "github.com/kyverno/go-wildcard"
client "github.com/kyverno/kyverno/pkg/dclient" client "github.com/kyverno/kyverno/pkg/dclient"
engineutils "github.com/kyverno/kyverno/pkg/engine/utils" engineutils "github.com/kyverno/kyverno/pkg/engine/utils"
"k8s.io/api/admission/v1beta1" admissionv1 "k8s.io/api/admission/v1"
corev1 "k8s.io/api/core/v1" corev1 "k8s.io/api/core/v1"
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions" "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
@ -137,7 +137,7 @@ func isCRDInstalled(discoveryClient client.IDiscovery, kind string) bool {
} }
// ExtractResources extracts the new and old resource as unstructured // ExtractResources extracts the new and old resource as unstructured
func ExtractResources(newRaw []byte, request *v1beta1.AdmissionRequest) (unstructured.Unstructured, unstructured.Unstructured, error) { func ExtractResources(newRaw []byte, request *admissionv1.AdmissionRequest) (unstructured.Unstructured, unstructured.Unstructured, error) {
var emptyResource unstructured.Unstructured var emptyResource unstructured.Unstructured
var newResource unstructured.Unstructured var newResource unstructured.Unstructured
var oldResource unstructured.Unstructured var oldResource unstructured.Unstructured

View file

@ -13,7 +13,7 @@ import (
engineutils2 "github.com/kyverno/kyverno/pkg/utils/engine" engineutils2 "github.com/kyverno/kyverno/pkg/utils/engine"
"github.com/pkg/errors" "github.com/pkg/errors"
yamlv2 "gopkg.in/yaml.v2" yamlv2 "gopkg.in/yaml.v2"
"k8s.io/api/admission/v1beta1" admissionv1 "k8s.io/api/admission/v1"
) )
// returns true -> if there is even one policy that blocks resource request // returns true -> if there is even one policy that blocks resource request
@ -70,7 +70,7 @@ func getErrorMsg(engineReponses []*response.EngineResponse) string {
} }
// patchRequest applies patches to the request.Object and returns a new copy of the request // patchRequest applies patches to the request.Object and returns a new copy of the request
func patchRequest(patches []byte, request *v1beta1.AdmissionRequest, logger logr.Logger) *v1beta1.AdmissionRequest { func patchRequest(patches []byte, request *admissionv1.AdmissionRequest, logger logr.Logger) *admissionv1.AdmissionRequest {
patchedResource := processResourceWithPatches(patches, request.Object.Raw, logger) patchedResource := processResourceWithPatches(patches, request.Object.Raw, logger)
newRequest := request.DeepCopy() newRequest := request.DeepCopy()
newRequest.Object.Raw = patchedResource newRequest.Object.Raw = patchedResource
@ -157,7 +157,7 @@ func excludeKyvernoResources(kind string) bool {
} }
} }
func newVariablesContext(request *v1beta1.AdmissionRequest, userRequestInfo *kyverno.RequestInfo) (*enginectx.Context, error) { func newVariablesContext(request *admissionv1.AdmissionRequest, userRequestInfo *kyverno.RequestInfo) (*enginectx.Context, error) {
ctx := enginectx.NewContext() ctx := enginectx.NewContext()
if err := ctx.AddRequest(request); err != nil { if err := ctx.AddRequest(request); err != nil {
return nil, errors.Wrap(err, "failed to load incoming request in context") return nil, errors.Wrap(err, "failed to load incoming request in context")

View file

@ -12,7 +12,7 @@ import (
kyvernoinformer "github.com/kyverno/kyverno/pkg/client/informers/externalversions/kyverno/v1" kyvernoinformer "github.com/kyverno/kyverno/pkg/client/informers/externalversions/kyverno/v1"
kyvernolister "github.com/kyverno/kyverno/pkg/client/listers/kyverno/v1" kyvernolister "github.com/kyverno/kyverno/pkg/client/listers/kyverno/v1"
"github.com/kyverno/kyverno/pkg/config" "github.com/kyverno/kyverno/pkg/config"
"k8s.io/api/admission/v1beta1" admissionv1 "k8s.io/api/admission/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"
utilruntime "k8s.io/apimachinery/pkg/util/runtime" utilruntime "k8s.io/apimachinery/pkg/util/runtime"
@ -21,13 +21,13 @@ import (
// GenerateRequests provides interface to manage generate requests // GenerateRequests provides interface to manage generate requests
type GenerateRequests interface { type GenerateRequests interface {
Apply(gr kyverno.GenerateRequestSpec, action v1beta1.Operation) error Apply(gr kyverno.GenerateRequestSpec, action admissionv1.Operation) error
} }
// GeneratorChannel ... // GeneratorChannel ...
type GeneratorChannel struct { type GeneratorChannel struct {
spec kyverno.GenerateRequestSpec spec kyverno.GenerateRequestSpec
action v1beta1.Operation action admissionv1.Operation
} }
// Generator defines the implementation to mange generate request resource // Generator defines the implementation to mange generate request resource
@ -54,7 +54,7 @@ func NewGenerator(client *kyvernoclient.Clientset, grInformer kyvernoinformer.Ge
} }
// Apply creates generate request resource (blocking call if channel is full) // Apply creates generate request resource (blocking call if channel is full)
func (g *Generator) Apply(gr kyverno.GenerateRequestSpec, action v1beta1.Operation) error { func (g *Generator) Apply(gr kyverno.GenerateRequestSpec, action admissionv1.Operation) error {
logger := g.log logger := g.log
logger.V(4).Info("creating Generate Request", "request", gr) logger.V(4).Info("creating Generate Request", "request", gr)
@ -91,7 +91,7 @@ func (g *Generator) processApply(m GeneratorChannel) {
} }
} }
func (g *Generator) generate(grSpec kyverno.GenerateRequestSpec, action v1beta1.Operation) error { func (g *Generator) generate(grSpec kyverno.GenerateRequestSpec, action admissionv1.Operation) error {
// create/update a generate request // create/update a generate request
if err := retryApplyResource(g.client, grSpec, g.log, action, g.grLister); err != nil { if err := retryApplyResource(g.client, grSpec, g.log, action, g.grLister); err != nil {
@ -104,7 +104,7 @@ func (g *Generator) generate(grSpec kyverno.GenerateRequestSpec, action v1beta1.
// use worker pattern to read and create the CR resource // use worker pattern to read and create the CR resource
func retryApplyResource(client *kyvernoclient.Clientset, grSpec kyverno.GenerateRequestSpec, func retryApplyResource(client *kyvernoclient.Clientset, grSpec kyverno.GenerateRequestSpec,
log logr.Logger, action v1beta1.Operation, grLister kyvernolister.GenerateRequestNamespaceLister) error { log logr.Logger, action admissionv1.Operation, grLister kyvernolister.GenerateRequestNamespaceLister) error {
var i int var i int
var err error var err error
@ -122,7 +122,7 @@ func retryApplyResource(client *kyvernoclient.Clientset, grSpec kyverno.Generate
// Initial state "Pending" // Initial state "Pending"
// generate requests created in kyverno namespace // generate requests created in kyverno namespace
isExist := false isExist := false
if action == v1beta1.Create || action == v1beta1.Update { if action == admissionv1.Create || action == admissionv1.Update {
log.V(4).Info("querying all generate requests") log.V(4).Info("querying all generate requests")
selector := labels.SelectorFromSet(labels.Set(map[string]string{ selector := labels.SelectorFromSet(labels.Set(map[string]string{
"generate.kyverno.io/policy-name": policyName, "generate.kyverno.io/policy-name": policyName,

View file

@ -25,13 +25,13 @@ import (
gen "github.com/kyverno/kyverno/pkg/generate" gen "github.com/kyverno/kyverno/pkg/generate"
kyvernoutils "github.com/kyverno/kyverno/pkg/utils" kyvernoutils "github.com/kyverno/kyverno/pkg/utils"
"github.com/kyverno/kyverno/pkg/webhooks/generate" "github.com/kyverno/kyverno/pkg/webhooks/generate"
"k8s.io/api/admission/v1beta1" admissionv1 "k8s.io/api/admission/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/labels"
) )
func (ws *WebhookServer) applyGeneratePolicies(request *v1beta1.AdmissionRequest, policyContext *engine.PolicyContext, policies []kyverno.PolicyInterface, ts int64, logger logr.Logger) { func (ws *WebhookServer) applyGeneratePolicies(request *admissionv1.AdmissionRequest, policyContext *engine.PolicyContext, policies []kyverno.PolicyInterface, ts int64, logger logr.Logger) {
admissionReviewCompletionLatencyChannel := make(chan int64, 1) admissionReviewCompletionLatencyChannel := make(chan int64, 1)
generateEngineResponsesSenderForAdmissionReviewDurationMetric := make(chan []*response.EngineResponse, 1) generateEngineResponsesSenderForAdmissionReviewDurationMetric := make(chan []*response.EngineResponse, 1)
generateEngineResponsesSenderForAdmissionRequestsCountMetric := make(chan []*response.EngineResponse, 1) generateEngineResponsesSenderForAdmissionRequestsCountMetric := make(chan []*response.EngineResponse, 1)
@ -43,7 +43,7 @@ func (ws *WebhookServer) applyGeneratePolicies(request *v1beta1.AdmissionRequest
//handleGenerate handles admission-requests for policies with generate rules //handleGenerate handles admission-requests for policies with generate rules
func (ws *WebhookServer) handleGenerate( func (ws *WebhookServer) handleGenerate(
request *v1beta1.AdmissionRequest, request *admissionv1.AdmissionRequest,
policies []kyverno.PolicyInterface, policies []kyverno.PolicyInterface,
ctx *context.Context, ctx *context.Context,
userRequestInfo kyverno.RequestInfo, userRequestInfo kyverno.RequestInfo,
@ -58,7 +58,7 @@ func (ws *WebhookServer) handleGenerate(
logger.V(6).Info("generate request") logger.V(6).Info("generate request")
var engineResponses []*response.EngineResponse var engineResponses []*response.EngineResponse
if (request.Operation == v1beta1.Create || request.Operation == v1beta1.Update) && len(policies) != 0 { if (request.Operation == admissionv1.Create || request.Operation == admissionv1.Update) && len(policies) != 0 {
// convert RAW to unstructured // convert RAW to unstructured
new, old, err := kyvernoutils.ExtractResources(nil, request) new, old, err := kyvernoutils.ExtractResources(nil, request)
if err != nil { if err != nil {
@ -113,7 +113,7 @@ func (ws *WebhookServer) handleGenerate(
} }
} }
if request.Operation == v1beta1.Update { if request.Operation == admissionv1.Update {
ws.handleUpdatesForGenerateRules(request, policies) ws.handleUpdatesForGenerateRules(request, policies)
} }
@ -125,8 +125,8 @@ func (ws *WebhookServer) handleGenerate(
} }
//handleUpdatesForGenerateRules handles admission-requests for update //handleUpdatesForGenerateRules handles admission-requests for update
func (ws *WebhookServer) handleUpdatesForGenerateRules(request *v1beta1.AdmissionRequest, policies []kyverno.PolicyInterface) { func (ws *WebhookServer) handleUpdatesForGenerateRules(request *admissionv1.AdmissionRequest, policies []kyverno.PolicyInterface) {
if request.Operation != v1beta1.Update { if request.Operation != admissionv1.Update {
return return
} }
@ -141,7 +141,7 @@ func (ws *WebhookServer) handleUpdatesForGenerateRules(request *v1beta1.Admissio
ws.handleUpdateGenerateSourceResource(resLabels, logger) ws.handleUpdateGenerateSourceResource(resLabels, logger)
} }
if resLabels["app.kubernetes.io/managed-by"] == "kyverno" && resLabels["policy.kyverno.io/synchronize"] == "enable" && request.Operation == v1beta1.Update { if resLabels["app.kubernetes.io/managed-by"] == "kyverno" && resLabels["policy.kyverno.io/synchronize"] == "enable" && request.Operation == admissionv1.Update {
ws.handleUpdateGenerateTargetResource(request, policies, resLabels, logger) ws.handleUpdateGenerateTargetResource(request, policies, resLabels, logger)
} }
} }
@ -197,7 +197,7 @@ func (ws *WebhookServer) updateAnnotationInGR(gr *kyverno.GenerateRequest, logge
} }
//handleUpdateGenerateTargetResource - handles update of target resource for generate policy //handleUpdateGenerateTargetResource - handles update of target resource for generate policy
func (ws *WebhookServer) handleUpdateGenerateTargetResource(request *v1beta1.AdmissionRequest, policies []kyverno.PolicyInterface, resLabels map[string]string, logger logr.Logger) { func (ws *WebhookServer) handleUpdateGenerateTargetResource(request *admissionv1.AdmissionRequest, policies []kyverno.PolicyInterface, resLabels map[string]string, logger logr.Logger) {
enqueueBool := false enqueueBool := false
newRes, err := enginutils.ConvertToUnstructured(request.Object.Raw) newRes, err := enginutils.ConvertToUnstructured(request.Object.Raw)
if err != nil { if err != nil {
@ -260,7 +260,7 @@ func (ws *WebhookServer) handleUpdateGenerateTargetResource(request *v1beta1.Adm
func getGeneratedByResource(newRes *unstructured.Unstructured, resLabels map[string]string, client *client.Client, rule kyverno.Rule, logger logr.Logger) (kyverno.Rule, error) { func getGeneratedByResource(newRes *unstructured.Unstructured, resLabels map[string]string, client *client.Client, rule kyverno.Rule, logger logr.Logger) (kyverno.Rule, error) {
var apiVersion, kind, name, namespace string var apiVersion, kind, name, namespace string
sourceRequest := &v1beta1.AdmissionRequest{} sourceRequest := &admissionv1.AdmissionRequest{}
kind = resLabels["kyverno.io/generated-by-kind"] kind = resLabels["kyverno.io/generated-by-kind"]
name = resLabels["kyverno.io/generated-by-name"] name = resLabels["kyverno.io/generated-by-name"]
if kind != "Namespace" { if kind != "Namespace" {
@ -355,7 +355,7 @@ func stripNonPolicyFields(obj, newRes map[string]interface{}, logger logr.Logger
} }
//HandleDelete handles admission-requests for delete //HandleDelete handles admission-requests for delete
func (ws *WebhookServer) handleDelete(request *v1beta1.AdmissionRequest) { func (ws *WebhookServer) handleDelete(request *admissionv1.AdmissionRequest) {
logger := ws.log.WithValues("action", "generation", "uid", request.UID, "kind", request.Kind, "namespace", request.Namespace, "name", request.Name, "operation", request.Operation, "gvk", request.Kind.String()) logger := ws.log.WithValues("action", "generation", "uid", request.UID, "kind", request.Kind, "namespace", request.Namespace, "name", request.Name, "operation", request.Operation, "gvk", request.Kind.String())
resource, err := enginutils.ConvertToUnstructured(request.OldObject.Raw) resource, err := enginutils.ConvertToUnstructured(request.OldObject.Raw)
if err != nil { if err != nil {
@ -363,7 +363,7 @@ func (ws *WebhookServer) handleDelete(request *v1beta1.AdmissionRequest) {
} }
resLabels := resource.GetLabels() resLabels := resource.GetLabels()
if resLabels["app.kubernetes.io/managed-by"] == "kyverno" && request.Operation == v1beta1.Delete { if resLabels["app.kubernetes.io/managed-by"] == "kyverno" && request.Operation == admissionv1.Delete {
grName := resLabels["policy.kyverno.io/gr-name"] grName := resLabels["policy.kyverno.io/gr-name"]
gr, err := ws.grLister.Get(grName) gr, err := ws.grLister.Get(grName)
if err != nil { if err != nil {
@ -397,8 +397,8 @@ func (ws *WebhookServer) deleteGR(logger logr.Logger, engineResponse *response.E
} }
} }
func applyGenerateRequest(request *v1beta1.AdmissionRequest, gnGenerator generate.GenerateRequests, userRequestInfo kyverno.RequestInfo, func applyGenerateRequest(request *admissionv1.AdmissionRequest, gnGenerator generate.GenerateRequests, userRequestInfo kyverno.RequestInfo,
action v1beta1.Operation, engineResponses ...*response.EngineResponse) (failedGenerateRequest []generateRequestResponse) { action admissionv1.Operation, engineResponses ...*response.EngineResponse) (failedGenerateRequest []generateRequestResponse) {
requestBytes, err := json.Marshal(request) requestBytes, err := json.Marshal(request)
if err != nil { if err != nil {

View file

@ -19,7 +19,7 @@ import (
"github.com/kyverno/kyverno/pkg/utils" "github.com/kyverno/kyverno/pkg/utils"
admissionutils "github.com/kyverno/kyverno/pkg/utils/admission" admissionutils "github.com/kyverno/kyverno/pkg/utils/admission"
"github.com/kyverno/kyverno/pkg/webhooks/handlers" "github.com/kyverno/kyverno/pkg/webhooks/handlers"
"k8s.io/api/admission/v1beta1" admissionv1 "k8s.io/api/admission/v1"
) )
// TODO: use admission review sub resource ? // TODO: use admission review sub resource ?
@ -36,12 +36,12 @@ func isStatusUpdate(old, new kyverno.PolicyInterface) bool {
return true return true
} }
func errorResponse(logger logr.Logger, err error, message string) *v1beta1.AdmissionResponse { func errorResponse(logger logr.Logger, err error, message string) *admissionv1.AdmissionResponse {
logger.Error(err, message) logger.Error(err, message)
return admissionutils.ResponseFailure(false, message+": "+err.Error()) return admissionutils.ResponseFailure(false, message+": "+err.Error())
} }
func setupLogger(logger logr.Logger, name string, request *v1beta1.AdmissionRequest) logr.Logger { func setupLogger(logger logr.Logger, name string, request *admissionv1.AdmissionRequest) logr.Logger {
return logger.WithName("MutateWebhook").WithValues( return logger.WithName("MutateWebhook").WithValues(
"uid", request.UID, "uid", request.UID,
"kind", request.Kind, "kind", request.Kind,
@ -59,7 +59,7 @@ func (ws *WebhookServer) admissionHandler(filter bool, inner handlers.AdmissionH
return handlers.Monitor(ws.webhookMonitor, handlers.Admission(ws.log, inner)) return handlers.Monitor(ws.webhookMonitor, handlers.Admission(ws.log, inner))
} }
func (ws *WebhookServer) policyMutation(request *v1beta1.AdmissionRequest) *v1beta1.AdmissionResponse { func (ws *WebhookServer) policyMutation(request *admissionv1.AdmissionRequest) *admissionv1.AdmissionResponse {
logger := setupLogger(ws.log, "policy mutation", request) logger := setupLogger(ws.log, "policy mutation", request)
policy, oldPolicy, err := admissionutils.GetPolicies(request) policy, oldPolicy, err := admissionutils.GetPolicies(request)
if err != nil { if err != nil {
@ -81,7 +81,7 @@ func (ws *WebhookServer) policyMutation(request *v1beta1.AdmissionRequest) *v1be
} }
//policyValidation performs the validation check on policy resource //policyValidation performs the validation check on policy resource
func (ws *WebhookServer) policyValidation(request *v1beta1.AdmissionRequest) *v1beta1.AdmissionResponse { func (ws *WebhookServer) policyValidation(request *admissionv1.AdmissionRequest) *admissionv1.AdmissionResponse {
logger := setupLogger(ws.log, "policy validation", request) logger := setupLogger(ws.log, "policy validation", request)
policy, oldPolicy, err := admissionutils.GetPolicies(request) policy, oldPolicy, err := admissionutils.GetPolicies(request)
if err != nil { if err != nil {
@ -107,12 +107,12 @@ func (ws *WebhookServer) policyValidation(request *v1beta1.AdmissionRequest) *v1
} }
// resourceMutation mutates resource // resourceMutation mutates resource
func (ws *WebhookServer) resourceMutation(request *v1beta1.AdmissionRequest) *v1beta1.AdmissionResponse { func (ws *WebhookServer) resourceMutation(request *admissionv1.AdmissionRequest) *admissionv1.AdmissionResponse {
logger := setupLogger(ws.log, "resource mutation", request) logger := setupLogger(ws.log, "resource mutation", request)
if excludeKyvernoResources(request.Kind.Kind) { if excludeKyvernoResources(request.Kind.Kind) {
return admissionutils.ResponseSuccess(true, "") return admissionutils.ResponseSuccess(true, "")
} }
if request.Operation == v1beta1.Delete { if request.Operation == admissionv1.Delete {
resource, err := utils.ConvertResource(request.OldObject.Raw, request.Kind.Group, request.Kind.Version, request.Kind.Kind, request.Namespace) resource, err := utils.ConvertResource(request.OldObject.Raw, request.Kind.Group, request.Kind.Version, request.Kind.Kind, request.Namespace)
if err == nil { if err == nil {
ws.prGenerator.Add(buildDeletionPrInfo(resource)) ws.prGenerator.Add(buildDeletionPrInfo(resource))
@ -150,9 +150,9 @@ func (ws *WebhookServer) resourceMutation(request *v1beta1.AdmissionRequest) *v1
return admissionutils.ResponseSuccessWithPatch(true, "", patches) return admissionutils.ResponseSuccessWithPatch(true, "", patches)
} }
func (ws *WebhookServer) resourceValidation(request *v1beta1.AdmissionRequest) *v1beta1.AdmissionResponse { func (ws *WebhookServer) resourceValidation(request *admissionv1.AdmissionRequest) *admissionv1.AdmissionResponse {
logger := setupLogger(ws.log, "resource validation", request) logger := setupLogger(ws.log, "resource validation", request)
if request.Operation == v1beta1.Delete { if request.Operation == admissionv1.Delete {
ws.handleDelete(request) ws.handleDelete(request)
} }
if excludeKyvernoResources(request.Kind.Kind) { if excludeKyvernoResources(request.Kind.Kind) {
@ -166,7 +166,7 @@ func (ws *WebhookServer) resourceValidation(request *v1beta1.AdmissionRequest) *
nsPolicies := ws.pCache.GetPolicies(policycache.ValidateEnforce, request.Kind.Kind, request.Namespace) nsPolicies := ws.pCache.GetPolicies(policycache.ValidateEnforce, request.Kind.Kind, request.Namespace)
policies = append(policies, nsPolicies...) policies = append(policies, nsPolicies...)
generatePolicies := ws.pCache.GetPolicies(policycache.Generate, request.Kind.Kind, request.Namespace) generatePolicies := ws.pCache.GetPolicies(policycache.Generate, request.Kind.Kind, request.Namespace)
if len(generatePolicies) == 0 && request.Operation == v1beta1.Update { if len(generatePolicies) == 0 && request.Operation == admissionv1.Update {
// handle generate source resource updates // handle generate source resource updates
go ws.handleUpdatesForGenerateRules(request, []kyverno.PolicyInterface{}) go ws.handleUpdatesForGenerateRules(request, []kyverno.PolicyInterface{})
} }

View file

@ -11,10 +11,10 @@ import (
"github.com/kyverno/kyverno/pkg/config" "github.com/kyverno/kyverno/pkg/config"
admissionutils "github.com/kyverno/kyverno/pkg/utils/admission" admissionutils "github.com/kyverno/kyverno/pkg/utils/admission"
"github.com/kyverno/kyverno/pkg/webhookconfig" "github.com/kyverno/kyverno/pkg/webhookconfig"
"k8s.io/api/admission/v1beta1" admissionv1 "k8s.io/api/admission/v1"
) )
type AdmissionHandler func(*v1beta1.AdmissionRequest) *v1beta1.AdmissionResponse type AdmissionHandler func(*admissionv1.AdmissionRequest) *admissionv1.AdmissionResponse
func Admission(logger logr.Logger, inner AdmissionHandler) http.HandlerFunc { func Admission(logger logr.Logger, inner AdmissionHandler) http.HandlerFunc {
return func(writer http.ResponseWriter, request *http.Request) { return func(writer http.ResponseWriter, request *http.Request) {
@ -37,7 +37,7 @@ func Admission(logger logr.Logger, inner AdmissionHandler) http.HandlerFunc {
http.Error(writer, "invalid Content-Type, expect `application/json`", http.StatusUnsupportedMediaType) http.Error(writer, "invalid Content-Type, expect `application/json`", http.StatusUnsupportedMediaType)
return return
} }
admissionReview := &v1beta1.AdmissionReview{} admissionReview := &admissionv1.AdmissionReview{}
if err := json.Unmarshal(body, &admissionReview); err != nil { if err := json.Unmarshal(body, &admissionReview); err != nil {
logger.Error(err, "failed to decode request body to type 'AdmissionReview") logger.Error(err, "failed to decode request body to type 'AdmissionReview")
http.Error(writer, "Can't decode body as AdmissionReview", http.StatusExpectationFailed) http.Error(writer, "Can't decode body as AdmissionReview", http.StatusExpectationFailed)
@ -50,7 +50,7 @@ func Admission(logger logr.Logger, inner AdmissionHandler) http.HandlerFunc {
"operation", admissionReview.Request.Operation, "operation", admissionReview.Request.Operation,
"uid", admissionReview.Request.UID, "uid", admissionReview.Request.UID,
) )
admissionReview.Response = &v1beta1.AdmissionResponse{ admissionReview.Response = &admissionv1.AdmissionResponse{
Allowed: true, Allowed: true,
UID: admissionReview.Request.UID, UID: admissionReview.Request.UID,
} }
@ -72,7 +72,7 @@ func Admission(logger logr.Logger, inner AdmissionHandler) http.HandlerFunc {
} }
func Filter(c config.Interface, inner AdmissionHandler) AdmissionHandler { func Filter(c config.Interface, inner AdmissionHandler) AdmissionHandler {
return func(request *v1beta1.AdmissionRequest) *v1beta1.AdmissionResponse { return func(request *admissionv1.AdmissionRequest) *admissionv1.AdmissionResponse {
if c.ToFilter(request.Kind.Kind, request.Namespace, request.Name) { if c.ToFilter(request.Kind.Kind, request.Namespace, request.Name) {
return nil return nil
} }
@ -81,7 +81,7 @@ func Filter(c config.Interface, inner AdmissionHandler) AdmissionHandler {
} }
func Verify(m *webhookconfig.Monitor, logger logr.Logger) AdmissionHandler { func Verify(m *webhookconfig.Monitor, logger logr.Logger) AdmissionHandler {
return func(request *v1beta1.AdmissionRequest) *v1beta1.AdmissionResponse { return func(request *admissionv1.AdmissionRequest) *admissionv1.AdmissionResponse {
logger = logger.WithName("verifyHandler").WithValues( logger = logger.WithName("verifyHandler").WithValues(
"action", "verify", "action", "verify",
"kind", request.Kind, "kind", request.Kind,

View file

@ -14,12 +14,12 @@ import (
engineutils "github.com/kyverno/kyverno/pkg/utils/engine" engineutils "github.com/kyverno/kyverno/pkg/utils/engine"
jsonutils "github.com/kyverno/kyverno/pkg/utils/json" jsonutils "github.com/kyverno/kyverno/pkg/utils/json"
"github.com/pkg/errors" "github.com/pkg/errors"
"k8s.io/api/admission/v1beta1" admissionv1 "k8s.io/api/admission/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
) )
func (ws *WebhookServer) applyMutatePolicies(request *v1beta1.AdmissionRequest, policyContext *engine.PolicyContext, policies []kyverno.PolicyInterface, ts int64, logger logr.Logger) []byte { func (ws *WebhookServer) applyMutatePolicies(request *admissionv1.AdmissionRequest, policyContext *engine.PolicyContext, policies []kyverno.PolicyInterface, ts int64, logger logr.Logger) []byte {
var mutateEngineResponses []*response.EngineResponse var mutateEngineResponses []*response.EngineResponse
mutatePatches, mutateEngineResponses := ws.handleMutation(request, policyContext, policies) mutatePatches, mutateEngineResponses := ws.handleMutation(request, policyContext, policies)
@ -35,7 +35,7 @@ func (ws *WebhookServer) applyMutatePolicies(request *v1beta1.AdmissionRequest,
// handleMutation handles mutating webhook admission request // handleMutation handles mutating webhook admission request
// return value: generated patches, triggered policies, engine responses correspdonding to the triggered policies // return value: generated patches, triggered policies, engine responses correspdonding to the triggered policies
func (ws *WebhookServer) handleMutation( func (ws *WebhookServer) handleMutation(
request *v1beta1.AdmissionRequest, request *admissionv1.AdmissionRequest,
policyContext *engine.PolicyContext, policyContext *engine.PolicyContext,
policies []kyverno.PolicyInterface) ([]byte, []*response.EngineResponse) { policies []kyverno.PolicyInterface) ([]byte, []*response.EngineResponse) {
@ -64,7 +64,7 @@ func (ws *WebhookServer) handleMutation(
deletionTimeStamp = oldR.GetDeletionTimestamp() deletionTimeStamp = oldR.GetDeletionTimestamp()
} }
if deletionTimeStamp != nil && request.Operation == v1beta1.Update { if deletionTimeStamp != nil && request.Operation == admissionv1.Update {
return nil, nil return nil, nil
} }
var patches [][]byte var patches [][]byte
@ -115,7 +115,7 @@ func (ws *WebhookServer) handleMutation(
// all policies were applied successfully. // all policies were applied successfully.
// create an event on the resource // create an event on the resource
// ADD EVENTS // ADD EVENTS
events := generateEvents(engineResponses, false, request.Operation == v1beta1.Update, logger) events := generateEvents(engineResponses, false, request.Operation == admissionv1.Update, logger)
ws.eventGen.Add(events...) ws.eventGen.Add(events...)
// debug info // debug info
@ -134,7 +134,7 @@ func (ws *WebhookServer) handleMutation(
return jsonutils.JoinPatches(patches...), engineResponses return jsonutils.JoinPatches(patches...), engineResponses
} }
func (ws *WebhookServer) applyMutation(request *v1beta1.AdmissionRequest, policyContext *engine.PolicyContext, logger logr.Logger) (*response.EngineResponse, [][]byte, error) { func (ws *WebhookServer) applyMutation(request *admissionv1.AdmissionRequest, policyContext *engine.PolicyContext, logger logr.Logger) (*response.EngineResponse, [][]byte, error) {
if request.Kind.Kind != "Namespace" && request.Namespace != "" { if request.Kind.Kind != "Namespace" && request.Namespace != "" {
policyContext.NamespaceLabels = common.GetNamespaceSelectorsFromNamespaceLister( policyContext.NamespaceLabels = common.GetNamespaceSelectorsFromNamespaceLister(
request.Kind.Kind, request.Namespace, ws.nsLister, logger) request.Kind.Kind, request.Namespace, ws.nsLister, logger)

View file

@ -29,7 +29,7 @@ import (
webhookgenerate "github.com/kyverno/kyverno/pkg/webhooks/generate" webhookgenerate "github.com/kyverno/kyverno/pkg/webhooks/generate"
"github.com/kyverno/kyverno/pkg/webhooks/handlers" "github.com/kyverno/kyverno/pkg/webhooks/handlers"
"github.com/pkg/errors" "github.com/pkg/errors"
"k8s.io/api/admission/v1beta1" admissionv1 "k8s.io/api/admission/v1"
informers "k8s.io/client-go/informers/core/v1" informers "k8s.io/client-go/informers/core/v1"
rbacinformer "k8s.io/client-go/informers/rbac/v1" rbacinformer "k8s.io/client-go/informers/rbac/v1"
listerv1 "k8s.io/client-go/listers/core/v1" listerv1 "k8s.io/client-go/listers/core/v1"
@ -204,7 +204,7 @@ func NewWebhookServer(
return ws, nil return ws, nil
} }
func (ws *WebhookServer) buildPolicyContext(request *v1beta1.AdmissionRequest, addRoles bool) (*engine.PolicyContext, error) { func (ws *WebhookServer) buildPolicyContext(request *admissionv1.AdmissionRequest, addRoles bool) (*engine.PolicyContext, error) {
userRequestInfo := v1.RequestInfo{ userRequestInfo := v1.RequestInfo{
AdmissionUserInfo: *request.UserInfo.DeepCopy(), AdmissionUserInfo: *request.UserInfo.DeepCopy(),
} }
@ -232,7 +232,7 @@ func (ws *WebhookServer) buildPolicyContext(request *v1beta1.AdmissionRequest, a
return nil, errors.Wrap(err, "failed to add image information to the policy rule context") return nil, errors.Wrap(err, "failed to add image information to the policy rule context")
} }
if request.Kind.Kind == "Secret" && request.Operation == v1beta1.Update { if request.Kind.Kind == "Secret" && request.Operation == admissionv1.Update {
resource, err = utils.NormalizeSecret(&resource) resource, err = utils.NormalizeSecret(&resource)
if err != nil { if err != nil {
return nil, errors.Wrap(err, "failed to convert secret to unstructured format") return nil, errors.Wrap(err, "failed to convert secret to unstructured format")
@ -248,7 +248,7 @@ func (ws *WebhookServer) buildPolicyContext(request *v1beta1.AdmissionRequest, a
Client: ws.client, Client: ws.client,
} }
if request.Operation == v1beta1.Update { if request.Operation == admissionv1.Update {
policyContext.OldResource = resource policyContext.OldResource = resource
} }

View file

@ -20,7 +20,7 @@ import (
"github.com/kyverno/kyverno/pkg/policycache" "github.com/kyverno/kyverno/pkg/policycache"
"github.com/kyverno/kyverno/pkg/policyreport" "github.com/kyverno/kyverno/pkg/policyreport"
"github.com/kyverno/kyverno/pkg/userinfo" "github.com/kyverno/kyverno/pkg/userinfo"
"k8s.io/api/admission/v1beta1" admissionv1 "k8s.io/api/admission/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"
informers "k8s.io/client-go/informers/core/v1" informers "k8s.io/client-go/informers/core/v1"
@ -41,7 +41,7 @@ const (
// the request is processed in background, with the exact same logic // the request is processed in background, with the exact same logic
// when process the admission request in the webhook // when process the admission request in the webhook
type AuditHandler interface { type AuditHandler interface {
Add(request *v1beta1.AdmissionRequest) Add(request *admissionv1.AdmissionRequest)
Run(workers int, stopCh <-chan struct{}) Run(workers int, stopCh <-chan struct{})
} }
@ -94,7 +94,7 @@ func NewValidateAuditHandler(pCache policycache.Interface,
} }
} }
func (h *auditHandler) Add(request *v1beta1.AdmissionRequest) { func (h *auditHandler) Add(request *admissionv1.AdmissionRequest) {
h.log.V(4).Info("admission request added", "uid", request.UID, "kind", request.Kind.Kind, "namespace", request.Namespace, "name", request.Name, "operation", request.Operation) h.log.V(4).Info("admission request added", "uid", request.UID, "kind", request.Kind.Kind, "namespace", request.Namespace, "name", request.Name, "operation", request.Operation)
h.queue.Add(request) h.queue.Add(request)
} }
@ -131,7 +131,7 @@ func (h *auditHandler) processNextWorkItem() bool {
defer h.queue.Done(obj) defer h.queue.Done(obj)
request, ok := obj.(*v1beta1.AdmissionRequest) request, ok := obj.(*admissionv1.AdmissionRequest)
if !ok { if !ok {
h.queue.Forget(obj) h.queue.Forget(obj)
h.log.Info("incorrect type: expecting type 'AdmissionRequest'", "object", obj) h.log.Info("incorrect type: expecting type 'AdmissionRequest'", "object", obj)
@ -144,7 +144,7 @@ func (h *auditHandler) processNextWorkItem() bool {
return true return true
} }
func (h *auditHandler) process(request *v1beta1.AdmissionRequest) error { func (h *auditHandler) process(request *admissionv1.AdmissionRequest) error {
var roles, clusterRoles []string var roles, clusterRoles []string
var err error var err error
// time at which the corresponding the admission request's processing got initiated // time at which the corresponding the admission request's processing got initiated
@ -205,7 +205,7 @@ func (h *auditHandler) process(request *v1beta1.AdmissionRequest) error {
return nil return nil
} }
func (h *auditHandler) handleErr(err error, key interface{}, request *v1beta1.AdmissionRequest) { func (h *auditHandler) handleErr(err error, key interface{}, request *admissionv1.AdmissionRequest) {
logger := h.log.WithName("handleErr") logger := h.log.WithName("handleErr")
if err == nil { if err == nil {
h.queue.Forget(key) h.queue.Forget(key)

View file

@ -12,7 +12,7 @@ import (
"github.com/kyverno/kyverno/pkg/metrics" "github.com/kyverno/kyverno/pkg/metrics"
"github.com/kyverno/kyverno/pkg/policyreport" "github.com/kyverno/kyverno/pkg/policyreport"
admissionutils "github.com/kyverno/kyverno/pkg/utils/admission" admissionutils "github.com/kyverno/kyverno/pkg/utils/admission"
v1beta1 "k8s.io/api/admission/v1beta1" admissionv1 "k8s.io/api/admission/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
) )
@ -28,7 +28,7 @@ type validationHandler struct {
// patchedResource is the (resource + patches) after applying mutation rules // patchedResource is the (resource + patches) after applying mutation rules
func (v *validationHandler) handleValidation( func (v *validationHandler) handleValidation(
promConfig *metrics.PromConfig, promConfig *metrics.PromConfig,
request *v1beta1.AdmissionRequest, request *admissionv1.AdmissionRequest,
policies []v1.PolicyInterface, policies []v1.PolicyInterface,
policyContext *engine.PolicyContext, policyContext *engine.PolicyContext,
namespaceLabels map[string]string, namespaceLabels map[string]string,
@ -48,7 +48,7 @@ func (v *validationHandler) handleValidation(
deletionTimeStamp = policyContext.OldResource.GetDeletionTimestamp() deletionTimeStamp = policyContext.OldResource.GetDeletionTimestamp()
} }
if deletionTimeStamp != nil && request.Operation == v1beta1.Update { if deletionTimeStamp != nil && request.Operation == admissionv1.Update {
return true, "" return true, ""
} }
@ -94,7 +94,7 @@ func (v *validationHandler) handleValidation(
// Scenario 3: // Scenario 3:
// all policies were applied successfully. // all policies were applied successfully.
// create an event on the resource // create an event on the resource
events := generateEvents(engineResponses, blocked, (request.Operation == v1beta1.Update), logger) events := generateEvents(engineResponses, blocked, (request.Operation == admissionv1.Update), logger)
v.eventGen.Add(events...) v.eventGen.Add(events...)
if blocked { if blocked {
@ -109,7 +109,7 @@ func (v *validationHandler) handleValidation(
// reports are generated for non-managed pods/jobs only // reports are generated for non-managed pods/jobs only
// no need to create rcr for managed resources // no need to create rcr for managed resources
if request.Operation == v1beta1.Delete { if request.Operation == admissionv1.Delete {
managed := true managed := true
for _, er := range engineResponses { for _, er := range engineResponses {
if er.Policy != nil && !engine.ManagedPodResource(er.Policy, er.PatchedResource) { if er.Policy != nil && !engine.ManagedPodResource(er.Policy, er.PatchedResource) {

View file

@ -10,10 +10,10 @@ import (
"github.com/kyverno/kyverno/pkg/policyreport" "github.com/kyverno/kyverno/pkg/policyreport"
admissionutils "github.com/kyverno/kyverno/pkg/utils/admission" admissionutils "github.com/kyverno/kyverno/pkg/utils/admission"
jsonutils "github.com/kyverno/kyverno/pkg/utils/json" jsonutils "github.com/kyverno/kyverno/pkg/utils/json"
"k8s.io/api/admission/v1beta1" admissionv1 "k8s.io/api/admission/v1"
) )
func (ws *WebhookServer) applyImageVerifyPolicies(request *v1beta1.AdmissionRequest, policyContext *engine.PolicyContext, policies []v1.PolicyInterface, logger logr.Logger) ([]byte, error) { func (ws *WebhookServer) applyImageVerifyPolicies(request *admissionv1.AdmissionRequest, policyContext *engine.PolicyContext, policies []v1.PolicyInterface, logger logr.Logger) ([]byte, error) {
ok, message, imagePatches := ws.handleVerifyImages(request, policyContext, policies) ok, message, imagePatches := ws.handleVerifyImages(request, policyContext, policies)
if !ok { if !ok {
return nil, errors.New(message) return nil, errors.New(message)
@ -23,7 +23,7 @@ func (ws *WebhookServer) applyImageVerifyPolicies(request *v1beta1.AdmissionRequ
return imagePatches, nil return imagePatches, nil
} }
func (ws *WebhookServer) handleVerifyImages(request *v1beta1.AdmissionRequest, func (ws *WebhookServer) handleVerifyImages(request *admissionv1.AdmissionRequest,
policyContext *engine.PolicyContext, policyContext *engine.PolicyContext,
policies []v1.PolicyInterface) (bool, string, []byte) { policies []v1.PolicyInterface) (bool, string, []byte) {