github.com/1aal/kubeblocks@v0.0.0-20231107070852-e1c03e598921/pkg/cli/cmd/alert/delete_receiver.go (about) 1 /* 2 Copyright (C) 2022-2023 ApeCloud Co., Ltd 3 4 This file is part of KubeBlocks project 5 6 This program is free software: you can redistribute it and/or modify 7 it under the terms of the GNU Affero General Public License as published by 8 the Free Software Foundation, either version 3 of the License, or 9 (at your option) any later version. 10 11 This program is distributed in the hope that it will be useful 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU Affero General Public License for more details. 15 16 You should have received a copy of the GNU Affero General Public License 17 along with this program. If not, see <http://www.gnu.org/licenses/>. 18 */ 19 20 package alert 21 22 import ( 23 "fmt" 24 "strings" 25 26 "github.com/spf13/cobra" 27 "k8s.io/cli-runtime/pkg/genericiooptions" 28 "k8s.io/klog/v2" 29 cmdutil "k8s.io/kubectl/pkg/cmd/util" 30 "k8s.io/kubectl/pkg/util/templates" 31 32 "github.com/1aal/kubeblocks/pkg/cli/util" 33 ) 34 35 var ( 36 deleteReceiverExample = templates.Examples(` 37 # delete a receiver named my-receiver, all receivers can be found by command: kbcli alert list-receivers 38 kbcli alert delete-receiver my-receiver`) 39 ) 40 41 type deleteReceiverOptions struct { 42 baseOptions 43 names []string 44 } 45 46 func newDeleteReceiverCmd(f cmdutil.Factory, streams genericiooptions.IOStreams) *cobra.Command { 47 o := &deleteReceiverOptions{baseOptions: baseOptions{IOStreams: streams}} 48 cmd := &cobra.Command{ 49 Use: "delete-receiver NAME", 50 Short: "Delete alert receiver.", 51 Example: deleteReceiverExample, 52 Run: func(cmd *cobra.Command, args []string) { 53 util.CheckErr(o.complete(f)) 54 util.CheckErr(o.validate(args)) 55 util.CheckErr(o.run()) 56 }, 57 } 58 return cmd 59 } 60 61 func (o *deleteReceiverOptions) validate(args []string) error { 62 if len(args) == 0 { 63 return fmt.Errorf("receiver name is required") 64 } 65 o.names = args 66 return nil 67 } 68 69 func (o *deleteReceiverOptions) run() error { 70 // delete receiver from alert manager config 71 if err := o.deleteReceiver(); err != nil { 72 return err 73 } 74 75 // delete receiver from webhook config 76 if err := o.deleteWebhookReceivers(); err != nil { 77 return err 78 } 79 80 fmt.Fprintf(o.Out, "Receiver %s deleted successfully\n", strings.Join(o.names, ",")) 81 return nil 82 } 83 84 func (o *deleteReceiverOptions) deleteReceiver() error { 85 data, err := getConfigData(o.alertConfigMap, alertConfigFileName) 86 if err != nil { 87 return err 88 } 89 90 var newReceivers []interface{} 91 var newRoutes []interface{} 92 // build receiver route map, key is receiver name, value is route 93 receiverRouteMap := make(map[string]interface{}) 94 routes := getRoutesFromData(data) 95 for i, r := range routes { 96 name := r.(map[string]interface{})["receiver"].(string) 97 receiverRouteMap[name] = routes[i] 98 } 99 100 receivers := getReceiversFromData(data) 101 for i, rec := range receivers { 102 var found bool 103 name := rec.(map[string]interface{})["name"].(string) 104 for _, n := range o.names { 105 if n == name { 106 found = true 107 break 108 } 109 } 110 if !found { 111 newReceivers = append(newReceivers, receivers[i]) 112 r, ok := receiverRouteMap[name] 113 if !ok { 114 klog.V(1).Infof("receiver %s not found in routes\n", name) 115 continue 116 } 117 newRoutes = append(newRoutes, r) 118 } 119 } 120 121 // check if receiver exists 122 if len(receivers) == len(newReceivers) { 123 return fmt.Errorf("receiver %s not found", strings.Join(o.names, ",")) 124 } 125 126 data["receivers"] = newReceivers 127 data["route"].(map[string]interface{})["routes"] = newRoutes 128 return updateConfig(o.client, o.alertConfigMap, alertConfigFileName, data) 129 } 130 131 func (o *deleteReceiverOptions) deleteWebhookReceivers() error { 132 data, err := getConfigData(o.webhookConfigMap, webhookAdaptorFileName) 133 if err != nil { 134 return err 135 } 136 var newReceivers []interface{} 137 receivers := getReceiversFromData(data) 138 for i, rec := range receivers { 139 var found bool 140 name := rec.(map[string]interface{})["name"].(string) 141 for _, n := range o.names { 142 if n == name { 143 found = true 144 break 145 } 146 } 147 if !found { 148 newReceivers = append(newReceivers, receivers[i]) 149 } 150 } 151 data["receivers"] = newReceivers 152 return updateConfig(o.client, o.webhookConfigMap, webhookAdaptorFileName, data) 153 }