diff options
Diffstat (limited to 'vendor/github.com/hashicorp/terraform/terraform/resource_provider.go')
-rw-r--r-- | vendor/github.com/hashicorp/terraform/terraform/resource_provider.go | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/vendor/github.com/hashicorp/terraform/terraform/resource_provider.go b/vendor/github.com/hashicorp/terraform/terraform/resource_provider.go index 1a68c86..7d78f67 100644 --- a/vendor/github.com/hashicorp/terraform/terraform/resource_provider.go +++ b/vendor/github.com/hashicorp/terraform/terraform/resource_provider.go | |||
@@ -1,5 +1,12 @@ | |||
1 | package terraform | 1 | package terraform |
2 | 2 | ||
3 | import ( | ||
4 | "fmt" | ||
5 | |||
6 | multierror "github.com/hashicorp/go-multierror" | ||
7 | "github.com/hashicorp/terraform/plugin/discovery" | ||
8 | ) | ||
9 | |||
3 | // ResourceProvider is an interface that must be implemented by any | 10 | // ResourceProvider is an interface that must be implemented by any |
4 | // resource provider: the thing that creates and manages the resources in | 11 | // resource provider: the thing that creates and manages the resources in |
5 | // a Terraform configuration. | 12 | // a Terraform configuration. |
@@ -154,6 +161,18 @@ type ResourceProvider interface { | |||
154 | ReadDataApply(*InstanceInfo, *InstanceDiff) (*InstanceState, error) | 161 | ReadDataApply(*InstanceInfo, *InstanceDiff) (*InstanceState, error) |
155 | } | 162 | } |
156 | 163 | ||
164 | // ResourceProviderError may be returned when creating a Context if the | ||
165 | // required providers cannot be satisfied. This error can then be used to | ||
166 | // format a more useful message for the user. | ||
167 | type ResourceProviderError struct { | ||
168 | Errors []error | ||
169 | } | ||
170 | |||
171 | func (e *ResourceProviderError) Error() string { | ||
172 | // use multierror to format the default output | ||
173 | return multierror.Append(nil, e.Errors...).Error() | ||
174 | } | ||
175 | |||
157 | // ResourceProviderCloser is an interface that providers that can close | 176 | // ResourceProviderCloser is an interface that providers that can close |
158 | // connections that aren't needed anymore must implement. | 177 | // connections that aren't needed anymore must implement. |
159 | type ResourceProviderCloser interface { | 178 | type ResourceProviderCloser interface { |
@@ -171,6 +190,50 @@ type DataSource struct { | |||
171 | Name string | 190 | Name string |
172 | } | 191 | } |
173 | 192 | ||
193 | // ResourceProviderResolver is an interface implemented by objects that are | ||
194 | // able to resolve a given set of resource provider version constraints | ||
195 | // into ResourceProviderFactory callbacks. | ||
196 | type ResourceProviderResolver interface { | ||
197 | // Given a constraint map, return a ResourceProviderFactory for each | ||
198 | // requested provider. If some or all of the constraints cannot be | ||
199 | // satisfied, return a non-nil slice of errors describing the problems. | ||
200 | ResolveProviders(reqd discovery.PluginRequirements) (map[string]ResourceProviderFactory, []error) | ||
201 | } | ||
202 | |||
203 | // ResourceProviderResolverFunc wraps a callback function and turns it into | ||
204 | // a ResourceProviderResolver implementation, for convenience in situations | ||
205 | // where a function and its associated closure are sufficient as a resolver | ||
206 | // implementation. | ||
207 | type ResourceProviderResolverFunc func(reqd discovery.PluginRequirements) (map[string]ResourceProviderFactory, []error) | ||
208 | |||
209 | // ResolveProviders implements ResourceProviderResolver by calling the | ||
210 | // wrapped function. | ||
211 | func (f ResourceProviderResolverFunc) ResolveProviders(reqd discovery.PluginRequirements) (map[string]ResourceProviderFactory, []error) { | ||
212 | return f(reqd) | ||
213 | } | ||
214 | |||
215 | // ResourceProviderResolverFixed returns a ResourceProviderResolver that | ||
216 | // has a fixed set of provider factories provided by the caller. The returned | ||
217 | // resolver ignores version constraints entirely and just returns the given | ||
218 | // factory for each requested provider name. | ||
219 | // | ||
220 | // This function is primarily used in tests, to provide mock providers or | ||
221 | // in-process providers under test. | ||
222 | func ResourceProviderResolverFixed(factories map[string]ResourceProviderFactory) ResourceProviderResolver { | ||
223 | return ResourceProviderResolverFunc(func(reqd discovery.PluginRequirements) (map[string]ResourceProviderFactory, []error) { | ||
224 | ret := make(map[string]ResourceProviderFactory, len(reqd)) | ||
225 | var errs []error | ||
226 | for name := range reqd { | ||
227 | if factory, exists := factories[name]; exists { | ||
228 | ret[name] = factory | ||
229 | } else { | ||
230 | errs = append(errs, fmt.Errorf("provider %q is not available", name)) | ||
231 | } | ||
232 | } | ||
233 | return ret, errs | ||
234 | }) | ||
235 | } | ||
236 | |||
174 | // ResourceProviderFactory is a function type that creates a new instance | 237 | // ResourceProviderFactory is a function type that creates a new instance |
175 | // of a resource provider. | 238 | // of a resource provider. |
176 | type ResourceProviderFactory func() (ResourceProvider, error) | 239 | type ResourceProviderFactory func() (ResourceProvider, error) |
@@ -202,3 +265,21 @@ func ProviderHasDataSource(p ResourceProvider, n string) bool { | |||
202 | 265 | ||
203 | return false | 266 | return false |
204 | } | 267 | } |
268 | |||
269 | // resourceProviderFactories matches available plugins to the given version | ||
270 | // requirements to produce a map of compatible provider plugins if possible, | ||
271 | // or an error if the currently-available plugins are insufficient. | ||
272 | // | ||
273 | // This should be called only with configurations that have passed calls | ||
274 | // to config.Validate(), which ensures that all of the given version | ||
275 | // constraints are valid. It will panic if any invalid constraints are present. | ||
276 | func resourceProviderFactories(resolver ResourceProviderResolver, reqd discovery.PluginRequirements) (map[string]ResourceProviderFactory, error) { | ||
277 | ret, errs := resolver.ResolveProviders(reqd) | ||
278 | if errs != nil { | ||
279 | return nil, &ResourceProviderError{ | ||
280 | Errors: errs, | ||
281 | } | ||
282 | } | ||
283 | |||
284 | return ret, nil | ||
285 | } | ||