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:
Martin Atkins
2025-05-22 16:56:23 -07:00
parent f8d128491c
commit 32082321bf
35 changed files with 429 additions and 741 deletions

View File

@@ -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
}

View File

@@ -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()),
},
}
}

View File

@@ -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")

View File

@@ -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()),
},
}
}

View File

@@ -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()
}

View File

@@ -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()
}

View File

@@ -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
}

View File

@@ -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.

View File

@@ -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.

View File

@@ -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},
})

View File

@@ -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.

View File

@@ -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},
})

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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

View File

@@ -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()))
}
}

View File

@@ -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,
})

View File

@@ -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())
}

View File

@@ -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
}

View File

@@ -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,

View File

@@ -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,

View File

@@ -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 {

View File

@@ -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)

View File

@@ -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{

View File

@@ -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,
})

View File

@@ -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,
})

View File

@@ -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()),
}

View File

@@ -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()))
}

View File

@@ -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)

View File

@@ -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 {

View File

@@ -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()

View File

@@ -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,

View File

@@ -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())
}
}()

View File

@@ -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,

View File

@@ -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())