When serving multiple versions, Upjet uses a Hub-and-Spoke model. All conversions must pass through a central 'Hub' version. You cannot convert directly between two 'Spoke' versions.
Pattern: v1alpha1 $\leftrightarrow$ v1beta1 (hub) $\leftrightarrow$ v1alpha2
API-Level Converters
Use the Conversions field to register functions that handle field renames or structural changes between specific versions.
Terraform-Level Converters
Use TerraformConversions to handle changes that occur at the Terraform provider level between different provider versions.
func Configure(p *config.Provider) {
p.AddResourceConfigurator("azurerm_example_resource", func(r *config.Resource) {
r.Version = "v1beta1"
r.PreviousVersions = []string{"v1alpha1"}
// Register conversion functions
r.Conversions = []config.Conversion{
{
// Convert from v1alpha1 to v1beta1
FromVersion: "v1alpha1",
ToVersion: "v1beta1",
ConvertFn: convertV1Alpha1ToV1Beta1,
},
{
// Convert from v1beta1 to v1alpha1
FromVersion: "v1beta1",
ToVersion: "v1alpha1",
ConvertFn: convertV1Beta1ToV1Alpha1,
},
}
})
}
func convertV1Alpha1ToV1Beta1(src, dst interface{}) error {
// Implement conversion logic
// Example: rename fields, restructure data
return nil
}
func convertV1Beta1ToV1Alpha1(src, dst interface{}) error {
// Implement reverse conversion logic
return nil
}