diff --git a/topology/server/service/service.go b/topology/server/service/service.go index ade00f8a699846d0012b2cf837c162fd786add24..e1d7aa90edb9ead749dfbeee9e4c7e6d5e82abee 100644 --- a/topology/server/service/service.go +++ b/topology/server/service/service.go @@ -1,6 +1,7 @@ package service import ( + "fmt" "strings" "gitee.com/openeuler/PilotGo-plugin-topology-server/meta" @@ -92,16 +93,43 @@ func MultiHostService() ([]*meta.Node, []*meta.Edge, []error, []error) { } } + hostids := []string{} multi_nodes := []*meta.Node{} for _, node := range nodes.Nodes { if node.Type == "host" { multi_nodes = append(multi_nodes, node) + hostids = append(hostids, node.ID) } } + // ttcode + fmt.Printf("\033[32mhostids\033[0m: %v\n", hostids) + multi_edges := []*meta.Edge{} for _, edge := range edges.Edges { - if edge.Type == "server" || edge.Type == "client" || edge.Type == "tcp" || edge.Type == "udp" { + if edge.Type == "tcp" || edge.Type == "udp" { + multi_edges = append(multi_edges, edge) + + repeat_src := false + repeat_dst := false + for _, node := range multi_nodes { + if node.ID == nodes.Lookup[edge.Src].ID { + repeat_src = true + } + + if node.ID == nodes.Lookup[edge.Dst].ID { + repeat_dst = true + } + } + + if !repeat_src { + multi_nodes = append(multi_nodes, nodes.Lookup[edge.Src]) + } + + if !repeat_dst { + multi_nodes = append(multi_nodes, nodes.Lookup[edge.Dst]) + } + } else if edge.Type == "server" || edge.Type == "client" { multi_edges = append(multi_edges, edge) repeat_src := false @@ -124,6 +152,80 @@ func MultiHostService() ([]*meta.Node, []*meta.Edge, []error, []error) { multi_nodes = append(multi_nodes, nodes.Lookup[edge.Dst]) } + // 添加process-to-process、process-to-host edge + start_nodeid := edge.Dst + for { + if nodes.Lookup[start_nodeid].Metrics["Ppid"] != "1" { + // 添加 process-to-process edge + edgeid := start_nodeid + "_belong_" + nodes.Lookup[start_nodeid].UUID + "_process_" + nodes.Lookup[start_nodeid].Metrics["Ppid"] + edge1, ok := edges.Lookup.Load(edgeid) + if !ok { + fmt.Printf("%+v\n", errors.Errorf("faild to load edge from edges.lookup: %s**2", edgeid)) + } + + repeat_edge := false + for _, edge2 := range multi_edges { + if edge2.ID == edge1.(*meta.Edge).ID { + repeat_edge = true + } + } + + if !repeat_edge { + multi_edges = append(multi_edges, edge1.(*meta.Edge)) + } + + start_nodeid = nodes.Lookup[start_nodeid].UUID + "_process_" + nodes.Lookup[start_nodeid].Metrics["Ppid"] + + continue + } + + // 添加 process-to-1 edge + edgeid_to_1 := start_nodeid + "_belong_" + nodes.Lookup[start_nodeid].UUID + "_process_" + nodes.Lookup[start_nodeid].Metrics["Ppid"] + edge_to_1, ok := edges.Lookup.Load(edgeid_to_1) + if !ok { + fmt.Printf("%+v\n", errors.Errorf("faild to load edge from edges.lookup: %s**2", edgeid_to_1)) + } + + repeat_edge_to_1 := false + for _, edge2 := range multi_edges { + if edge2.ID == edge_to_1.(*meta.Edge).ID { + repeat_edge_to_1 = true + } + } + + if !repeat_edge_to_1 { + multi_edges = append(multi_edges, edge_to_1.(*meta.Edge)) + } + + // 添加 1-to-host edge + start_nodeid = nodes.Lookup[start_nodeid].UUID + "_process_" + nodes.Lookup[start_nodeid].Metrics["Ppid"] + edgeid_to_host := "" + for _, hostid := range hostids { + if nodes.Lookup[start_nodeid].UUID == nodes.Lookup[hostid].UUID { + edgeid_to_host = start_nodeid + "_belong_" + nodes.Lookup[hostid].ID + break + } + } + + edge_to_host, ok := edges.Lookup.Load(edgeid_to_host) + if !ok { + fmt.Printf("%+v\n", errors.Errorf("faild to load edge from edges.lookup: %s**2", edgeid_to_host)) + } + + repeat_edge_to_host := false + for _, edge2 := range multi_edges { + if edge2.ID == edge_to_host.(*meta.Edge).ID { + repeat_edge_to_host = true + } + } + + if !repeat_edge_to_host { + multi_edges = append(multi_edges, edge_to_host.(*meta.Edge)) + } + + break + } + } }