---
page_title: 'Plugin Development - Framework: Timeouts'
description: >-
  How to migrate timeouts from SDKv2 to the Framework.
---

# Timeouts

The Framework can be used in conjunction with the [terraform-plugin-framework-timeouts](https://github.com/hashicorp/terraform-plugin-framework-timeouts) module in order to allow defining timeouts in configuration and have them be available in `Read` functions.

## Specifying Timeouts in Configuration

Timeouts can be defined using either nested blocks or nested attributes.

If you are writing a new provider using [terraform-plugin-framework](https://github.com/hashicorp/terraform-plugin-framework)
then we recommend using nested attributes.

If you are migrating a provider from SDKv2 to the Framework and
you are already using timeouts you can either continue to use block syntax, or switch to using nested attributes.
However, switching to using nested attributes will require that practitioners that are using your provider update their
Terraform configuration.

#### Block

If your configuration is using a nested block to define timeouts, such as the following:

```hcl
resource "timeouts_example" "example" {
  /* ... */

  timeouts {
    read = "60m"
  }
}
```

Import the [timeouts module](https://github.com/hashicorp/terraform-plugin-framework-timeouts).

```go
import (
    /* ... */
    "github.com/hashicorp/terraform-plugin-framework-timeouts/datasource/timeouts"
)
````

You can use this module to mutate the `schema.Schema` as follows:

```go
func (d *ThingDataSource) Schema(ctx context.Context, req datasource.SchemaRequest, resp *datasource.SchemaResponse) {
    resp.Schema = schema.Schema{
        /* ... */

        Blocks: map[string]schema.Block{
            "timeouts": timeouts.Block(ctx),
        },
```

#### Attribute

If your configuration is using nested attributes to define timeouts, such as the following:

```hcl
resource "timeouts_example" "example" {
  /* ... */

  timeouts = {
    read = "60m"
  }
}
```

You can use this module to mutate the `schema.Schema` as follows:

```go
func (d *ThingDataSource) Schema(ctx context.Context, req datasource.SchemaRequest, resp *datasource.SchemaResponse) {
    resp.Schema = schema.Schema{
        Attributes: map[string]schema.Attribute{
            /* ... */
            "timeouts": timeouts.Attributes(ctx),
        },
```

## Updating Models

Given a `Read` method which fetches the entire configuration:

```go
func (e *exampleDataSource) Read(ctx context.Context, req datasource.ReadRequest, resp *datasource.ReadResponse) {
	var data exampleDataSourceData

	diags := req.Config.Get(ctx, &data)
	resp.Diagnostics.Append(diags...)
```

Modify the `exampleDataSourceData` model to include a field for timeouts using a [`timeouts.Value`](https://pkg.go.dev/github.com/hashicorp/terraform-plugin-framework-timeouts/datasource/timeouts#Value) type.

```go
type exampleDataSourceData struct {
    /* ... */
	Timeouts    timeouts.Value `tfsdk:"timeouts"`
```

## Accessing Timeout in Read Method

Call the [`timeouts.Read()` function](https://pkg.go.dev/github.com/hashicorp/terraform-plugin-framework-timeouts/datasource/timeouts#Value.Read).

```go
func (e *exampleDataSource) Read(ctx context.Context, req datasource.ReadRequest, resp *datasource.ReadResponse) {
    var data exampleDataSourceData

    diags := req.Config.Get(ctx, &data)
    resp.Diagnostics.Append(diags...)
    if resp.Diagnostics.HasError() {
        return
    }

    readTimeout, diags := data.Timeouts.Read(ctx, 20*time.Minute)

    resp.Diagnostics.Append(diags...)

    if resp.Diagnostics.HasError() {
        return
    }

    ctx, cancel := context.WithTimeout(ctx, readTimeout)
    defer cancel()

    /* ... */
}
```
