master
go 161 lines 4.1 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package dockersd
4
5 import (
6 "testing"
7 "time"
8
9 typesContainer "github.com/docker/docker/api/types/container"
10
11 "github.com/netdata/netdata/go/plugins/plugin/agent/discovery/sd/model"
12
13 typesNetwork "github.com/docker/docker/api/types/network"
14 )
15
16 func TestDiscoverer_Discover(t *testing.T) {
17 tests := map[string]struct {
18 createSim func() *discoverySim
19 }{
20 "add containers": {
21 createSim: func() *discoverySim {
22 nginx1 := prepareNginxContainer("nginx1")
23 nginx2 := prepareNginxContainer("nginx2")
24
25 sim := &discoverySim{
26 dockerCli: func(cli dockerCli, _ time.Duration) {
27 cli.addContainer(nginx1)
28 cli.addContainer(nginx2)
29 },
30 wantGroups: []model.TargetGroup{
31 &targetGroup{
32 source: cntrSource(nginx1),
33 targets: []model.Target{
34 withHash(&target{
35 ID: nginx1.ID,
36 Name: nginx1.Names[0][1:],
37 Image: nginx1.Image,
38 Command: nginx1.Command,
39 Labels: model.MapAny(nginx1.Labels),
40 PrivatePort: "80",
41 PublicPort: "8080",
42 PublicPortIP: "0.0.0.0",
43 PortProtocol: "tcp",
44 NetworkMode: "default",
45 NetworkDriver: "bridge",
46 IPAddress: "192.0.2.0",
47 Address: "192.0.2.0:80",
48 }),
49 },
50 },
51 &targetGroup{
52 source: cntrSource(nginx2),
53 targets: []model.Target{
54 withHash(&target{
55 ID: nginx2.ID,
56 Name: nginx2.Names[0][1:],
57 Image: nginx2.Image,
58 Command: nginx2.Command,
59 Labels: model.MapAny(nginx2.Labels),
60 PrivatePort: "80",
61 PublicPort: "8080",
62 PublicPortIP: "0.0.0.0",
63 PortProtocol: "tcp",
64 NetworkMode: "default",
65 NetworkDriver: "bridge",
66 IPAddress: "192.0.2.0",
67 Address: "192.0.2.0:80",
68 }),
69 },
70 },
71 },
72 }
73 return sim
74 },
75 },
76 "remove containers": {
77 createSim: func() *discoverySim {
78 nginx1 := prepareNginxContainer("nginx1")
79 nginx2 := prepareNginxContainer("nginx2")
80
81 sim := &discoverySim{
82 dockerCli: func(cli dockerCli, interval time.Duration) {
83 cli.addContainer(nginx1)
84 cli.addContainer(nginx2)
85 time.Sleep(interval * 2)
86 cli.removeContainer(nginx1.ID)
87 },
88 wantGroups: []model.TargetGroup{
89 &targetGroup{
90 source: cntrSource(nginx1),
91 targets: nil,
92 },
93 &targetGroup{
94 source: cntrSource(nginx2),
95 targets: []model.Target{
96 withHash(&target{
97 ID: nginx2.ID,
98 Name: nginx2.Names[0][1:],
99 Image: nginx2.Image,
100 Command: nginx2.Command,
101 Labels: model.MapAny(nginx2.Labels),
102 PrivatePort: "80",
103 PublicPort: "8080",
104 PublicPortIP: "0.0.0.0",
105 PortProtocol: "tcp",
106 NetworkMode: "default",
107 NetworkDriver: "bridge",
108 IPAddress: "192.0.2.0",
109 Address: "192.0.2.0:80",
110 }),
111 },
112 },
113 },
114 }
115 return sim
116 },
117 },
118 }
119
120 for name, test := range tests {
121 t.Run(name, func(t *testing.T) {
122 sim := test.createSim()
123 sim.run(t)
124 })
125 }
126 }
127
128 func prepareNginxContainer(name string) typesContainer.Summary {
129 return typesContainer.Summary{
130 ID: "id-" + name,
131 Names: []string{"/" + name},
132 Image: "nginx-image",
133 ImageID: "nginx-image-id",
134 Command: "nginx-command",
135 Ports: []typesContainer.Port{
136 {
137 IP: "0.0.0.0",
138 PrivatePort: 80,
139 PublicPort: 8080,
140 Type: "tcp",
141 },
142 },
143 Labels: map[string]string{"key1": "value1"},
144 HostConfig: struct {
145 NetworkMode string `json:",omitempty"`
146 Annotations map[string]string `json:",omitempty"`
147 }{
148 NetworkMode: "default",
149 },
150 NetworkSettings: &typesContainer.NetworkSettingsSummary{
151 Networks: map[string]*typesNetwork.EndpointSettings{
152 "bridge": {IPAddress: "192.0.2.0"},
153 },
154 },
155 }
156 }
157
158 func withHash(tgt *target) *target {
159 tgt.hash, _ = model.CalcHash(tgt)
160 return tgt
161 }