@@ -10,6 +10,7 @@ import (
1010 "github.com/cloudflare/tf-migrate/internal"
1111 "github.com/cloudflare/tf-migrate/internal/transform"
1212 tfhcl "github.com/cloudflare/tf-migrate/internal/transform/hcl"
13+ "github.com/cloudflare/tf-migrate/internal/transform/state"
1314)
1415
1516// V4ToV5Migrator handles migration of load balancer resources from v4 to v5
@@ -146,6 +147,7 @@ func (m *V4ToV5Migrator) TransformState(ctx *transform.Context, stateJSON gjson.
146147 // v4: session_affinity_attributes as array → v5: as object
147148
148149 result := stateJSON .String ()
150+ attrs := stateJSON .Get ("attributes" )
149151
150152 // Use regex to rename attributes in JSON
151153 // Replace "default_pool_ids" with "default_pools"
@@ -154,35 +156,14 @@ func (m *V4ToV5Migrator) TransformState(ctx *transform.Context, stateJSON gjson.
154156 // Replace "fallback_pool_id" with "fallback_pool"
155157 result = strings .Replace (result , `"fallback_pool_id"` , `"fallback_pool"` , - 1 )
156158
157- // Transform session_affinity_attributes from array to object
158- // v4: "session_affinity_attributes": [{ ... }] or []
159- // v5: "session_affinity_attributes": { ... } or null
160- sessionAffinityAttrs := stateJSON .Get ("attributes.session_affinity_attributes" )
161- if sessionAffinityAttrs .Exists () && sessionAffinityAttrs .IsArray () {
162- if len (sessionAffinityAttrs .Array ()) > 0 {
163- firstElement := sessionAffinityAttrs .Array ()[0 ]
164- result , _ = sjson .Set (result , "attributes.session_affinity_attributes" , firstElement .Value ())
165- } else {
166- // Empty array -> null
167- result , _ = sjson .Set (result , "attributes.session_affinity_attributes" , nil )
168- }
169- }
170-
171159 // Transform single-object fields from arrays to objects or null
172160 // v4: field: [{ ... }] or []
173161 // v5: field: { ... } or null
174- singleObjectFields := []string {"adaptive_routing" , "location_strategy" , "random_steering" }
162+ singleObjectFields := []string {"session_affinity_attributes" , " adaptive_routing" , "location_strategy" , "random_steering" }
175163 for _ , field := range singleObjectFields {
176- fieldData := stateJSON .Get ("attributes." + field )
177- if fieldData .Exists () && fieldData .IsArray () {
178- if len (fieldData .Array ()) > 0 {
179- firstElement := fieldData .Array ()[0 ]
180- result , _ = sjson .Set (result , "attributes." + field , firstElement .Value ())
181- } else {
182- // Empty array -> null
183- result , _ = sjson .Set (result , "attributes." + field , nil )
184- }
185- }
164+ result = state .TransformFieldArrayToObject (result , "attributes" , attrs , field , state.ArrayToObjectOptions {
165+ TransformEmptyToNull : true ,
166+ })
186167 }
187168
188169 // Transform empty arrays to null for map fields that v5 expects as null or maps
@@ -204,7 +185,7 @@ func (m *V4ToV5Migrator) TransformState(ctx *transform.Context, stateJSON gjson.
204185 }
205186
206187 // Reset schema_version to 0 for v5 (v4 uses schema_version 1)
207- result , _ = sjson . Set (result , "schema_version" , 0 )
188+ result = state . SetSchemaVersion (result , 0 )
208189
209190 return result , nil
210191}
0 commit comments