Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aos
GitHub Repository: aos/grafana-agent
Path: blob/main/pkg/cluster/gossip_test.go
4094 views
1
package cluster
2
3
import (
4
"fmt"
5
stdlog "log"
6
"net"
7
"os"
8
"strings"
9
"testing"
10
11
"github.com/hashicorp/go-discover"
12
"github.com/rfratto/ckit/advertise"
13
"github.com/stretchr/testify/require"
14
)
15
16
// NOTE(rfratto): we don't test methods against GossipNode that just shim to
17
// ckit, since we can rely on the existing ckit tests for correctness.
18
19
const examplePort = 8888
20
21
func TestConfig_ApplyDefaults(t *testing.T) {
22
ifaces, err := net.Interfaces()
23
require.NoError(t, err)
24
25
var advertiseInterfaces []string
26
for _, iface := range ifaces {
27
if iface.Flags != net.FlagLoopback {
28
advertiseInterfaces = append(advertiseInterfaces, iface.Name)
29
}
30
}
31
32
defaultConfig := DefaultGossipConfig
33
defaultConfig.AdvertiseInterfaces = advertiseInterfaces
34
35
setTestProviders(t, map[string]discover.Provider{
36
"static": &staticProvider{},
37
})
38
39
hostName, err := os.Hostname()
40
require.NoError(t, err, "failed to get hostname for test assertions")
41
42
t.Run("node name defaults to hostname", func(t *testing.T) {
43
gc := defaultConfig
44
gc.NodeName = ""
45
46
err := gc.ApplyDefaults(examplePort)
47
require.NoError(t, err)
48
require.Equal(t, hostName, gc.NodeName)
49
})
50
51
t.Run("node name can be overridden", func(t *testing.T) {
52
gc := defaultConfig
53
gc.NodeName = "foobar"
54
55
err := gc.ApplyDefaults(examplePort)
56
require.NoError(t, err)
57
require.Equal(t, "foobar", gc.NodeName)
58
})
59
60
t.Run("one of advertise addr or advertise interfaces must be set", func(t *testing.T) {
61
gc := defaultConfig
62
gc.AdvertiseInterfaces = nil
63
64
err := gc.ApplyDefaults(examplePort)
65
require.EqualError(t, err, "one of advertise address or advertise interfaces must be set")
66
})
67
68
t.Run("advertise address is inferred from advertise interfaces", func(t *testing.T) {
69
gc := defaultConfig
70
gc.AdvertiseInterfaces = advertiseInterfaces
71
72
err := gc.ApplyDefaults(examplePort)
73
require.NoError(t, err)
74
75
expect, err := advertise.FirstAddress(gc.AdvertiseInterfaces)
76
require.NoError(t, err)
77
require.Equal(t, fmt.Sprintf("%s:%d", expect, examplePort), gc.AdvertiseAddr)
78
})
79
80
t.Run("explicit advertise address can be set", func(t *testing.T) {
81
gc := defaultConfig
82
gc.AdvertiseAddr = "foobar:9999"
83
84
err := gc.ApplyDefaults(examplePort)
85
require.NoError(t, err)
86
require.Equal(t, "foobar:9999", gc.AdvertiseAddr)
87
})
88
89
t.Run("explicit advertise address can use default port", func(t *testing.T) {
90
gc := defaultConfig
91
gc.AdvertiseAddr = "foobar"
92
93
err := gc.ApplyDefaults(examplePort)
94
require.NoError(t, err)
95
require.Equal(t, fmt.Sprintf("foobar:%d", examplePort), gc.AdvertiseAddr)
96
})
97
98
t.Run("join peers and discover peers can't both be set", func(t *testing.T) {
99
gc := defaultConfig
100
gc.JoinPeers = []string{"foobar:9999"}
101
gc.DiscoverPeers = `provider=static addrs=fizzbuzz:5555`
102
103
err := gc.ApplyDefaults(examplePort)
104
require.EqualError(t, err, "at most one of join peers and discover peers may be set")
105
})
106
107
t.Run("explicit join peers can be set", func(t *testing.T) {
108
gc := defaultConfig
109
gc.JoinPeers = []string{"foobar:9999"}
110
111
err := gc.ApplyDefaults(examplePort)
112
require.NoError(t, err)
113
require.Equal(t, []string{"foobar:9999"}, []string(gc.JoinPeers))
114
})
115
116
t.Run("join peers can be discovered", func(t *testing.T) {
117
gc := defaultConfig
118
gc.DiscoverPeers = `provider=static addrs=fizzbuzz:5555`
119
120
err := gc.ApplyDefaults(examplePort)
121
require.NoError(t, err)
122
require.Equal(t, []string{"fizzbuzz:5555"}, []string(gc.JoinPeers))
123
})
124
125
t.Run("peers can use default port", func(t *testing.T) {
126
gc := defaultConfig
127
gc.JoinPeers = []string{"foobar"}
128
129
err := gc.ApplyDefaults(examplePort)
130
require.NoError(t, err)
131
require.Equal(t, []string{fmt.Sprintf("foobar:%d", examplePort)}, []string(gc.JoinPeers))
132
})
133
134
t.Run("discovered peers can use default port", func(t *testing.T) {
135
gc := defaultConfig
136
gc.DiscoverPeers = `provider=static addrs=fizzbuzz`
137
138
err := gc.ApplyDefaults(examplePort)
139
require.NoError(t, err)
140
require.Equal(t, []string{fmt.Sprintf("fizzbuzz:%d", examplePort)}, []string(gc.JoinPeers))
141
})
142
}
143
144
func setTestProviders(t *testing.T, set map[string]discover.Provider) {
145
t.Helper()
146
147
restore := extraDiscoverProviders
148
t.Cleanup(func() {
149
extraDiscoverProviders = restore
150
})
151
extraDiscoverProviders = set
152
}
153
154
type staticProvider struct{}
155
156
var _ discover.Provider = (*staticProvider)(nil)
157
158
func (sp *staticProvider) Addrs(args map[string]string, l *stdlog.Logger) ([]string, error) {
159
if args["provider"] != "static" {
160
return nil, fmt.Errorf("discover-static: invalid provider " + args["provider"])
161
}
162
if rawSet, ok := args["addrs"]; ok {
163
return strings.Split(rawSet, ","), nil
164
}
165
return nil, nil
166
}
167
168
func (sp *staticProvider) Help() string {
169
return `static:
170
171
provider: "static"
172
addrs: Comma-separated list of addresses to return`
173
}
174
175