summaryrefslogtreecommitdiffstats
path: root/src/go/collectors/go.d.plugin/modules/scaleio/scaleio_test.go
blob: 970ee263dc7f3d28018be941beb1256fbcd84f45 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
// SPDX-License-Identifier: GPL-3.0-or-later

package scaleio

import (
	"encoding/json"
	"net/http/httptest"
	"os"
	"testing"

	"github.com/netdata/netdata/go/go.d.plugin/agent/module"
	"github.com/netdata/netdata/go/go.d.plugin/modules/scaleio/client"

	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
)

var (
	dataConfigJSON, _ = os.ReadFile("testdata/config.json")
	dataConfigYAML, _ = os.ReadFile("testdata/config.yaml")

	dataSelectedStatistics, _ = os.ReadFile("testdata/selected_statistics.json")
	dataInstances, _          = os.ReadFile("testdata/instances.json")
)

func Test_testDataIsValid(t *testing.T) {
	for name, data := range map[string][]byte{
		"dataConfigJSON":         dataConfigJSON,
		"dataConfigYAML":         dataConfigYAML,
		"dataSelectedStatistics": dataSelectedStatistics,
		"dataInstances":          dataInstances,
	} {
		require.NotNil(t, data, name)
	}
}

func TestScaleIO_ConfigurationSerialize(t *testing.T) {
	module.TestConfigurationSerialize(t, &ScaleIO{}, dataConfigJSON, dataConfigYAML)
}

func TestScaleIO_Init(t *testing.T) {
	scaleIO := New()
	scaleIO.Username = "username"
	scaleIO.Password = "password"

	assert.NoError(t, scaleIO.Init())
}
func TestScaleIO_Init_UsernameAndPasswordNotSet(t *testing.T) {
	assert.Error(t, New().Init())
}

func TestScaleIO_Init_ErrorOnCreatingClientWrongTLSCA(t *testing.T) {
	job := New()
	job.Username = "username"
	job.Password = "password"
	job.Client.TLSConfig.TLSCA = "testdata/tls"

	assert.Error(t, job.Init())
}

func TestScaleIO_Check(t *testing.T) {
	srv, _, scaleIO := prepareSrvMockScaleIO(t)
	defer srv.Close()
	require.NoError(t, scaleIO.Init())

	assert.NoError(t, scaleIO.Check())
}

func TestScaleIO_Check_ErrorOnLogin(t *testing.T) {
	srv, mock, scaleIO := prepareSrvMockScaleIO(t)
	defer srv.Close()
	require.NoError(t, scaleIO.Init())
	mock.Password = "new password"

	assert.Error(t, scaleIO.Check())
}

func TestScaleIO_Charts(t *testing.T) {
	assert.NotNil(t, New().Charts())
}

func TestScaleIO_Cleanup(t *testing.T) {
	srv, _, scaleIO := prepareSrvMockScaleIO(t)
	defer srv.Close()
	require.NoError(t, scaleIO.Init())
	require.NoError(t, scaleIO.Check())

	scaleIO.Cleanup()
	assert.False(t, scaleIO.client.LoggedIn())
}

