feat: add new attributes to git resource and datasource (#890)
* feat: add new attributes to git resource and datasource Signed-off-by: Mauritz Uphoff <mauritz.uphoff@stackit.cloud> * review changes Signed-off-by: Mauritz Uphoff <mauritz.uphoff@stackit.cloud> * review changes 2 Signed-off-by: Mauritz Uphoff <mauritz.uphoff@stackit.cloud> --------- Signed-off-by: Mauritz Uphoff <mauritz.uphoff@stackit.cloud>
This commit is contained in:
parent
3c5c8e0a6c
commit
2dda93bb76
9 changed files with 570 additions and 95 deletions
|
|
@ -7,15 +7,12 @@ import (
|
|||
"net/http"
|
||||
"strings"
|
||||
|
||||
"github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils"
|
||||
|
||||
"github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion"
|
||||
gitUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/git/utils"
|
||||
|
||||
"github.com/hashicorp/terraform-plugin-framework-validators/stringvalidator"
|
||||
"github.com/hashicorp/terraform-plugin-framework/diag"
|
||||
"github.com/hashicorp/terraform-plugin-framework/path"
|
||||
"github.com/hashicorp/terraform-plugin-framework/resource"
|
||||
"github.com/hashicorp/terraform-plugin-framework/resource/schema"
|
||||
"github.com/hashicorp/terraform-plugin-framework/resource/schema/listplanmodifier"
|
||||
"github.com/hashicorp/terraform-plugin-framework/resource/schema/planmodifier"
|
||||
"github.com/hashicorp/terraform-plugin-framework/resource/schema/stringplanmodifier"
|
||||
"github.com/hashicorp/terraform-plugin-framework/schema/validator"
|
||||
|
|
@ -24,8 +21,11 @@ import (
|
|||
"github.com/stackitcloud/stackit-sdk-go/core/oapierror"
|
||||
"github.com/stackitcloud/stackit-sdk-go/services/git"
|
||||
"github.com/stackitcloud/stackit-sdk-go/services/git/wait"
|
||||
"github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion"
|
||||
"github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core"
|
||||
"github.com/stackitcloud/terraform-provider-stackit/stackit/internal/features"
|
||||
gitUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/git/utils"
|
||||
"github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils"
|
||||
"github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate"
|
||||
)
|
||||
|
||||
|
|
@ -38,12 +38,17 @@ var (
|
|||
|
||||
// Model represents the schema for the git resource.
|
||||
type Model struct {
|
||||
Id types.String `tfsdk:"id"` // Required by Terraform
|
||||
ProjectId types.String `tfsdk:"project_id"` // ProjectId associated with the git instance
|
||||
InstanceId types.String `tfsdk:"instance_id"` // InstanceId associated with the git instance
|
||||
Name types.String `tfsdk:"name"` // Name linked to the git instance
|
||||
Url types.String `tfsdk:"url"` // Url linked to the git instance
|
||||
Version types.String `tfsdk:"version"` // Version linked to the git instance
|
||||
Id types.String `tfsdk:"id"` // Required by Terraform
|
||||
ACL types.List `tfsdk:"acl"`
|
||||
ConsumedDisk types.String `tfsdk:"consumed_disk"`
|
||||
ConsumedObjectStorage types.String `tfsdk:"consumed_object_storage"`
|
||||
Created types.String `tfsdk:"created"`
|
||||
Flavor types.String `tfsdk:"flavor"`
|
||||
InstanceId types.String `tfsdk:"instance_id"`
|
||||
Name types.String `tfsdk:"name"`
|
||||
ProjectId types.String `tfsdk:"project_id"`
|
||||
Url types.String `tfsdk:"url"`
|
||||
Version types.String `tfsdk:"version"`
|
||||
}
|
||||
|
||||
// NewGitResource is a helper function to create a new git resource instance.
|
||||
|
|
@ -58,12 +63,17 @@ type gitResource struct {
|
|||
|
||||
// descriptions for the attributes in the Schema
|
||||
var descriptions = map[string]string{
|
||||
"id": "Terraform's internal resource ID, structured as \"`project_id`,`instance_id`\".",
|
||||
"project_id": "STACKIT project ID to which the git instance is associated.",
|
||||
"instance_id": "ID linked to the git instance.",
|
||||
"name": "Unique name linked to the git instance.",
|
||||
"url": "Url linked to the git instance.",
|
||||
"version": "Version linked to the git instance.",
|
||||
"id": "Terraform's internal resource ID, structured as \"`project_id`,`instance_id`\".",
|
||||
"acl": "Restricted ACL for instance access.",
|
||||
"consumed_disk": "How many bytes of disk space is consumed.",
|
||||
"consumed_object_storage": "How many bytes of Object Storage is consumed.",
|
||||
"created": "Instance creation timestamp in RFC3339 format.",
|
||||
"flavor": "Instance flavor. If not provided, defaults to git-100. For a list of available flavors, refer to our API documentation: `https://docs.api.stackit.cloud/documentation/git/version/v1beta`",
|
||||
"instance_id": "ID linked to the git instance.",
|
||||
"name": "Unique name linked to the git instance.",
|
||||
"project_id": "STACKIT project ID to which the git instance is associated.",
|
||||
"url": "Url linked to the git instance.",
|
||||
"version": "Version linked to the git instance.",
|
||||
}
|
||||
|
||||
// Configure sets up the API client for the git instance resource.
|
||||
|
|
@ -94,8 +104,12 @@ func (g *gitResource) Metadata(_ context.Context, req resource.MetadataRequest,
|
|||
// Schema defines the schema for the resource.
|
||||
func (g *gitResource) Schema(_ context.Context, _ resource.SchemaRequest, resp *resource.SchemaResponse) {
|
||||
resp.Schema = schema.Schema{
|
||||
MarkdownDescription: features.AddBetaDescription("Git Instance resource schema.", core.Resource),
|
||||
Description: "Git Instance resource schema.",
|
||||
MarkdownDescription: fmt.Sprintf(
|
||||
"%s %s",
|
||||
features.AddBetaDescription("Git Instance resource schema.", core.Resource),
|
||||
"This resource currently does not support updates. Changing the ACLs, flavor, or name will trigger resource recreation. Update functionality will be added soon. In the meantime, please proceed with caution. To update these attributes, please open a support ticket.",
|
||||
),
|
||||
Description: "Git Instance resource schema.",
|
||||
Attributes: map[string]schema.Attribute{
|
||||
"id": schema.StringAttribute{
|
||||
Description: descriptions["id"],
|
||||
|
|
@ -120,6 +134,35 @@ func (g *gitResource) Schema(_ context.Context, _ resource.SchemaRequest, resp *
|
|||
validate.NoSeparator(),
|
||||
},
|
||||
},
|
||||
"acl": schema.ListAttribute{
|
||||
Description: descriptions["acl"],
|
||||
PlanModifiers: []planmodifier.List{
|
||||
listplanmodifier.RequiresReplace(),
|
||||
},
|
||||
ElementType: types.StringType,
|
||||
Optional: true,
|
||||
Computed: true,
|
||||
},
|
||||
"consumed_disk": schema.StringAttribute{
|
||||
Description: descriptions["consumed_disk"],
|
||||
Computed: true,
|
||||
},
|
||||
"consumed_object_storage": schema.StringAttribute{
|
||||
Description: descriptions["consumed_object_storage"],
|
||||
Computed: true,
|
||||
},
|
||||
"created": schema.StringAttribute{
|
||||
Description: descriptions["created"],
|
||||
Computed: true,
|
||||
},
|
||||
"flavor": schema.StringAttribute{
|
||||
Description: descriptions["flavor"],
|
||||
PlanModifiers: []planmodifier.String{
|
||||
stringplanmodifier.RequiresReplace(),
|
||||
},
|
||||
Optional: true,
|
||||
Computed: true,
|
||||
},
|
||||
"name": schema.StringAttribute{
|
||||
Description: descriptions["name"],
|
||||
Required: true,
|
||||
|
|
@ -158,9 +201,15 @@ func (g *gitResource) Create(ctx context.Context, req resource.CreateRequest, re
|
|||
ctx = tflog.SetField(ctx, "project_id", projectId)
|
||||
ctx = tflog.SetField(ctx, "instance_name", instanceName)
|
||||
|
||||
payload, diags := toCreatePayload(ctx, &model)
|
||||
resp.Diagnostics.Append(diags...)
|
||||
if resp.Diagnostics.HasError() {
|
||||
return
|
||||
}
|
||||
|
||||
// Create the new git instance via the API client.
|
||||
gitInstanceResp, err := g.client.CreateInstance(ctx, projectId).
|
||||
CreateInstancePayload(git.CreateInstancePayload{Name: &instanceName}).
|
||||
CreateInstancePayload(payload).
|
||||
Execute()
|
||||
if err != nil {
|
||||
core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating git instance", fmt.Sprintf("Calling API: %v", err))
|
||||
|
|
@ -174,7 +223,7 @@ func (g *gitResource) Create(ctx context.Context, req resource.CreateRequest, re
|
|||
return
|
||||
}
|
||||
|
||||
err = mapFields(gitInstanceResp, &model)
|
||||
err = mapFields(ctx, gitInstanceResp, &model)
|
||||
if err != nil {
|
||||
core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating git instance", fmt.Sprintf("Mapping fields: %v", err))
|
||||
return
|
||||
|
|
@ -216,7 +265,7 @@ func (g *gitResource) Read(ctx context.Context, req resource.ReadRequest, resp *
|
|||
return
|
||||
}
|
||||
|
||||
err = mapFields(gitInstanceResp, &model)
|
||||
err = mapFields(ctx, gitInstanceResp, &model)
|
||||
if err != nil {
|
||||
core.LogAndAddError(ctx, &resp.Diagnostics, "Error reading git instance", fmt.Sprintf("Processing API response: %v", err))
|
||||
return
|
||||
|
|
@ -295,7 +344,7 @@ func (g *gitResource) ImportState(ctx context.Context, req resource.ImportStateR
|
|||
}
|
||||
|
||||
// mapFields maps a Git response to the model.
|
||||
func mapFields(resp *git.Instance, model *Model) error {
|
||||
func mapFields(ctx context.Context, resp *git.Instance, model *Model) error {
|
||||
if resp == nil {
|
||||
return fmt.Errorf("response input is nil")
|
||||
}
|
||||
|
|
@ -307,12 +356,58 @@ func mapFields(resp *git.Instance, model *Model) error {
|
|||
return fmt.Errorf("git instance id not present")
|
||||
}
|
||||
|
||||
aclList := types.ListNull(types.StringType)
|
||||
var diags diag.Diagnostics
|
||||
if resp.Acl != nil && len(*resp.Acl) > 0 {
|
||||
aclList, diags = types.ListValueFrom(ctx, types.StringType, resp.Acl)
|
||||
if diags.HasError() {
|
||||
return fmt.Errorf("mapping ACL: %w", core.DiagsToError(diags))
|
||||
}
|
||||
}
|
||||
|
||||
model.Created = types.StringNull()
|
||||
if resp.Created != nil && resp.Created.String() != "" {
|
||||
model.Created = types.StringValue(resp.Created.String())
|
||||
}
|
||||
|
||||
// Build the ID by combining the project ID and instance id and assign the model's fields.
|
||||
model.Id = utils.BuildInternalTerraformId(model.ProjectId.ValueString(), *resp.Id)
|
||||
model.Url = types.StringPointerValue(resp.Url)
|
||||
model.Name = types.StringPointerValue(resp.Name)
|
||||
model.ACL = aclList
|
||||
model.ConsumedDisk = types.StringPointerValue(resp.ConsumedDisk)
|
||||
model.ConsumedObjectStorage = types.StringPointerValue(resp.ConsumedObjectStorage)
|
||||
model.Flavor = types.StringPointerValue(resp.Flavor)
|
||||
model.InstanceId = types.StringPointerValue(resp.Id)
|
||||
model.Name = types.StringPointerValue(resp.Name)
|
||||
model.Url = types.StringPointerValue(resp.Url)
|
||||
model.Version = types.StringPointerValue(resp.Version)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// toCreatePayload creates the payload to create a git instance
|
||||
func toCreatePayload(ctx context.Context, model *Model) (git.CreateInstancePayload, diag.Diagnostics) {
|
||||
diags := diag.Diagnostics{}
|
||||
|
||||
if model == nil {
|
||||
return git.CreateInstancePayload{}, diags
|
||||
}
|
||||
|
||||
payload := git.CreateInstancePayload{
|
||||
Name: model.Name.ValueStringPointer(),
|
||||
}
|
||||
|
||||
if !(model.ACL.IsNull() || model.ACL.IsUnknown()) {
|
||||
var acl []string
|
||||
aclDiags := model.ACL.ElementsAs(ctx, &acl, false)
|
||||
diags.Append(aclDiags...)
|
||||
if !aclDiags.HasError() {
|
||||
payload.Acl = &acl
|
||||
}
|
||||
}
|
||||
|
||||
if !(model.Flavor.IsNull() || model.Flavor.IsUnknown()) {
|
||||
payload.Flavor = model.Flavor.ValueStringPointer()
|
||||
}
|
||||
|
||||
return payload, diags
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue