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 }