@@ -209,21 +209,32 @@ func (r *folderResource) Create(ctx context.Context, req resource.CreateRequest,
209
209
return
210
210
}
211
211
212
- folderResp , err := r .client .CreateFolder (ctx ).CreateFolderPayload (* payload ).Execute ()
212
+ folderCreateResp , err := r .client .CreateFolder (ctx ).CreateFolderPayload (* payload ).Execute ()
213
213
if err != nil {
214
214
core .LogAndAddError (ctx , & resp .Diagnostics , "Error creating folder" , fmt .Sprintf ("Calling API: %v" , err ))
215
215
return
216
216
}
217
217
218
- err = mapFolderCreateFields (ctx , folderResp , & model .Model , & resp .State )
219
- if err != nil {
220
- core .LogAndAddError (ctx , & resp .Diagnostics , "API response processing error" , err .Error ())
218
+ if folderCreateResp .ContainerId == nil || * folderCreateResp .ContainerId == "" {
219
+ core .LogAndAddError (ctx , & resp .Diagnostics , "Error creating folder" , "Container ID is missing" )
221
220
return
222
221
}
223
222
224
223
// This sleep is currently needed due to the IAM Cache.
225
224
time .Sleep (10 * time .Second )
226
225
226
+ folderGetResponse , err := r .client .GetFolderDetails (ctx , * folderCreateResp .ContainerId ).Execute ()
227
+ if err != nil {
228
+ core .LogAndAddError (ctx , & resp .Diagnostics , "Error creating folder" , fmt .Sprintf ("Calling API: %v" , err ))
229
+ return
230
+ }
231
+
232
+ err = mapFolderFields (ctx , folderGetResponse , & model .Model , & resp .State )
233
+ if err != nil {
234
+ core .LogAndAddError (ctx , & resp .Diagnostics , "API response processing error" , err .Error ())
235
+ return
236
+ }
237
+
227
238
resp .Diagnostics .Append (resp .State .Set (ctx , model )... )
228
239
tflog .Info (ctx , "Folder created" )
229
240
}
@@ -253,7 +264,7 @@ func (r *folderResource) Read(ctx context.Context, req resource.ReadRequest, res
253
264
return
254
265
}
255
266
256
- err = mapFolderDetailsFields (ctx , folderResp , & model .Model , & resp .State )
267
+ err = mapFolderFields (ctx , folderResp , & model .Model , & resp .State )
257
268
if err != nil {
258
269
core .LogAndAddError (ctx , & resp .Diagnostics , "Error reading folder" , fmt .Sprintf ("Processing API response: %v" , err ))
259
270
return
@@ -300,7 +311,7 @@ func (r *folderResource) Update(ctx context.Context, req resource.UpdateRequest,
300
311
return
301
312
}
302
313
303
- err = mapFolderDetailsFields (ctx , folderResp , & model .Model , & resp .State )
314
+ err = mapFolderFields (ctx , folderResp , & model .Model , & resp .State )
304
315
if err != nil {
305
316
core .LogAndAddError (ctx , & resp .Diagnostics , "Error updating folder" , fmt .Sprintf ("Processing API response: %v" , err ))
306
317
return
@@ -334,7 +345,7 @@ func (r *folderResource) Delete(ctx context.Context, req resource.DeleteRequest,
334
345
ctx ,
335
346
& resp .Diagnostics ,
336
347
"Error deleting folder. Deletion may fail because associated projects remain hidden for up to 7 days after user deletion due to technical requirements." ,
337
- fmt .Sprintf ("API call failed : %v" , err ),
348
+ fmt .Sprintf ("Calling API : %v" , err ),
338
349
)
339
350
return
340
351
}
@@ -363,22 +374,36 @@ func (r *folderResource) ImportState(ctx context.Context, req resource.ImportSta
363
374
// mapFolderFields maps folder fields from a response into the Terraform model and optionally updates state.
364
375
func mapFolderFields (
365
376
ctx context.Context ,
366
- containerId , name , folderId * string ,
367
- labels * map [string ]string , //nolint:gocritic
368
- containerParent * resourcemanager.Parent ,
369
- creationTime * time.Time ,
370
- updateTime * time.Time ,
377
+ folderGetResponse * resourcemanager.GetFolderDetailsResponse ,
371
378
model * Model ,
372
379
state * tfsdk.State ,
373
380
) error {
374
- if containerId == nil || * containerId == "" {
375
- return fmt .Errorf ("container id is present" )
381
+ if folderGetResponse == nil {
382
+ return fmt .Errorf ("folder get response is nil" )
383
+ }
384
+
385
+ var folderId string
386
+ if model .FolderId .ValueString () != "" {
387
+ folderId = model .FolderId .ValueString ()
388
+ } else if folderGetResponse .FolderId != nil {
389
+ folderId = * folderGetResponse .FolderId
390
+ } else {
391
+ return fmt .Errorf ("folder id not present" )
392
+ }
393
+
394
+ var containerId string
395
+ if model .ContainerId .ValueString () != "" {
396
+ containerId = model .ContainerId .ValueString ()
397
+ } else if folderGetResponse .ContainerId != nil {
398
+ containerId = * folderGetResponse .ContainerId
399
+ } else {
400
+ return fmt .Errorf ("container id not present" )
376
401
}
377
402
378
403
var err error
379
404
var tfLabels basetypes.MapValue
380
- if labels != nil && len (* labels ) > 0 {
381
- tfLabels , err = conversion .ToTerraformStringMap (ctx , * labels )
405
+ if folderGetResponse . Labels != nil && len (* folderGetResponse . Labels ) > 0 {
406
+ tfLabels , err = conversion .ToTerraformStringMap (ctx , * folderGetResponse . Labels )
382
407
if err != nil {
383
408
return fmt .Errorf ("converting to StringValue map: %w" , err )
384
409
}
@@ -387,26 +412,26 @@ func mapFolderFields(
387
412
}
388
413
389
414
var containerParentIdTF basetypes.StringValue
390
- if containerParent != nil {
415
+ if folderGetResponse . Parent != nil {
391
416
if _ , err := uuid .Parse (model .ContainerParentId .ValueString ()); err == nil {
392
417
// the provided containerParent is the UUID identifier
393
- containerParentIdTF = types .StringPointerValue (containerParent .Id )
418
+ containerParentIdTF = types .StringPointerValue (folderGetResponse . Parent .Id )
394
419
} else {
395
420
// the provided containerParent is the user-friendly container id
396
- containerParentIdTF = types .StringPointerValue (containerParent .ContainerId )
421
+ containerParentIdTF = types .StringPointerValue (folderGetResponse . Parent .ContainerId )
397
422
}
398
423
} else {
399
424
containerParentIdTF = types .StringNull ()
400
425
}
401
426
402
- model .Id = types .StringValue (* containerId )
403
- model .FolderId = types .StringValue (* folderId )
404
- model .ContainerId = types .StringValue (* containerId )
427
+ model .Id = types .StringValue (containerId )
428
+ model .FolderId = types .StringValue (folderId )
429
+ model .ContainerId = types .StringValue (containerId )
405
430
model .ContainerParentId = containerParentIdTF
406
- model .Name = types .StringPointerValue (name )
431
+ model .Name = types .StringPointerValue (folderGetResponse . Name )
407
432
model .Labels = tfLabels
408
- model .CreationTime = types .StringValue (creationTime .Format (time .RFC3339 ))
409
- model .UpdateTime = types .StringValue (updateTime .Format (time .RFC3339 ))
433
+ model .CreationTime = types .StringValue (folderGetResponse . CreationTime .Format (time .RFC3339 ))
434
+ model .UpdateTime = types .StringValue (folderGetResponse . UpdateTime .Format (time .RFC3339 ))
410
435
411
436
if state != nil {
412
437
diags := diag.Diagnostics {}
@@ -426,16 +451,6 @@ func mapFolderFields(
426
451
return nil
427
452
}
428
453
429
- // mapFolderCreateFields maps the Create Folder API response to the Terraform model and update the Terraform state
430
- func mapFolderCreateFields (ctx context.Context , resp * resourcemanager.FolderResponse , model * Model , state * tfsdk.State ) error {
431
- return mapFolderFields (ctx , resp .ContainerId , resp .Name , resp .FolderId , resp .Labels , resp .Parent , resp .CreationTime , resp .UpdateTime , model , state )
432
- }
433
-
434
- // mapFolderDetailsFields maps the GetDetails API response to the Terraform model and update the Terraform state
435
- func mapFolderDetailsFields (ctx context.Context , resp * resourcemanager.GetFolderDetailsResponse , model * Model , state * tfsdk.State ) error {
436
- return mapFolderFields (ctx , resp .ContainerId , resp .Name , resp .FolderId , resp .Labels , resp .Parent , resp .CreationTime , resp .UpdateTime , model , state )
437
- }
438
-
439
454
func toMembersPayload (model * ResourceModel ) (* []resourcemanager.Member , error ) {
440
455
if model == nil {
441
456
return nil , fmt .Errorf ("nil model" )
0 commit comments