github.com/argoproj/argo-events@v1.9.1/webhook/validator/validator.go (about) 1 package validator 2 3 import ( 4 "context" 5 "encoding/json" 6 "fmt" 7 8 admissionv1 "k8s.io/api/admission/v1" 9 apierrors "k8s.io/apimachinery/pkg/api/errors" 10 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 11 "k8s.io/client-go/kubernetes" 12 13 "github.com/argoproj/argo-events/common/logging" 14 eventbuspkg "github.com/argoproj/argo-events/pkg/apis/eventbus" 15 eventbusv1alpha1 "github.com/argoproj/argo-events/pkg/apis/eventbus/v1alpha1" 16 eventsourcepkg "github.com/argoproj/argo-events/pkg/apis/eventsource" 17 eventsourcev1alpha1 "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1" 18 sensorpkg "github.com/argoproj/argo-events/pkg/apis/sensor" 19 sensorv1alpha1 "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1" 20 eventbusclient "github.com/argoproj/argo-events/pkg/client/eventbus/clientset/versioned" 21 eventsourceclient "github.com/argoproj/argo-events/pkg/client/eventsource/clientset/versioned" 22 sensorclient "github.com/argoproj/argo-events/pkg/client/sensor/clientset/versioned" 23 ) 24 25 // Validator is an interface for CRD objects 26 type Validator interface { 27 ValidateCreate(context.Context) *admissionv1.AdmissionResponse 28 ValidateUpdate(context.Context) *admissionv1.AdmissionResponse 29 } 30 31 // GetValidator returns a Validator instance 32 func GetValidator(ctx context.Context, client kubernetes.Interface, ebClient eventbusclient.Interface, 33 esClient eventsourceclient.Interface, sensorClient sensorclient.Interface, 34 kind metav1.GroupVersionKind, oldBytes []byte, newBytes []byte) (Validator, error) { 35 log := logging.FromContext(ctx) 36 switch kind.Kind { 37 case eventbuspkg.Kind: 38 var new *eventbusv1alpha1.EventBus 39 if len(newBytes) > 0 { 40 new = &eventbusv1alpha1.EventBus{} 41 if err := json.Unmarshal(newBytes, new); err != nil { 42 log.Errorf("Could not unmarshal new raw object: %v", err) 43 return nil, err 44 } 45 } 46 var old *eventbusv1alpha1.EventBus 47 if len(oldBytes) > 0 { 48 old = &eventbusv1alpha1.EventBus{} 49 if err := json.Unmarshal(oldBytes, old); err != nil { 50 log.Errorf("Could not unmarshal old raw object: %v", err) 51 return nil, err 52 } 53 } 54 return NewEventBusValidator(client, ebClient, esClient, sensorClient, old, new), nil 55 case eventsourcepkg.Kind: 56 var new *eventsourcev1alpha1.EventSource 57 if len(newBytes) > 0 { 58 new = &eventsourcev1alpha1.EventSource{} 59 if err := json.Unmarshal(newBytes, new); err != nil { 60 log.Errorf("Could not unmarshal new raw object: %v", err) 61 return nil, err 62 } 63 } 64 var old *eventsourcev1alpha1.EventSource 65 if len(oldBytes) > 0 { 66 old = &eventsourcev1alpha1.EventSource{} 67 if err := json.Unmarshal(oldBytes, old); err != nil { 68 log.Errorf("Could not unmarshal old raw object: %v", err) 69 return nil, err 70 } 71 } 72 return NewEventSourceValidator(client, ebClient, esClient, sensorClient, old, new), nil 73 case sensorpkg.Kind: 74 var new *sensorv1alpha1.Sensor 75 if len(newBytes) > 0 { 76 new = &sensorv1alpha1.Sensor{} 77 if err := json.Unmarshal(newBytes, new); err != nil { 78 log.Errorf("Could not unmarshal new raw object: %v", err) 79 return nil, err 80 } 81 } 82 var old *sensorv1alpha1.Sensor 83 if len(oldBytes) > 0 { 84 old = &sensorv1alpha1.Sensor{} 85 if err := json.Unmarshal(oldBytes, old); err != nil { 86 log.Errorf("Could not unmarshal old raw object: %v", err) 87 return nil, err 88 } 89 } 90 return NewSensorValidator(client, ebClient, esClient, sensorClient, old, new), nil 91 default: 92 return nil, fmt.Errorf("unrecognized GVK %v", kind) 93 } 94 } 95 96 // DeniedResponse constructs a denied AdmissionResonse 97 func DeniedResponse(reason string, args ...interface{}) *admissionv1.AdmissionResponse { 98 result := apierrors.NewBadRequest(fmt.Sprintf(reason, args...)).Status() 99 return &admissionv1.AdmissionResponse{ 100 Result: &result, 101 Allowed: false, 102 } 103 } 104 105 // AllowedResponse constructs an allowed AdmissionResonse 106 func AllowedResponse() *admissionv1.AdmissionResponse { 107 return &admissionv1.AdmissionResponse{ 108 Allowed: true, 109 } 110 }