mirror of
https://github.com/opentffoundation/opentf.git
synced 2025-12-19 17:59:05 -05:00
providers: Interface now requires context.Context arguments
Continuing our work to gradually plumb context.Context to everywhere that we want to generate OpenTelemetry traces, this completes the call path for most (but not all) of the gRPC requests to provider plugins, so that we can add OpenTelemetry trace instrumentation in a future commit. Unfortunately there are still a few providers.Interface callers left in functions that don't have context.Context plumbed to them yet, and so those are temporarily stubbed as context.TODO() here so we can more easily find and complete them later. The two gRPC implementations of providers.Interface were previously making provider requests using a single context.Context established at the time the provider process was started, but that isn't an appropriate context to use for per-request concerns like tracing, so that context is now unused and could potentially be removed in a future commit, but this change already got pretty large and so I intend to deal with that separately later. This now exposes the gRPC provider calls to potential context cancellation that they would previously observe only indirectly though the Stop method. Since Stop is primarily used for graceful shutdown of ApplyResourceChange, the changes here explicitly disconnect the cancellation signal for ApplyResourceChange in particular, while letting the others get canceled in the normal way since they are expected to be free of significant side-effects. In future work we could consider removing Stop from the internal API entirely and keeping it only as an implementation detail of the gRPC implementation of this interface, with ApplyResourceChange directly reacting to context cancellation and sending the gRPC Stop call itself, but again that's too much change for this already-large commit. The internal/legacy package currently contains some legacy code preserved for the benefit of the backends, and unfortunately contains more than is strictly necessary to support those callers, and so there was some dead code there that also needed updating. provider_mock.go is removed entirely because it's just an older copy of the similar file in package tofu. The few calls to providers in schemas.go are updated to use context.Background() rather than context.TODO() because we have no intention of plumbing context.Context into that legacy code, and will hopefully just delete it wholesale one day. Signed-off-by: Martin Atkins <mart@degeneration.co.uk>
This commit is contained in:
@@ -6,6 +6,7 @@
|
||||
package tf
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"log"
|
||||
"strings"
|
||||
@@ -37,7 +38,7 @@ func (p *Provider) getFunctionSpecs() map[string]providers.FunctionSpec {
|
||||
}
|
||||
|
||||
// GetSchema returns the complete schema for the provider.
|
||||
func (p *Provider) GetProviderSchema() providers.GetProviderSchemaResponse {
|
||||
func (p *Provider) GetProviderSchema(_ context.Context) providers.GetProviderSchemaResponse {
|
||||
return providers.GetProviderSchemaResponse{
|
||||
DataSources: map[string]providers.Schema{
|
||||
"terraform_remote_state": dataSourceRemoteStateGetSchema(),
|
||||
@@ -50,7 +51,7 @@ func (p *Provider) GetProviderSchema() providers.GetProviderSchemaResponse {
|
||||
}
|
||||
|
||||
// ValidateProviderConfig is used to validate the configuration values.
|
||||
func (p *Provider) ValidateProviderConfig(req providers.ValidateProviderConfigRequest) providers.ValidateProviderConfigResponse {
|
||||
func (p *Provider) ValidateProviderConfig(_ context.Context, req providers.ValidateProviderConfigRequest) providers.ValidateProviderConfigResponse {
|
||||
// At this moment there is nothing to configure for the tofu provider,
|
||||
// so we will happily return without taking any action
|
||||
var res providers.ValidateProviderConfigResponse
|
||||
@@ -59,7 +60,7 @@ func (p *Provider) ValidateProviderConfig(req providers.ValidateProviderConfigRe
|
||||
}
|
||||
|
||||
// ValidateDataResourceConfig is used to validate the data source configuration values.
|
||||
func (p *Provider) ValidateDataResourceConfig(req providers.ValidateDataResourceConfigRequest) providers.ValidateDataResourceConfigResponse {
|
||||
func (p *Provider) ValidateDataResourceConfig(_ context.Context, req providers.ValidateDataResourceConfigRequest) providers.ValidateDataResourceConfigResponse {
|
||||
// FIXME: move the backend configuration validate call that's currently
|
||||
// inside the read method into here so that we can catch provider configuration
|
||||
// errors in tofu validate as well as during tofu plan.
|
||||
@@ -78,7 +79,7 @@ func (p *Provider) ValidateDataResourceConfig(req providers.ValidateDataResource
|
||||
}
|
||||
|
||||
// Configure configures and initializes the provider.
|
||||
func (p *Provider) ConfigureProvider(providers.ConfigureProviderRequest) providers.ConfigureProviderResponse {
|
||||
func (p *Provider) ConfigureProvider(context.Context, providers.ConfigureProviderRequest) providers.ConfigureProviderResponse {
|
||||
// At this moment there is nothing to configure for the terraform provider,
|
||||
// so we will happily return without taking any action
|
||||
var res providers.ConfigureProviderResponse
|
||||
@@ -86,11 +87,11 @@ func (p *Provider) ConfigureProvider(providers.ConfigureProviderRequest) provide
|
||||
}
|
||||
|
||||
// ReadDataSource returns the data source's current state.
|
||||
func (p *Provider) ReadDataSource(req providers.ReadDataSourceRequest) providers.ReadDataSourceResponse {
|
||||
func (p *Provider) ReadDataSource(_ context.Context, req providers.ReadDataSourceRequest) providers.ReadDataSourceResponse {
|
||||
panic("Should not be called directly, special case for terraform_remote_state")
|
||||
}
|
||||
|
||||
func (p *Provider) ReadDataSourceEncrypted(req providers.ReadDataSourceRequest, path addrs.AbsResourceInstance, enc encryption.Encryption) providers.ReadDataSourceResponse {
|
||||
func (p *Provider) ReadDataSourceEncrypted(_ context.Context, req providers.ReadDataSourceRequest, path addrs.AbsResourceInstance, enc encryption.Encryption) providers.ReadDataSourceResponse {
|
||||
// call function
|
||||
var res providers.ReadDataSourceResponse
|
||||
|
||||
@@ -125,7 +126,7 @@ func (p *Provider) ReadDataSourceEncrypted(req providers.ReadDataSourceRequest,
|
||||
}
|
||||
|
||||
// Stop is called when the provider should halt any in-flight actions.
|
||||
func (p *Provider) Stop() error {
|
||||
func (p *Provider) Stop(_ context.Context) error {
|
||||
log.Println("[DEBUG] terraform provider cannot Stop")
|
||||
return nil
|
||||
}
|
||||
@@ -138,30 +139,30 @@ func (p *Provider) Stop() error {
|
||||
// instance state whose schema version is less than the one reported by the
|
||||
// currently-used version of the corresponding provider, and the upgraded
|
||||
// result is used for any further processing.
|
||||
func (p *Provider) UpgradeResourceState(req providers.UpgradeResourceStateRequest) providers.UpgradeResourceStateResponse {
|
||||
func (p *Provider) UpgradeResourceState(_ context.Context, req providers.UpgradeResourceStateRequest) providers.UpgradeResourceStateResponse {
|
||||
return upgradeDataStoreResourceState(req)
|
||||
}
|
||||
|
||||
// ReadResource refreshes a resource and returns its current state.
|
||||
func (p *Provider) ReadResource(req providers.ReadResourceRequest) providers.ReadResourceResponse {
|
||||
func (p *Provider) ReadResource(_ context.Context, req providers.ReadResourceRequest) providers.ReadResourceResponse {
|
||||
return readDataStoreResourceState(req)
|
||||
}
|
||||
|
||||
// PlanResourceChange takes the current state and proposed state of a
|
||||
// resource, and returns the planned final state.
|
||||
func (p *Provider) PlanResourceChange(req providers.PlanResourceChangeRequest) providers.PlanResourceChangeResponse {
|
||||
func (p *Provider) PlanResourceChange(_ context.Context, req providers.PlanResourceChangeRequest) providers.PlanResourceChangeResponse {
|
||||
return planDataStoreResourceChange(req)
|
||||
}
|
||||
|
||||
// ApplyResourceChange takes the planned state for a resource, which may
|
||||
// yet contain unknown computed values, and applies the changes returning
|
||||
// the final state.
|
||||
func (p *Provider) ApplyResourceChange(req providers.ApplyResourceChangeRequest) providers.ApplyResourceChangeResponse {
|
||||
func (p *Provider) ApplyResourceChange(_ context.Context, req providers.ApplyResourceChangeRequest) providers.ApplyResourceChangeResponse {
|
||||
return applyDataStoreResourceChange(req)
|
||||
}
|
||||
|
||||
// ImportResourceState requests that the given resource be imported.
|
||||
func (p *Provider) ImportResourceState(req providers.ImportResourceStateRequest) providers.ImportResourceStateResponse {
|
||||
func (p *Provider) ImportResourceState(_ context.Context, req providers.ImportResourceStateRequest) providers.ImportResourceStateResponse {
|
||||
if req.TypeName == "terraform_data" {
|
||||
return importDataStore(req)
|
||||
}
|
||||
@@ -172,22 +173,22 @@ func (p *Provider) ImportResourceState(req providers.ImportResourceStateRequest)
|
||||
// MoveResourceState is called when the state loader encounters an instance state
|
||||
// that has been moved to a new type, and the state should be updated to reflect the change.
|
||||
// This is used to move the old state to the new schema.
|
||||
func (p *Provider) MoveResourceState(r providers.MoveResourceStateRequest) (resp providers.MoveResourceStateResponse) {
|
||||
func (p *Provider) MoveResourceState(_ context.Context, r providers.MoveResourceStateRequest) (resp providers.MoveResourceStateResponse) {
|
||||
return moveDataStoreResourceState(r)
|
||||
}
|
||||
|
||||
// ValidateResourceConfig is used to validate the resource configuration values.
|
||||
func (p *Provider) ValidateResourceConfig(req providers.ValidateResourceConfigRequest) providers.ValidateResourceConfigResponse {
|
||||
func (p *Provider) ValidateResourceConfig(_ context.Context, req providers.ValidateResourceConfigRequest) providers.ValidateResourceConfigResponse {
|
||||
return validateDataStoreResourceConfig(req)
|
||||
}
|
||||
|
||||
func (p *Provider) GetFunctions() providers.GetFunctionsResponse {
|
||||
func (p *Provider) GetFunctions(_ context.Context) providers.GetFunctionsResponse {
|
||||
return providers.GetFunctionsResponse{
|
||||
Functions: p.getFunctionSpecs(),
|
||||
}
|
||||
}
|
||||
|
||||
func (p *Provider) CallFunction(r providers.CallFunctionRequest) providers.CallFunctionResponse {
|
||||
func (p *Provider) CallFunction(_ context.Context, r providers.CallFunctionRequest) providers.CallFunctionResponse {
|
||||
fn, ok := p.funcs[r.Name]
|
||||
if !ok {
|
||||
return providers.CallFunctionResponse{
|
||||
@@ -202,7 +203,7 @@ func (p *Provider) CallFunction(r providers.CallFunctionRequest) providers.CallF
|
||||
}
|
||||
|
||||
// Close is a noop for this provider, since it's run in-process.
|
||||
func (p *Provider) Close() error {
|
||||
func (p *Provider) Close(_ context.Context) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
package jsonformat
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"testing"
|
||||
|
||||
@@ -159,7 +160,7 @@ func testSchemas() *tofu.Schemas {
|
||||
provider := testProvider()
|
||||
return &tofu.Schemas{
|
||||
Providers: map[addrs.Provider]providers.ProviderSchema{
|
||||
addrs.NewDefaultProvider("test"): provider.GetProviderSchema(),
|
||||
addrs.NewDefaultProvider("test"): provider.GetProviderSchema(context.TODO()),
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,7 +39,7 @@ func TestInternalProviders(t *testing.T) {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
schema := tfProvider.GetProviderSchema()
|
||||
schema := tfProvider.GetProviderSchema(t.Context())
|
||||
_, found := schema.DataSources["terraform_remote_state"]
|
||||
if !found {
|
||||
t.Errorf("didn't find terraform_remote_state in internal \"terraform\" provider")
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
package views
|
||||
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
|
||||
"github.com/opentofu/opentofu/internal/addrs"
|
||||
@@ -136,7 +137,7 @@ func testSchemas() *tofu.Schemas {
|
||||
provider := testProvider()
|
||||
return &tofu.Schemas{
|
||||
Providers: map[addrs.Provider]providers.ProviderSchema{
|
||||
addrs.NewDefaultProvider("test"): provider.GetProviderSchema(),
|
||||
addrs.NewDefaultProvider("test"): provider.GetProviderSchema(context.TODO()),
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@ import (
|
||||
func Provider(p providers.Interface) tfplugin5.ProviderServer {
|
||||
return &provider{
|
||||
provider: p,
|
||||
schema: p.GetProviderSchema(),
|
||||
schema: p.GetProviderSchema(context.TODO()),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -74,7 +74,7 @@ func (p *provider) GetSchema(_ context.Context, req *tfplugin5.GetProviderSchema
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
func (p *provider) PrepareProviderConfig(_ context.Context, req *tfplugin5.PrepareProviderConfig_Request) (*tfplugin5.PrepareProviderConfig_Response, error) {
|
||||
func (p *provider) PrepareProviderConfig(ctx context.Context, req *tfplugin5.PrepareProviderConfig_Request) (*tfplugin5.PrepareProviderConfig_Response, error) {
|
||||
resp := &tfplugin5.PrepareProviderConfig_Response{}
|
||||
ty := p.schema.Provider.Block.ImpliedType()
|
||||
|
||||
@@ -84,7 +84,7 @@ func (p *provider) PrepareProviderConfig(_ context.Context, req *tfplugin5.Prepa
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
prepareResp := p.provider.ValidateProviderConfig(providers.ValidateProviderConfigRequest{
|
||||
prepareResp := p.provider.ValidateProviderConfig(ctx, providers.ValidateProviderConfigRequest{
|
||||
Config: configVal,
|
||||
})
|
||||
|
||||
@@ -93,7 +93,7 @@ func (p *provider) PrepareProviderConfig(_ context.Context, req *tfplugin5.Prepa
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
func (p *provider) ValidateResourceTypeConfig(_ context.Context, req *tfplugin5.ValidateResourceTypeConfig_Request) (*tfplugin5.ValidateResourceTypeConfig_Response, error) {
|
||||
func (p *provider) ValidateResourceTypeConfig(ctx context.Context, req *tfplugin5.ValidateResourceTypeConfig_Request) (*tfplugin5.ValidateResourceTypeConfig_Response, error) {
|
||||
resp := &tfplugin5.ValidateResourceTypeConfig_Response{}
|
||||
ty := p.schema.ResourceTypes[req.TypeName].Block.ImpliedType()
|
||||
|
||||
@@ -103,7 +103,7 @@ func (p *provider) ValidateResourceTypeConfig(_ context.Context, req *tfplugin5.
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
validateResp := p.provider.ValidateResourceConfig(providers.ValidateResourceConfigRequest{
|
||||
validateResp := p.provider.ValidateResourceConfig(ctx, providers.ValidateResourceConfigRequest{
|
||||
TypeName: req.TypeName,
|
||||
Config: configVal,
|
||||
})
|
||||
@@ -112,7 +112,7 @@ func (p *provider) ValidateResourceTypeConfig(_ context.Context, req *tfplugin5.
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
func (p *provider) ValidateDataSourceConfig(_ context.Context, req *tfplugin5.ValidateDataSourceConfig_Request) (*tfplugin5.ValidateDataSourceConfig_Response, error) {
|
||||
func (p *provider) ValidateDataSourceConfig(ctx context.Context, req *tfplugin5.ValidateDataSourceConfig_Request) (*tfplugin5.ValidateDataSourceConfig_Response, error) {
|
||||
resp := &tfplugin5.ValidateDataSourceConfig_Response{}
|
||||
ty := p.schema.DataSources[req.TypeName].Block.ImpliedType()
|
||||
|
||||
@@ -122,7 +122,7 @@ func (p *provider) ValidateDataSourceConfig(_ context.Context, req *tfplugin5.Va
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
validateResp := p.provider.ValidateDataResourceConfig(providers.ValidateDataResourceConfigRequest{
|
||||
validateResp := p.provider.ValidateDataResourceConfig(ctx, providers.ValidateDataResourceConfigRequest{
|
||||
TypeName: req.TypeName,
|
||||
Config: configVal,
|
||||
})
|
||||
@@ -131,11 +131,11 @@ func (p *provider) ValidateDataSourceConfig(_ context.Context, req *tfplugin5.Va
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
func (p *provider) UpgradeResourceState(_ context.Context, req *tfplugin5.UpgradeResourceState_Request) (*tfplugin5.UpgradeResourceState_Response, error) {
|
||||
func (p *provider) UpgradeResourceState(ctx context.Context, req *tfplugin5.UpgradeResourceState_Request) (*tfplugin5.UpgradeResourceState_Response, error) {
|
||||
resp := &tfplugin5.UpgradeResourceState_Response{}
|
||||
ty := p.schema.ResourceTypes[req.TypeName].Block.ImpliedType()
|
||||
|
||||
upgradeResp := p.provider.UpgradeResourceState(providers.UpgradeResourceStateRequest{
|
||||
upgradeResp := p.provider.UpgradeResourceState(ctx, providers.UpgradeResourceStateRequest{
|
||||
TypeName: req.TypeName,
|
||||
Version: req.Version,
|
||||
RawStateJSON: req.RawState.Json,
|
||||
@@ -157,7 +157,7 @@ func (p *provider) UpgradeResourceState(_ context.Context, req *tfplugin5.Upgrad
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
func (p *provider) Configure(_ context.Context, req *tfplugin5.Configure_Request) (*tfplugin5.Configure_Response, error) {
|
||||
func (p *provider) Configure(ctx context.Context, req *tfplugin5.Configure_Request) (*tfplugin5.Configure_Response, error) {
|
||||
resp := &tfplugin5.Configure_Response{}
|
||||
ty := p.schema.Provider.Block.ImpliedType()
|
||||
|
||||
@@ -167,7 +167,7 @@ func (p *provider) Configure(_ context.Context, req *tfplugin5.Configure_Request
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
configureResp := p.provider.ConfigureProvider(providers.ConfigureProviderRequest{
|
||||
configureResp := p.provider.ConfigureProvider(ctx, providers.ConfigureProviderRequest{
|
||||
TerraformVersion: req.TerraformVersion,
|
||||
Config: configVal,
|
||||
})
|
||||
@@ -176,7 +176,7 @@ func (p *provider) Configure(_ context.Context, req *tfplugin5.Configure_Request
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
func (p *provider) ReadResource(_ context.Context, req *tfplugin5.ReadResource_Request) (*tfplugin5.ReadResource_Response, error) {
|
||||
func (p *provider) ReadResource(ctx context.Context, req *tfplugin5.ReadResource_Request) (*tfplugin5.ReadResource_Response, error) {
|
||||
resp := &tfplugin5.ReadResource_Response{}
|
||||
ty := p.schema.ResourceTypes[req.TypeName].Block.ImpliedType()
|
||||
|
||||
@@ -193,7 +193,7 @@ func (p *provider) ReadResource(_ context.Context, req *tfplugin5.ReadResource_R
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
readResp := p.provider.ReadResource(providers.ReadResourceRequest{
|
||||
readResp := p.provider.ReadResource(ctx, providers.ReadResourceRequest{
|
||||
TypeName: req.TypeName,
|
||||
PriorState: stateVal,
|
||||
Private: req.Private,
|
||||
@@ -215,7 +215,7 @@ func (p *provider) ReadResource(_ context.Context, req *tfplugin5.ReadResource_R
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
func (p *provider) PlanResourceChange(_ context.Context, req *tfplugin5.PlanResourceChange_Request) (*tfplugin5.PlanResourceChange_Response, error) {
|
||||
func (p *provider) PlanResourceChange(ctx context.Context, req *tfplugin5.PlanResourceChange_Request) (*tfplugin5.PlanResourceChange_Response, error) {
|
||||
resp := &tfplugin5.PlanResourceChange_Response{}
|
||||
ty := p.schema.ResourceTypes[req.TypeName].Block.ImpliedType()
|
||||
|
||||
@@ -244,7 +244,7 @@ func (p *provider) PlanResourceChange(_ context.Context, req *tfplugin5.PlanReso
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
planResp := p.provider.PlanResourceChange(providers.PlanResourceChangeRequest{
|
||||
planResp := p.provider.PlanResourceChange(ctx, providers.PlanResourceChangeRequest{
|
||||
TypeName: req.TypeName,
|
||||
PriorState: priorStateVal,
|
||||
ProposedNewState: proposedStateVal,
|
||||
@@ -272,7 +272,7 @@ func (p *provider) PlanResourceChange(_ context.Context, req *tfplugin5.PlanReso
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
func (p *provider) ApplyResourceChange(_ context.Context, req *tfplugin5.ApplyResourceChange_Request) (*tfplugin5.ApplyResourceChange_Response, error) {
|
||||
func (p *provider) ApplyResourceChange(ctx context.Context, req *tfplugin5.ApplyResourceChange_Request) (*tfplugin5.ApplyResourceChange_Response, error) {
|
||||
resp := &tfplugin5.ApplyResourceChange_Response{}
|
||||
ty := p.schema.ResourceTypes[req.TypeName].Block.ImpliedType()
|
||||
|
||||
@@ -301,7 +301,7 @@ func (p *provider) ApplyResourceChange(_ context.Context, req *tfplugin5.ApplyRe
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
applyResp := p.provider.ApplyResourceChange(providers.ApplyResourceChangeRequest{
|
||||
applyResp := p.provider.ApplyResourceChange(ctx, providers.ApplyResourceChangeRequest{
|
||||
TypeName: req.TypeName,
|
||||
PriorState: priorStateVal,
|
||||
PlannedState: plannedStateVal,
|
||||
@@ -325,10 +325,10 @@ func (p *provider) ApplyResourceChange(_ context.Context, req *tfplugin5.ApplyRe
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
func (p *provider) ImportResourceState(_ context.Context, req *tfplugin5.ImportResourceState_Request) (*tfplugin5.ImportResourceState_Response, error) {
|
||||
func (p *provider) ImportResourceState(ctx context.Context, req *tfplugin5.ImportResourceState_Request) (*tfplugin5.ImportResourceState_Response, error) {
|
||||
resp := &tfplugin5.ImportResourceState_Response{}
|
||||
|
||||
importResp := p.provider.ImportResourceState(providers.ImportResourceStateRequest{
|
||||
importResp := p.provider.ImportResourceState(ctx, providers.ImportResourceStateRequest{
|
||||
TypeName: req.TypeName,
|
||||
ID: req.Id,
|
||||
})
|
||||
@@ -356,7 +356,7 @@ func (p *provider) MoveResourceState(context.Context, *tfplugin5.MoveResourceSta
|
||||
panic("Not Implemented")
|
||||
}
|
||||
|
||||
func (p *provider) ReadDataSource(_ context.Context, req *tfplugin5.ReadDataSource_Request) (*tfplugin5.ReadDataSource_Response, error) {
|
||||
func (p *provider) ReadDataSource(ctx context.Context, req *tfplugin5.ReadDataSource_Request) (*tfplugin5.ReadDataSource_Response, error) {
|
||||
resp := &tfplugin5.ReadDataSource_Response{}
|
||||
ty := p.schema.DataSources[req.TypeName].Block.ImpliedType()
|
||||
|
||||
@@ -373,7 +373,7 @@ func (p *provider) ReadDataSource(_ context.Context, req *tfplugin5.ReadDataSour
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
readResp := p.provider.ReadDataSource(providers.ReadDataSourceRequest{
|
||||
readResp := p.provider.ReadDataSource(ctx, providers.ReadDataSourceRequest{
|
||||
TypeName: req.TypeName,
|
||||
Config: configVal,
|
||||
ProviderMeta: metaVal,
|
||||
@@ -412,9 +412,9 @@ func (p *provider) ValidateEphemeralResourceConfig(context.Context, *tfplugin5.V
|
||||
panic("unimplemented")
|
||||
}
|
||||
|
||||
func (p *provider) Stop(context.Context, *tfplugin5.Stop_Request) (*tfplugin5.Stop_Response, error) {
|
||||
func (p *provider) Stop(ctx context.Context, _ *tfplugin5.Stop_Request) (*tfplugin5.Stop_Response, error) {
|
||||
resp := &tfplugin5.Stop_Response{}
|
||||
err := p.provider.Stop()
|
||||
err := p.provider.Stop(ctx)
|
||||
if err != nil {
|
||||
resp.Error = err.Error()
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@ import (
|
||||
func Provider6(p providers.Interface) tfplugin6.ProviderServer {
|
||||
return &provider6{
|
||||
provider: p,
|
||||
schema: p.GetProviderSchema(),
|
||||
schema: p.GetProviderSchema(context.TODO()),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -74,7 +74,7 @@ func (p *provider6) GetProviderSchema(_ context.Context, req *tfplugin6.GetProvi
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
func (p *provider6) ValidateProviderConfig(_ context.Context, req *tfplugin6.ValidateProviderConfig_Request) (*tfplugin6.ValidateProviderConfig_Response, error) {
|
||||
func (p *provider6) ValidateProviderConfig(ctx context.Context, req *tfplugin6.ValidateProviderConfig_Request) (*tfplugin6.ValidateProviderConfig_Response, error) {
|
||||
resp := &tfplugin6.ValidateProviderConfig_Response{}
|
||||
ty := p.schema.Provider.Block.ImpliedType()
|
||||
|
||||
@@ -84,7 +84,7 @@ func (p *provider6) ValidateProviderConfig(_ context.Context, req *tfplugin6.Val
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
prepareResp := p.provider.ValidateProviderConfig(providers.ValidateProviderConfigRequest{
|
||||
prepareResp := p.provider.ValidateProviderConfig(ctx, providers.ValidateProviderConfigRequest{
|
||||
Config: configVal,
|
||||
})
|
||||
|
||||
@@ -93,7 +93,7 @@ func (p *provider6) ValidateProviderConfig(_ context.Context, req *tfplugin6.Val
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
func (p *provider6) ValidateResourceConfig(_ context.Context, req *tfplugin6.ValidateResourceConfig_Request) (*tfplugin6.ValidateResourceConfig_Response, error) {
|
||||
func (p *provider6) ValidateResourceConfig(ctx context.Context, req *tfplugin6.ValidateResourceConfig_Request) (*tfplugin6.ValidateResourceConfig_Response, error) {
|
||||
resp := &tfplugin6.ValidateResourceConfig_Response{}
|
||||
ty := p.schema.ResourceTypes[req.TypeName].Block.ImpliedType()
|
||||
|
||||
@@ -103,7 +103,7 @@ func (p *provider6) ValidateResourceConfig(_ context.Context, req *tfplugin6.Val
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
validateResp := p.provider.ValidateResourceConfig(providers.ValidateResourceConfigRequest{
|
||||
validateResp := p.provider.ValidateResourceConfig(ctx, providers.ValidateResourceConfigRequest{
|
||||
TypeName: req.TypeName,
|
||||
Config: configVal,
|
||||
})
|
||||
@@ -112,7 +112,7 @@ func (p *provider6) ValidateResourceConfig(_ context.Context, req *tfplugin6.Val
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
func (p *provider6) ValidateDataResourceConfig(_ context.Context, req *tfplugin6.ValidateDataResourceConfig_Request) (*tfplugin6.ValidateDataResourceConfig_Response, error) {
|
||||
func (p *provider6) ValidateDataResourceConfig(ctx context.Context, req *tfplugin6.ValidateDataResourceConfig_Request) (*tfplugin6.ValidateDataResourceConfig_Response, error) {
|
||||
resp := &tfplugin6.ValidateDataResourceConfig_Response{}
|
||||
ty := p.schema.DataSources[req.TypeName].Block.ImpliedType()
|
||||
|
||||
@@ -122,7 +122,7 @@ func (p *provider6) ValidateDataResourceConfig(_ context.Context, req *tfplugin6
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
validateResp := p.provider.ValidateDataResourceConfig(providers.ValidateDataResourceConfigRequest{
|
||||
validateResp := p.provider.ValidateDataResourceConfig(ctx, providers.ValidateDataResourceConfigRequest{
|
||||
TypeName: req.TypeName,
|
||||
Config: configVal,
|
||||
})
|
||||
@@ -131,11 +131,11 @@ func (p *provider6) ValidateDataResourceConfig(_ context.Context, req *tfplugin6
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
func (p *provider6) UpgradeResourceState(_ context.Context, req *tfplugin6.UpgradeResourceState_Request) (*tfplugin6.UpgradeResourceState_Response, error) {
|
||||
func (p *provider6) UpgradeResourceState(ctx context.Context, req *tfplugin6.UpgradeResourceState_Request) (*tfplugin6.UpgradeResourceState_Response, error) {
|
||||
resp := &tfplugin6.UpgradeResourceState_Response{}
|
||||
ty := p.schema.ResourceTypes[req.TypeName].Block.ImpliedType()
|
||||
|
||||
upgradeResp := p.provider.UpgradeResourceState(providers.UpgradeResourceStateRequest{
|
||||
upgradeResp := p.provider.UpgradeResourceState(ctx, providers.UpgradeResourceStateRequest{
|
||||
TypeName: req.TypeName,
|
||||
Version: req.Version,
|
||||
RawStateJSON: req.RawState.Json,
|
||||
@@ -157,7 +157,7 @@ func (p *provider6) UpgradeResourceState(_ context.Context, req *tfplugin6.Upgra
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
func (p *provider6) ConfigureProvider(_ context.Context, req *tfplugin6.ConfigureProvider_Request) (*tfplugin6.ConfigureProvider_Response, error) {
|
||||
func (p *provider6) ConfigureProvider(ctx context.Context, req *tfplugin6.ConfigureProvider_Request) (*tfplugin6.ConfigureProvider_Response, error) {
|
||||
resp := &tfplugin6.ConfigureProvider_Response{}
|
||||
ty := p.schema.Provider.Block.ImpliedType()
|
||||
|
||||
@@ -167,7 +167,7 @@ func (p *provider6) ConfigureProvider(_ context.Context, req *tfplugin6.Configur
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
configureResp := p.provider.ConfigureProvider(providers.ConfigureProviderRequest{
|
||||
configureResp := p.provider.ConfigureProvider(ctx, providers.ConfigureProviderRequest{
|
||||
TerraformVersion: req.TerraformVersion,
|
||||
Config: configVal,
|
||||
})
|
||||
@@ -176,7 +176,7 @@ func (p *provider6) ConfigureProvider(_ context.Context, req *tfplugin6.Configur
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
func (p *provider6) ReadResource(_ context.Context, req *tfplugin6.ReadResource_Request) (*tfplugin6.ReadResource_Response, error) {
|
||||
func (p *provider6) ReadResource(ctx context.Context, req *tfplugin6.ReadResource_Request) (*tfplugin6.ReadResource_Response, error) {
|
||||
resp := &tfplugin6.ReadResource_Response{}
|
||||
ty := p.schema.ResourceTypes[req.TypeName].Block.ImpliedType()
|
||||
|
||||
@@ -193,7 +193,7 @@ func (p *provider6) ReadResource(_ context.Context, req *tfplugin6.ReadResource_
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
readResp := p.provider.ReadResource(providers.ReadResourceRequest{
|
||||
readResp := p.provider.ReadResource(ctx, providers.ReadResourceRequest{
|
||||
TypeName: req.TypeName,
|
||||
PriorState: stateVal,
|
||||
Private: req.Private,
|
||||
@@ -215,7 +215,7 @@ func (p *provider6) ReadResource(_ context.Context, req *tfplugin6.ReadResource_
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
func (p *provider6) PlanResourceChange(_ context.Context, req *tfplugin6.PlanResourceChange_Request) (*tfplugin6.PlanResourceChange_Response, error) {
|
||||
func (p *provider6) PlanResourceChange(ctx context.Context, req *tfplugin6.PlanResourceChange_Request) (*tfplugin6.PlanResourceChange_Response, error) {
|
||||
resp := &tfplugin6.PlanResourceChange_Response{}
|
||||
ty := p.schema.ResourceTypes[req.TypeName].Block.ImpliedType()
|
||||
|
||||
@@ -244,7 +244,7 @@ func (p *provider6) PlanResourceChange(_ context.Context, req *tfplugin6.PlanRes
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
planResp := p.provider.PlanResourceChange(providers.PlanResourceChangeRequest{
|
||||
planResp := p.provider.PlanResourceChange(ctx, providers.PlanResourceChangeRequest{
|
||||
TypeName: req.TypeName,
|
||||
PriorState: priorStateVal,
|
||||
ProposedNewState: proposedStateVal,
|
||||
@@ -272,7 +272,7 @@ func (p *provider6) PlanResourceChange(_ context.Context, req *tfplugin6.PlanRes
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
func (p *provider6) ApplyResourceChange(_ context.Context, req *tfplugin6.ApplyResourceChange_Request) (*tfplugin6.ApplyResourceChange_Response, error) {
|
||||
func (p *provider6) ApplyResourceChange(ctx context.Context, req *tfplugin6.ApplyResourceChange_Request) (*tfplugin6.ApplyResourceChange_Response, error) {
|
||||
resp := &tfplugin6.ApplyResourceChange_Response{}
|
||||
ty := p.schema.ResourceTypes[req.TypeName].Block.ImpliedType()
|
||||
|
||||
@@ -301,7 +301,7 @@ func (p *provider6) ApplyResourceChange(_ context.Context, req *tfplugin6.ApplyR
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
applyResp := p.provider.ApplyResourceChange(providers.ApplyResourceChangeRequest{
|
||||
applyResp := p.provider.ApplyResourceChange(ctx, providers.ApplyResourceChangeRequest{
|
||||
TypeName: req.TypeName,
|
||||
PriorState: priorStateVal,
|
||||
PlannedState: plannedStateVal,
|
||||
@@ -325,10 +325,10 @@ func (p *provider6) ApplyResourceChange(_ context.Context, req *tfplugin6.ApplyR
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
func (p *provider6) ImportResourceState(_ context.Context, req *tfplugin6.ImportResourceState_Request) (*tfplugin6.ImportResourceState_Response, error) {
|
||||
func (p *provider6) ImportResourceState(ctx context.Context, req *tfplugin6.ImportResourceState_Request) (*tfplugin6.ImportResourceState_Response, error) {
|
||||
resp := &tfplugin6.ImportResourceState_Response{}
|
||||
|
||||
importResp := p.provider.ImportResourceState(providers.ImportResourceStateRequest{
|
||||
importResp := p.provider.ImportResourceState(ctx, providers.ImportResourceStateRequest{
|
||||
TypeName: req.TypeName,
|
||||
ID: req.Id,
|
||||
})
|
||||
@@ -356,7 +356,7 @@ func (p *provider6) MoveResourceState(context.Context, *tfplugin6.MoveResourceSt
|
||||
panic("Not Implemented")
|
||||
}
|
||||
|
||||
func (p *provider6) ReadDataSource(_ context.Context, req *tfplugin6.ReadDataSource_Request) (*tfplugin6.ReadDataSource_Response, error) {
|
||||
func (p *provider6) ReadDataSource(ctx context.Context, req *tfplugin6.ReadDataSource_Request) (*tfplugin6.ReadDataSource_Response, error) {
|
||||
resp := &tfplugin6.ReadDataSource_Response{}
|
||||
ty := p.schema.DataSources[req.TypeName].Block.ImpliedType()
|
||||
|
||||
@@ -373,7 +373,7 @@ func (p *provider6) ReadDataSource(_ context.Context, req *tfplugin6.ReadDataSou
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
readResp := p.provider.ReadDataSource(providers.ReadDataSourceRequest{
|
||||
readResp := p.provider.ReadDataSource(ctx, providers.ReadDataSourceRequest{
|
||||
TypeName: req.TypeName,
|
||||
Config: configVal,
|
||||
ProviderMeta: metaVal,
|
||||
@@ -412,9 +412,9 @@ func (p *provider6) ValidateEphemeralResourceConfig(context.Context, *tfplugin6.
|
||||
panic("unimplemented")
|
||||
}
|
||||
|
||||
func (p *provider6) StopProvider(context.Context, *tfplugin6.StopProvider_Request) (*tfplugin6.StopProvider_Response, error) {
|
||||
func (p *provider6) StopProvider(ctx context.Context, _ *tfplugin6.StopProvider_Request) (*tfplugin6.StopProvider_Response, error) {
|
||||
resp := &tfplugin6.StopProvider_Response{}
|
||||
err := p.provider.Stop()
|
||||
err := p.provider.Stop(ctx)
|
||||
if err != nil {
|
||||
resp.Error = err.Error()
|
||||
}
|
||||
|
||||
@@ -1,380 +0,0 @@
|
||||
// Copyright (c) The OpenTofu Authors
|
||||
// SPDX-License-Identifier: MPL-2.0
|
||||
// Copyright (c) 2023 HashiCorp, Inc.
|
||||
// SPDX-License-Identifier: MPL-2.0
|
||||
|
||||
package tofu
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"sync"
|
||||
|
||||
"github.com/zclconf/go-cty/cty"
|
||||
ctyjson "github.com/zclconf/go-cty/cty/json"
|
||||
|
||||
"github.com/opentofu/opentofu/internal/configs/hcl2shim"
|
||||
"github.com/opentofu/opentofu/internal/providers"
|
||||
)
|
||||
|
||||
var _ providers.Interface = (*MockProvider)(nil)
|
||||
|
||||
// MockProvider implements providers.Interface but mocks out all the
|
||||
// calls for testing purposes.
|
||||
type MockProvider struct {
|
||||
sync.Mutex
|
||||
|
||||
// Anything you want, in case you need to store extra data with the mock.
|
||||
Meta interface{}
|
||||
|
||||
GetSchemaCalled bool
|
||||
GetSchemaReturn *ProviderSchema // This is using ProviderSchema directly rather than providers.GetProviderSchemaResponse for compatibility with old tests
|
||||
|
||||
ValidateProviderConfigCalled bool
|
||||
ValidateProviderConfigResponse providers.ValidateProviderConfigResponse
|
||||
ValidateProviderConfigRequest providers.ValidateProviderConfigRequest
|
||||
ValidateProviderConfigFn func(providers.ValidateProviderConfigRequest) providers.ValidateProviderConfigResponse
|
||||
|
||||
ValidateResourceConfigCalled bool
|
||||
ValidateResourceConfigTypeName string
|
||||
ValidateResourceConfigResponse providers.ValidateResourceConfigResponse
|
||||
ValidateResourceConfigRequest providers.ValidateResourceConfigRequest
|
||||
ValidateResourceConfigFn func(providers.ValidateResourceConfigRequest) providers.ValidateResourceConfigResponse
|
||||
|
||||
ValidateDataResourceConfigCalled bool
|
||||
ValidateDataResourceConfigTypeName string
|
||||
ValidateDataResourceConfigResponse providers.ValidateDataResourceConfigResponse
|
||||
ValidateDataResourceConfigRequest providers.ValidateDataResourceConfigRequest
|
||||
ValidateDataResourceConfigFn func(providers.ValidateDataResourceConfigRequest) providers.ValidateDataResourceConfigResponse
|
||||
|
||||
UpgradeResourceStateCalled bool
|
||||
UpgradeResourceStateTypeName string
|
||||
UpgradeResourceStateResponse providers.UpgradeResourceStateResponse
|
||||
UpgradeResourceStateRequest providers.UpgradeResourceStateRequest
|
||||
UpgradeResourceStateFn func(providers.UpgradeResourceStateRequest) providers.UpgradeResourceStateResponse
|
||||
|
||||
ConfigureProviderCalled bool
|
||||
ConfigureProviderResponse providers.ConfigureProviderResponse
|
||||
ConfigureProviderRequest providers.ConfigureProviderRequest
|
||||
ConfigureProviderFn func(providers.ConfigureProviderRequest) providers.ConfigureProviderResponse
|
||||
|
||||
StopCalled bool
|
||||
StopFn func() error
|
||||
StopResponse error
|
||||
|
||||
ReadResourceCalled bool
|
||||
ReadResourceResponse providers.ReadResourceResponse
|
||||
ReadResourceRequest providers.ReadResourceRequest
|
||||
ReadResourceFn func(providers.ReadResourceRequest) providers.ReadResourceResponse
|
||||
|
||||
PlanResourceChangeCalled bool
|
||||
PlanResourceChangeResponse providers.PlanResourceChangeResponse
|
||||
PlanResourceChangeRequest providers.PlanResourceChangeRequest
|
||||
PlanResourceChangeFn func(providers.PlanResourceChangeRequest) providers.PlanResourceChangeResponse
|
||||
|
||||
ApplyResourceChangeCalled bool
|
||||
ApplyResourceChangeResponse providers.ApplyResourceChangeResponse
|
||||
ApplyResourceChangeRequest providers.ApplyResourceChangeRequest
|
||||
ApplyResourceChangeFn func(providers.ApplyResourceChangeRequest) providers.ApplyResourceChangeResponse
|
||||
|
||||
ImportResourceStateCalled bool
|
||||
ImportResourceStateResponse providers.ImportResourceStateResponse
|
||||
ImportResourceStateRequest providers.ImportResourceStateRequest
|
||||
ImportResourceStateFn func(providers.ImportResourceStateRequest) providers.ImportResourceStateResponse
|
||||
// Legacy return type for existing tests, which will be shimmed into an
|
||||
// ImportResourceStateResponse if set
|
||||
ImportStateReturn []*InstanceState
|
||||
|
||||
ReadDataSourceCalled bool
|
||||
ReadDataSourceResponse providers.ReadDataSourceResponse
|
||||
ReadDataSourceRequest providers.ReadDataSourceRequest
|
||||
ReadDataSourceFn func(providers.ReadDataSourceRequest) providers.ReadDataSourceResponse
|
||||
|
||||
CloseCalled bool
|
||||
CloseError error
|
||||
}
|
||||
|
||||
func (p *MockProvider) GetProviderSchema() providers.GetProviderSchemaResponse {
|
||||
p.Lock()
|
||||
defer p.Unlock()
|
||||
p.GetSchemaCalled = true
|
||||
return p.getSchema()
|
||||
}
|
||||
|
||||
func (p *MockProvider) getSchema() providers.GetProviderSchemaResponse {
|
||||
// This version of getSchema doesn't do any locking, so it's suitable to
|
||||
// call from other methods of this mock as long as they are already
|
||||
// holding the lock.
|
||||
|
||||
ret := providers.GetProviderSchemaResponse{
|
||||
Provider: providers.Schema{},
|
||||
DataSources: map[string]providers.Schema{},
|
||||
ResourceTypes: map[string]providers.Schema{},
|
||||
}
|
||||
if p.GetSchemaReturn != nil {
|
||||
ret.Provider.Block = p.GetSchemaReturn.Provider
|
||||
ret.ProviderMeta.Block = p.GetSchemaReturn.ProviderMeta
|
||||
for n, s := range p.GetSchemaReturn.DataSources {
|
||||
ret.DataSources[n] = providers.Schema{
|
||||
Block: s,
|
||||
}
|
||||
}
|
||||
for n, s := range p.GetSchemaReturn.ResourceTypes {
|
||||
ret.ResourceTypes[n] = providers.Schema{
|
||||
Version: int64(p.GetSchemaReturn.ResourceTypeSchemaVersions[n]),
|
||||
Block: s,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ret
|
||||
}
|
||||
|
||||
func (p *MockProvider) ValidateProviderConfig(r providers.ValidateProviderConfigRequest) providers.ValidateProviderConfigResponse {
|
||||
p.Lock()
|
||||
defer p.Unlock()
|
||||
|
||||
p.ValidateProviderConfigCalled = true
|
||||
p.ValidateProviderConfigRequest = r
|
||||
if p.ValidateProviderConfigFn != nil {
|
||||
return p.ValidateProviderConfigFn(r)
|
||||
}
|
||||
return p.ValidateProviderConfigResponse
|
||||
}
|
||||
|
||||
func (p *MockProvider) ValidateResourceConfig(r providers.ValidateResourceConfigRequest) providers.ValidateResourceConfigResponse {
|
||||
p.Lock()
|
||||
defer p.Unlock()
|
||||
|
||||
p.ValidateResourceConfigCalled = true
|
||||
p.ValidateResourceConfigRequest = r
|
||||
|
||||
if p.ValidateResourceConfigFn != nil {
|
||||
return p.ValidateResourceConfigFn(r)
|
||||
}
|
||||
|
||||
return p.ValidateResourceConfigResponse
|
||||
}
|
||||
|
||||
func (p *MockProvider) ValidateDataResourceConfig(r providers.ValidateDataResourceConfigRequest) providers.ValidateDataResourceConfigResponse {
|
||||
p.Lock()
|
||||
defer p.Unlock()
|
||||
|
||||
p.ValidateDataResourceConfigCalled = true
|
||||
p.ValidateDataResourceConfigRequest = r
|
||||
|
||||
if p.ValidateDataResourceConfigFn != nil {
|
||||
return p.ValidateDataResourceConfigFn(r)
|
||||
}
|
||||
|
||||
return p.ValidateDataResourceConfigResponse
|
||||
}
|
||||
|
||||
func (p *MockProvider) UpgradeResourceState(r providers.UpgradeResourceStateRequest) providers.UpgradeResourceStateResponse {
|
||||
p.Lock()
|
||||
defer p.Unlock()
|
||||
|
||||
schemas := p.getSchema()
|
||||
schema := schemas.ResourceTypes[r.TypeName]
|
||||
schemaType := schema.Block.ImpliedType()
|
||||
|
||||
p.UpgradeResourceStateCalled = true
|
||||
p.UpgradeResourceStateRequest = r
|
||||
|
||||
if p.UpgradeResourceStateFn != nil {
|
||||
return p.UpgradeResourceStateFn(r)
|
||||
}
|
||||
|
||||
resp := p.UpgradeResourceStateResponse
|
||||
|
||||
if resp.UpgradedState == cty.NilVal {
|
||||
switch {
|
||||
case r.RawStateFlatmap != nil:
|
||||
v, err := hcl2shim.HCL2ValueFromFlatmap(r.RawStateFlatmap, schemaType)
|
||||
if err != nil {
|
||||
resp.Diagnostics = resp.Diagnostics.Append(err)
|
||||
return resp
|
||||
}
|
||||
resp.UpgradedState = v
|
||||
case len(r.RawStateJSON) > 0:
|
||||
v, err := ctyjson.Unmarshal(r.RawStateJSON, schemaType)
|
||||
|
||||
if err != nil {
|
||||
resp.Diagnostics = resp.Diagnostics.Append(err)
|
||||
return resp
|
||||
}
|
||||
resp.UpgradedState = v
|
||||
}
|
||||
}
|
||||
return resp
|
||||
}
|
||||
|
||||
func (p *MockProvider) ConfigureProvider(r providers.ConfigureProviderRequest) providers.ConfigureProviderResponse {
|
||||
p.Lock()
|
||||
defer p.Unlock()
|
||||
|
||||
p.ConfigureProviderCalled = true
|
||||
p.ConfigureProviderRequest = r
|
||||
|
||||
if p.ConfigureProviderFn != nil {
|
||||
return p.ConfigureProviderFn(r)
|
||||
}
|
||||
|
||||
return p.ConfigureProviderResponse
|
||||
}
|
||||
|
||||
func (p *MockProvider) Stop() error {
|
||||
// We intentionally don't lock in this one because the whole point of this
|
||||
// method is to be called concurrently with another operation that can
|
||||
// be cancelled. The provider itself is responsible for handling
|
||||
// any concurrency concerns in this case.
|
||||
|
||||
p.StopCalled = true
|
||||
if p.StopFn != nil {
|
||||
return p.StopFn()
|
||||
}
|
||||
|
||||
return p.StopResponse
|
||||
}
|
||||
|
||||
func (p *MockProvider) ReadResource(r providers.ReadResourceRequest) providers.ReadResourceResponse {
|
||||
p.Lock()
|
||||
defer p.Unlock()
|
||||
|
||||
p.ReadResourceCalled = true
|
||||
p.ReadResourceRequest = r
|
||||
|
||||
if p.ReadResourceFn != nil {
|
||||
return p.ReadResourceFn(r)
|
||||
}
|
||||
|
||||
resp := p.ReadResourceResponse
|
||||
if resp.NewState != cty.NilVal {
|
||||
// make sure the NewState fits the schema
|
||||
// This isn't always the case for the existing tests
|
||||
newState, err := p.GetSchemaReturn.ResourceTypes[r.TypeName].CoerceValue(resp.NewState)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
resp.NewState = newState
|
||||
return resp
|
||||
}
|
||||
|
||||
// just return the same state we received
|
||||
resp.NewState = r.PriorState
|
||||
return resp
|
||||
}
|
||||
|
||||
func (p *MockProvider) PlanResourceChange(r providers.PlanResourceChangeRequest) providers.PlanResourceChangeResponse {
|
||||
p.Lock()
|
||||
defer p.Unlock()
|
||||
|
||||
p.PlanResourceChangeCalled = true
|
||||
p.PlanResourceChangeRequest = r
|
||||
|
||||
if p.PlanResourceChangeFn != nil {
|
||||
return p.PlanResourceChangeFn(r)
|
||||
}
|
||||
|
||||
return p.PlanResourceChangeResponse
|
||||
}
|
||||
|
||||
func (p *MockProvider) ApplyResourceChange(r providers.ApplyResourceChangeRequest) providers.ApplyResourceChangeResponse {
|
||||
p.Lock()
|
||||
p.ApplyResourceChangeCalled = true
|
||||
p.ApplyResourceChangeRequest = r
|
||||
p.Unlock()
|
||||
|
||||
if p.ApplyResourceChangeFn != nil {
|
||||
return p.ApplyResourceChangeFn(r)
|
||||
}
|
||||
|
||||
return p.ApplyResourceChangeResponse
|
||||
}
|
||||
|
||||
func (p *MockProvider) ImportResourceState(r providers.ImportResourceStateRequest) providers.ImportResourceStateResponse {
|
||||
p.Lock()
|
||||
defer p.Unlock()
|
||||
|
||||
if p.ImportStateReturn != nil {
|
||||
for _, is := range p.ImportStateReturn {
|
||||
if is.Attributes == nil {
|
||||
is.Attributes = make(map[string]string)
|
||||
}
|
||||
is.Attributes["id"] = is.ID
|
||||
|
||||
typeName := is.Ephemeral.Type
|
||||
// Use the requested type if the resource has no type of it's own.
|
||||
// We still return the empty type, which will error, but this prevents a panic.
|
||||
if typeName == "" {
|
||||
typeName = r.TypeName
|
||||
}
|
||||
|
||||
schema := p.GetSchemaReturn.ResourceTypes[typeName]
|
||||
if schema == nil {
|
||||
panic("no schema found for " + typeName)
|
||||
}
|
||||
|
||||
private, err := json.Marshal(is.Meta)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
state, err := hcl2shim.HCL2ValueFromFlatmap(is.Attributes, schema.ImpliedType())
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
state, err = schema.CoerceValue(state)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
p.ImportResourceStateResponse.ImportedResources = append(
|
||||
p.ImportResourceStateResponse.ImportedResources,
|
||||
providers.ImportedResource{
|
||||
TypeName: is.Ephemeral.Type,
|
||||
State: state,
|
||||
Private: private,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
p.ImportResourceStateCalled = true
|
||||
p.ImportResourceStateRequest = r
|
||||
if p.ImportResourceStateFn != nil {
|
||||
return p.ImportResourceStateFn(r)
|
||||
}
|
||||
|
||||
return p.ImportResourceStateResponse
|
||||
}
|
||||
|
||||
func (p *MockProvider) MoveResourceState(_ providers.MoveResourceStateRequest) providers.MoveResourceStateResponse {
|
||||
panic("not implemented")
|
||||
}
|
||||
|
||||
func (p *MockProvider) ReadDataSource(r providers.ReadDataSourceRequest) providers.ReadDataSourceResponse {
|
||||
p.Lock()
|
||||
defer p.Unlock()
|
||||
|
||||
p.ReadDataSourceCalled = true
|
||||
p.ReadDataSourceRequest = r
|
||||
|
||||
if p.ReadDataSourceFn != nil {
|
||||
return p.ReadDataSourceFn(r)
|
||||
}
|
||||
|
||||
return p.ReadDataSourceResponse
|
||||
}
|
||||
|
||||
func (p *MockProvider) GetFunctions() providers.GetFunctionsResponse {
|
||||
panic("Not Implemented")
|
||||
}
|
||||
|
||||
func (p *MockProvider) CallFunction(r providers.CallFunctionRequest) providers.CallFunctionResponse {
|
||||
panic("Not Implemented")
|
||||
}
|
||||
|
||||
func (p *MockProvider) Close() error {
|
||||
p.CloseCalled = true
|
||||
return p.CloseError
|
||||
}
|
||||
@@ -6,6 +6,7 @@
|
||||
package tofu
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"log"
|
||||
|
||||
@@ -116,10 +117,10 @@ func loadProviderSchemas(schemas map[addrs.Provider]*ProviderSchema, config *con
|
||||
return
|
||||
}
|
||||
defer func() {
|
||||
provider.Close()
|
||||
provider.Close(context.Background())
|
||||
}()
|
||||
|
||||
resp := provider.GetProviderSchema()
|
||||
resp := provider.GetProviderSchema(context.Background())
|
||||
if resp.Diagnostics.HasErrors() {
|
||||
// We'll put a stub in the map so we won't re-attempt this on
|
||||
// future calls.
|
||||
|
||||
@@ -68,6 +68,13 @@ type GRPCProvider struct {
|
||||
|
||||
// this context is created by the plugin package, and is canceled when the
|
||||
// plugin process ends.
|
||||
//
|
||||
// THIS IS NOT THE RIGHT CONTEXT TO USE FOR GRPC CALLS! This represents
|
||||
// the overall context in which the plugin was launched and represents the
|
||||
// full runtime of the plugin process, whereas the [context.Context] passed
|
||||
// to individual [providers.Interface] methods is a more tightly-scoped
|
||||
// context focused on each individual request, and so is more appropriate
|
||||
// to use as the parent context for gRPC API calls.
|
||||
ctx context.Context
|
||||
|
||||
mu sync.Mutex
|
||||
@@ -78,7 +85,7 @@ type GRPCProvider struct {
|
||||
|
||||
var _ providers.Interface = new(GRPCProvider)
|
||||
|
||||
func (p *GRPCProvider) GetProviderSchema() (resp providers.GetProviderSchemaResponse) {
|
||||
func (p *GRPCProvider) GetProviderSchema(ctx context.Context) (resp providers.GetProviderSchemaResponse) {
|
||||
logger.Trace("GRPCProvider: GetProviderSchema")
|
||||
p.mu.Lock()
|
||||
defer p.mu.Unlock()
|
||||
@@ -115,7 +122,7 @@ func (p *GRPCProvider) GetProviderSchema() (resp providers.GetProviderSchemaResp
|
||||
// size much higher on the server side, which is the supported method for
|
||||
// determining payload size.
|
||||
const maxRecvSize = 64 << 20
|
||||
protoResp, err := p.client.GetSchema(p.ctx, new(proto.GetProviderSchema_Request), grpc.MaxRecvMsgSizeCallOption{MaxRecvMsgSize: maxRecvSize})
|
||||
protoResp, err := p.client.GetSchema(ctx, new(proto.GetProviderSchema_Request), grpc.MaxRecvMsgSizeCallOption{MaxRecvMsgSize: maxRecvSize})
|
||||
if err != nil {
|
||||
resp.Diagnostics = resp.Diagnostics.Append(grpcErr(err))
|
||||
return resp
|
||||
@@ -176,10 +183,10 @@ func (p *GRPCProvider) GetProviderSchema() (resp providers.GetProviderSchemaResp
|
||||
return resp
|
||||
}
|
||||
|
||||
func (p *GRPCProvider) ValidateProviderConfig(r providers.ValidateProviderConfigRequest) (resp providers.ValidateProviderConfigResponse) {
|
||||
func (p *GRPCProvider) ValidateProviderConfig(ctx context.Context, r providers.ValidateProviderConfigRequest) (resp providers.ValidateProviderConfigResponse) {
|
||||
logger.Trace("GRPCProvider: ValidateProviderConfig")
|
||||
|
||||
schema := p.GetProviderSchema()
|
||||
schema := p.GetProviderSchema(ctx)
|
||||
if schema.Diagnostics.HasErrors() {
|
||||
resp.Diagnostics = schema.Diagnostics
|
||||
return resp
|
||||
@@ -197,7 +204,7 @@ func (p *GRPCProvider) ValidateProviderConfig(r providers.ValidateProviderConfig
|
||||
Config: &proto.DynamicValue{Msgpack: mp},
|
||||
}
|
||||
|
||||
protoResp, err := p.client.PrepareProviderConfig(p.ctx, protoReq)
|
||||
protoResp, err := p.client.PrepareProviderConfig(ctx, protoReq)
|
||||
if err != nil {
|
||||
resp.Diagnostics = resp.Diagnostics.Append(grpcErr(err))
|
||||
return resp
|
||||
@@ -214,10 +221,10 @@ func (p *GRPCProvider) ValidateProviderConfig(r providers.ValidateProviderConfig
|
||||
return resp
|
||||
}
|
||||
|
||||
func (p *GRPCProvider) ValidateResourceConfig(r providers.ValidateResourceConfigRequest) (resp providers.ValidateResourceConfigResponse) {
|
||||
func (p *GRPCProvider) ValidateResourceConfig(ctx context.Context, r providers.ValidateResourceConfigRequest) (resp providers.ValidateResourceConfigResponse) {
|
||||
logger.Trace("GRPCProvider: ValidateResourceConfig")
|
||||
|
||||
schema := p.GetProviderSchema()
|
||||
schema := p.GetProviderSchema(ctx)
|
||||
if schema.Diagnostics.HasErrors() {
|
||||
resp.Diagnostics = schema.Diagnostics
|
||||
return resp
|
||||
@@ -240,7 +247,7 @@ func (p *GRPCProvider) ValidateResourceConfig(r providers.ValidateResourceConfig
|
||||
Config: &proto.DynamicValue{Msgpack: mp},
|
||||
}
|
||||
|
||||
protoResp, err := p.client.ValidateResourceTypeConfig(p.ctx, protoReq)
|
||||
protoResp, err := p.client.ValidateResourceTypeConfig(ctx, protoReq)
|
||||
if err != nil {
|
||||
resp.Diagnostics = resp.Diagnostics.Append(grpcErr(err))
|
||||
return resp
|
||||
@@ -250,10 +257,10 @@ func (p *GRPCProvider) ValidateResourceConfig(r providers.ValidateResourceConfig
|
||||
return resp
|
||||
}
|
||||
|
||||
func (p *GRPCProvider) ValidateDataResourceConfig(r providers.ValidateDataResourceConfigRequest) (resp providers.ValidateDataResourceConfigResponse) {
|
||||
func (p *GRPCProvider) ValidateDataResourceConfig(ctx context.Context, r providers.ValidateDataResourceConfigRequest) (resp providers.ValidateDataResourceConfigResponse) {
|
||||
logger.Trace("GRPCProvider: ValidateDataResourceConfig")
|
||||
|
||||
schema := p.GetProviderSchema()
|
||||
schema := p.GetProviderSchema(ctx)
|
||||
if schema.Diagnostics.HasErrors() {
|
||||
resp.Diagnostics = schema.Diagnostics
|
||||
return resp
|
||||
@@ -276,7 +283,7 @@ func (p *GRPCProvider) ValidateDataResourceConfig(r providers.ValidateDataResour
|
||||
Config: &proto.DynamicValue{Msgpack: mp},
|
||||
}
|
||||
|
||||
protoResp, err := p.client.ValidateDataSourceConfig(p.ctx, protoReq)
|
||||
protoResp, err := p.client.ValidateDataSourceConfig(ctx, protoReq)
|
||||
if err != nil {
|
||||
resp.Diagnostics = resp.Diagnostics.Append(grpcErr(err))
|
||||
return resp
|
||||
@@ -285,10 +292,10 @@ func (p *GRPCProvider) ValidateDataResourceConfig(r providers.ValidateDataResour
|
||||
return resp
|
||||
}
|
||||
|
||||
func (p *GRPCProvider) UpgradeResourceState(r providers.UpgradeResourceStateRequest) (resp providers.UpgradeResourceStateResponse) {
|
||||
func (p *GRPCProvider) UpgradeResourceState(ctx context.Context, r providers.UpgradeResourceStateRequest) (resp providers.UpgradeResourceStateResponse) {
|
||||
logger.Trace("GRPCProvider: UpgradeResourceState")
|
||||
|
||||
schema := p.GetProviderSchema()
|
||||
schema := p.GetProviderSchema(ctx)
|
||||
if schema.Diagnostics.HasErrors() {
|
||||
resp.Diagnostics = schema.Diagnostics
|
||||
return resp
|
||||
@@ -309,7 +316,7 @@ func (p *GRPCProvider) UpgradeResourceState(r providers.UpgradeResourceStateRequ
|
||||
},
|
||||
}
|
||||
|
||||
protoResp, err := p.client.UpgradeResourceState(p.ctx, protoReq)
|
||||
protoResp, err := p.client.UpgradeResourceState(ctx, protoReq)
|
||||
if err != nil {
|
||||
resp.Diagnostics = resp.Diagnostics.Append(grpcErr(err))
|
||||
return resp
|
||||
@@ -332,10 +339,10 @@ func (p *GRPCProvider) UpgradeResourceState(r providers.UpgradeResourceStateRequ
|
||||
return resp
|
||||
}
|
||||
|
||||
func (p *GRPCProvider) ConfigureProvider(r providers.ConfigureProviderRequest) (resp providers.ConfigureProviderResponse) {
|
||||
func (p *GRPCProvider) ConfigureProvider(ctx context.Context, r providers.ConfigureProviderRequest) (resp providers.ConfigureProviderResponse) {
|
||||
logger.Trace("GRPCProvider: ConfigureProvider")
|
||||
|
||||
schema := p.GetProviderSchema()
|
||||
schema := p.GetProviderSchema(ctx)
|
||||
if schema.Diagnostics.HasErrors() {
|
||||
resp.Diagnostics = schema.Diagnostics
|
||||
return resp
|
||||
@@ -357,7 +364,7 @@ func (p *GRPCProvider) ConfigureProvider(r providers.ConfigureProviderRequest) (
|
||||
},
|
||||
}
|
||||
|
||||
protoResp, err := p.client.Configure(p.ctx, protoReq)
|
||||
protoResp, err := p.client.Configure(ctx, protoReq)
|
||||
if err != nil {
|
||||
resp.Diagnostics = resp.Diagnostics.Append(grpcErr(err))
|
||||
return resp
|
||||
@@ -366,10 +373,16 @@ func (p *GRPCProvider) ConfigureProvider(r providers.ConfigureProviderRequest) (
|
||||
return resp
|
||||
}
|
||||
|
||||
func (p *GRPCProvider) Stop() error {
|
||||
func (p *GRPCProvider) Stop(ctx context.Context) error {
|
||||
logger.Trace("GRPCProvider: Stop")
|
||||
// NOTE: The contract for providers.Interface guarantees that the ctx
|
||||
// passed to this function is never canceled, so we can safely use it
|
||||
// to make our "stop" request here. The context passed to other methods
|
||||
// _can_ be cancelled in some cases, so other methods should use
|
||||
// ctx = context.WithoutCancel(ctx) before making requests that need
|
||||
// to be able to terminate gracefully in response to "Stop".
|
||||
|
||||
resp, err := p.client.Stop(p.ctx, new(proto.Stop_Request))
|
||||
resp, err := p.client.Stop(ctx, new(proto.Stop_Request))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -380,10 +393,10 @@ func (p *GRPCProvider) Stop() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *GRPCProvider) ReadResource(r providers.ReadResourceRequest) (resp providers.ReadResourceResponse) {
|
||||
func (p *GRPCProvider) ReadResource(ctx context.Context, r providers.ReadResourceRequest) (resp providers.ReadResourceResponse) {
|
||||
logger.Trace("GRPCProvider: ReadResource")
|
||||
|
||||
schema := p.GetProviderSchema()
|
||||
schema := p.GetProviderSchema(ctx)
|
||||
if schema.Diagnostics.HasErrors() {
|
||||
resp.Diagnostics = schema.Diagnostics
|
||||
return resp
|
||||
@@ -418,7 +431,7 @@ func (p *GRPCProvider) ReadResource(r providers.ReadResourceRequest) (resp provi
|
||||
protoReq.ProviderMeta = &proto.DynamicValue{Msgpack: metaMP}
|
||||
}
|
||||
|
||||
protoResp, err := p.client.ReadResource(p.ctx, protoReq)
|
||||
protoResp, err := p.client.ReadResource(ctx, protoReq)
|
||||
if err != nil {
|
||||
resp.Diagnostics = resp.Diagnostics.Append(grpcErr(err))
|
||||
return resp
|
||||
@@ -436,10 +449,10 @@ func (p *GRPCProvider) ReadResource(r providers.ReadResourceRequest) (resp provi
|
||||
return resp
|
||||
}
|
||||
|
||||
func (p *GRPCProvider) PlanResourceChange(r providers.PlanResourceChangeRequest) (resp providers.PlanResourceChangeResponse) {
|
||||
func (p *GRPCProvider) PlanResourceChange(ctx context.Context, r providers.PlanResourceChangeRequest) (resp providers.PlanResourceChangeResponse) {
|
||||
logger.Trace("GRPCProvider: PlanResourceChange")
|
||||
|
||||
schema := p.GetProviderSchema()
|
||||
schema := p.GetProviderSchema(ctx)
|
||||
if schema.Diagnostics.HasErrors() {
|
||||
resp.Diagnostics = schema.Diagnostics
|
||||
return resp
|
||||
@@ -497,7 +510,7 @@ func (p *GRPCProvider) PlanResourceChange(r providers.PlanResourceChangeRequest)
|
||||
protoReq.ProviderMeta = &proto.DynamicValue{Msgpack: metaMP}
|
||||
}
|
||||
|
||||
protoResp, err := p.client.PlanResourceChange(p.ctx, protoReq)
|
||||
protoResp, err := p.client.PlanResourceChange(ctx, protoReq)
|
||||
if err != nil {
|
||||
resp.Diagnostics = resp.Diagnostics.Append(grpcErr(err))
|
||||
return resp
|
||||
@@ -522,15 +535,22 @@ func (p *GRPCProvider) PlanResourceChange(r providers.PlanResourceChangeRequest)
|
||||
return resp
|
||||
}
|
||||
|
||||
func (p *GRPCProvider) ApplyResourceChange(r providers.ApplyResourceChangeRequest) (resp providers.ApplyResourceChangeResponse) {
|
||||
func (p *GRPCProvider) ApplyResourceChange(ctx context.Context, r providers.ApplyResourceChangeRequest) (resp providers.ApplyResourceChangeResponse) {
|
||||
logger.Trace("GRPCProvider: ApplyResourceChange")
|
||||
|
||||
schema := p.GetProviderSchema()
|
||||
schema := p.GetProviderSchema(ctx)
|
||||
if schema.Diagnostics.HasErrors() {
|
||||
resp.Diagnostics = schema.Diagnostics
|
||||
return resp
|
||||
}
|
||||
|
||||
// Aside from fetching the schema above, the work of this function must
|
||||
// not be directly canceled by the incoming context's cancellation
|
||||
// signal, because we ask a provider plugin to gracefully cancel by
|
||||
// calling the Stop method and then its apply operation must be allowed
|
||||
// to run to completion to terminate gracefully if possible.
|
||||
ctx = context.WithoutCancel(ctx)
|
||||
|
||||
resSchema, ok := schema.ResourceTypes[r.TypeName]
|
||||
if !ok {
|
||||
resp.Diagnostics = resp.Diagnostics.Append(fmt.Errorf("unknown resource type %q", r.TypeName))
|
||||
@@ -572,7 +592,7 @@ func (p *GRPCProvider) ApplyResourceChange(r providers.ApplyResourceChangeReques
|
||||
protoReq.ProviderMeta = &proto.DynamicValue{Msgpack: metaMP}
|
||||
}
|
||||
|
||||
protoResp, err := p.client.ApplyResourceChange(p.ctx, protoReq)
|
||||
protoResp, err := p.client.ApplyResourceChange(ctx, protoReq)
|
||||
if err != nil {
|
||||
resp.Diagnostics = resp.Diagnostics.Append(grpcErr(err))
|
||||
return resp
|
||||
@@ -593,10 +613,10 @@ func (p *GRPCProvider) ApplyResourceChange(r providers.ApplyResourceChangeReques
|
||||
return resp
|
||||
}
|
||||
|
||||
func (p *GRPCProvider) ImportResourceState(r providers.ImportResourceStateRequest) (resp providers.ImportResourceStateResponse) {
|
||||
func (p *GRPCProvider) ImportResourceState(ctx context.Context, r providers.ImportResourceStateRequest) (resp providers.ImportResourceStateResponse) {
|
||||
logger.Trace("GRPCProvider: ImportResourceState")
|
||||
|
||||
schema := p.GetProviderSchema()
|
||||
schema := p.GetProviderSchema(ctx)
|
||||
if schema.Diagnostics.HasErrors() {
|
||||
resp.Diagnostics = schema.Diagnostics
|
||||
return resp
|
||||
@@ -607,7 +627,7 @@ func (p *GRPCProvider) ImportResourceState(r providers.ImportResourceStateReques
|
||||
Id: r.ID,
|
||||
}
|
||||
|
||||
protoResp, err := p.client.ImportResourceState(p.ctx, protoReq)
|
||||
protoResp, err := p.client.ImportResourceState(ctx, protoReq)
|
||||
if err != nil {
|
||||
resp.Diagnostics = resp.Diagnostics.Append(grpcErr(err))
|
||||
return resp
|
||||
@@ -638,11 +658,11 @@ func (p *GRPCProvider) ImportResourceState(r providers.ImportResourceStateReques
|
||||
return resp
|
||||
}
|
||||
|
||||
func (p *GRPCProvider) MoveResourceState(r providers.MoveResourceStateRequest) providers.MoveResourceStateResponse {
|
||||
func (p *GRPCProvider) MoveResourceState(ctx context.Context, r providers.MoveResourceStateRequest) providers.MoveResourceStateResponse {
|
||||
var resp providers.MoveResourceStateResponse
|
||||
logger.Trace("GRPCProvider: MoveResourceState")
|
||||
|
||||
schema := p.GetProviderSchema()
|
||||
schema := p.GetProviderSchema(ctx)
|
||||
if schema.Diagnostics.HasErrors() {
|
||||
resp.Diagnostics = schema.Diagnostics
|
||||
return resp
|
||||
@@ -666,7 +686,7 @@ func (p *GRPCProvider) MoveResourceState(r providers.MoveResourceStateRequest) p
|
||||
TargetTypeName: r.TargetTypeName,
|
||||
}
|
||||
|
||||
protoResp, err := p.client.MoveResourceState(p.ctx, protoReq)
|
||||
protoResp, err := p.client.MoveResourceState(ctx, protoReq)
|
||||
if err != nil {
|
||||
resp.Diagnostics = resp.Diagnostics.Append(grpcErr(err))
|
||||
return resp
|
||||
@@ -684,10 +704,10 @@ func (p *GRPCProvider) MoveResourceState(r providers.MoveResourceStateRequest) p
|
||||
return resp
|
||||
}
|
||||
|
||||
func (p *GRPCProvider) ReadDataSource(r providers.ReadDataSourceRequest) (resp providers.ReadDataSourceResponse) {
|
||||
func (p *GRPCProvider) ReadDataSource(ctx context.Context, r providers.ReadDataSourceRequest) (resp providers.ReadDataSourceResponse) {
|
||||
logger.Trace("GRPCProvider: ReadDataSource")
|
||||
|
||||
schema := p.GetProviderSchema()
|
||||
schema := p.GetProviderSchema(ctx)
|
||||
if schema.Diagnostics.HasErrors() {
|
||||
resp.Diagnostics = schema.Diagnostics
|
||||
return resp
|
||||
@@ -722,7 +742,7 @@ func (p *GRPCProvider) ReadDataSource(r providers.ReadDataSourceRequest) (resp p
|
||||
protoReq.ProviderMeta = &proto.DynamicValue{Msgpack: metaMP}
|
||||
}
|
||||
|
||||
protoResp, err := p.client.ReadDataSource(p.ctx, protoReq)
|
||||
protoResp, err := p.client.ReadDataSource(ctx, protoReq)
|
||||
if err != nil {
|
||||
resp.Diagnostics = resp.Diagnostics.Append(grpcErr(err))
|
||||
return resp
|
||||
@@ -739,12 +759,12 @@ func (p *GRPCProvider) ReadDataSource(r providers.ReadDataSourceRequest) (resp p
|
||||
return resp
|
||||
}
|
||||
|
||||
func (p *GRPCProvider) GetFunctions() (resp providers.GetFunctionsResponse) {
|
||||
func (p *GRPCProvider) GetFunctions(ctx context.Context) (resp providers.GetFunctionsResponse) {
|
||||
logger.Trace("GRPCProvider: GetFunctions")
|
||||
|
||||
protoReq := &proto.GetFunctions_Request{}
|
||||
|
||||
protoResp, err := p.client.GetFunctions(p.ctx, protoReq)
|
||||
protoResp, err := p.client.GetFunctions(ctx, protoReq)
|
||||
if err != nil {
|
||||
resp.Diagnostics = resp.Diagnostics.Append(grpcErr(err))
|
||||
return resp
|
||||
@@ -759,10 +779,10 @@ func (p *GRPCProvider) GetFunctions() (resp providers.GetFunctionsResponse) {
|
||||
return resp
|
||||
}
|
||||
|
||||
func (p *GRPCProvider) CallFunction(r providers.CallFunctionRequest) (resp providers.CallFunctionResponse) {
|
||||
func (p *GRPCProvider) CallFunction(ctx context.Context, r providers.CallFunctionRequest) (resp providers.CallFunctionResponse) {
|
||||
logger.Trace("GRPCProvider: CallFunction")
|
||||
|
||||
schema := p.GetProviderSchema()
|
||||
schema := p.GetProviderSchema(ctx)
|
||||
if schema.Diagnostics.HasErrors() {
|
||||
// This should be unreachable
|
||||
resp.Error = schema.Diagnostics.Err()
|
||||
@@ -771,7 +791,7 @@ func (p *GRPCProvider) CallFunction(r providers.CallFunctionRequest) (resp provi
|
||||
|
||||
spec, ok := schema.Functions[r.Name]
|
||||
if !ok {
|
||||
funcs := p.GetFunctions()
|
||||
funcs := p.GetFunctions(ctx)
|
||||
if funcs.Diagnostics.HasErrors() {
|
||||
// This should be unreachable
|
||||
resp.Error = funcs.Diagnostics.Err()
|
||||
@@ -851,7 +871,7 @@ func (p *GRPCProvider) CallFunction(r providers.CallFunctionRequest) (resp provi
|
||||
}
|
||||
}
|
||||
|
||||
protoResp, err := p.client.CallFunction(p.ctx, protoReq)
|
||||
protoResp, err := p.client.CallFunction(ctx, protoReq)
|
||||
if err != nil {
|
||||
resp.Error = err
|
||||
return
|
||||
@@ -873,7 +893,7 @@ func (p *GRPCProvider) CallFunction(r providers.CallFunctionRequest) (resp provi
|
||||
}
|
||||
|
||||
// closing the grpc connection is final, and tofu will call it at the end of every phase.
|
||||
func (p *GRPCProvider) Close() error {
|
||||
func (p *GRPCProvider) Close(ctx context.Context) error {
|
||||
logger.Trace("GRPCProvider: Close")
|
||||
|
||||
// Make sure to stop the server if we're not running within go-plugin.
|
||||
|
||||
@@ -122,7 +122,7 @@ func TestGRPCProvider_GetSchema(t *testing.T) {
|
||||
client: mockProviderClient(t),
|
||||
}
|
||||
|
||||
resp := p.GetProviderSchema()
|
||||
resp := p.GetProviderSchema(t.Context())
|
||||
checkDiags(t, resp.Diagnostics)
|
||||
}
|
||||
|
||||
@@ -142,7 +142,7 @@ func TestGRPCProvider_GetSchema_GRPCError(t *testing.T) {
|
||||
client: client,
|
||||
}
|
||||
|
||||
resp := p.GetProviderSchema()
|
||||
resp := p.GetProviderSchema(t.Context())
|
||||
|
||||
checkDiagsHasError(t, resp.Diagnostics)
|
||||
}
|
||||
@@ -175,7 +175,7 @@ func TestGRPCProvider_GetSchema_GlobalCacheEnabled(t *testing.T) {
|
||||
client: client,
|
||||
Addr: providerAddr,
|
||||
}
|
||||
resp := p.GetProviderSchema()
|
||||
resp := p.GetProviderSchema(t.Context())
|
||||
|
||||
checkDiags(t, resp.Diagnostics)
|
||||
if !cmp.Equal(resp.Provider.Version, mockedProviderResponse.Version) {
|
||||
@@ -186,7 +186,7 @@ func TestGRPCProvider_GetSchema_GlobalCacheEnabled(t *testing.T) {
|
||||
client: client,
|
||||
Addr: providerAddr,
|
||||
}
|
||||
resp = p.GetProviderSchema()
|
||||
resp = p.GetProviderSchema(t.Context())
|
||||
|
||||
checkDiags(t, resp.Diagnostics)
|
||||
if !cmp.Equal(resp.Provider.Version, mockedProviderResponse.Version) {
|
||||
@@ -222,7 +222,7 @@ func TestGRPCProvider_GetSchema_GlobalCacheDisabled(t *testing.T) {
|
||||
client: client,
|
||||
Addr: providerAddr,
|
||||
}
|
||||
resp := p.GetProviderSchema()
|
||||
resp := p.GetProviderSchema(t.Context())
|
||||
|
||||
checkDiags(t, resp.Diagnostics)
|
||||
if !cmp.Equal(resp.Provider.Version, mockedProviderResponse.Version) {
|
||||
@@ -233,7 +233,7 @@ func TestGRPCProvider_GetSchema_GlobalCacheDisabled(t *testing.T) {
|
||||
client: client,
|
||||
Addr: providerAddr,
|
||||
}
|
||||
resp = p.GetProviderSchema()
|
||||
resp = p.GetProviderSchema(t.Context())
|
||||
|
||||
checkDiags(t, resp.Diagnostics)
|
||||
if !cmp.Equal(resp.Provider.Version, mockedProviderResponse.Version) {
|
||||
@@ -267,7 +267,7 @@ func TestGRPCProvider_GetSchema_ResponseErrorDiagnostic(t *testing.T) {
|
||||
client: client,
|
||||
}
|
||||
|
||||
resp := p.GetProviderSchema()
|
||||
resp := p.GetProviderSchema(t.Context())
|
||||
|
||||
checkDiagsHasError(t, resp.Diagnostics)
|
||||
}
|
||||
@@ -284,7 +284,7 @@ func TestGRPCProvider_PrepareProviderConfig(t *testing.T) {
|
||||
).Return(&proto.PrepareProviderConfig_Response{}, nil)
|
||||
|
||||
cfg := hcl2shim.HCL2ValueFromConfigValue(map[string]interface{}{"attr": "value"})
|
||||
resp := p.ValidateProviderConfig(providers.ValidateProviderConfigRequest{Config: cfg})
|
||||
resp := p.ValidateProviderConfig(t.Context(), providers.ValidateProviderConfigRequest{Config: cfg})
|
||||
checkDiags(t, resp.Diagnostics)
|
||||
}
|
||||
|
||||
@@ -300,7 +300,7 @@ func TestGRPCProvider_ValidateResourceConfig(t *testing.T) {
|
||||
).Return(&proto.ValidateResourceTypeConfig_Response{}, nil)
|
||||
|
||||
cfg := hcl2shim.HCL2ValueFromConfigValue(map[string]interface{}{"attr": "value"})
|
||||
resp := p.ValidateResourceConfig(providers.ValidateResourceConfigRequest{
|
||||
resp := p.ValidateResourceConfig(t.Context(), providers.ValidateResourceConfigRequest{
|
||||
TypeName: "resource",
|
||||
Config: cfg,
|
||||
})
|
||||
@@ -319,7 +319,7 @@ func TestGRPCProvider_ValidateDataSourceConfig(t *testing.T) {
|
||||
).Return(&proto.ValidateDataSourceConfig_Response{}, nil)
|
||||
|
||||
cfg := hcl2shim.HCL2ValueFromConfigValue(map[string]interface{}{"attr": "value"})
|
||||
resp := p.ValidateDataResourceConfig(providers.ValidateDataResourceConfigRequest{
|
||||
resp := p.ValidateDataResourceConfig(t.Context(), providers.ValidateDataResourceConfigRequest{
|
||||
TypeName: "data",
|
||||
Config: cfg,
|
||||
})
|
||||
@@ -341,7 +341,7 @@ func TestGRPCProvider_UpgradeResourceState(t *testing.T) {
|
||||
},
|
||||
}, nil)
|
||||
|
||||
resp := p.UpgradeResourceState(providers.UpgradeResourceStateRequest{
|
||||
resp := p.UpgradeResourceState(t.Context(), providers.UpgradeResourceStateRequest{
|
||||
TypeName: "resource",
|
||||
Version: 0,
|
||||
RawStateJSON: []byte(`{"old_attr":"bar"}`),
|
||||
@@ -372,7 +372,7 @@ func TestGRPCProvider_UpgradeResourceStateJSON(t *testing.T) {
|
||||
},
|
||||
}, nil)
|
||||
|
||||
resp := p.UpgradeResourceState(providers.UpgradeResourceStateRequest{
|
||||
resp := p.UpgradeResourceState(t.Context(), providers.UpgradeResourceStateRequest{
|
||||
TypeName: "resource",
|
||||
Version: 0,
|
||||
RawStateJSON: []byte(`{"old_attr":"bar"}`),
|
||||
@@ -404,7 +404,7 @@ func TestGRPCProvider_MoveResourceState(t *testing.T) {
|
||||
TargetPrivate: []byte(`{"meta": "data"}`),
|
||||
}, nil)
|
||||
|
||||
resp := p.MoveResourceState(providers.MoveResourceStateRequest{
|
||||
resp := p.MoveResourceState(t.Context(), providers.MoveResourceStateRequest{
|
||||
SourceTypeName: "resource_old",
|
||||
SourceSchemaVersion: 0,
|
||||
TargetTypeName: "resource",
|
||||
@@ -435,7 +435,7 @@ func TestGRPCProvider_Configure(t *testing.T) {
|
||||
gomock.Any(),
|
||||
).Return(&proto.Configure_Response{}, nil)
|
||||
|
||||
resp := p.ConfigureProvider(providers.ConfigureProviderRequest{
|
||||
resp := p.ConfigureProvider(t.Context(), providers.ConfigureProviderRequest{
|
||||
Config: cty.ObjectVal(map[string]cty.Value{
|
||||
"attr": cty.StringVal("foo"),
|
||||
}),
|
||||
@@ -455,7 +455,7 @@ func TestGRPCProvider_Stop(t *testing.T) {
|
||||
gomock.Any(),
|
||||
).Return(&proto.Stop_Response{}, nil)
|
||||
|
||||
err := p.Stop()
|
||||
err := p.Stop(t.Context())
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
@@ -476,7 +476,7 @@ func TestGRPCProvider_ReadResource(t *testing.T) {
|
||||
},
|
||||
}, nil)
|
||||
|
||||
resp := p.ReadResource(providers.ReadResourceRequest{
|
||||
resp := p.ReadResource(t.Context(), providers.ReadResourceRequest{
|
||||
TypeName: "resource",
|
||||
PriorState: cty.ObjectVal(map[string]cty.Value{
|
||||
"attr": cty.StringVal("foo"),
|
||||
@@ -509,7 +509,7 @@ func TestGRPCProvider_ReadResourceJSON(t *testing.T) {
|
||||
},
|
||||
}, nil)
|
||||
|
||||
resp := p.ReadResource(providers.ReadResourceRequest{
|
||||
resp := p.ReadResource(t.Context(), providers.ReadResourceRequest{
|
||||
TypeName: "resource",
|
||||
PriorState: cty.ObjectVal(map[string]cty.Value{
|
||||
"attr": cty.StringVal("foo"),
|
||||
@@ -545,7 +545,7 @@ func TestGRPCProvider_ReadEmptyJSON(t *testing.T) {
|
||||
obj := cty.ObjectVal(map[string]cty.Value{
|
||||
"attr": cty.StringVal("foo"),
|
||||
})
|
||||
resp := p.ReadResource(providers.ReadResourceRequest{
|
||||
resp := p.ReadResource(t.Context(), providers.ReadResourceRequest{
|
||||
TypeName: "resource",
|
||||
PriorState: obj,
|
||||
})
|
||||
@@ -588,7 +588,7 @@ func TestGRPCProvider_PlanResourceChange(t *testing.T) {
|
||||
PlannedPrivate: expectedPrivate,
|
||||
}, nil)
|
||||
|
||||
resp := p.PlanResourceChange(providers.PlanResourceChangeRequest{
|
||||
resp := p.PlanResourceChange(t.Context(), providers.PlanResourceChangeRequest{
|
||||
TypeName: "resource",
|
||||
PriorState: cty.ObjectVal(map[string]cty.Value{
|
||||
"attr": cty.StringVal("foo"),
|
||||
@@ -651,7 +651,7 @@ func TestGRPCProvider_PlanResourceChangeJSON(t *testing.T) {
|
||||
PlannedPrivate: expectedPrivate,
|
||||
}, nil)
|
||||
|
||||
resp := p.PlanResourceChange(providers.PlanResourceChangeRequest{
|
||||
resp := p.PlanResourceChange(t.Context(), providers.PlanResourceChangeRequest{
|
||||
TypeName: "resource",
|
||||
PriorState: cty.ObjectVal(map[string]cty.Value{
|
||||
"attr": cty.StringVal("foo"),
|
||||
@@ -703,7 +703,7 @@ func TestGRPCProvider_ApplyResourceChange(t *testing.T) {
|
||||
Private: expectedPrivate,
|
||||
}, nil)
|
||||
|
||||
resp := p.ApplyResourceChange(providers.ApplyResourceChangeRequest{
|
||||
resp := p.ApplyResourceChange(t.Context(), providers.ApplyResourceChangeRequest{
|
||||
TypeName: "resource",
|
||||
PriorState: cty.ObjectVal(map[string]cty.Value{
|
||||
"attr": cty.StringVal("foo"),
|
||||
@@ -749,7 +749,7 @@ func TestGRPCProvider_ApplyResourceChangeJSON(t *testing.T) {
|
||||
Private: expectedPrivate,
|
||||
}, nil)
|
||||
|
||||
resp := p.ApplyResourceChange(providers.ApplyResourceChangeRequest{
|
||||
resp := p.ApplyResourceChange(t.Context(), providers.ApplyResourceChangeRequest{
|
||||
TypeName: "resource",
|
||||
PriorState: cty.ObjectVal(map[string]cty.Value{
|
||||
"attr": cty.StringVal("foo"),
|
||||
@@ -801,7 +801,7 @@ func TestGRPCProvider_ImportResourceState(t *testing.T) {
|
||||
},
|
||||
}, nil)
|
||||
|
||||
resp := p.ImportResourceState(providers.ImportResourceStateRequest{
|
||||
resp := p.ImportResourceState(t.Context(), providers.ImportResourceStateRequest{
|
||||
TypeName: "resource",
|
||||
ID: "foo",
|
||||
})
|
||||
@@ -844,7 +844,7 @@ func TestGRPCProvider_ImportResourceStateJSON(t *testing.T) {
|
||||
},
|
||||
}, nil)
|
||||
|
||||
resp := p.ImportResourceState(providers.ImportResourceStateRequest{
|
||||
resp := p.ImportResourceState(t.Context(), providers.ImportResourceStateRequest{
|
||||
TypeName: "resource",
|
||||
ID: "foo",
|
||||
})
|
||||
@@ -880,7 +880,7 @@ func TestGRPCProvider_ReadDataSource(t *testing.T) {
|
||||
},
|
||||
}, nil)
|
||||
|
||||
resp := p.ReadDataSource(providers.ReadDataSourceRequest{
|
||||
resp := p.ReadDataSource(t.Context(), providers.ReadDataSourceRequest{
|
||||
TypeName: "data",
|
||||
Config: cty.ObjectVal(map[string]cty.Value{
|
||||
"attr": cty.StringVal("foo"),
|
||||
@@ -913,7 +913,7 @@ func TestGRPCProvider_ReadDataSourceJSON(t *testing.T) {
|
||||
},
|
||||
}, nil)
|
||||
|
||||
resp := p.ReadDataSource(providers.ReadDataSourceRequest{
|
||||
resp := p.ReadDataSource(t.Context(), providers.ReadDataSourceRequest{
|
||||
TypeName: "data",
|
||||
Config: cty.ObjectVal(map[string]cty.Value{
|
||||
"attr": cty.StringVal("foo"),
|
||||
@@ -944,7 +944,7 @@ func TestGRPCProvider_CallFunction(t *testing.T) {
|
||||
Result: &proto.DynamicValue{Json: []byte(`"foo"`)},
|
||||
}, nil)
|
||||
|
||||
resp := p.CallFunction(providers.CallFunctionRequest{
|
||||
resp := p.CallFunction(t.Context(), providers.CallFunctionRequest{
|
||||
Name: "fn",
|
||||
Arguments: []cty.Value{cty.StringVal("bar"), cty.NilVal},
|
||||
})
|
||||
|
||||
@@ -68,6 +68,13 @@ type GRPCProvider struct {
|
||||
|
||||
// this context is created by the plugin package, and is canceled when the
|
||||
// plugin process ends.
|
||||
//
|
||||
// THIS IS NOT THE RIGHT CONTEXT TO USE FOR GRPC CALLS! This represents
|
||||
// the overall context in which the plugin was launched and represents the
|
||||
// full runtime of the plugin process, whereas the [context.Context] passed
|
||||
// to individual [providers.Interface] methods is a more tightly-scoped
|
||||
// context focused on each individual request, and so is more appropriate
|
||||
// to use as the parent context for gRPC API calls.
|
||||
ctx context.Context
|
||||
|
||||
mu sync.Mutex
|
||||
@@ -78,7 +85,7 @@ type GRPCProvider struct {
|
||||
|
||||
var _ providers.Interface = new(GRPCProvider)
|
||||
|
||||
func (p *GRPCProvider) GetProviderSchema() (resp providers.GetProviderSchemaResponse) {
|
||||
func (p *GRPCProvider) GetProviderSchema(ctx context.Context) (resp providers.GetProviderSchemaResponse) {
|
||||
logger.Trace("GRPCProvider.v6: GetProviderSchema")
|
||||
p.mu.Lock()
|
||||
defer p.mu.Unlock()
|
||||
@@ -115,7 +122,7 @@ func (p *GRPCProvider) GetProviderSchema() (resp providers.GetProviderSchemaResp
|
||||
// size much higher on the server side, which is the supported method for
|
||||
// determining payload size.
|
||||
const maxRecvSize = 64 << 20
|
||||
protoResp, err := p.client.GetProviderSchema(p.ctx, new(proto6.GetProviderSchema_Request), grpc.MaxRecvMsgSizeCallOption{MaxRecvMsgSize: maxRecvSize})
|
||||
protoResp, err := p.client.GetProviderSchema(ctx, new(proto6.GetProviderSchema_Request), grpc.MaxRecvMsgSizeCallOption{MaxRecvMsgSize: maxRecvSize})
|
||||
if err != nil {
|
||||
resp.Diagnostics = resp.Diagnostics.Append(grpcErr(err))
|
||||
return resp
|
||||
@@ -176,10 +183,10 @@ func (p *GRPCProvider) GetProviderSchema() (resp providers.GetProviderSchemaResp
|
||||
return resp
|
||||
}
|
||||
|
||||
func (p *GRPCProvider) ValidateProviderConfig(r providers.ValidateProviderConfigRequest) (resp providers.ValidateProviderConfigResponse) {
|
||||
func (p *GRPCProvider) ValidateProviderConfig(ctx context.Context, r providers.ValidateProviderConfigRequest) (resp providers.ValidateProviderConfigResponse) {
|
||||
logger.Trace("GRPCProvider.v6: ValidateProviderConfig")
|
||||
|
||||
schema := p.GetProviderSchema()
|
||||
schema := p.GetProviderSchema(ctx)
|
||||
if schema.Diagnostics.HasErrors() {
|
||||
resp.Diagnostics = schema.Diagnostics
|
||||
return resp
|
||||
@@ -197,7 +204,7 @@ func (p *GRPCProvider) ValidateProviderConfig(r providers.ValidateProviderConfig
|
||||
Config: &proto6.DynamicValue{Msgpack: mp},
|
||||
}
|
||||
|
||||
protoResp, err := p.client.ValidateProviderConfig(p.ctx, protoReq)
|
||||
protoResp, err := p.client.ValidateProviderConfig(ctx, protoReq)
|
||||
if err != nil {
|
||||
resp.Diagnostics = resp.Diagnostics.Append(grpcErr(err))
|
||||
return resp
|
||||
@@ -207,10 +214,10 @@ func (p *GRPCProvider) ValidateProviderConfig(r providers.ValidateProviderConfig
|
||||
return resp
|
||||
}
|
||||
|
||||
func (p *GRPCProvider) ValidateResourceConfig(r providers.ValidateResourceConfigRequest) (resp providers.ValidateResourceConfigResponse) {
|
||||
func (p *GRPCProvider) ValidateResourceConfig(ctx context.Context, r providers.ValidateResourceConfigRequest) (resp providers.ValidateResourceConfigResponse) {
|
||||
logger.Trace("GRPCProvider.v6: ValidateResourceConfig")
|
||||
|
||||
schema := p.GetProviderSchema()
|
||||
schema := p.GetProviderSchema(ctx)
|
||||
if schema.Diagnostics.HasErrors() {
|
||||
resp.Diagnostics = schema.Diagnostics
|
||||
return resp
|
||||
@@ -233,7 +240,7 @@ func (p *GRPCProvider) ValidateResourceConfig(r providers.ValidateResourceConfig
|
||||
Config: &proto6.DynamicValue{Msgpack: mp},
|
||||
}
|
||||
|
||||
protoResp, err := p.client.ValidateResourceConfig(p.ctx, protoReq)
|
||||
protoResp, err := p.client.ValidateResourceConfig(ctx, protoReq)
|
||||
if err != nil {
|
||||
resp.Diagnostics = resp.Diagnostics.Append(grpcErr(err))
|
||||
return resp
|
||||
@@ -243,10 +250,10 @@ func (p *GRPCProvider) ValidateResourceConfig(r providers.ValidateResourceConfig
|
||||
return resp
|
||||
}
|
||||
|
||||
func (p *GRPCProvider) ValidateDataResourceConfig(r providers.ValidateDataResourceConfigRequest) (resp providers.ValidateDataResourceConfigResponse) {
|
||||
func (p *GRPCProvider) ValidateDataResourceConfig(ctx context.Context, r providers.ValidateDataResourceConfigRequest) (resp providers.ValidateDataResourceConfigResponse) {
|
||||
logger.Trace("GRPCProvider.v6: ValidateDataResourceConfig")
|
||||
|
||||
schema := p.GetProviderSchema()
|
||||
schema := p.GetProviderSchema(ctx)
|
||||
if schema.Diagnostics.HasErrors() {
|
||||
resp.Diagnostics = schema.Diagnostics
|
||||
return resp
|
||||
@@ -269,7 +276,7 @@ func (p *GRPCProvider) ValidateDataResourceConfig(r providers.ValidateDataResour
|
||||
Config: &proto6.DynamicValue{Msgpack: mp},
|
||||
}
|
||||
|
||||
protoResp, err := p.client.ValidateDataResourceConfig(p.ctx, protoReq)
|
||||
protoResp, err := p.client.ValidateDataResourceConfig(ctx, protoReq)
|
||||
if err != nil {
|
||||
resp.Diagnostics = resp.Diagnostics.Append(grpcErr(err))
|
||||
return resp
|
||||
@@ -278,10 +285,10 @@ func (p *GRPCProvider) ValidateDataResourceConfig(r providers.ValidateDataResour
|
||||
return resp
|
||||
}
|
||||
|
||||
func (p *GRPCProvider) UpgradeResourceState(r providers.UpgradeResourceStateRequest) (resp providers.UpgradeResourceStateResponse) {
|
||||
func (p *GRPCProvider) UpgradeResourceState(ctx context.Context, r providers.UpgradeResourceStateRequest) (resp providers.UpgradeResourceStateResponse) {
|
||||
logger.Trace("GRPCProvider.v6: UpgradeResourceState")
|
||||
|
||||
schema := p.GetProviderSchema()
|
||||
schema := p.GetProviderSchema(ctx)
|
||||
if schema.Diagnostics.HasErrors() {
|
||||
resp.Diagnostics = schema.Diagnostics
|
||||
return resp
|
||||
@@ -302,7 +309,7 @@ func (p *GRPCProvider) UpgradeResourceState(r providers.UpgradeResourceStateRequ
|
||||
},
|
||||
}
|
||||
|
||||
protoResp, err := p.client.UpgradeResourceState(p.ctx, protoReq)
|
||||
protoResp, err := p.client.UpgradeResourceState(ctx, protoReq)
|
||||
if err != nil {
|
||||
resp.Diagnostics = resp.Diagnostics.Append(grpcErr(err))
|
||||
return resp
|
||||
@@ -325,10 +332,10 @@ func (p *GRPCProvider) UpgradeResourceState(r providers.UpgradeResourceStateRequ
|
||||
return resp
|
||||
}
|
||||
|
||||
func (p *GRPCProvider) ConfigureProvider(r providers.ConfigureProviderRequest) (resp providers.ConfigureProviderResponse) {
|
||||
func (p *GRPCProvider) ConfigureProvider(ctx context.Context, r providers.ConfigureProviderRequest) (resp providers.ConfigureProviderResponse) {
|
||||
logger.Trace("GRPCProvider.v6: ConfigureProvider")
|
||||
|
||||
schema := p.GetProviderSchema()
|
||||
schema := p.GetProviderSchema(ctx)
|
||||
|
||||
var mp []byte
|
||||
|
||||
@@ -346,7 +353,7 @@ func (p *GRPCProvider) ConfigureProvider(r providers.ConfigureProviderRequest) (
|
||||
},
|
||||
}
|
||||
|
||||
protoResp, err := p.client.ConfigureProvider(p.ctx, protoReq)
|
||||
protoResp, err := p.client.ConfigureProvider(ctx, protoReq)
|
||||
if err != nil {
|
||||
resp.Diagnostics = resp.Diagnostics.Append(grpcErr(err))
|
||||
return resp
|
||||
@@ -355,10 +362,16 @@ func (p *GRPCProvider) ConfigureProvider(r providers.ConfigureProviderRequest) (
|
||||
return resp
|
||||
}
|
||||
|
||||
func (p *GRPCProvider) Stop() error {
|
||||
func (p *GRPCProvider) Stop(ctx context.Context) error {
|
||||
logger.Trace("GRPCProvider.v6: Stop")
|
||||
// NOTE: The contract for providers.Interface guarantees that the ctx
|
||||
// passed to this function is never canceled, so we can safely use it
|
||||
// to make our "stop" request here. The context passed to other methods
|
||||
// _can_ be cancelled in some cases, so other methods should use
|
||||
// ctx = context.WithoutCancel(ctx) before making requests that need
|
||||
// to be able to terminate gracefully in response to "Stop".
|
||||
|
||||
resp, err := p.client.StopProvider(p.ctx, new(proto6.StopProvider_Request))
|
||||
resp, err := p.client.StopProvider(ctx, new(proto6.StopProvider_Request))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -369,10 +382,10 @@ func (p *GRPCProvider) Stop() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *GRPCProvider) ReadResource(r providers.ReadResourceRequest) (resp providers.ReadResourceResponse) {
|
||||
func (p *GRPCProvider) ReadResource(ctx context.Context, r providers.ReadResourceRequest) (resp providers.ReadResourceResponse) {
|
||||
logger.Trace("GRPCProvider.v6: ReadResource")
|
||||
|
||||
schema := p.GetProviderSchema()
|
||||
schema := p.GetProviderSchema(ctx)
|
||||
if schema.Diagnostics.HasErrors() {
|
||||
resp.Diagnostics = schema.Diagnostics
|
||||
return resp
|
||||
@@ -407,7 +420,7 @@ func (p *GRPCProvider) ReadResource(r providers.ReadResourceRequest) (resp provi
|
||||
protoReq.ProviderMeta = &proto6.DynamicValue{Msgpack: metaMP}
|
||||
}
|
||||
|
||||
protoResp, err := p.client.ReadResource(p.ctx, protoReq)
|
||||
protoResp, err := p.client.ReadResource(ctx, protoReq)
|
||||
if err != nil {
|
||||
resp.Diagnostics = resp.Diagnostics.Append(grpcErr(err))
|
||||
return resp
|
||||
@@ -425,10 +438,10 @@ func (p *GRPCProvider) ReadResource(r providers.ReadResourceRequest) (resp provi
|
||||
return resp
|
||||
}
|
||||
|
||||
func (p *GRPCProvider) PlanResourceChange(r providers.PlanResourceChangeRequest) (resp providers.PlanResourceChangeResponse) {
|
||||
func (p *GRPCProvider) PlanResourceChange(ctx context.Context, r providers.PlanResourceChangeRequest) (resp providers.PlanResourceChangeResponse) {
|
||||
logger.Trace("GRPCProvider.v6: PlanResourceChange")
|
||||
|
||||
schema := p.GetProviderSchema()
|
||||
schema := p.GetProviderSchema(ctx)
|
||||
if schema.Diagnostics.HasErrors() {
|
||||
resp.Diagnostics = schema.Diagnostics
|
||||
return resp
|
||||
@@ -486,7 +499,7 @@ func (p *GRPCProvider) PlanResourceChange(r providers.PlanResourceChangeRequest)
|
||||
protoReq.ProviderMeta = &proto6.DynamicValue{Msgpack: metaMP}
|
||||
}
|
||||
|
||||
protoResp, err := p.client.PlanResourceChange(p.ctx, protoReq)
|
||||
protoResp, err := p.client.PlanResourceChange(ctx, protoReq)
|
||||
if err != nil {
|
||||
resp.Diagnostics = resp.Diagnostics.Append(grpcErr(err))
|
||||
return resp
|
||||
@@ -511,15 +524,22 @@ func (p *GRPCProvider) PlanResourceChange(r providers.PlanResourceChangeRequest)
|
||||
return resp
|
||||
}
|
||||
|
||||
func (p *GRPCProvider) ApplyResourceChange(r providers.ApplyResourceChangeRequest) (resp providers.ApplyResourceChangeResponse) {
|
||||
func (p *GRPCProvider) ApplyResourceChange(ctx context.Context, r providers.ApplyResourceChangeRequest) (resp providers.ApplyResourceChangeResponse) {
|
||||
logger.Trace("GRPCProvider.v6: ApplyResourceChange")
|
||||
|
||||
schema := p.GetProviderSchema()
|
||||
schema := p.GetProviderSchema(ctx)
|
||||
if schema.Diagnostics.HasErrors() {
|
||||
resp.Diagnostics = schema.Diagnostics
|
||||
return resp
|
||||
}
|
||||
|
||||
// Aside from fetching the schema above, the work of this function must
|
||||
// not be directly canceled by the incoming context's cancellation
|
||||
// signal, because we ask a provider plugin to gracefully cancel by
|
||||
// calling the Stop method and then its apply operation must be allowed
|
||||
// to run to completion to terminate gracefully if possible.
|
||||
ctx = context.WithoutCancel(ctx)
|
||||
|
||||
resSchema, ok := schema.ResourceTypes[r.TypeName]
|
||||
if !ok {
|
||||
resp.Diagnostics = resp.Diagnostics.Append(fmt.Errorf("unknown resource type %q", r.TypeName))
|
||||
@@ -561,7 +581,7 @@ func (p *GRPCProvider) ApplyResourceChange(r providers.ApplyResourceChangeReques
|
||||
protoReq.ProviderMeta = &proto6.DynamicValue{Msgpack: metaMP}
|
||||
}
|
||||
|
||||
protoResp, err := p.client.ApplyResourceChange(p.ctx, protoReq)
|
||||
protoResp, err := p.client.ApplyResourceChange(ctx, protoReq)
|
||||
if err != nil {
|
||||
resp.Diagnostics = resp.Diagnostics.Append(grpcErr(err))
|
||||
return resp
|
||||
@@ -582,10 +602,10 @@ func (p *GRPCProvider) ApplyResourceChange(r providers.ApplyResourceChangeReques
|
||||
return resp
|
||||
}
|
||||
|
||||
func (p *GRPCProvider) ImportResourceState(r providers.ImportResourceStateRequest) (resp providers.ImportResourceStateResponse) {
|
||||
func (p *GRPCProvider) ImportResourceState(ctx context.Context, r providers.ImportResourceStateRequest) (resp providers.ImportResourceStateResponse) {
|
||||
logger.Trace("GRPCProvider.v6: ImportResourceState")
|
||||
|
||||
schema := p.GetProviderSchema()
|
||||
schema := p.GetProviderSchema(ctx)
|
||||
if schema.Diagnostics.HasErrors() {
|
||||
resp.Diagnostics = schema.Diagnostics
|
||||
return resp
|
||||
@@ -596,7 +616,7 @@ func (p *GRPCProvider) ImportResourceState(r providers.ImportResourceStateReques
|
||||
Id: r.ID,
|
||||
}
|
||||
|
||||
protoResp, err := p.client.ImportResourceState(p.ctx, protoReq)
|
||||
protoResp, err := p.client.ImportResourceState(ctx, protoReq)
|
||||
if err != nil {
|
||||
resp.Diagnostics = resp.Diagnostics.Append(grpcErr(err))
|
||||
return resp
|
||||
@@ -627,11 +647,11 @@ func (p *GRPCProvider) ImportResourceState(r providers.ImportResourceStateReques
|
||||
return resp
|
||||
}
|
||||
|
||||
func (p *GRPCProvider) MoveResourceState(r providers.MoveResourceStateRequest) providers.MoveResourceStateResponse {
|
||||
func (p *GRPCProvider) MoveResourceState(ctx context.Context, r providers.MoveResourceStateRequest) providers.MoveResourceStateResponse {
|
||||
logger.Trace("GRPCProvider.v6: MoveResourceState")
|
||||
var resp providers.MoveResourceStateResponse
|
||||
|
||||
schema := p.GetProviderSchema()
|
||||
schema := p.GetProviderSchema(ctx)
|
||||
if schema.Diagnostics.HasErrors() {
|
||||
resp.Diagnostics = schema.Diagnostics
|
||||
return resp
|
||||
@@ -655,7 +675,7 @@ func (p *GRPCProvider) MoveResourceState(r providers.MoveResourceStateRequest) p
|
||||
TargetTypeName: r.TargetTypeName,
|
||||
}
|
||||
|
||||
protoResp, err := p.client.MoveResourceState(p.ctx, protoReq)
|
||||
protoResp, err := p.client.MoveResourceState(ctx, protoReq)
|
||||
if err != nil {
|
||||
resp.Diagnostics = resp.Diagnostics.Append(grpcErr(err))
|
||||
return resp
|
||||
@@ -673,10 +693,10 @@ func (p *GRPCProvider) MoveResourceState(r providers.MoveResourceStateRequest) p
|
||||
return resp
|
||||
}
|
||||
|
||||
func (p *GRPCProvider) ReadDataSource(r providers.ReadDataSourceRequest) (resp providers.ReadDataSourceResponse) {
|
||||
func (p *GRPCProvider) ReadDataSource(ctx context.Context, r providers.ReadDataSourceRequest) (resp providers.ReadDataSourceResponse) {
|
||||
logger.Trace("GRPCProvider.v6: ReadDataSource")
|
||||
|
||||
schema := p.GetProviderSchema()
|
||||
schema := p.GetProviderSchema(ctx)
|
||||
if schema.Diagnostics.HasErrors() {
|
||||
resp.Diagnostics = schema.Diagnostics
|
||||
return resp
|
||||
@@ -711,7 +731,7 @@ func (p *GRPCProvider) ReadDataSource(r providers.ReadDataSourceRequest) (resp p
|
||||
protoReq.ProviderMeta = &proto6.DynamicValue{Msgpack: metaMP}
|
||||
}
|
||||
|
||||
protoResp, err := p.client.ReadDataSource(p.ctx, protoReq)
|
||||
protoResp, err := p.client.ReadDataSource(ctx, protoReq)
|
||||
if err != nil {
|
||||
resp.Diagnostics = resp.Diagnostics.Append(grpcErr(err))
|
||||
return resp
|
||||
@@ -728,12 +748,12 @@ func (p *GRPCProvider) ReadDataSource(r providers.ReadDataSourceRequest) (resp p
|
||||
return resp
|
||||
}
|
||||
|
||||
func (p *GRPCProvider) GetFunctions() (resp providers.GetFunctionsResponse) {
|
||||
func (p *GRPCProvider) GetFunctions(ctx context.Context) (resp providers.GetFunctionsResponse) {
|
||||
logger.Trace("GRPCProvider6: GetFunctions")
|
||||
|
||||
protoReq := &proto6.GetFunctions_Request{}
|
||||
|
||||
protoResp, err := p.client.GetFunctions(p.ctx, protoReq)
|
||||
protoResp, err := p.client.GetFunctions(ctx, protoReq)
|
||||
if err != nil {
|
||||
resp.Diagnostics = resp.Diagnostics.Append(grpcErr(err))
|
||||
return resp
|
||||
@@ -748,10 +768,10 @@ func (p *GRPCProvider) GetFunctions() (resp providers.GetFunctionsResponse) {
|
||||
return resp
|
||||
}
|
||||
|
||||
func (p *GRPCProvider) CallFunction(r providers.CallFunctionRequest) (resp providers.CallFunctionResponse) {
|
||||
func (p *GRPCProvider) CallFunction(ctx context.Context, r providers.CallFunctionRequest) (resp providers.CallFunctionResponse) {
|
||||
logger.Trace("GRPCProvider6: CallFunction")
|
||||
|
||||
schema := p.GetProviderSchema()
|
||||
schema := p.GetProviderSchema(ctx)
|
||||
if schema.Diagnostics.HasErrors() {
|
||||
// This should be unreachable
|
||||
resp.Error = schema.Diagnostics.Err()
|
||||
@@ -760,7 +780,7 @@ func (p *GRPCProvider) CallFunction(r providers.CallFunctionRequest) (resp provi
|
||||
|
||||
spec, ok := schema.Functions[r.Name]
|
||||
if !ok {
|
||||
funcs := p.GetFunctions()
|
||||
funcs := p.GetFunctions(ctx)
|
||||
if funcs.Diagnostics.HasErrors() {
|
||||
// This should be unreachable
|
||||
resp.Error = funcs.Diagnostics.Err()
|
||||
@@ -840,7 +860,7 @@ func (p *GRPCProvider) CallFunction(r providers.CallFunctionRequest) (resp provi
|
||||
}
|
||||
}
|
||||
|
||||
protoResp, err := p.client.CallFunction(p.ctx, protoReq)
|
||||
protoResp, err := p.client.CallFunction(ctx, protoReq)
|
||||
if err != nil {
|
||||
resp.Error = err
|
||||
return
|
||||
@@ -862,7 +882,7 @@ func (p *GRPCProvider) CallFunction(r providers.CallFunctionRequest) (resp provi
|
||||
}
|
||||
|
||||
// closing the grpc connection is final, and tofu will call it at the end of every phase.
|
||||
func (p *GRPCProvider) Close() error {
|
||||
func (p *GRPCProvider) Close(_ context.Context) error {
|
||||
logger.Trace("GRPCProvider.v6: Close")
|
||||
|
||||
// Make sure to stop the server if we're not running within go-plugin.
|
||||
|
||||
@@ -129,7 +129,7 @@ func TestGRPCProvider_GetSchema(t *testing.T) {
|
||||
client: mockProviderClient(t),
|
||||
}
|
||||
|
||||
resp := p.GetProviderSchema()
|
||||
resp := p.GetProviderSchema(t.Context())
|
||||
checkDiags(t, resp.Diagnostics)
|
||||
}
|
||||
|
||||
@@ -149,7 +149,7 @@ func TestGRPCProvider_GetSchema_GRPCError(t *testing.T) {
|
||||
client: client,
|
||||
}
|
||||
|
||||
resp := p.GetProviderSchema()
|
||||
resp := p.GetProviderSchema(t.Context())
|
||||
|
||||
checkDiagsHasError(t, resp.Diagnostics)
|
||||
}
|
||||
@@ -180,7 +180,7 @@ func TestGRPCProvider_GetSchema_ResponseErrorDiagnostic(t *testing.T) {
|
||||
client: client,
|
||||
}
|
||||
|
||||
resp := p.GetProviderSchema()
|
||||
resp := p.GetProviderSchema(t.Context())
|
||||
|
||||
checkDiagsHasError(t, resp.Diagnostics)
|
||||
}
|
||||
@@ -213,7 +213,7 @@ func TestGRPCProvider_GetSchema_GlobalCacheEnabled(t *testing.T) {
|
||||
client: client,
|
||||
Addr: providerAddr,
|
||||
}
|
||||
resp := p.GetProviderSchema()
|
||||
resp := p.GetProviderSchema(t.Context())
|
||||
|
||||
checkDiags(t, resp.Diagnostics)
|
||||
if !cmp.Equal(resp.Provider.Version, mockedProviderResponse.Version) {
|
||||
@@ -224,7 +224,7 @@ func TestGRPCProvider_GetSchema_GlobalCacheEnabled(t *testing.T) {
|
||||
client: client,
|
||||
Addr: providerAddr,
|
||||
}
|
||||
resp = p.GetProviderSchema()
|
||||
resp = p.GetProviderSchema(t.Context())
|
||||
|
||||
checkDiags(t, resp.Diagnostics)
|
||||
if !cmp.Equal(resp.Provider.Version, mockedProviderResponse.Version) {
|
||||
@@ -260,7 +260,7 @@ func TestGRPCProvider_GetSchema_GlobalCacheDisabled(t *testing.T) {
|
||||
client: client,
|
||||
Addr: providerAddr,
|
||||
}
|
||||
resp := p.GetProviderSchema()
|
||||
resp := p.GetProviderSchema(t.Context())
|
||||
|
||||
checkDiags(t, resp.Diagnostics)
|
||||
if !cmp.Equal(resp.Provider.Version, mockedProviderResponse.Version) {
|
||||
@@ -271,7 +271,7 @@ func TestGRPCProvider_GetSchema_GlobalCacheDisabled(t *testing.T) {
|
||||
client: client,
|
||||
Addr: providerAddr,
|
||||
}
|
||||
resp = p.GetProviderSchema()
|
||||
resp = p.GetProviderSchema(t.Context())
|
||||
|
||||
checkDiags(t, resp.Diagnostics)
|
||||
if !cmp.Equal(resp.Provider.Version, mockedProviderResponse.Version) {
|
||||
@@ -291,7 +291,7 @@ func TestGRPCProvider_PrepareProviderConfig(t *testing.T) {
|
||||
).Return(&proto.ValidateProviderConfig_Response{}, nil)
|
||||
|
||||
cfg := hcl2shim.HCL2ValueFromConfigValue(map[string]interface{}{"attr": "value"})
|
||||
resp := p.ValidateProviderConfig(providers.ValidateProviderConfigRequest{Config: cfg})
|
||||
resp := p.ValidateProviderConfig(t.Context(), providers.ValidateProviderConfigRequest{Config: cfg})
|
||||
checkDiags(t, resp.Diagnostics)
|
||||
}
|
||||
|
||||
@@ -307,7 +307,7 @@ func TestGRPCProvider_ValidateResourceConfig(t *testing.T) {
|
||||
).Return(&proto.ValidateResourceConfig_Response{}, nil)
|
||||
|
||||
cfg := hcl2shim.HCL2ValueFromConfigValue(map[string]interface{}{"attr": "value"})
|
||||
resp := p.ValidateResourceConfig(providers.ValidateResourceConfigRequest{
|
||||
resp := p.ValidateResourceConfig(t.Context(), providers.ValidateResourceConfigRequest{
|
||||
TypeName: "resource",
|
||||
Config: cfg,
|
||||
})
|
||||
@@ -326,7 +326,7 @@ func TestGRPCProvider_ValidateDataResourceConfig(t *testing.T) {
|
||||
).Return(&proto.ValidateDataResourceConfig_Response{}, nil)
|
||||
|
||||
cfg := hcl2shim.HCL2ValueFromConfigValue(map[string]interface{}{"attr": "value"})
|
||||
resp := p.ValidateDataResourceConfig(providers.ValidateDataResourceConfigRequest{
|
||||
resp := p.ValidateDataResourceConfig(t.Context(), providers.ValidateDataResourceConfigRequest{
|
||||
TypeName: "data",
|
||||
Config: cfg,
|
||||
})
|
||||
@@ -348,7 +348,7 @@ func TestGRPCProvider_UpgradeResourceState(t *testing.T) {
|
||||
},
|
||||
}, nil)
|
||||
|
||||
resp := p.UpgradeResourceState(providers.UpgradeResourceStateRequest{
|
||||
resp := p.UpgradeResourceState(t.Context(), providers.UpgradeResourceStateRequest{
|
||||
TypeName: "resource",
|
||||
Version: 0,
|
||||
RawStateJSON: []byte(`{"old_attr":"bar"}`),
|
||||
@@ -379,7 +379,7 @@ func TestGRPCProvider_UpgradeResourceStateJSON(t *testing.T) {
|
||||
},
|
||||
}, nil)
|
||||
|
||||
resp := p.UpgradeResourceState(providers.UpgradeResourceStateRequest{
|
||||
resp := p.UpgradeResourceState(t.Context(), providers.UpgradeResourceStateRequest{
|
||||
TypeName: "resource",
|
||||
Version: 0,
|
||||
RawStateJSON: []byte(`{"old_attr":"bar"}`),
|
||||
@@ -411,7 +411,7 @@ func TestGRPCProvider_MoveResourceState(t *testing.T) {
|
||||
TargetPrivate: []byte(`{"meta": "data"}`),
|
||||
}, nil)
|
||||
|
||||
resp := p.MoveResourceState(providers.MoveResourceStateRequest{
|
||||
resp := p.MoveResourceState(t.Context(), providers.MoveResourceStateRequest{
|
||||
SourceTypeName: "resource_old",
|
||||
SourceSchemaVersion: 0,
|
||||
TargetTypeName: "resource",
|
||||
@@ -441,7 +441,7 @@ func TestGRPCProvider_Configure(t *testing.T) {
|
||||
gomock.Any(),
|
||||
).Return(&proto.ConfigureProvider_Response{}, nil)
|
||||
|
||||
resp := p.ConfigureProvider(providers.ConfigureProviderRequest{
|
||||
resp := p.ConfigureProvider(t.Context(), providers.ConfigureProviderRequest{
|
||||
Config: cty.ObjectVal(map[string]cty.Value{
|
||||
"attr": cty.StringVal("foo"),
|
||||
}),
|
||||
@@ -461,7 +461,7 @@ func TestGRPCProvider_Stop(t *testing.T) {
|
||||
gomock.Any(),
|
||||
).Return(&proto.StopProvider_Response{}, nil)
|
||||
|
||||
err := p.Stop()
|
||||
err := p.Stop(t.Context())
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
@@ -482,7 +482,7 @@ func TestGRPCProvider_ReadResource(t *testing.T) {
|
||||
},
|
||||
}, nil)
|
||||
|
||||
resp := p.ReadResource(providers.ReadResourceRequest{
|
||||
resp := p.ReadResource(t.Context(), providers.ReadResourceRequest{
|
||||
TypeName: "resource",
|
||||
PriorState: cty.ObjectVal(map[string]cty.Value{
|
||||
"attr": cty.StringVal("foo"),
|
||||
@@ -515,7 +515,7 @@ func TestGRPCProvider_ReadResourceJSON(t *testing.T) {
|
||||
},
|
||||
}, nil)
|
||||
|
||||
resp := p.ReadResource(providers.ReadResourceRequest{
|
||||
resp := p.ReadResource(t.Context(), providers.ReadResourceRequest{
|
||||
TypeName: "resource",
|
||||
PriorState: cty.ObjectVal(map[string]cty.Value{
|
||||
"attr": cty.StringVal("foo"),
|
||||
@@ -551,7 +551,7 @@ func TestGRPCProvider_ReadEmptyJSON(t *testing.T) {
|
||||
obj := cty.ObjectVal(map[string]cty.Value{
|
||||
"attr": cty.StringVal("foo"),
|
||||
})
|
||||
resp := p.ReadResource(providers.ReadResourceRequest{
|
||||
resp := p.ReadResource(t.Context(), providers.ReadResourceRequest{
|
||||
TypeName: "resource",
|
||||
PriorState: obj,
|
||||
})
|
||||
@@ -594,7 +594,7 @@ func TestGRPCProvider_PlanResourceChange(t *testing.T) {
|
||||
PlannedPrivate: expectedPrivate,
|
||||
}, nil)
|
||||
|
||||
resp := p.PlanResourceChange(providers.PlanResourceChangeRequest{
|
||||
resp := p.PlanResourceChange(t.Context(), providers.PlanResourceChangeRequest{
|
||||
TypeName: "resource",
|
||||
PriorState: cty.ObjectVal(map[string]cty.Value{
|
||||
"attr": cty.StringVal("foo"),
|
||||
@@ -657,7 +657,7 @@ func TestGRPCProvider_PlanResourceChangeJSON(t *testing.T) {
|
||||
PlannedPrivate: expectedPrivate,
|
||||
}, nil)
|
||||
|
||||
resp := p.PlanResourceChange(providers.PlanResourceChangeRequest{
|
||||
resp := p.PlanResourceChange(t.Context(), providers.PlanResourceChangeRequest{
|
||||
TypeName: "resource",
|
||||
PriorState: cty.ObjectVal(map[string]cty.Value{
|
||||
"attr": cty.StringVal("foo"),
|
||||
@@ -709,7 +709,7 @@ func TestGRPCProvider_ApplyResourceChange(t *testing.T) {
|
||||
Private: expectedPrivate,
|
||||
}, nil)
|
||||
|
||||
resp := p.ApplyResourceChange(providers.ApplyResourceChangeRequest{
|
||||
resp := p.ApplyResourceChange(t.Context(), providers.ApplyResourceChangeRequest{
|
||||
TypeName: "resource",
|
||||
PriorState: cty.ObjectVal(map[string]cty.Value{
|
||||
"attr": cty.StringVal("foo"),
|
||||
@@ -755,7 +755,7 @@ func TestGRPCProvider_ApplyResourceChangeJSON(t *testing.T) {
|
||||
Private: expectedPrivate,
|
||||
}, nil)
|
||||
|
||||
resp := p.ApplyResourceChange(providers.ApplyResourceChangeRequest{
|
||||
resp := p.ApplyResourceChange(t.Context(), providers.ApplyResourceChangeRequest{
|
||||
TypeName: "resource",
|
||||
PriorState: cty.ObjectVal(map[string]cty.Value{
|
||||
"attr": cty.StringVal("foo"),
|
||||
@@ -807,7 +807,7 @@ func TestGRPCProvider_ImportResourceState(t *testing.T) {
|
||||
},
|
||||
}, nil)
|
||||
|
||||
resp := p.ImportResourceState(providers.ImportResourceStateRequest{
|
||||
resp := p.ImportResourceState(t.Context(), providers.ImportResourceStateRequest{
|
||||
TypeName: "resource",
|
||||
ID: "foo",
|
||||
})
|
||||
@@ -850,7 +850,7 @@ func TestGRPCProvider_ImportResourceStateJSON(t *testing.T) {
|
||||
},
|
||||
}, nil)
|
||||
|
||||
resp := p.ImportResourceState(providers.ImportResourceStateRequest{
|
||||
resp := p.ImportResourceState(t.Context(), providers.ImportResourceStateRequest{
|
||||
TypeName: "resource",
|
||||
ID: "foo",
|
||||
})
|
||||
@@ -886,7 +886,7 @@ func TestGRPCProvider_ReadDataSource(t *testing.T) {
|
||||
},
|
||||
}, nil)
|
||||
|
||||
resp := p.ReadDataSource(providers.ReadDataSourceRequest{
|
||||
resp := p.ReadDataSource(t.Context(), providers.ReadDataSourceRequest{
|
||||
TypeName: "data",
|
||||
Config: cty.ObjectVal(map[string]cty.Value{
|
||||
"attr": cty.StringVal("foo"),
|
||||
@@ -919,7 +919,7 @@ func TestGRPCProvider_ReadDataSourceJSON(t *testing.T) {
|
||||
},
|
||||
}, nil)
|
||||
|
||||
resp := p.ReadDataSource(providers.ReadDataSourceRequest{
|
||||
resp := p.ReadDataSource(t.Context(), providers.ReadDataSourceRequest{
|
||||
TypeName: "data",
|
||||
Config: cty.ObjectVal(map[string]cty.Value{
|
||||
"attr": cty.StringVal("foo"),
|
||||
@@ -950,7 +950,7 @@ func TestGRPCProvider_CallFunction(t *testing.T) {
|
||||
Result: &proto.DynamicValue{Json: []byte(`"foo"`)},
|
||||
}, nil)
|
||||
|
||||
resp := p.CallFunction(providers.CallFunctionRequest{
|
||||
resp := p.CallFunction(t.Context(), providers.CallFunctionRequest{
|
||||
Name: "fn",
|
||||
Arguments: []cty.Value{cty.StringVal("bar"), cty.NilVal},
|
||||
})
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
package simple
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"time"
|
||||
@@ -55,23 +56,23 @@ func Provider() providers.Interface {
|
||||
}
|
||||
}
|
||||
|
||||
func (s simple) GetProviderSchema() providers.GetProviderSchemaResponse {
|
||||
func (s simple) GetProviderSchema(_ context.Context) providers.GetProviderSchemaResponse {
|
||||
return s.schema
|
||||
}
|
||||
|
||||
func (s simple) ValidateProviderConfig(req providers.ValidateProviderConfigRequest) (resp providers.ValidateProviderConfigResponse) {
|
||||
func (s simple) ValidateProviderConfig(_ context.Context, req providers.ValidateProviderConfigRequest) (resp providers.ValidateProviderConfigResponse) {
|
||||
return resp
|
||||
}
|
||||
|
||||
func (s simple) ValidateResourceConfig(req providers.ValidateResourceConfigRequest) (resp providers.ValidateResourceConfigResponse) {
|
||||
func (s simple) ValidateResourceConfig(_ context.Context, req providers.ValidateResourceConfigRequest) (resp providers.ValidateResourceConfigResponse) {
|
||||
return resp
|
||||
}
|
||||
|
||||
func (s simple) ValidateDataResourceConfig(req providers.ValidateDataResourceConfigRequest) (resp providers.ValidateDataResourceConfigResponse) {
|
||||
func (s simple) ValidateDataResourceConfig(_ context.Context, req providers.ValidateDataResourceConfigRequest) (resp providers.ValidateDataResourceConfigResponse) {
|
||||
return resp
|
||||
}
|
||||
|
||||
func (s simple) MoveResourceState(req providers.MoveResourceStateRequest) providers.MoveResourceStateResponse {
|
||||
func (s simple) MoveResourceState(_ context.Context, req providers.MoveResourceStateRequest) providers.MoveResourceStateResponse {
|
||||
var resp providers.MoveResourceStateResponse
|
||||
val, err := ctyjson.Unmarshal(req.SourceStateJSON, s.schema.ResourceTypes["simple_resource"].Block.ImpliedType())
|
||||
resp.Diagnostics = resp.Diagnostics.Append(err)
|
||||
@@ -82,7 +83,7 @@ func (s simple) MoveResourceState(req providers.MoveResourceStateRequest) provid
|
||||
resp.TargetPrivate = req.SourcePrivate
|
||||
return resp
|
||||
}
|
||||
func (s simple) UpgradeResourceState(req providers.UpgradeResourceStateRequest) providers.UpgradeResourceStateResponse {
|
||||
func (s simple) UpgradeResourceState(_ context.Context, req providers.UpgradeResourceStateRequest) providers.UpgradeResourceStateResponse {
|
||||
var resp providers.UpgradeResourceStateResponse
|
||||
ty := s.schema.ResourceTypes[req.TypeName].Block.ImpliedType()
|
||||
val, err := ctyjson.Unmarshal(req.RawStateJSON, ty)
|
||||
@@ -91,21 +92,21 @@ func (s simple) UpgradeResourceState(req providers.UpgradeResourceStateRequest)
|
||||
return resp
|
||||
}
|
||||
|
||||
func (s simple) ConfigureProvider(providers.ConfigureProviderRequest) (resp providers.ConfigureProviderResponse) {
|
||||
func (s simple) ConfigureProvider(context.Context, providers.ConfigureProviderRequest) (resp providers.ConfigureProviderResponse) {
|
||||
return resp
|
||||
}
|
||||
|
||||
func (s simple) Stop() error {
|
||||
func (s simple) Stop(_ context.Context) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s simple) ReadResource(req providers.ReadResourceRequest) (resp providers.ReadResourceResponse) {
|
||||
func (s simple) ReadResource(_ context.Context, req providers.ReadResourceRequest) (resp providers.ReadResourceResponse) {
|
||||
// just return the same state we received
|
||||
resp.NewState = req.PriorState
|
||||
return resp
|
||||
}
|
||||
|
||||
func (s simple) PlanResourceChange(req providers.PlanResourceChangeRequest) (resp providers.PlanResourceChangeResponse) {
|
||||
func (s simple) PlanResourceChange(_ context.Context, req providers.PlanResourceChangeRequest) (resp providers.PlanResourceChangeResponse) {
|
||||
if req.ProposedNewState.IsNull() {
|
||||
// destroy op
|
||||
resp.PlannedState = req.ProposedNewState
|
||||
@@ -126,7 +127,7 @@ func (s simple) PlanResourceChange(req providers.PlanResourceChangeRequest) (res
|
||||
return resp
|
||||
}
|
||||
|
||||
func (s simple) ApplyResourceChange(req providers.ApplyResourceChangeRequest) (resp providers.ApplyResourceChangeResponse) {
|
||||
func (s simple) ApplyResourceChange(_ context.Context, req providers.ApplyResourceChangeRequest) (resp providers.ApplyResourceChangeResponse) {
|
||||
if req.PlannedState.IsNull() {
|
||||
// make sure this was transferred from the plan action
|
||||
if string(req.PlannedPrivate) != "destroy planned" {
|
||||
@@ -147,26 +148,26 @@ func (s simple) ApplyResourceChange(req providers.ApplyResourceChangeRequest) (r
|
||||
return resp
|
||||
}
|
||||
|
||||
func (s simple) ImportResourceState(providers.ImportResourceStateRequest) (resp providers.ImportResourceStateResponse) {
|
||||
func (s simple) ImportResourceState(context.Context, providers.ImportResourceStateRequest) (resp providers.ImportResourceStateResponse) {
|
||||
resp.Diagnostics = resp.Diagnostics.Append(errors.New("unsupported"))
|
||||
return resp
|
||||
}
|
||||
|
||||
func (s simple) ReadDataSource(req providers.ReadDataSourceRequest) (resp providers.ReadDataSourceResponse) {
|
||||
func (s simple) ReadDataSource(_ context.Context, req providers.ReadDataSourceRequest) (resp providers.ReadDataSourceResponse) {
|
||||
m := req.Config.AsValueMap()
|
||||
m["id"] = cty.StringVal("static_id")
|
||||
resp.State = cty.ObjectVal(m)
|
||||
return resp
|
||||
}
|
||||
|
||||
func (s simple) GetFunctions() providers.GetFunctionsResponse {
|
||||
func (s simple) GetFunctions(context.Context) providers.GetFunctionsResponse {
|
||||
panic("Not Implemented")
|
||||
}
|
||||
|
||||
func (s simple) CallFunction(r providers.CallFunctionRequest) providers.CallFunctionResponse {
|
||||
func (s simple) CallFunction(_ context.Context, r providers.CallFunctionRequest) providers.CallFunctionResponse {
|
||||
panic("Not Implemented")
|
||||
}
|
||||
|
||||
func (s simple) Close() error {
|
||||
func (s simple) Close(_ context.Context) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
package simple
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"time"
|
||||
|
||||
@@ -54,23 +55,23 @@ func Provider() providers.Interface {
|
||||
}
|
||||
}
|
||||
|
||||
func (s simple) GetProviderSchema() providers.GetProviderSchemaResponse {
|
||||
func (s simple) GetProviderSchema(_ context.Context) providers.GetProviderSchemaResponse {
|
||||
return s.schema
|
||||
}
|
||||
|
||||
func (s simple) ValidateProviderConfig(req providers.ValidateProviderConfigRequest) (resp providers.ValidateProviderConfigResponse) {
|
||||
func (s simple) ValidateProviderConfig(_ context.Context, req providers.ValidateProviderConfigRequest) (resp providers.ValidateProviderConfigResponse) {
|
||||
return resp
|
||||
}
|
||||
|
||||
func (s simple) ValidateResourceConfig(req providers.ValidateResourceConfigRequest) (resp providers.ValidateResourceConfigResponse) {
|
||||
func (s simple) ValidateResourceConfig(_ context.Context, req providers.ValidateResourceConfigRequest) (resp providers.ValidateResourceConfigResponse) {
|
||||
return resp
|
||||
}
|
||||
|
||||
func (s simple) ValidateDataResourceConfig(req providers.ValidateDataResourceConfigRequest) (resp providers.ValidateDataResourceConfigResponse) {
|
||||
func (s simple) ValidateDataResourceConfig(_ context.Context, req providers.ValidateDataResourceConfigRequest) (resp providers.ValidateDataResourceConfigResponse) {
|
||||
return resp
|
||||
}
|
||||
|
||||
func (s simple) MoveResourceState(req providers.MoveResourceStateRequest) providers.MoveResourceStateResponse {
|
||||
func (s simple) MoveResourceState(_ context.Context, req providers.MoveResourceStateRequest) providers.MoveResourceStateResponse {
|
||||
var resp providers.MoveResourceStateResponse
|
||||
val, err := ctyjson.Unmarshal(req.SourceStateJSON, s.schema.ResourceTypes["simple_resource"].Block.ImpliedType())
|
||||
resp.Diagnostics = resp.Diagnostics.Append(err)
|
||||
@@ -81,7 +82,7 @@ func (s simple) MoveResourceState(req providers.MoveResourceStateRequest) provid
|
||||
resp.TargetPrivate = req.SourcePrivate
|
||||
return resp
|
||||
}
|
||||
func (s simple) UpgradeResourceState(req providers.UpgradeResourceStateRequest) providers.UpgradeResourceStateResponse {
|
||||
func (s simple) UpgradeResourceState(_ context.Context, req providers.UpgradeResourceStateRequest) providers.UpgradeResourceStateResponse {
|
||||
var resp providers.UpgradeResourceStateResponse
|
||||
ty := s.schema.ResourceTypes[req.TypeName].Block.ImpliedType()
|
||||
val, err := ctyjson.Unmarshal(req.RawStateJSON, ty)
|
||||
@@ -90,21 +91,21 @@ func (s simple) UpgradeResourceState(req providers.UpgradeResourceStateRequest)
|
||||
return resp
|
||||
}
|
||||
|
||||
func (s simple) ConfigureProvider(providers.ConfigureProviderRequest) (resp providers.ConfigureProviderResponse) {
|
||||
func (s simple) ConfigureProvider(context.Context, providers.ConfigureProviderRequest) (resp providers.ConfigureProviderResponse) {
|
||||
return resp
|
||||
}
|
||||
|
||||
func (s simple) Stop() error {
|
||||
func (s simple) Stop(_ context.Context) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s simple) ReadResource(req providers.ReadResourceRequest) (resp providers.ReadResourceResponse) {
|
||||
func (s simple) ReadResource(_ context.Context, req providers.ReadResourceRequest) (resp providers.ReadResourceResponse) {
|
||||
// just return the same state we received
|
||||
resp.NewState = req.PriorState
|
||||
return resp
|
||||
}
|
||||
|
||||
func (s simple) PlanResourceChange(req providers.PlanResourceChangeRequest) (resp providers.PlanResourceChangeResponse) {
|
||||
func (s simple) PlanResourceChange(_ context.Context, req providers.PlanResourceChangeRequest) (resp providers.PlanResourceChangeResponse) {
|
||||
if req.ProposedNewState.IsNull() {
|
||||
// destroy op
|
||||
resp.PlannedState = req.ProposedNewState
|
||||
@@ -122,7 +123,7 @@ func (s simple) PlanResourceChange(req providers.PlanResourceChangeRequest) (res
|
||||
return resp
|
||||
}
|
||||
|
||||
func (s simple) ApplyResourceChange(req providers.ApplyResourceChangeRequest) (resp providers.ApplyResourceChangeResponse) {
|
||||
func (s simple) ApplyResourceChange(_ context.Context, req providers.ApplyResourceChangeRequest) (resp providers.ApplyResourceChangeResponse) {
|
||||
if req.PlannedState.IsNull() {
|
||||
resp.NewState = req.PlannedState
|
||||
return resp
|
||||
@@ -138,26 +139,26 @@ func (s simple) ApplyResourceChange(req providers.ApplyResourceChangeRequest) (r
|
||||
return resp
|
||||
}
|
||||
|
||||
func (s simple) ImportResourceState(providers.ImportResourceStateRequest) (resp providers.ImportResourceStateResponse) {
|
||||
func (s simple) ImportResourceState(context.Context, providers.ImportResourceStateRequest) (resp providers.ImportResourceStateResponse) {
|
||||
resp.Diagnostics = resp.Diagnostics.Append(errors.New("unsupported"))
|
||||
return resp
|
||||
}
|
||||
|
||||
func (s simple) ReadDataSource(req providers.ReadDataSourceRequest) (resp providers.ReadDataSourceResponse) {
|
||||
func (s simple) ReadDataSource(_ context.Context, req providers.ReadDataSourceRequest) (resp providers.ReadDataSourceResponse) {
|
||||
m := req.Config.AsValueMap()
|
||||
m["id"] = cty.StringVal("static_id")
|
||||
resp.State = cty.ObjectVal(m)
|
||||
return resp
|
||||
}
|
||||
|
||||
func (s simple) GetFunctions() providers.GetFunctionsResponse {
|
||||
func (s simple) GetFunctions(_ context.Context) providers.GetFunctionsResponse {
|
||||
panic("Not Implemented")
|
||||
}
|
||||
|
||||
func (s simple) CallFunction(r providers.CallFunctionRequest) providers.CallFunctionResponse {
|
||||
func (s simple) CallFunction(_ context.Context, r providers.CallFunctionRequest) providers.CallFunctionResponse {
|
||||
panic("Not Implemented")
|
||||
}
|
||||
|
||||
func (s simple) Close() error {
|
||||
func (s simple) Close(_ context.Context) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -6,6 +6,8 @@
|
||||
package providers
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/zclconf/go-cty/cty"
|
||||
|
||||
"github.com/opentofu/opentofu/internal/configs/configschema"
|
||||
@@ -22,37 +24,37 @@ type Unconfigured interface {
|
||||
// memory savings.
|
||||
|
||||
// GetSchema returns the complete schema for the provider.
|
||||
GetProviderSchema() GetProviderSchemaResponse
|
||||
GetProviderSchema(context.Context) GetProviderSchemaResponse
|
||||
|
||||
// ValidateProviderConfig allows the provider to validate the configuration.
|
||||
// The ValidateProviderConfigResponse.PreparedConfig field is unused. The
|
||||
// final configuration is not stored in the state, and any modifications
|
||||
// that need to be made must be made during the Configure method call.
|
||||
ValidateProviderConfig(ValidateProviderConfigRequest) ValidateProviderConfigResponse
|
||||
ValidateProviderConfig(context.Context, ValidateProviderConfigRequest) ValidateProviderConfigResponse
|
||||
|
||||
// ValidateResourceConfig allows the provider to validate the resource
|
||||
// configuration values.
|
||||
ValidateResourceConfig(ValidateResourceConfigRequest) ValidateResourceConfigResponse
|
||||
ValidateResourceConfig(context.Context, ValidateResourceConfigRequest) ValidateResourceConfigResponse
|
||||
|
||||
// ValidateDataResourceConfig allows the provider to validate the data source
|
||||
// configuration values.
|
||||
ValidateDataResourceConfig(ValidateDataResourceConfigRequest) ValidateDataResourceConfigResponse
|
||||
ValidateDataResourceConfig(context.Context, ValidateDataResourceConfigRequest) ValidateDataResourceConfigResponse
|
||||
|
||||
// MoveResourceState requests that the given resource data be moved from one
|
||||
// type to another, potentially between providers as well.
|
||||
MoveResourceState(MoveResourceStateRequest) MoveResourceStateResponse
|
||||
MoveResourceState(context.Context, MoveResourceStateRequest) MoveResourceStateResponse
|
||||
|
||||
// CallFunction requests that the given function is called and response returned.
|
||||
// There is a bit of a quirk in OpenTofu-land. We allow providers to supply
|
||||
// additional functions via GetFunctions() after configuration. Those functions
|
||||
// will only be available via CallFunction after ConfigureProvider is called.
|
||||
CallFunction(CallFunctionRequest) CallFunctionResponse
|
||||
CallFunction(context.Context, CallFunctionRequest) CallFunctionResponse
|
||||
|
||||
// Configure configures and initialized the provider.
|
||||
ConfigureProvider(ConfigureProviderRequest) ConfigureProviderResponse
|
||||
ConfigureProvider(context.Context, ConfigureProviderRequest) ConfigureProviderResponse
|
||||
|
||||
// Close shuts down the plugin process if applicable.
|
||||
Close() error
|
||||
Close(context.Context) error
|
||||
|
||||
// Stop is called when the provider should halt any in-flight actions.
|
||||
//
|
||||
@@ -61,10 +63,17 @@ type Unconfigured interface {
|
||||
// has received the stop request. OpenTofu will not make any further API
|
||||
// calls to the provider after Stop is called.
|
||||
//
|
||||
// The given context is guaranteed not to be cancelled and to have no
|
||||
// deadline, but the contexts visible to other provider methods
|
||||
// running concurrently might be cancelled either before or after
|
||||
// Stop call. Any provider other operations that need to be able to continue
|
||||
// when reacting to Stop must use [context.WithoutCancel], or equivalent,
|
||||
// to insulate themselves from any incoming cancellation/deadline signals.
|
||||
//
|
||||
// The error returned, if non-nil, is assumed to mean that signaling the
|
||||
// stop somehow failed and that the user should expect potentially waiting
|
||||
// a longer period of time.
|
||||
Stop() error
|
||||
Stop(context.Context) error
|
||||
}
|
||||
|
||||
// Configured represents a provider plugin that has been configured. It has additional
|
||||
@@ -78,29 +87,36 @@ type Configured interface {
|
||||
// instance state whose schema version is less than the one reported by the
|
||||
// currently-used version of the corresponding provider, and the upgraded
|
||||
// result is used for any further processing.
|
||||
UpgradeResourceState(UpgradeResourceStateRequest) UpgradeResourceStateResponse
|
||||
UpgradeResourceState(context.Context, UpgradeResourceStateRequest) UpgradeResourceStateResponse
|
||||
|
||||
// ReadResource refreshes a resource and returns its current state.
|
||||
ReadResource(ReadResourceRequest) ReadResourceResponse
|
||||
ReadResource(context.Context, ReadResourceRequest) ReadResourceResponse
|
||||
|
||||
// PlanResourceChange takes the current state and proposed state of a
|
||||
// resource, and returns the planned final state.
|
||||
PlanResourceChange(PlanResourceChangeRequest) PlanResourceChangeResponse
|
||||
PlanResourceChange(context.Context, PlanResourceChangeRequest) PlanResourceChangeResponse
|
||||
|
||||
// ApplyResourceChange takes the planned state for a resource, which may
|
||||
// yet contain unknown computed values, and applies the changes returning
|
||||
// the final state.
|
||||
ApplyResourceChange(ApplyResourceChangeRequest) ApplyResourceChangeResponse
|
||||
//
|
||||
// NOTE: the context passed to this method can potentially be cancelled,
|
||||
// and so any cancel-sensitive operation that needs to be able to complete
|
||||
// gracefully should use [context.WithoutCancel] to create a new context
|
||||
// disconnected from the incoming cancellation chain. The caller doesn't
|
||||
// do this automatically to give implementations flexibility to use a
|
||||
// mixture of both cancelable and non-cancelable requests.
|
||||
ApplyResourceChange(context.Context, ApplyResourceChangeRequest) ApplyResourceChangeResponse
|
||||
|
||||
// ImportResourceState requests that the given resource be imported.
|
||||
ImportResourceState(ImportResourceStateRequest) ImportResourceStateResponse
|
||||
ImportResourceState(context.Context, ImportResourceStateRequest) ImportResourceStateResponse
|
||||
|
||||
// ReadDataSource returns the data source's current state.
|
||||
ReadDataSource(ReadDataSourceRequest) ReadDataSourceResponse
|
||||
ReadDataSource(context.Context, ReadDataSourceRequest) ReadDataSourceResponse
|
||||
|
||||
// GetFunctions returns a full list of functions defined in this provider. It should be a super
|
||||
// set of the functions returned in GetProviderSchema()
|
||||
GetFunctions() GetFunctionsResponse
|
||||
GetFunctions(context.Context) GetFunctionsResponse
|
||||
}
|
||||
|
||||
// Interface represents the set of methods required for a complete resource
|
||||
|
||||
@@ -307,7 +307,9 @@ func (c *Context) watchStop(walker *ContextGraphWalker) (chan struct{}, <-chan s
|
||||
// We ignore the error for now since there isn't any reasonable
|
||||
// action to take if there is an error here, since the stop is still
|
||||
// advisory: OpenTofu will exit once the graph node completes.
|
||||
_ = p.Stop()
|
||||
// The providers.Interface API contract requires that the
|
||||
// context passed to Stop is never canceled and has no deadline.
|
||||
_ = p.Stop(context.WithoutCancel(context.TODO()))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -6,15 +6,17 @@
|
||||
package tofu
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
"github.com/hashicorp/hcl/v2"
|
||||
"github.com/zclconf/go-cty/cty"
|
||||
"github.com/zclconf/go-cty/cty/function"
|
||||
|
||||
"github.com/opentofu/opentofu/internal/addrs"
|
||||
"github.com/opentofu/opentofu/internal/providers"
|
||||
"github.com/opentofu/opentofu/internal/tfdiags"
|
||||
"github.com/zclconf/go-cty/cty"
|
||||
"github.com/zclconf/go-cty/cty/function"
|
||||
)
|
||||
|
||||
// This builds a provider function using an EvalContext and some additional information
|
||||
@@ -23,7 +25,7 @@ func evalContextProviderFunction(provider providers.Interface, op walkOperation,
|
||||
var diags tfdiags.Diagnostics
|
||||
|
||||
// First try to look up the function from provider schema
|
||||
schema := provider.GetProviderSchema()
|
||||
schema := provider.GetProviderSchema(context.TODO())
|
||||
if schema.Diagnostics.HasErrors() {
|
||||
return nil, schema.Diagnostics
|
||||
}
|
||||
@@ -52,7 +54,7 @@ func evalContextProviderFunction(provider providers.Interface, op walkOperation,
|
||||
}
|
||||
|
||||
// The provider may be configured and present additional functions via GetFunctions
|
||||
specs := provider.GetFunctions()
|
||||
specs := provider.GetFunctions(context.TODO())
|
||||
if specs.Diagnostics.HasErrors() {
|
||||
return nil, specs.Diagnostics
|
||||
}
|
||||
@@ -91,7 +93,7 @@ func providerFunction(name string, spec providers.FunctionSpec, provider provide
|
||||
}
|
||||
|
||||
impl := func(args []cty.Value, retType cty.Type) (cty.Value, error) {
|
||||
resp := provider.CallFunction(providers.CallFunctionRequest{
|
||||
resp := provider.CallFunction(context.TODO(), providers.CallFunctionRequest{
|
||||
Name: name,
|
||||
Arguments: args,
|
||||
})
|
||||
|
||||
@@ -67,7 +67,7 @@ func (cp *contextPlugins) NewProvisionerInstance(typ string) (provisioners.Inter
|
||||
// ProviderSchema memoizes results by unique provider address, so it's fine
|
||||
// to repeatedly call this method with the same address if various different
|
||||
// parts of OpenTofu all need the same schema information.
|
||||
func (cp *contextPlugins) ProviderSchema(_ context.Context, addr addrs.Provider) (providers.ProviderSchema, error) {
|
||||
func (cp *contextPlugins) ProviderSchema(ctx context.Context, addr addrs.Provider) (providers.ProviderSchema, error) {
|
||||
// Check the global schema cache first.
|
||||
// This cache is only written by the provider client, and transparently
|
||||
// used by GetProviderSchema, but we check it here because at this point we
|
||||
@@ -89,9 +89,9 @@ func (cp *contextPlugins) ProviderSchema(_ context.Context, addr addrs.Provider)
|
||||
if err != nil {
|
||||
return schemas, fmt.Errorf("failed to instantiate provider %q to obtain schema: %w", addr, err)
|
||||
}
|
||||
defer provider.Close()
|
||||
defer provider.Close(ctx)
|
||||
|
||||
resp := provider.GetProviderSchema()
|
||||
resp := provider.GetProviderSchema(ctx)
|
||||
if resp.Diagnostics.HasErrors() {
|
||||
return resp, fmt.Errorf("failed to retrieve schema from provider %q: %w", addr, resp.Diagnostics.Err())
|
||||
}
|
||||
|
||||
@@ -153,7 +153,7 @@ func (c *BuiltinEvalContext) InitProvider(addr addrs.AbsProviderConfig, provider
|
||||
// We cannot wrap providers.Factory itself, because factories don't support aliases.
|
||||
pc, ok := c.Evaluator.Config.Module.GetProviderConfig(addr.Provider.Type, addr.Alias)
|
||||
if ok && pc.IsMocked {
|
||||
testP, err := newProviderForTestWithSchema(p, p.GetProviderSchema())
|
||||
testP, err := newProviderForTestWithSchema(p, p.GetProviderSchema(context.TODO()))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -196,7 +196,7 @@ func (c *BuiltinEvalContext) CloseProvider(addr addrs.AbsProviderConfig) error {
|
||||
providerMap := c.ProviderCache[key]
|
||||
if providerMap != nil {
|
||||
for _, provider := range providerMap {
|
||||
err := provider.Close()
|
||||
err := provider.Close(context.TODO())
|
||||
if err != nil {
|
||||
diags = diags.Append(err)
|
||||
}
|
||||
@@ -229,7 +229,7 @@ func (c *BuiltinEvalContext) ConfigureProvider(addr addrs.AbsProviderConfig, pro
|
||||
Config: cfg,
|
||||
}
|
||||
|
||||
resp := p.ConfigureProvider(req)
|
||||
resp := p.ConfigureProvider(context.TODO(), req)
|
||||
return resp.Diagnostics
|
||||
}
|
||||
|
||||
|
||||
@@ -145,7 +145,7 @@ func (n *NodeApplyableProvider) ValidateProvider(ctx context.Context, evalCtx Ev
|
||||
return nil
|
||||
}
|
||||
|
||||
schemaResp := provider.GetProviderSchema()
|
||||
schemaResp := provider.GetProviderSchema(ctx)
|
||||
diags := schemaResp.Diagnostics.InConfigBody(configBody, n.Addr.InstanceString(providerKey))
|
||||
if diags.HasErrors() {
|
||||
tracing.SetSpanError(span, diags)
|
||||
@@ -180,7 +180,7 @@ func (n *NodeApplyableProvider) ValidateProvider(ctx context.Context, evalCtx Ev
|
||||
Config: unmarkedConfigVal,
|
||||
}
|
||||
|
||||
validateResp := provider.ValidateProviderConfig(req)
|
||||
validateResp := provider.ValidateProviderConfig(ctx, req)
|
||||
diags = diags.Append(validateResp.Diagnostics.InConfigBody(configBody, n.Addr.InstanceString(providerKey)))
|
||||
|
||||
tracing.SetSpanError(span, diags)
|
||||
@@ -205,7 +205,7 @@ func (n *NodeApplyableProvider) ConfigureProvider(ctx context.Context, evalCtx E
|
||||
|
||||
configBody := buildProviderConfig(evalCtx, n.Addr, config)
|
||||
|
||||
resp := provider.GetProviderSchema()
|
||||
resp := provider.GetProviderSchema(ctx)
|
||||
diags := resp.Diagnostics.InConfigBody(configBody, n.Addr.InstanceString(providerKey))
|
||||
if diags.HasErrors() {
|
||||
tracing.SetSpanError(span, diags)
|
||||
@@ -248,7 +248,7 @@ func (n *NodeApplyableProvider) ConfigureProvider(ctx context.Context, evalCtx E
|
||||
|
||||
// ValidateProviderConfig is only used for validation. We are intentionally
|
||||
// ignoring the PreparedConfig field to maintain existing behavior.
|
||||
validateResp := provider.ValidateProviderConfig(req)
|
||||
validateResp := provider.ValidateProviderConfig(ctx, req)
|
||||
diags = diags.Append(validateResp.Diagnostics.InConfigBody(configBody, n.Addr.InstanceString(providerKey)))
|
||||
if diags.HasErrors() && config == nil {
|
||||
// If there isn't an explicit "provider" block in the configuration,
|
||||
|
||||
@@ -630,7 +630,7 @@ func (n *NodeAbstractResourceInstance) planDestroy(ctx context.Context, evalCtx
|
||||
|
||||
// Allow the provider to check the destroy plan, and insert any necessary
|
||||
// private data.
|
||||
resp := provider.PlanResourceChange(providers.PlanResourceChangeRequest{
|
||||
resp := provider.PlanResourceChange(ctx, providers.PlanResourceChangeRequest{
|
||||
TypeName: n.Addr.Resource.Resource.Type,
|
||||
Config: nullVal,
|
||||
PriorState: unmarkedPriorVal,
|
||||
@@ -799,7 +799,7 @@ func (n *NodeAbstractResourceInstance) refresh(ctx context.Context, evalCtx Eval
|
||||
ProviderMeta: metaConfigVal,
|
||||
}
|
||||
|
||||
resp := provider.ReadResource(providerReq)
|
||||
resp := provider.ReadResource(ctx, providerReq)
|
||||
if n.Config != nil {
|
||||
resp.Diagnostics = resp.Diagnostics.InConfigBody(n.Config.Config, n.Addr.String())
|
||||
}
|
||||
@@ -993,12 +993,10 @@ func (n *NodeAbstractResourceInstance) plan(
|
||||
// we must unmark and use the original config, since the ignore_changes
|
||||
// handling below needs access to the marks.
|
||||
unmarkedConfigVal, _ := origConfigVal.UnmarkDeep()
|
||||
validateResp := provider.ValidateResourceConfig(
|
||||
providers.ValidateResourceConfigRequest{
|
||||
TypeName: n.Addr.Resource.Resource.Type,
|
||||
Config: unmarkedConfigVal,
|
||||
},
|
||||
)
|
||||
validateResp := provider.ValidateResourceConfig(ctx, providers.ValidateResourceConfigRequest{
|
||||
TypeName: n.Addr.Resource.Resource.Type,
|
||||
Config: unmarkedConfigVal,
|
||||
})
|
||||
diags = diags.Append(validateResp.Diagnostics.InConfigBody(config.Config, n.Addr.String()))
|
||||
if diags.HasErrors() {
|
||||
return nil, nil, keyData, diags
|
||||
@@ -1033,7 +1031,7 @@ func (n *NodeAbstractResourceInstance) plan(
|
||||
return nil, nil, keyData, diags
|
||||
}
|
||||
|
||||
resp := provider.PlanResourceChange(providers.PlanResourceChangeRequest{
|
||||
resp := provider.PlanResourceChange(ctx, providers.PlanResourceChangeRequest{
|
||||
TypeName: n.Addr.Resource.Resource.Type,
|
||||
Config: unmarkedConfigVal,
|
||||
PriorState: unmarkedPriorVal,
|
||||
@@ -1274,7 +1272,7 @@ func (n *NodeAbstractResourceInstance) plan(
|
||||
// create a new proposed value from the null state and the config
|
||||
proposedNewVal = objchange.ProposedNew(schema, nullPriorVal, unmarkedConfigVal)
|
||||
|
||||
resp = provider.PlanResourceChange(providers.PlanResourceChangeRequest{
|
||||
resp = provider.PlanResourceChange(ctx, providers.PlanResourceChangeRequest{
|
||||
TypeName: n.Addr.Resource.Resource.Type,
|
||||
Config: unmarkedConfigVal,
|
||||
PriorState: nullPriorVal,
|
||||
@@ -1636,7 +1634,7 @@ func processIgnoreChangesIndividual(prior, config cty.Value, ignoreChangesPath [
|
||||
}
|
||||
|
||||
type ProviderWithEncryption interface {
|
||||
ReadDataSourceEncrypted(req providers.ReadDataSourceRequest, path addrs.AbsResourceInstance, enc encryption.Encryption) providers.ReadDataSourceResponse
|
||||
ReadDataSourceEncrypted(ctx context.Context, req providers.ReadDataSourceRequest, path addrs.AbsResourceInstance, enc encryption.Encryption) providers.ReadDataSourceResponse
|
||||
}
|
||||
|
||||
// readDataSource handles everything needed to call ReadDataSource on the provider.
|
||||
@@ -1671,12 +1669,10 @@ func (n *NodeAbstractResourceInstance) readDataSource(ctx context.Context, evalC
|
||||
configVal, pvm = configVal.UnmarkDeepWithPaths()
|
||||
|
||||
log.Printf("[TRACE] readDataSource: Re-validating config for %s", n.Addr)
|
||||
validateResp := provider.ValidateDataResourceConfig(
|
||||
providers.ValidateDataResourceConfigRequest{
|
||||
TypeName: n.Addr.ContainingResource().Resource.Type,
|
||||
Config: configVal,
|
||||
},
|
||||
)
|
||||
validateResp := provider.ValidateDataResourceConfig(ctx, providers.ValidateDataResourceConfigRequest{
|
||||
TypeName: n.Addr.ContainingResource().Resource.Type,
|
||||
Config: configVal,
|
||||
})
|
||||
diags = diags.Append(validateResp.Diagnostics.InConfigBody(config.Config, n.Addr.String()))
|
||||
if diags.HasErrors() {
|
||||
return newVal, diags
|
||||
@@ -1701,9 +1697,9 @@ func (n *NodeAbstractResourceInstance) readDataSource(ctx context.Context, evalC
|
||||
var resp providers.ReadDataSourceResponse
|
||||
if tfp, ok := provider.(ProviderWithEncryption); ok {
|
||||
// Special case for terraform_remote_state
|
||||
resp = tfp.ReadDataSourceEncrypted(req, n.Addr, evalCtx.GetEncryption())
|
||||
resp = tfp.ReadDataSourceEncrypted(ctx, req, n.Addr, evalCtx.GetEncryption())
|
||||
} else {
|
||||
resp = provider.ReadDataSource(req)
|
||||
resp = provider.ReadDataSource(ctx, req)
|
||||
}
|
||||
diags = diags.Append(resp.Diagnostics.InConfigBody(config.Config, n.Addr.String()))
|
||||
if diags.HasErrors() {
|
||||
@@ -2560,7 +2556,7 @@ func (n *NodeAbstractResourceInstance) apply(
|
||||
return newState, diags
|
||||
}
|
||||
|
||||
resp := provider.ApplyResourceChange(providers.ApplyResourceChangeRequest{
|
||||
resp := provider.ApplyResourceChange(ctx, providers.ApplyResourceChangeRequest{
|
||||
TypeName: n.Addr.Resource.Resource.Type,
|
||||
PriorState: unmarkedBefore,
|
||||
Config: unmarkedConfigVal,
|
||||
|
||||
@@ -177,7 +177,7 @@ func TestNodeAbstractResourceInstance_WriteResourceInstanceState(t *testing.T) {
|
||||
},
|
||||
}
|
||||
evalCtx.ProviderProvider = mockProvider
|
||||
evalCtx.ProviderSchemaSchema = mockProvider.GetProviderSchema()
|
||||
evalCtx.ProviderSchemaSchema = mockProvider.GetProviderSchema(t.Context())
|
||||
|
||||
err := node.writeResourceInstanceState(t.Context(), evalCtx, obj, workingState)
|
||||
if err != nil {
|
||||
|
||||
@@ -334,7 +334,7 @@ func TestNodeAbstractResource_ReadResourceInstanceState(t *testing.T) {
|
||||
evalCtx := new(MockEvalContext)
|
||||
evalCtx.StateState = test.State.SyncWrapper()
|
||||
evalCtx.PathPath = addrs.RootModuleInstance
|
||||
evalCtx.ProviderSchemaSchema = test.Provider.GetProviderSchema()
|
||||
evalCtx.ProviderSchemaSchema = test.Provider.GetProviderSchema(t.Context())
|
||||
evalCtx.MoveResultsResults = test.MoveResults
|
||||
evalCtx.ProviderProvider = providers.Interface(test.Provider)
|
||||
|
||||
@@ -381,7 +381,7 @@ func TestNodeAbstractResource_ReadResourceInstanceState(t *testing.T) {
|
||||
evalCtx := new(MockEvalContext)
|
||||
evalCtx.StateState = test.State.SyncWrapper()
|
||||
evalCtx.PathPath = addrs.RootModuleInstance
|
||||
evalCtx.ProviderSchemaSchema = test.Provider.GetProviderSchema()
|
||||
evalCtx.ProviderSchemaSchema = test.Provider.GetProviderSchema(t.Context())
|
||||
evalCtx.MoveResultsResults = test.MoveResults
|
||||
evalCtx.ProviderProvider = providers.Interface(test.Provider)
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
package tofu
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"testing"
|
||||
|
||||
@@ -267,7 +268,7 @@ func TestNodeDestroyDeposedResourceInstanceObject_WriteResourceInstanceState(t *
|
||||
},
|
||||
})
|
||||
evalCtx.ProviderProvider = mockProvider
|
||||
evalCtx.ProviderSchemaSchema = mockProvider.GetProviderSchema()
|
||||
evalCtx.ProviderSchemaSchema = mockProvider.GetProviderSchema(t.Context())
|
||||
|
||||
obj := &states.ResourceInstanceObject{
|
||||
Value: cty.ObjectVal(map[string]cty.Value{
|
||||
@@ -302,7 +303,7 @@ func TestNodeDestroyDeposedResourceInstanceObject_ExecuteMissingState(t *testing
|
||||
evalCtx := &MockEvalContext{
|
||||
StateState: states.NewState().SyncWrapper(),
|
||||
ProviderProvider: simpleMockProvider(),
|
||||
ProviderSchemaSchema: p.GetProviderSchema(),
|
||||
ProviderSchemaSchema: p.GetProviderSchema(t.Context()),
|
||||
ChangesChanges: plans.NewChanges().SyncWrapper(),
|
||||
}
|
||||
|
||||
@@ -384,7 +385,7 @@ func initMockEvalContext(resourceAddrs string, deposedKey states.DeposedKey) (*M
|
||||
}
|
||||
|
||||
p := testProvider("test")
|
||||
p.ConfigureProvider(providers.ConfigureProviderRequest{})
|
||||
p.ConfigureProvider(context.TODO(), providers.ConfigureProviderRequest{})
|
||||
p.GetProviderSchemaResponse = &schema
|
||||
|
||||
p.UpgradeResourceStateResponse = &providers.UpgradeResourceStateResponse{
|
||||
|
||||
@@ -117,7 +117,7 @@ func (n *graphNodeImportState) Execute(ctx context.Context, evalCtx EvalContext,
|
||||
return diags
|
||||
}
|
||||
|
||||
resp := provider.ImportResourceState(providers.ImportResourceStateRequest{
|
||||
resp := provider.ImportResourceState(ctx, providers.ImportResourceStateRequest{
|
||||
TypeName: n.Addr.Resource.Resource.Type,
|
||||
ID: n.ID,
|
||||
})
|
||||
|
||||
@@ -508,7 +508,7 @@ func (n *NodePlannableResourceInstance) importState(ctx context.Context, evalCtx
|
||||
return nil, diags
|
||||
}
|
||||
|
||||
resp := provider.ImportResourceState(providers.ImportResourceStateRequest{
|
||||
resp := provider.ImportResourceState(ctx, providers.ImportResourceStateRequest{
|
||||
TypeName: addr.Resource.Resource.Type,
|
||||
ID: importId,
|
||||
})
|
||||
|
||||
@@ -215,7 +215,7 @@ func TestNodeResourcePlanOrphan_Execute(t *testing.T) {
|
||||
}
|
||||
|
||||
p := simpleMockProvider()
|
||||
p.ConfigureProvider(providers.ConfigureProviderRequest{})
|
||||
p.ConfigureProvider(t.Context(), providers.ConfigureProviderRequest{})
|
||||
p.GetProviderSchemaResponse = &schema
|
||||
|
||||
evalCtx := &MockEvalContext{
|
||||
@@ -283,7 +283,7 @@ func TestNodeResourcePlanOrphanExecute_alreadyDeleted(t *testing.T) {
|
||||
changes := plans.NewChanges()
|
||||
|
||||
p := simpleMockProvider()
|
||||
p.ConfigureProvider(providers.ConfigureProviderRequest{})
|
||||
p.ConfigureProvider(t.Context(), providers.ConfigureProviderRequest{})
|
||||
p.ReadResourceResponse = &providers.ReadResourceResponse{
|
||||
NewState: cty.NullVal(p.GetProviderSchemaResponse.ResourceTypes["test_string"].Block.ImpliedType()),
|
||||
}
|
||||
@@ -366,7 +366,7 @@ func TestNodeResourcePlanOrphanExecute_deposed(t *testing.T) {
|
||||
changes := plans.NewChanges()
|
||||
|
||||
p := simpleMockProvider()
|
||||
p.ConfigureProvider(providers.ConfigureProviderRequest{})
|
||||
p.ConfigureProvider(t.Context(), providers.ConfigureProviderRequest{})
|
||||
p.ReadResourceResponse = &providers.ReadResourceResponse{
|
||||
NewState: cty.NullVal(p.GetProviderSchemaResponse.ResourceTypes["test_string"].Block.ImpliedType()),
|
||||
}
|
||||
|
||||
@@ -438,7 +438,7 @@ func (n *NodeValidatableResource) validateResource(ctx context.Context, evalCtx
|
||||
Config: unmarkedConfigVal,
|
||||
}
|
||||
|
||||
resp := provider.ValidateResourceConfig(req)
|
||||
resp := provider.ValidateResourceConfig(ctx, req)
|
||||
diags = diags.Append(resp.Diagnostics.InConfigBody(n.Config.Config, n.Addr.String()))
|
||||
|
||||
case addrs.DataResourceMode:
|
||||
@@ -479,7 +479,7 @@ func (n *NodeValidatableResource) validateResource(ctx context.Context, evalCtx
|
||||
Config: unmarkedConfigVal,
|
||||
}
|
||||
|
||||
resp := provider.ValidateDataResourceConfig(req)
|
||||
resp := provider.ValidateDataResourceConfig(ctx, req)
|
||||
diags = diags.Append(resp.Diagnostics.InConfigBody(n.Config.Config, n.Addr.String()))
|
||||
}
|
||||
|
||||
|
||||
@@ -195,7 +195,7 @@ func TestNodeValidatableResource_ValidateResource_managedResource(t *testing.T)
|
||||
|
||||
ctx := &MockEvalContext{}
|
||||
ctx.installSimpleEval()
|
||||
ctx.ProviderSchemaSchema = mp.GetProviderSchema()
|
||||
ctx.ProviderSchemaSchema = mp.GetProviderSchema(t.Context())
|
||||
ctx.ProviderProvider = p
|
||||
|
||||
err := node.validateResource(t.Context(), ctx)
|
||||
@@ -225,7 +225,7 @@ func TestNodeValidatableResource_ValidateResource_managedResourceCount(t *testin
|
||||
|
||||
ctx := &MockEvalContext{}
|
||||
ctx.installSimpleEval()
|
||||
ctx.ProviderSchemaSchema = mp.GetProviderSchema()
|
||||
ctx.ProviderSchemaSchema = mp.GetProviderSchema(t.Context())
|
||||
ctx.ProviderProvider = p
|
||||
|
||||
tests := []struct {
|
||||
@@ -309,7 +309,7 @@ func TestNodeValidatableResource_ValidateResource_dataSource(t *testing.T) {
|
||||
|
||||
ctx := &MockEvalContext{}
|
||||
ctx.installSimpleEval()
|
||||
ctx.ProviderSchemaSchema = mp.GetProviderSchema()
|
||||
ctx.ProviderSchemaSchema = mp.GetProviderSchema(t.Context())
|
||||
ctx.ProviderProvider = p
|
||||
|
||||
diags := node.validateResource(t.Context(), ctx)
|
||||
@@ -345,7 +345,7 @@ func TestNodeValidatableResource_ValidateResource_valid(t *testing.T) {
|
||||
|
||||
ctx := &MockEvalContext{}
|
||||
ctx.installSimpleEval()
|
||||
ctx.ProviderSchemaSchema = mp.GetProviderSchema()
|
||||
ctx.ProviderSchemaSchema = mp.GetProviderSchema(t.Context())
|
||||
ctx.ProviderProvider = p
|
||||
|
||||
diags := node.validateResource(t.Context(), ctx)
|
||||
@@ -382,7 +382,7 @@ func TestNodeValidatableResource_ValidateResource_warningsAndErrorsPassedThrough
|
||||
|
||||
ctx := &MockEvalContext{}
|
||||
ctx.installSimpleEval()
|
||||
ctx.ProviderSchemaSchema = mp.GetProviderSchema()
|
||||
ctx.ProviderSchemaSchema = mp.GetProviderSchema(t.Context())
|
||||
ctx.ProviderProvider = p
|
||||
|
||||
diags := node.validateResource(t.Context(), ctx)
|
||||
@@ -445,7 +445,7 @@ func TestNodeValidatableResource_ValidateResource_invalidDependsOn(t *testing.T)
|
||||
ctx := &MockEvalContext{}
|
||||
ctx.installSimpleEval()
|
||||
|
||||
ctx.ProviderSchemaSchema = mp.GetProviderSchema()
|
||||
ctx.ProviderSchemaSchema = mp.GetProviderSchema(t.Context())
|
||||
ctx.ProviderProvider = p
|
||||
|
||||
diags := node.validateResource(t.Context(), ctx)
|
||||
@@ -529,7 +529,7 @@ func TestNodeValidatableResource_ValidateResource_invalidIgnoreChangesNonexisten
|
||||
ctx := &MockEvalContext{}
|
||||
ctx.installSimpleEval()
|
||||
|
||||
ctx.ProviderSchemaSchema = mp.GetProviderSchema()
|
||||
ctx.ProviderSchemaSchema = mp.GetProviderSchema(t.Context())
|
||||
ctx.ProviderProvider = p
|
||||
|
||||
diags := node.validateResource(t.Context(), ctx)
|
||||
@@ -612,7 +612,7 @@ func TestNodeValidatableResource_ValidateResource_invalidIgnoreChangesComputed(t
|
||||
ctx := &MockEvalContext{}
|
||||
ctx.installSimpleEval()
|
||||
|
||||
ctx.ProviderSchemaSchema = mp.GetProviderSchema()
|
||||
ctx.ProviderSchemaSchema = mp.GetProviderSchema(t.Context())
|
||||
ctx.ProviderProvider = p
|
||||
|
||||
diags := node.validateResource(t.Context(), ctx)
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
package tofu
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"hash/fnv"
|
||||
|
||||
@@ -58,7 +59,7 @@ func newProviderForTestWithSchema(internal providers.Interface, schema providers
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (p providerForTest) ReadResource(r providers.ReadResourceRequest) providers.ReadResourceResponse {
|
||||
func (p providerForTest) ReadResource(_ context.Context, r providers.ReadResourceRequest) providers.ReadResourceResponse {
|
||||
resSchema, _ := p.schema.SchemaForResourceType(addrs.ManagedResourceMode, r.TypeName)
|
||||
|
||||
mockValues := p.getMockValuesForManagedResource(r.TypeName)
|
||||
@@ -71,7 +72,7 @@ func (p providerForTest) ReadResource(r providers.ReadResourceRequest) providers
|
||||
return resp
|
||||
}
|
||||
|
||||
func (p providerForTest) PlanResourceChange(r providers.PlanResourceChangeRequest) providers.PlanResourceChangeResponse {
|
||||
func (p providerForTest) PlanResourceChange(_ context.Context, r providers.PlanResourceChangeRequest) providers.PlanResourceChangeResponse {
|
||||
if r.Config.IsNull() {
|
||||
return providers.PlanResourceChangeResponse{
|
||||
PlannedState: r.ProposedNewState, // null
|
||||
@@ -90,13 +91,13 @@ func (p providerForTest) PlanResourceChange(r providers.PlanResourceChangeReques
|
||||
return resp
|
||||
}
|
||||
|
||||
func (p providerForTest) ApplyResourceChange(r providers.ApplyResourceChangeRequest) providers.ApplyResourceChangeResponse {
|
||||
func (p providerForTest) ApplyResourceChange(_ context.Context, r providers.ApplyResourceChangeRequest) providers.ApplyResourceChangeResponse {
|
||||
return providers.ApplyResourceChangeResponse{
|
||||
NewState: r.PlannedState,
|
||||
}
|
||||
}
|
||||
|
||||
func (p providerForTest) ReadDataSource(r providers.ReadDataSourceRequest) providers.ReadDataSourceResponse {
|
||||
func (p providerForTest) ReadDataSource(_ context.Context, r providers.ReadDataSourceRequest) providers.ReadDataSourceResponse {
|
||||
resSchema, _ := p.schema.SchemaForResourceType(addrs.DataResourceMode, r.TypeName)
|
||||
|
||||
var resp providers.ReadDataSourceResponse
|
||||
@@ -110,7 +111,7 @@ func (p providerForTest) ReadDataSource(r providers.ReadDataSourceRequest) provi
|
||||
}
|
||||
|
||||
// ValidateProviderConfig is irrelevant when provider is mocked or overridden.
|
||||
func (p providerForTest) ValidateProviderConfig(_ providers.ValidateProviderConfigRequest) providers.ValidateProviderConfigResponse {
|
||||
func (p providerForTest) ValidateProviderConfig(_ context.Context, _ providers.ValidateProviderConfigRequest) providers.ValidateProviderConfigResponse {
|
||||
return providers.ValidateProviderConfigResponse{}
|
||||
}
|
||||
|
||||
@@ -120,23 +121,23 @@ func (p providerForTest) ValidateProviderConfig(_ providers.ValidateProviderConf
|
||||
// is being transformed for testing framework and original provider configuration is not
|
||||
// accessible so it is safe to wipe metadata as well. See Config.transformProviderConfigsForTest
|
||||
// for more details.
|
||||
func (p providerForTest) GetProviderSchema() providers.GetProviderSchemaResponse {
|
||||
providerSchema := p.internal.GetProviderSchema()
|
||||
func (p providerForTest) GetProviderSchema(ctx context.Context) providers.GetProviderSchemaResponse {
|
||||
providerSchema := p.internal.GetProviderSchema(ctx)
|
||||
providerSchema.Provider = providers.Schema{}
|
||||
providerSchema.ProviderMeta = providers.Schema{}
|
||||
return providerSchema
|
||||
}
|
||||
|
||||
// providerForTest doesn't configure its internal provider because it is mocked.
|
||||
func (p providerForTest) ConfigureProvider(_ providers.ConfigureProviderRequest) providers.ConfigureProviderResponse {
|
||||
func (p providerForTest) ConfigureProvider(context.Context, providers.ConfigureProviderRequest) providers.ConfigureProviderResponse {
|
||||
return providers.ConfigureProviderResponse{}
|
||||
}
|
||||
|
||||
func (p providerForTest) ImportResourceState(providers.ImportResourceStateRequest) providers.ImportResourceStateResponse {
|
||||
func (p providerForTest) ImportResourceState(context.Context, providers.ImportResourceStateRequest) providers.ImportResourceStateResponse {
|
||||
panic("Importing is not supported in testing context. providerForTest must not be used to call ImportResourceState")
|
||||
}
|
||||
|
||||
func (p providerForTest) MoveResourceState(providers.MoveResourceStateRequest) providers.MoveResourceStateResponse {
|
||||
func (p providerForTest) MoveResourceState(context.Context, providers.MoveResourceStateRequest) providers.MoveResourceStateResponse {
|
||||
panic("Moving is not supported in testing context. providerForTest must not be used to call MoveResourceState")
|
||||
}
|
||||
|
||||
@@ -144,32 +145,32 @@ func (p providerForTest) MoveResourceState(providers.MoveResourceStateRequest) p
|
||||
// it wasn't overridden or mocked. The only exception is ImportResourceState, which panics
|
||||
// if called via providerForTest because importing is not supported in testing framework.
|
||||
|
||||
func (p providerForTest) ValidateResourceConfig(r providers.ValidateResourceConfigRequest) providers.ValidateResourceConfigResponse {
|
||||
return p.internal.ValidateResourceConfig(r)
|
||||
func (p providerForTest) ValidateResourceConfig(ctx context.Context, r providers.ValidateResourceConfigRequest) providers.ValidateResourceConfigResponse {
|
||||
return p.internal.ValidateResourceConfig(ctx, r)
|
||||
}
|
||||
|
||||
func (p providerForTest) ValidateDataResourceConfig(r providers.ValidateDataResourceConfigRequest) providers.ValidateDataResourceConfigResponse {
|
||||
return p.internal.ValidateDataResourceConfig(r)
|
||||
func (p providerForTest) ValidateDataResourceConfig(ctx context.Context, r providers.ValidateDataResourceConfigRequest) providers.ValidateDataResourceConfigResponse {
|
||||
return p.internal.ValidateDataResourceConfig(ctx, r)
|
||||
}
|
||||
|
||||
func (p providerForTest) UpgradeResourceState(r providers.UpgradeResourceStateRequest) providers.UpgradeResourceStateResponse {
|
||||
return p.internal.UpgradeResourceState(r)
|
||||
func (p providerForTest) UpgradeResourceState(ctx context.Context, r providers.UpgradeResourceStateRequest) providers.UpgradeResourceStateResponse {
|
||||
return p.internal.UpgradeResourceState(ctx, r)
|
||||
}
|
||||
|
||||
func (p providerForTest) Stop() error {
|
||||
return p.internal.Stop()
|
||||
func (p providerForTest) Stop(ctx context.Context) error {
|
||||
return p.internal.Stop(ctx)
|
||||
}
|
||||
|
||||
func (p providerForTest) GetFunctions() providers.GetFunctionsResponse {
|
||||
return p.internal.GetFunctions()
|
||||
func (p providerForTest) GetFunctions(ctx context.Context) providers.GetFunctionsResponse {
|
||||
return p.internal.GetFunctions(ctx)
|
||||
}
|
||||
|
||||
func (p providerForTest) CallFunction(r providers.CallFunctionRequest) providers.CallFunctionResponse {
|
||||
return p.internal.CallFunction(r)
|
||||
func (p providerForTest) CallFunction(ctx context.Context, r providers.CallFunctionRequest) providers.CallFunctionResponse {
|
||||
return p.internal.CallFunction(ctx, r)
|
||||
}
|
||||
|
||||
func (p providerForTest) Close() error {
|
||||
return p.internal.Close()
|
||||
func (p providerForTest) Close(ctx context.Context) error {
|
||||
return p.internal.Close(ctx)
|
||||
}
|
||||
|
||||
func (p providerForTest) withMockResources(mockResources []*configs.MockResource) providerForTest {
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
package tofu
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"sync"
|
||||
|
||||
@@ -106,7 +107,7 @@ type MockProvider struct {
|
||||
CloseError error
|
||||
}
|
||||
|
||||
func (p *MockProvider) GetProviderSchema() providers.GetProviderSchemaResponse {
|
||||
func (p *MockProvider) GetProviderSchema(_ context.Context) providers.GetProviderSchemaResponse {
|
||||
p.Lock()
|
||||
defer p.Unlock()
|
||||
p.GetProviderSchemaCalled = true
|
||||
@@ -128,7 +129,7 @@ func (p *MockProvider) getProviderSchema() providers.GetProviderSchemaResponse {
|
||||
}
|
||||
}
|
||||
|
||||
func (p *MockProvider) ValidateProviderConfig(r providers.ValidateProviderConfigRequest) (resp providers.ValidateProviderConfigResponse) {
|
||||
func (p *MockProvider) ValidateProviderConfig(_ context.Context, r providers.ValidateProviderConfigRequest) (resp providers.ValidateProviderConfigResponse) {
|
||||
p.Lock()
|
||||
defer p.Unlock()
|
||||
|
||||
@@ -146,7 +147,7 @@ func (p *MockProvider) ValidateProviderConfig(r providers.ValidateProviderConfig
|
||||
return resp
|
||||
}
|
||||
|
||||
func (p *MockProvider) ValidateResourceConfig(r providers.ValidateResourceConfigRequest) (resp providers.ValidateResourceConfigResponse) {
|
||||
func (p *MockProvider) ValidateResourceConfig(_ context.Context, r providers.ValidateResourceConfigRequest) (resp providers.ValidateResourceConfigResponse) {
|
||||
p.Lock()
|
||||
defer p.Unlock()
|
||||
|
||||
@@ -178,7 +179,7 @@ func (p *MockProvider) ValidateResourceConfig(r providers.ValidateResourceConfig
|
||||
return resp
|
||||
}
|
||||
|
||||
func (p *MockProvider) ValidateDataResourceConfig(r providers.ValidateDataResourceConfigRequest) (resp providers.ValidateDataResourceConfigResponse) {
|
||||
func (p *MockProvider) ValidateDataResourceConfig(_ context.Context, r providers.ValidateDataResourceConfigRequest) (resp providers.ValidateDataResourceConfigResponse) {
|
||||
p.Lock()
|
||||
defer p.Unlock()
|
||||
|
||||
@@ -208,7 +209,7 @@ func (p *MockProvider) ValidateDataResourceConfig(r providers.ValidateDataResour
|
||||
return resp
|
||||
}
|
||||
|
||||
func (p *MockProvider) UpgradeResourceState(r providers.UpgradeResourceStateRequest) (resp providers.UpgradeResourceStateResponse) {
|
||||
func (p *MockProvider) UpgradeResourceState(_ context.Context, r providers.UpgradeResourceStateRequest) (resp providers.UpgradeResourceStateResponse) {
|
||||
p.Lock()
|
||||
defer p.Unlock()
|
||||
|
||||
@@ -257,7 +258,7 @@ func (p *MockProvider) UpgradeResourceState(r providers.UpgradeResourceStateRequ
|
||||
return resp
|
||||
}
|
||||
|
||||
func (p *MockProvider) MoveResourceState(r providers.MoveResourceStateRequest) providers.MoveResourceStateResponse {
|
||||
func (p *MockProvider) MoveResourceState(_ context.Context, r providers.MoveResourceStateRequest) providers.MoveResourceStateResponse {
|
||||
var resp providers.MoveResourceStateResponse
|
||||
p.Lock()
|
||||
defer p.Unlock()
|
||||
@@ -310,7 +311,7 @@ func (p *MockProvider) MoveResourceState(r providers.MoveResourceStateRequest) p
|
||||
return resp
|
||||
}
|
||||
|
||||
func (p *MockProvider) ConfigureProvider(r providers.ConfigureProviderRequest) (resp providers.ConfigureProviderResponse) {
|
||||
func (p *MockProvider) ConfigureProvider(_ context.Context, r providers.ConfigureProviderRequest) (resp providers.ConfigureProviderResponse) {
|
||||
p.Lock()
|
||||
defer p.Unlock()
|
||||
|
||||
@@ -328,7 +329,7 @@ func (p *MockProvider) ConfigureProvider(r providers.ConfigureProviderRequest) (
|
||||
return resp
|
||||
}
|
||||
|
||||
func (p *MockProvider) Stop() error {
|
||||
func (p *MockProvider) Stop(_ context.Context) error {
|
||||
// We intentionally don't lock in this one because the whole point of this
|
||||
// method is to be called concurrently with another operation that can
|
||||
// be cancelled. The provider itself is responsible for handling
|
||||
@@ -342,7 +343,7 @@ func (p *MockProvider) Stop() error {
|
||||
return p.StopResponse
|
||||
}
|
||||
|
||||
func (p *MockProvider) ReadResource(r providers.ReadResourceRequest) (resp providers.ReadResourceResponse) {
|
||||
func (p *MockProvider) ReadResource(_ context.Context, r providers.ReadResourceRequest) (resp providers.ReadResourceResponse) {
|
||||
p.Lock()
|
||||
defer p.Unlock()
|
||||
|
||||
@@ -383,7 +384,7 @@ func (p *MockProvider) ReadResource(r providers.ReadResourceRequest) (resp provi
|
||||
return resp
|
||||
}
|
||||
|
||||
func (p *MockProvider) PlanResourceChange(r providers.PlanResourceChangeRequest) (resp providers.PlanResourceChangeResponse) {
|
||||
func (p *MockProvider) PlanResourceChange(_ context.Context, r providers.PlanResourceChangeRequest) (resp providers.PlanResourceChangeResponse) {
|
||||
p.Lock()
|
||||
defer p.Unlock()
|
||||
|
||||
@@ -463,7 +464,7 @@ func (p *MockProvider) PlanResourceChange(r providers.PlanResourceChangeRequest)
|
||||
return resp
|
||||
}
|
||||
|
||||
func (p *MockProvider) ApplyResourceChange(r providers.ApplyResourceChangeRequest) (resp providers.ApplyResourceChangeResponse) {
|
||||
func (p *MockProvider) ApplyResourceChange(_ context.Context, r providers.ApplyResourceChangeRequest) (resp providers.ApplyResourceChangeResponse) {
|
||||
p.Lock()
|
||||
defer p.Unlock()
|
||||
p.ApplyResourceChangeCalled = true
|
||||
@@ -518,7 +519,7 @@ func (p *MockProvider) ApplyResourceChange(r providers.ApplyResourceChangeReques
|
||||
return resp
|
||||
}
|
||||
|
||||
func (p *MockProvider) ImportResourceState(r providers.ImportResourceStateRequest) (resp providers.ImportResourceStateResponse) {
|
||||
func (p *MockProvider) ImportResourceState(_ context.Context, r providers.ImportResourceStateRequest) (resp providers.ImportResourceStateResponse) {
|
||||
p.Lock()
|
||||
defer p.Unlock()
|
||||
|
||||
@@ -560,7 +561,7 @@ func (p *MockProvider) ImportResourceState(r providers.ImportResourceStateReques
|
||||
|
||||
return resp
|
||||
}
|
||||
func (p *MockProvider) ReadDataSource(r providers.ReadDataSourceRequest) (resp providers.ReadDataSourceResponse) {
|
||||
func (p *MockProvider) ReadDataSource(_ context.Context, r providers.ReadDataSourceRequest) (resp providers.ReadDataSourceResponse) {
|
||||
p.Lock()
|
||||
defer p.Unlock()
|
||||
|
||||
@@ -583,7 +584,7 @@ func (p *MockProvider) ReadDataSource(r providers.ReadDataSourceRequest) (resp p
|
||||
return resp
|
||||
}
|
||||
|
||||
func (p *MockProvider) GetFunctions() (resp providers.GetFunctionsResponse) {
|
||||
func (p *MockProvider) GetFunctions(_ context.Context) (resp providers.GetFunctionsResponse) {
|
||||
p.Lock()
|
||||
defer p.Unlock()
|
||||
|
||||
@@ -599,7 +600,7 @@ func (p *MockProvider) GetFunctions() (resp providers.GetFunctionsResponse) {
|
||||
return resp
|
||||
}
|
||||
|
||||
func (p *MockProvider) CallFunction(r providers.CallFunctionRequest) (resp providers.CallFunctionResponse) {
|
||||
func (p *MockProvider) CallFunction(_ context.Context, r providers.CallFunctionRequest) (resp providers.CallFunctionResponse) {
|
||||
p.Lock()
|
||||
defer p.Unlock()
|
||||
|
||||
@@ -616,7 +617,7 @@ func (p *MockProvider) CallFunction(r providers.CallFunctionRequest) (resp provi
|
||||
return resp
|
||||
}
|
||||
|
||||
func (p *MockProvider) Close() error {
|
||||
func (p *MockProvider) Close(_ context.Context) error {
|
||||
p.Lock()
|
||||
defer p.Unlock()
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
package tofu
|
||||
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
|
||||
"github.com/opentofu/opentofu/internal/addrs"
|
||||
@@ -19,7 +20,7 @@ func simpleTestSchemas() *Schemas {
|
||||
|
||||
return &Schemas{
|
||||
Providers: map[addrs.Provider]providers.ProviderSchema{
|
||||
addrs.NewDefaultProvider("test"): provider.GetProviderSchema(),
|
||||
addrs.NewDefaultProvider("test"): provider.GetProviderSchema(context.TODO()),
|
||||
},
|
||||
Provisioners: map[string]*configschema.Block{
|
||||
"test": provisioner.GetSchemaResponse.Provisioner,
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
package tofu
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"log"
|
||||
"sync"
|
||||
@@ -108,7 +109,7 @@ func (ctx *TestContext) evaluate(state *states.SyncState, changes *plans.Changes
|
||||
defer func() {
|
||||
for addr, inst := range providerInstances {
|
||||
log.Printf("[INFO] Shutting down test provider %s", addr)
|
||||
inst.Close()
|
||||
inst.Close(context.TODO())
|
||||
}
|
||||
}()
|
||||
|
||||
|
||||
@@ -29,7 +29,7 @@ func TestGraphNodeImportStateExecute(t *testing.T) {
|
||||
},
|
||||
},
|
||||
}
|
||||
provider.ConfigureProvider(providers.ConfigureProviderRequest{})
|
||||
provider.ConfigureProvider(t.Context(), providers.ConfigureProviderRequest{})
|
||||
|
||||
evalCtx := &MockEvalContext{
|
||||
StateState: state.SyncWrapper(),
|
||||
@@ -70,7 +70,7 @@ func TestGraphNodeImportStateExecute(t *testing.T) {
|
||||
func TestGraphNodeImportStateSubExecute(t *testing.T) {
|
||||
state := states.NewState()
|
||||
provider := testProvider("aws")
|
||||
provider.ConfigureProvider(providers.ConfigureProviderRequest{})
|
||||
provider.ConfigureProvider(t.Context(), providers.ConfigureProviderRequest{})
|
||||
evalCtx := &MockEvalContext{
|
||||
StateState: state.SyncWrapper(),
|
||||
ProviderProvider: provider,
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
package tofu
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"log"
|
||||
@@ -109,7 +110,7 @@ func upgradeResourceStateTransform(args stateTransformArgs) (cty.Value, []byte,
|
||||
req.RawStateJSON = args.objectSrc.AttrsJSON
|
||||
}
|
||||
|
||||
resp := args.provider.UpgradeResourceState(req)
|
||||
resp := args.provider.UpgradeResourceState(context.TODO(), req)
|
||||
diags := resp.Diagnostics
|
||||
if diags.HasErrors() {
|
||||
log.Printf("[TRACE] upgradeResourceStateTransform: failed - address: %s", args.currentAddr)
|
||||
@@ -139,7 +140,7 @@ func moveResourceStateTransform(args stateTransformArgs) (cty.Value, []byte, tfd
|
||||
SourcePrivate: args.objectSrc.Private,
|
||||
TargetTypeName: args.currentAddr.Resource.Resource.Type,
|
||||
}
|
||||
resp := args.provider.MoveResourceState(req)
|
||||
resp := args.provider.MoveResourceState(context.TODO(), req)
|
||||
diags := resp.Diagnostics
|
||||
if diags.HasErrors() {
|
||||
log.Printf("[TRACE] moveResourceStateTransform: failed - new address: %s, previous address: %s - diags: %s", args.currentAddr, args.prevAddr, diags.Err().Error())
|
||||
|
||||
Reference in New Issue
Block a user