in pkg/analyzer/psaEvaluator.go [34:103]
func (e *psaEvaluator) Evaluate(stream []byte, levelString string) (AnalyzerResponse, error) {
var allowed bool
var obj runtime.Object
var gKV *schema.GroupVersionKind
var err error
var response AnalyzerResponse
var latest api.Version
var level api.Level
yamlDecoder := yaml.NewDecoder(bytes.NewReader(stream))
k8sDecode := scheme.Codecs.UniversalDeserializer().Decode
response.Allowed = true
//TODO: Accept PSS version as a parameter
latest, err = api.ParseVersion("latest")
if err != nil {
panic(err)
}
level, err = api.ParseLevel(levelString)
if err != nil {
panic(err)
}
levelVersion := api.LevelVersion{
Level: level,
Version: latest,
}
for {
var node yaml.Node
err = yamlDecoder.Decode(&node)
if errors.Is(err, io.EOF) {
response.AnalysisStatus = "eof"
break
}
if err != nil {
response.AnalysisStatus = "error"
panic(err)
}
content, err := yaml.Marshal(&node)
if err != nil {
response.AnalysisStatus = "error"
panic(err)
}
// prepare yaml document for evaluation
obj, gKV, err = k8sDecode(content, nil, nil)
if err != nil {
fmt.Printf("Non standard k8s node found\n")
response.AnalysisStatus = "error"
//TODO: Take into consideration break parameter flag
continue
}
//process response
allowed, err = e.evaluate(obj, gKV, levelVersion)
if err != nil {
response.AnalysisStatus = "error"
panic(err)
}
response.Allowed = response.Allowed && allowed
}
if response.AnalysisStatus == "error" {
return response, err
}
return response, nil
}