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
70 changes: 45 additions & 25 deletions internal/provider/model_issue_alert.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import (
"github.com/hashicorp/terraform-plugin-framework/attr"
"github.com/hashicorp/terraform-plugin-framework/diag"
"github.com/hashicorp/terraform-plugin-framework/types"
"github.com/jianyuan/go-utils/ptr"
"github.com/jianyuan/go-utils/sliceutils"
"github.com/jianyuan/terraform-provider-sentry/internal/apiclient"
"github.com/jianyuan/terraform-provider-sentry/internal/sentrydata"
Expand Down Expand Up @@ -1391,21 +1390,21 @@ func (m *IssueAlertActionModel) Fill(ctx context.Context, action apiclient.Proje
// Model

type IssueAlertModel struct {
Id types.String `tfsdk:"id"`
Organization types.String `tfsdk:"organization"`
Project types.String `tfsdk:"project"`
Name types.String `tfsdk:"name"`
Conditions sentrytypes.LossyJson `tfsdk:"conditions"`
Filters sentrytypes.LossyJson `tfsdk:"filters"`
Actions sentrytypes.LossyJson `tfsdk:"actions"`
ActionMatch types.String `tfsdk:"action_match"`
FilterMatch types.String `tfsdk:"filter_match"`
Frequency types.Int64 `tfsdk:"frequency"`
Environment types.String `tfsdk:"environment"`
Owner types.String `tfsdk:"owner"`
ConditionsV2 *[]IssueAlertConditionModel `tfsdk:"conditions_v2"`
FiltersV2 *[]IssueAlertFilterModel `tfsdk:"filters_v2"`
ActionsV2 *[]IssueAlertActionModel `tfsdk:"actions_v2"`
Id types.String `tfsdk:"id"`
Organization types.String `tfsdk:"organization"`
Project types.String `tfsdk:"project"`
Name types.String `tfsdk:"name"`
Conditions sentrytypes.LossyJson `tfsdk:"conditions"`
Filters sentrytypes.LossyJson `tfsdk:"filters"`
Actions sentrytypes.LossyJson `tfsdk:"actions"`
ActionMatch types.String `tfsdk:"action_match"`
FilterMatch types.String `tfsdk:"filter_match"`
Frequency types.Int64 `tfsdk:"frequency"`
Environment types.String `tfsdk:"environment"`
Owner types.String `tfsdk:"owner"`
ConditionsV2 types.List `tfsdk:"conditions_v2"`
FiltersV2 types.List `tfsdk:"filters_v2"`
ActionsV2 types.List `tfsdk:"actions_v2"`
}

func (m *IssueAlertModel) Fill(ctx context.Context, alert apiclient.ProjectRule) (diags diag.Diagnostics) {
Expand Down Expand Up @@ -1440,16 +1439,23 @@ func (m *IssueAlertModel) Fill(ctx context.Context, alert apiclient.ProjectRule)
diags.AddError("Invalid conditions", err.Error())
return
}
} else if m.ConditionsV2 != nil {
m.ConditionsV2 = ptr.Ptr(sliceutils.Map(func(condition apiclient.ProjectRuleCondition) IssueAlertConditionModel {
} else if !m.ConditionsV2.IsNull() {
conditions := sliceutils.Map(func(condition apiclient.ProjectRuleCondition) IssueAlertConditionModel {
var conditionModel IssueAlertConditionModel
diags.Append(conditionModel.Fill(ctx, condition)...)
return conditionModel
}, alert.Conditions))
}, alert.Conditions)

if diags.HasError() {
return
}

conditionsV2, d := types.ListValueFrom(ctx, issueAlertConditionV2ElemType, conditions)
diags.Append(d...)
if diags.HasError() {
return
}
m.ConditionsV2 = conditionsV2
}

if !m.Filters.IsNull() {
Expand All @@ -1458,16 +1464,23 @@ func (m *IssueAlertModel) Fill(ctx context.Context, alert apiclient.ProjectRule)
} else {
diags.AddError("Invalid filters", err.Error())
}
} else if m.FiltersV2 != nil {
m.FiltersV2 = ptr.Ptr(sliceutils.Map(func(filter apiclient.ProjectRuleFilter) IssueAlertFilterModel {
} else if !m.FiltersV2.IsNull() {
filters := sliceutils.Map(func(filter apiclient.ProjectRuleFilter) IssueAlertFilterModel {
var filterModel IssueAlertFilterModel
diags.Append(filterModel.Fill(ctx, filter)...)
return filterModel
}, alert.Filters))
}, alert.Filters)

if diags.HasError() {
return
}

filtersV2, d := types.ListValueFrom(ctx, issueAlertFilterV2ElemType, filters)
diags.Append(d...)
if diags.HasError() {
return
}
m.FiltersV2 = filtersV2
}

