package provider import ( "context" "github.com/hashicorp/terraform-plugin-framework/diag" "github.com/hashicorp/terraform-plugin-framework/path" "github.com/hashicorp/terraform-plugin-framework/provider" "github.com/hashicorp/terraform-plugin-framework/resource" "github.com/hashicorp/terraform-plugin-framework/tfsdk" "github.com/hashicorp/terraform-plugin-framework/types" "github.com/hashicorp/terraform-plugin-log/tflog" ) // Ensure provider defined types fully satisfy framework interfaces var _ provider.ResourceType = exampleResourceType{} var _ resource.Resource = exampleResource{} var _ resource.ResourceWithImportState = exampleResource{} 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{ resource.UseStateForUnknown(), }, Type: types.StringType, }, }, }, nil } func (t exampleResourceType) NewResource(ctx context.Context, in provider.Provider) (resource.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 scaffoldingProvider } func (r exampleResource) Create(ctx context.Context, req resource.CreateRequest, resp *resource.CreateResponse) { 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"} // Write logs using the tflog package // Documentation: https://terraform.io/plugin/log tflog.Trace(ctx, "created a resource") diags = resp.State.Set(ctx, &data) resp.Diagnostics.Append(diags...) } func (r exampleResource) Read(ctx context.Context, req resource.ReadRequest, resp *resource.ReadResponse) { 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 resource.UpdateRequest, resp *resource.UpdateResponse) { 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 resource.DeleteRequest, resp *resource.DeleteResponse) { 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 // } } func (r exampleResource) ImportState(ctx context.Context, req resource.ImportStateRequest, resp *resource.ImportStateResponse) { resource.ImportStatePassthroughID(ctx, path.Root("id"), req, resp) }