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