...
1 package cli
2
3 import (
4 "context"
5 "flag"
6 "fmt"
7 "strings"
8
9 "github.com/peterbourgon/ff/v3/ffcli"
10
11 alertmgr "edge-infra.dev/pkg/lib/gcp/monitoring/alertmanager"
12 )
13
14 type createArgsT struct {
15 templatePath string
16 }
17
18 var createArgs createArgsT
19 var createFlagSet = newCreateFlagSet(&createArgs)
20
21 func newCreateFlagSet(createArgs *createArgsT) *flag.FlagSet {
22 createf := newFlagSet("create")
23 createf.StringVar(&createArgs.templatePath, "path", "", "File/Folder path to the AlertPolicy(ies) (*.json) file(s).")
24 return createf
25 }
26
27 var createCmd = &ffcli.Command{
28 Name: "create",
29 ShortUsage: "create [flags]",
30 ShortHelp: "Create an alert policy",
31 FlagSet: withGlobalFlags(createFlagSet),
32 Exec: runCreate,
33 }
34
35 func runCreate(_ context.Context, args []string) error {
36 var err error
37
38 if len(args) > 0 {
39 Fatalf("too many non-flag arguments: %q", args)
40 }
41
42 if !checkCreateFlags() {
43 Println()
44 return flag.ErrHelp
45 }
46
47
48 sourceAlertPolicy, err := alertmgr.ReadAlertPolicyFromPath(createArgs.templatePath)
49 if err != nil {
50 logger.Error(err, "Failed to read AlertPolicy configuration from file")
51 return err
52 }
53
54 for i := 0; i < len(sourceAlertPolicy); i++ {
55 policies, err := alertmgr.GetAlertPolicies(projectID, sourceAlertPolicy[i].DisplayName, "")
56
57 testDuplicateFlag := strings.Contains(sourceAlertPolicy[i].UserLabels["validation"], "test")
58 if (err != nil || policies != nil) && !testDuplicateFlag {
59 logger.Error(nil, "AlertPolicy already exists in project", "project-id", projectID, "display-name", sourceAlertPolicy[i].DisplayName)
60 continue
61 }
62 err = alertmgr.CreateAlertPolicies(sourceAlertPolicy[i].AlertPolicy, projectID)
63 if err != nil {
64 return err
65 }
66 }
67 return nil
68 }
69
70 func checkCreateFlags() bool {
71 if len(projectID) == 0 {
72 logger.Error(nil, "Error: no value specified for [project] - a valid project-id is required")
73 return false
74 }
75
76 if len(createArgs.templatePath) == 0 {
77 logger.Error(nil, "Error: no value specified for [path] please provide the location of the AlertPolicy (*.json) file(s)")
78 return false
79 }
80
81 if !checkPath(createArgs.templatePath, false) {
82 logger.Error(nil, fmt.Sprintf("Error: invalid AlertPolicy [path] specified - %s\n", createArgs.templatePath))
83 return false
84 }
85
86 return true
87 }
88
View as plain text