mirror of
https://github.com/weaveworks/scope.git
synced 2026-03-03 18:20:27 +00:00
When the scope-app restarts, it no longer has a reference to the previous node set. Therefore, the delta update adds *all* nodes but does not remove legacy ones. `reset==true` tells the frontend to start fresh. Fixes #2708
41 lines
829 B
Go
41 lines
829 B
Go
package detailed
|
|
|
|
import (
|
|
"reflect"
|
|
)
|
|
|
|
// Diff is returned by TopoDiff. It represents the changes between two
|
|
// NodeSummary maps.
|
|
type Diff struct {
|
|
Add []NodeSummary `json:"add"`
|
|
Update []NodeSummary `json:"update"`
|
|
Remove []string `json:"remove"`
|
|
Reset bool `json:"reset,omitempty"`
|
|
}
|
|
|
|
// TopoDiff gives you the diff to get from A to B.
|
|
func TopoDiff(a, b NodeSummaries) Diff {
|
|
diff := Diff{Reset: a == nil}
|
|
|
|
notSeen := map[string]struct{}{}
|
|
for k := range a {
|
|
notSeen[k] = struct{}{}
|
|
}
|
|
|
|
for k, node := range b {
|
|
if _, ok := a[k]; !ok {
|
|
diff.Add = append(diff.Add, node)
|
|
} else if !reflect.DeepEqual(node, a[k]) {
|
|
diff.Update = append(diff.Update, node)
|
|
}
|
|
delete(notSeen, k)
|
|
}
|
|
|
|
// leftover keys
|
|
for k := range notSeen {
|
|
diff.Remove = append(diff.Remove, k)
|
|
}
|
|
|
|
return diff
|
|
}
|