Skip to content

Commit 07b8132

Browse files
authored
[security_monitoring_suppression] Add suppression tags (#3327)
update api client add suppression tags update docs add test Co-authored-by: mael.gaonach <[email protected]>
1 parent 9368331 commit 07b8132

19 files changed

+1010
-287
lines changed

datadog/fwprovider/data_source_security_monitoring_suppression.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ type securityMonitoringSuppressionDataSourceItem struct {
2828
RuleQuery types.String `tfsdk:"rule_query"`
2929
SuppressionQuery types.String `tfsdk:"suppression_query"`
3030
DataExclusionQuery types.String `tfsdk:"data_exclusion_query"`
31+
Tags types.List `tfsdk:"tags"`
3132
}
3233

3334
type securityMonitoringSuppressionsDataSourceModel struct {
@@ -97,6 +98,13 @@ func (r *securityMonitoringSuppressionDataSource) Read(ctx context.Context, requ
9798
expirationDate := time.UnixMilli(*attributes.ExpirationDate).Format(time.RFC3339)
9899
suppressionModel.ExpirationDate = types.StringValue(expirationDate)
99100
}
101+
if attributes.Tags == nil || len(attributes.Tags) == 0 {
102+
suppressionModel.Tags = types.ListNull(types.StringType)
103+
} else {
104+
tags, diags := types.ListValueFrom(ctx, types.StringType, attributes.Tags)
105+
suppressionModel.Tags = tags
106+
response.Diagnostics.Append(diags...)
107+
}
100108

101109
suppressionIds[idx] = suppression.GetId()
102110
suppressions[idx] = suppressionModel
@@ -136,6 +144,7 @@ func (*securityMonitoringSuppressionDataSource) Schema(_ context.Context, _ data
136144
"rule_query": types.StringType,
137145
"suppression_query": types.StringType,
138146
"data_exclusion_query": types.StringType,
147+
"tags": types.ListType{ElemType: types.StringType},
139148
},
140149
},
141150
},

datadog/fwprovider/resource_datadog_security_monitoring_suppression.go

Lines changed: 36 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ type securityMonitoringSuppressionModel struct {
3232
SuppressionQuery types.String `tfsdk:"suppression_query"`
3333
DataExclusionQuery types.String `tfsdk:"data_exclusion_query"`
3434
Validate types.Bool `tfsdk:"validate"`
35+
Tags types.List `tfsdk:"tags"`
3536
}
3637

3738
type securityMonitoringSuppressionResource struct {
@@ -98,6 +99,11 @@ func (r *securityMonitoringSuppressionResource) Schema(_ context.Context, _ reso
9899
Default: booldefault.StaticBool(true),
99100
Description: "Whether to validate the suppression rule during `terraform plan`. When set to `true`, the rule is validated against Datadog's suppression validation endpoint.",
100101
},
102+
"tags": schema.ListAttribute{
103+
Optional: true,
104+
ElementType: types.StringType,
105+
Description: "A list of tags associated with the suppression rule.",
106+
},
101107
},
102108
}
103109
}
@@ -113,7 +119,7 @@ func (r *securityMonitoringSuppressionResource) Create(ctx context.Context, requ
113119
return
114120
}
115121

116-
suppressionPayload, err := r.buildCreateSecurityMonitoringSuppressionPayload(&state)
122+
suppressionPayload, err := r.buildCreateSecurityMonitoringSuppressionPayload(&state, ctx)
117123

118124
if err != nil {
119125
response.Diagnostics.AddError("error while parsing resource", err.Error())
@@ -181,7 +187,7 @@ func (r *securityMonitoringSuppressionResource) Update(ctx context.Context, requ
181187
updateStartDate := plan.StartDate != state.StartDate
182188
updateExpirationDate := plan.ExpirationDate != state.ExpirationDate
183189

184-
suppressionPayload, err := r.buildUpdateSecurityMonitoringSuppressionPayload(&plan, updateStartDate, updateExpirationDate)
190+
suppressionPayload, err := r.buildUpdateSecurityMonitoringSuppressionPayload(&plan, ctx, updateStartDate, updateExpirationDate)
185191

186192
if err != nil {
187193
response.Diagnostics.AddError("error while parsing resource", err.Error())
@@ -268,7 +274,7 @@ func (r *securityMonitoringSuppressionResource) ModifyPlan(ctx context.Context,
268274
}
269275
}
270276

271-
suppressionPayload, err := r.buildCreateSecurityMonitoringSuppressionPayload(&newConfig)
277+
suppressionPayload, err := r.buildCreateSecurityMonitoringSuppressionPayload(&newConfig, ctx)
272278
if err != nil {
273279
response.Diagnostics.AddError("error while building suppression payload for validation", err.Error())
274280
return
@@ -282,8 +288,8 @@ func (r *securityMonitoringSuppressionResource) ModifyPlan(ctx context.Context,
282288
}
283289
}
284290

285-
func (r *securityMonitoringSuppressionResource) buildCreateSecurityMonitoringSuppressionPayload(state *securityMonitoringSuppressionModel) (*datadogV2.SecurityMonitoringSuppressionCreateRequest, error) {
286-
name, description, enabled, startDate, expirationDate, ruleQuery, suppressionQuery, dataExclusionQuery, err := r.extractSuppressionAttributesFromResource(state)
291+
func (r *securityMonitoringSuppressionResource) buildCreateSecurityMonitoringSuppressionPayload(state *securityMonitoringSuppressionModel, ctx context.Context) (*datadogV2.SecurityMonitoringSuppressionCreateRequest, error) {
292+
name, description, enabled, startDate, expirationDate, ruleQuery, suppressionQuery, dataExclusionQuery, tags, err := r.extractSuppressionAttributesFromResource(state, ctx)
287293

288294
if err != nil {
289295
return nil, err
@@ -295,13 +301,14 @@ func (r *securityMonitoringSuppressionResource) buildCreateSecurityMonitoringSup
295301
attributes.Description = description
296302
attributes.StartDate = startDate
297303
attributes.ExpirationDate = expirationDate
304+
attributes.Tags = tags
298305

299306
data := datadogV2.NewSecurityMonitoringSuppressionCreateData(*attributes, datadogV2.SECURITYMONITORINGSUPPRESSIONTYPE_SUPPRESSIONS)
300307
return datadogV2.NewSecurityMonitoringSuppressionCreateRequest(*data), nil
301308
}
302309

303-
func (r *securityMonitoringSuppressionResource) buildUpdateSecurityMonitoringSuppressionPayload(state *securityMonitoringSuppressionModel, updateStartDate bool, updateExpirationDate bool) (*datadogV2.SecurityMonitoringSuppressionUpdateRequest, error) {
304-
name, description, enabled, startDate, expirationDate, ruleQuery, suppressionQuery, dataExclusionQuery, err := r.extractSuppressionAttributesFromResource(state)
310+
func (r *securityMonitoringSuppressionResource) buildUpdateSecurityMonitoringSuppressionPayload(state *securityMonitoringSuppressionModel, ctx context.Context, updateStartDate bool, updateExpirationDate bool) (*datadogV2.SecurityMonitoringSuppressionUpdateRequest, error) {
311+
name, description, enabled, startDate, expirationDate, ruleQuery, suppressionQuery, dataExclusionQuery, tags, err := r.extractSuppressionAttributesFromResource(state, ctx)
305312

306313
if err != nil {
307314
return nil, err
@@ -339,11 +346,17 @@ func (r *securityMonitoringSuppressionResource) buildUpdateSecurityMonitoringSup
339346
attributes.SetDataExclusionQuery("")
340347
}
341348

349+
if tags != nil {
350+
attributes.SetTags(tags)
351+
} else {
352+
attributes.SetTags(make([]string, 0))
353+
}
354+
342355
data := datadogV2.NewSecurityMonitoringSuppressionUpdateData(*attributes, datadogV2.SECURITYMONITORINGSUPPRESSIONTYPE_SUPPRESSIONS)
343356
return datadogV2.NewSecurityMonitoringSuppressionUpdateRequest(*data), nil
344357
}
345358

346-
func (r *securityMonitoringSuppressionResource) extractSuppressionAttributesFromResource(state *securityMonitoringSuppressionModel) (string, *string, bool, *int64, *int64, string, *string, *string, error) {
359+
func (r *securityMonitoringSuppressionResource) extractSuppressionAttributesFromResource(state *securityMonitoringSuppressionModel, ctx context.Context) (string, *string, bool, *int64, *int64, string, *string, *string, []string, error) {
347360
// Mandatory fields
348361

349362
name := state.Name.ValueString()
@@ -362,7 +375,7 @@ func (r *securityMonitoringSuppressionResource) extractSuppressionAttributesFrom
362375
startDateTime, err := time.Parse(time.RFC3339, *tfStartDate)
363376

364377
if err != nil {
365-
return "", nil, false, nil, nil, "", nil, nil, err
378+
return "", nil, false, nil, nil, "", nil, nil, nil, err
366379
}
367380

368381
startDateTimestamp := startDateTime.UnixMilli()
@@ -376,15 +389,21 @@ func (r *securityMonitoringSuppressionResource) extractSuppressionAttributesFrom
376389
expirationDateTime, err := time.Parse(time.RFC3339, *tfExpirationDate)
377390

378391
if err != nil {
379-
return "", nil, false, nil, nil, "", nil, nil, err
392+
return "", nil, false, nil, nil, "", nil, nil, nil, err
380393
}
381394

382395
expirationDateTimestamp := expirationDateTime.UnixMilli()
383396
expirationDate = &expirationDateTimestamp
384397

385398
}
386399

387-
return name, description, enabled, startDate, expirationDate, ruleQuery, suppressionQuery, dataExclusionQuery, nil
400+
var tags []string
401+
if !state.Tags.IsNull() {
402+
tags = make([]string, 0)
403+
state.Tags.ElementsAs(ctx, &tags, false)
404+
}
405+
406+
return name, description, enabled, startDate, expirationDate, ruleQuery, suppressionQuery, dataExclusionQuery, tags, nil
388407
}
389408

390409
func (r *securityMonitoringSuppressionResource) updateStateFromResponse(ctx context.Context, state *securityMonitoringSuppressionModel, res *datadogV2.SecurityMonitoringSuppressionResponse) {
@@ -401,6 +420,12 @@ func (r *securityMonitoringSuppressionResource) updateStateFromResponse(ctx cont
401420
state.Description = types.StringValue(description)
402421
}
403422

423+
if attributes.GetTags() == nil || len(attributes.GetTags()) == 0 {
424+
state.Tags = types.ListNull(types.StringType)
425+
} else {
426+
state.Tags, _ = types.ListValueFrom(ctx, types.StringType, attributes.GetTags())
427+
}
428+
404429
state.Enabled = types.BoolValue(attributes.GetEnabled())
405430
state.RuleQuery = types.StringValue(attributes.GetRuleQuery())
406431
state.SuppressionQuery = types.StringValue(attributes.GetSuppressionQuery())
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2025-09-05T00:34:47.156489+02:00
1+
2025-11-14T13:30:51.56446+01:00

0 commit comments

Comments
 (0)