1
0
Fork 0
mirror of https://github.com/moby/moby.git synced 2022-11-09 12:21:53 -05:00
moby--moby/vendor/github.com/moby/swarmkit/v2/manager/scheduler/topology.go
Cory Snider 1c129103b4 Bump swarmkit to v2
Signed-off-by: Cory Snider <csnider@mirantis.com>
2022-04-21 17:33:07 -04:00

47 lines
1.8 KiB
Go

package scheduler
import (
"github.com/moby/swarmkit/v2/api"
)
// IsInTopology takes a Topology `top` (which is reported by a Node) and a list
// of Topologies `accessible` (which comes from a created volume, in the form
// of the AccessibleTopology) and returns true if `top` lies within
// `accessible` (meaning a node with that Topology can access a volume with
// that AccessibleTopology).
//
// In order for `top` to lie within `accessible`, there must exist a topology
// in `accessible` such that for every subdomain/segment pair in that topology,
// there exists an equivalent subdomain/segment pair in `top`.
//
// For examples, see the test for this function.
//
// NOTE(dperny): It is unclear whether a topology can be partial. For example,
// can an accessible topology contain only a "region" subdomain, without a
// "zone" subdomain? This function assumes yes.
func IsInTopology(top *api.Topology, accessible []*api.Topology) bool {
// if any part of the topology equation is missing, then this does fit.
if top == nil || accessible == nil || len(accessible) == 0 {
return true
}
// go through each accessible topology
topologies:
for _, topology := range accessible {
// and for each topology, go through every segment
for subdomain, segment := range topology.Segments {
// if the segment for this subdomain is different in the `top`,
// then, `top` does not lie within this topology.
if top.Segments[subdomain] != segment {
// go to the next topology in the list
continue topologies
}
}
// if we get through all of the segments specified in this topology,
// and they have all matched, then `top` lies within `accessible`.
return true
}
// if we have iterated through all topologies, and never once finished
// iterating through all topological segments, then `top` does not lie
// within `accessible`.
return false
}