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  }