mirror of
https://github.com/opentffoundation/opentf.git
synced 2025-12-23 03:34:30 -05:00
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>
83 lines
3.0 KiB
Go
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() {}
|