allow filtering via box attributes in `check|watch all`

master
Norwin 5 years ago
parent 83fb1e7d76
commit 17c80cecab

@ -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())
},
}

@ -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

@ -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
}

@ -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"`
}

Loading…
Cancel
Save