func GetManifestResults()

in pkg/safeguards/manifestresults.go [38:111]


func GetManifestResults(ctx context.Context, manifestFiles []types.ManifestFile) ([]types.ManifestResult, error) {
	if len(manifestFiles) == 0 {
		return nil, fmt.Errorf("path cannot be empty")
	}

	manifestResults := make([]types.ManifestResult, 0)

	// constraint client instantiation
	c, err := getConstraintClient()
	if err != nil {
		return manifestResults, err
	}

	// retrieval of templates, constraints, and deployment
	constraintTemplates, err := fc.ReadConstraintTemplates()
	if err != nil {
		return manifestResults, err
	}
	constraints, err := fc.ReadConstraints()
	if err != nil {
		return manifestResults, err
	}

	// loading of templates, constraints into constraint client
	err = loadConstraintTemplates(ctx, c, constraintTemplates)
	if err != nil {
		return manifestResults, err
	}
	err = loadConstraints(ctx, c, constraints)
	if err != nil {
		return manifestResults, err
	}

	// organized map of manifest object by file name
	manifestMap := make(map[string][]*unstructured.Unstructured, 0)
	// aggregate of every manifest object into one list
	allManifestObjects := []*unstructured.Unstructured{}
	for _, m := range manifestFiles {
		manifestObjects, err := fc.ReadManifests(m.ManifestContent) // read all the objects stored in a single file
		if err != nil {
			log.Errorf("reading objects %s", err.Error())
			return manifestResults, err
		}

		allManifestObjects = append(allManifestObjects, manifestObjects...)
		manifestMap[m.Name] = manifestObjects
	}

	if len(allManifestObjects) > 0 {
		err := loadManifestObjects(ctx, c, allManifestObjects)
		if err != nil {
			return manifestResults, err
		}
	}

	for _, m := range manifestFiles {
		var objectViolations map[string][]string

		// validation of deployment manifest with constraints, templates loaded
		objectViolations, err = getObjectViolations(ctx, c, manifestMap[m.Name])
		if err != nil {
			log.Errorf("validating objects: %s", err.Error())
			return manifestResults, err
		}

		manifestResults = append(manifestResults, types.ManifestResult{
			Name:             m.Name,
			ObjectViolations: objectViolations,
			ViolationsCount:  len(objectViolations),
		})
	}

	return manifestResults, nil
}