Skip to content

Commit 2923621

Browse files
authored
Feat/stackittpr 20 region adjustments | tfp (migrate first service to new regions concept) (#664)
* feat: completed bucket and credential group * feat: fix linter warnings * feat: updated documentation * feat: updated to current version of the regional api * feat: implement review findings * feat: implement further review findings * fix: make sure region is stored for the data-source in the state
1 parent c4e25f5 commit 2923621

22 files changed

Lines changed: 503 additions & 104 deletions

docs/data-sources/objectstorage_bucket.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,12 @@ data "stackit_objectstorage_bucket" "example" {
2626

2727
- `name` (String) The bucket name. It must be DNS conform.
2828
- `project_id` (String) STACKIT Project ID to which the bucket is associated.
29+
- `region` (String) The resource region. If not defined, the provider region is used.
2930

3031
### Read-Only
3132

3233
- `id` (String) Terraform's internal data source identifier. It is structured as "`project_id`,`name`".
3334
- `url_path_style` (String)
3435
- `url_virtual_hosted_style` (String)
36+
37+

docs/data-sources/objectstorage_credential.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ data "stackit_objectstorage_credentials_group" "example" {
2828
- `credential_id` (String) The credential ID.
2929
- `credentials_group_id` (String) The credential group ID.
3030
- `project_id` (String) STACKIT Project ID to which the credential group is associated.
31+
- `region` (String) The resource region. If not defined, the provider region is used.
3132

3233
### Read-Only
3334

@@ -36,3 +37,5 @@ data "stackit_objectstorage_credentials_group" "example" {
3637
- `id` (String) Terraform's internal resource identifier. It is structured as "`project_id`,`credentials_group_id`,`credential_id`".
3738
- `name` (String)
3839
- `secret_access_key` (String, Sensitive)
40+
41+

docs/data-sources/objectstorage_credentials_group.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ data "stackit_objectstorage_credentials_group" "example" {
2525
### Required
2626

2727
- `project_id` (String) Object Storage Project ID to which the credentials group is associated.
28+
- `region` (String) The resource region. If not defined, the provider region is used.
2829

2930
### Optional
3031

@@ -35,3 +36,5 @@ data "stackit_objectstorage_credentials_group" "example" {
3536

3637
- `id` (String) Terraform's internal data source identifier. It is structured as "`project_id`,`credentials_group_id`".
3738
- `urn` (String) Credentials group uniform resource name (URN)
39+
40+

docs/resources/objectstorage_bucket.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,14 @@ resource "stackit_objectstorage_bucket" "example" {
2727
- `name` (String) The bucket name. It must be DNS conform.
2828
- `project_id` (String) STACKIT Project ID to which the bucket is associated.
2929

30+
### Optional
31+
32+
- `region` (String) The resource region. If not defined, the provider region is used.
33+
3034
### Read-Only
3135

3236
- `id` (String) Terraform's internal resource identifier. It is structured as "`project_id`,`name`".
3337
- `url_path_style` (String)
3438
- `url_virtual_hosted_style` (String)
39+
40+

docs/resources/objectstorage_credential.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ resource "stackit_objectstorage_credential" "example" {
3131
### Optional
3232

3333
- `expiration_timestamp` (String) Expiration timestamp, in RFC339 format without fractional seconds. Example: "2025-01-01T00:00:00Z". If not set, the credential never expires.
34+
- `region` (String) The resource region. If not defined, the provider region is used.
3435

3536
### Read-Only
3637

@@ -39,3 +40,5 @@ resource "stackit_objectstorage_credential" "example" {
3940
- `id` (String) Terraform's internal resource identifier. It is structured as "`project_id`,`credentials_group_id`,`credential_id`".
4041
- `name` (String)
4142
- `secret_access_key` (String, Sensitive)
43+
44+

docs/resources/objectstorage_credentials_group.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,14 @@ resource "stackit_objectstorage_credentials_group" "example" {
2727
- `name` (String) The credentials group's display name.
2828
- `project_id` (String) Project ID to which the credentials group is associated.
2929

30+
### Optional
31+
32+
- `region` (String) The resource region. If not defined, the provider region is used.
33+
3034
### Read-Only
3135

3236
- `credentials_group_id` (String) The credentials group ID
3337
- `id` (String) Terraform's internal data source identifier. It is structured as "`project_id`,`credentials_group_id`".
3438
- `urn` (String) Credentials group uniform resource name (URN)
39+
40+

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ require (
1919
github.com/stackitcloud/stackit-sdk-go/services/logme v0.20.2
2020
github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.20.1
2121
github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v0.17.0
22-
github.com/stackitcloud/stackit-sdk-go/services/objectstorage v0.11.1
22+
github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.0.0
2323
github.com/stackitcloud/stackit-sdk-go/services/observability v0.2.1
2424
github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.19.1
2525
github.com/stackitcloud/stackit-sdk-go/services/postgresflex v0.17.0

go.sum

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,8 @@ github.com/skeema/knownhosts v1.2.2 h1:Iug2P4fLmDw9f41PB6thxUkNUkJzB5i+1/exaj40L
153153
github.com/skeema/knownhosts v1.2.2/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo=
154154
github.com/stackitcloud/stackit-sdk-go/core v0.15.1 h1:hIj/k/JXEuYmud3VWo3lr7Cfj2hfl4gG9nUIzcaZ9pM=
155155
github.com/stackitcloud/stackit-sdk-go/core v0.15.1/go.mod h1:mDX1mSTsB3mP+tNBGcFNx6gH1mGBN4T+dVt+lcw7nlw=
156+
github.com/stackitcloud/stackit-sdk-go/core v0.15.2-0.20250204115447-63b21f25e380 h1:qy9kkEavIBFi11ztFnj6w1suZtzSnXUAo0bMwqDrLJQ=
157+
github.com/stackitcloud/stackit-sdk-go/core v0.15.2-0.20250204115447-63b21f25e380/go.mod h1:mDX1mSTsB3mP+tNBGcFNx6gH1mGBN4T+dVt+lcw7nlw=
156158
github.com/stackitcloud/stackit-sdk-go/services/argus v0.11.0 h1:JVEx/ouHB6PlwGzQa3ywyDym1HTWo3WgrxAyXprCnuM=
157159
github.com/stackitcloud/stackit-sdk-go/services/argus v0.11.0/go.mod h1:nVllQfYODhX1q3bgwVTLO7wHOp+8NMLiKbn3u/Dg5nU=
158160
github.com/stackitcloud/stackit-sdk-go/services/authorization v0.5.1 h1:MAB7z8Hr6nCNdPCiLy5uNOJB+1R/eYFseFNEQUYK7qc=
@@ -169,8 +171,8 @@ github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.20.1 h1:J+GLgfDIDnNpq
169171
github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.20.1/go.mod h1:nuZK6OXyZ4zlGsC1gZDj9+ajJzzFi9vVgSSRQlEJAqA=
170172
github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v0.17.0 h1:SXNkKaAsGOkr9C6bv2i7q3kucxL3kril+z2wnshlXK0=
171173
github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v0.17.0/go.mod h1:5hMtm08NrL+QcgKl94zUDrY7VEzKRcvCJOEOvENBxqc=
172-
github.com/stackitcloud/stackit-sdk-go/services/objectstorage v0.11.1 h1:Df3fTAHaVgyiiyp9LyTTQI8jXSVeGo49eW5ya4AATCY=
173-
github.com/stackitcloud/stackit-sdk-go/services/objectstorage v0.11.1/go.mod h1:V2LEHKyTaaiEBi9L3v62mNQ7xyJSred4OK+himLJOZQ=
174+
github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.0.0 h1:/0n2zcH1nMw2noroGhz0fgu2YqtNo9v3AsVhXMRtmtw=
175+
github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.0.0/go.mod h1:0XumGX33DT6ItyD8yMlogSPWvpIuoqN7RZBrpUBPX+k=
174176
github.com/stackitcloud/stackit-sdk-go/services/observability v0.2.1 h1:sIz4wJIz6/9Eh6nSoi2sQ+Ef53iOrFsqLKIp2oRkmgo=
175177
github.com/stackitcloud/stackit-sdk-go/services/observability v0.2.1/go.mod h1:okcRTrNDTI3d7MQcYJMliK0qoXeLq0b1wvZuEqgJIWE=
176178
github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.19.1 h1:hwRkCCUSWMhKTc7fLakL89V6+9xkxsFQlRthVmrvi1U=

stackit/internal/services/objectstorage/bucket/datasource.go

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"github.com/hashicorp/terraform-plugin-framework/schema/validator"
1010
"github.com/hashicorp/terraform-plugin-log/tflog"
1111
"github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core"
12+
"github.com/stackitcloud/terraform-provider-stackit/stackit/internal/utils"
1213
"github.com/stackitcloud/terraform-provider-stackit/stackit/internal/validate"
1314

1415
"github.com/hashicorp/terraform-plugin-framework/datasource/schema"
@@ -29,7 +30,8 @@ func NewBucketDataSource() datasource.DataSource {
2930

3031
// bucketDataSource is the data source implementation.
3132
type bucketDataSource struct {
32-
client *objectstorage.APIClient
33+
client *objectstorage.APIClient
34+
providerData core.ProviderData
3335
}
3436

3537
// Metadata returns the data source type name.
@@ -44,23 +46,23 @@ func (r *bucketDataSource) Configure(ctx context.Context, req datasource.Configu
4446
return
4547
}
4648

47-
providerData, ok := req.ProviderData.(core.ProviderData)
49+
var ok bool
50+
r.providerData, ok = req.ProviderData.(core.ProviderData)
4851
if !ok {
4952
core.LogAndAddError(ctx, &resp.Diagnostics, "Error configuring API client", fmt.Sprintf("Expected configure type stackit.ProviderData, got %T", req.ProviderData))
5053
return
5154
}
5255

5356
var apiClient *objectstorage.APIClient
5457
var err error
55-
if providerData.ObjectStorageCustomEndpoint != "" {
58+
if r.providerData.ObjectStorageCustomEndpoint != "" {
5659
apiClient, err = objectstorage.NewAPIClient(
57-
config.WithCustomAuth(providerData.RoundTripper),
58-
config.WithEndpoint(providerData.ObjectStorageCustomEndpoint),
60+
config.WithCustomAuth(r.providerData.RoundTripper),
61+
config.WithEndpoint(r.providerData.ObjectStorageCustomEndpoint),
5962
)
6063
} else {
6164
apiClient, err = objectstorage.NewAPIClient(
62-
config.WithCustomAuth(providerData.RoundTripper),
63-
config.WithRegion(providerData.Region),
65+
config.WithCustomAuth(r.providerData.RoundTripper),
6466
)
6567
}
6668

@@ -82,6 +84,7 @@ func (r *bucketDataSource) Schema(_ context.Context, _ datasource.SchemaRequest,
8284
"project_id": "STACKIT Project ID to which the bucket is associated.",
8385
"url_path_style": "URL in path style.",
8486
"url_virtual_hosted_style": "URL in virtual hosted style.",
87+
"region": "The resource region. If not defined, the provider region is used.",
8588
}
8689

8790
resp.Schema = schema.Schema{
@@ -112,6 +115,11 @@ func (r *bucketDataSource) Schema(_ context.Context, _ datasource.SchemaRequest,
112115
"url_virtual_hosted_style": schema.StringAttribute{
113116
Computed: true,
114117
},
118+
"region": schema.StringAttribute{
119+
// the region cannot be found automatically, so it has to be passed
120+
Optional: true,
121+
Description: descriptions["region"],
122+
},
115123
},
116124
}
117125
}
@@ -126,10 +134,18 @@ func (r *bucketDataSource) Read(ctx context.Context, req datasource.ReadRequest,
126134
}
127135
projectId := model.ProjectId.ValueString()
128136
bucketName := model.Name.ValueString()
137+
var region string
138+
if utils.IsUndefined(model.Region) {
139+
region = r.providerData.Region
140+
} else {
141+
region = model.Region.ValueString()
142+
}
143+
129144
ctx = tflog.SetField(ctx, "project_id", projectId)
130145
ctx = tflog.SetField(ctx, "name", bucketName)
146+
ctx = tflog.SetField(ctx, "region", region)
131147

132-
bucketResp, err := r.client.GetBucket(ctx, projectId, bucketName).Execute()
148+
bucketResp, err := r.client.GetBucket(ctx, projectId, region, bucketName).Execute()
133149
if err != nil {
134150
oapiErr, ok := err.(*oapierror.GenericOpenAPIError) //nolint:errorlint //complaining that error.As should be used to catch wrapped errors, but this error should not be wrapped
135151
if ok && oapiErr.StatusCode == http.StatusNotFound {
@@ -140,7 +156,7 @@ func (r *bucketDataSource) Read(ctx context.Context, req datasource.ReadRequest,
140156
}
141157

142158
// Map response body to schema
143-
err = mapFields(bucketResp, &model)
159+
err = mapFields(bucketResp, &model, region)
144160
if err != nil {
145161
core.LogAndAddError(ctx, &resp.Diagnostics, "Error reading bucket", fmt.Sprintf("Processing API payload: %v", err))
146162
return

0 commit comments

Comments
 (0)