---
page_title: 'Computed Blocks: Migrating from SDKv2 to the Framework'
description: >-
  Migrate blocks with computed fields from SDKv2 to attribute validators in the plugin Framework.
---

# Blocks with Computed Fields

Some providers, resources, and data sources include repeatable nested blocks in their attributes. Some blocks contain
fields  with `Computed: true`, which means that the provider code can define the value or that it could come from the
output of terraform apply (e.g., the ID of an EC2 instance).

This page explains how to migrate computed-only blocks from SDKv2 to the Framework. Refer to
[Blocks](/terraform/plugin/framework/migrating/attributes-blocks/blocks) if you are looking for information about migrating blocks
that are practitioner configurable.

## SDKv2

In SDKv2, blocks are defined by an attribute whose type is either `TypeList` or `TypeSet`, and whose `Elem` field is set to a
`schema.Resource` that contains a map of the block's attribute names to corresponding `schemaSchema` structs.

```go
map[string]*schema.Schema{
    "example": {
        Type:     schema.TypeList,
        Computed: true,
        Elem: &schema.Resource{
            Schema: map[string]*schema.Schema{
                "nested_example": {
                        Type:        schema.TypeString,
                        Computed:    true,
                        /* ... */
```

## Framework

In the Framework, when working with protocol version 5, computed blocks are implemented using a `ListAttribute` which has an `ElementType` of `types.ObjectType`.

```go
map[string]schema.Attribute{
"example": schema.ListAttribute{
    Computed: true,
	ElementType: types.ObjectType{
		AttrTypes: map[string]attr.Type{
			"nested_example":  types.StringType,
			/* ... */

```

In the Framework, when working with protocol version 6, we recommend that you define computed blocks using nested
attributes. This example shows usage of `ListNestedAttribute` as this provides configuration references with list index
syntax as is the case when using `schema.TypeList` in SDKv2. `SingleNestedAttribute` is a good choice for single
underlying objects which results in a breaking change but also allows dropping `[0]` in configuration references.

```go
map[string]schema.Attribute{
"example": schema.ListNestedAttribute{
	Computed: true,
	NestedObject: schema.NestedAttributeObject{
		Attributes: map[string]schema.Attribute{
			"nested_example": schema.StringAttribute{
				Computed: true,
				/* ... */

```

## Migration Notes

- When using protocol version 5 specify `ElementType` as `types.ObjectType` when migrating blocks that are computed from SDKv2 to Framework.
- When using protocol version 6, use [nested attributes](/terraform/plugin/framework/schemas#attributes-1) when migrating blocks that are computed from SDKv2 to Framework.

## Example

### SDKv2

The following example shows the implementation of the `example_nested_block` with SDKv2.

```go
Schema: map[string]*schema.Schema{
"example_nested_block": {
        Type:     schema.TypeList,
        Computed: true,
        Elem: &schema.Resource{
            Schema: map[string]*schema.Schema{
                "example_block_attribute": {
                    Type:        schema.TypeString,
                    Computed:    true,
                    /* ... */
                },
```

### Framework

The following shows the same section of provider code after the migration.

This code defines the `example_nested_block` block as an attribute on the schema, where the
`types.ObjectType` is being used to define the nested block.

```go
map[string]schema.Attribute{
    "example_nested_block": schema.ListAttribute{
        ElementType: types.ObjectType{
            AttrTypes: map[string]attr.Type{
                "example_block_attribute":  types.StringType,
            },
        },
        Computed:            true,
        /* ... */
```
