From a148f4250d2a985ae27c46e3ebb0884ed9ce2dd7 Mon Sep 17 00:00:00 2001 From: sqshq Date: Sun, 9 Jun 2019 15:00:16 -0400 Subject: [PATCH] basic config validation added --- config/validator.go | 55 +++++++++- example.yml | 239 ++++++++++++++++++++++---------------------- 2 files changed, 170 insertions(+), 124 deletions(-) diff --git a/config/validator.go b/config/validator.go index f1b5933..4f31b38 100644 --- a/config/validator.go +++ b/config/validator.go @@ -1,10 +1,55 @@ package config -/* - TODO validation - - title uniquness and mandatory within a single type of widget - - label uniqueness and mandatory (if > 1 data bullets) -*/ +import ( + "fmt" + "github.com/sqshq/sampler/console" +) + func (c *Config) validate() { + var components []ComponentConfig + + for _, c := range c.RunCharts { + components = append(components, c.ComponentConfig) + validateLabelsUniqueness(c.Title, c.Items) + } + for _, c := range c.BarCharts { + components = append(components, c.ComponentConfig) + validateLabelsUniqueness(c.Title, c.Items) + } + for _, c := range c.SparkLines { + components = append(components, c.ComponentConfig) + } + for _, c := range c.Gauges { + components = append(components, c.ComponentConfig) + } + for _, c := range c.AsciiBoxes { + components = append(components, c.ComponentConfig) + } + for _, c := range c.TextBoxes { + components = append(components, c.ComponentConfig) + } + + validateTitlesUniqueness(components) +} + +func validateLabelsUniqueness(title string, items []Item) { + labels := make(map[string]bool) + for _, c := range items { + label := *c.Label + if _, contains := labels[label]; contains { + console.Exit(fmt.Sprintf("Config validation error: item labels should be unique. Please rename '%s' in '%s'", label, title)) + } + labels[label] = true + } +} + +func validateTitlesUniqueness(components []ComponentConfig) { + titles := make(map[string]bool) + for _, c := range components { + if _, contains := titles[c.Title]; contains { + console.Exit(fmt.Sprintf("Config validation error: component titles should be unique. Please rename '%s'", c.Title)) + } + titles[c.Title] = true + } } diff --git a/example.yml b/example.yml index 3220a5d..8502826 100644 --- a/example.yml +++ b/example.yml @@ -1,127 +1,128 @@ variables: mongoconnection: mongo --quiet --host=localhost blog runcharts: -- title: SEARCH ENGINE RESPONSE TIME (sec) - position: [[0, 0], [52, 16]] - triggers: - - title: Latency threshold exceeded - condition: echo "$prev < 0.8 && $cur > 0.8" |bc -l - actions: - terminal-bell: true - sound: true - visual: true - script: 'say alert: ${label} latency exceeded ${cur} second' - scale: 3 - items: - - label: GOOGLE - sample: curl -o /dev/null -s -w '%{time_total}' https://www.google.com - - label: YAHOO - sample: curl -o /dev/null -s -w '%{time_total}' https://search.yahoo.com - - label: BING - sample: curl -o /dev/null -s -w '%{time_total}' https://www.bing.com -- title: MONGO COLLECTIONS COUNT - position: [[53, 0], [27, 8]] - legend: - enabled: true - details: false - scale: 0 - items: - - label: ACTIVE - init: $mongoconnection - sample: db.getCollection('posts').find({status:'ACTIVE'}).itcount() - - label: INACTIVE - init: $mongoconnection - sample: db.getCollection('posts').find({status:'INACTIVE'}).itcount() + - title: SEARCH ENGINE RESPONSE TIME (sec) + position: [[0, 0], [52, 16]] + triggers: + - title: Latency threshold exceeded + condition: echo "$prev < 0.8 && $cur > 0.8" |bc -l + actions: + terminal-bell: true + sound: true + visual: true + script: 'say alert: ${label} latency exceeded ${cur} second' + scale: 3 + items: + - label: GOOGLE + sample: curl -o /dev/null -s -w '%{time_total}' https://www.google.com + - label: YAHOO + sample: curl -o /dev/null -s -w '%{time_total}' https://search.yahoo.com + - label: BING + sample: curl -o /dev/null -s -w '%{time_total}' https://www.bing.com + - title: MONGO COLLECTIONS COUNT + position: [[53, 0], [27, 8]] + legend: + enabled: true + details: false + scale: 0 + items: + - label: ACTIVE + init: $mongoconnection + sample: db.getCollection('posts').find({status:'ACTIVE'}).itcount() + - label: INACTIVE + init: $mongoconnection + sample: db.getCollection('posts').find({status:'INACTIVE'}).itcount() barcharts: -- title: EVENTS BY STATUS - position: [[0, 17], [28, 12]] - rate-ms: 300 - scale: 0 - items: - - label: NEW - init: $mongoconnection - sample: db.getCollection('posts').find({status:'ACTIVE'}).itcount() - - label: TRIGGERED - init: $mongoconnection - sample: db.getCollection('posts').find({status:'INACTIVE'}).itcount() - - label: IN_PROCESS - init: $mongoconnection - sample: db.getCollection('posts').find({status:'UNKNOWN'}).itcount() - - label: FAILED - init: $mongoconnection - sample: db.getCollection('posts').find({status:'ACTIVE'}).itcount() - - label: FINISHED - init: $mongoconnection - sample: db.getCollection('posts').find({status:'INACTIVE'}).itcount() + - title: EVENTS BY STATUS + position: [[0, 17], [28, 12]] + rate-ms: 300 + scale: 0 + items: + - label: NEW + init: $mongoconnection + sample: db.getCollection('posts').find({status:'ACTIVE'}).itcount() + - label: TRIGGERED + init: $mongoconnection + sample: db.getCollection('posts').find({status:'INACTIVE'}).itcount() + - label: IN_PROCESS + init: $mongoconnection + sample: db.getCollection('posts').find({status:'UNKNOWN'}).itcount() + - label: FAILED + init: $mongoconnection + sample: db.getCollection('posts').find({status:'ACTIVE'}).itcount() + - label: FINISHED + init: $mongoconnection + sample: db.getCollection('posts').find({status:'INACTIVE'}).itcount() gauges: -- title: YEAR PROGRESS - position: [[53, 8], [27, 2]] - cur: - sample: date +%j - max: - sample: echo 365 - min: - sample: echo 0 -- title: DAY PROGRESS - position: [[53, 10], [27, 2]] - cur: - sample: date +%H - max: - sample: echo 24 - min: - sample: echo 0 -- title: HOUR PROGRESS - position: [[53, 12], [27, 2]] - cur: - sample: date +%M - max: - sample: echo 60 - min: - sample: echo 0 -- title: MINUTE PROGRESS - position: [[53, 14], [27, 2]] - triggers: - - title: CLOCK BELL EVERY MINUTE - condition: '[ $label == "cur" ] && [ $cur -eq 0 ] && echo 1 || echo 0' - actions: - sound: true - script: say -v samantha `date +%I:%M%p` - cur: - sample: date +%S - max: - sample: echo 60 - min: - sample: echo 0 + - title: YEAR PROGRESS + position: [[53, 8], [27, 2]] + cur: + sample: date +%j + max: + sample: echo 365 + min: + sample: echo 0 + - title: DAY PROGRESS + position: [[53, 10], [27, 2]] + cur: + sample: date +%H + max: + sample: echo 24 + min: + sample: echo 0 + - title: HOUR PROGRESS + position: [[53, 12], [27, 2]] + cur: + sample: date +%M + max: + sample: echo 60 + min: + sample: echo 0 + - title: MINUTE PROGRESS + position: [[53, 14], [27, 2]] + triggers: + - title: CLOCK BELL EVERY MINUTE + condition: '[ $label == "cur" ] && [ $cur -eq 0 ] && echo 1 || echo 0' + actions: + sound: true + script: say -v samantha `date +%I:%M%p` + cur: + sample: date +%S + max: + sample: echo 60 + min: + sample: echo 0 sparklines: -- title: CPU usage - position: [[28, 22], [24, 7]] - scale: 0 - sample: ps -A -o %cpu | awk '{s+=$1} END {print s}' -- title: Memory pages free - position: [[28, 17], [24, 5]] - scale: 0 - sample: memory_pressure | grep 'Pages free' | awk '{print $3}' + - title: CPU usage + position: [[28, 22], [24, 7]] + scale: 0 + sample: ps -A -o %cpu | awk '{s+=$1} END {print s}' + - title: Memory pages free + position: [[28, 17], [24, 5]] + scale: 0 + sample: memory_pressure | grep 'Pages free' | awk '{print $3}' textboxes: -- title: Local weather - position: [[0, 30], [13, 7]] - rate-ms: 10000 - sample: curl wttr.in?0ATQF - border: false -- title: New York weather - position: [[8, 30], [13, 7]] - rate-ms: 10000 - sample: curl wttr.in/newyork?0ATQF - border: false -- title: San Francisco weather - position: [[17, 30], [13, 7]] - rate-ms: 10000 - sample: curl wttr.in/sanfrancisco?0ATQF - border: false + - title: Local weather + position: [[0, 30], [13, 7]] + rate-ms: 10000 + sample: curl wttr.in?0ATQF + border: false + - title: New York weather + position: [[8, 30], [13, 7]] + rate-ms: 10000 + sample: curl wttr.in/newyork?0ATQF + border: false + transform: echo 1 + - title: San Francisco weather + position: [[17, 30], [13, 7]] + rate-ms: 10000 + sample: curl wttr.in/sanfrancisco?0ATQF + border: false asciiboxes: -- title: LOCAL TIME - position: [[53, 17], [27, 5]] - sample: date +%r -- title: UTC TIME - position: [[53, 22], [27, 7]] - sample: env TZ=UTC date +%r - font: 3d + - title: LOCAL TIME + position: [[53, 17], [27, 5]] + sample: date +%r + - title: UTC TIME + position: [[53, 22], [27, 7]] + sample: env TZ=UTC date +%r + font: 3d