package admission import ( "fmt" kubeutils "github.com/kyverno/kyverno/pkg/utils/kube" admissionv1 "k8s.io/api/admission/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime/schema" ) func GetResourceName(request admissionv1.AdmissionRequest) string { resourceName := request.Kind.Kind + "/" + request.Name if request.Namespace != "" { resourceName = request.Namespace + "/" + resourceName } return resourceName } // ExtractResources extracts the new and old resource as unstructured func ExtractResources(newRaw []byte, request admissionv1.AdmissionRequest) (unstructured.Unstructured, unstructured.Unstructured, error) { var emptyResource unstructured.Unstructured var newResource unstructured.Unstructured var oldResource unstructured.Unstructured var err error // New Resource if newRaw == nil { newRaw = request.Object.Raw } if newRaw != nil { newResource, err = ConvertResource(newRaw, request.Kind.Group, request.Kind.Version, request.Kind.Kind, request.Namespace) if err != nil { return emptyResource, emptyResource, fmt.Errorf("failed to convert new raw to unstructured: %v", err) } } // Old Resource oldRaw := request.OldObject.Raw if oldRaw != nil { oldResource, err = ConvertResource(oldRaw, request.Kind.Group, request.Kind.Version, request.Kind.Kind, request.Namespace) if err != nil { return emptyResource, emptyResource, fmt.Errorf("failed to convert old raw to unstructured: %v", err) } } return newResource, oldResource, err } // ConvertResource converts raw bytes to an unstructured object func ConvertResource(raw []byte, group, version, kind, namespace string) (unstructured.Unstructured, error) { obj, err := kubeutils.BytesToUnstructured(raw) if err != nil { return unstructured.Unstructured{}, fmt.Errorf("failed to convert raw to unstructured: %v", err) } obj.SetGroupVersionKind(schema.GroupVersionKind{Group: group, Version: version, Kind: kind}) if namespace != "" && kind != "Namespace" { obj.SetNamespace(namespace) } if obj.GetKind() == "Namespace" && obj.GetNamespace() != "" { obj.SetNamespace("") } return *obj, nil }