package cli import ( "context" "flag" "fmt" "strings" "github.com/peterbourgon/ff/v3/ffcli" alertmgr "edge-infra.dev/pkg/lib/gcp/monitoring/alertmanager" ) type createArgsT struct { templatePath string } var createArgs createArgsT var createFlagSet = newCreateFlagSet(&createArgs) func newCreateFlagSet(createArgs *createArgsT) *flag.FlagSet { createf := newFlagSet("create") createf.StringVar(&createArgs.templatePath, "path", "", "File/Folder path to the AlertPolicy(ies) (*.json) file(s).") return createf } var createCmd = &ffcli.Command{ Name: "create", ShortUsage: "create [flags]", ShortHelp: "Create an alert policy", FlagSet: withGlobalFlags(createFlagSet), Exec: runCreate, } func runCreate(_ context.Context, args []string) error { var err error if len(args) > 0 { Fatalf("too many non-flag arguments: %q", args) } if !checkCreateFlags() { Println() return flag.ErrHelp } // Get the AlertPolicy configuration template(s) from the path. sourceAlertPolicy, err := alertmgr.ReadAlertPolicyFromPath(createArgs.templatePath) if err != nil { logger.Error(err, "Failed to read AlertPolicy configuration from file") return err } for i := 0; i < len(sourceAlertPolicy); i++ { policies, err := alertmgr.GetAlertPolicies(projectID, sourceAlertPolicy[i].DisplayName, "") // allows duplicate alertpolicies creation for testing purpose. Only for test alertpolicies with userlabel [validation:test]. testDuplicateFlag := strings.Contains(sourceAlertPolicy[i].UserLabels["validation"], "test") if (err != nil || policies != nil) && !testDuplicateFlag { logger.Error(nil, "AlertPolicy already exists in project", "project-id", projectID, "display-name", sourceAlertPolicy[i].DisplayName) continue } err = alertmgr.CreateAlertPolicies(sourceAlertPolicy[i].AlertPolicy, projectID) if err != nil { return err } } return nil } func checkCreateFlags() bool { if len(projectID) == 0 { logger.Error(nil, "Error: no value specified for [project] - a valid project-id is required") return false } if len(createArgs.templatePath) == 0 { logger.Error(nil, "Error: no value specified for [path] please provide the location of the AlertPolicy (*.json) file(s)") return false } if !checkPath(createArgs.templatePath, false) { logger.Error(nil, fmt.Sprintf("Error: invalid AlertPolicy [path] specified - %s\n", createArgs.templatePath)) return false } return true }