github.com/1aal/kubeblocks@v0.0.0-20231107070852-e1c03e598921/pkg/cli/preflight/analyzer/kb_storage_class.go (about) 1 /* 2 Copyright (C) 2022-2023 ApeCloud Co., Ltd 3 4 This file is part of KubeBlocks project 5 6 This program is free software: you can redistribute it and/or modify 7 it under the terms of the GNU Affero General Public License as published by 8 the Free Software Foundation, either version 3 of the License, or 9 (at your option) any later version. 10 11 This program is distributed in the hope that it will be useful 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU Affero General Public License for more details. 15 16 You should have received a copy of the GNU Affero General Public License 17 along with this program. If not, see <http://www.gnu.org/licenses/>. 18 */ 19 20 package analyzer 21 22 import ( 23 "encoding/json" 24 "fmt" 25 26 analyze "github.com/replicatedhq/troubleshoot/pkg/analyze" 27 storagev1beta1 "k8s.io/api/storage/v1beta1" 28 "k8s.io/kubectl/pkg/util/storage" 29 30 preflightv1beta2 "github.com/1aal/kubeblocks/externalapis/preflight/v1beta2" 31 "github.com/1aal/kubeblocks/pkg/cli/preflight/util" 32 ) 33 34 const ( 35 StorageClassPath = "cluster-resources/storage-classes.json" 36 StorageClassErrorPath = "cluster-resources/storage-classes-errors.json" 37 ) 38 39 type AnalyzeStorageClassByKb struct { 40 analyzer *preflightv1beta2.KBStorageClassAnalyze 41 } 42 43 func (a *AnalyzeStorageClassByKb) Title() string { 44 return util.TitleOrDefault(a.analyzer.AnalyzeMeta, "KubeBlocks Storage Class") 45 } 46 47 func (a *AnalyzeStorageClassByKb) GetAnalyzer() *preflightv1beta2.KBStorageClassAnalyze { 48 return a.analyzer 49 } 50 51 func (a *AnalyzeStorageClassByKb) IsExcluded() (bool, error) { 52 return util.IsExcluded(a.analyzer.Exclude) 53 } 54 55 func (a *AnalyzeStorageClassByKb) Analyze(getFile GetCollectedFileContents, findFiles GetChildCollectedFileContents) ([]*analyze.AnalyzeResult, error) { 56 result, err := a.analyzeStorageClass(a.analyzer, getFile, findFiles) 57 if err != nil { 58 return []*analyze.AnalyzeResult{result}, err 59 } 60 result.Strict = a.analyzer.Strict.BoolOrDefaultFalse() 61 return []*analyze.AnalyzeResult{result}, nil 62 } 63 64 func (a *AnalyzeStorageClassByKb) analyzeStorageClass(analyzer *preflightv1beta2.KBStorageClassAnalyze, getFile GetCollectedFileContents, findFiles GetChildCollectedFileContents) (*analyze.AnalyzeResult, error) { 65 storageClassesData, err := getFile(StorageClassPath) 66 if err != nil { 67 return newWarnResultWithMessage(a.Title(), fmt.Sprintf("get jsonfile failed, err:%v", err)), err 68 } 69 70 storageClassesErrorData, err := getFile(StorageClassErrorPath) 71 if err == nil && storageClassesErrorData != nil && len(storageClassesErrorData) > 0 && len(storageClassesData) == 0 { 72 var values []string 73 err = json.Unmarshal(storageClassesErrorData, &values) 74 if err != nil || len(values) == 0 { 75 return newWarnResultWithMessage(a.Title(), fmt.Sprintf("get storage class failed, err:%v", storageClassesErrorData)), err 76 } 77 return newWarnResultWithMessage(a.Title(), fmt.Sprintf("get storage class failed, err:%v", values[0])), nil 78 } 79 80 var storageClasses storagev1beta1.StorageClassList 81 if err = json.Unmarshal(storageClassesData, &storageClasses); err != nil { 82 return newWarnResultWithMessage(a.Title(), fmt.Sprintf("unmarshal jsonfile failed, err:%v", err)), err 83 } 84 85 for _, storageClass := range storageClasses.Items { 86 // if storageClassType not set, check if default storageClass exists 87 if analyzer.StorageClassType == "" { 88 val := storageClass.Annotations[storage.IsDefaultStorageClassAnnotation] 89 if val == "true" { 90 return newAnalyzeResult(a.Title(), PassType, a.analyzer.Outcomes), nil 91 } 92 continue 93 } 94 95 if storageClass.Parameters["type"] != analyzer.StorageClassType { 96 continue 97 } 98 if storageClass.Provisioner == "" || (storageClass.Provisioner == analyzer.Provisioner) { 99 return newAnalyzeResult(a.Title(), PassType, a.analyzer.Outcomes), nil 100 } 101 } 102 return newAnalyzeResult(a.Title(), WarnType, a.analyzer.Outcomes), nil 103 } 104 105 var _ KBAnalyzer = &AnalyzeStorageClassByKb{}