Skip to content

Commit 6dd6934

Browse files
authored
fix: alert resource expressions support (#756)
1 parent e587c26 commit 6dd6934

File tree

4 files changed

+418
-44
lines changed

4 files changed

+418
-44
lines changed

internal/provider/model_issue_alert.go

Lines changed: 45 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import (
88
"github.com/hashicorp/terraform-plugin-framework/attr"
99
"github.com/hashicorp/terraform-plugin-framework/diag"
1010
"github.com/hashicorp/terraform-plugin-framework/types"
11-
"github.com/jianyuan/go-utils/ptr"
1211
"github.com/jianyuan/go-utils/sliceutils"
1312
"github.com/jianyuan/terraform-provider-sentry/internal/apiclient"
1413
"github.com/jianyuan/terraform-provider-sentry/internal/sentrydata"
@@ -1391,21 +1390,21 @@ func (m *IssueAlertActionModel) Fill(ctx context.Context, action apiclient.Proje
13911390
// Model
13921391

13931392
type IssueAlertModel struct {
1394-
Id types.String `tfsdk:"id"`
1395-
Organization types.String `tfsdk:"organization"`
1396-
Project types.String `tfsdk:"project"`
1397-
Name types.String `tfsdk:"name"`
1398-
Conditions sentrytypes.LossyJson `tfsdk:"conditions"`
1399-
Filters sentrytypes.LossyJson `tfsdk:"filters"`
1400-
Actions sentrytypes.LossyJson `tfsdk:"actions"`
1401-
ActionMatch types.String `tfsdk:"action_match"`
1402-
FilterMatch types.String `tfsdk:"filter_match"`
1403-
Frequency types.Int64 `tfsdk:"frequency"`
1404-
Environment types.String `tfsdk:"environment"`
1405-
Owner types.String `tfsdk:"owner"`
1406-
ConditionsV2 *[]IssueAlertConditionModel `tfsdk:"conditions_v2"`
1407-
FiltersV2 *[]IssueAlertFilterModel `tfsdk:"filters_v2"`
1408-
ActionsV2 *[]IssueAlertActionModel `tfsdk:"actions_v2"`
1393+
Id types.String `tfsdk:"id"`
1394+
Organization types.String `tfsdk:"organization"`
1395+
Project types.String `tfsdk:"project"`
1396+
Name types.String `tfsdk:"name"`
1397+
Conditions sentrytypes.LossyJson `tfsdk:"conditions"`
1398+
Filters sentrytypes.LossyJson `tfsdk:"filters"`
1399+
Actions sentrytypes.LossyJson `tfsdk:"actions"`
1400+
ActionMatch types.String `tfsdk:"action_match"`
1401+
FilterMatch types.String `tfsdk:"filter_match"`
1402+
Frequency types.Int64 `tfsdk:"frequency"`
1403+
Environment types.String `tfsdk:"environment"`
1404+
Owner types.String `tfsdk:"owner"`
1405+
ConditionsV2 types.List `tfsdk:"conditions_v2"`
1406+
FiltersV2 types.List `tfsdk:"filters_v2"`
1407+
ActionsV2 types.List `tfsdk:"actions_v2"`
14091408
}
14101409

14111410
func (m *IssueAlertModel) Fill(ctx context.Context, alert apiclient.ProjectRule) (diags diag.Diagnostics) {
@@ -1440,16 +1439,23 @@ func (m *IssueAlertModel) Fill(ctx context.Context, alert apiclient.ProjectRule)
14401439
diags.AddError("Invalid conditions", err.Error())
14411440
return
14421441
}
1443-
} else if m.ConditionsV2 != nil {
1444-
m.ConditionsV2 = ptr.Ptr(sliceutils.Map(func(condition apiclient.ProjectRuleCondition) IssueAlertConditionModel {
1442+
} else if !m.ConditionsV2.IsNull() {
1443+
conditions := sliceutils.Map(func(condition apiclient.ProjectRuleCondition) IssueAlertConditionModel {
14451444
var conditionModel IssueAlertConditionModel
14461445
diags.Append(conditionModel.Fill(ctx, condition)...)
14471446
return conditionModel
1448-
}, alert.Conditions))
1447+
}, alert.Conditions)
14491448

14501449
if diags.HasError() {
14511450
return
14521451
}
1452+
1453+
conditionsV2, d := types.ListValueFrom(ctx, issueAlertConditionV2ElemType, conditions)
1454+
diags.Append(d...)
1455+
if diags.HasError() {
1456+
return
1457+
}
1458+
m.ConditionsV2 = conditionsV2
14531459
}
14541460

14551461
if !m.Filters.IsNull() {
@@ -1458,16 +1464,23 @@ func (m *IssueAlertModel) Fill(ctx context.Context, alert apiclient.ProjectRule)
14581464
} else {
14591465
diags.AddError("Invalid filters", err.Error())
14601466
}
1461-
} else if m.FiltersV2 != nil {
1462-
m.FiltersV2 = ptr.Ptr(sliceutils.Map(func(filter apiclient.ProjectRuleFilter) IssueAlertFilterModel {
1467+
} else if !m.FiltersV2.IsNull() {
1468+
filters := sliceutils.Map(func(filter apiclient.ProjectRuleFilter) IssueAlertFilterModel {
14631469
var filterModel IssueAlertFilterModel
14641470
diags.Append(filterModel.Fill(ctx, filter)...)
14651471
return filterModel
1466-
}, alert.Filters))
1472+
}, alert.Filters)
1473+
1474+
if diags.HasError() {
1475+
return
1476+
}
14671477

1478+
filtersV2, d := types.ListValueFrom(ctx, issueAlertFilterV2ElemType, filters)
1479+
diags.Append(d...)
14681480
if diags.HasError() {
14691481
return
14701482
}
1483+
m.FiltersV2 = filtersV2
14711484
}
14721485

14731486
if !m.Actions.IsNull() {
@@ -1476,16 +1489,23 @@ func (m *IssueAlertModel) Fill(ctx context.Context, alert apiclient.ProjectRule)
14761489
} else {
14771490
diags.AddError("Invalid actions", err.Error())
14781491
}
1479-
} else if m.ActionsV2 != nil {
1480-
m.ActionsV2 = ptr.Ptr(sliceutils.Map(func(action apiclient.ProjectRuleAction) IssueAlertActionModel {
1492+
} else if !m.ActionsV2.IsNull() {
1493+
actions := sliceutils.Map(func(action apiclient.ProjectRuleAction) IssueAlertActionModel {
14811494
var actionModel IssueAlertActionModel
14821495
diags.Append(actionModel.Fill(ctx, action)...)
14831496
return actionModel
1484-
}, alert.Actions))
1497+
}, alert.Actions)
1498+
1499+
if diags.HasError() {
1500+
return
1501+
}
14851502

1503+
actionsV2, d := types.ListValueFrom(ctx, issueAlertActionV2ElemType, actions)
1504+
diags.Append(d...)
14861505
if diags.HasError() {
14871506
return
14881507
}
1508+
m.ActionsV2 = actionsV2
14891509
}
14901510

