master
go 374 lines 20.5 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package scaleio
4
5 import (
6 "context"
7 "encoding/json"
8 "net/http/httptest"
9 "os"
10 "testing"
11
12 "github.com/netdata/netdata/go/plugins/plugin/go.d/collector/scaleio/client"
13 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/collecttest"
14
15 "github.com/stretchr/testify/assert"
16 "github.com/stretchr/testify/require"
17 )
18
19 var (
20 dataConfigJSON, _ = os.ReadFile("testdata/config.json")
21 dataConfigYAML, _ = os.ReadFile("testdata/config.yaml")
22
23 dataSelectedStatistics, _ = os.ReadFile("testdata/selected_statistics.json")
24 dataInstances, _ = os.ReadFile("testdata/instances.json")
25 )
26
27 func Test_testDataIsValid(t *testing.T) {
28 for name, data := range map[string][]byte{
29 "dataConfigJSON": dataConfigJSON,
30 "dataConfigYAML": dataConfigYAML,
31 "dataSelectedStatistics": dataSelectedStatistics,
32 "dataInstances": dataInstances,
33 } {
34 require.NotNil(t, data, name)
35 }
36 }
37
38 func TestCollector_ConfigurationSerialize(t *testing.T) {
39 collecttest.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
40 }
41
42 func TestCollector_Init(t *testing.T) {
43 collr := New()
44 collr.Username = "username"
45 collr.Password = "password"
46
47 assert.NoError(t, collr.Init(context.Background()))
48 }
49 func TestCollector_Init_UsernameAndPasswordNotSet(t *testing.T) {
50 assert.Error(t, New().Init(context.Background()))
51 }
52
53 func TestCollector_Init_ErrorOnCreatingClientWrongTLSCA(t *testing.T) {
54 collr := New()
55 collr.Username = "username"
56 collr.Password = "password"
57 collr.ClientConfig.TLSConfig.TLSCA = "testdata/tls"
58
59 assert.Error(t, collr.Init(context.Background()))
60 }
61
62 func TestCollector_Check(t *testing.T) {
63 srv, _, collr := prepareSrvMockScaleIO(t)
64 defer srv.Close()
65 require.NoError(t, collr.Init(context.Background()))
66
67 assert.NoError(t, collr.Check(context.Background()))
68 }
69
70 func TestCollector_Check_ErrorOnLogin(t *testing.T) {
71 srv, mock, collr := prepareSrvMockScaleIO(t)
72 defer srv.Close()
73 require.NoError(t, collr.Init(context.Background()))
74 mock.Password = "new password"
75
76 assert.Error(t, collr.Check(context.Background()))
77 }
78
79 func TestCollector_Charts(t *testing.T) {
80 assert.NotNil(t, New().Charts())
81 }
82
83 func TestCollector_Cleanup(t *testing.T) {
84 srv, _, collr := prepareSrvMockScaleIO(t)
85 defer srv.Close()
86 require.NoError(t, collr.Init(context.Background()))
87 require.NoError(t, collr.Check(context.Background()))
88
89 collr.Cleanup(context.Background())
90 assert.False(t, collr.client.LoggedIn())
91 }
92
93 func TestCollector_Collect(t *testing.T) {
94 srv, _, collr := prepareSrvMockScaleIO(t)
95 defer srv.Close()
96 require.NoError(t, collr.Init(context.Background()))
97 require.NoError(t, collr.Check(context.Background()))
98
99 expected := map[string]int64{
100 "sdc_6076fd0f00000000_bandwidth_read": 0,
101 "sdc_6076fd0f00000000_bandwidth_read_write": 0,
102 "sdc_6076fd0f00000000_bandwidth_write": 0,
103 "sdc_6076fd0f00000000_io_size_read": 0,
104 "sdc_6076fd0f00000000_io_size_read_write": 0,
105 "sdc_6076fd0f00000000_io_size_write": 0,
106 "sdc_6076fd0f00000000_iops_read": 0,
107 "sdc_6076fd0f00000000_iops_read_write": 0,
108 "sdc_6076fd0f00000000_iops_write": 0,
109 "sdc_6076fd0f00000000_mdm_connection_state": 1,
110 "sdc_6076fd0f00000000_num_of_mapped_volumes": 1,
111 "sdc_6076fd1000000001_bandwidth_read": 1000,
112 "sdc_6076fd1000000001_bandwidth_read_write": 117400000,
113 "sdc_6076fd1000000001_bandwidth_write": 117399000,
114 "sdc_6076fd1000000001_io_size_read": 1000,
115 "sdc_6076fd1000000001_io_size_read_write": 695668,
116 "sdc_6076fd1000000001_io_size_write": 694668,
117 "sdc_6076fd1000000001_iops_read": 1000,
118 "sdc_6076fd1000000001_iops_read_write": 170000,
119 "sdc_6076fd1000000001_iops_write": 169000,
120 "sdc_6076fd1000000001_mdm_connection_state": 0,
121 "sdc_6076fd1000000001_num_of_mapped_volumes": 1,
122 "sdc_6076fd1100000002_bandwidth_read": 0,
123 "sdc_6076fd1100000002_bandwidth_read_write": 118972000,
124 "sdc_6076fd1100000002_bandwidth_write": 118972000,
125 "sdc_6076fd1100000002_io_size_read": 0,
126 "sdc_6076fd1100000002_io_size_read_write": 820496,
127 "sdc_6076fd1100000002_io_size_write": 820496,
128 "sdc_6076fd1100000002_iops_read": 0,
129 "sdc_6076fd1100000002_iops_read_write": 145000,
130 "sdc_6076fd1100000002_iops_write": 145000,
131 "sdc_6076fd1100000002_mdm_connection_state": 0,
132 "sdc_6076fd1100000002_num_of_mapped_volumes": 1,
133 "storage_pool_40395b7b00000000_capacity_alert_critical_threshold": 90,
134 "storage_pool_40395b7b00000000_capacity_alert_high_threshold": 80,
135 "storage_pool_40395b7b00000000_capacity_available_for_volume_allocation": 100663296,
136 "storage_pool_40395b7b00000000_capacity_decreased": 0,
137 "storage_pool_40395b7b00000000_capacity_degraded": 0,
138 "storage_pool_40395b7b00000000_capacity_failed": 0,
139 "storage_pool_40395b7b00000000_capacity_in_maintenance": 0,
140 "storage_pool_40395b7b00000000_capacity_in_use": 50110464,
141 "storage_pool_40395b7b00000000_capacity_max_capacity": 311424000,
142 "storage_pool_40395b7b00000000_capacity_protected": 50110464,
143 "storage_pool_40395b7b00000000_capacity_snapshot": 749568,
144 "storage_pool_40395b7b00000000_capacity_spare": 31141888,
145 "storage_pool_40395b7b00000000_capacity_thick_in_use": 0,
146 "storage_pool_40395b7b00000000_capacity_thin_in_use": 49360896,
147 "storage_pool_40395b7b00000000_capacity_unreachable_unused": 0,
148 "storage_pool_40395b7b00000000_capacity_unused": 229422080,
149 "storage_pool_40395b7b00000000_capacity_utilization": 1787,
150 "storage_pool_40395b7b00000000_num_of_devices": 3,
151 "storage_pool_40395b7b00000000_num_of_snapshots": 1,
152 "storage_pool_40395b7b00000000_num_of_volumes": 3,
153 "storage_pool_40395b7b00000000_num_of_vtrees": 2,
154 "storage_pool_4039828b00000001_capacity_alert_critical_threshold": 90,
155 "storage_pool_4039828b00000001_capacity_alert_high_threshold": 80,
156 "storage_pool_4039828b00000001_capacity_available_for_volume_allocation": 142606336,
157 "storage_pool_4039828b00000001_capacity_decreased": 0,
158 "storage_pool_4039828b00000001_capacity_degraded": 0,
159 "storage_pool_4039828b00000001_capacity_failed": 0,
160 "storage_pool_4039828b00000001_capacity_in_maintenance": 0,
161 "storage_pool_4039828b00000001_capacity_in_use": 0,
162 "storage_pool_4039828b00000001_capacity_max_capacity": 332395520,
163 "storage_pool_4039828b00000001_capacity_protected": 0,
164 "storage_pool_4039828b00000001_capacity_snapshot": 0,
165 "storage_pool_4039828b00000001_capacity_spare": 33239040,
166 "storage_pool_4039828b00000001_capacity_thick_in_use": 0,
167 "storage_pool_4039828b00000001_capacity_thin_in_use": 0,
168 "storage_pool_4039828b00000001_capacity_unreachable_unused": 0,
169 "storage_pool_4039828b00000001_capacity_unused": 299156480,
170 "storage_pool_4039828b00000001_capacity_utilization": 0,
171 "storage_pool_4039828b00000001_num_of_devices": 3,
172 "storage_pool_4039828b00000001_num_of_snapshots": 0,
173 "storage_pool_4039828b00000001_num_of_volumes": 0,
174 "storage_pool_4039828b00000001_num_of_vtrees": 0,
175 "system_backend_primary_bandwidth_read": 800,
176 "system_backend_primary_bandwidth_read_write": 238682400,
177 "system_backend_primary_bandwidth_write": 238681600,
178 "system_backend_primary_io_size_read": 4000,
179 "system_backend_primary_io_size_read_write": 770971,
180 "system_backend_primary_io_size_write": 766971,
181 "system_backend_primary_iops_read": 200,
182 "system_backend_primary_iops_read_write": 311400,
183 "system_backend_primary_iops_write": 311200,
184 "system_backend_secondary_bandwidth_read": 0,
185 "system_backend_secondary_bandwidth_read_write": 233926400,
186 "system_backend_secondary_bandwidth_write": 233926400,
187 "system_backend_secondary_io_size_read": 0,
188 "system_backend_secondary_io_size_read_write": 764465,
189 "system_backend_secondary_io_size_write": 764465,
190 "system_backend_secondary_iops_read": 0,
191 "system_backend_secondary_iops_read_write": 306000,
192 "system_backend_secondary_iops_write": 306000,
193 "system_backend_total_bandwidth_read": 800,
194 "system_backend_total_bandwidth_read_write": 472608800,
195 "system_backend_total_bandwidth_write": 472608000,
196 "system_backend_total_io_size_read": 4000,
197 "system_backend_total_io_size_read_write": 1535437,
198 "system_backend_total_io_size_write": 1531437,
199 "system_backend_total_iops_read": 200,
200 "system_backend_total_iops_read_write": 617400,
201 "system_backend_total_iops_write": 617200,
202 "system_capacity_available_for_volume_allocation": 243269632,
203 "system_capacity_decreased": 0,
204 "system_capacity_degraded": 0,
205 "system_capacity_failed": 0,
206 "system_capacity_in_maintenance": 0,
207 "system_capacity_in_use": 50110464,
208 "system_capacity_max_capacity": 643819520,
209 "system_capacity_protected": 50110464,
210 "system_capacity_snapshot": 749568,
211 "system_capacity_spare": 64380928,
212 "system_capacity_thick_in_use": 0,
213 "system_capacity_thin_in_use": 49360896,
214 "system_capacity_unreachable_unused": 0,
215 "system_capacity_unused": 528578560,
216 "system_frontend_user_data_bandwidth_read": 0,
217 "system_frontend_user_data_bandwidth_read_write": 227170000,
218 "system_frontend_user_data_bandwidth_write": 227170000,
219 "system_frontend_user_data_io_size_read": 0,
220 "system_frontend_user_data_io_size_read_write": 797087,
221 "system_frontend_user_data_io_size_write": 797087,
222 "system_frontend_user_data_iops_read": 0,
223 "system_frontend_user_data_iops_read_write": 285000,
224 "system_frontend_user_data_iops_write": 285000,
225 "system_num_of_devices": 6,
226 "system_num_of_fault_sets": 0,
227 "system_num_of_mapped_to_all_volumes": 0,
228 "system_num_of_mapped_volumes": 3,
229 "system_num_of_protection_domains": 1,
230 "system_num_of_rfcache_devices": 0,
231 "system_num_of_sdc": 3,
232 "system_num_of_sds": 3,
233 "system_num_of_snapshots": 1,
234 "system_num_of_storage_pools": 2,
235 "system_num_of_thick_base_volumes": 0,
236 "system_num_of_thin_base_volumes": 2,
237 "system_num_of_unmapped_volumes": 0,
238 "system_num_of_volumes": 3,
239 "system_num_of_vtrees": 2,
240 "system_rebalance_bandwidth_read": 0,
241 "system_rebalance_bandwidth_read_write": 0,
242 "system_rebalance_bandwidth_write": 0,
243 "system_rebalance_io_size_read": 0,
244 "system_rebalance_io_size_read_write": 0,
245 "system_rebalance_io_size_write": 0,
246 "system_rebalance_iops_read": 0,
247 "system_rebalance_iops_read_write": 0,
248 "system_rebalance_iops_write": 0,
249 "system_rebalance_pending_capacity_in_Kb": 0,
250 "system_rebalance_time_until_finish": 0,
251 "system_rebuild_backward_bandwidth_read": 0,
252 "system_rebuild_backward_bandwidth_read_write": 0,
253 "system_rebuild_backward_bandwidth_write": 0,
254 "system_rebuild_backward_io_size_read": 0,
255 "system_rebuild_backward_io_size_read_write": 0,
256 "system_rebuild_backward_io_size_write": 0,
257 "system_rebuild_backward_iops_read": 0,
258 "system_rebuild_backward_iops_read_write": 0,
259 "system_rebuild_backward_iops_write": 0,
260 "system_rebuild_backward_pending_capacity_in_Kb": 0,
261 "system_rebuild_forward_bandwidth_read": 0,
262 "system_rebuild_forward_bandwidth_read_write": 0,
263 "system_rebuild_forward_bandwidth_write": 0,
264 "system_rebuild_forward_io_size_read": 0,
265 "system_rebuild_forward_io_size_read_write": 0,
266 "system_rebuild_forward_io_size_write": 0,
267 "system_rebuild_forward_iops_read": 0,
268 "system_rebuild_forward_iops_read_write": 0,
269 "system_rebuild_forward_iops_write": 0,
270 "system_rebuild_forward_pending_capacity_in_Kb": 0,
271 "system_rebuild_normal_bandwidth_read": 0,
272 "system_rebuild_normal_bandwidth_read_write": 0,
273 "system_rebuild_normal_bandwidth_write": 0,
274 "system_rebuild_normal_io_size_read": 0,
275 "system_rebuild_normal_io_size_read_write": 0,
276 "system_rebuild_normal_io_size_write": 0,
277 "system_rebuild_normal_iops_read": 0,
278 "system_rebuild_normal_iops_read_write": 0,
279 "system_rebuild_normal_iops_write": 0,
280 "system_rebuild_normal_pending_capacity_in_Kb": 0,
281 "system_rebuild_total_bandwidth_read": 0,
282 "system_rebuild_total_bandwidth_read_write": 0,
283 "system_rebuild_total_bandwidth_write": 0,
284 "system_rebuild_total_io_size_read": 0,
285 "system_rebuild_total_io_size_read_write": 0,
286 "system_rebuild_total_io_size_write": 0,
287 "system_rebuild_total_iops_read": 0,
288 "system_rebuild_total_iops_read_write": 0,
289 "system_rebuild_total_iops_write": 0,
290 "system_rebuild_total_pending_capacity_in_Kb": 0,
291 "system_total_bandwidth_read": 800,
292 "system_total_bandwidth_read_write": 472608800,
293 "system_total_bandwidth_write": 472608000,
294 "system_total_io_size_read": 4000,
295 "system_total_io_size_read_write": 769729,
296 "system_total_io_size_write": 765729,
297 "system_total_iops_read": 200,
298 "system_total_iops_read_write": 617400,
299 "system_total_iops_write": 617200,
300 }
301
302 mx := collr.Collect(context.Background())
303
304 assert.Equal(t, expected, mx)
305
306 testCharts(t, collr, mx)
307 }
308
309 func TestCollector_Collect_ConnectionRefused(t *testing.T) {
310 srv, _, collr := prepareSrvMockScaleIO(t)
311 defer srv.Close()
312 require.NoError(t, collr.Init(context.Background()))
313 require.NoError(t, collr.Check(context.Background()))
314 collr.client.Request.URL = "http://127.0.0.1:38001"
315
316 assert.Nil(t, collr.Collect(context.Background()))
317 }
318
319 func testCharts(t *testing.T, collr *Collector, collected map[string]int64) {
320 t.Helper()
321 ensureStoragePoolChartsAreCreated(t, collr)
322 ensureSdcChartsAreCreated(t, collr)
323 collecttest.TestMetricsHasAllChartsDims(t, collr.Charts(), collected)
324 }
325
326 func ensureStoragePoolChartsAreCreated(t *testing.T, collr *Collector) {
327 for _, pool := range collr.discovered.pool {
328 for _, chart := range *newStoragePoolCharts(pool) {
329 assert.Truef(t, collr.Charts().Has(chart.ID), "chart '%s' is not created", chart.ID)
330 }
331 }
332 }
333
334 func ensureSdcChartsAreCreated(t *testing.T, collr *Collector) {
335 for _, sdc := range collr.discovered.sdc {
336 for _, chart := range *newSdcCharts(sdc) {
337 assert.Truef(t, collr.Charts().Has(chart.ID), "chart '%s' is not created", chart.ID)
338 }
339 }
340 }
341
342 func prepareSrvMockScaleIO(t *testing.T) (*httptest.Server, *client.MockScaleIOAPIServer, *Collector) {
343 t.Helper()
344 const (
345 user = "user"
346 password = "password"
347 version = "2.5"
348 token = "token"
349 )
350 var stats client.SelectedStatistics
351 err := json.Unmarshal(dataSelectedStatistics, &stats)
352 require.NoError(t, err)
353
354 var ins client.Instances
355 err = json.Unmarshal(dataInstances, &ins)
356 require.NoError(t, err)
357
358 mock := client.MockScaleIOAPIServer{
359 User: user,
360 Password: password,
361 Version: version,
362 Token: token,
363 Instances: ins,
364 Statistics: stats,
365 }
366 srv := httptest.NewServer(&mock)
367 require.NoError(t, err)
368
369 collr := New()
370 collr.URL = srv.URL
371 collr.Username = user
372 collr.Password = password
373 return srv, &mock, collr
374 }