@@ -7,6 +7,8 @@ package controller
7
7
import (
8
8
"context"
9
9
"fmt"
10
+ "slices"
11
+ "sort"
10
12
"strings"
11
13
"time"
12
14
@@ -122,6 +124,47 @@ type terraformPluginSDKExternal struct {
122
124
opTracker * AsyncTracker
123
125
}
124
126
127
+ func convert (params map [string ]any , paths []string , toList bool ) (map [string ]any , error ) {
128
+ pv := fieldpath .Pave (params )
129
+
130
+ if toList {
131
+ slices .Sort (paths )
132
+ } else {
133
+ sort .Slice (paths , func (i , j int ) bool {
134
+ return paths [i ] > paths [j ]
135
+ })
136
+ }
137
+
138
+ for _ , fp := range paths {
139
+ exp , err := pv .ExpandWildcards (fp )
140
+ if err != nil {
141
+ return nil , errors .Wrapf (err , "cannot expand wildcards for the field path expression %s" , fp )
142
+ }
143
+ switch len (exp ) {
144
+ case 0 :
145
+ return params , nil
146
+ case 1 :
147
+ v , err := pv .GetValue (exp [0 ])
148
+ if err != nil {
149
+ return nil , errors .Wrapf (err , "cannot get the value at the field path %s with the list mode set to %t" , exp [0 ], toList )
150
+ }
151
+ switch {
152
+ case toList :
153
+ if err := pv .SetValue (exp [0 ], []any {v }); err != nil {
154
+ return nil , errors .Wrapf (err , "cannot set the singleton list's value at the field path %s" , exp [0 ])
155
+ }
156
+ default :
157
+ if err := pv .SetValue (exp [0 ], v .([]any )[0 ]); err != nil {
158
+ return nil , errors .Wrapf (err , "cannot set the embedded object's value at the field path %s" , exp [0 ])
159
+ }
160
+ }
161
+ default :
162
+ return nil , errors .Errorf ("unexpected number of expansions (%d) for the wildcard field path expression %s" , len (exp ), fp )
163
+ }
164
+ }
165
+ return params , nil
166
+ }
167
+
125
168
func getExtendedParameters (ctx context.Context , tr resource.Terraformed , externalName string , config * config.Resource , ts terraform.Setup , initParamsMerged bool , kube client.Client ) (map [string ]any , error ) {
126
169
params , err := tr .GetMergedParameters (initParamsMerged )
127
170
if err != nil {
@@ -155,7 +198,7 @@ func getExtendedParameters(ctx context.Context, tr resource.Terraformed, externa
155
198
params ["tags_all" ] = params ["tags" ]
156
199
}
157
200
}
158
- return params , nil
201
+ return convert ( params , config . CRDListConversionPaths (), true )
159
202
}
160
203
161
204
func (c * TerraformPluginSDKConnector ) processParamsWithHCLParser (schemaMap map [string ]* schema.Schema , params map [string ]any ) map [string ]any {
@@ -255,6 +298,10 @@ func (c *TerraformPluginSDKConnector) Connect(ctx context.Context, mg xpresource
255
298
if err != nil {
256
299
return nil , errors .Wrap (err , "failed to get the observation" )
257
300
}
301
+ tfState , err = convert (tfState , c .config .CRDListConversionPaths (), true )
302
+ if err != nil {
303
+ return nil , err
304
+ }
258
305
copyParams := len (tfState ) == 0
259
306
if err = resource .GetSensitiveParameters (ctx , & APISecretClient {kube : c .kube }, tr , tfState , tr .GetConnectionDetailsMapping ()); err != nil {
260
307
return nil , errors .Wrap (err , "cannot store sensitive parameters into tfState" )
@@ -511,6 +558,10 @@ func (n *terraformPluginSDKExternal) Observe(ctx context.Context, mg xpresource.
511
558
}
512
559
mg .SetConditions (xpv1 .Available ())
513
560
561
+ stateValueMap , err = convert (stateValueMap , n .config .TFListConversionPaths (), false )
562
+ if err != nil {
563
+ return managed.ExternalObservation {}, err
564
+ }
514
565
buff , err := json .TFParser .Marshal (stateValueMap )
515
566
if err != nil {
516
567
return managed.ExternalObservation {}, errors .Wrap (err , "cannot marshal the attributes of the new state for late-initialization" )
@@ -623,6 +674,10 @@ func (n *terraformPluginSDKExternal) Create(ctx context.Context, mg xpresource.M
623
674
if _ , err := n .setExternalName (mg , stateValueMap ); err != nil {
624
675
return managed.ExternalCreation {}, errors .Wrap (err , "failed to set the external-name of the managed resource during create" )
625
676
}
677
+ stateValueMap , err = convert (stateValueMap , n .config .CRDListConversionPaths (), false )
678
+ if err != nil {
679
+ return managed.ExternalCreation {}, err
680
+ }
626
681
err = mg .(resource.Terraformed ).SetObservation (stateValueMap )
627
682
if err != nil {
628
683
return managed.ExternalCreation {}, errors .Errorf ("could not set observation: %v" , err )
0 commit comments