in pkg/cloud/rgraph/workflow/plan/plan.go [131:172]
func (pl *planner) propagateRecreates() error {
var recreateNodes []rnode.Node
for _, n := range pl.want.All() {
if n.Plan().Op() == rnode.OpRecreate {
recreateNodes = append(recreateNodes, n)
}
}
done := map[cloud.ResourceMapKey]bool{}
for _, n := range recreateNodes {
done[n.ID().MapKey()] = true
inRefNodes, err := traversal.TransitiveInRefs(pl.want, n)
if err != nil {
return err
}
for _, inRefNode := range inRefNodes {
if done[inRefNode.ID().MapKey()] {
continue
}
done[inRefNode.ID().MapKey()] = true
if inRefNode.Ownership() != rnode.OwnershipManaged {
return fmt.Errorf("%s: %v planned for recreate, but inRef %v ownership=%s", errPrefix, n.ID(), inRefNode.ID(), inRefNode.Ownership())
}
switch inRefNode.Plan().Op() {
case rnode.OpCreate, rnode.OpRecreate, rnode.OpDelete:
// Resource is already being created or destroy.
case rnode.OpNothing, rnode.OpUpdate:
inRefNode.Plan().Set(rnode.PlanDetails{
Operation: rnode.OpRecreate,
Why: fmt.Sprintf("Dependency %v is being recreated", n.ID()),
})
default:
return fmt.Errorf("%s: inRef %s has invalid op %s, can't propagate recreate", errPrefix, inRefNode.ID(), inRefNode.Plan().Op())
}
}
}
return nil
}