func TestScaleIO_Collect(t *testing.T) {
	srv, _, scaleIO := prepareSrvMockScaleIO(t)
	defer srv.Close()
	require.NoError(t, scaleIO.Init())
	require.NoError(t, scaleIO.Check())

	expected := map[string]int64{
		"sdc_6076fd0f00000000_bandwidth_read":                                    0,
		"sdc_6076fd0f00000000_bandwidth_read_write":                              0,
		"sdc_6076fd0f00000000_bandwidth_write":                                   0,
		"sdc_6076fd0f00000000_io_size_read":                                      0,
		"sdc_6076fd0f00000000_io_size_read_write":                                0,
		"sdc_6076fd0f00000000_io_size_write":                                     0,
		"sdc_6076fd0f00000000_iops_read":                                         0,
		"sdc_6076fd0f00000000_iops_read_write":                                   0,
		"sdc_6076fd0f00000000_iops_write":                                        0,
		"sdc_6076fd0f00000000_mdm_connection_state":                              1,
		"sdc_6076fd0f00000000_num_of_mapped_volumes":                             1,
		"sdc_6076fd1000000001_bandwidth_read":                                    1000,
		"sdc_6076fd1000000001_bandwidth_read_write":                              117400000,
		"sdc_6076fd1000000001_bandwidth_write":                                   117399000,
		"sdc_6076fd1000000001_io_size_read":                                      1000,
		"sdc_6076fd1000000001_io_size_read_write":                                695668,
		"sdc_6076fd1000000001_io_size_write":                                     694668,
		"sdc_6076fd1000000001_iops_read":                                         1000,
		"sdc_6076fd1000000001_iops_read_write":                                   170000,
		"sdc_6076fd1000000001_iops_write":                                        169000,
		"sdc_6076fd1000000001_mdm_connection_state":                              0,
		"sdc_6076fd1000000001_num_of_mapped_volumes":                             1,
		"sdc_6076fd1100000002_bandwidth_read":                                    0,
		"sdc_6076fd1100000002_bandwidth_read_write":                              118972000,
		"sdc_6076fd1100000002_bandwidth_write":                                   118972000,
		"sdc_6076fd1100000002_io_size_read":                                      0,
		"sdc_6076fd1100000002_io_size_read_write":                                820496,
		"sdc_6076fd1100000002_io_size_write":                                     820496,
		"sdc_6076fd1100000002_iops_read":                                         0,
		"sdc_6076fd1100000002_iops_read_write":                                   145000,
		"sdc_6076fd1100000002_iops_write":                                        145000,
		"sdc_6076fd1100000002_mdm_connection_state":                              0,
		"sdc_6076fd1100000002_num_of_mapped_volumes":                             1,
		"storage_pool_40395b7b00000000_capacity_alert_critical_threshold":        90,
		"storage_pool_40395b7b00000000_capacity_alert_high_threshold":            80,
		"storage_pool_40395b7b00000000_capacity_available_for_volume_allocation": 100663296,
		"storage_pool_40395b7b00000000_capacity_decreased":                       0,
		"storage_pool_40395b7b00000000_capacity_degraded":                        0,
		"storage_pool_40395b7b00000000_capacity_failed":                          0,
		"storage_pool_40395b7b00000000_capacity_in_maintenance":                  0,
		"storage_pool_40395b7b00000000_capacity_in_use":                          50110464,
		"storage_pool_40395b7b00000000_capacity_max_capacity":                    311424000,
		"storage_pool_40395b7b00000000_capacity_protected":                       50110464,
		"storage_pool_40395b7b00000000_capacity_snapshot":                        749568,
		"storage_pool_40395b7b00000000_capacity_spare":                           31141888,
		"storage_pool_40395b7b00000000_capacity_thick_in_use":                    0,
		"storage_pool_40395b7b00000000_capacity_thin_in_use":                     49360896,
		"storage_pool_40395b7b00000000_capacity_unreachable_unused":              0,
		"storage_pool_40395b7b00000000_capacity_unused":                          229422080,
		"storage_pool_40395b7b00000000_capacity_utilization":                     1787,
		"storage_pool_40395b7b00000000_num_of_devices":                           3,
		"storage_pool_40395b7b00000000_num_of_snapshots":                         1,
		"storage_pool_40395b7b00000000_num_of_volumes":                           3,
		"storage_pool_40395b7b00000000_num_of_vtrees":                            2,
		"storage_pool_4039828b00000001_capacity_alert_critical_threshold":        90,
		"storage_pool_4039828b00000001_capacity_alert_high_threshold":            80,
		"storage_pool_4039828b00000001_capacity_available_for_volume_allocation": 142606336,
		"storage_pool_4039828b00000001_capacity_decreased":                       0,
		"storage_pool_4039828b00000001_capacity_degraded":                        0,
		"storage_pool_4039828b00000001_capacity_failed":                          0,
		"storage_pool_4039828b00000001_capacity_in_maintenance":                  0,
		"storage_pool_4039828b00000001_capacity_in_use":                          0,
		"storage_pool_4039828b00000001_capacity_max_capacity":                    332395520,
		"storage_pool_4039828b00000001_capacity_protected":                       0,
		"storage_pool_4039828b00000001_capacity_snapshot":                        0,
		"storage_pool_4039828b00000001_capacity_spare":                           33239040,
		"storage_pool_4039828b00000001_capacity_thick_in_use":                    0,
		"storage_pool_4039828b00000001_capacity_thin_in_use":                     0,
		"storage_pool_4039828b00000001_capacity_unreachable_unused":              0,
		"storage_pool_4039828b00000001_capacity_unused":                          299156480,
		"storage_pool_4039828b00000001_capacity_utilization":                     0,
		"storage_pool_4039828b00000001_num_of_devices":                           3,
		"storage_pool_4039828b00000001_num_of_snapshots":                         0,
		"storage_pool_4039828b00000001_num_of_volumes":                           0,
		"storage_pool_4039828b00000001_num_of_vtrees":                            0,
		"system_backend_primary_bandwidth_read":                                  800,
		"system_backend_primary_bandwidth_read_write":                            238682400,
		"system_backend_primary_bandwidth_write":                                 238681600,
		"system_backend_primary_io_size_read":                                    4000,
		"system_backend_primary_io_size_read_write":                              770971,
		"system_backend_primary_io_size_write":                                   766971,
		"system_backend_primary_iops_read":                                       200,
		"system_backend_primary_iops_read_write":                                 311400,
		"system_backend_primary_iops_write":                                      311200,
		"system_backend_secondary_bandwidth_read":                                0,
		"system_backend_secondary_bandwidth_read_write":                          233926400,
		"system_backend_secondary_bandwidth_write":                               233926400,
		"system_backend_secondary_io_size_read":                                  0,
		"system_backend_secondary_io_size_read_write":                            764465,
		"system_backend_secondary_io_size_write":                                 764465,
		"system_backend_secondary_iops_read":                                     0,
		"system_backend_secondary_iops_read_write":                               306000,
		"system_backend_secondary_iops_write":                                    306000,
		"system_backend_total_bandwidth_read":                                    800,
		"system_backend_total_bandwidth_read_write":                              472608800,
		"system_backend_total_bandwidth_write":                                   472608000,
		"system_backend_total_io_size_read":                                      4000,
		"system_backend_total_io_size_read_write":                                1535437,
		"system_backend_total_io_size_write":                                     1531437,
		"system_backend_total_iops_read":                                         200,
		"system_backend_total_iops_read_write":                                   617400,
		"system_backend_total_iops_write":                                        617200,
		"system_capacity_available_for_volume_allocation":                        243269632,
		"system_capacity_decreased":                                              0,
		"system_capacity_degraded":                                               0,
		"system_capacity_failed":                                                 0,
		"system_capacity_in_maintenance":                                         0,
		"system_capacity_in_use":                                                 50110464,
		"system_capacity_max_capacity":                                           643819520,
		"system_capacity_protected":                                              50110464,
		"system_capacity_snapshot":                                               749568,
		"system_capacity_spare":                                                  64380928,
		"system_capacity_thick_in_use":                                           0,
		"system_capacity_thin_in_use":                                            49360896,
		"system_capacity_unreachable_unused":                                     0,
		"system_capacity_unused":                                                 528578560,
		"system_frontend_user_data_bandwidth_read":                               0,
		"system_frontend_user_data_bandwidth_read_write":                         227170000,
		"system_frontend_user_data_bandwidth_write":                              227170000,
		"system_frontend_user_data_io_size_read":                                 0,
		"system_frontend_user_data_io_size_read_write":                           797087,
		"system_frontend_user_data_io_size_write":                                797087,
		"system_frontend_user_data_iops_read":                                    0,
		"system_frontend_user_data_iops_read_write":                              285000,
		"system_frontend_user_data_iops_write":                                   285000,
		"system_num_of_devices":                                                  6,
		"system_num_of_fault_sets":                                               0,
		"system_num_of_mapped_to_all_volumes":                                    0,
		"system_num_of_mapped_volumes":                                           3,
		"system_num_of_protection_domains":                                       1,
		"system_num_of_rfcache_devices":                                          0,
		"system_num_of_sdc":                                                      3,
		"system_num_of_sds":                                                      3,
		"system_num_of_snapshots":                                                1,
		"system_num_of_storage_pools":                                            2,
		"system_num_of_thick_base_volumes":                                       0,
		"system_num_of_thin_base_volumes":                                        2,
		"system_num_of_unmapped_volumes":                                         0,
		"system_num_of_volumes":                                                  3,
		"system_num_of_vtrees":                                                   2,
		"system_rebalance_bandwidth_read":                                        0,
		"system_rebalance_bandwidth_read_write":                                  0,
		"system_rebalance_bandwidth_write":                                       0,
		"system_rebalance_io_size_read":                                          0,
		"system_rebalance_io_size_read_write":                                    0,
		"system_rebalance_io_size_write":                                         0,
		"system_rebalance_iops_read":                                             0,
		"system_rebalance_iops_read_write":                                       0,
		"system_rebalance_iops_write":                                            0,
		"system_rebalance_pending_capacity_in_Kb":                                0,
		"system_rebalance_time_until_finish":                                     0,
		"system_rebuild_backward_bandwidth_read":                                 0,
		"system_rebuild_backward_bandwidth_read_write":                           0,
		"system_rebuild_backward_bandwidth_write":                                0,
		"system_rebuild_backward_io_size_read":                                   0,
		"system_rebuild_backward_io_size_read_write":                             0,
		"system_rebuild_backward_io_size_write":                                  0,
		"system_rebuild_backward_iops_read":                                      0,
		"system_rebuild_backward_iops_read_write":                                0,
		"system_rebuild_backward_iops_write":                                     0,
		"system_rebuild_backward_pending_capacity_in_Kb":                         0,
		"system_rebuild_forward_bandwidth_read":                                  0,
		"system_rebuild_forward_bandwidth_read_write":                            0,
		"system_rebuild_forward_bandwidth_write":                                 0,
		"system_rebuild_forward_io_size_read":                                    0,
		"system_rebuild_forward_io_size_read_write":                              0,
		"system_rebuild_forward_io_size_write":                                   0,
		"system_rebuild_forward_iops_read":                                       0,
		"system_rebuild_forward_iops_read_write":                                 0,
		"system_rebuild_forward_iops_write":                                      0,
		"system_rebuild_forward_pending_capacity_in_Kb":                          0,
		"system_rebuild_normal_bandwidth_read":                                   0,
		"system_rebuild_normal_bandwidth_read_write":                             0,
		"system_rebuild_normal_bandwidth_write":                                  0,
		"system_rebuild_normal_io_size_read":                                     0,
		"system_rebuild_normal_io_size_read_write":                               0,
		"system_rebuild_normal_io_size_write":                                    0,
		"system_rebuild_normal_iops_read":                                        0,
		"system_rebuild_normal_iops_read_write":                                  0,
		"system_rebuild_normal_iops_write":                                       0,
		"system_rebuild_normal_pending_capacity_in_Kb":                           0,
		"system_rebuild_total_bandwidth_read":                                    0,
		"system_rebuild_total_bandwidth_read_write":                              0,
		"system_rebuild_total_bandwidth_write":                                   0,
		"system_rebuild_total_io_size_read":                                      0,
		"system_rebuild_total_io_size_read_write":                                0,
		"system_rebuild_total_io_size_write":                                     0,
		"system_rebuild_total_iops_read":                                         0,
		"system_rebuild_total_iops_read_write":                                   0,
		"system_rebuild_total_iops_write":                                        0,
		"system_rebuild_total_pending_capacity_in_Kb":                            0,
		"system_total_bandwidth_read":                                            800,
		"system_total_bandwidth_read_write":                                      472608800,
		"system_total_bandwidth_write":                                           472608000,
		"system_total_io_size_read":                                              4000,
		"system_total_io_size_read_write":                                        769729,
		"system_total_io_size_write":                                             765729,
		"system_total_iops_read":                                                 200,
		"system_total_iops_read_write":                                           617400,
		"system_total_iops_write":                                                617200,
	}

	collected := scaleIO.Collect()
	assert.Equal(t, expected, collected)
	testCharts(t, scaleIO, collected)
}

func TestScaleIO_Collect_ConnectionRefused(t *testing.T) {
	srv, _, scaleIO := prepareSrvMockScaleIO(t)
	defer srv.Close()
	require.NoError(t, scaleIO.Init())
	require.NoError(t, scaleIO.Check())
	scaleIO.client.Request.URL = "http://127.0.0.1:38001"

	assert.Nil(t, scaleIO.Collect())
}

func testCharts(t *testing.T, scaleIO *ScaleIO, collected map[string]int64) {
	t.Helper()
	ensureStoragePoolChartsAreCreated(t, scaleIO)
	ensureSdcChartsAreCreated(t, scaleIO)
	ensureCollectedHasAllChartsDimsVarsIDs(t, scaleIO, collected)
}

func ensureStoragePoolChartsAreCreated(t *testing.T, scaleIO *ScaleIO) {
	for _, pool := range scaleIO.discovered.pool {
		for _, chart := range *newStoragePoolCharts(pool) {
			assert.Truef(t, scaleIO.Charts().Has(chart.ID), "chart '%s' is not created", chart.ID)
		}
	}
}

func ensureSdcChartsAreCreated(t *testing.T, scaleIO *ScaleIO) {
	for _, sdc := range scaleIO.discovered.sdc {
		for _, chart := range *newSdcCharts(sdc) {
			assert.Truef(t, scaleIO.Charts().Has(chart.ID), "chart '%s' is not created", chart.ID)
		}
	}
}

