@@ -50,23 +50,40 @@ func (m *V4ToV5Migrator) TransformConfig(ctx *transform.Context, block *hclwrite
5050 body := block .Body ()
5151
5252 blocks := make ([]* hclwrite.Block , 0 )
53- removeOriginal := false
5453
55- // rename cache_type to value
54+ // rename cache_type to value in the original block
5655 tfhcl .RenameAttribute (body , "cache_type" , "value" )
5756
5857 resourceName := tfhcl .GetResourceName (block )
59- value := tfhcl .ExtractStringFromAttribute (body .GetAttribute ("value" ))
58+ valueAttr := body .GetAttribute ("value" )
59+
60+ // Try to get the actual value
61+ var value string
62+ if tfhcl .IsExpressionAttribute (valueAttr ) {
63+ // It's a variable reference - look up the actual value in state
64+ value = state .GetResourceAttribute (ctx .StateJSON , "cloudflare_tiered_cache" , resourceName , "cache_type" )
65+ } else {
66+ // It's a literal value
67+ value = tfhcl .ExtractStringFromAttribute (valueAttr )
68+ }
69+
6070 if value == "smart" {
61- // cache_type="smart" → value="on"
71+ // cache_type="smart" → value="on" for both resources
72+ // Create tiered_cache resource with value="on"
6273 tfhcl .SetAttribute (body , "value" , "on" )
63- blocks = append (blocks , block )
64- } else if value == "off" {
65- // cache_type="off" → value="off"
66- tfhcl .SetAttribute (body , "value" , "off" )
67- blocks = append (blocks , block )
68- } else if value == "generic" {
69- newBlock := tfhcl .CreateDerivedBlock (
74+ tieredCacheBlock := tfhcl .CreateDerivedBlock (
75+ block ,
76+ "cloudflare_tiered_cache" ,
77+ resourceName ,
78+ tfhcl.AttributeTransform {
79+ Copy : []string {"zone_id" , "value" },
80+ CopyMetaArguments : true ,
81+ },
82+ )
83+ blocks = append (blocks , tieredCacheBlock )
84+
85+ // Create argo_tiered_caching resource with value="on"
86+ argoBlock := tfhcl .CreateDerivedBlock (
7087 block ,
7188 "cloudflare_argo_tiered_caching" ,
7289 resourceName ,
@@ -76,21 +93,78 @@ func (m *V4ToV5Migrator) TransformConfig(ctx *transform.Context, block *hclwrite
7693 CopyMetaArguments : true ,
7794 },
7895 )
96+ blocks = append (blocks , argoBlock )
97+ } else if value == "off" {
98+ // cache_type="off" → value="off" for both resources
99+ // Create tiered_cache resource with value="off"
100+ tfhcl .SetAttribute (body , "value" , "off" )
101+ tieredCacheBlock := tfhcl .CreateDerivedBlock (
102+ block ,
103+ "cloudflare_tiered_cache" ,
104+ resourceName ,
105+ tfhcl.AttributeTransform {
106+ Copy : []string {"zone_id" , "value" },
107+ CopyMetaArguments : true ,
108+ },
109+ )
110+ blocks = append (blocks , tieredCacheBlock )
79111
80- movedBlock := tfhcl .CreateMovedBlock (
81- "cloudflare_tiered_cache." + resourceName ,
82- "cloudflare_argo_tiered_caching." + resourceName ,
112+ // Create argo_tiered_caching resource with value="off"
113+ argoBlock := tfhcl .CreateDerivedBlock (
114+ block ,
115+ "cloudflare_argo_tiered_caching" ,
116+ resourceName ,
117+ tfhcl.AttributeTransform {
118+ Copy : []string {"zone_id" },
119+ Set : map [string ]interface {}{"value" : "off" },
120+ CopyMetaArguments : true ,
121+ },
122+ )
123+ blocks = append (blocks , argoBlock )
124+ } else if value == "generic" {
125+ // cache_type="generic" → tiered_cache value="off", argo_tiered_caching value="on"
126+ // Create tiered_cache resource with value="off"
127+ tfhcl .SetAttribute (body , "value" , "off" )
128+ tieredCacheBlock := tfhcl .CreateDerivedBlock (
129+ block ,
130+ "cloudflare_tiered_cache" ,
131+ resourceName ,
132+ tfhcl.AttributeTransform {
133+ Copy : []string {"zone_id" , "value" },
134+ CopyMetaArguments : true ,
135+ },
83136 )
137+ blocks = append (blocks , tieredCacheBlock )
84138
85- blocks = append (blocks , newBlock , movedBlock )
86- removeOriginal = true
139+ // Create argo_tiered_caching resource with value="on"
140+ argoBlock := tfhcl .CreateDerivedBlock (
141+ block ,
142+ "cloudflare_argo_tiered_caching" ,
143+ resourceName ,
144+ tfhcl.AttributeTransform {
145+ Copy : []string {"zone_id" },
146+ Set : map [string ]interface {}{"value" : "on" },
147+ CopyMetaArguments : true ,
148+ },
149+ )
150+ blocks = append (blocks , argoBlock )
87151 } else {
88- blocks = append (blocks , block )
152+ // For variables or other expressions, just rename the attribute and copy as-is
153+ tieredCacheBlock := tfhcl .CreateDerivedBlock (
154+ block ,
155+ "cloudflare_tiered_cache" ,
156+ resourceName ,
157+ tfhcl.AttributeTransform {
158+ Copy : []string {"zone_id" , "value" },
159+ CopyMetaArguments : true ,
160+ },
161+ )
162+ blocks = append (blocks , tieredCacheBlock )
89163 }
90164
91165 return & transform.TransformResult {
92166 Blocks : blocks ,
93- RemoveOriginal : removeOriginal ,
167+ RemoveOriginal : true ,
94168 }, nil
95169}
96170
@@ -119,35 +193,28 @@ func (m *V4ToV5Migrator) TransformState(ctx *transform.Context, stateJSON gjson.
119193
120194 cacheTypeValue := cacheTypeField .String ()
121195
122- // Determine target resource type based on cache_type value
123- var targetType string
124-
125196 // Transform based on cache_type value
197+ // All resources stay as cloudflare_tiered_cache in the state
198+ // The argo_tiered_caching resources in the config are new and will be created on next apply
126199 if cacheTypeValue == "generic" {
127- // Transform to argo_tiered_caching
128- targetType = "cloudflare_argo_tiered_caching"
200+ // For generic, the tiered_cache resource gets value="off"
129201 result , _ = sjson .Delete (result , "attributes.cache_type" )
130- result , _ = sjson .Set (result , "attributes.value" , "on " )
202+ result , _ = sjson .Set (result , "attributes.value" , "off " )
131203 } else if cacheTypeValue == "smart" {
132- // Keep as tiered_cache, transform smart → on
133- targetType = "cloudflare_tiered_cache"
204+ // For smart, the tiered_cache resource gets value="on"
134205 result , _ = sjson .Delete (result , "attributes.cache_type" )
135206 result , _ = sjson .Set (result , "attributes.value" , "on" )
136207 } else if cacheTypeValue == "off" {
137- // Keep as tiered_cache, cache_type → value (no value change)
138- targetType = "cloudflare_tiered_cache"
208+ // For off, the tiered_cache resource gets value="off"
139209 result , _ = sjson .Delete (result , "attributes.cache_type" )
140210 result , _ = sjson .Set (result , "attributes.value" , "off" )
141211 } else {
142212 // Unknown value (variables, expressions), just rename the field
143- targetType = "cloudflare_tiered_cache"
144213 result = state .RenameField (result , "attributes" , attrs , "cache_type" , "value" )
145214 }
146215
147216 // Set schema version to 0
148217 result , _ = sjson .Set (result , "schema_version" , 0 )
149218
150- transform .SetStateTypeRename (ctx , resourceName , "cloudflare_tiered_cache" , targetType )
151-
152219 return result , nil
153220}
0 commit comments