mirror of
https://github.com/weaveworks/scope.git
synced 2026-03-05 03:01:11 +00:00
move shapes determination to the topology
This commit is contained in:
@@ -15,12 +15,6 @@ import (
|
||||
|
||||
// Shapes that are allowed
|
||||
const (
|
||||
Circle = "circle"
|
||||
Square = "square"
|
||||
Heptagon = "heptagon"
|
||||
Hexagon = "hexagon"
|
||||
Cloud = "cloud"
|
||||
|
||||
ImageNameNone = "<none>"
|
||||
|
||||
// Keys we use to render container names
|
||||
@@ -29,18 +23,6 @@ const (
|
||||
MarathonAppIDEnv = "MARATHON_APP_ID"
|
||||
)
|
||||
|
||||
var (
|
||||
shapesByTopology = map[string]string{
|
||||
report.Host: Circle,
|
||||
report.Process: Square,
|
||||
report.Pod: Heptagon,
|
||||
report.Service: Heptagon,
|
||||
report.Container: Hexagon,
|
||||
report.ContainerImage: Hexagon,
|
||||
render.Pseudo: Circle,
|
||||
}
|
||||
)
|
||||
|
||||
// NodeSummaryGroup is a topology-typed group of children for a Node.
|
||||
type NodeSummaryGroup struct {
|
||||
ID string `json:"id"`
|
||||
@@ -102,7 +84,7 @@ func MakeNodeSummary(r report.Report, n report.Node) (NodeSummary, bool) {
|
||||
return renderer(baseNodeSummary(r, n), n)
|
||||
}
|
||||
if strings.HasPrefix(n.Topology, "group:") {
|
||||
return groupNodeSummary(baseNodeSummary(r, n), n)
|
||||
return groupNodeSummary(baseNodeSummary(r, n), r, n)
|
||||
}
|
||||
return NodeSummary{}, false
|
||||
}
|
||||
@@ -142,13 +124,9 @@ func (n NodeSummary) Copy() NodeSummary {
|
||||
}
|
||||
|
||||
func baseNodeSummary(r report.Report, n report.Node) NodeSummary {
|
||||
shape, ok := shapesByTopology[n.Topology]
|
||||
if !ok {
|
||||
shape = Circle
|
||||
}
|
||||
return NodeSummary{
|
||||
ID: n.ID,
|
||||
Shape: shape,
|
||||
Shape: topologyShape(r, n.Topology),
|
||||
Linkable: true,
|
||||
Metadata: NodeMetadata(r, n),
|
||||
Metrics: NodeMetrics(r, n),
|
||||
@@ -168,7 +146,7 @@ func pseudoNodeSummary(base NodeSummary, n report.Node) (NodeSummary, bool) {
|
||||
}[n.ID]; ok {
|
||||
base.Label = template.Label
|
||||
base.LabelMinor = template.LabelMinor
|
||||
base.Shape = Cloud
|
||||
base.Shape = report.Cloud
|
||||
return base, true
|
||||
}
|
||||
|
||||
@@ -176,7 +154,7 @@ func pseudoNodeSummary(base NodeSummary, n report.Node) (NodeSummary, bool) {
|
||||
if strings.HasPrefix(n.ID, render.MakePseudoNodeID(render.UncontainedID)) {
|
||||
base.Label = render.UncontainedMajor
|
||||
base.LabelMinor = report.ExtractHostID(n)
|
||||
base.Shape = Square
|
||||
base.Shape = report.Square
|
||||
base.Stack = true
|
||||
return base, true
|
||||
}
|
||||
@@ -184,7 +162,7 @@ func pseudoNodeSummary(base NodeSummary, n report.Node) (NodeSummary, bool) {
|
||||
// try rendering it as an unmanaged node
|
||||
if strings.HasPrefix(n.ID, render.MakePseudoNodeID(render.UnmanagedID)) {
|
||||
base.Label = render.UnmanagedMajor
|
||||
base.Shape = Square
|
||||
base.Shape = report.Square
|
||||
base.Stack = true
|
||||
base.LabelMinor = report.ExtractHostID(n)
|
||||
return base, true
|
||||
@@ -193,7 +171,7 @@ func pseudoNodeSummary(base NodeSummary, n report.Node) (NodeSummary, bool) {
|
||||
// try rendering it as an endpoint
|
||||
if addr, ok := n.Latest.Lookup(endpoint.Addr); ok {
|
||||
base.Label = addr
|
||||
base.Shape = Circle
|
||||
base.Shape = report.Circle
|
||||
return base, true
|
||||
}
|
||||
|
||||
@@ -308,7 +286,7 @@ func hostNodeSummary(base NodeSummary, n report.Node) (NodeSummary, bool) {
|
||||
|
||||
// groupNodeSummary renders the summary for a group node. n.Topology is
|
||||
// expected to be of the form: group:container:hostname
|
||||
func groupNodeSummary(base NodeSummary, n report.Node) (NodeSummary, bool) {
|
||||
func groupNodeSummary(base NodeSummary, r report.Report, n report.Node) (NodeSummary, bool) {
|
||||
parts := strings.Split(n.Topology, ":")
|
||||
if len(parts) != 3 {
|
||||
return NodeSummary{}, false
|
||||
@@ -331,9 +309,7 @@ func groupNodeSummary(base NodeSummary, n report.Node) (NodeSummary, bool) {
|
||||
}
|
||||
}
|
||||
|
||||
if base.Shape, ok = shapesByTopology[parts[1]]; !ok {
|
||||
base.Shape = Circle
|
||||
}
|
||||
base.Shape = topologyShape(r, parts[1])
|
||||
base.Stack = true
|
||||
return base, true
|
||||
}
|
||||
@@ -397,3 +373,10 @@ func getRenderableContainerName(nmd report.Node) string {
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func topologyShape(r report.Report, topology string) string {
|
||||
if t, ok := r.Topology(topology); ok && t.Shape != "" {
|
||||
return t.Shape
|
||||
}
|
||||
return report.Circle
|
||||
}
|
||||
|
||||
@@ -20,6 +20,13 @@ const (
|
||||
Host = "host"
|
||||
Overlay = "overlay"
|
||||
|
||||
// Shapes used for different nodes
|
||||
Circle = "circle"
|
||||
Square = "square"
|
||||
Heptagon = "heptagon"
|
||||
Hexagon = "hexagon"
|
||||
Cloud = "cloud"
|
||||
|
||||
// Used when counting the number of containers
|
||||
ContainersKey = "containers"
|
||||
)
|
||||
@@ -97,12 +104,12 @@ type Report struct {
|
||||
func MakeReport() Report {
|
||||
return Report{
|
||||
Endpoint: MakeTopology(),
|
||||
Process: MakeTopology(),
|
||||
Container: MakeTopology(),
|
||||
ContainerImage: MakeTopology(),
|
||||
Host: MakeTopology(),
|
||||
Pod: MakeTopology(),
|
||||
Service: MakeTopology(),
|
||||
Process: MakeTopology().WithShape(Square),
|
||||
Container: MakeTopology().WithShape(Hexagon),
|
||||
ContainerImage: MakeTopology().WithShape(Hexagon),
|
||||
Host: MakeTopology().WithShape(Circle),
|
||||
Pod: MakeTopology().WithShape(Heptagon),
|
||||
Service: MakeTopology().WithShape(Heptagon),
|
||||
Overlay: MakeTopology(),
|
||||
Sampling: Sampling{},
|
||||
Window: 0,
|
||||
|
||||
@@ -10,6 +10,7 @@ import (
|
||||
// EdgeMetadatas and Nodes respectively. Edges are directional, and embedded
|
||||
// in the Node struct.
|
||||
type Topology struct {
|
||||
Shape string `json:"shape,omitempty"`
|
||||
Nodes `json:"nodes"`
|
||||
Controls `json:"controls,omitempty"`
|
||||
MetadataTemplates `json:"metadata_templates,omitempty"`
|
||||
@@ -20,6 +21,7 @@ type Topology struct {
|
||||
// MakeTopology gives you a Topology.
|
||||
func MakeTopology() Topology {
|
||||
return Topology{
|
||||
Shape: Circle,
|
||||
Nodes: map[string]Node{},
|
||||
Controls: Controls{},
|
||||
}
|
||||
@@ -29,6 +31,7 @@ func MakeTopology() Topology {
|
||||
// returning a new topology.
|
||||
func (t Topology) WithMetadataTemplates(other MetadataTemplates) Topology {
|
||||
return Topology{
|
||||
Shape: t.Shape,
|
||||
Nodes: t.Nodes.Copy(),
|
||||
Controls: t.Controls.Copy(),
|
||||
MetadataTemplates: t.MetadataTemplates.Merge(other),
|
||||
@@ -41,6 +44,7 @@ func (t Topology) WithMetadataTemplates(other MetadataTemplates) Topology {
|
||||
// returning a new topology.
|
||||
func (t Topology) WithMetricTemplates(other MetricTemplates) Topology {
|
||||
return Topology{
|
||||
Shape: t.Shape,
|
||||
Nodes: t.Nodes.Copy(),
|
||||
Controls: t.Controls.Copy(),
|
||||
MetadataTemplates: t.MetadataTemplates.Copy(),
|
||||
@@ -53,6 +57,7 @@ func (t Topology) WithMetricTemplates(other MetricTemplates) Topology {
|
||||
// returning a new topology.
|
||||
func (t Topology) WithTableTemplates(other TableTemplates) Topology {
|
||||
return Topology{
|
||||
Shape: t.Shape,
|
||||
Nodes: t.Nodes.Copy(),
|
||||
Controls: t.Controls.Copy(),
|
||||
MetadataTemplates: t.MetadataTemplates.Copy(),
|
||||
@@ -61,6 +66,18 @@ func (t Topology) WithTableTemplates(other TableTemplates) Topology {
|
||||
}
|
||||
}
|
||||
|
||||
// WithShape sets the shape nodes of this topology, returning a new topology.
|
||||
func (t Topology) WithShape(shape string) Topology {
|
||||
return Topology{
|
||||
Shape: shape,
|
||||
Nodes: t.Nodes.Copy(),
|
||||
Controls: t.Controls.Copy(),
|
||||
MetadataTemplates: t.MetadataTemplates.Copy(),
|
||||
MetricTemplates: t.MetricTemplates.Copy(),
|
||||
TableTemplates: t.TableTemplates.Copy(),
|
||||
}
|
||||
}
|
||||
|
||||
// AddNode adds node to the topology under key nodeID; if a
|
||||
// node already exists for this key, nmd is merged with that node.
|
||||
// The same topology is returned to enable chaining.
|
||||
@@ -77,6 +94,7 @@ func (t Topology) AddNode(node Node) Topology {
|
||||
// Copy returns a value copy of the Topology.
|
||||
func (t Topology) Copy() Topology {
|
||||
return Topology{
|
||||
Shape: t.Shape,
|
||||
Nodes: t.Nodes.Copy(),
|
||||
Controls: t.Controls.Copy(),
|
||||
MetadataTemplates: t.MetadataTemplates.Copy(),
|
||||
@@ -88,7 +106,13 @@ func (t Topology) Copy() Topology {
|
||||
// Merge merges the other object into this one, and returns the result object.
|
||||
// The original is not modified.
|
||||
func (t Topology) Merge(other Topology) Topology {
|
||||
shape := t.Shape
|
||||
// A circle is the lowliest shape.
|
||||
if shape == Circle {
|
||||
shape = other.Shape
|
||||
}
|
||||
return Topology{
|
||||
Shape: t.Shape,
|
||||
Nodes: t.Nodes.Merge(other.Nodes),
|
||||
Controls: t.Controls.Merge(other.Controls),
|
||||
MetadataTemplates: t.MetadataTemplates.Merge(other.MetadataTemplates),
|
||||
|
||||
Reference in New Issue
Block a user