package web import ( "strings" "github.com/shcizo/package-updater/internal/imageref" "github.com/shcizo/package-updater/internal/master/model" "github.com/shcizo/package-updater/internal/protocol" ) type serviceGroup struct { Title string Services []model.Service } // groupServices groups machine-bound services per agent and Swarm services // in one group, keeping the store's order (machines first, Swarm last). func groupServices(services []model.Service) []serviceGroup { var groups []serviceGroup index := map[string]int{} for _, s := range services { title := s.AgentName if s.Kind == protocol.KindSwarm { title = "Swarm" } else if title == "" { title = "Unknown agent" } i, ok := index[title] if !ok { i = len(groups) index[title] = i groups = append(groups, serviceGroup{Title: title}) } groups[i].Services = append(groups[i].Services, s) } return groups } // shortRef shortens a digest in an image reference to 12 hex characters. func shortRef(ref string) string { r := imageref.Parse(ref) if hex, ok := strings.CutPrefix(r.Digest, "sha256:"); ok && len(hex) > 12 { r.Digest = "sha256:" + hex[:12] + "…" } return r.String() } type agentRow struct { model.Agent Online bool }