feat: add database_id attribute to resource model and update related functions

This commit is contained in:
Andre_Harms 2026-02-05 09:14:03 +01:00
parent 502b2f5e0a
commit 91913c3446
6 changed files with 90 additions and 65 deletions

View file

@ -13,6 +13,9 @@ import (
"github.com/hashicorp/terraform-plugin-framework/resource"
"github.com/hashicorp/terraform-plugin-framework/resource/identityschema"
"github.com/hashicorp/terraform-plugin-framework/resource/schema"
"github.com/hashicorp/terraform-plugin-framework/resource/schema/int64planmodifier"
"github.com/hashicorp/terraform-plugin-framework/resource/schema/planmodifier"
"github.com/hashicorp/terraform-plugin-framework/schema/validator"
"github.com/hashicorp/terraform-plugin-framework/types"
"github.com/hashicorp/terraform-plugin-log/tflog"
"github.com/stackitcloud/stackit-sdk-go/core/oapierror"
@ -37,6 +40,7 @@ var (
type ResourceModel struct {
postgresflexalpha2.DatabaseModel
TerraformID types.String `tfsdk:"tf_id"`
DatabaseID types.Int64 `tfsdk:"database_id"`
}
// DatabaseResourceIdentityModel describes the resource's identity attributes.
@ -44,7 +48,7 @@ type DatabaseResourceIdentityModel struct {
ProjectID types.String `tfsdk:"project_id"`
Region types.String `tfsdk:"region"`
InstanceID types.String `tfsdk:"instance_id"`
DatabaseID types.Int64 `tfsdk:"id"`
DatabaseID types.Int64 `tfsdk:"database_id"`
}
// NewDatabaseResource is a helper function to simplify the provider implementation.
@ -123,10 +127,18 @@ var modifiersFileByte []byte
func (r *databaseResource) Schema(ctx context.Context, _ resource.SchemaRequest, resp *resource.SchemaResponse) {
s := postgresflexalpha2.DatabaseResourceSchema(ctx)
s.Attributes["tf_id"] = schema.StringAttribute{
Description: "Terraform's internal resource ID. It is structured as \\\"`project_id`,`region`,`instance_id`,`id`\\\".\",",
Description: "Terraform's internal resource ID. It is structured as \\\"`project_id`,`region`,`instance_id`,`database_id`\\\".\",",
Optional: true,
Computed: true,
}
s.Attributes["database_id"] = schema.Int64Attribute{
Description: "ID of the database.",
Computed: true,
PlanModifiers: []planmodifier.Int64{
int64planmodifier.UseStateForUnknown(),
},
Validators: []validator.Int64{},
}
fields, err := postgresflexUtils.ReadModifiersConfig(modifiersFileByte)
if err != nil {
@ -159,7 +171,7 @@ func (r *databaseResource) IdentitySchema(
"instance_id": identityschema.StringAttribute{
RequiredForImport: true,
},
"id": identityschema.StringAttribute{
"database_id": identityschema.Int64Attribute{
// database id
RequiredForImport: true,
},
@ -289,12 +301,12 @@ func (r *databaseResource) Read(
projectId := identityData.ProjectID.ValueString()
instanceId := identityData.InstanceID.ValueString()
databaseId := model.Id.ValueInt64()
databaseId := model.DatabaseID.ValueInt64()
region := r.providerData.GetRegionWithOverride(identityData.Region)
ctx = tflog.SetField(ctx, "project_id", projectId)
ctx = tflog.SetField(ctx, "instance_id", instanceId)
ctx = tflog.SetField(ctx, "region", region)
ctx = tflog.SetField(ctx, "id", databaseId) //database id
ctx = tflog.SetField(ctx, "database_id", databaseId)
databaseResp, err := getDatabaseById(ctx, r.client, projectId, region, instanceId, databaseId)
if err != nil {
@ -356,7 +368,7 @@ func (r *databaseResource) Update(
instanceId := identityData.InstanceID.ValueString()
region := r.providerData.GetRegionWithOverride(identityData.Region)
databaseId64 := model.Id.ValueInt64()
databaseId64 := model.DatabaseID.ValueInt64() // database id
if databaseId64 > math.MaxInt32 {
core.LogAndAddError(ctx, &resp.Diagnostics, "Error in type conversion", "int value too large (databaseId)")
return
@ -366,7 +378,7 @@ func (r *databaseResource) Update(
ctx = tflog.SetField(ctx, "project_id", projectId)
ctx = tflog.SetField(ctx, "instance_id", instanceId)
ctx = tflog.SetField(ctx, "region", region)
ctx = tflog.SetField(ctx, "id", databaseId)
ctx = tflog.SetField(ctx, "database_id", databaseId)
// Retrieve values from state
var stateModel ResourceModel
@ -453,7 +465,7 @@ func (r *databaseResource) Delete(
projectId := identityData.ProjectID.ValueString()
instanceId := identityData.InstanceID.ValueString()
region := r.providerData.GetRegionWithOverride(identityData.Region)
databaseId64 := model.Id.ValueInt64()
databaseId64 := model.DatabaseID.ValueInt64() //database id
if databaseId64 > math.MaxInt32 {
core.LogAndAddError(ctx, &resp.Diagnostics, "Error in type conversion", "int value too large (databaseId)")
@ -463,7 +475,7 @@ func (r *databaseResource) Delete(
ctx = tflog.SetField(ctx, "project_id", projectId)
ctx = tflog.SetField(ctx, "instance_id", instanceId)
ctx = tflog.SetField(ctx, "region", region)
ctx = tflog.SetField(ctx, "id", databaseId) //database id
ctx = tflog.SetField(ctx, "database_id", databaseId)
// Delete existing record set
err := r.client.DeleteDatabaseRequestExecute(ctx, projectId, region, instanceId, databaseId)
@ -477,7 +489,7 @@ func (r *databaseResource) Delete(
}
// ImportState imports a resource into the Terraform state on success.
// The expected import identifier format is: [project_id],[region],[instance_id],[id]
// The expected import identifier format is: [project_id],[region],[instance_id],[database_id]
func (r *databaseResource) ImportState(
ctx context.Context,
req resource.ImportStateRequest,
@ -489,7 +501,7 @@ func (r *databaseResource) ImportState(
ctx, &resp.Diagnostics,
"Error importing database",
fmt.Sprintf(
"Expected import identifier with format [project_id],[region],[instance_id],[id], got %q",
"Expected import identifier with format [project_id],[region],[instance_id],[database_id], got %q",
req.ID,
),
)
@ -499,7 +511,7 @@ func (r *databaseResource) ImportState(
resp.Diagnostics.Append(resp.State.SetAttribute(ctx, path.Root("project_id"), idParts[0])...)
resp.Diagnostics.Append(resp.State.SetAttribute(ctx, path.Root("region"), idParts[1])...)
resp.Diagnostics.Append(resp.State.SetAttribute(ctx, path.Root("instance_id"), idParts[2])...)
resp.Diagnostics.Append(resp.State.SetAttribute(ctx, path.Root("id"), idParts[3])...) //database id
resp.Diagnostics.Append(resp.State.SetAttribute(ctx, path.Root("database_id"), idParts[3])...)
core.LogAndAddWarning(
ctx,
&resp.Diagnostics,
@ -547,7 +559,7 @@ func (r *databaseResource) ImportState(
resp.Diagnostics.Append(
resp.State.SetAttribute(
ctx,
path.Root("id"), // database id
path.Root("database_id"),
identityData.DatabaseID.ValueInt64(),
)...,
)