Skip to content

Commit bcbdd65

Browse files
Merge branch 'main' into feat/STACKITTPR-388_store_ids_opensearch
2 parents eca638f + e3c8e42 commit bcbdd65

9 files changed

Lines changed: 89 additions & 16 deletions

File tree

docs/data-sources/dns_zone.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ data "stackit_dns_zone" "example" {
2828

2929
### Optional
3030

31-
- `dns_name` (String) The zone name. E.g. `example.com`
31+
- `dns_name` (String) The zone name. E.g. `example.com` (must not end with a trailing dot).
3232
- `zone_id` (String) The zone ID.
3333

3434
### Read-Only

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ require (
2525
github.com/stackitcloud/stackit-sdk-go/services/modelserving v0.6.5
2626
github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.8
2727
github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.5
28-
github.com/stackitcloud/stackit-sdk-go/services/observability v0.16.3
28+
github.com/stackitcloud/stackit-sdk-go/services/observability v0.17.0
2929
github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.6
3030
github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.3.5
3131
github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.26.0

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,8 +179,8 @@ github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.8 h1:S7t4wcT6SN
179179
github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.8/go.mod h1:CdrhFUsBO7/iJleCc2yQjDChIbG6YaxKNBQRNCjgcF4=
180180
github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.5 h1:4gpvB6t7d2lLjInoTxcvjL9jCpBl5EDfYe5yUtR1MvA=
181181
github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.5/go.mod h1:Bdcd59sRySyhfSUCy+5BNkp5w9PECmrywdvt+ORMKnI=
182-
github.com/stackitcloud/stackit-sdk-go/services/observability v0.16.3 h1:J/R6iBALMiNpg+JDEx1adH50TM4UTF/KBYFuHENMKIs=
183-
github.com/stackitcloud/stackit-sdk-go/services/observability v0.16.3/go.mod h1:9KdrXC5JS30Ay3mR0adb3vNdhca+qxiy/cPF5P4wehQ=
182+
github.com/stackitcloud/stackit-sdk-go/services/observability v0.17.0 h1:LGwCvvST0fwUgZ6bOxYIfu45qqTgv421ZS07UhKjZL8=
183+
github.com/stackitcloud/stackit-sdk-go/services/observability v0.17.0/go.mod h1:9KdrXC5JS30Ay3mR0adb3vNdhca+qxiy/cPF5P4wehQ=
184184
github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.6 h1:oTVx1+O177Ojn8OvXIOUbRSwtx7L59jhxDPrZEQFOfQ=
185185
github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.6/go.mod h1:6ZBeCCY6qG8w1oK7osf61Egyv3mp7Ahv6GDGxiarDGo=
186186
github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.3.5 h1:H67e3KnHQx954yI8fuQmxXwRf/myqAdLg2KvxImp00g=

stackit/internal/services/dns/dns_acc_test.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,20 @@ func TestAccDnsMinResource(t *testing.T) {
9393
ConfigVariables: configVarsInvalid(testConfigVarsMin),
9494
ExpectError: regexp.MustCompile(`not a valid dns name. Need at least two levels`),
9595
},
96+
// Creation fail: trailing dot is rejected on purpose
97+
{
98+
Config: resourceMinConfig,
99+
ConfigVariables: func() config.Variables {
100+
vars := maps.Clone(testConfigVarsMin)
101+
102+
// Ensure it ends with a dot (even if the random value already had one, be explicit)
103+
base := testutil.ConvertConfigVariable(vars["dns_name"])
104+
vars["dns_name"] = config.StringVariable(base + ".")
105+
106+
return vars
107+
}(),
108+
ExpectError: regexp.MustCompile(`dns_name must not end with a trailing dot`),
109+
},
96110
// creation
97111
{
98112
Config: resourceMinConfig,

stackit/internal/services/dns/zone/datasource.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"net/http"
77

88
"github.com/hashicorp/terraform-plugin-framework-validators/datasourcevalidator"
9+
"github.com/hashicorp/terraform-plugin-framework-validators/stringvalidator"
910
"github.com/hashicorp/terraform-plugin-framework/path"
1011
"github.com/stackitcloud/terraform-provider-stackit/stackit/internal/conversion"
1112
dnsUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/dns/utils"
@@ -95,8 +96,16 @@ func (d *zoneDataSource) Schema(_ context.Context, _ datasource.SchemaRequest, r
9596
Computed: true,
9697
},
9798
"dns_name": schema.StringAttribute{
98-
Description: "The zone name. E.g. `example.com`",
99+
Description: "The zone name. E.g. `example.com` (must not end with a trailing dot).",
99100
Optional: true,
101+
Validators: []validator.String{
102+
stringvalidator.LengthAtLeast(1),
103+
stringvalidator.LengthAtMost(253),
104+
stringvalidator.RegexMatches(
105+
dnsNameNoTrailingDotRegex,
106+
"dns_name must not end with a trailing dot",
107+
),
108+
},
100109
},
101110
"description": schema.StringAttribute{
102111
Description: "Description of the zone.",

stackit/internal/services/dns/zone/resource.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"fmt"
66
"math"
7+
"regexp"
78
"strings"
89

910
dnsUtils "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/services/dns/utils"
@@ -36,6 +37,9 @@ var (
3637
_ resource.ResourceWithImportState = &zoneResource{}
3738
)
3839

40+
// dnsNameNoTrailingDotRegex defines the zone dns_name without trailing dot
41+
var dnsNameNoTrailingDotRegex = regexp.MustCompile(`^.*[^.]$`)
42+
3943
type Model struct {
4044
Id types.String `tfsdk:"id"` // needed by TF
4145
ZoneId types.String `tfsdk:"zone_id"`
@@ -144,6 +148,10 @@ func (r *zoneResource) Schema(_ context.Context, _ resource.SchemaRequest, resp
144148
Validators: []validator.String{
145149
stringvalidator.LengthAtLeast(1),
146150
stringvalidator.LengthAtMost(253),
151+
stringvalidator.RegexMatches(
152+
dnsNameNoTrailingDotRegex,
153+
"dns_name must not end with a trailing dot",
154+
),
147155
},
148156
},
149157
"description": schema.StringAttribute{

stackit/internal/services/dns/zone/resource_test.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -435,3 +435,45 @@ func TestToPayloadUpdate(t *testing.T) {
435435
})
436436
}
437437
}
438+
439+
func TestDnsNameNoTrailingDot(t *testing.T) {
440+
tests := []struct {
441+
description string
442+
input string
443+
match bool
444+
}{
445+
{
446+
"normal domain without trailing dot",
447+
"example.com",
448+
true,
449+
},
450+
{
451+
"single layer without trailing dot",
452+
"example",
453+
true,
454+
},
455+
{
456+
"domain with trailing dot",
457+
"example.com.",
458+
false,
459+
},
460+
{
461+
"only trailing dot",
462+
".",
463+
false,
464+
},
465+
{
466+
"single layer with trailing dot",
467+
"example.",
468+
false,
469+
},
470+
}
471+
for _, tt := range tests {
472+
t.Run(tt.description, func(t *testing.T) {
473+
got := dnsNameNoTrailingDotRegex.MatchString(tt.input)
474+
if got != tt.match {
475+
t.Fatalf("dnsNameNoTrailingDotRegex.MatchString(%q) = %v, want %v", tt.input, got, tt.match)
476+
}
477+
})
478+
}
479+
}

stackit/internal/services/observability/scrapeconfig/resource.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -728,15 +728,15 @@ func toCreatePayload(ctx context.Context, model *Model, saml2Model *saml2Model,
728728
}
729729

730730
if sc.BasicAuth == nil && !basicAuthModel.Username.IsNull() && !basicAuthModel.Password.IsNull() {
731-
sc.BasicAuth = &observability.CreateScrapeConfigPayloadBasicAuth{
731+
sc.BasicAuth = &observability.PartialUpdateScrapeConfigsRequestInnerBasicAuth{
732732
Username: conversion.StringValueToPointer(basicAuthModel.Username),
733733
Password: conversion.StringValueToPointer(basicAuthModel.Password),
734734
}
735735
}
736736

737-
t := make([]observability.CreateScrapeConfigPayloadStaticConfigsInner, len(targetsModel))
737+
t := make([]observability.PartialUpdateScrapeConfigsRequestInnerStaticConfigsInner, len(targetsModel))
738738
for i, target := range targetsModel {
739-
ti := observability.CreateScrapeConfigPayloadStaticConfigsInner{}
739+
ti := observability.PartialUpdateScrapeConfigsRequestInnerStaticConfigsInner{}
740740

741741
urls := []string{}
742742
diags := target.URLs.ElementsAs(ctx, &urls, false)
@@ -817,7 +817,7 @@ func toUpdatePayload(ctx context.Context, model *Model, saml2Model *saml2Model,
817817
}
818818

819819
if sc.BasicAuth == nil && !basicAuthModel.Username.IsNull() && !basicAuthModel.Password.IsNull() {
820-
sc.BasicAuth = &observability.CreateScrapeConfigPayloadBasicAuth{
820+
sc.BasicAuth = &observability.PartialUpdateScrapeConfigsRequestInnerBasicAuth{
821821
Username: conversion.StringValueToPointer(basicAuthModel.Username),
822822
Password: conversion.StringValueToPointer(basicAuthModel.Password),
823823
}

stackit/internal/services/observability/scrapeconfig/resource_test.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ func TestToCreatePayload(t *testing.T) {
167167
ScrapeInterval: utils.Ptr("5m"),
168168
ScrapeTimeout: utils.Ptr("2m"),
169169
SampleLimit: utils.Ptr(float64(5000)),
170-
StaticConfigs: &[]observability.CreateScrapeConfigPayloadStaticConfigsInner{},
170+
StaticConfigs: &[]observability.PartialUpdateScrapeConfigsRequestInnerStaticConfigsInner{},
171171
Params: &map[string]any{"saml2": []string{"enabled"}},
172172
},
173173
true,
@@ -192,7 +192,7 @@ func TestToCreatePayload(t *testing.T) {
192192
ScrapeInterval: utils.Ptr("5m"),
193193
ScrapeTimeout: utils.Ptr("2m"),
194194
SampleLimit: utils.Ptr(float64(5000)),
195-
StaticConfigs: &[]observability.CreateScrapeConfigPayloadStaticConfigsInner{},
195+
StaticConfigs: &[]observability.PartialUpdateScrapeConfigsRequestInnerStaticConfigsInner{},
196196
},
197197
true,
198198
},
@@ -216,7 +216,7 @@ func TestToCreatePayload(t *testing.T) {
216216
ScrapeInterval: utils.Ptr("5m"),
217217
ScrapeTimeout: utils.Ptr("2m"),
218218
SampleLimit: utils.Ptr(float64(5000)),
219-
StaticConfigs: &[]observability.CreateScrapeConfigPayloadStaticConfigsInner{},
219+
StaticConfigs: &[]observability.PartialUpdateScrapeConfigsRequestInnerStaticConfigsInner{},
220220
},
221221
true,
222222
},
@@ -235,7 +235,7 @@ func TestToCreatePayload(t *testing.T) {
235235
&observability.CreateScrapeConfigPayload{
236236
MetricsPath: utils.Ptr("/metrics"),
237237
JobName: utils.Ptr("Name"),
238-
BasicAuth: &observability.CreateScrapeConfigPayloadBasicAuth{
238+
BasicAuth: &observability.PartialUpdateScrapeConfigsRequestInnerBasicAuth{
239239
Username: utils.Ptr("u"),
240240
Password: utils.Ptr("p"),
241241
},
@@ -244,7 +244,7 @@ func TestToCreatePayload(t *testing.T) {
244244
ScrapeInterval: utils.Ptr("5m"),
245245
ScrapeTimeout: utils.Ptr("2m"),
246246
SampleLimit: utils.Ptr(float64(5000)),
247-
StaticConfigs: &[]observability.CreateScrapeConfigPayloadStaticConfigsInner{},
247+
StaticConfigs: &[]observability.PartialUpdateScrapeConfigsRequestInnerStaticConfigsInner{},
248248
Params: &map[string]any{"saml2": []string{"enabled"}},
249249
},
250250
true,
@@ -274,7 +274,7 @@ func TestToCreatePayload(t *testing.T) {
274274
&observability.CreateScrapeConfigPayload{
275275
MetricsPath: utils.Ptr("/metrics"),
276276
JobName: utils.Ptr("Name"),
277-
StaticConfigs: &[]observability.CreateScrapeConfigPayloadStaticConfigsInner{
277+
StaticConfigs: &[]observability.PartialUpdateScrapeConfigsRequestInnerStaticConfigsInner{
278278
{
279279
Targets: &[]string{"url1"},
280280
Labels: &map[string]interface{}{"k1": "v1"},
@@ -415,7 +415,7 @@ func TestToUpdatePayload(t *testing.T) {
415415
[]targetModel{},
416416
&observability.UpdateScrapeConfigPayload{
417417
MetricsPath: utils.Ptr("/metrics"),
418-
BasicAuth: &observability.CreateScrapeConfigPayloadBasicAuth{
418+
BasicAuth: &observability.PartialUpdateScrapeConfigsRequestInnerBasicAuth{
419419
Username: utils.Ptr("u"),
420420
Password: utils.Ptr("p"),
421421
},

0 commit comments

Comments
 (0)