-
Notifications
You must be signed in to change notification settings - Fork 234
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Allow specifying external providers in a TestCase. #516
Conversation
Users used to specify third-party providers they relied on for tests--usually utility providers like random--by importing the provider and specifying it in resource.TestCase.Providers or resource.TestCase.ProviderFactories. With binary testing, this is no longer necessary, as the providers can be downloaded from the registry using Terraform init. This allows for more up-to-date providers with fewer Go dependencies, which is a nicer system all around. The acceptance testing framework will run `terraform init`, which will automatically notice these providers being used in the configuration files and download them, just like in production. However, there's a wrinkle; tests that import don't have the resources set in the configuration, which means they're not downloaded during init, which causes test failures. To resolve this, this PR adds a new property to TestCase, which lets developers list the third party providers their test relies on. This list is then added to the list of provider blocks auto-generated by the test framework, allowing them to be inited during import tests. Arguably, we should have this new property take a map of blocks to either their version, their source block, or both, so users can control specifically which version of the provider they're using and where it's downloaded from. I'm open to thoughts and opinions on that.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM, although I think for 0.13 this should probably be a map (ie. local name to 0.13 address so you can do a required_providers
entry instead?)
Would also be cool to add a check to confirm no local names match anything specified in the factories/providers maps.
Pushed a change to be a map of structs to support versioning and sources. I can't actually discriminate based on 0.13 or not, but providers that want to run tests against 0.12.26+ should be able to just leave the |
Providers should only be set in TestCase.Providers or TestCase.ExternalProviders, they shouldn't be set in both.
for p := range c.Providers { | ||
lines = append(lines, fmt.Sprintf("provider %q {}\n", p)) | ||
} | ||
for p, v := range c.ExternalProviders { | ||
if _, ok := c.Providers[p]; ok { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think you need to check factories as well here?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Factories don't produce a provider block 🤷♂️
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM, we can discriminate once we swap to tfexec, it knows the version its running with so you would be able to pull that off the wd
value eventually.
I'm going to lock this issue because it has been closed for 30 days ⏳. This helps our maintainers find and focus on the active issues. If you have found a problem that seems similar to this, please open a new issue and complete the issue template so we can capture all the details necessary to investigate further. |
Users used to specify third-party providers they relied on for
tests--usually utility providers like random--by importing the provider
and specifying it in resource.TestCase.Providers or
resource.TestCase.ProviderFactories. With binary testing, this is no
longer necessary, as the providers can be downloaded from the registry
using Terraform init. This allows for more up-to-date providers with
fewer Go dependencies, which is a nicer system all around.
The acceptance testing framework will run
terraform init
, which willautomatically notice these providers being used in the configuration
files and download them, just like in production.
However, there's a wrinkle; tests that import don't have the resources
set in the configuration, which means they're not downloaded during
init, which causes test failures.
To resolve this, this PR adds a new property to TestCase, which lets
developers list the third party providers their test relies on. This
list is then added to the list of provider blocks auto-generated by the
test framework, allowing them to be inited during import tests.
Arguably, we should have this new property take a map of blocks to
either their version, their source block, or both, so users can control
specifically which version of the provider they're using and where it's
downloaded from. I'm open to thoughts and opinions on that.