github.com/kubeshop/testkube@v1.17.23/cmd/kubectl-testkube/commands/webhooks/create.go (about)

     1  package webhooks
     2  
     3  import (
     4  	"fmt"
     5  	"strconv"
     6  
     7  	"github.com/spf13/cobra"
     8  
     9  	"github.com/kubeshop/testkube/cmd/kubectl-testkube/commands/common"
    10  	apiv1 "github.com/kubeshop/testkube/pkg/api/v1/client"
    11  	"github.com/kubeshop/testkube/pkg/crd"
    12  	"github.com/kubeshop/testkube/pkg/ui"
    13  )
    14  
    15  func NewCreateWebhookCmd() *cobra.Command {
    16  	var (
    17  		events                   []string
    18  		name, uri                string
    19  		selector                 string
    20  		labels                   map[string]string
    21  		payloadObjectField       string
    22  		payloadTemplate          string
    23  		headers                  map[string]string
    24  		payloadTemplateReference string
    25  		update                   bool
    26  	)
    27  
    28  	cmd := &cobra.Command{
    29  		Use:     "webhook",
    30  		Aliases: []string{"wh"},
    31  		Short:   "Create new Webhook",
    32  		Long:    `Create new Webhook Custom Resource`,
    33  		Run: func(cmd *cobra.Command, args []string) {
    34  			crdOnly, err := strconv.ParseBool(cmd.Flag("crd-only").Value.String())
    35  			ui.ExitOnError("parsing flag value", err)
    36  
    37  			if name == "" {
    38  				ui.Failf("pass valid name (in '--name' flag)")
    39  			}
    40  
    41  			namespace := cmd.Flag("namespace").Value.String()
    42  			var client apiv1.Client
    43  			if !crdOnly {
    44  				client, namespace, err = common.GetClient(cmd)
    45  				ui.ExitOnError("getting client", err)
    46  
    47  				webhook, _ := client.GetWebhook(name)
    48  				if name == webhook.Name {
    49  					if cmd.Flag("update").Changed {
    50  						if !update {
    51  							ui.Failf("Webhook with name '%s' already exists in namespace %s, ", webhook.Name, namespace)
    52  						}
    53  					} else {
    54  						ok := ui.Confirm(fmt.Sprintf("Webhook with name '%s' already exists in namespace %s, ", webhook.Name, namespace) +
    55  							"do you want to overwrite it?")
    56  						if !ok {
    57  							ui.Failf("Webhook creation was aborted")
    58  						}
    59  					}
    60  
    61  					options, err := NewUpdateWebhookOptionsFromFlags(cmd)
    62  					ui.ExitOnError("getting webhook options", err)
    63  
    64  					_, err = client.UpdateWebhook(options)
    65  					ui.ExitOnError("updating webhook "+name+" in namespace "+namespace, err)
    66  
    67  					ui.SuccessAndExit("Webhook updated", name)
    68  				}
    69  			}
    70  
    71  			options, err := NewCreateWebhookOptionsFromFlags(cmd)
    72  			ui.ExitOnError("getting webhook options", err)
    73  
    74  			if !crdOnly {
    75  				_, err := client.CreateWebhook(options)
    76  				ui.ExitOnError("creating webhook "+name+" in namespace "+namespace, err)
    77  
    78  				ui.Success("Webhook created", name)
    79  			} else {
    80  				if options.PayloadTemplate != "" {
    81  					options.PayloadTemplate = fmt.Sprintf("%q", options.PayloadTemplate)
    82  				}
    83  
    84  				data, err := crd.ExecuteTemplate(crd.TemplateWebhook, options)
    85  				ui.ExitOnError("executing crd template", err)
    86  
    87  				ui.Info(data)
    88  			}
    89  		},
    90  	}
    91  
    92  	cmd.Flags().StringVarP(&name, "name", "n", "", "unique webhook name - mandatory")
    93  	cmd.Flags().StringArrayVarP(&events, "events", "e", []string{}, "event types handled by webhook e.g. start-test|end-test")
    94  	cmd.Flags().StringVarP(&uri, "uri", "u", "", "URI which should be called when given event occurs (golang template supported)")
    95  	cmd.Flags().StringVarP(&selector, "selector", "", "", "expression to select tests and test suites for webhook events: --selector app=backend")
    96  	cmd.Flags().StringToStringVarP(&labels, "label", "l", nil, "label key value pair: --label key1=value1")
    97  	cmd.Flags().StringVarP(&payloadObjectField, "payload-field", "", "", "field to use for notification object payload")
    98  	cmd.Flags().StringVarP(&payloadTemplate, "payload-template", "", "", "if webhook needs to send a custom notification, then a path to template file should be provided")
    99  	cmd.Flags().StringToStringVarP(&headers, "header", "", nil, "webhook header value pair (golang template supported): --header Content-Type=application/xml")
   100  	cmd.Flags().StringVar(&payloadTemplateReference, "payload-template-reference", "", "reference to payload template to use for the webhook")
   101  	cmd.Flags().BoolVar(&update, "update", false, "update, if webhook already exists")
   102  
   103  	return cmd
   104  }