if !m.Actions.IsNull() {
Expand All @@ -1476,16 +1489,23 @@ func (m *IssueAlertModel) Fill(ctx context.Context, alert apiclient.ProjectRule)
} else {
diags.AddError("Invalid actions", err.Error())
}
} else if m.ActionsV2 != nil {
m.ActionsV2 = ptr.Ptr(sliceutils.Map(func(action apiclient.ProjectRuleAction) IssueAlertActionModel {
} else if !m.ActionsV2.IsNull() {
actions := sliceutils.Map(func(action apiclient.ProjectRuleAction) IssueAlertActionModel {
var actionModel IssueAlertActionModel
diags.Append(actionModel.Fill(ctx, action)...)
return actionModel
}, alert.Actions))
}, alert.Actions)

if diags.HasError() {
return
}

actionsV2, d := types.ListValueFrom(ctx, issueAlertActionV2ElemType, actions)
diags.Append(d...)
if diags.HasError() {
return
}
m.ActionsV2 = actionsV2
}

return
Expand Down
112 changes: 93 additions & 19 deletions internal/provider/resource_issue_alert.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,22 @@ var _ resource.ResourceWithConfigure = &IssueAlertResource{}
var _ resource.ResourceWithImportState = &IssueAlertResource{}
var _ resource.ResourceWithUpgradeState = &IssueAlertResource{}

var (
issueAlertConditionV2ElemType types.ObjectType
issueAlertFilterV2ElemType types.ObjectType
issueAlertActionV2ElemType types.ObjectType
)

func init() {
r := &IssueAlertResource{}
var resp resource.SchemaResponse
r.Schema(context.Background(), resource.SchemaRequest{}, &resp)

issueAlertConditionV2ElemType = resp.Schema.Attributes["conditions_v2"].(schema.ListNestedAttribute).NestedObject.Type().(types.ObjectType)
issueAlertFilterV2ElemType = resp.Schema.Attributes["filters_v2"].(schema.ListNestedAttribute).NestedObject.Type().(types.ObjectType)
issueAlertActionV2ElemType = resp.Schema.Attributes["actions_v2"].(schema.ListNestedAttribute).NestedObject.Type().(types.ObjectType)
}

func NewIssueAlertResource() resource.Resource {
return &IssueAlertResource{}
}
Expand Down Expand Up @@ -639,8 +655,14 @@ func (r *IssueAlertResource) ValidateConfig(ctx context.Context, req resource.Va
return
}

