Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ require (
github.com/stackitcloud/stackit-sdk-go/services/kms v1.3.2
github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.8.0
github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.6
github.com/stackitcloud/stackit-sdk-go/services/logs v0.5.2
github.com/stackitcloud/stackit-sdk-go/services/logs v0.6.0
github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.6
github.com/stackitcloud/stackit-sdk-go/services/modelserving v0.6.5
github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.8
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -173,8 +173,8 @@ github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.8.0 h1:DxrN85V73
github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.8.0/go.mod h1:ClPE4TOM1FeaJiwTXvApq4gWaSgTLq6nU3PPHAIQDN4=
github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.6 h1:4x30lC+YBmo7XpsAzTn0W+C/oP5flnLVgIh5u3O/P0o=
github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.6/go.mod h1:ewaYUiZcBTSS6urE5zEJBPCqxu70w2IjnBHCvnKdFKE=
github.com/stackitcloud/stackit-sdk-go/services/logs v0.5.2 h1:vr4atxFRT+EL+DqONMT5R44f7AzEMbePa9U7PEE0THU=
github.com/stackitcloud/stackit-sdk-go/services/logs v0.5.2/go.mod h1:CAPsiTX7osAImfrG5RnIjaJ/Iz3QpoBKuH2fS346wuQ=
github.com/stackitcloud/stackit-sdk-go/services/logs v0.6.0 h1:+DD31EGej4/dOKHVNwvPJN4Fc6FaDJ9b3zCkI6T0Dxs=
github.com/stackitcloud/stackit-sdk-go/services/logs v0.6.0/go.mod h1:R+ct2jIl0VSwZJ5NF4wbh3IFr5AvdcHmQaytksDHu2I=
github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.6 h1:Y/byRjX2u/OZl0gKS/Rau6ob2bDyv26xnw6A6JNkKJk=
github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.6/go.mod h1:sY66ZgCgBc1mScPV95ek5WtUEGYizdP1RMsGaqbdbhw=
github.com/stackitcloud/stackit-sdk-go/services/modelserving v0.6.5 h1:nT/H4WvYaMKWtoE1QtXGuKjlmh7FW+efG3xElRsJhsI=
Expand Down
10 changes: 10 additions & 0 deletions stackit/internal/conversion/conversion.go
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,16 @@ func StringValueToPointer(s basetypes.StringValue) *string {
return &value
}

// Int32ValueToPointer converts basetypes.Int32Value to a pointer to int32.
// It returns nil if the value is null or unknown.
func Int32ValueToPointer(s basetypes.Int32Value) *int32 {
if s.IsNull() || s.IsUnknown() {
return nil
}
value := s.ValueInt32()
return &value
}

// Int64ValueToPointer converts basetypes.Int64Value to a pointer to int64.
// It returns nil if the value is null or unknown.
func Int64ValueToPointer(s basetypes.Int64Value) *int64 {
Expand Down
18 changes: 9 additions & 9 deletions stackit/internal/services/logs/accesstoken/datasource.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import (
"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/services/logs"
logs "github.com/stackitcloud/stackit-sdk-go/services/logs/v1api"
"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/services/logs/utils"
Expand Down Expand Up @@ -160,7 +160,7 @@ func (d *logsAccessTokenDataSource) Read(ctx context.Context, req datasource.Rea
ctx = tflog.SetField(ctx, "instance_id", instanceID)
ctx = tflog.SetField(ctx, "access_token_id", accessTokenID)

accessTokenResponse, err := d.client.GetAccessToken(ctx, projectID, region, instanceID, accessTokenID).Execute()
accessTokenResponse, err := d.client.DefaultAPI.GetAccessToken(ctx, projectID, region, instanceID, accessTokenID).Execute()
if err != nil {
tfutils.LogError(
ctx,
Expand Down Expand Up @@ -203,20 +203,20 @@ func mapDataSourceFields(ctx context.Context, accessToken *logs.AccessToken, mod
var accessTokenID string
if model.AccessTokenID.ValueString() != "" {
accessTokenID = model.AccessTokenID.ValueString()
} else if accessToken.Id != nil {
accessTokenID = *accessToken.Id
} else if accessToken.Id != "" {
accessTokenID = accessToken.Id
} else {
return fmt.Errorf("access token id not present")
}

model.ID = tfutils.BuildInternalTerraformId(model.ProjectID.ValueString(), model.Region.ValueString(), model.InstanceID.ValueString(), accessTokenID)
model.AccessTokenID = types.StringValue(accessTokenID)
model.Region = types.StringValue(model.Region.ValueString())
model.Creator = types.StringPointerValue(accessToken.Creator)
model.Creator = types.StringValue(accessToken.Creator)
model.Description = types.StringPointerValue(accessToken.Description)
model.DisplayName = types.StringPointerValue(accessToken.DisplayName)
model.Expires = types.BoolPointerValue(accessToken.Expires)
model.Status = types.StringValue(string(*accessToken.Status))
model.DisplayName = types.StringValue(accessToken.DisplayName)
model.Expires = types.BoolValue(accessToken.Expires)
model.Status = types.StringValue(accessToken.Status)

model.ValidUntil = types.StringNull()
if accessToken.ValidUntil != nil {
Expand All @@ -225,7 +225,7 @@ func mapDataSourceFields(ctx context.Context, accessToken *logs.AccessToken, mod

permissionList := types.ListNull(types.StringType)
var diags diag.Diagnostics
if accessToken.Permissions != nil && len(*accessToken.Permissions) > 0 {
if len(accessToken.Permissions) > 0 {
permissionList, diags = types.ListValueFrom(ctx, types.StringType, accessToken.Permissions)
if diags.HasError() {
return fmt.Errorf("mapping permissions: %w", core.DiagsToError(diags))
Expand Down
24 changes: 15 additions & 9 deletions stackit/internal/services/logs/accesstoken/datasource_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import (
"github.com/hashicorp/terraform-plugin-framework/attr"
"github.com/hashicorp/terraform-plugin-framework/types"
"github.com/stackitcloud/stackit-sdk-go/core/utils"
"github.com/stackitcloud/stackit-sdk-go/services/logs"
logs "github.com/stackitcloud/stackit-sdk-go/services/logs/v1api"
)

func fixtureDataSourceModel(mods ...func(model *DataSourceModel)) *DataSourceModel {
Expand All @@ -25,7 +25,7 @@ func fixtureDataSourceModel(mods ...func(model *DataSourceModel)) *DataSourceMod
Expires: types.Bool{},
ValidUntil: types.String{},
Permissions: types.ListNull(types.StringType),
Status: types.StringValue(string(logs.ACCESSTOKENSTATUS_ACTIVE)),
Status: types.StringValue("active"),
}
for _, mod := range mods {
mod(model)
Expand All @@ -42,18 +42,24 @@ func TestMapDataSourceFields(t *testing.T) {
}{
{
description: "min values",
input: fixtureAccessToken(),
expected: fixtureDataSourceModel(),
input: fixtureAccessToken(func(accessToken *logs.AccessToken) {
accessToken.DisplayName = "display-name"
}),
expected: fixtureDataSourceModel(func(model *DataSourceModel) {
model.Creator = types.StringValue("")
model.DisplayName = types.StringValue("display-name")
model.Expires = types.BoolValue(false)
}),
},
{
description: "max values",
input: fixtureAccessToken(func(accessToken *logs.AccessToken) {
accessToken.Permissions = &[]string{"write"}
accessToken.Permissions = []string{"write"}
accessToken.AccessToken = utils.Ptr("")
accessToken.Description = utils.Ptr("description")
accessToken.DisplayName = utils.Ptr("display-name")
accessToken.Creator = utils.Ptr("testUser")
accessToken.Expires = utils.Ptr(false)
accessToken.DisplayName = "display-name"
accessToken.Creator = "testUser"
accessToken.Expires = false
accessToken.ValidUntil = utils.Ptr(testTime)
}),
expected: fixtureDataSourceModel(func(model *DataSourceModel) {
Expand Down Expand Up @@ -94,7 +100,7 @@ func TestMapDataSourceFields(t *testing.T) {
t.Fatalf("Should not have failed: %v", err)
}
if !tt.wantErr {
diff := cmp.Diff(state, tt.expected)
diff := cmp.Diff(tt.expected, state)
if diff != "" {
t.Fatalf("Data does not match: %s", diff)
}
Expand Down
52 changes: 23 additions & 29 deletions stackit/internal/services/logs/accesstoken/resource.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,15 @@ import (
"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/int64planmodifier"
"github.com/hashicorp/terraform-plugin-framework/resource/schema/int32planmodifier"
"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"
"github.com/hashicorp/terraform-plugin-framework/types"
"github.com/hashicorp/terraform-plugin-log/tflog"
"github.com/stackitcloud/stackit-sdk-go/core/oapierror"
sdkUtils "github.com/stackitcloud/stackit-sdk-go/core/utils"
"github.com/stackitcloud/stackit-sdk-go/services/logs"
logs "github.com/stackitcloud/stackit-sdk-go/services/logs/v1api"
"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/services/logs/utils"
Expand Down Expand Up @@ -53,7 +52,7 @@ var schemaDescriptions = map[string]string{
"permissions": "The access permissions granted to the access token. Possible values: `read`, `write`.",
"status": fmt.Sprintf(
"The status of the access token. %s",
tfutils.FormatPossibleValues(sdkUtils.EnumSliceToStringSlice(logs.AllowedAccessTokenStatusEnumValues)...),
tfutils.FormatPossibleValues("active", "expired"),
),
}

Expand All @@ -69,7 +68,7 @@ type Model struct {
AccessToken types.String `tfsdk:"access_token"`
Expires types.Bool `tfsdk:"expires"`
ValidUntil types.String `tfsdk:"valid_until"`
Lifetime types.Int64 `tfsdk:"lifetime"`
Lifetime types.Int32 `tfsdk:"lifetime"`
Permissions types.List `tfsdk:"permissions"`
Status types.String `tfsdk:"status"`
}
Expand Down Expand Up @@ -211,11 +210,11 @@ func (r *logsAccessTokenResource) Schema(_ context.Context, _ resource.SchemaReq
Description: schemaDescriptions["valid_until"],
Computed: true,
},
"lifetime": schema.Int64Attribute{
"lifetime": schema.Int32Attribute{
Description: schemaDescriptions["lifetime"],
Optional: true,
PlanModifiers: []planmodifier.Int64{
int64planmodifier.RequiresReplace(),
PlanModifiers: []planmodifier.Int32{
int32planmodifier.RequiresReplace(),
},
},
"permissions": schema.ListAttribute{
Expand Down Expand Up @@ -260,20 +259,15 @@ func (r *logsAccessTokenResource) Create(ctx context.Context, req resource.Creat
return
}

createResp, err := r.client.CreateAccessToken(ctx, projectId, region, instanceId).CreateAccessTokenPayload(*payload).Execute()
createResp, err := r.client.DefaultAPI.CreateAccessToken(ctx, projectId, region, instanceId).CreateAccessTokenPayload(*payload).Execute()
if err != nil {
core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating Logs access token", fmt.Sprintf("Calling API: %v", err))
return
}

ctx = core.LogResponse(ctx)

if createResp.Id == nil {
core.LogAndAddError(ctx, &resp.Diagnostics, "Error creating Logs access token", "Got empty credential id")
return
}
accessTokenId := *createResp.Id
ctx = tflog.SetField(ctx, "access_token_id", accessTokenId)
ctx = tflog.SetField(ctx, "access_token_id", createResp.Id)

err = mapFields(ctx, createResp, &model)
if err != nil {
Expand Down Expand Up @@ -308,7 +302,7 @@ func (r *logsAccessTokenResource) Read(ctx context.Context, req resource.ReadReq
ctx = tflog.SetField(ctx, "instance_id", instanceID)
ctx = tflog.SetField(ctx, "access_token_id", accessTokenID)

accessTokenResponse, err := r.client.GetAccessToken(ctx, projectID, region, instanceID, accessTokenID).Execute()
accessTokenResponse, err := r.client.DefaultAPI.GetAccessToken(ctx, projectID, region, instanceID, accessTokenID).Execute()
if err != nil {
var oapiErr *oapierror.GenericOpenAPIError
ok := errors.As(err, &oapiErr)
Expand Down Expand Up @@ -362,15 +356,15 @@ func (r *logsAccessTokenResource) Update(ctx context.Context, req resource.Updat
return
}

err = r.client.UpdateAccessToken(ctx, projectID, region, instanceID, accessTokenID).UpdateAccessTokenPayload(*payload).Execute()
err = r.client.DefaultAPI.UpdateAccessToken(ctx, projectID, region, instanceID, accessTokenID).UpdateAccessTokenPayload(*payload).Execute()
if err != nil {
core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating Logs access token", fmt.Sprintf("Calling API: %v", err))
return
}

ctx = core.LogResponse(ctx)

accessTokenResponse, err := r.client.GetAccessToken(ctx, projectID, region, instanceID, accessTokenID).Execute()
accessTokenResponse, err := r.client.DefaultAPI.GetAccessToken(ctx, projectID, region, instanceID, accessTokenID).Execute()
if err != nil {
core.LogAndAddError(ctx, &resp.Diagnostics, "Error updating Logs access token", fmt.Sprintf("Calling API: %v", err))
return
Expand Down Expand Up @@ -412,7 +406,7 @@ func (r *logsAccessTokenResource) Delete(ctx context.Context, req resource.Delet
ctx = tflog.SetField(ctx, "instance_id", instanceID)
ctx = tflog.SetField(ctx, "access_token_id", accessTokenID)

err := r.client.DeleteAccessToken(ctx, projectID, region, instanceID, accessTokenID).Execute()
err := r.client.DefaultAPI.DeleteAccessToken(ctx, projectID, region, instanceID, accessTokenID).Execute()
if err != nil {
core.LogAndAddError(ctx, &resp.Diagnostics, "Error deleting Logs access token", fmt.Sprintf("Calling API: %v", err))
return
Expand Down Expand Up @@ -449,16 +443,16 @@ func toCreatePayload(ctx context.Context, diagnostics diag.Diagnostics, model *M

payload := &logs.CreateAccessTokenPayload{
Description: conversion.StringValueToPointer(model.Description),
DisplayName: conversion.StringValueToPointer(model.DisplayName),
Lifetime: conversion.Int64ValueToPointer(model.Lifetime),
DisplayName: model.DisplayName.ValueString(),
Lifetime: conversion.Int32ValueToPointer(model.Lifetime),
}

if !(tfutils.IsUndefined(model.Permissions)) {
var permissions []string
permissionDiags := model.Permissions.ElementsAs(ctx, &permissions, false)
diagnostics.Append(permissionDiags...)
if !permissionDiags.HasError() {
payload.Permissions = &permissions
payload.Permissions = permissions
}
}

Expand All @@ -476,20 +470,20 @@ func mapFields(ctx context.Context, accessToken *logs.AccessToken, model *Model)
var accessTokenID string
if model.AccessTokenID.ValueString() != "" {
accessTokenID = model.AccessTokenID.ValueString()
} else if accessToken.Id != nil {
accessTokenID = *accessToken.Id
} else if accessToken.Id != "" {
accessTokenID = accessToken.Id
} else {
return fmt.Errorf("access token id not present")
}

model.ID = tfutils.BuildInternalTerraformId(model.ProjectID.ValueString(), model.Region.ValueString(), model.InstanceID.ValueString(), accessTokenID)
model.AccessTokenID = types.StringValue(accessTokenID)
model.Region = types.StringValue(model.Region.ValueString())
model.Creator = types.StringPointerValue(accessToken.Creator)
model.Creator = types.StringValue(accessToken.Creator)
model.Description = types.StringPointerValue(accessToken.Description)
model.DisplayName = types.StringPointerValue(accessToken.DisplayName)
model.Expires = types.BoolPointerValue(accessToken.Expires)
model.Status = types.StringValue(string(*accessToken.Status))
model.DisplayName = types.StringValue(accessToken.DisplayName)
model.Expires = types.BoolValue(accessToken.Expires)
model.Status = types.StringValue(accessToken.Status)

model.ValidUntil = types.StringNull()
if accessToken.ValidUntil != nil {
Expand All @@ -502,7 +496,7 @@ func mapFields(ctx context.Context, accessToken *logs.AccessToken, model *Model)

permissionList := types.ListNull(types.StringType)
var diags diag.Diagnostics
if accessToken.Permissions != nil && len(*accessToken.Permissions) > 0 {
if len(accessToken.Permissions) > 0 {
permissionList, diags = types.ListValueFrom(ctx, types.StringType, accessToken.Permissions)
if diags.HasError() {
return fmt.Errorf("mapping permissions: %w", core.DiagsToError(diags))
Expand Down
36 changes: 21 additions & 15 deletions stackit/internal/services/logs/accesstoken/resource_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,15 @@ import (
"github.com/hashicorp/terraform-plugin-framework/diag"
"github.com/hashicorp/terraform-plugin-framework/types"
"github.com/stackitcloud/stackit-sdk-go/core/utils"
"github.com/stackitcloud/stackit-sdk-go/services/logs"
logs "github.com/stackitcloud/stackit-sdk-go/services/logs/v1api"
)

var testTime = time.Now()

func fixtureAccessToken(mods ...func(accessToken *logs.AccessToken)) *logs.AccessToken {
accessToken := &logs.AccessToken{
Id: utils.Ptr("atid"),
Status: utils.Ptr(logs.ACCESSTOKENSTATUS_ACTIVE),
Id: "atid",
Status: "active",
}
for _, mod := range mods {
mod(accessToken)
Expand All @@ -39,9 +39,9 @@ func fixtureModel(mods ...func(model *Model)) *Model {
DisplayName: types.String{},
Expires: types.Bool{},
ValidUntil: types.String{},
Lifetime: types.Int64{},
Lifetime: types.Int32{},
Permissions: types.ListNull(types.StringType),
Status: types.StringValue(string(logs.ACCESSTOKENSTATUS_ACTIVE)),
Status: types.StringValue("active"),
}
for _, mod := range mods {
mod(model)
Expand All @@ -58,18 +58,24 @@ func TestMapFields(t *testing.T) {
}{
{
description: "min values",
input: fixtureAccessToken(),
expected: fixtureModel(),
input: fixtureAccessToken(func(accessToken *logs.AccessToken) {
accessToken.DisplayName = "display-name"
}),
expected: fixtureModel(func(model *Model) {
model.DisplayName = types.StringValue("display-name")
model.Creator = types.StringValue("")
model.Expires = types.BoolValue(false)
}),
},
{
description: "max values",
input: fixtureAccessToken(func(accessToken *logs.AccessToken) {
accessToken.Permissions = &[]string{"write"}
accessToken.Permissions = []string{"write"}
accessToken.AccessToken = utils.Ptr("")
accessToken.Description = utils.Ptr("description")
accessToken.DisplayName = utils.Ptr("display-name")
accessToken.Creator = utils.Ptr("testUser")
accessToken.Expires = utils.Ptr(false)
accessToken.DisplayName = "display-name"
accessToken.Creator = "testUser"
accessToken.Expires = false
accessToken.ValidUntil = utils.Ptr(testTime)
}),
expected: fixtureModel(func(model *Model) {
Expand Down Expand Up @@ -141,13 +147,13 @@ func TestToCreatePayload(t *testing.T) {
})
model.Description = types.StringValue("description")
model.DisplayName = types.StringValue("display-name")
model.Lifetime = types.Int64Value(7)
model.Lifetime = types.Int32Value(7)
}),
expected: &logs.CreateAccessTokenPayload{
Permissions: &[]string{"read", "write"},
Permissions: []string{"read", "write"},
Description: utils.Ptr("description"),
DisplayName: utils.Ptr("display-name"),
Lifetime: utils.Ptr(int64(7)),
DisplayName: "display-name",
Lifetime: utils.Ptr(int32(7)),
},
},
{
Expand Down
Loading
Loading