14911511
return

internal/provider/resource_issue_alert.go

Lines changed: 93 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,22 @@ var _ resource.ResourceWithConfigure = &IssueAlertResource{}
2929
var _ resource.ResourceWithImportState = &IssueAlertResource{}
3030
var _ resource.ResourceWithUpgradeState = &IssueAlertResource{}
3131

32+
var (
33+
issueAlertConditionV2ElemType types.ObjectType
34+
issueAlertFilterV2ElemType types.ObjectType
35+
issueAlertActionV2ElemType types.ObjectType
36+
)
37+
38+
func init() {
39+
r := &IssueAlertResource{}
40+
var resp resource.SchemaResponse
41+
r.Schema(context.Background(), resource.SchemaRequest{}, &resp)
42+
43+
issueAlertConditionV2ElemType = resp.Schema.Attributes["conditions_v2"].(schema.ListNestedAttribute).NestedObject.Type().(types.ObjectType)
44+
issueAlertFilterV2ElemType = resp.Schema.Attributes["filters_v2"].(schema.ListNestedAttribute).NestedObject.Type().(types.ObjectType)
45+
issueAlertActionV2ElemType = resp.Schema.Attributes["actions_v2"].(schema.ListNestedAttribute).NestedObject.Type().(types.ObjectType)
46+
}
47+
3248
func NewIssueAlertResource() resource.Resource {
3349
return &IssueAlertResource{}
3450
}
@@ -639,8 +655,14 @@ func (r *IssueAlertResource) ValidateConfig(ctx context.Context, req resource.Va
639655
return
640656
}
641657

