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 }