Include URN as an argument in DiffConfig/CheckConfig

For provider plugins, the gRPC interfaces expect that a URN would be
included as part of the DiffConfig/CheckConfig request, which means we
need to flow this value into our Provider interface.

This change does that.
This commit is contained in:
Matt Ellis 2019-05-20 13:56:27 -07:00
parent 61bff0c3a4
commit e574f33fa0
7 changed files with 40 additions and 34 deletions

View file

@ -715,7 +715,7 @@ func TestSingleResourceDefaultProviderReplace(t *testing.T) {
loaders := []*deploytest.ProviderLoader{
deploytest.NewProviderLoader("pkgA", semver.MustParse("1.0.0"), func() (plugin.Provider, error) {
return &deploytest.Provider{
DiffConfigF: func(olds, news resource.PropertyMap) (plugin.DiffResult, error) {
DiffConfigF: func(urn resource.URN, olds, news resource.PropertyMap) (plugin.DiffResult, error) {
// Always require replacement.
keys := []resource.PropertyKey{}
for k := range news {
@ -793,7 +793,7 @@ func TestSingleResourceExplicitProviderReplace(t *testing.T) {
loaders := []*deploytest.ProviderLoader{
deploytest.NewProviderLoader("pkgA", semver.MustParse("1.0.0"), func() (plugin.Provider, error) {
return &deploytest.Provider{
DiffConfigF: func(olds, news resource.PropertyMap) (plugin.DiffResult, error) {
DiffConfigF: func(urn resource.URN, olds, news resource.PropertyMap) (plugin.DiffResult, error) {
// Always require replacement.
keys := []resource.PropertyKey{}
for k := range news {
@ -882,7 +882,7 @@ func TestSingleResourceExplicitProviderDeleteBeforeReplace(t *testing.T) {
loaders := []*deploytest.ProviderLoader{
deploytest.NewProviderLoader("pkgA", semver.MustParse("1.0.0"), func() (plugin.Provider, error) {
return &deploytest.Provider{
DiffConfigF: func(olds, news resource.PropertyMap) (plugin.DiffResult, error) {
DiffConfigF: func(urn resource.URN, olds, news resource.PropertyMap) (plugin.DiffResult, error) {
// Always require replacement.
keys := []resource.PropertyKey{}
for k := range news {
@ -2598,7 +2598,7 @@ func TestDeleteBeforeReplace(t *testing.T) {
loaders := []*deploytest.ProviderLoader{
deploytest.NewProviderLoader("pkgA", semver.MustParse("1.0.0"), func() (plugin.Provider, error) {
return &deploytest.Provider{
DiffConfigF: func(olds, news resource.PropertyMap) (plugin.DiffResult, error) {
DiffConfigF: func(urn resource.URN, olds, news resource.PropertyMap) (plugin.DiffResult, error) {
if !olds["A"].DeepEquals(news["A"]) {
return plugin.DiffResult{
ReplaceKeys: []resource.PropertyKey{"A"},

View file

@ -38,15 +38,14 @@ func (p *builtinProvider) Pkg() tokens.Package {
}
// CheckConfig validates the configuration for this resource provider.
func (p *builtinProvider) CheckConfig(olds,
func (p *builtinProvider) CheckConfig(urn resource.URN, olds,
news resource.PropertyMap) (resource.PropertyMap, []plugin.CheckFailure, error) {
return nil, nil, nil
}
// DiffConfig checks what impacts a hypothetical change to this provider's configuration will have on the provider.
func (p *builtinProvider) DiffConfig(olds, news resource.PropertyMap) (plugin.DiffResult, error) {
func (p *builtinProvider) DiffConfig(urn resource.URN, olds, news resource.PropertyMap) (plugin.DiffResult, error) {
return plugin.DiffResult{Changes: plugin.DiffNone}, nil
}

View file

@ -32,9 +32,10 @@ type Provider struct {
configured bool
CheckConfigF func(olds, news resource.PropertyMap) (resource.PropertyMap, []plugin.CheckFailure, error)
DiffConfigF func(olds, news resource.PropertyMap) (plugin.DiffResult, error)
ConfigureF func(news resource.PropertyMap) error
CheckConfigF func(urn resource.URN, olds,
news resource.PropertyMap) (resource.PropertyMap, []plugin.CheckFailure, error)
DiffConfigF func(urn resource.URN, olds, news resource.PropertyMap) (plugin.DiffResult, error)
ConfigureF func(news resource.PropertyMap) error
CheckF func(urn resource.URN,
olds, news resource.PropertyMap) (resource.PropertyMap, []plugin.CheckFailure, error)
@ -75,18 +76,18 @@ func (prov *Provider) GetPluginInfo() (workspace.PluginInfo, error) {
}, nil
}
func (prov *Provider) CheckConfig(olds,
func (prov *Provider) CheckConfig(urn resource.URN, olds,
news resource.PropertyMap) (resource.PropertyMap, []plugin.CheckFailure, error) {
if prov.CheckConfigF == nil {
return news, nil, nil
}
return prov.CheckConfigF(olds, news)
return prov.CheckConfigF(urn, olds, news)
}
func (prov *Provider) DiffConfig(olds, news resource.PropertyMap) (plugin.DiffResult, error) {
func (prov *Provider) DiffConfig(urn resource.URN, olds, news resource.PropertyMap) (plugin.DiffResult, error) {
if prov.DiffConfigF == nil {
return plugin.DiffResult{}, nil
}
return prov.DiffConfigF(olds, news)
return prov.DiffConfigF(urn, olds, news)
}
func (prov *Provider) Configure(inputs resource.PropertyMap) error {
contract.Assert(!prov.configured)

View file

@ -185,13 +185,15 @@ func (r *Registry) label() string {
}
// CheckConfig validates the configuration for this resource provider.
func (r *Registry) CheckConfig(olds, news resource.PropertyMap) (resource.PropertyMap, []plugin.CheckFailure, error) {
func (r *Registry) CheckConfig(urn resource.URN, olds,
news resource.PropertyMap) (resource.PropertyMap, []plugin.CheckFailure, error) {
contract.Fail()
return nil, nil, errors.New("the provider registry is not configurable")
}
// DiffConfig checks what impacts a hypothetical change to this provider's configuration will have on the provider.
func (r *Registry) DiffConfig(olds, news resource.PropertyMap) (plugin.DiffResult, error) {
func (r *Registry) DiffConfig(urn resource.URN, olds, news resource.PropertyMap) (plugin.DiffResult, error) {
contract.Fail()
return plugin.DiffResult{}, errors.New("the provider registry is not configurable")
}
@ -231,7 +233,7 @@ func (r *Registry) Check(urn resource.URN, olds, news resource.PropertyMap,
}
// Check the provider's config. If the check fails, unload the provider.
inputs, failures, err := provider.CheckConfig(olds, news)
inputs, failures, err := provider.CheckConfig(urn, olds, news)
if len(failures) != 0 || err != nil {
closeErr := r.host.CloseProvider(provider)
contract.IgnoreError(closeErr)
@ -274,7 +276,7 @@ func (r *Registry) Diff(urn resource.URN, id resource.ID, olds, news resource.Pr
provider, ok = r.GetProvider(mustNewReference(urn, id))
contract.Assertf(ok, "Provider must have been registered by NewRegistry for DBR Diff (%v::%v)", urn, id)
diff, err := provider.DiffConfig(olds, news)
diff, err := provider.DiffConfig(urn, olds, news)
if err != nil {
return plugin.DiffResult{Changes: plugin.DiffUnknown}, err
}
@ -282,7 +284,7 @@ func (r *Registry) Diff(urn resource.URN, id resource.ID, olds, news resource.Pr
}
// Diff the properties.
diff, err := provider.DiffConfig(olds, news)
diff, err := provider.DiffConfig(urn, olds, news)
if err != nil {
return plugin.DiffResult{Changes: plugin.DiffUnknown}, err
}

View file

@ -77,9 +77,10 @@ type testProvider struct {
pkg tokens.Package
version semver.Version
configured bool
checkConfig func(resource.PropertyMap, resource.PropertyMap) (resource.PropertyMap, []plugin.CheckFailure, error)
diffConfig func(resource.PropertyMap, resource.PropertyMap) (plugin.DiffResult, error)
config func(resource.PropertyMap) error
checkConfig func(resource.URN, resource.PropertyMap,
resource.PropertyMap) (resource.PropertyMap, []plugin.CheckFailure, error)
diffConfig func(resource.URN, resource.PropertyMap, resource.PropertyMap) (plugin.DiffResult, error)
config func(resource.PropertyMap) error
}
func (prov *testProvider) SignalCancellation() error {
@ -91,12 +92,12 @@ func (prov *testProvider) Close() error {
func (prov *testProvider) Pkg() tokens.Package {
return prov.pkg
}
func (prov *testProvider) CheckConfig(olds,
func (prov *testProvider) CheckConfig(urn resource.URN, olds,
news resource.PropertyMap) (resource.PropertyMap, []plugin.CheckFailure, error) {
return prov.checkConfig(olds, news)
return prov.checkConfig(urn, olds, news)
}
func (prov *testProvider) DiffConfig(olds, news resource.PropertyMap) (plugin.DiffResult, error) {
return prov.diffConfig(olds, news)
func (prov *testProvider) DiffConfig(urn resource.URN, olds, news resource.PropertyMap) (plugin.DiffResult, error) {
return prov.diffConfig(urn, olds, news)
}
func (prov *testProvider) Configure(inputs resource.PropertyMap) error {
if err := prov.config(inputs); err != nil {
@ -202,10 +203,11 @@ func newSimpleLoader(t *testing.T, pkg, version string, config func(resource.Pro
return &testProvider{
pkg: pkg,
version: ver,
checkConfig: func(olds, news resource.PropertyMap) (resource.PropertyMap, []plugin.CheckFailure, error) {
checkConfig: func(urn resource.URN, olds,
news resource.PropertyMap) (resource.PropertyMap, []plugin.CheckFailure, error) {
return news, nil, nil
},
diffConfig: func(olds, news resource.PropertyMap) (plugin.DiffResult, error) {
diffConfig: func(urn resource.URN, olds, news resource.PropertyMap) (plugin.DiffResult, error) {
return plugin.DiffResult{}, nil
},
config: config,
@ -512,10 +514,11 @@ func TestCRUDPreview(t *testing.T) {
return &testProvider{
pkg: pkg,
version: ver,
checkConfig: func(olds, news resource.PropertyMap) (resource.PropertyMap, []plugin.CheckFailure, error) {
checkConfig: func(urn resource.URN, olds,
news resource.PropertyMap) (resource.PropertyMap, []plugin.CheckFailure, error) {
return news, nil, nil
},
diffConfig: func(olds, news resource.PropertyMap) (plugin.DiffResult, error) {
diffConfig: func(urn resource.URN, olds, news resource.PropertyMap) (plugin.DiffResult, error) {
// Always reuquire replacement.
return plugin.DiffResult{ReplaceKeys: []resource.PropertyKey{"id"}}, nil
},

View file

@ -39,9 +39,9 @@ type Provider interface {
Pkg() tokens.Package
// CheckConfig validates the configuration for this resource provider.
CheckConfig(olds, news resource.PropertyMap) (resource.PropertyMap, []CheckFailure, error)
CheckConfig(urn resource.URN, olds, news resource.PropertyMap) (resource.PropertyMap, []CheckFailure, error)
// DiffConfig checks what impacts a hypothetical change to this provider's configuration will have on the provider.
DiffConfig(olds, news resource.PropertyMap) (DiffResult, error)
DiffConfig(urn resource.URN, olds, news resource.PropertyMap) (DiffResult, error)
// Configure configures the resource provider with "globals" that control its behavior.
Configure(inputs resource.PropertyMap) error

View file

@ -85,7 +85,8 @@ func (p *provider) label() string {
}
// CheckConfig validates the configuration for this resource provider.
func (p *provider) CheckConfig(olds, news resource.PropertyMap) (resource.PropertyMap, []CheckFailure, error) {
func (p *provider) CheckConfig(urn resource.URN, olds,
news resource.PropertyMap) (resource.PropertyMap, []CheckFailure, error) {
// Ensure that all config values are strings or unknowns.
var failures []CheckFailure
for k, v := range news {
@ -111,7 +112,7 @@ func (p *provider) CheckConfig(olds, news resource.PropertyMap) (resource.Proper
}
// DiffConfig checks what impacts a hypothetical change to this provider's configuration will have on the provider.
func (p *provider) DiffConfig(olds, news resource.PropertyMap) (DiffResult, error) {
func (p *provider) DiffConfig(urn resource.URN, olds, news resource.PropertyMap) (DiffResult, error) {
// There are two interesting scenarios with the present gRPC interface:
// 1. Configuration differences in which all properties are known
// 2. Configuration differences in which some new property is unknown.