642-
if data.ConditionsV2 != nil {
643-
for i, item := range *data.ConditionsV2 {
658+
if !data.ConditionsV2.IsNull() && !data.ConditionsV2.IsUnknown() {
659+
var conditions []IssueAlertConditionModel
660+
resp.Diagnostics.Append(data.ConditionsV2.ElementsAs(ctx, &conditions, false)...)
661+
if resp.Diagnostics.HasError() {
662+
return
663+
}
664+
665+
for i, item := range conditions {
644666
if _, diags := item.ToApi(ctx); diags.HasError() {
645667
resp.Diagnostics.AddAttributeError(
646668
path.Root("conditions_v2").AtListIndex(i),
@@ -651,8 +673,14 @@ func (r *IssueAlertResource) ValidateConfig(ctx context.Context, req resource.Va
651673
}
652674
}
653675

654-
if data.FiltersV2 != nil {
655-
for i, item := range *data.FiltersV2 {
676+
if !data.FiltersV2.IsNull() && !data.FiltersV2.IsUnknown() {
677+
var filters []IssueAlertFilterModel
678+
resp.Diagnostics.Append(data.FiltersV2.ElementsAs(ctx, &filters, false)...)
679+
if resp.Diagnostics.HasError() {
680+
return
681+
}
682+
683+
for i, item := range filters {
656684
if _, diags := item.ToApi(ctx); diags.HasError() {
657685
resp.Diagnostics.AddAttributeError(
658686
path.Root("filters_v2").AtListIndex(i),
@@ -671,16 +699,22 @@ func (r *IssueAlertResource) ValidateConfig(ctx context.Context, req resource.Va
671699
"You must add an action for this alert to fire",
672700
)
673701
}
674-
} else if data.ActionsV2 != nil {
675-
if len(*data.ActionsV2) == 0 {
702+
} else if !data.ActionsV2.IsNull() && !data.ActionsV2.IsUnknown() {
703+
var actions []IssueAlertActionModel
704+
resp.Diagnostics.Append(data.ActionsV2.ElementsAs(ctx, &actions, false)...)
705+
if resp.Diagnostics.HasError() {
706+
return
707+
}
708+
709+
if len(actions) == 0 {
676710
resp.Diagnostics.AddAttributeError(
677711
path.Root("actions_v2"),
678712
"Missing attribute configuration",
679713
"You must add an action for this alert to fire",
680714
)
681715
}
682716

683-
for i, item := range *data.ActionsV2 {
717+
for i, item := range actions {
684718
if _, diags := item.ToApi(ctx); diags.HasError() {
685719
resp.Diagnostics.AddAttributeError(
686720
path.Root("actions_v2").AtListIndex(i),
@@ -712,9 +746,15 @@ func (r *IssueAlertResource) Create(ctx context.Context, req resource.CreateRequ
712746

713747
if !data.Conditions.IsNull() {
714748
resp.Diagnostics.Append(data.Conditions.Unmarshal(&body.Conditions)...)
715-
} else if data.ConditionsV2 != nil {
749+
} else if !data.ConditionsV2.IsNull() {
750+
var conditions []IssueAlertConditionModel
751+
resp.Diagnostics.Append(data.ConditionsV2.ElementsAs(ctx, &conditions, false)...)
752+
if resp.Diagnostics.HasError() {
753+
return
754+
}
755+
716756
body.Conditions = []apiclient.ProjectRuleCondition{}
717-
for i, item := range *data.ConditionsV2 {
757+
for i, item := range conditions {
718758
condition, diags := item.ToApi(ctx)
719759
if diags.HasError() {
720760
resp.Diagnostics.AddAttributeError(
@@ -732,9 +772,15 @@ func (r *IssueAlertResource) Create(ctx context.Context, req resource.CreateRequ
732772

733773
if !data.Filters.IsNull() {
734774
resp.Diagnostics.Append(data.Filters.Unmarshal(&body.Filters)...)
735-
} else if data.FiltersV2 != nil {
775+
} else if !data.FiltersV2.IsNull() {
776+
var filters []IssueAlertFilterModel
777+
resp.Diagnostics.Append(data.FiltersV2.ElementsAs(ctx, &filters, false)...)
778+
if resp.Diagnostics.HasError() {
779+
return
780+
}
781+
736782
body.Filters = []apiclient.ProjectRuleFilter{}
737-
for i, item := range *data.FiltersV2 {
783+
for i, item := range filters {
738784
filter, diags := item.ToApi(ctx)
739785
if diags.HasError() {
740786
resp.Diagnostics.AddAttributeError(
@@ -752,9 +798,15 @@ func (r *IssueAlertResource) Create(ctx context.Context, req resource.CreateRequ
752798

753799
if !data.Actions.IsNull() {
754800
resp.Diagnostics.Append(data.Actions.Unmarshal(&body.Actions)...)
755-
} else if data.ActionsV2 != nil {
801+
} else if !data.ActionsV2.IsNull() {
802+
var actions []IssueAlertActionModel
803+
resp.Diagnostics.Append(data.ActionsV2.ElementsAs(ctx, &actions, false)...)
804+
if resp.Diagnostics.HasError() {
805+
return
806+
}
807+
756808
body.Actions = []apiclient.ProjectRuleAction{}
757-
for i, item := range *data.ActionsV2 {
809+
for i, item := range actions {
758810
action, diags := item.ToApi(ctx)
759811
if diags.HasError() {
760812
resp.Diagnostics.AddAttributeError(
@@ -849,9 +901,15 @@ func (r *IssueAlertResource) Update(ctx context.Context, req resource.UpdateRequ
849901

850902
if !data.Conditions.IsNull() {
851903
resp.Diagnostics.Append(data.Conditions.Unmarshal(&body.Conditions)...)
852-
} else if data.ConditionsV2 != nil {
904+
} else if !data.ConditionsV2.IsNull() {
905+
var conditions []IssueAlertConditionModel
906+
resp.Diagnostics.Append(data.ConditionsV2.ElementsAs(ctx, &conditions, false)...)
907+
if resp.Diagnostics.HasError() {
908+
return
909+
}
910+
853911
body.Conditions = []apiclient.ProjectRuleCondition{}
854-
for i, item := range *data.ConditionsV2 {
912+
for i, item := range conditions {
855913
condition, diags := item.ToApi(ctx)
856914
if diags.HasError() {
857915
resp.Diagnostics.AddAttributeError(
@@ -869,9 +927,15 @@ func (r *IssueAlertResource) Update(ctx context.Context, req resource.UpdateRequ
869927

870928
if !data.Filters.IsNull() {
871929
resp.Diagnostics.Append(data.Filters.Unmarshal(&body.Filters)...)
872-
} else if data.FiltersV2 != nil {
930+
} else if !data.FiltersV2.IsNull() {
931+
var filters []IssueAlertFilterModel
932+
resp.Diagnostics.Append(data.FiltersV2.ElementsAs(ctx, &filters, false)...)
933+
if resp.Diagnostics.HasError() {
934+
return
935+
}
936+
873937
body.Filters = []apiclient.ProjectRuleFilter{}
874-
for i, item := range *data.FiltersV2 {
938+
for i, item := range filters {
875939
filter, diags := item.ToApi(ctx)
876940
if diags.HasError() {
877941
resp.Diagnostics.AddAttributeError(
@@ -889,9 +953,15 @@ func (r *IssueAlertResource) Update(ctx context.Context, req resource.UpdateRequ
889953

890954
if !data.Actions.IsNull() {
891955
resp.Diagnostics.Append(data.Actions.Unmarshal(&body.Actions)...)
892-
} else if data.ActionsV2 != nil {
956+
} else if !data.ActionsV2.IsNull() {
957+
var actions []IssueAlertActionModel
958+
resp.Diagnostics.Append(data.ActionsV2.ElementsAs(ctx, &actions, false)...)
959+
if resp.Diagnostics.HasError() {
960+
return
961+
}
962+
893963
body.Actions = []apiclient.ProjectRuleAction{}
894-
for i, item := range *data.ActionsV2 {
964+
for i, item := range actions {
895965
action, diags := item.ToApi(ctx)
896966
if diags.HasError() {
897967
resp.Diagnostics.AddAttributeError(
@@ -1060,6 +1130,10 @@ func (r *IssueAlertResource) UpgradeState(ctx context.Context) map[int64]resourc
10601130
Environment: priorStateData.Environment,
10611131
}
10621132

1133+
upgradedStateData.ConditionsV2 = types.ListNull(issueAlertConditionV2ElemType)
1134+
upgradedStateData.FiltersV2 = types.ListNull(issueAlertFilterV2ElemType)
1135+
upgradedStateData.ActionsV2 = types.ListNull(issueAlertActionV2ElemType)
1136+
10631137
upgradedStateData.Conditions = sentrytypes.NewLossyJsonNull()
10641138
if !priorStateData.Conditions.IsNull() {
10651139
conditions := []map[string]string{}

0 commit comments

Comments
 (0)