Skip to content

Commit 82a4ad9

Browse files
committed
Add support for configuring Terraform resource timeouts both from the schema and config.Resource.OperationTimeouts
- The timeouts specified in upjet resource configuration (config.Resource.OperationTimeouts) prevails any defaults configured in the Terraform schema. Signed-off-by: Alper Rifat Ulucinar <ulucinar@users.noreply.github.com>
1 parent 229c273 commit 82a4ad9

File tree

1 file changed

+44
-1
lines changed

1 file changed

+44
-1
lines changed

pkg/controller/external_nofork.go

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -339,8 +339,44 @@ func filterInitExclusiveDiffs(tr resource.Terraformed, instanceDiff *tf.Instance
339339
return nil
340340
}
341341

342+
// resource timeouts configuration
343+
func getTimeoutParameters(config *config.Resource) map[string]any {
344+
timeouts := make(map[string]any)
345+
// first use the timeout overrides specified in
346+
// the Terraform resource schema
347+
if config.TerraformResource.Timeouts != nil {
348+
if config.TerraformResource.Timeouts.Create != nil && *config.TerraformResource.Timeouts.Create != 0 {
349+
timeouts[schema.TimeoutCreate] = config.TerraformResource.Timeouts.Create.Nanoseconds()
350+
}
351+
if config.TerraformResource.Timeouts.Update != nil && *config.TerraformResource.Timeouts.Update != 0 {
352+
timeouts[schema.TimeoutUpdate] = config.TerraformResource.Timeouts.Update.Nanoseconds()
353+
}
354+
if config.TerraformResource.Timeouts.Delete != nil && *config.TerraformResource.Timeouts.Delete != 0 {
355+
timeouts[schema.TimeoutDelete] = config.TerraformResource.Timeouts.Delete.Nanoseconds()
356+
}
357+
if config.TerraformResource.Timeouts.Read != nil && *config.TerraformResource.Timeouts.Read != 0 {
358+
timeouts[schema.TimeoutRead] = config.TerraformResource.Timeouts.Read.Nanoseconds()
359+
}
360+
}
361+
// then, override any Terraform defaults using any upjet
362+
// resource configuration overrides
363+
if config.OperationTimeouts.Create != 0 {
364+
timeouts[schema.TimeoutCreate] = config.OperationTimeouts.Create.Nanoseconds()
365+
}
366+
if config.OperationTimeouts.Update != 0 {
367+
timeouts[schema.TimeoutUpdate] = config.OperationTimeouts.Update.Nanoseconds()
368+
}
369+
if config.OperationTimeouts.Delete != 0 {
370+
timeouts[schema.TimeoutDelete] = config.OperationTimeouts.Delete.Nanoseconds()
371+
}
372+
if config.OperationTimeouts.Read != 0 {
373+
timeouts[schema.TimeoutRead] = config.OperationTimeouts.Read.Nanoseconds()
374+
}
375+
return timeouts
376+
}
377+
342378
func (n *noForkExternal) getResourceDataDiff(tr resource.Terraformed, ctx context.Context, s *tf.InstanceState, resourceExists bool) (*tf.InstanceDiff, error) {
343-
resourceConfig := tf.NewResourceConfigRaw(n.params)
379+
resourceConfig := tf.NewResourceConfigRaw(n.params)
344380
instanceDiff, err := schema.InternalMap(n.resourceSchema.Schema).Diff(ctx, s, resourceConfig, nil, n.ts.Meta, false)
345381
if err != nil {
346382
return nil, errors.Wrap(err, "failed to get *terraform.InstanceDiff")
@@ -371,6 +407,13 @@ func (n *noForkExternal) getResourceDataDiff(tr resource.Terraformed, ctx contex
371407
// Setting instanceDiff.RawConfig has no effect on diff application.
372408
instanceDiff.RawConfig = n.rawConfig
373409
}
410+
timeouts := getTimeoutParameters(n.config)
411+
if instanceDiff.Meta == nil && len(timeouts) > 0 {
412+
instanceDiff.Meta = make(map[string]interface{})
413+
}
414+
if len(timeouts) > 0 {
415+
instanceDiff.Meta[schema.TimeoutKey] = timeouts
416+
}
374417
return instanceDiff, nil
375418
}
376419

0 commit comments

Comments
 (0)