github.com/kubeshop/testkube@v1.17.23/pkg/event/kind/webhook/loader.go (about)

     1  package webhook
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"go.uber.org/zap"
     7  
     8  	executorsv1 "github.com/kubeshop/testkube-operator/api/executor/v1"
     9  	templatesclientv1 "github.com/kubeshop/testkube-operator/pkg/client/templates/v1"
    10  	"github.com/kubeshop/testkube/pkg/api/v1/testkube"
    11  	"github.com/kubeshop/testkube/pkg/event/kind/common"
    12  	"github.com/kubeshop/testkube/pkg/mapper/webhooks"
    13  )
    14  
    15  var _ common.ListenerLoader = (*WebhooksLoader)(nil)
    16  
    17  // WebhooksLister loads webhooks from kubernetes
    18  type WebhooksLister interface {
    19  	List(selector string) (*executorsv1.WebhookList, error)
    20  }
    21  
    22  func NewWebhookLoader(log *zap.SugaredLogger, webhooksClient WebhooksLister, templatesClient templatesclientv1.Interface) *WebhooksLoader {
    23  	return &WebhooksLoader{
    24  		log:             log,
    25  		WebhooksClient:  webhooksClient,
    26  		templatesClient: templatesClient,
    27  	}
    28  }
    29  
    30  type WebhooksLoader struct {
    31  	log             *zap.SugaredLogger
    32  	WebhooksClient  WebhooksLister
    33  	templatesClient templatesclientv1.Interface
    34  }
    35  
    36  func (r WebhooksLoader) Kind() string {
    37  	return "webhook"
    38  }
    39  
    40  func (r WebhooksLoader) Load() (listeners common.Listeners, err error) {
    41  	// load all webhooks from kubernetes CRDs
    42  	webhookList, err := r.WebhooksClient.List("")
    43  	if err != nil {
    44  		return listeners, err
    45  	}
    46  
    47  	// and create listeners for each webhook spec
    48  	for _, webhook := range webhookList.Items {
    49  		payloadTemplate := ""
    50  		if webhook.Spec.PayloadTemplateReference != "" {
    51  			template, err := r.templatesClient.Get(webhook.Spec.PayloadTemplateReference)
    52  			if err != nil {
    53  				return listeners, err
    54  			}
    55  
    56  			if template.Spec.Type_ != nil && testkube.TemplateType(*template.Spec.Type_) == testkube.WEBHOOK_TemplateType {
    57  				payloadTemplate = template.Spec.Body
    58  			} else {
    59  				r.log.Warnw("not matching template type", "template", webhook.Spec.PayloadTemplateReference)
    60  			}
    61  		}
    62  
    63  		if webhook.Spec.PayloadTemplate != "" {
    64  			payloadTemplate = webhook.Spec.PayloadTemplate
    65  		}
    66  
    67  		types := webhooks.MapEventArrayToCRDEvents(webhook.Spec.Events)
    68  		name := fmt.Sprintf("%s.%s", webhook.ObjectMeta.Namespace, webhook.ObjectMeta.Name)
    69  		listeners = append(listeners, NewWebhookListener(name, webhook.Spec.Uri, webhook.Spec.Selector, types, webhook.Spec.PayloadObjectField, payloadTemplate, webhook.Spec.Headers))
    70  	}
    71  
    72  	return listeners, nil
    73  }