mirror of
https://github.com/opentffoundation/opentf.git
synced 2026-03-20 22:01:25 -04:00
The original motivation here was to implement the special case of making a synthetic plan without calling into the provider when the desired state is absent and the provider hasn't opted in to planning to destroy objects. This case needs to be opted in because older providers will crash if asked to plan with the config value or proposed value set to null. However, there was already far too much code duplicated across both the planning engine and the apply engine's "final plan" operation, and so this seemed like a good prompt to finally resolve those TODO comments and factor out the shared planning logic into a separate place that both can depend on. The new package "resources" is intended to grow into the home for all of these resource-related operations that each wrap a lower-level provider call but also perform preparation or followup actions such as making sure the provider's response is valid according to the requirements of the plugin protocol. For now it only includes config validation and planning for managed resources, but is designed to grow to include other similar operations in future. The most likely next step is to add a method for applying a previously-created plan, which would replace a bunch of the code in the apply engine's implementation of the "ManagedApply" operation. Currently the way this integrates with the rest of the provider-related infrastructure is a little awkward. We can hopefully improve on that in future, but for now the priority was to avoid this becoming yet another sprawling architecture change that would be hard to review. Once we feel like we've achieved the "walking skeleton" milestone for the new runtime we can think about how we want to tidy up the rough edges between the different components of this new design. As has become tradition for these new codepaths, this is designed to be independently testable but not yet actually tested because we want to wait and see how all of this code settles before we start writing tests that would then make it harder to refactor as we learn more. Signed-off-by: Martin Atkins <mart@degeneration.co.uk>
28 lines
810 B
Go
28 lines
810 B
Go
// Copyright (c) The OpenTofu Authors
|
|
// SPDX-License-Identifier: MPL-2.0
|
|
// Copyright (c) 2023 HashiCorp, Inc.
|
|
// SPDX-License-Identifier: MPL-2.0
|
|
|
|
package resources
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/zclconf/go-cty/cty"
|
|
|
|
"github.com/opentofu/opentofu/internal/providers"
|
|
"github.com/opentofu/opentofu/internal/tfdiags"
|
|
)
|
|
|
|
// ValidateConfig asks the provider whether the given value is valid.
|
|
//
|
|
// The given value should already conform to the schema of the resource type.
|
|
func (rt *ManagedResourceType) ValidateConfig(ctx context.Context, configVal cty.Value) tfdiags.Diagnostics {
|
|
configValUnmarked, _ := configVal.UnmarkDeep()
|
|
resp := rt.client.ValidateResourceConfig(ctx, providers.ValidateResourceConfigRequest{
|
|
TypeName: rt.typeName,
|
|
Config: configValUnmarked,
|
|
})
|
|
return resp.Diagnostics
|
|
}
|