* Copyright (c) 2026 Huawei Technologies Co., Ltd.
* openFuyao is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
package unified
import (
ctrl "sigs.k8s.io/controller-runtime"
compliancev1alpha1 "gitcode.com/openFuyao/compliance-operator/api/v1alpha1"
)
var modelLog = ctrl.Log.WithName("unified-model")
const (
StatusPass = "PASS"
StatusFail = "FAIL"
StatusWarn = "WARN"
StatusInfo = "INFO"
StatusNotApplicable = "NOT_APPLICABLE"
StatusNotChecked = "NOT_CHECKED"
StatusError = "ERROR"
)
const (
SeverityHigh = "high"
SeverityMedium = "medium"
SeverityLow = "low"
SeverityInfo = "info"
)
type RuleDefinition struct {
ID string `json:"ruleID"`
Description string `json:"description"`
Remediation string `json:"remediation"`
Severity string `json:"severity"`
Category string `json:"category"`
Scored bool `json:"scored"`
Benchmark string `json:"benchmark"`
}
type RenderedCheckResult struct {
compliancev1alpha1.UnifiedCheckResult
RuleDefinition
}
func ComputeSummary(results []compliancev1alpha1.UnifiedCheckResult) compliancev1alpha1.ScanSummary {
modelLog.V(2).Info("computing summary", "resultCount", len(results))
summary := compliancev1alpha1.ScanSummary{}
for _, r := range results {
summary.Total++
tallyStatus(r.Status, &summary)
}
return summary
}
type statusTallyFunc func(*compliancev1alpha1.ScanSummary)
var statusTallyMap = map[string]statusTallyFunc{
StatusPass: func(s *compliancev1alpha1.ScanSummary) { s.Pass++ },
StatusFail: func(s *compliancev1alpha1.ScanSummary) { s.Fail++ },
StatusWarn: func(s *compliancev1alpha1.ScanSummary) { s.Warn++ },
StatusInfo: func(s *compliancev1alpha1.ScanSummary) { s.Info++ },
StatusNotApplicable: func(s *compliancev1alpha1.ScanSummary) { s.NotApplicable++ },
StatusNotChecked: func(s *compliancev1alpha1.ScanSummary) { s.NotChecked++ },
StatusError: func(s *compliancev1alpha1.ScanSummary) { s.Error++ },
}
func tallyStatus(status string, summary *compliancev1alpha1.ScanSummary) {
if fn, ok := statusTallyMap[status]; ok {
fn(summary)
}
}
func MergeSummaries(summaries []compliancev1alpha1.ScanSummary) compliancev1alpha1.ScanSummary {
merged := compliancev1alpha1.ScanSummary{}
for _, s := range summaries {
merged.Pass += s.Pass
merged.Fail += s.Fail
merged.Warn += s.Warn
merged.Info += s.Info
merged.NotApplicable += s.NotApplicable
merged.NotChecked += s.NotChecked
merged.Error += s.Error
merged.Total += s.Total
}
return merged
}
func DetermineOverallResult(summary compliancev1alpha1.ScanSummary) compliancev1alpha1.ScanResult {
if summary.Total == 0 {
modelLog.V(1).Info("no results collected, returning ResultError")
return compliancev1alpha1.ResultError
}
if summary.Error > 0 {
return compliancev1alpha1.ResultError
}
if summary.Fail > 0 {
return compliancev1alpha1.ResultNonCompliant
}
if summary.Warn > 0 {
return compliancev1alpha1.ResultNonCompliant
}
return compliancev1alpha1.ResultCompliant
}