Repository navigation
fix(provider-generator): match shorthand provider sources against OpenTofu schema keys - #293
Merged
Merged
Conversation
…nTofu schema keys Shorthand provider sources like "hashicorp/awscc" omit a registry hostname. isMatching assumed the missing hostname was always registry.terraform.io, but `tofu providers schema -json` returns schema keys under registry.opentofu.org. As a result `cdktn get` failed with "Could not find provider with constraint ..." under OpenTofu even though the provider had been installed correctly (#216). Only compare the hostname when the source explicitly pins one (a 3-part source). Shorthand 1- and 2-part sources now match on namespace/name regardless of the schema key's registry hostname, so the same cdktf.json works under both Terraform and OpenTofu. Explicit 3-part hostnames stay strict and do not cross registries. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BG9ZUpdDa3GDNRkRMC2b5U
jsteinich
approved these changes
Jul 1, 2026
jsteinich
left a comment
Contributor
There was a problem hiding this comment.
While not matching against the current binary makes sense, we still may want a away in the future for users to be able to explicitly set cdktn into Terraform, OpenTofu, or mixed mode. Can be a follow-up item though.
so0k
pushed a commit
that referenced
this pull request
Jul 3, 2026
🤖 Release PR — merge to cut a new release. Kept open and rebased as commits land on `main`. --- <details><summary>0.23.4</summary> ## [0.23.4](v0.23.3...v0.23.4) (2026-07-02) ### Features * **cli:** validate Terraform CLI feature versions ([#237](#237)) ([32d434c](32d434c)) * declared Terraform/OpenTofu target versions (validation foundation) ([#269](#269)) ([0aa2343](0aa2343)) * **lib:** S3-backend - Add `useLockfile` field and update `dynamodbTable` deprecated JSDoc ([#234](#234)) ([32a408f](32a408f)) * **lib:** validate Fn usage against Terraform/OpenTofu versions ([#268](#268)) ([cdf8115](cdf8115)) ### Bug Fixes * **cli:** don't mistake terraform error output for a missing-variable prompt ([#267](#267)) ([0ea946f](0ea946f)) * **cli:** release terraform state lock when interrupting diff/deploy ([#284](#284)) ([de617db](de617db)) * **cli:** resolve prebuilt Java provider versions via repo1.maven.org ([#285](#285)) ([d5af07d](d5af07d)) * **gha:** Adding CHANGELOG.md to prettier ignore list ([#258](#258)) ([5160469](5160469)) * **gha:** pull jsii-terraform CI image from GHCR instead of Docker Hub ([#261](#261)) ([f19d34b](f19d34b)) * **provider-generator:** copy only publishable files into the jsii compile bundle ([#292](#292)) ([562d4c7](562d4c7)) * **provider-generator:** match shorthand provider sources against OpenTofu schema keys ([#293](#293)) ([fda0103](fda0103)) * **release:** add Changelog title for correct release-please insertion ([#255](#255)) ([004818a](004818a)) * **release:** drop devEngines.packageManager that broke npm publish ([ef508a6](ef508a6)) * **tools:** repair generate-function-bindings tool ([#273](#273)) ([821e1cf](821e1cf)) ### Miscellaneous Chores * Add Gradle to Mise config ([#271](#271)) ([1578270](1578270)) * add pnpm to mise ([#266](#266)) ([48ab91f](48ab91f)) * add uv to mise ([#260](#260)) ([163cf3d](163cf3d)) * **deps:** bump nrwl/nx-set-shas from 38457b511e60ee4e1da09255b658e480748a1af4 to afb73a62d26e41464e9254689e1fd6122ee683c1 ([#236](#236)) ([b5ac018](b5ac018)) * **deps:** bump the github-actions-backward-compatible group across 1 directory with 7 updates ([#235](#235)) ([de67d9f](de67d9f)) * **deps:** replace uuid dependency with node:crypto.randomUUID ([#291](#291)) ([6d3657a](6d3657a)) * ESLint ignore test edge-provider-bindings ([#270](#270)) ([ba407bb](ba407bb)) * Fix Verdaccio logging config ([#272](#272)) ([aded64b](aded64b)) * **gha:** parallelize provider binding generation for documentation examples ([#244](#244)) ([0a9c955](0a9c955)) * Migrate package manager from yarn to pnpm ([#170](#170)) ([d23da4e](d23da4e)) * migrate planning artifacts to cdktn-planning [skip ci] ([968c358](968c358)) * **release:** add release-please automation for versioning ([#243](#243)) ([c759eec](c759eec)) * Remove dependency-pinner tool ([#250](#250)) ([42c27d5](42c27d5)) * Remove unused dependencies ([#281](#281)) ([c7de65e](c7de65e)) * **tests:** run verdaccio in-process ([#248](#248)) ([c17677d](c17677d)) * Update JSII version constraint ([#245](#245)) ([d89558f](d89558f)) * Update scheduled workflows to only run on open-constructs/cdk-terrain ([#256](#256)) ([ba408cf](ba408cf)) </details> --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Co-authored-by: open-constructs-cdktn[bot] <291052431+open-constructs-cdktn[bot]@users.noreply.github.com>
Contributor
|
I'm going to lock this pull request because it has been closed for 30 days. This helps our maintainers find and focus on the active issues. If you've found a problem that seems related to this change, please open a new issue and complete the issue template so we can capture all the details necessary to investigate further. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Related issue
Fixes #216
Description
Root cause.
cdktn getfails under OpenTofu (TERRAFORM_BINARY_NAME=tofu) withCould not find provider with constraint ..., even though the provider installs correctly. The failure is in provider-schema → target matching, not in provider download.In
packages/@cdktn/provider-generator/src/get/generator/provider-generator.ts,isMatchingexpands a targetsourceand compares it to the schema key. When a source omits a registry hostname (a shorthand likehashicorp/awscc), the old code assumed the missing hostname was alwaysregistry.terraform.ioand compared it strictly against the schema key's hostname:hashicorp/awscc→ schema keyregistry.terraform.io/hashicorp/awscc✅hashicorp/awscc→ schema keyregistry.opentofu.org/hashicorp/awscc❌ (never matched)Fix (minimal, intentionally). Only compare the hostname when the source explicitly pins one (a 3-part source). Shorthand 1- and 2-part sources now match on
namespace/nameand ignore the schema key's registry hostname:Why exactly this shape:
cdktf.jsonworks under both CLIs.emitProviderwritesterraformProviderSource = constraint.source, so the shorthandhashicorp/awsccis preserved in generated metadata — it stays registry-agnostic instead of being pinned to one registry. This avoids the downside of the documented workaround (registry.opentofu.org/hashicorp/awscc), which hard-codes an OpenTofu-only source address.registry.terraform.io/hashicorp/awsccstill only matches that exact registry and won't cross toregistry.opentofu.org.TERRAFORM_BINARY_NAMEcouples generator logic to the binary and breaks with wrapper scripts/paths. A full "match against actual schema keys + explicit ambiguity error" design adds machinery for a case that can't occur from a singleterraform/tofu providers schemarun (each provider resolves to exactly one registry per invocation). Per the project's YAGNI > KISS priority, we kept it minimal;getProviderByConstraintuses.find(), so the pathological "same namespace/name under two hostnames" schema would deterministically pick the first key rather than throw — acceptable and not worth building around today.Scope note.
hcl2cdk's separate matcher (packages/@cdktn/hcl2cdk/src/provider.ts) already matches with.endsWith()and is hostname-agnostic, so it is unaffected. This change is deliberately confined to the one matcher on thecdktn getpath.Tests
Added
provider-source-matching.test.tsdrivingTerraformProviderGenerator.generate(...)(sinceisMatchingis module-private) over minimal hand-built schemas:hashicorp/awscc↔registry.opentofu.org/hashicorp/awscc→ matches (thecdktn getfails to generate provider bindings when using OpenTofu #216 regression)hashicorp/awscc↔registry.terraform.io/hashicorp/awscc→ still matchesregistry.terraform.io/...↔registry.opentofu.org/...→ stays strict, throwsFollow-up (out of scope): the repo currently has no integration tests that run with
tofu. End-to-end coverage of the OpenTofucdktn getpath is tracked as a separate work item rather than bundled here, to keep this PR small and focused on the matcher fix. The unit tests above prove the matching behavior directly.Checklist
🤖 Generated with Claude Code
Generated by Claude Code