Releases: crossplane/upjet
v2.2.0
New Features
- Framework Diagnostics Error Support: Added
terraform/errors.FrameworkDiagnosticsErrorto convert Terraform plugin framework diagnostic error messages into Go errors. This enhancement improves error handling and debugging capabilities when working with Terraform plugin framework resources. - Framework Resource Identity Configuration: Introduced
config.FrameworkResourceWithComputedIdentifierexternal-name configuration specifically designed for Terraform plugin framework resources with computed identifier fields. This feature includes a newconfig.ExternalName.TFPluginFrameworkOptionsstruct for grouping framework-related configuration options and ComputedIdentifierAttributes to exclude computed identifier fields during drift calculations between desired and actual states. - Struct Tag Package & InitProvider Overrides: Added comprehensive pkg/types/structtag package providing a typed struct tag model with parsing, override capabilities, and validation. This enables per-field InitProvider overrides through
config.InitProviderOverrideswith both Kubebuilder marker and struct tag overrides. JSON tag values are now validated using regex patterns to prevent invalid CRD field names, and nil values in initProvider are properly handled to avoid spurious plan diffs. - Enhanced Tag Override System: Introduced structtag.Value.OverrideFrom method for overriding struct tags from another source, along with
config.SchemaElementOption.InitProviderTagOverridesto customize generated tags for InitProvider types. This provides fine-grained control over code generation and CRD field specifications.
Bug Fixes
Critical Race Condition Fix - Conversion Webhooks
This release resolves a critical race condition in conversion path registration that was causing intermittent failures in provider packages.
Technical Details:
- Problem: A data race existed in the conversion.Convert method where multiple goroutines could simultaneously modify registered conversion paths during in-place sorting
- Impact: This race condition was observed in provider packages and could cause unexpected conversion webhook failures
- Solution: Fixed by creating a copy of registered conversion paths before performing in-place sorting, preventing concurrent modifications
This fix addresses reliability issues that users may have experienced with conversion webhooks, particularly in high-load environments or during rapid resource operations.
What's Changed
- Fix the race on the registered conversion paths in conversion.Convert by @ulucinar in #545
- Add per-field InitProvider tag & kubebuilder marker overrides by @ulucinar in #544
- linter: suppress linter false positives on switch-case by @erhancagirici in #550
- Add config.FrameworkResourceWithComputedIdentifier external-name configuration by @ulucinar in #549
- Add terraform/errors.FrameworkDiagnosticsError by @ulucinar in #551
Full Changelog: v2.1.0...v2.2.0
v1.11.0
New Features
- New External Name Configuration: Added config.FrameworkResourceWithComputedIdentifier for more flexible external name handling in Terraform provider configurations
- Enhanced Struct Tag Support: Introduced comprehensive struct tag manipulation capabilities through the new pkg/types/structtag package
- Introduce pkg/types/structtag with a typed struct tag model (Value, parsing, override, no-omit)
- Add per-field InitProvider overrides:
- config.InitProviderOverrides with kubebuilder.Options and config.TagOverrides
- Tag overrides for json and tf via structtag.Value
- Kubebuilder marker overrides via pkg/types/markers/kubebuilder.Options
- config.InitProviderOverrides with kubebuilder.Options and config.TagOverrides
- Strengthen validation of JSON tag names and tag combinations, previously there was no validation for these.
- json struct tag values are validated using the regex ^[a-zA-Z_][a-zA-Z0-9_]*$ to prevent upjet from generating invalid CRD field names.
- tf tag values are currently not validated. This is future work (we need to investigate their syntax first)
- Treat nil values in initProvider as absent when computing ignore list; avoids spurious plan diffs
Developer Experience Improvements
- Improved Error Diagnostics: Enhanced error handling and diagnostics for Terraform plugin framework integration
- Stricter Configuration Validation: Unknown struct tag options now properly trigger errors instead of being silently ignored
Technical Improvements
- Enhanced conversion path management to prevent concurrent access issues
- Strengthened validation for external name configuration options
- Improved handling of edge cases in code generation for Crossplane providers
- Better error reporting for configuration validation failures
What's Changed
- [Backport release-1.11] PR#533 PR#534 PR#538 PR#549 PR#551 by @ulucinar in #553
- [Backport release-1.11] Backport 544 to release 1.11 by @sergenyalcin in #554
Full Changelog: v1.10.0...v1.11.0
v1.10.0
Critical Race Condition Fix - Conversion Webhooks
Important Stability Improvement: This release resolves a critical race condition in conversion path registration that was causing intermittent failures in provider packages.
Technical Details:
- Problem: A data race existed in the conversion.Convert method where multiple goroutines could simultaneously modify registered conversion paths during in-place sorting
- Impact: This race condition was observed in provider packages and could cause unexpected conversion webhook failures
- Solution: Fixed by creating a copy of registered conversion paths before performing in-place sorting, preventing concurrent modifications
This fix addresses reliability issues that users may have experienced with conversion webhooks, particularly in high-load environments or during rapid resource operations.
Additional Bug Fixes
- Panic Prevention: Fixed potential panic when ts.FrameworkProvider is nil (#500)
- Wildcard Conversion: Corrected wildcard expand behavior during resource conversion (#504)
- Connection Strings: Fixed incorrectly generated connection string maps (#506)
- External Names: Removed unnecessary ID validation for resources without ID fields (#507)
- State Management: Added custom state check configuration for Terraform Plugin Framework resources (#515)
What's Changed
- Validate that
ts.FrameworkProvideris not nil to avoid panic by @nikimanoledaki in #500 - Fix wildcard expand behavior when if the field path is not found during conversion by @sergenyalcin in #504
- Fix incorrectly generated connection string map by @sergenyalcin in #506
- remove id validation from setExternalName for resources without id field by @erhancagirici in #507
- Custom state check configuration for TF plugin framework resources by @sergenyalcin in #515
- [Backport release-1.10] Fix the race on the registered conversion paths in conversion.Convert by @ulucinar in #552
New Contributors
- @nikimanoledaki made their first contribution in #500
Full Changelog: v1.9.0...v1.10.0
v2.1.0
What's new
✨ This release introduces support for for generating providers with Terraform Protocol version 6 features in their resource schemas. Resources with nested attributes and dynamic-pseudo type attributes are now can be generated. The changes are backward compatible and does not affect existing resources.
Warning
To incorporate the changes, existing providers should first upgrade the provider to adapt Upjet v2 first, referring to the upgrade guide
Fresh providers can start with the upjet-provider-template and follow provider generation guide
After upgrading your provider to Upjet v2, you can switch to this version in your provider's go.mod, configure protov6 resources and run make generate
What's Changed
- chore: update OWNERS.md file with correct email domain for maintainers by @jbw976 in #533
- docs: upjet v2 upgrade guide by @erhancagirici in #532
- Do not duplicate base package controllers in the monolithic provider by @ulucinar in #534
- Add config.Provider.ExampleManifestConfiguration to configure the example manifest generation pipeline by @ulucinar in #535
- Introduce support for generating providers with TF protov6 features by @erhancagirici in #527
- Rename examples/conversion.ConvertSingletonListToEmbeddedObject as ApplyAPIConverters by @ulucinar in #538
Full Changelog: v2.0.0...v2.1.0-rc.0
v2.0.0
We are excited to announce Upjet v2.0.0 is available. This release introduces support for generating Crossplane v2 compatible providers with namespaced MRs.
Crossplane v2 compatibility
Upjet v2 generates Crossplane v2-compatible namespaced Managed Resources (MRs) and providers.
During the transition period of the providers, Upjet continues to generate cluster-scoped MRs along with new namespace-scoped MRs.
Namespaced MR APIs
Namespaced MR Go types now embed v2.ManagedResourceSpec. Per Crossplane v2 changes, this effectively makes the generated namespaced MR API:
spec.writeConnectionSecretToRef: connection secret refs are now local references (without namespace)- remove
spec.deletionPolicyfrom namespaced MR specs, this is now expected to be configured via management policies - remove
spec.publishConnectionDetailsToas XPv2 removed support for External Secret Stores (ESS) - generate local secret refs for sensitive input parameters in
spec.forProvider, e.g.spec.forProvider.fooSecretRef. - generate optionally namespaced reference/selector fields for cross-resource references.
Directory Structure changes
To facilitate both cluster-scoped and namespace-scoped APIs at the same repository, generated providers will have apis/ internal/controller/ examples-generated/
Module changes
- upjet module is bumped to v2
- bumped crossplane-runtime to v2 and updated all the import paths
Upgrade guide
Existing providers can refere to the upgrade guide
Fresh providers can start with the upjet-provider-template and follow provider generation guide to generate a new provider.
What's Changed
- Validate that
ts.FrameworkProvideris not nil to avoid panic by @nikimanoledaki in #500 - Fix wildcard expand behavior when if the field path is not found during conversion by @sergenyalcin in #504
- Fix incorrectly generated connection string map by @sergenyalcin in #506
- remove id validation from setExternalName for resources without id field by @erhancagirici in #507
- Custom state check configuration for TF plugin framework resources by @sergenyalcin in #515
- Sanitize Identity field in InstanceDiff by @sergenyalcin in #512
- Generate crossplane v2 providers by @erhancagirici in #518
- bump upjet go module to v2 by @erhancagirici in #519
New Contributors
- @nikimanoledaki made their first contribution in #500
Full Changelog: v1.9.0...v2.0.0
v1.9.0
This release:
- Adds support for change logs feature.
- Bumps the crossplane-runtime version to the latest commit.
What's Changed
- feat(changelogs): add support for change logs in controller templates by @jbw976 in #491
- Bump crossplane-runtime dependency by @sergenyalcin in #493
Full Changelog: v1.8.0...v1.9.0
v1.8.1
This PR bumps the crossplane-runtime dependency.
What's Changed
- [Backport release-1.8] Bump crossplane-runtime dependency by @github-actions in #494
Full Changelog: v1.8.0...v1.8.1
v1.5.1
This release contains a bug fix for update reconciliations. Now, we will call runtime conversions before update calls.
What's Changed
- [Backport release-1.5] call ApplyTFConversions in Update function from terraform plugin sdk external client by @github-actions in #492
Full Changelog: v1.5.0...v1.5.1
v1.8.0
This release:
- Bumps crossplane-runtime version to
v1.19.0and core crossplane tov1.19.1 - Update some dependencies
- Call runtime conversions before update calls.
With these releases, since the crossplane-runtime deprecates some functions that I related to reference resolvers, the users must be careful during the upjet bump in the providers. Because, if the upjet version is directly bumped, then the user can encounter some errors as following during generation:
zz_generated.resolvers.go:36:27: undefined: reference.FromPtrValue
zz_generated.resolvers.go:48:84: undefined: reference.ToPtrValue
zz_generated.resolvers.go:52:27: undefined: reference.FromPtrValue
zz_generated.resolvers.go:64:85: undefined: reference.ToPtrValue
Therefore, for a safe bump, you need to follow these steps:
- Generate the reference resolvers by bumping the crossplane-tools (angryjet). By this way, you will have the new reference resolvers that don’t use the deprecated functions. The version you need to update the crossplane-tools is:
v0.0.0-20250424174524-de0e5107ea45. This version refers to this commit. Then, please observe the updated reference resolvers. - After being sure that the reference resolvers are up-to-date, then bump upjet the version and run
make generate. You will not get any error.
What's Changed
- call ApplyTFConversions in Update function from terraform plugin sdk external client by @digna-ionos in #440
- chore(deps): update dependencies by @Duologic in #488
New Contributors
- @digna-ionos made their first contribution in #440
- @Duologic made their first contribution in #488
Full Changelog: v1.7.0...v1.8.0
v1.7.0
- Upgraded
crossplane-runtimeand corecrossplanedependencies tov1.18.0, ensuring compatibility with the latest Crossplane ecosystem and taking advantage of recent improvements and bug fixes. - Because apimachinery version is bumped to
v0.31.0, pass context to panic handlers, introduced by kubernetes/kubernetes#121970. - Because kubernetes client is bumped to
v0.31.0, address deprecations introduced by kubernetes/kubernetes#124263. - Because controller-runtime is bumped to
v0.19.0, address breaking changes introduced by kubernetes-sigs/controller-runtime#2799.
What's Changed
Full Changelog: v1.6.0...v1.7.0