internal/services/migration/azapi_resource_migration_v0_to_v2.go (193 lines of code) (raw):
package migration
import (
"context"
"github.com/Azure/terraform-provider-azapi/internal/retry"
"github.com/hashicorp/terraform-plugin-framework-timeouts/resource/timeouts"
"github.com/hashicorp/terraform-plugin-framework/resource"
"github.com/hashicorp/terraform-plugin-framework/resource/schema"
"github.com/hashicorp/terraform-plugin-framework/types"
)
func AzapiResourceMigrationV0ToV2(ctx context.Context) resource.StateUpgrader {
return resource.StateUpgrader{
PriorSchema: &schema.Schema{
Attributes: map[string]schema.Attribute{
"id": schema.StringAttribute{
Computed: true,
},
"name": schema.StringAttribute{
Optional: true,
Computed: true,
},
"removing_special_chars": schema.BoolAttribute{
Optional: true,
Computed: true,
},
"parent_id": schema.StringAttribute{
Optional: true,
Computed: true,
},
"type": schema.StringAttribute{
Required: true,
},
"location": schema.StringAttribute{
Optional: true,
Computed: true,
},
"body": schema.StringAttribute{
Optional: true,
},
"ignore_body_changes": schema.ListAttribute{
ElementType: types.StringType,
Optional: true,
},
"ignore_casing": schema.BoolAttribute{
Optional: true,
Computed: true,
},
"ignore_missing_property": schema.BoolAttribute{
Optional: true,
Computed: true,
},
"response_export_values": schema.ListAttribute{
ElementType: types.StringType,
Optional: true,
},
"locks": schema.ListAttribute{
ElementType: types.StringType,
Optional: true,
},
"schema_validation_enabled": schema.BoolAttribute{
Optional: true,
Computed: true,
},
"output": schema.StringAttribute{
Computed: true,
},
"tags": schema.MapAttribute{
ElementType: types.StringType,
Optional: true,
Computed: true,
},
},
Blocks: map[string]schema.Block{
"identity": schema.ListNestedBlock{
NestedObject: schema.NestedBlockObject{
Attributes: map[string]schema.Attribute{
"type": schema.StringAttribute{
Required: true,
},
"identity_ids": schema.ListAttribute{
ElementType: types.StringType,
Optional: true,
},
"principal_id": schema.StringAttribute{
Computed: true,
},
"tenant_id": schema.StringAttribute{
Computed: true,
},
},
},
},
"timeouts": timeouts.Block(ctx, timeouts.Opts{
Create: true,
Update: true,
Read: true,
Delete: true,
}),
},
Version: 0,
},
StateUpgrader: func(ctx context.Context, request resource.UpgradeStateRequest, response *resource.UpgradeStateResponse) {
type OldModel struct {
ID types.String `tfsdk:"id"`
Name types.String `tfsdk:"name"`
ParentID types.String `tfsdk:"parent_id"`
Type types.String `tfsdk:"type"`
Location types.String `tfsdk:"location"`
Identity types.List `tfsdk:"identity"`
Body types.String `tfsdk:"body"`
Locks types.List `tfsdk:"locks"`
RemovingSpecialChars types.Bool `tfsdk:"removing_special_chars"`
SchemaValidationEnabled types.Bool `tfsdk:"schema_validation_enabled"`
IgnoreBodyChanges types.List `tfsdk:"ignore_body_changes"`
IgnoreCasing types.Bool `tfsdk:"ignore_casing"`
IgnoreMissingProperty types.Bool `tfsdk:"ignore_missing_property"`
ResponseExportValues types.List `tfsdk:"response_export_values"`
Output types.String `tfsdk:"output"`
Tags types.Map `tfsdk:"tags"`
Timeouts timeouts.Value `tfsdk:"timeouts"`
}
type newModel struct {
ID types.String `tfsdk:"id"`
Name types.String `tfsdk:"name"`
ParentID types.String `tfsdk:"parent_id"`
Type types.String `tfsdk:"type"`
Location types.String `tfsdk:"location"`
Identity types.List `tfsdk:"identity"`
Body types.Dynamic `tfsdk:"body"`
SensitiveBody types.Dynamic `tfsdk:"sensitive_body"`
Locks types.List `tfsdk:"locks"`
SchemaValidationEnabled types.Bool `tfsdk:"schema_validation_enabled"`
IgnoreCasing types.Bool `tfsdk:"ignore_casing"`
IgnoreMissingProperty types.Bool `tfsdk:"ignore_missing_property"`
ReplaceTriggersExternalValues types.Dynamic `tfsdk:"replace_triggers_external_values"`
ReplaceTriggersRefs types.List `tfsdk:"replace_triggers_refs"`
ResponseExportValues types.Dynamic `tfsdk:"response_export_values"`
Retry retry.RetryValue `tfsdk:"retry"`
Output types.Dynamic `tfsdk:"output"`
Tags types.Map `tfsdk:"tags"`
Timeouts timeouts.Value `tfsdk:"timeouts"`
CreateHeaders map[string]string `tfsdk:"create_headers"`
CreateQueryParameters map[string][]string `tfsdk:"create_query_parameters"`
UpdateHeaders map[string]string `tfsdk:"update_headers"`
UpdateQueryParameters map[string][]string `tfsdk:"update_query_parameters"`
DeleteHeaders map[string]string `tfsdk:"delete_headers"`
DeleteQueryParameters map[string][]string `tfsdk:"delete_query_parameters"`
ReadHeaders map[string]string `tfsdk:"read_headers"`
ReadQueryParameters map[string][]string `tfsdk:"read_query_parameters"`
}
var oldState OldModel
if response.Diagnostics.Append(request.State.Get(ctx, &oldState)...); response.Diagnostics.HasError() {
return
}
oldBody := types.DynamicValue(types.StringValue(oldState.Body.ValueString()))
bodyVal, err := migrateToDynamicValue(oldBody)
if err != nil {
response.Diagnostics.AddError("failed to migrate body to dynamic value", err.Error())
return
}
oldOutput := types.DynamicValue(types.StringValue(oldState.Output.ValueString()))
outputVal, err := migrateToDynamicValue(oldOutput)
if err != nil {
response.Diagnostics.AddError("failed to migrate output to dynamic value", err.Error())
return
}
responseExportValues := types.DynamicNull()
if !oldState.ResponseExportValues.IsNull() {
responseExportValues = types.DynamicValue(oldState.ResponseExportValues)
}
newState := newModel{
ID: oldState.ID,
Name: oldState.Name,
ParentID: oldState.ParentID,
Type: oldState.Type,
Location: oldState.Location,
Identity: oldState.Identity,
Body: bodyVal,
Locks: oldState.Locks,
SchemaValidationEnabled: oldState.SchemaValidationEnabled,
IgnoreCasing: oldState.IgnoreCasing,
IgnoreMissingProperty: oldState.IgnoreMissingProperty,
ReplaceTriggersExternalValues: types.DynamicNull(),
ReplaceTriggersRefs: types.ListNull(types.StringType),
ResponseExportValues: responseExportValues,
Retry: retry.NewRetryValueNull(),
Output: outputVal,
Tags: oldState.Tags,
Timeouts: oldState.Timeouts,
}
response.Diagnostics.Append(response.State.Set(ctx, newState)...)
},
}
}