func()

in pkg/gcv/result.go [190:241]


func (cv *ConstraintViolation) toViolation(name string, auxMetadata map[string]interface{}) (*validator.Violation, error) {
	metadataJson, err := json.Marshal(cv.metadata(auxMetadata))
	if err != nil {
		return nil, errors.Wrapf(err, "failed to marshal result metadata %v to json", cv.Metadata)
	}
	metadata := &structpb.Value{}
	if err := protojson.Unmarshal(metadataJson, metadata); err != nil {
		return nil, errors.Wrapf(err, "failed to unmarshal json %s into structpb", string(metadataJson))
	}

	// Extract the object fields if they exists.
	var apiVersion string
	if constraintAPIVersion, ok := cv.Constraint.Object["apiVersion"]; ok {
		apiVersion = fmt.Sprintf("%s", constraintAPIVersion)
	}

	var kind string
	if constraintKind, ok := cv.Constraint.Object["kind"]; ok {
		kind = fmt.Sprintf("%s", constraintKind)
	}

	var pbMetadata *structpb.Value
	if constraintMetadata, ok := cv.Constraint.Object["metadata"]; ok {
		if pbMetadata, err = convertToProtoVal(constraintMetadata); err != nil {
			return nil, errors.Wrapf(err, "failed to convert constraint metadata into structpb.Value")
		}
	}

	var pbSpec *structpb.Value
	if constraintSpec, ok := cv.Constraint.Object["spec"]; ok {
		if pbSpec, err = convertToProtoVal(constraintSpec); err != nil {
			return nil, errors.Wrapf(err, "failed to convert constraint spec into structpb.Value")
		}
	}

	// Build the ConstraintConfig proto.
	constraintConfig := &validator.Constraint{
		ApiVersion: apiVersion,
		Kind:       kind,
		Metadata:   pbMetadata,
		Spec:       pbSpec,
	}

	return &validator.Violation{
		Constraint:       cv.name(),
		ConstraintConfig: constraintConfig,
		Resource:         name,
		Message:          cv.Message,
		Metadata:         metadata,
		Severity:         cv.Severity,
	}, nil
}