DependingOn transitivity
This commit is contained in:
parent
d99bc5e908
commit
b52bb7dd4f
|
@ -32,21 +32,23 @@ func (dg *DependencyGraph) DependingOn(res *resource.State,
|
||||||
dependentSet[res.URN] = true
|
dependentSet[res.URN] = true
|
||||||
|
|
||||||
isDependent := func(candidate *resource.State) bool {
|
isDependent := func(candidate *resource.State) bool {
|
||||||
if ignore[candidate.URN] {
|
// Direct deps include explicit `Dependencies`,
|
||||||
return false
|
// provider, and parent (under `includeChildren=true`
|
||||||
}
|
// semantic).
|
||||||
if includeChildren && candidate.Parent == res.URN {
|
directDeps := candidate.Dependencies
|
||||||
return true
|
|
||||||
}
|
|
||||||
for _, dependency := range candidate.Dependencies {
|
|
||||||
if dependentSet[dependency] {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if candidate.Provider != "" {
|
if candidate.Provider != "" {
|
||||||
ref, err := providers.ParseReference(candidate.Provider)
|
ref, err := providers.ParseReference(candidate.Provider)
|
||||||
contract.Assert(err == nil)
|
contract.Assert(err == nil)
|
||||||
if dependentSet[ref.URN()] {
|
directDeps = append(directDeps, ref.URN())
|
||||||
|
}
|
||||||
|
if includeChildren && candidate.Parent != "" {
|
||||||
|
directDeps = append(directDeps, candidate.Parent)
|
||||||
|
}
|
||||||
|
|
||||||
|
// We are computing a transitive closure of direct
|
||||||
|
// deps; therefore check in `dependentSet`.
|
||||||
|
for _, dependency := range directDeps {
|
||||||
|
if dependentSet[dependency] {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -229,3 +229,41 @@ func TestDependenciesOfRemoteComponentsNoCycle(t *testing.T) {
|
||||||
assert.True(t, rDependencies[parent])
|
assert.True(t, rDependencies[parent])
|
||||||
assert.False(t, rDependencies[child])
|
assert.False(t, rDependencies[child])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func NewCustomResource(name string, provider *resource.State, deps ...resource.URN) *resource.State {
|
||||||
|
r := NewResource(name, provider, deps...)
|
||||||
|
r.Custom = true
|
||||||
|
return r
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestDependingOnIndirect(t *testing.T) {
|
||||||
|
var noProvider *resource.State
|
||||||
|
|
||||||
|
d2 := NewCustomResource("d2", noProvider)
|
||||||
|
d3 := NewCustomResource("d3", noProvider, d2.URN)
|
||||||
|
c3 := NewCustomResource("c3", noProvider)
|
||||||
|
c3.Parent = d3.URN
|
||||||
|
|
||||||
|
dg := NewDependencyGraph([]*resource.State{
|
||||||
|
d2, d3, c3,
|
||||||
|
})
|
||||||
|
|
||||||
|
for r := range dg.DependenciesOf(c3) {
|
||||||
|
t.Logf("dg.DependenciesOf(c3) includes %v", r.URN)
|
||||||
|
}
|
||||||
|
|
||||||
|
for r := range dg.DependenciesOf(d3) {
|
||||||
|
t.Logf("dg.DependenciesOf(d3) includes %v", r.URN)
|
||||||
|
}
|
||||||
|
|
||||||
|
var foundC3 bool
|
||||||
|
for _, r := range dg.DependingOn(d2, nil, true) {
|
||||||
|
if r == c3 {
|
||||||
|
foundC3 = true
|
||||||
|
}
|
||||||
|
t.Logf("DependingOn(d2) includes %v", r.URN)
|
||||||
|
}
|
||||||
|
if !foundC3 {
|
||||||
|
t.Errorf("DependingOn(d2, nil) should have included c3")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue