From 17c80cecab5002415b4a23d79f4e3b8728cfec1a Mon Sep 17 00:00:00 2001 From: Norwin Roosen Date: Mon, 11 Feb 2019 00:13:40 +0100 Subject: [PATCH] allow filtering via box attributes in `check|watch all` --- cmd/cmd_check.go | 10 +++++++++- cmd/cmd_watch.go | 10 ++++++++-- cmd/shared.go | 33 +++++++++++++++++++++++++++++++-- core/osem_api.go | 19 ++++++++++++++++--- 4 files changed, 64 insertions(+), 8 deletions(-) diff --git a/cmd/cmd_check.go b/cmd/cmd_check.go index 593879e..0ade239 100644 --- a/cmd/cmd_check.go +++ b/cmd/cmd_check.go @@ -5,6 +5,11 @@ import ( ) func init() { + checkAllCmd.PersistentFlags().StringVarP(&date, "date", "", "", "filter boxes by date AND phenomenon") + checkAllCmd.PersistentFlags().StringVarP(&exposure, "exposure", "", "", "filter boxes by exposure") + checkAllCmd.PersistentFlags().StringVarP(&grouptag, "grouptag", "", "", "filter boxes by grouptag") + checkAllCmd.PersistentFlags().StringVarP(&model, "model", "", "", "filter boxes by model") + checkAllCmd.PersistentFlags().StringVarP(&phenomenon, "phenomenon", "", "", "filter boxes by phenomenon AND date") checkCmd.AddCommand(checkBoxCmd) checkCmd.AddCommand(checkAllCmd) rootCmd.AddCommand(checkCmd) @@ -33,6 +38,9 @@ var checkAllCmd = &cobra.Command{ Short: "one-off check on all boxes registered on the opensensemap instance", RunE: func(cmd *cobra.Command, args []string) error { cmd.SilenceUsage = true - return checkAndNotifyAll() + + // no flag validation, as the API already does a good job at that + + return checkAndNotifyAll(parseBoxFilters()) }, } diff --git a/cmd/cmd_watch.go b/cmd/cmd_watch.go index 63c032d..3b8ff5f 100644 --- a/cmd/cmd_watch.go +++ b/cmd/cmd_watch.go @@ -14,6 +14,11 @@ func init() { watchInterval int ) + watchAllCmd.PersistentFlags().StringVarP(&date, "date", "", "", "filter boxes by date") + watchAllCmd.PersistentFlags().StringVarP(&exposure, "exposure", "", "", "filter boxes by exposure") + watchAllCmd.PersistentFlags().StringVarP(&grouptag, "grouptag", "", "", "filter boxes by grouptag") + watchAllCmd.PersistentFlags().StringVarP(&model, "model", "", "", "filter boxes by model") + watchAllCmd.PersistentFlags().StringVarP(&phenomenon, "phenomenon", "", "", "filter boxes by phenomenon") watchCmd.PersistentFlags().IntVarP(&watchInterval, "interval", "i", 30, "interval to run checks in minutes") viper.BindPFlags(watchCmd.PersistentFlags()) @@ -65,13 +70,14 @@ var watchAllCmd = &cobra.Command{ }, RunE: func(cmd *cobra.Command, args []string) error { cmd.SilenceUsage = true - err := checkAndNotifyAll() + filters := parseBoxFilters() + err := checkAndNotifyAll(filters) if err != nil { return err } for { <-ticker - err = checkAndNotifyAll() + err = checkAndNotifyAll(filters) if err != nil { // we already did retries, so exiting seems appropriate return err diff --git a/cmd/shared.go b/cmd/shared.go index ff9a519..b1a580b 100644 --- a/cmd/shared.go +++ b/cmd/shared.go @@ -34,12 +34,12 @@ func BoxIdValidator(cmd *cobra.Command, args []string) error { return nil } -func checkAndNotifyAll() error { +func checkAndNotifyAll(filters core.BoxFilters) error { log.Info("getting list of boxes...") // fetch all boxes first & extract their IDs osem := core.NewOsemClient(viper.GetString("api")) - boxes, err := osem.GetAllBoxes() + boxes, err := osem.GetAllBoxes(filters) if err != nil { return err } @@ -91,3 +91,32 @@ func checkAndNotify(boxIds []string) error { } return nil } + +var ( // values are set during cli flag parsing of checkAllCmd & watchAllCmd + date string + exposure string + grouptag string + model string + phenomenon string +) + +func parseBoxFilters () core.BoxFilters { + filters := core.BoxFilters{} + if date != "" { + filters.Date = date // TODO: parse date & format as ISO date? + } + if exposure != "" { + filters.Exposure = exposure + } + if grouptag != "" { + filters.Grouptag = grouptag + } + if model != "" { + filters.Model = model + } + if phenomenon != "" { + filters.Phenomenon = phenomenon + } + + return filters +} diff --git a/core/osem_api.go b/core/osem_api.go index 82bc910..eebc1c0 100644 --- a/core/osem_api.go +++ b/core/osem_api.go @@ -13,6 +13,14 @@ type OsemError struct { Message string `json:"message"` } +type BoxFilters struct { + Date string `url:"date,omitempty"` + Exposure string `url:"exposure,omitempty"` + Grouptag string `url:"grouptag,omitempty"` + Model string `url:"model,omitempty"` + Phenomenon string `url:"phenomenon,omitempty"` +} + type OsemClient struct { sling *sling.Sling } @@ -36,10 +44,10 @@ func (client *OsemClient) GetBox(boxId string) (*Box, error) { return box, nil } -func (client *OsemClient) GetAllBoxes() (*[]Box, error) { - boxes := &[]Box{} +func (client *OsemClient) GetAllBoxes(params BoxFilters) (*[]BoxMinimal, error) { + boxes := &[]BoxMinimal{} fail := &OsemError{} - _, err := client.sling.New().Path("boxes").Receive(boxes, fail) + _, err := client.sling.New().Path("boxes?minimal=true").QueryStruct(params).Receive(boxes, fail) if err != nil { return nil, err } @@ -81,3 +89,8 @@ type Box struct { Sensors []Sensor `json:"sensors"` NotifyConf *NotifyConfig `json:"healthcheck"` } + +type BoxMinimal struct { + Id string `json:"_id"` + Name string `json:"name"` +}