|
1 | 1 | package newrelic
|
2 | 2 |
|
3 | 3 | import (
|
| 4 | + "context" |
| 5 | + "errors" |
4 | 6 | "fmt"
|
5 | 7 | "strconv"
|
6 | 8 | "strings"
|
@@ -72,6 +74,17 @@ func expandNrqlAlertConditionCreateInput(d *schema.ResourceData) (*alerts.NrqlCo
|
72 | 74 | }
|
73 | 75 | }
|
74 | 76 |
|
| 77 | + if conditionType == "baseline" { |
| 78 | + if attr, ok := d.GetOk("signal_seasonality"); ok { |
| 79 | + seasonality := alerts.NrqlSignalSeasonality(strings.ToUpper(attr.(string))) |
| 80 | + input.SignalSeasonality = &seasonality |
| 81 | + } else { |
| 82 | + // Null is equivalent to the default value of `NEW_RELIC_CALCULATION` in the API |
| 83 | + seasonality := alerts.NrqlSignalSeasonalities.NewRelicCalculation |
| 84 | + input.SignalSeasonality = &seasonality |
| 85 | + } |
| 86 | + } |
| 87 | + |
75 | 88 | if runbookURL, ok := d.GetOk("runbook_url"); ok {
|
76 | 89 | input.RunbookURL = runbookURL.(string)
|
77 | 90 | }
|
@@ -132,6 +145,18 @@ func expandNrqlAlertConditionUpdateInput(d *schema.ResourceData) (*alerts.NrqlCo
|
132 | 145 | }
|
133 | 146 | }
|
134 | 147 |
|
| 148 | + if conditionType == "baseline" { |
| 149 | + if attr, ok := d.GetOk("signal_seasonality"); ok { |
| 150 | + seasonality := alerts.NrqlSignalSeasonality(strings.ToUpper(attr.(string))) |
| 151 | + input.SignalSeasonality = &seasonality |
| 152 | + } else { |
| 153 | + // Null is equivalent to the default value of `NEW_RELIC_CALCULATION` in the API |
| 154 | + // so this effectively allows the user to null out the signal seasonality on update |
| 155 | + seasonality := alerts.NrqlSignalSeasonalities.NewRelicCalculation |
| 156 | + input.SignalSeasonality = &seasonality |
| 157 | + } |
| 158 | + } |
| 159 | + |
135 | 160 | if runbookURL, ok := d.GetOk("runbook_url"); ok {
|
136 | 161 | input.RunbookURL = runbookURL.(string)
|
137 | 162 | }
|
@@ -569,6 +594,10 @@ func flattenNrqlAlertCondition(accountID int, condition *alerts.NrqlAlertConditi
|
569 | 594 |
|
570 | 595 | if conditionType == "baseline" {
|
571 | 596 | _ = d.Set("baseline_direction", string(*condition.BaselineDirection))
|
| 597 | + |
| 598 | + if condition.SignalSeasonality != nil { |
| 599 | + _ = d.Set("signal_seasonality", string(*condition.SignalSeasonality)) |
| 600 | + } |
572 | 601 | }
|
573 | 602 |
|
574 | 603 | configuredNrql := d.Get("nrql.0").(map[string]interface{})
|
@@ -850,3 +879,41 @@ func getConfiguredTerms(configTerms []interface{}) []map[string]interface{} {
|
850 | 879 |
|
851 | 880 | return setTerms
|
852 | 881 | }
|
| 882 | + |
| 883 | +func validateNrqlConditionAttributes(ctx context.Context, d *schema.ResourceDiff, meta interface{}) error { |
| 884 | + var errorsList []error |
| 885 | + |
| 886 | + _, conditionType := d.GetChange("type") |
| 887 | + if conditionType != nil { |
| 888 | + isNotBaselineCondition := !strings.Contains(conditionType.(string), "baseline") |
| 889 | + if isNotBaselineCondition { |
| 890 | + err := validateSignalSeasonality(d) |
| 891 | + if err != nil { |
| 892 | + errorsList = append(errorsList, err) |
| 893 | + } |
| 894 | + } |
| 895 | + } |
| 896 | + |
| 897 | + if len(errorsList) == 0 { |
| 898 | + return nil |
| 899 | + } |
| 900 | + |
| 901 | + errorsString := "the following validation errors have been identified with the configuration of the nrql alert condition: \n" |
| 902 | + |
| 903 | + for index, val := range errorsList { |
| 904 | + errorsString += fmt.Sprintf("(%d): %s\n", index+1, val) |
| 905 | + } |
| 906 | + |
| 907 | + return errors.New(errorsString) |
| 908 | +} |
| 909 | + |
| 910 | +func validateSignalSeasonality(d *schema.ResourceDiff) error { |
| 911 | + rawConfiguration := d.GetRawConfig() |
| 912 | + |
| 913 | + signalSeasonalityIsNotNil := !rawConfiguration.GetAttr("signal_seasonality").IsNull() |
| 914 | + |
| 915 | + if signalSeasonalityIsNotNil { |
| 916 | + return fmt.Errorf(`'signal_seasonality' is only valid on baseline conditions. Please remove this field or change the condition type`) |
| 917 | + } |
| 918 | + return nil |
| 919 | +} |
0 commit comments