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  }