pkg/skoop/ui/json.go (117 lines of code) (raw):

package ui import ( "github.com/alibaba/kubeskoop/pkg/skoop/model" "k8s.io/apimachinery/pkg/util/json" ) type DiagnoseSummarySuspicion struct { Level model.SuspicionLevel `json:"level"` Message string `json:"message"` } type DiagnoseSummaryNodeAction struct { Type model.ActionType `json:"type"` } type DiagnoseSummaryNode struct { ID string `json:"id"` Type model.NetNodeType `json:"type"` Suspicions []DiagnoseSummarySuspicion `json:"suspicions"` Actions map[string]DiagnoseSummaryNodeAction `json:"actions"` } type DiagnoseSummaryPacket struct { Src string `json:"source"` Dst string `json:"destination"` Dport uint16 `json:"dport"` Protocol model.Protocol `json:"protocol"` } type DiagnoseSummaryLink struct { ID string `json:"id"` Source string `json:"source"` SourceAttribute map[string]string `json:"source_attributes"` DestinationAttribute map[string]string `json:"destination_attributes"` Destination string `json:"destination"` Type model.LinkType `json:"type"` ActionType model.ActionType `json:"action"` Packet DiagnoseSummaryPacket `json:"packet"` } type DiagnoseSummaryCluster struct { Suspicions []DiagnoseSummarySuspicion `json:"suspicions"` } type DiagnoseSummary struct { Cluster DiagnoseSummaryCluster `json:"cluster"` Nodes []DiagnoseSummaryNode `json:"nodes"` Links []DiagnoseSummaryLink `json:"links"` } type JSONFormatter struct { globalSuspicions []model.Suspicion p *model.PacketPath } func NewJSONFormatter(globalSuspicions []model.Suspicion, p *model.PacketPath) *JSONFormatter { return &JSONFormatter{globalSuspicions: globalSuspicions, p: p} } func (f *JSONFormatter) ToJSON() ([]byte, error) { summary, err := f.toSummary() if err != nil { return nil, err } return json.Marshal(&summary) } func (f *JSONFormatter) toSummary() (*DiagnoseSummary, error) { summary := &DiagnoseSummary{ Cluster: DiagnoseSummaryCluster{Suspicions: []DiagnoseSummarySuspicion{}}, } for _, sus := range f.globalSuspicions { summary.Cluster.Suspicions = append(summary.Cluster.Suspicions, DiagnoseSummarySuspicion{ Level: sus.Level, Message: sus.Message, }) } for _, node := range f.p.Nodes() { n := DiagnoseSummaryNode{ ID: node.GetID(), Type: node.GetType(), Suspicions: nil, Actions: map[string]DiagnoseSummaryNodeAction{}, } for _, suspicion := range node.GetSuspicions() { n.Suspicions = append(n.Suspicions, DiagnoseSummarySuspicion{ Level: suspicion.Level, Message: suspicion.Message, }) } for link, action := range node.Actions { n.Actions[link.GetID()] = DiagnoseSummaryNodeAction{ Type: action.Type, } } initiative := node.ActionOf(nil) if initiative != nil { n.Actions[""] = DiagnoseSummaryNodeAction{ Type: initiative.Type, } } summary.Nodes = append(summary.Nodes, n) } for _, link := range f.p.Links() { l := DiagnoseSummaryLink{ ID: link.GetID(), Type: link.Type, Destination: link.Destination.GetID(), Packet: DiagnoseSummaryPacket{ Src: link.Packet.Src.String(), Dst: link.Packet.Dst.String(), Dport: link.Packet.Dport, Protocol: link.Packet.Protocol, // todo: encapped packet }, } if link.Source != nil { l.Source = link.Source.GetID() } if link.SourceAttribute != nil { l.SourceAttribute = link.SourceAttribute.GetAttrs() } if link.DestinationAttribute != nil { l.DestinationAttribute = link.DestinationAttribute.GetAttrs() } summary.Links = append(summary.Links, l) } return summary, nil }