Files
opentf/internal/engine/planning/completion_tracker.go
Martin Atkins 4772944e91 engine/planning: Provider instances and stub of data resource planning
This is a sketch of starting and configuring provider instances once they
are needed and then closing them once they are no longer needed. The
stubby implementation of data resource instance planning is there mainly
just to illustrate how this is intended to work, but it's not yet complete
enough to actually function.

Signed-off-by: Martin Atkins <mart@degeneration.co.uk>
2025-10-27 10:15:41 -07:00

83 lines
3.0 KiB
Go

// Copyright (c) The OpenTofu Authors
// SPDX-License-Identifier: MPL-2.0
// Copyright (c) 2023 HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0
package planning
import (
"github.com/opentofu/opentofu/internal/addrs"
"github.com/opentofu/opentofu/internal/engine/lifecycle"
"github.com/opentofu/opentofu/internal/states"
)
// completionTracker is the concrete type of [lifecycle.CompletionTracker] we
// use to track completion during a planning operation.
//
// This uses implementations of [completionEvent] to represent the items that
// need to be completed.
type completionTracker = lifecycle.CompletionTracker[completionEvent]
func (p *planContext) reportResourceInstancePlanCompletion(addr addrs.AbsResourceInstance) {
p.completion.ReportCompletion(resourceInstancePlanningComplete{addr.UniqueKey()})
}
func (p *planContext) reportResourceInstanceDeposedPlanCompletion(addr addrs.AbsResourceInstance, deposedKey states.DeposedKey) {
p.completion.ReportCompletion(resourceInstanceDeposedPlanningComplete{addr.UniqueKey(), deposedKey})
}
func (p *planContext) reportProviderInstanceClosed(addr addrs.AbsProviderInstanceCorrect) {
p.completion.ReportCompletion(providerInstanceClosed{addr.UniqueKey()})
}
// completionEvent is the type we use to represent events in
// a [completionTracker].
//
// All implementations of this interface must be comparable.
type completionEvent interface {
completionEvent()
}
// resourceInstancePlanningComplete represents that we've completed planning
// of a specific resource instance.
//
// Provider instances remain open until all of the resource instances that
// belong to them have completed planning, and ephemeral resource instances
// remain open until all of the other resource instances that depend on them
// have completed planning.
type resourceInstancePlanningComplete struct {
// key MUST be the unique key of an addrs.ResourceInstance.
key addrs.UniqueKey
}
// completionEvent implements completionEvent.
func (r resourceInstancePlanningComplete) completionEvent() {}
// resourceInstanceDeposedPlanningComplete is like
// [resourceInstancePlanningComplete] but for "deposed" objects, rather than
// for "current" objects.
type resourceInstanceDeposedPlanningComplete struct {
// key MUST be the unique key of an addrs.ResourceInstance.
instKey addrs.UniqueKey
// deposedKey is the DeposedKey of the deposed object whose planning
// is being tracked.
deposedKey states.DeposedKey
}
// completionEvent implements completionEvent.
func (r resourceInstanceDeposedPlanningComplete) completionEvent() {}
// providerInstanceClosed represents that a previously-opened provider
// instance has now been closed.
//
// Ephemeral resource instances remain open until all of the provider instances
// that depend on them have been closed.
type providerInstanceClosed struct {
// key MUST be the unique key of an addrs.AbsProviderInstanceCorrect.
key addrs.UniqueKey
}
// completionEvent implements completionEvent.
func (r providerInstanceClosed) completionEvent() {}