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 }