---
page_title: 'Plugin Development - Framework: RPCs'
description: >-
  Relationship between RPCs and framework functionality.
---

# RPCs and Framework Functionality

The correlation between the Terraform command, the RPCs that are issued and the Terraform plugin framework methods that are called is as follows:

## _terraform validate_

| Protocol RPCs                                                                                                                                                                 | Framework Functionality                                                                                                                                            |
|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [GetProviderSchema](#getproviderschema-rpc)                                                                                                                                   | `provider.Provider`, `resource.Resource`, and `datasource.DataSource` interface `Schema` method                                                                    |
| [ValidateProviderConfig](#validateproviderconfig-rpc) / [ValidateResourceConfig](#validateresourceconfig-rpc) / [ValidateDataResourceConfig](#validatedataresourceconfig-rpc) | `provider.Provider`, `resource.Resource`, and `datasource.DataSource` interface `Schema` method validators, `ConfigValidators` method, and `ValidateConfig` method |

## _terraform plan_

| Protocol RPCs                                                                                                                                                                 | Framework Functionality                                                                                                                                            |
|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [GetProviderSchema](#getproviderschema-rpc)                                                                                                                                   | `provider.Provider`, `resource.Resource`, and `datasource.DataSource` interface `Schema` method                                                                    |
| [ValidateProviderConfig](#validateproviderconfig-rpc) / [ValidateResourceConfig](#validateresourceconfig-rpc) / [ValidateDataResourceConfig](#validatedataresourceconfig-rpc) | `provider.Provider`, `resource.Resource`, and `datasource.DataSource` interface `Schema` method validators, `ConfigValidators` method, and `ValidateConfig` method |
| [ConfigureProvider](#configureprovider-rpc)                                                                                                                                   | `provider.Provider` interface `Configure` method                                                                                                                   |
| [ReadResource](#readresource-rpc) / [ReadDataSource](#readdatasource-rpc)                                                                                                     | `resource.Resource` and `datasource.DataSource` interface `Read` method                                                                                            |
| [PlanResourceChange](#planresourcechange-rpc)                                                                                                                                 | `resource.Resource` interface `Schema` method plan modifiers and `ModifyPlan` method                                                                               |

## _terraform apply_

| Protocol RPCs                                                                                                                                                                 | Framework Functionality                                                                                                                                            |
|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [GetProviderSchema](#getproviderschema-rpc)                                                                                                                                   | `provider.Provider`, `resource.Resource`, and `datasource.DataSource` interface `Schema` method                                                                    |
| [ValidateProviderConfig](#validateproviderconfig-rpc) / [ValidateResourceConfig](#validateresourceconfig-rpc) / [ValidateDataResourceConfig](#validatedataresourceconfig-rpc) | `provider.Provider`, `resource.Resource`, and `datasource.DataSource` interface `Schema` method validators, `ConfigValidators` method, and `ValidateConfig` method |
| [ConfigureProvider](#configureprovider-rpc)                                                                                                                                   | `provider.Provider` interface `Configure` method                                                                                                                   |
| [ReadResource](#readresource-rpc) / [ReadDataSource](#readdatasource-rpc)                                                                                                     | `resource.Resource` and `datasource.DataSource` interface `Read` method                                                                                            |
| [PlanResourceChange](#planresourcechange-rpc)                                                                                                                                 | `resource.Resource` interface `Schema` method plan modifiers and `ModifyPlan` method                                                                               |
| [ApplyResourceChange](#applyresourcechange-rpc)                                                                                                                               | `resource.Resource` interface `Create`, `Update`, or `Delete` method                                                                                               |


## GetProviderSchema RPC

### Summary

![diagram: GetProviderSchema RPC Overview](/img/get-provider-schema-overview.png)
<!-- Refer to README in /img directory for information on generating get-provider-schema-overview.png -->

When _terraform validate | plan | apply_ are executed Terraform core issues the `GetProviderSchema` RPC. The RPC flows through the Terraform plugin framework and ultimately calls the `Schema` function on the provider and on each of the resources and data sources that the provider defines.

### Detail

![diagram: GetProviderSchema RPC Detail](/img/get-provider-schema-detail.png)
<!-- Refer to README in /img directory for information on generating get-provider-schema-detail.png -->

Within the Terraform plugin framework, `terraform-plugin-go` is used to expose gRPC endpoints defined by the Terraform plugin protocol. These endpoints implement the `tfplugin6.ProviderServer` interface for version 6 of the Terraform plugin protocol. The `terraform-plugin-go` module also defines a `tfprotov6.ProviderServer` interface which is implemented by the `terraform-plugin-framework` module, and includes the `GetProviderSchema` function.

The `terraform-plugin-framework` module implements the `tfprotov6.ProviderServer` interface `GetProviderSchema` function from the `terraform-plugin-go` module in `proto6server.GetProviderSchema`. The `proto6server.GetProviderSchema` function calls `fwserver.GetProviderSchema` which then calls `fwserver.ProviderSchema`, `fwserver.ResourceSchemas` and `fwserver.DataSourceSchemas` functions. The `terraform-plugin-framework` module defines `provider.Provider`, `resource.Resource` and `datasource.DataSource` interfaces for providers, resources and data sources, respectively. Each of these interfaces include a `Schema` function which is implemented by the Terraform provider code written by the provider developer.

In summary, the schemas for the provider and each of the resources and data sources are defined by the provider developer through implementation of the `Schema` function defined on the `provider.Provider`, `resource.Resource` and `datasource.DataSource` interfaces, respectively. For the `GetProviderSchema` RPC, the implementation of the `Schema` function in the `provider.Provider`, `resource.Resource` and `datasource.DataSource` interfaces represents the "touch-point" for where the RPC sent from Terraform core interacts with the code written by the provider developer.

## ValidateConfig RPCs

### Summary

![diagram: ValidateConfig RPCs Overview](/img/validate-config-overview.png)
<!-- Refer to README in /img directory for information on generating validate-config-overview.png -->

When _terraform validate | plan | apply_ are executed if the Terraform configuration contains configuration for the provider then Terraform core issues the `ValidateProviderConfig` RPC. Additionally, the `ValidateResourceConfig` and `ValidateDataResourceConfig` RPCs are issued for each of the resources and data sources that appear in the Terraform configuration. There is a 1:1 match between the schema returned from the `GetProviderSchema` RPC and the `Validate<Provider|Resource|DataResource>Config` RPCs.

The `Validate<Provider|Resource|DataResource>Config` RPCs flow through the Terraform plugin framework and ultimately call the `Validate<Provider|Resource|DataSource>` function on each of the `ConfigValidators`, the `ValidateConfig` function on the provider, resource or data source, and each of the `Validate<type>` functions defined on each of the attributes and blocks within the provider, resource or data source schema.

The `ValidateResourceConfig` and `ValidateDataResourceConfig` RPCs additionally call `resource.Configure` and `datasource.Configure`, respectively.

### Detail

#### ValidateProviderConfig RPC

![diagram: ValidateProviderConfig RPC Detail](/img/validate-provider-config-detail.png)
<!-- Refer to README in /img directory for information on generating validate-provider-config-detail.png -->

#### ValidateResourceConfig RPC

![diagram: ValidateResourceConfig RPC Detail](/img/validate-resource-config-detail.png)
<!-- Refer to README in /img directory for information on generating validate-resource-config-detail.png -->

#### ValidateDataResourceConfig RPC

![diagram: ValidateDataResourceConfig RPC Detail](/img/validate-data-resource-config-detail.png)
<!-- Refer to README in /img directory for information on generating validate-data-resource-config-detail.png -->

Within the Terraform plugin framework, `terraform-plugin-go` is used to expose gRPC endpoints defined by the Terraform plugin protocol. These endpoints implement the `tfplugin6.ProviderServer` interface for version 6 of the Terraform plugin protocol. The `terraform-plugin-go` module also defines `tfprotov6.<Provider|Resource|DataSource>Server` interfaces which are implemented within the `terraform-plugin-framework` module.

The `terraform-plugin-framework` module contains `proto6server.Validate<Provider|Resource|DataResource>Config` functions which are implementations of the `tfprotov6.<Provider|Resource|DataSource>Server` interface `Validate<Provider|Resource|DataResource>Config` functions, respectively. Each of these functions then call `fwserver.Validate<Provider|Resource|DataSource>Config` functions, respectively.

If the provider, resource or data source implements the `<provider|resource|datasource>.<Provider|Resource|DataSource>WithConfigValidators` interface defined in the `terraform-plugin-framework` module, the `<provider|resource|datasource>.ConfigValidators` function is called to retrieve a slice of `<provider|resource|datasource>.ConfigValidator`, and then `<provider|resource|datasource>.Validate<Provider|Resource|DataSource>` is called on each element in the slice sequentially.

If the provider, resource or data source implements the `<provider|resource|datasource>.<Provider|Resource|DataSource>WithValidateConfig` interface, the `<provider|resource|datasource>.ValidateConfig` function is called.

The `fwserver.SchemaValidate` function is then called which iterates over each of the attributes and blocks defined within the provider, resource or data source schema and calls the `validator.Validate<type>` for each of the validators defined on the attribute or block.

In summary:
- The `<provider|resource|datasource>.ConfigValidators` and `<provider|resource|datasource>.Validate<Provider|Resource|DataSource>` functions are optionally defined by the provider developer through implementation of the `<provider|resource|datasource>.<Provider|Resource|DataSource>WithConfigValidators` interfaces.
- The `<provider|resource|datasource>.ValidateConfig` functions are optionally defined by the provider developer through implementation of the `<provider|resource|datasource>.<Provider|Resource|DataSource>WithValidateConfig` interfaces.
- The attribute and block validators are optionally specified by the provider developer by adding a type-specific slice of validators to the attribute or block (e.g., []validator.String{...} on a schema.StringAttribute).

## ConfigureProvider RPC

### Summary

![diagram: ConfigureProvider RPC Overview](/img/configure-provider-overview.png)
<!-- Refer to README in /img directory for information on generating configure-provider-overview.png -->

When _terraform plan | apply_ are executed Terraform core issues the `ConfigureProvider` RPC.

The `ConfigureProvider` RPC flows through the Terraform plugin framework and ultimately calls the `Configure` function on the provider.

### Detail

![diagram: ConfigureProvider RPC Detail](/img/configure-provider-detail.png)
<!-- Refer to README in /img directory for information on generating configure-provider-detail.png -->

Within the Terraform plugin framework, `terraform-plugin-go` is used to expose gRPC endpoints defined by the Terraform plugin protocol. These endpoints implement the `tfplugin6.ProviderServer` interface for version 6 of the Terraform plugin protocol. The `terraform-plugin-go` module also defines the `tfprotov6.ProviderServer` interface which is implemented within the `terraform-plugin-framework` module.

The `terraform-plugin-framework` module contains a `proto6server.ConfigureProvider` function which is an implementation of the `tfprotov6.ProviderServer` interface `ConfigureProvider` function. The `proto6server.ConfigureProvider` function calls the `fwserver.ConfigureProvider` function. The `terraform-plugin-framework` defines the `provider.Provider` interface which contains a `Configure` function. The `Configure` function is implemented by the provider developer, and this function is called by the `fwserver.ConfigureProvider` function.

In summary, the `provider.Provider` interface defines a `Configure` function which must be defined by the provider developer.

## Read RPCs

### Summary

![diagram: Read RPC Overview](/img/read-overview.png)
<!-- Refer to README in /img directory for information on generating read-overview.png -->

When _terraform plan | apply_ are executed Terraform core issues the `ReadResource` and `ReadDataSource` RPCs. Note that the `ReadResource` RPC is only issued when a resource already exists in state.

The `ReadResource` and `ReadDataSource` RPCs flow through the Terraform plugin framework and ultimately call the `Read` function on the resource and data source, respectively.

### Detail

#### ReadResource RPC

![diagram: ReadResource RPC Detail](/img/read-resource-detail.png)
<!-- Refer to README in /img directory for information on generating read-resource-detail.png -->

#### ReadDataSource RPC

![diagram: ReadDataSource RPC Detail](/img/read-data-source-detail.png)
<!-- Refer to README in /img directory for information on generating read-data-source-detail.png -->

Within the Terraform plugin framework, `terraform-plugin-go` is used to expose gRPC endpoints defined by the Terraform plugin protocol. These endpoints implement the `tfplugin6.ProviderServer` interface for version 6 of the Terraform plugin protocol. The `terraform-plugin-go` module also defines the `tfprotov6.ProviderServer` interface which encompasses the `tfprotov6.ResourceServer` and `tfprotov6.DataSourceServer` interfaces. The `tfprotov6.ProviderServer` interface is implemented within the `terraform-plugin-framework` module.

The `terraform-plugin-framework` module contains a `proto6server.ReadResource` function which is an implementation of the `tfprotov6.ResourceServer` interface `ReadResource` function. The `proto6server.ReadResource` function calls the `fwserver.ReadResource` function. The `terraform-plugin-framework` defines the `resource.ResourceWithConfigure` interface which contains a `Configure` function. If the resource implements the `resource.ResourceWithConfigure` interface then the `Configure` function that has been implemented by the provider developer is called. The `terraform-plugin-framework` defines the `resource.Resource` interface which contains a `Read` function which is called by the `fwserver.ReadResource` function.

The `terraform-plugin-framework` module contains a `proto6server.ReadDataSource` function which is an implementation of the `tfprotov6.DataSourceServer` interface `ReadDataSource` function. The `proto6server.ReadDataSource` function calls the `fwserver.ReadDataSource` function. The `terraform-plugin-framework` defines the `datasource.DataSourceWithConfigure` interface which contains a `Configure` function. If the data source implements the `datasource.DataSourceWithConfigure` interface then the `Configure` function that has been implemented by the provider developer is called. The `terraform-plugin-framework` defines the `datasource.DataSource` interface which contains a `Read` function which is called by the `fwserver.ReadDataSource` function.

In summary, the `resource.Resource` interface defines a `Read` function which is called by the `ReadResource` RPC and the `datasource.DataSource` interface defines a `Read` function which is called by the `ReadDataSource` RPC. All resources and data sources must have provider developer defined `Read` functions.

## PlanResourceChange RPC

### Summary

![diagram: PlanResourceChange RPC Overview](/img/plan-resource-change-overview.png)
<!-- Refer to README in /img directory for information on generating plan-resource-change-overview.png -->

When _terraform plan | apply_ are executed Terraform core issues the `PlanResourceChange` RPC. Note that the `PlanResourceChange` RPC is only issued when a resource exists in configuration and/or a resource already exists in state.

The `PlanResourceChange` RPC flows through the Terraform plugin framework and ultimately calls each of the `PlanModify<type>` functions on each of the attributes and blocks within the resource schema and `ModifyPlan` on the resource if the `resource.ResourceWithModifyPlan` interface has been implemented.

The `PlanResourceChange` RPC also calls `resource.Configure` if the `resource.ResourceWithConfigure` interface has been implemented.

### Detail

![diagram: PlanResourceChange RPC Detail](/img/plan-resource-change-detail.png)
<!-- Refer to README in /img directory for information on generating plan-resource-change-detail.png -->

Within the Terraform plugin framework, `terraform-plugin-go` is used to expose gRPC endpoints defined by the Terraform plugin protocol. These endpoints implement the `tfplugin6.ProviderServer` interface for version 6 of the Terraform plugin protocol. The `terraform-plugin-go` module also defines the  `tfprotov6.ResourceServer` interface which is encompassed by the `tfplugin6.ProviderServer` interface.

The `terraform-plugin-framework` module contains the `proto6server.PlanResourceChange` function which is an implementation of the `tfprotov6.ResourceServer` interface `PlanResourceChange` function. The `PlanResourceChange` function calls the `fwserver.PlanResourceChange` function.

If the resource implements the `resource.ResourceWithConfigure` interface, then the `resource.Configure` function defined by the provider developer is called.

All attributes that are null in the configuration are then marked as unknown in the plan so that a provider has the opportunity to update them. The `fwserver.SchemaModifyPlan` function is then called which iterates over each of the attributes and blocks defined within the resource schema and calls `planmodifier.PlanModify<type>` for each of the plan modifiers defined on the attribute or block.

If the resource implements the `resource.ResourceWithModifyPlan` interface then the provider developer defined `resource.ModifyPlan` function is called.

In summary, `resource.Configure` is called on the resource if it implements the `resource.ResourceWithConfigure` interface. The `PlanModify<type>` functions on all the plan modifiers defined on each of the attributes and blocks within the resource schema are executed. The `resource.ModifyPlan` function is called on the resource if it implements the `resource.ResourceWithModifyPlan` interface.

## ApplyResourceChange RPC

### Summary

![diagram: ApplyResourceChange RPC Overview](/img/apply-resource-change-overview.png)
<!-- Refer to README in /img directory for information on generating apply-resource-change-overview.png -->

When terraform apply is executed Terraform core issues the `ApplyResourceChange` RPC. Note that the `ApplyResourceChange RPC` is only issued when a resource exists in configuration and/or a resource already exists in state.

The `ApplyResourceChange` RPC flows through the Terraform plugin framework and ultimately calls either `resource.Create`, `resource.Update` or `resource.Delete` on the resource depending upon the contents of the state and the plan.

The `ApplyResourceChange` RPC also calls `resource.Configure` method if the `resource.ResourceWithConfigure` interface has been implemented.

### Detail

![diagram: ApplyResourceChange RPC Detail](/img/apply-resource-change-detail.png)
<!-- Refer to README in /img directory for information on generating apply-resource-change-detail.png -->

Within the Terraform plugin framework, `terraform-plugin-go` is used to expose gRPC endpoints defined by the Terraform plugin protocol. These endpoints implement the `tfplugin6.ProviderServer` interface for version 6 of the Terraform plugin protocol. The `terraform-plugin-go` module also defines the `tfprotov6.ResourceServer` interface which is encompassed by the `tfplugin6.ProviderServer` interface.

The `terraform-plugin-framework` module contains the `proto6server.ApplyResourceChange` function which is an implementation of the `tfprotov6.ResourceServer` interface `ApplyResourceChange` function. The `ApplyResourceChange` function calls the `fwserver.ApplyResourceChange` function.

If the resource implements the `resource.ResourceWithConfigure` interface, then the `resource.Configure` function defined by the provider developer is called.

The `resource.Resource` interface defined within `terraform-plugin-framework` contains functions for `Create`, `Update` and `Delete`. The provider developer must implement `Create`, `Update` and `Delete` functions for each resource. Whether the `Create`, `Update` or `Delete` function on the provider is called by the `fwserver.ApplyResourceChange` function depends on the contents of the state and the plan.

In summary, the `ApplyResourcePlan` RPC will call `resource.Configure` on the resource if the resource implements the `resource.ResourceWithConfigure` interface. One of the provider developer defined `Create`, `Update` and `Delete` functions will be called by the `ApplyResourcePlan` RPC depending upon the contents of the state and the plan.
