package provider import ( "context" "github.com/hashicorp/terraform-plugin-framework/diag" "github.com/hashicorp/terraform-plugin-framework/tfsdk" "github.com/hashicorp/terraform-plugin-framework/types" "github.com/hashicorp/terraform-plugin-go/tftypes" ) type exampleResourceType struct{} func (t exampleResourceType) GetSchema(ctx context.Context) (tfsdk.Schema, diag.Diagnostics) { return tfsdk.Schema{ // This description is used by the documentation generator and the language server. MarkdownDescription: "Example resource", Attributes: map[string]tfsdk.Attribute{ "configurable_attribute": { MarkdownDescription: "Example configurable attribute", Optional: true, Type: types.StringType, }, "id": { Computed: true, MarkdownDescription: "Example identifier", PlanModifiers: tfsdk.AttributePlanModifiers{ tfsdk.UseStateForUnknown(), }, Type: types.StringType, }, }, }, nil } func (t exampleResourceType) NewResource(ctx context.Context, in tfsdk.Provider) (tfsdk.Resource, diag.Diagnostics) { provider, diags := convertProviderType(in) return exampleResource{ provider: provider, }, diags } type exampleResourceData struct { ConfigurableAttribute types.String `tfsdk:"configurable_attribute"` Id types.String `tfsdk:"id"` } type exampleResource struct { provider provider } func (r exampleResource) Create(ctx context.Context, req tfsdk.CreateResourceRequest, resp *tfsdk.CreateResourceResponse) { var data exampleResourceData diags := req.Config.Get(ctx, &data) resp.Diagnostics.Append(diags...) if resp.Diagnostics.HasError() { return } // If applicable, this is a great opportunity to initialize any necessary // provider client data and make a call using it. // example, err := d.provider.client.CreateExample(...) // if err != nil { // resp.Diagnostics.AddError("Client Error", fmt.Sprintf("Unable to create example, got error: %s", err)) // return // } // For the purposes of this example code, hardcoding a response value to // save into the Terraform state. data.Id = types.String{Value: "example-id"} diags = resp.State.Set(ctx, &data) resp.Diagnostics.Append(diags...) } func (r exampleResource) Read(ctx context.Context, req tfsdk.ReadResourceRequest, resp *tfsdk.ReadResourceResponse) { var data exampleResourceData diags := req.State.Get(ctx, &data) resp.Diagnostics.Append(diags...) if resp.Diagnostics.HasError() { return } // If applicable, this is a great opportunity to initialize any necessary // provider client data and make a call using it. // example, err := d.provider.client.ReadExample(...) // if err != nil { // resp.Diagnostics.AddError("Client Error", fmt.Sprintf("Unable to read example, got error: %s", err)) // return // } diags = resp.State.Set(ctx, &data) resp.Diagnostics.Append(diags...) } func (r exampleResource) Update(ctx context.Context, req tfsdk.UpdateResourceRequest, resp *tfsdk.UpdateResourceResponse) { var data exampleResourceData diags := req.Plan.Get(ctx, &data) resp.Diagnostics.Append(diags...) if resp.Diagnostics.HasError() { return } // If applicable, this is a great opportunity to initialize any necessary // provider client data and make a call using it. // example, err := d.provider.client.UpdateExample(...) // if err != nil { // resp.Diagnostics.AddError("Client Error", fmt.Sprintf("Unable to update example, got error: %s", err)) // return // } diags = resp.State.Set(ctx, &data) resp.Diagnostics.Append(diags...) } func (r exampleResource) Delete(ctx context.Context, req tfsdk.DeleteResourceRequest, resp *tfsdk.DeleteResourceResponse) { var data exampleResourceData diags := req.State.Get(ctx, &data) resp.Diagnostics.Append(diags...) if resp.Diagnostics.HasError() { return } // If applicable, this is a great opportunity to initialize any necessary // provider client data and make a call using it. // example, err := d.provider.client.DeleteExample(...) // if err != nil { // resp.Diagnostics.AddError("Client Error", fmt.Sprintf("Unable to delete example, got error: %s", err)) // return // } resp.State.RemoveResource(ctx) } func (r exampleResource) ImportState(ctx context.Context, req tfsdk.ImportResourceStateRequest, resp *tfsdk.ImportResourceStateResponse) { tfsdk.ResourceImportStatePassthroughID(ctx, tftypes.NewAttributePath().WithAttributeName("id"), req, resp) }