From 8c6c22a1bdef903eccb4926d51031e1312e9f0b8 Mon Sep 17 00:00:00 2001 From: Vijayan Balasubramanian Date: Fri, 7 Aug 2020 11:25:12 -0700 Subject: [PATCH] Command: Cat command to concatenate and print detectors Created command to accept list of detectors to concatenate and print detectors. This is similar to cat command in unix. --- cli/cmd/cat.go | 105 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 cli/cmd/cat.go diff --git a/cli/cmd/cat.go b/cli/cmd/cat.go new file mode 100644 index 00000000..72feb227 --- /dev/null +++ b/cli/cmd/cat.go @@ -0,0 +1,105 @@ +/* + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * http://www.apache.org/licenses/LICENSE-2.0 + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package cmd + +import ( + "encoding/json" + entity "esad/internal/entity/ad" + "esad/internal/handler/ad" + "fmt" + "github.com/spf13/cobra" +) + +const ( + commandCat = "cat" +) + +//catCmd prints detectors configuration based on id and name pattern. +var catCmd = &cobra.Command{ + Use: commandCat + " [flags] [list of detectors]", + Short: "Concatenate and print detectors based on id or name pattern", + Long: `concatenate and print detectors based on pattern, use "" to make sure the name is not matched with pwd lists'`, + Run: func(cmd *cobra.Command, args []string) { + //If no args, display usage + if len(args) < 1 { + if err := cmd.Usage(); err != nil { + fmt.Println(err) + } + return + } + idStatus, _ := cmd.Flags().GetBool("id") + commandHandler, err := getCommandHandler() + if err != nil { + fmt.Println(err) + } + var results []*entity.DetectorOutput + if idStatus { + results = executeByID(commandHandler, args) + } else { + results = executeByNames(commandHandler, args) + } + printDetectors(results) + }, +} + +//executeByNames gets detector output based on name as argument +func executeByNames(commandHandler *ad.Handler, args []string) []*entity.DetectorOutput { + + var results []*entity.DetectorOutput + for _, detector := range args { + output, err := ad.GetAnomalyDetectorsByNamePattern(commandHandler, detector) + results = append(results, output...) + if err != nil { + fmt.Println(err) + return nil + } + } + return results +} + +//executeByID gets detector output based on ID as argument +func executeByID(commandHandler *ad.Handler, args []string) []*entity.DetectorOutput { + + var results []*entity.DetectorOutput + for _, detector := range args { + output, err := ad.GetAnomalyDetectorByID(commandHandler, detector) + results = append(results, output) + if err != nil { + fmt.Println(err) + return nil + } + } + return results +} + +//printDetectors displays the list of output. Since this is json format, use indent function to +// pretty print before printing on console +func printDetectors(results []*entity.DetectorOutput) { + if results == nil { + return + } + for _, d := range results { + formattedOutput, err := json.MarshalIndent(d, "", " ") + if err != nil { + fmt.Println(err) + return + } + fmt.Println(string(formattedOutput)) + } +} + +func init() { + esadCmd.AddCommand(catCmd) + catCmd.Flags().BoolP("name", "", true, "Input is name or pattern") + catCmd.Flags().BoolP("id", "", false, "Input is id") +}