github.com/minio/console@v1.4.1/api/user_support_test.go (about)

     1  // This file is part of MinIO Console Server
     2  // Copyright (c) 2023 MinIO, Inc.
     3  //
     4  // This program is free software: you can redistribute it and/or modify
     5  // it under the terms of the GNU Affero General Public License as published by
     6  // the Free Software Foundation, either version 3 of the License, or
     7  // (at your option) any later version.
     8  //
     9  // This program is distributed in the hope that it will be useful,
    10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    12  // GNU Affero General Public License for more details.
    13  //
    14  // You should have received a copy of the GNU Affero General Public License
    15  // along with this program.  If not, see <http://www.gnu.org/licenses/>.
    16  
    17  package api
    18  
    19  import (
    20  	"context"
    21  	"errors"
    22  	"testing"
    23  
    24  	"github.com/minio/console/models"
    25  	"github.com/minio/madmin-go/v3"
    26  )
    27  
    28  func Test_getCallHomeRule(t *testing.T) {
    29  	type args struct {
    30  		ctx     context.Context
    31  		session *models.Principal
    32  	}
    33  	ctx := context.Background()
    34  	tests := []struct {
    35  		name               string
    36  		args               args
    37  		helpConfigKVGlobal func(envOnly bool) (madmin.Help, error)
    38  		helpConfigKV       func(subSys, key string, envOnly bool) (madmin.Help, error)
    39  		getConfigKV        func(key string) ([]byte, error)
    40  		want               *models.CallHomeGetResponse
    41  		wantErr            bool
    42  	}{
    43  		{
    44  			name: "subsys is not supported, dont crash / return anything",
    45  			args: args{
    46  				ctx:     ctx,
    47  				session: nil,
    48  			},
    49  			helpConfigKV: func(_, _ string, _ bool) (madmin.Help, error) {
    50  				return madmin.Help{}, errors.New("feature is not supported")
    51  			},
    52  			getConfigKV: func(_ string) ([]byte, error) {
    53  				return []byte{}, nil
    54  			},
    55  			helpConfigKVGlobal: func(_ bool) (madmin.Help, error) {
    56  				return madmin.Help{
    57  					SubSys:          "",
    58  					Description:     "",
    59  					MultipleTargets: false,
    60  					KeysHelp:        madmin.HelpKVS{},
    61  				}, nil
    62  			},
    63  			want:    nil,
    64  			wantErr: false,
    65  		},
    66  		{
    67  			name: "callhome enabled",
    68  			args: args{
    69  				ctx:     ctx,
    70  				session: nil,
    71  			},
    72  			helpConfigKVGlobal: func(_ bool) (madmin.Help, error) {
    73  				return madmin.Help{
    74  					SubSys:          "",
    75  					Description:     "",
    76  					MultipleTargets: false,
    77  					KeysHelp: madmin.HelpKVS{
    78  						{Key: "callhome", Description: "enable callhome for the cluster", Optional: true, Type: "string", MultipleTargets: false},
    79  					},
    80  				}, nil
    81  			},
    82  			helpConfigKV: func(_, _ string, _ bool) (madmin.Help, error) {
    83  				return madmin.Help{
    84  					SubSys:          "callhome",
    85  					Description:     "enable callhome for the cluster",
    86  					MultipleTargets: false,
    87  					KeysHelp: madmin.HelpKVS{
    88  						{Key: "frequency", Type: "duration", Optional: true, MultipleTargets: false},
    89  						{Key: "enable", Type: "on|off", Optional: true, MultipleTargets: false},
    90  					},
    91  				}, nil
    92  			},
    93  			getConfigKV: func(_ string) ([]byte, error) {
    94  				return []byte(`callhome:_ frequency=24h enable=on`), nil
    95  			},
    96  			want: &models.CallHomeGetResponse{
    97  				DiagnosticsStatus: true,
    98  			},
    99  			wantErr: false,
   100  		},
   101  		{
   102  			name: "callhome is disabled",
   103  			args: args{
   104  				ctx:     ctx,
   105  				session: nil,
   106  			},
   107  			helpConfigKVGlobal: func(_ bool) (madmin.Help, error) {
   108  				return madmin.Help{
   109  					SubSys:          "",
   110  					Description:     "",
   111  					MultipleTargets: false,
   112  					KeysHelp: madmin.HelpKVS{
   113  						{Key: "callhome", Description: "enable callhome for the cluster", Optional: true, Type: "string", MultipleTargets: false},
   114  					},
   115  				}, nil
   116  			},
   117  			helpConfigKV: func(_, _ string, _ bool) (madmin.Help, error) {
   118  				return madmin.Help{
   119  					SubSys:          "callhome",
   120  					Description:     "enable callhome for the cluster",
   121  					MultipleTargets: false,
   122  					KeysHelp: madmin.HelpKVS{
   123  						{Key: "frequency", Type: "duration", Optional: true, MultipleTargets: false},
   124  						{Key: "enable", Type: "on|off", Optional: true, MultipleTargets: false},
   125  					},
   126  				}, nil
   127  			},
   128  			getConfigKV: func(_ string) ([]byte, error) {
   129  				return []byte(`callhome:_ frequency=24h enable=off`), nil
   130  			},
   131  			want: &models.CallHomeGetResponse{
   132  				DiagnosticsStatus: false,
   133  			},
   134  			wantErr: false,
   135  		},
   136  	}
   137  	for _, tt := range tests {
   138  		tt := tt
   139  		t.Run(tt.name, func(_ *testing.T) {
   140  			adminClient := AdminClientMock{}
   141  
   142  			minioGetConfigKVMock = tt.getConfigKV
   143  			minioHelpConfigKVMock = tt.helpConfigKV
   144  			minioHelpConfigKVGlobalMock = tt.helpConfigKVGlobal
   145  
   146  			response, err := getCallHomeRule(tt.args.ctx, adminClient)
   147  			if (err != nil) != tt.wantErr {
   148  				t.Errorf("getCallHomeRule() error = %v, wantErr %v", err, tt.wantErr)
   149  				return
   150  			}
   151  			if tt.want != nil {
   152  				if response.DiagnosticsStatus != tt.want.DiagnosticsStatus {
   153  					t.Errorf("getCallHomeRule() got status = %v, want status %v", response.DiagnosticsStatus, tt.want.DiagnosticsStatus)
   154  				}
   155  			}
   156  		})
   157  	}
   158  }
   159  
   160  func Test_setCallHomeConfiguration(t *testing.T) {
   161  	type args struct {
   162  		ctx       context.Context
   163  		session   *models.Principal
   164  		diagState bool
   165  	}
   166  	ctx := context.Background()
   167  	tests := []struct {
   168  		name               string
   169  		args               args
   170  		helpConfigKVGlobal func(envOnly bool) (madmin.Help, error)
   171  		helpConfigKV       func(subSys, key string, envOnly bool) (madmin.Help, error)
   172  		getConfigKV        func(key string) ([]byte, error)
   173  		setConfigEnv       func(kv string) (restart bool, err error)
   174  		wantErr            bool
   175  		error              error
   176  	}{
   177  		{
   178  			name: "subsys is not supported, return error",
   179  			args: args{
   180  				ctx:       ctx,
   181  				session:   nil,
   182  				diagState: false,
   183  			},
   184  			helpConfigKV: func(_, _ string, _ bool) (madmin.Help, error) {
   185  				return madmin.Help{}, errors.New("feature is not supported")
   186  			},
   187  			getConfigKV: func(_ string) ([]byte, error) {
   188  				return []byte{}, nil
   189  			},
   190  			helpConfigKVGlobal: func(_ bool) (madmin.Help, error) {
   191  				return madmin.Help{
   192  					SubSys:          "",
   193  					Description:     "",
   194  					MultipleTargets: false,
   195  					KeysHelp:        madmin.HelpKVS{},
   196  				}, nil
   197  			},
   198  			setConfigEnv: func(_ string) (restart bool, err error) {
   199  				return false, nil
   200  			},
   201  			wantErr: true,
   202  			error:   errors.New("unable to find subnet configuration"),
   203  		},
   204  		{
   205  			name: "cluster not registered",
   206  			args: args{
   207  				ctx:       ctx,
   208  				session:   nil,
   209  				diagState: false,
   210  			},
   211  			helpConfigKV: func(_, _ string, _ bool) (madmin.Help, error) {
   212  				return madmin.Help{
   213  					SubSys:          "subnet",
   214  					Description:     "set subnet config for the cluster e.g. api key",
   215  					MultipleTargets: false,
   216  					KeysHelp: madmin.HelpKVS{
   217  						{Key: "license", Type: "string", Optional: true, MultipleTargets: false},
   218  						{Key: "api_key", Type: "string", Optional: true, MultipleTargets: false},
   219  						{Key: "proxy", Type: "string", Optional: true, MultipleTargets: false},
   220  					},
   221  				}, nil
   222  			},
   223  			getConfigKV: func(_ string) ([]byte, error) {
   224  				return []byte(`subnet license= api_key= proxy=http://127.0.0.1 `), nil
   225  			},
   226  			helpConfigKVGlobal: func(_ bool) (madmin.Help, error) {
   227  				return madmin.Help{
   228  					SubSys:          "",
   229  					Description:     "",
   230  					MultipleTargets: false,
   231  					KeysHelp: madmin.HelpKVS{
   232  						{Key: "callhome", Description: "enable callhome for the cluster", Optional: true, Type: "string", MultipleTargets: false},
   233  					},
   234  				}, nil
   235  			},
   236  			setConfigEnv: func(_ string) (restart bool, err error) {
   237  				return false, nil
   238  			},
   239  			wantErr: true,
   240  			error:   errors.New("please register this cluster in subnet to continue"),
   241  		},
   242  		{
   243  			name: "enable without errors",
   244  			args: args{
   245  				ctx:       ctx,
   246  				session:   nil,
   247  				diagState: true,
   248  			},
   249  			helpConfigKV: func(_, _ string, _ bool) (madmin.Help, error) {
   250  				return madmin.Help{
   251  					SubSys:          "subnet",
   252  					Description:     "set subnet config for the cluster e.g. api key",
   253  					MultipleTargets: false,
   254  					KeysHelp: madmin.HelpKVS{
   255  						{Key: "license", Type: "string", Optional: true, MultipleTargets: false},
   256  						{Key: "api_key", Type: "string", Optional: true, MultipleTargets: false},
   257  						{Key: "proxy", Type: "string", Optional: true, MultipleTargets: false},
   258  					},
   259  				}, nil
   260  			},
   261  			getConfigKV: func(_ string) ([]byte, error) {
   262  				return []byte(`subnet license= api_key=testAPIKey proxy=http://127.0.0.1 `), nil
   263  			},
   264  			helpConfigKVGlobal: func(_ bool) (madmin.Help, error) {
   265  				return madmin.Help{
   266  					SubSys:          "",
   267  					Description:     "",
   268  					MultipleTargets: false,
   269  					KeysHelp: madmin.HelpKVS{
   270  						{Key: "callhome", Description: "enable callhome for the cluster", Optional: true, Type: "string", MultipleTargets: false},
   271  					},
   272  				}, nil
   273  			},
   274  			setConfigEnv: func(_ string) (restart bool, err error) {
   275  				return false, nil
   276  			},
   277  			wantErr: false,
   278  			error:   nil,
   279  		},
   280  		{
   281  			name: "disable without errors",
   282  			args: args{
   283  				ctx:       ctx,
   284  				session:   nil,
   285  				diagState: false,
   286  			},
   287  			helpConfigKV: func(_, _ string, _ bool) (madmin.Help, error) {
   288  				return madmin.Help{
   289  					SubSys:          "subnet",
   290  					Description:     "set subnet config for the cluster e.g. api key",
   291  					MultipleTargets: false,
   292  					KeysHelp: madmin.HelpKVS{
   293  						{Key: "license", Type: "string", Optional: true, MultipleTargets: false},
   294  						{Key: "api_key", Type: "string", Optional: true, MultipleTargets: false},
   295  						{Key: "proxy", Type: "string", Optional: true, MultipleTargets: false},
   296  					},
   297  				}, nil
   298  			},
   299  			getConfigKV: func(_ string) ([]byte, error) {
   300  				return []byte(`subnet license= api_key=testAPIKey proxy=http://127.0.0.1 `), nil
   301  			},
   302  			helpConfigKVGlobal: func(_ bool) (madmin.Help, error) {
   303  				return madmin.Help{
   304  					SubSys:          "",
   305  					Description:     "",
   306  					MultipleTargets: false,
   307  					KeysHelp: madmin.HelpKVS{
   308  						{Key: "callhome", Description: "enable callhome for the cluster", Optional: true, Type: "string", MultipleTargets: false},
   309  					},
   310  				}, nil
   311  			},
   312  			setConfigEnv: func(_ string) (restart bool, err error) {
   313  				return false, nil
   314  			},
   315  			wantErr: false,
   316  			error:   nil,
   317  		},
   318  		{
   319  			name: "Error setting diagState",
   320  			args: args{
   321  				ctx:       ctx,
   322  				session:   nil,
   323  				diagState: false,
   324  			},
   325  			helpConfigKV: func(_, _ string, _ bool) (madmin.Help, error) {
   326  				return madmin.Help{
   327  					SubSys:          "subnet",
   328  					Description:     "set subnet config for the cluster e.g. api key",
   329  					MultipleTargets: false,
   330  					KeysHelp: madmin.HelpKVS{
   331  						{Key: "license", Type: "string", Optional: true, MultipleTargets: false},
   332  						{Key: "api_key", Type: "string", Optional: true, MultipleTargets: false},
   333  						{Key: "proxy", Type: "string", Optional: true, MultipleTargets: false},
   334  					},
   335  				}, nil
   336  			},
   337  			getConfigKV: func(_ string) ([]byte, error) {
   338  				return []byte(`subnet license= api_key=testAPIKey proxy=http://127.0.0.1 `), nil
   339  			},
   340  			helpConfigKVGlobal: func(_ bool) (madmin.Help, error) {
   341  				return madmin.Help{
   342  					SubSys:          "",
   343  					Description:     "",
   344  					MultipleTargets: false,
   345  					KeysHelp: madmin.HelpKVS{
   346  						{Key: "callhome", Description: "enable callhome for the cluster", Optional: true, Type: "string", MultipleTargets: false},
   347  					},
   348  				}, nil
   349  			},
   350  			setConfigEnv: func(_ string) (restart bool, err error) {
   351  				return false, errors.New("new error detected")
   352  			},
   353  			wantErr: true,
   354  			error:   errors.New("new error detected"),
   355  		},
   356  	}
   357  	for _, tt := range tests {
   358  		tt := tt
   359  		t.Run(tt.name, func(_ *testing.T) {
   360  			adminClient := AdminClientMock{}
   361  
   362  			minioGetConfigKVMock = tt.getConfigKV
   363  			minioHelpConfigKVMock = tt.helpConfigKV
   364  			minioHelpConfigKVGlobalMock = tt.helpConfigKVGlobal
   365  			minioSetConfigKVMock = tt.setConfigEnv
   366  
   367  			err := setCallHomeConfiguration(tt.args.ctx, adminClient, tt.args.diagState, false)
   368  
   369  			if (err != nil) != tt.wantErr {
   370  				t.Errorf("setCallHomeConfiguration() error = %v, wantErr %v", err, tt.wantErr)
   371  				return
   372  			}
   373  
   374  			if tt.wantErr {
   375  				if tt.error.Error() != err.Error() {
   376  					t.Errorf("setCallHomeConfiguration() error mismatch, error = %v, wantErr %v", err.Error(), tt.error.Error())
   377  					return
   378  				}
   379  			}
   380  		})
   381  	}
   382  }