func()

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
}