Files
troubleshoot/pkg/preflight/util.go

92 lines
3.3 KiB
Go

package preflight
import (
"encoding/json"
"github.com/pkg/errors"
troubleshootv1beta2 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta2"
)
// HasStrictAnalyzers - checks and returns true if a preflight's analyzer has strict:true, else false
func HasStrictAnalyzers(preflight *troubleshootv1beta2.Preflight) (bool, error) {
if preflight == nil {
return false, nil
}
marshalledAnalyzers, err := json.Marshal(preflight.Spec.Analyzers) // marshall and remove nil Analyzers eg result: "[{\"clusterVersion\":{\"exclude\":\"\",\"strict\":\"false\",\"outcomes\":null}}]"
if err != nil {
return false, errors.Wrap(err, "failed to marshal analyzers")
}
analyzersMap := []map[string]interface{}{}
err = json.Unmarshal(marshalledAnalyzers, &analyzersMap) // Unmarshall again so we can loop over non nil analyzers
if err != nil {
return false, errors.Wrap(err, "failed to unmarshal analyzers")
}
// analyzerMap will ignore empty Analyzers and loop around Analyzer with data
for _, analyzers := range analyzersMap { // for each analyzer: map["clusterVersion": map[string]interface{} ["exclude": "", "strict": "true", "outcomes": nil]
hasStrictAnalyzer, err := hasStrictAnalyzer(analyzers)
if err != nil {
return false, errors.Wrap(err, "failed to check if analyzer has strict:true")
}
if hasStrictAnalyzer {
return true, nil
}
}
return false, nil
}
// HasStrictAnalyzers - checks and returns true if a preflight's analyzer has strict:true, else false
func HasStrictAnalyzer(analyzer *troubleshootv1beta2.Analyze) (bool, error) {
marshalledAnalyzer, err := json.Marshal(analyzer)
if err != nil {
return false, errors.Wrap(err, "error while marshalling analyzer")
}
analyzerMap := make(map[string]interface{})
err = json.Unmarshal(marshalledAnalyzer, &analyzerMap) // Unmarshall again so we can loop over non nil analyzers
if err != nil {
return false, errors.Wrap(err, "failed to unmarshal analyzers")
}
return hasStrictAnalyzer(analyzerMap)
}
func hasStrictAnalyzer(analyzerMap map[string]interface{}) (bool, error) {
for _, analyzer := range analyzerMap { // for each analyzerMeta: map[string]interface{} ["exclude": "", "strict": "true", "outcomes": nil]
marshalledAnalyzer, err := json.Marshal(analyzer)
if err != nil {
return false, errors.Wrap(err, "error while marshalling analyzer")
}
// return Analyzer.Strict which can be extracted from AnalyzeMeta
analyzeMeta := troubleshootv1beta2.AnalyzeMeta{}
err = json.Unmarshal(marshalledAnalyzer, &analyzeMeta)
if err != nil {
return false, errors.Wrap(err, "error while un-marshalling marshalledAnalyzers")
}
if analyzeMeta.Exclude.BoolOrDefaultFalse() {
continue
}
if analyzeMeta.Strict.BoolOrDefaultFalse() {
return true, nil
}
}
return false, nil
}
// HasStrictAnalyzersFailed - checks if preflight analyzer's result is strict:true and isFail:true, then returns true else false
func HasStrictAnalyzersFailed(preflightResult *UploadPreflightResults) bool {
hasStrictAnalyzersFailed := false
// if results are empty, treat as failure
if preflightResult == nil || len(preflightResult.Results) == 0 {
hasStrictAnalyzersFailed = true
} else {
for _, result := range preflightResult.Results {
if result.IsFail && result.Strict {
hasStrictAnalyzersFailed = true
}
}
}
return hasStrictAnalyzersFailed
}