if data.ConditionsV2 != nil {
for i, item := range *data.ConditionsV2 {
if !data.ConditionsV2.IsNull() && !data.ConditionsV2.IsUnknown() {
var conditions []IssueAlertConditionModel
resp.Diagnostics.Append(data.ConditionsV2.ElementsAs(ctx, &conditions, false)...)
if resp.Diagnostics.HasError() {
return
}

for i, item := range conditions {
if _, diags := item.ToApi(ctx); diags.HasError() {
resp.Diagnostics.AddAttributeError(
path.Root("conditions_v2").AtListIndex(i),
Expand All @@ -651,8 +673,14 @@ func (r *IssueAlertResource) ValidateConfig(ctx context.Context, req resource.Va
}
}

if data.FiltersV2 != nil {
for i, item := range *data.FiltersV2 {
if !data.FiltersV2.IsNull() && !data.FiltersV2.IsUnknown() {
var filters []IssueAlertFilterModel
resp.Diagnostics.Append(data.FiltersV2.ElementsAs(ctx, &filters, false)...)
if resp.Diagnostics.HasError() {
return
}

for i, item := range filters {
if _, diags := item.ToApi(ctx); diags.HasError() {
resp.Diagnostics.AddAttributeError(
path.Root("filters_v2").AtListIndex(i),
Expand All @@ -671,16 +699,22 @@ func (r *IssueAlertResource) ValidateConfig(ctx context.Context, req resource.Va
"You must add an action for this alert to fire",
)
}
} else if data.ActionsV2 != nil {
if len(*data.ActionsV2) == 0 {
} else if !data.ActionsV2.IsNull() && !data.ActionsV2.IsUnknown() {
var actions []IssueAlertActionModel
resp.Diagnostics.Append(data.ActionsV2.ElementsAs(ctx, &actions, false)...)
if resp.Diagnostics.HasError() {
return
}

if len(actions) == 0 {
resp.Diagnostics.AddAttributeError(
path.Root("actions_v2"),
"Missing attribute configuration",
"You must add an action for this alert to fire",
)
}

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

if !data.Conditions.IsNull() {
resp.Diagnostics.Append(data.Conditions.Unmarshal(&body.Conditions)...)
} else if data.ConditionsV2 != nil {
} else if !data.ConditionsV2.IsNull() {
var conditions []IssueAlertConditionModel
resp.Diagnostics.Append(data.ConditionsV2.ElementsAs(ctx, &conditions, false)...)
if resp.Diagnostics.HasError() {
return
}

body.Conditions = []apiclient.ProjectRuleCondition{}
for i, item := range *data.ConditionsV2 {
for i, item := range conditions {
condition, diags := item.ToApi(ctx)
if diags.HasError() {
resp.Diagnostics.AddAttributeError(
Expand All @@ -732,9 +772,15 @@ func (r *IssueAlertResource) Create(ctx context.Context, req resource.CreateRequ

if !data.Filters.IsNull() {
resp.Diagnostics.Append(data.Filters.Unmarshal(&body.Filters)...)
} else if data.FiltersV2 != nil {
} else if !data.FiltersV2.IsNull() {
var filters []IssueAlertFilterModel
resp.Diagnostics.Append(data.FiltersV2.ElementsAs(ctx, &filters, false)...)
if resp.Diagnostics.HasError() {
return
}

body.Filters = []apiclient.ProjectRuleFilter{}
for i, item := range *data.FiltersV2 {
for i, item := range filters {
filter, diags := item.ToApi(ctx)
if diags.HasError() {
resp.Diagnostics.AddAttributeError(
Expand All @@ -752,9 +798,15 @@ func (r *IssueAlertResource) Create(ctx context.Context, req resource.CreateRequ

if !data.Actions.IsNull() {
resp.Diagnostics.Append(data.Actions.Unmarshal(&body.Actions)...)
} else if data.ActionsV2 != nil {
} else if !data.ActionsV2.IsNull() {
var actions []IssueAlertActionModel
resp.Diagnostics.Append(data.ActionsV2.ElementsAs(ctx, &actions, false)...)
if resp.Diagnostics.HasError() {
return
}

body.Actions = []apiclient.ProjectRuleAction{}
for i, item := range *data.ActionsV2 {
for i, item := range actions {
action, diags := item.ToApi(ctx)
if diags.HasError() {
resp.Diagnostics.AddAttributeError(
Expand Down Expand Up @@ -849,9 +901,15 @@ func (r *IssueAlertResource) Update(ctx context.Context, req resource.UpdateRequ

if !data.Conditions.IsNull() {
resp.Diagnostics.Append(data.Conditions.Unmarshal(&body.Conditions)...)
} else if data.ConditionsV2 != nil {
} else if !data.ConditionsV2.IsNull() {
var conditions []IssueAlertConditionModel
resp.Diagnostics.Append(data.ConditionsV2.ElementsAs(ctx, &conditions, false)...)
if resp.Diagnostics.HasError() {
return
}

body.Conditions = []apiclient.ProjectRuleCondition{}
for i, item := range *data.ConditionsV2 {
for i, item := range conditions {
condition, diags := item.ToApi(ctx)
if diags.HasError() {
resp.Diagnostics.AddAttributeError(
Expand All @@ -869,9 +927,15 @@ func (r *IssueAlertResource) Update(ctx context.Context, req resource.UpdateRequ

if !data.Filters.IsNull() {
resp.Diagnostics.Append(data.Filters.Unmarshal(&body.Filters)...)
} else if data.FiltersV2 != nil {
} else if !data.FiltersV2.IsNull() {
var filters []IssueAlertFilterModel
resp.Diagnostics.Append(data.FiltersV2.ElementsAs(ctx, &filters, false)...)
if resp.Diagnostics.HasError() {
return
}

body.Filters = []apiclient.ProjectRuleFilter{}
for i, item := range *data.FiltersV2 {
for i, item := range filters {
filter, diags := item.ToApi(ctx)
if diags.HasError() {
resp.Diagnostics.AddAttributeError(
Expand All @@ -889,9 +953,15 @@ func (r *IssueAlertResource) Update(ctx context.Context, req resource.UpdateRequ

if !data.Actions.IsNull() {
resp.Diagnostics.Append(data.Actions.Unmarshal(&body.Actions)...)
} else if data.ActionsV2 != nil {
} else if !data.ActionsV2.IsNull() {
var actions []IssueAlertActionModel
resp.Diagnostics.Append(data.ActionsV2.ElementsAs(ctx, &actions, false)...)
if resp.Diagnostics.HasError() {
return
}

body.Actions = []apiclient.ProjectRuleAction{}
for i, item := range *data.ActionsV2 {
for i, item := range actions {
action, diags := item.ToApi(ctx)
if diags.HasError() {
resp.Diagnostics.AddAttributeError(
Expand Down Expand Up @@ -1060,6 +1130,10 @@ func (r *IssueAlertResource) UpgradeState(ctx context.Context) map[int64]resourc
Environment: priorStateData.Environment,
}

upgradedStateData.ConditionsV2 = types.ListNull(issueAlertConditionV2ElemType)
upgradedStateData.FiltersV2 = types.ListNull(issueAlertFilterV2ElemType)
upgradedStateData.ActionsV2 = types.ListNull(issueAlertActionV2ElemType)

upgradedStateData.Conditions = sentrytypes.NewLossyJsonNull()
if !priorStateData.Conditions.IsNull() {
conditions := []map[string]string{}
Expand Down
Loading