44 lines
974 B
Go
44 lines
974 B
Go
|
|
package facts
|
||
|
|
|
||
|
|
// Targets proposes normalized targets from a ClassSummary by picking the most common version.
|
||
|
|
type Targets struct {
|
||
|
|
Kernel string
|
||
|
|
OSImage string
|
||
|
|
Containerd string
|
||
|
|
K3sVersion string
|
||
|
|
Packages map[string]string
|
||
|
|
}
|
||
|
|
|
||
|
|
// ChooseTargets picks the highest-count entry for each field. Ties are left empty.
|
||
|
|
func ChooseTargets(sum *ClassSummary) Targets {
|
||
|
|
t := Targets{Packages: map[string]string{}}
|
||
|
|
if sum == nil {
|
||
|
|
return t
|
||
|
|
}
|
||
|
|
t.Kernel = topKey(sum.Kernels)
|
||
|
|
t.OSImage = topKey(sum.OSImages)
|
||
|
|
t.Containerd = topKey(sum.Containerd)
|
||
|
|
t.K3sVersion = topKey(sum.K3sVersions)
|
||
|
|
for pkg, versions := range sum.PackageStats {
|
||
|
|
if v := topKey(versions); v != "" {
|
||
|
|
t.Packages[pkg] = v
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return t
|
||
|
|
}
|
||
|
|
|
||
|
|
func topKey(m map[string]int) string {
|
||
|
|
best := ""
|
||
|
|
bestCount := 0
|
||
|
|
for k, c := range m {
|
||
|
|
if c > bestCount {
|
||
|
|
best = k
|
||
|
|
bestCount = c
|
||
|
|
} else if c == bestCount {
|
||
|
|
// tie: prefer empty to avoid arbitrary pick
|
||
|
|
best = ""
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return best
|
||
|
|
}
|