2017-04-10 18:54:12 +02:00
|
|
|
package influxdb
|
2017-01-20 23:23:31 +01:00
|
|
|
|
|
|
|
import (
|
|
|
|
"testing"
|
|
|
|
|
2019-01-15 20:19:55 +01:00
|
|
|
"github.com/influxdata/influxdb1-client/v2"
|
2017-01-20 23:23:31 +01:00
|
|
|
"github.com/stretchr/testify/assert"
|
2017-03-03 16:19:35 +01:00
|
|
|
|
|
|
|
"github.com/FreifunkBremen/yanic/data"
|
2017-04-10 18:54:12 +02:00
|
|
|
"github.com/FreifunkBremen/yanic/runtime"
|
2017-01-20 23:23:31 +01:00
|
|
|
)
|
|
|
|
|
|
|
|
func TestToInflux(t *testing.T) {
|
|
|
|
assert := assert.New(t)
|
|
|
|
|
2017-04-10 18:54:12 +02:00
|
|
|
node := &runtime.Node{
|
2024-07-20 00:31:16 +02:00
|
|
|
Online: true,
|
2017-01-20 23:23:31 +01:00
|
|
|
Statistics: &data.Statistics{
|
2017-09-27 13:55:02 +02:00
|
|
|
NodeID: "deadbeef",
|
2017-01-20 23:23:31 +01:00
|
|
|
LoadAverage: 0.5,
|
2018-05-06 00:11:01 +02:00
|
|
|
ProcStats: &data.ProcStats{
|
|
|
|
CPU: data.ProcStatsCPU{
|
|
|
|
User: 1,
|
|
|
|
},
|
|
|
|
ContextSwitches: 3,
|
|
|
|
},
|
2017-01-20 23:23:31 +01:00
|
|
|
Wireless: data.WirelessStatistics{
|
|
|
|
&data.WirelessAirtime{Frequency: 5500},
|
|
|
|
},
|
|
|
|
Traffic: struct {
|
|
|
|
Tx *data.Traffic `json:"tx"`
|
|
|
|
Rx *data.Traffic `json:"rx"`
|
|
|
|
Forward *data.Traffic `json:"forward"`
|
|
|
|
MgmtTx *data.Traffic `json:"mgmt_tx"`
|
|
|
|
MgmtRx *data.Traffic `json:"mgmt_rx"`
|
|
|
|
}{
|
|
|
|
Tx: &data.Traffic{Dropped: 1321},
|
|
|
|
Rx: &data.Traffic{Bytes: 1213},
|
|
|
|
Forward: &data.Traffic{Bytes: 1322},
|
|
|
|
MgmtTx: &data.Traffic{Packets: 2327},
|
|
|
|
MgmtRx: &data.Traffic{Bytes: 2331},
|
|
|
|
},
|
|
|
|
},
|
2019-01-24 02:56:13 +01:00
|
|
|
Nodeinfo: &data.Nodeinfo{
|
2017-09-27 13:55:02 +02:00
|
|
|
NodeID: "deadbeef",
|
2017-01-20 23:23:31 +01:00
|
|
|
Owner: &data.Owner{
|
|
|
|
Contact: "nobody",
|
|
|
|
},
|
2017-11-20 12:22:52 +01:00
|
|
|
System: data.System{
|
2018-01-17 20:20:35 +01:00
|
|
|
SiteCode: "ffhb",
|
|
|
|
DomainCode: "city",
|
2017-11-20 12:22:52 +01:00
|
|
|
},
|
2017-01-20 23:23:31 +01:00
|
|
|
Wireless: &data.Wireless{
|
|
|
|
TxPower24: 3,
|
|
|
|
Channel24: 4,
|
|
|
|
},
|
2017-09-27 13:55:02 +02:00
|
|
|
Network: data.Network{
|
|
|
|
Mac: "DEADMAC",
|
2019-05-28 19:27:48 +02:00
|
|
|
Mesh: map[string]*data.NetworkInterface{
|
|
|
|
"bat0": {
|
|
|
|
Interfaces: struct {
|
|
|
|
Wireless []string `json:"wireless,omitempty"`
|
|
|
|
Other []string `json:"other,omitempty"`
|
|
|
|
Tunnel []string `json:"tunnel,omitempty"`
|
|
|
|
}{
|
|
|
|
Tunnel: []string{"a-interface-mac", "fe80::1"},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
2017-09-27 13:55:02 +02:00
|
|
|
},
|
2017-11-14 19:33:50 +01:00
|
|
|
Software: data.Software{
|
2021-02-17 23:35:12 +01:00
|
|
|
Autoupdater: &struct {
|
2017-11-14 19:33:50 +01:00
|
|
|
Enabled bool `json:"enabled,omitempty"`
|
|
|
|
Branch string `json:"branch,omitempty"`
|
|
|
|
}{
|
|
|
|
Enabled: true,
|
|
|
|
Branch: "testing",
|
|
|
|
},
|
|
|
|
},
|
2017-01-20 23:23:31 +01:00
|
|
|
},
|
|
|
|
Neighbours: &data.Neighbours{
|
2017-09-27 13:55:02 +02:00
|
|
|
NodeID: "deadbeef",
|
2017-01-20 23:23:31 +01:00
|
|
|
Batadv: map[string]data.BatadvNeighbours{
|
2019-05-28 19:27:48 +02:00
|
|
|
"a-interface-mac": {
|
2017-01-20 23:23:31 +01:00
|
|
|
Neighbours: map[string]data.BatmanLink{
|
2018-01-13 16:40:23 +01:00
|
|
|
"BAFF1E5": {
|
2023-09-18 19:56:18 +02:00
|
|
|
TQ: 204,
|
2017-09-27 13:55:02 +02:00
|
|
|
},
|
2017-01-20 23:23:31 +01:00
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
2019-05-28 19:27:48 +02:00
|
|
|
Babel: map[string]data.BabelNeighbours{
|
|
|
|
"wg-01": {
|
|
|
|
LinkLocalAddress: "fe80::1",
|
|
|
|
Neighbours: map[string]data.BabelLink{
|
|
|
|
"fe80::2": {
|
|
|
|
Cost: 0,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
2022-07-09 20:20:48 +02:00
|
|
|
LLDP: map[string][]string{
|
2019-05-28 19:27:48 +02:00
|
|
|
"b-interface-mac": {},
|
2017-12-31 05:26:17 +01:00
|
|
|
},
|
2017-01-20 23:23:31 +01:00
|
|
|
},
|
|
|
|
}
|
|
|
|
|
2018-01-13 16:54:48 +01:00
|
|
|
neighbour := &runtime.Node{
|
2024-07-20 00:31:16 +02:00
|
|
|
Online: true,
|
2019-01-24 02:56:13 +01:00
|
|
|
Nodeinfo: &data.Nodeinfo{
|
2017-09-27 13:55:02 +02:00
|
|
|
NodeID: "foobar",
|
|
|
|
Network: data.Network{
|
|
|
|
Mac: "BAFF1E5",
|
|
|
|
},
|
2017-11-14 19:33:50 +01:00
|
|
|
Software: data.Software{
|
2021-02-17 23:35:12 +01:00
|
|
|
Autoupdater: &struct {
|
2017-11-14 19:33:50 +01:00
|
|
|
Enabled bool `json:"enabled,omitempty"`
|
|
|
|
Branch string `json:"branch,omitempty"`
|
|
|
|
}{
|
|
|
|
Enabled: false,
|
|
|
|
},
|
2021-02-17 23:35:12 +01:00
|
|
|
Firmware: &struct {
|
|
|
|
Base string `json:"base,omitempty"`
|
|
|
|
Release string `json:"release,omitempty"`
|
|
|
|
}{
|
|
|
|
Base: "gluon",
|
|
|
|
},
|
2017-11-14 19:33:50 +01:00
|
|
|
},
|
|
|
|
},
|
|
|
|
Statistics: &data.Statistics{
|
|
|
|
NodeID: "foobar",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
// do not add a empty statistics of a node
|
|
|
|
droppednode := &runtime.Node{
|
2024-07-20 00:31:16 +02:00
|
|
|
Online: true,
|
2019-01-24 02:56:13 +01:00
|
|
|
Nodeinfo: &data.Nodeinfo{
|
2017-11-14 19:33:50 +01:00
|
|
|
NodeID: "notfound",
|
|
|
|
Network: data.Network{
|
|
|
|
Mac: "instats",
|
|
|
|
},
|
2017-09-27 13:55:02 +02:00
|
|
|
},
|
|
|
|
Statistics: &data.Statistics{},
|
|
|
|
}
|
|
|
|
|
2018-01-13 16:54:48 +01:00
|
|
|
points := testPoints(node, neighbour, droppednode)
|
2017-09-27 13:55:02 +02:00
|
|
|
var fields map[string]interface{}
|
|
|
|
var tags map[string]string
|
|
|
|
|
2017-11-14 19:33:50 +01:00
|
|
|
assert.Len(points, 3)
|
2017-09-27 13:55:02 +02:00
|
|
|
|
|
|
|
// first point contains the neighbour
|
|
|
|
sPoint := points[0]
|
|
|
|
tags = sPoint.Tags()
|
|
|
|
fields, _ = sPoint.Fields()
|
|
|
|
|
|
|
|
assert.EqualValues("deadbeef", tags["nodeid"])
|
|
|
|
assert.EqualValues("nobody", tags["owner"])
|
2017-11-14 19:33:50 +01:00
|
|
|
assert.EqualValues("testing", tags["autoupdater"])
|
2018-01-17 20:20:35 +01:00
|
|
|
assert.EqualValues("ffhb", tags["site"])
|
|
|
|
assert.EqualValues("city", tags["domain"])
|
2017-09-27 13:55:02 +02:00
|
|
|
assert.EqualValues(0.5, fields["load"])
|
|
|
|
assert.EqualValues(0, fields["neighbours.lldp"])
|
2019-05-28 19:27:48 +02:00
|
|
|
assert.EqualValues(1, fields["neighbours.babel"])
|
2017-09-27 13:55:02 +02:00
|
|
|
assert.EqualValues(1, fields["neighbours.batadv"])
|
2019-05-28 19:27:48 +02:00
|
|
|
assert.EqualValues(2, fields["neighbours.vpn"])
|
|
|
|
assert.EqualValues(2, fields["neighbours.total"])
|
2017-09-27 13:55:02 +02:00
|
|
|
|
|
|
|
assert.EqualValues(uint32(3), fields["wireless.txpower24"])
|
|
|
|
assert.EqualValues(uint32(5500), fields["airtime11a.frequency"])
|
|
|
|
assert.EqualValues("", tags["frequency5500"])
|
|
|
|
|
|
|
|
assert.EqualValues(int64(1213), fields["traffic.rx.bytes"])
|
|
|
|
assert.EqualValues(float64(1321), fields["traffic.tx.dropped"])
|
|
|
|
assert.EqualValues(int64(1322), fields["traffic.forward.bytes"])
|
|
|
|
assert.EqualValues(int64(2331), fields["traffic.mgmt_rx.bytes"])
|
|
|
|
assert.EqualValues(float64(2327), fields["traffic.mgmt_tx.packets"])
|
|
|
|
|
2017-11-14 19:33:50 +01:00
|
|
|
// second point contains the link
|
2017-09-27 13:55:02 +02:00
|
|
|
nPoint := points[1]
|
|
|
|
tags = nPoint.Tags()
|
|
|
|
fields, _ = nPoint.Fields()
|
|
|
|
assert.EqualValues("link", nPoint.Name())
|
|
|
|
assert.EqualValues(map[string]string{
|
2017-12-05 23:17:49 +01:00
|
|
|
"source.id": "deadbeef",
|
2019-05-28 19:27:48 +02:00
|
|
|
"source.addr": "a-interface-mac",
|
2017-12-05 23:17:49 +01:00
|
|
|
"target.id": "foobar",
|
|
|
|
"target.addr": "BAFF1E5",
|
2024-07-20 00:33:16 +02:00
|
|
|
"type": "vpn",
|
2017-09-27 13:55:02 +02:00
|
|
|
}, tags)
|
|
|
|
assert.EqualValues(80, fields["tq"])
|
2017-11-14 19:33:50 +01:00
|
|
|
|
|
|
|
// third point contains the neighbour
|
|
|
|
nPoint = points[2]
|
|
|
|
tags = nPoint.Tags()
|
|
|
|
assert.EqualValues("disabled", tags["autoupdater"])
|
2017-09-27 13:55:02 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
// Processes data and returns the InfluxDB points
|
|
|
|
func testPoints(nodes ...*runtime.Node) (points []*client.Point) {
|
|
|
|
// Create dummy client
|
|
|
|
influxClient, err := client.NewHTTPClient(client.HTTPConfig{Addr: "http://127.0.0.1"})
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
|
2018-01-07 21:00:56 +01:00
|
|
|
nodesList := runtime.NewNodes(&runtime.NodesConfig{})
|
2017-09-27 13:55:02 +02:00
|
|
|
|
|
|
|
// Create dummy connection
|
|
|
|
conn := &Connection{
|
|
|
|
points: make(chan *client.Point),
|
|
|
|
client: influxClient,
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, node := range nodes {
|
2017-05-20 14:46:29 +02:00
|
|
|
nodesList.AddNode(node)
|
2017-09-27 13:55:02 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
// Process data
|
|
|
|
go func() {
|
|
|
|
for _, node := range nodes {
|
|
|
|
conn.InsertNode(node)
|
|
|
|
if node.Neighbours != nil {
|
|
|
|
for _, link := range nodesList.NodeLinks(node) {
|
|
|
|
conn.InsertLink(&link, node.Lastseen.GetTime())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
conn.Close()
|
|
|
|
}()
|
|
|
|
|
|
|
|
// Read points
|
|
|
|
for point := range conn.points {
|
|
|
|
points = append(points, point)
|
|
|
|
}
|
|
|
|
|
|
|
|
return
|
2017-01-20 23:23:31 +01:00
|
|
|
}
|