func()

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
}