func ensureCollectedHasAllChartsDimsVarsIDs(t *testing.T, scaleIO *ScaleIO, collected map[string]int64) {
	for _, chart := range *scaleIO.Charts() {
		for _, dim := range chart.Dims {
			_, ok := collected[dim.ID]
			assert.Truef(t, ok, "collected metrics has no data for dim '%s' chart '%s'", dim.ID, chart.ID)
		}
		for _, v := range chart.Vars {
			_, ok := collected[v.ID]
			assert.Truef(t, ok, "collected metrics has no data for var '%s' chart '%s'", v.ID, chart.ID)
		}
	}
}

func prepareSrvMockScaleIO(t *testing.T) (*httptest.Server, *client.MockScaleIOAPIServer, *ScaleIO) {
	t.Helper()
	const (
		user     = "user"
		password = "password"
		version  = "2.5"
		token    = "token"
	)
	var stats client.SelectedStatistics
	err := json.Unmarshal(dataSelectedStatistics, &stats)
	require.NoError(t, err)

	var ins client.Instances
	err = json.Unmarshal(dataInstances, &ins)
	require.NoError(t, err)

	mock := client.MockScaleIOAPIServer{
		User:       user,
		Password:   password,
		Version:    version,
		Token:      token,
		Instances:  ins,
		Statistics: stats,
	}
	srv := httptest.NewServer(&mock)
	require.NoError(t, err)

	scaleIO := New()
	scaleIO.URL = srv.URL
	scaleIO.Username = user
	scaleIO.Password = password
	return srv, &mock, scaleIO
}