123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418 |
- // Copyright (c) 2017 Arista Networks, Inc.
- // Use of this source code is governed by the Apache License 2.0
- // that can be found in the COPYING file.
- package main
- import (
- "regexp"
- "testing"
- "notabug.org/themusicgod1/goarista/test"
- "github.com/prometheus/client_golang/prometheus"
- )
- func TestParseConfig(t *testing.T) {
- tCases := []struct {
- input []byte
- config Config
- }{
- {
- input: []byte(`
- devicelabels:
- 10.1.1.1:
- lab1: val1
- lab2: val2
- '*':
- lab1: val3
- lab2: val4
- subscriptions:
- - /Sysdb/environment/cooling/status
- - /Sysdb/environment/power/status
- metrics:
- - name: intfCounter
- path: /Sysdb/(lag|slice/phy/.+)/intfCounterDir/(?P<intf>.+)/intfCounter
- help: Per-Interface Bytes/Errors/Discards Counters
- - name: fanSpeed
- path: /Sysdb/environment/cooling/fan/speed/value
- help: Fan Speed`),
- config: Config{
- DeviceLabels: map[string]prometheus.Labels{
- "10.1.1.1": {
- "lab1": "val1",
- "lab2": "val2",
- },
- "*": {
- "lab1": "val3",
- "lab2": "val4",
- },
- },
- Subscriptions: []string{
- "/Sysdb/environment/cooling/status",
- "/Sysdb/environment/power/status",
- },
- Metrics: []*MetricDef{
- {
- Path: "/Sysdb/(lag|slice/phy/.+)/intfCounterDir/(?P<intf>.+)/intfCounter",
- re: regexp.MustCompile(
- "/Sysdb/(lag|slice/phy/.+)/intfCounterDir/(?P<intf>.+)/intfCounter"),
- Name: "intfCounter",
- Help: "Per-Interface Bytes/Errors/Discards Counters",
- devDesc: map[string]*prometheus.Desc{
- "10.1.1.1": prometheus.NewDesc("intfCounter",
- "Per-Interface Bytes/Errors/Discards Counters",
- []string{"unnamedLabel1", "intf"},
- prometheus.Labels{"lab1": "val1", "lab2": "val2"}),
- },
- desc: prometheus.NewDesc("intfCounter",
- "Per-Interface Bytes/Errors/Discards Counters",
- []string{"unnamedLabel1", "intf"},
- prometheus.Labels{"lab1": "val3", "lab2": "val4"}),
- },
- {
- Path: "/Sysdb/environment/cooling/fan/speed/value",
- re: regexp.MustCompile("/Sysdb/environment/cooling/fan/speed/value"),
- Name: "fanSpeed",
- Help: "Fan Speed",
- devDesc: map[string]*prometheus.Desc{
- "10.1.1.1": prometheus.NewDesc("fanSpeed", "Fan Speed", []string{},
- prometheus.Labels{"lab1": "val1", "lab2": "val2"}),
- },
- desc: prometheus.NewDesc("fanSpeed", "Fan Speed", []string{},
- prometheus.Labels{"lab1": "val3", "lab2": "val4"}),
- },
- },
- },
- },
- {
- input: []byte(`
- devicelabels:
- '*':
- lab1: val3
- lab2: val4
- subscriptions:
- - /Sysdb/environment/cooling/status
- - /Sysdb/environment/power/status
- metrics:
- - name: intfCounter
- path: /Sysdb/(?:lag|slice/phy/.+)/intfCounterDir/(?P<intf>.+)/intfCounter
- help: Per-Interface Bytes/Errors/Discards Counters
- - name: fanSpeed
- path: /Sysdb/environment/cooling/fan/speed/value
- help: Fan Speed`),
- config: Config{
- DeviceLabels: map[string]prometheus.Labels{
- "*": {
- "lab1": "val3",
- "lab2": "val4",
- },
- },
- Subscriptions: []string{
- "/Sysdb/environment/cooling/status",
- "/Sysdb/environment/power/status",
- },
- Metrics: []*MetricDef{
- {
- Path: "/Sysdb/(?:lag|slice/phy/.+)/intfCounterDir/(?P<intf>.+)/intfCounter",
- re: regexp.MustCompile(
- "/Sysdb/(?:lag|slice/phy/.+)/intfCounterDir/(?P<intf>.+)/intfCounter"),
- Name: "intfCounter",
- Help: "Per-Interface Bytes/Errors/Discards Counters",
- devDesc: map[string]*prometheus.Desc{},
- desc: prometheus.NewDesc("intfCounter",
- "Per-Interface Bytes/Errors/Discards Counters",
- []string{"intf"},
- prometheus.Labels{"lab1": "val3", "lab2": "val4"}),
- },
- {
- Path: "/Sysdb/environment/cooling/fan/speed/value",
- re: regexp.MustCompile("/Sysdb/environment/cooling/fan/speed/value"),
- Name: "fanSpeed",
- Help: "Fan Speed",
- devDesc: map[string]*prometheus.Desc{},
- desc: prometheus.NewDesc("fanSpeed", "Fan Speed", []string{},
- prometheus.Labels{"lab1": "val3", "lab2": "val4"}),
- },
- },
- },
- },
- {
- input: []byte(`
- devicelabels:
- 10.1.1.1:
- lab1: val1
- lab2: val2
- subscriptions:
- - /Sysdb/environment/cooling/status
- - /Sysdb/environment/power/status
- metrics:
- - name: intfCounter
- path: /Sysdb/(?:lag|slice/phy/.+)/intfCounterDir/(?P<intf>.+)/intfCounter
- help: Per-Interface Bytes/Errors/Discards Counters
- - name: fanSpeed
- path: /Sysdb/environment/cooling/fan/speed/value
- help: Fan Speed`),
- config: Config{
- DeviceLabels: map[string]prometheus.Labels{
- "10.1.1.1": {
- "lab1": "val1",
- "lab2": "val2",
- },
- },
- Subscriptions: []string{
- "/Sysdb/environment/cooling/status",
- "/Sysdb/environment/power/status",
- },
- Metrics: []*MetricDef{
- {
- Path: "/Sysdb/(?:lag|slice/phy/.+)/intfCounterDir/(?P<intf>.+)/intfCounter",
- re: regexp.MustCompile(
- "/Sysdb/(?:lag|slice/phy/.+)/intfCounterDir/(?P<intf>.+)/intfCounter"),
- Name: "intfCounter",
- Help: "Per-Interface Bytes/Errors/Discards Counters",
- devDesc: map[string]*prometheus.Desc{
- "10.1.1.1": prometheus.NewDesc("intfCounter",
- "Per-Interface Bytes/Errors/Discards Counters",
- []string{"intf"},
- prometheus.Labels{"lab1": "val1", "lab2": "val2"}),
- },
- },
- {
- Path: "/Sysdb/environment/cooling/fan/speed/value",
- re: regexp.MustCompile("/Sysdb/environment/cooling/fan/speed/value"),
- Name: "fanSpeed",
- Help: "Fan Speed",
- devDesc: map[string]*prometheus.Desc{
- "10.1.1.1": prometheus.NewDesc("fanSpeed", "Fan Speed", []string{},
- prometheus.Labels{"lab1": "val1", "lab2": "val2"}),
- },
- },
- },
- },
- },
- {
- input: []byte(`
- subscriptions:
- - /Sysdb/environment/cooling/status
- - /Sysdb/environment/power/status
- metrics:
- - name: intfCounter
- path: /Sysdb/(?:lag|slice/phy/.+)/intfCounterDir/(?P<intf>.+)/intfCounter
- help: Per-Interface Bytes/Errors/Discards Counters
- - name: fanSpeed
- path: /Sysdb/environment/cooling/fan/speed/value
- help: Fan Speed`),
- config: Config{
- DeviceLabels: map[string]prometheus.Labels{},
- Subscriptions: []string{
- "/Sysdb/environment/cooling/status",
- "/Sysdb/environment/power/status",
- },
- Metrics: []*MetricDef{
- {
- Path: "/Sysdb/(?:lag|slice/phy/.+)/intfCounterDir/(?P<intf>.+)/intfCounter",
- re: regexp.MustCompile(
- "/Sysdb/(?:lag|slice/phy/.+)/intfCounterDir/(?P<intf>.+)/intfCounter"),
- Name: "intfCounter",
- Help: "Per-Interface Bytes/Errors/Discards Counters",
- devDesc: map[string]*prometheus.Desc{},
- desc: prometheus.NewDesc("intfCounter",
- "Per-Interface Bytes/Errors/Discards Counters",
- []string{"intf"}, prometheus.Labels{}),
- },
- {
- Path: "/Sysdb/environment/cooling/fan/speed/value",
- re: regexp.MustCompile("/Sysdb/environment/cooling/fan/speed/value"),
- Name: "fanSpeed",
- Help: "Fan Speed",
- devDesc: map[string]*prometheus.Desc{},
- desc: prometheus.NewDesc("fanSpeed", "Fan Speed", []string{},
- prometheus.Labels{}),
- },
- },
- },
- },
- }
- for i, c := range tCases {
- cfg, err := parseConfig(c.input)
- if err != nil {
- t.Errorf("Unexpected error in case %d: %v", i+1, err)
- continue
- }
- if !test.DeepEqual(*cfg, c.config) {
- t.Errorf("Test case %d: mismatch %v", i+1, test.Diff(*cfg, c.config))
- }
- }
- }
- func TestGetDescAndLabels(t *testing.T) {
- config := []byte(`
- devicelabels:
- 10.1.1.1:
- lab1: val1
- lab2: val2
- '*':
- lab1: val3
- lab2: val4
- subscriptions:
- - /Sysdb/environment/cooling/status
- - /Sysdb/environment/power/status
- metrics:
- - name: intfCounter
- path: /Sysdb/(lag|slice/phy/.+)/intfCounterDir/(?P<intf>.+)/intfCounter
- help: Per-Interface Bytes/Errors/Discards Counters
- - name: fanSpeed
- path: /Sysdb/environment/cooling/status/fan/speed/value
- help: Fan Speed`)
- cfg, err := parseConfig(config)
- if err != nil {
- t.Fatalf("Unexpected error: %v", err)
- }
- tCases := []struct {
- src source
- desc *prometheus.Desc
- labels []string
- }{
- {
- src: source{
- addr: "10.1.1.1",
- path: "/Sysdb/lag/intfCounterDir/Ethernet1/intfCounter",
- },
- desc: prometheus.NewDesc("intfCounter", "Per-Interface Bytes/Errors/Discards Counters",
- []string{"unnamedLabel1", "intf"},
- prometheus.Labels{"lab1": "val1", "lab2": "val2"}),
- labels: []string{"lag", "Ethernet1"},
- },
- {
- src: source{
- addr: "10.2.2.2",
- path: "/Sysdb/lag/intfCounterDir/Ethernet1/intfCounter",
- },
- desc: prometheus.NewDesc("intfCounter", "Per-Interface Bytes/Errors/Discards Counters",
- []string{"unnamedLabel1", "intf"},
- prometheus.Labels{"lab1": "val3", "lab2": "val4"}),
- labels: []string{"lag", "Ethernet1"},
- },
- {
- src: source{
- addr: "10.2.2.2",
- path: "/Sysdb/environment/cooling/status/fan/speed/value",
- },
- desc: prometheus.NewDesc("fanSpeed", "Fan Speed",
- []string{},
- prometheus.Labels{"lab1": "val3", "lab2": "val4"}),
- labels: []string{},
- },
- {
- src: source{
- addr: "10.2.2.2",
- path: "/Sysdb/environment/nonexistent",
- },
- desc: nil,
- labels: nil,
- },
- }
- for i, c := range tCases {
- desc, labels := cfg.getDescAndLabels(c.src)
- if !test.DeepEqual(desc, c.desc) {
- t.Errorf("Test case %d: desc mismatch %v", i+1, test.Diff(desc, c.desc))
- }
- if !test.DeepEqual(labels, c.labels) {
- t.Errorf("Test case %d: labels mismatch %v", i+1, test.Diff(labels, c.labels))
- }
- }
- }
- func TestGetAllDescs(t *testing.T) {
- tCases := []struct {
- config []byte
- descs []*prometheus.Desc
- }{
- {
- config: []byte(`
- devicelabels:
- 10.1.1.1:
- lab1: val1
- lab2: val2
- '*':
- lab1: val3
- lab2: val4
- subscriptions:
- - /Sysdb/environment/cooling/status
- - /Sysdb/environment/power/status
- metrics:
- - name: intfCounter
- path: /Sysdb/(lag|slice/phy/.+)/intfCounterDir/(?P<intf>.+)/intfCounter
- help: Per-Interface Bytes/Errors/Discards Counters
- - name: fanSpeed
- path: /Sysdb/environment/cooling/status/fan/speed/value
- help: Fan Speed`),
- descs: []*prometheus.Desc{
- prometheus.NewDesc("intfCounter", "Per-Interface Bytes/Errors/Discards Counters",
- []string{"unnamedLabel1", "intf"},
- prometheus.Labels{"lab1": "val3", "lab2": "val4"}),
- prometheus.NewDesc("intfCounter", "Per-Interface Bytes/Errors/Discards Counters",
- []string{"unnamedLabel1", "intf"},
- prometheus.Labels{"lab1": "val1", "lab2": "val2"}),
- prometheus.NewDesc("fanSpeed", "Fan Speed", []string{},
- prometheus.Labels{"lab1": "val3", "lab2": "val4"}),
- prometheus.NewDesc("fanSpeed", "Fan Speed", []string{},
- prometheus.Labels{"lab1": "val1", "lab2": "val2"}),
- },
- },
- {
- config: []byte(`
- devicelabels:
- 10.1.1.1:
- lab1: val1
- lab2: val2
- subscriptions:
- - /Sysdb/environment/cooling/status
- - /Sysdb/environment/power/status
- metrics:
- - name: intfCounter
- path: /Sysdb/(lag|slice/phy/.+)/intfCounterDir/(?P<intf>.+)/intfCounter
- help: Per-Interface Bytes/Errors/Discards Counters
- - name: fanSpeed
- path: /Sysdb/environment/cooling/status/fan/speed/value
- help: Fan Speed`),
- descs: []*prometheus.Desc{
- prometheus.NewDesc("intfCounter", "Per-Interface Bytes/Errors/Discards Counters",
- []string{"unnamedLabel1", "intf"},
- prometheus.Labels{"lab1": "val1", "lab2": "val2"}),
- prometheus.NewDesc("fanSpeed", "Fan Speed", []string{},
- prometheus.Labels{"lab1": "val1", "lab2": "val2"}),
- },
- },
- }
- for i, c := range tCases {
- cfg, err := parseConfig(c.config)
- if err != nil {
- t.Fatalf("Unexpected error: %v", err)
- }
- ch := make(chan *prometheus.Desc, 10)
- cfg.getAllDescs(ch)
- j := 0
- for d := range ch {
- if !test.DeepEqual(c.descs[j], d) {
- t.Errorf("Test case %d: desc %d mismatch %v", i+1, j+1, test.Diff(c.descs[j], d))
- }
- j++
- if j == len(c.descs) {
- break
- }
- }
- select {
- case <-ch:
- t.Errorf("Test case %d: too many descs", i+1)
- default:
- }
- }
- }
|