alicloud/resource_alicloud_ess_scaling_rule.go (754 lines of code) (raw):

package alicloud import ( "encoding/json" "fmt" "strconv" "strings" "github.com/hashicorp/terraform-plugin-sdk/helper/validation" "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" "github.com/aliyun/alibaba-cloud-sdk-go/services/ess" "github.com/aliyun/terraform-provider-alicloud/alicloud/connectivity" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" ) func resourceAlicloudEssScalingRule() *schema.Resource { return &schema.Resource{ Create: resourceAliyunEssScalingRuleCreate, Read: resourceAliyunEssScalingRuleRead, Update: resourceAliyunEssScalingRuleUpdate, Delete: resourceAliyunEssScalingRuleDelete, Importer: &schema.ResourceImporter{ State: schema.ImportStatePassthrough, }, Schema: map[string]*schema.Schema{ "scaling_group_id": { Type: schema.TypeString, Required: true, ForceNew: true, }, "adjustment_type": { Type: schema.TypeString, Optional: true, ValidateFunc: StringInSlice([]string{"QuantityChangeInCapacity", "PercentChangeInCapacity", "TotalCapacity"}, false), }, "adjustment_value": { Type: schema.TypeInt, Optional: true, }, "scaling_rule_name": { Type: schema.TypeString, Computed: true, Optional: true, }, "ari": { Type: schema.TypeString, Computed: true, }, "cooldown": { Type: schema.TypeInt, Optional: true, ValidateFunc: validation.IntBetween(0, 86400), }, "scaling_rule_type": { Type: schema.TypeString, Optional: true, Default: "SimpleScalingRule", ForceNew: true, ValidateFunc: StringInSlice([]string{ string(SimpleScalingRule), string(TargetTrackingScalingRule), string(StepScalingRule), string(PredictiveScalingRule), }, false), }, "estimated_instance_warmup": { Type: schema.TypeInt, Optional: true, Computed: true, }, "scale_in_evaluation_count": { Type: schema.TypeInt, Optional: true, Computed: true, }, "scale_out_evaluation_count": { Type: schema.TypeInt, Optional: true, Computed: true, }, "min_adjustment_magnitude": { Type: schema.TypeInt, Optional: true, DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool { if v, ok := d.GetOk("scaling_rule_type"); ok && (v.(string) == "" || v.(string) == "SimpleScalingRule" || v.(string) == "StepScalingRule") { if w, ok := d.GetOk("adjustment_type"); ok && w.(string) == "PercentChangeInCapacity" { return false } } return true }, }, "metric_name": { Type: schema.TypeString, Optional: true, }, "metric_type": { Type: schema.TypeString, Optional: true, Computed: true, }, "predictive_scaling_mode": { Type: schema.TypeString, Optional: true, Computed: true, ValidateFunc: StringInSlice([]string{ "PredictOnly", "PredictAndScale", }, false), }, "initial_max_size": { Type: schema.TypeInt, Optional: true, Computed: true, }, "predictive_value_behavior": { Type: schema.TypeString, Optional: true, Computed: true, ValidateFunc: StringInSlice([]string{ "MaxOverridePredictiveValue", "PredictiveValueOverrideMax", "PredictiveValueOverrideMaxWithBuffer", }, false), }, "predictive_value_buffer": { Type: schema.TypeInt, Optional: true, Computed: true, ValidateFunc: IntBetween(0, 100), }, "predictive_task_buffer_time": { Type: schema.TypeInt, Optional: true, Computed: true, ValidateFunc: IntBetween(0, 60), }, "target_value": { Type: schema.TypeFloat, Optional: true, }, "hybrid_monitor_namespace": { Type: schema.TypeString, Optional: true, }, "hybrid_metrics": { Type: schema.TypeList, Optional: true, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "id": { Type: schema.TypeString, Optional: true, }, "metric_name": { Type: schema.TypeString, Optional: true, }, "statistic": { Type: schema.TypeString, Optional: true, }, "expression": { Type: schema.TypeString, Optional: true, }, "dimensions": { Type: schema.TypeSet, Optional: true, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "dimension_key": { Type: schema.TypeString, Optional: true, }, "dimension_value": { Type: schema.TypeString, Optional: true, }, }, }, }, }, }, }, "disable_scale_in": { Type: schema.TypeBool, Optional: true, }, "step_adjustment": { Type: schema.TypeList, Optional: true, MinItems: 1, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "metric_interval_lower_bound": { Type: schema.TypeString, Optional: true, }, "metric_interval_upper_bound": { Type: schema.TypeString, Optional: true, }, "scaling_adjustment": { Type: schema.TypeInt, Optional: true, }, }, }, }, "alarm_dimension": { Type: schema.TypeList, Optional: true, MinItems: 1, MaxItems: 1, ForceNew: true, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "dimension_key": { Type: schema.TypeString, Optional: true, ValidateFunc: StringInSlice([]string{ "rulePool", }, false), }, "dimension_value": { Type: schema.TypeString, ForceNew: true, Optional: true, }, }, }, }, }, } } func resourceAliyunEssScalingRuleCreate(d *schema.ResourceData, meta interface{}) error { request, err := buildAlicloudEssScalingRuleArgs(d, meta) if err != nil { return WrapError(err) } client := meta.(*connectivity.AliyunClient) raw, err := client.RpcPost("Ess", "2014-08-28", "CreateScalingRule", nil, request, true) if err != nil { return WrapErrorf(err, DefaultErrorMsg, "alicloud_ess_scalingrule", "CreateScalingRule", AlibabaCloudSdkGoERROR) } addDebug("CreateScalingRule", raw, request, request) d.SetId(fmt.Sprint(raw["ScalingRuleId"])) return resourceAliyunEssScalingRuleRead(d, meta) } func resourceAliyunEssScalingRuleRead(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AliyunClient) essService := EssService{client} _, ok := d.GetOk("alarm_dimension") var object map[string]interface{} var err error if !ok { object, err = essService.DescribeEssScalingRule(d.Id()) } else { object, err = essService.DescribeEssScalingRuleWithAlarm(d.Id()) } if err != nil { if NotFoundError(err) { d.SetId("") return nil } return WrapError(err) } d.Set("scaling_group_id", object["ScalingGroupId"]) d.Set("ari", object["ScalingRuleAri"]) d.Set("adjustment_type", object["AdjustmentType"]) if object["AdjustmentValue"] != nil { d.Set("adjustment_value", object["AdjustmentValue"]) } d.Set("scaling_rule_name", object["ScalingRuleName"]) if object["Cooldown"] != nil { d.Set("cooldown", object["Cooldown"]) } d.Set("scaling_rule_type", object["ScalingRuleType"]) if object["EstimatedInstanceWarmup"] != nil { d.Set("estimated_instance_warmup", object["EstimatedInstanceWarmup"]) } if object["ScaleInEvaluationCount"] != nil { d.Set("scale_in_evaluation_count", object["ScaleInEvaluationCount"]) } if object["ScaleOutEvaluationCount"] != nil { d.Set("scale_out_evaluation_count", object["ScaleOutEvaluationCount"]) } if object["MinAdjustmentMagnitude"] != nil { d.Set("min_adjustment_magnitude", object["MinAdjustmentMagnitude"]) } d.Set("predictive_scaling_mode", object["PredictiveScalingMode"]) if object["InitialMaxSize"] != nil { d.Set("initial_max_size", object["InitialMaxSize"]) } d.Set("predictive_value_behavior", object["PredictiveValueBehavior"]) d.Set("predictive_value_buffer", object["PredictiveValueBuffer"]) if object["PredictiveTaskBufferTime"] != nil { d.Set("predictive_task_buffer_time", object["PredictiveTaskBufferTime"]) } if object["TargetValue"] != nil { f, _ := object["TargetValue"].(json.Number).Float64() targetValue, err := strconv.ParseFloat(strconv.FormatFloat(f, 'f', 3, 64), 64) if err != nil { return WrapError(err) } d.Set("target_value", targetValue) } d.Set("disable_scale_in", object["DisableScaleIn"]) if object["StepAdjustment"] != nil { steps, _ := flattenStepAdjustmentMappings(object["StepAdjustments"]) d.Set("step_adjustment", steps) } if object["AlarmDimensions"] != nil { alarmDimensions := flattenAlarmDimensionMappings(object["AlarmDimensions"]) d.Set("alarm_dimension", alarmDimensions) } if object["HybridMonitorNamespace"] != nil { d.Set("hybrid_monitor_namespace", object["HybridMonitorNamespace"]) } if object["HybridMetrics"] != nil { dimensions, _ := flattenHybridMetricsMappings(object["HybridMetrics"]) d.Set("hybrid_metrics", dimensions) } if object["MetricName"] != nil && object["HybridMetrics"] == nil { d.Set("metric_name", object["MetricName"]) } if object["MetricType"] != nil { d.Set("metric_type", object["MetricType"]) } return nil } func resourceAliyunEssScalingRuleDelete(d *schema.ResourceData, meta interface{}) error { //Compatible with older versions id if strings.Contains(d.Id(), COLON_SEPARATED) { parts, _ := ParseResourceId(d.Id(), 2) d.SetId(parts[1]) } client := meta.(*connectivity.AliyunClient) essService := EssService{client} request := ess.CreateDeleteScalingRuleRequest() request.ScalingRuleId = d.Id() request.RegionId = client.RegionId raw, err := client.WithEssClient(func(essClient *ess.Client) (interface{}, error) { return essClient.DeleteScalingRule(request) }) if err != nil { if IsExpectedErrors(err, []string{"InvalidScalingRuleId.NotFound"}) { return nil } return WrapErrorf(err, DefaultErrorMsg, d.Id(), request.GetActionName(), AlibabaCloudSdkGoERROR) } addDebug(request.GetActionName(), raw, request.RpcRequest, request) return WrapError(essService.WaitForEssScalingRule(d.Id(), Deleted, DefaultTimeout)) } func resourceAliyunEssScalingRuleUpdate(d *schema.ResourceData, meta interface{}) error { //Compatible with older versions id if strings.Contains(d.Id(), COLON_SEPARATED) { parts, _ := ParseResourceId(d.Id(), 2) d.SetId(parts[1]) } client := meta.(*connectivity.AliyunClient) request := map[string]interface{}{ "ScalingRuleId": d.Id(), "RegionId": client.RegionId, } if d.HasChange("scaling_rule_name") { request["ScalingRuleName"] = d.Get("scaling_rule_name") } if d.HasChange("metric_type") { request["MetricType"] = d.Get("metric_type") } scalingRuleType := d.Get("scaling_rule_type") switch scalingRuleType { case string(SimpleScalingRule): if d.HasChange("adjustment_type") { request["AdjustmentType"] = d.Get("adjustment_type").(string) } if d.HasChange("min_adjustment_magnitude") { if v, ok := d.GetOkExists("min_adjustment_magnitude"); ok { request["MinAdjustmentMagnitude"] = requests.NewInteger(v.(int)) } } if d.HasChange("adjustment_value") { if v, ok := d.GetOkExists("adjustment_value"); ok { request["AdjustmentValue"] = requests.NewInteger(v.(int)) } } if d.HasChange("cooldown") { if v, ok := d.GetOkExists("cooldown"); ok { request["Cooldown"] = requests.NewInteger(v.(int)) } } case string(TargetTrackingScalingRule): if d.HasChange("metric_name") { request["MetricName"] = d.Get("metric_name").(string) } if d.HasChange("scale_in_evaluation_count") { if v, ok := d.GetOkExists("scale_in_evaluation_count"); ok { request["ScaleInEvaluationCount"] = requests.NewInteger(v.(int)) } } if d.HasChange("scale_out_evaluation_count") { if v, ok := d.GetOkExists("scale_out_evaluation_count"); ok { request["ScaleOutEvaluationCount"] = requests.NewInteger(v.(int)) } } if d.HasChange("disable_scale_in") { if v, ok := d.GetOkExists("disable_scale_in"); ok { request["DisableScaleIn"] = requests.NewBoolean(v.(bool)) } } if d.HasChange("estimated_instance_warmup") { if v, ok := d.GetOkExists("estimated_instance_warmup"); ok { request["EstimatedInstanceWarmup"] = requests.NewInteger(v.(int)) } } if d.HasChange("target_value") { if v, ok := d.GetOkExists("target_value"); ok { targetValue, err := strconv.ParseFloat(strconv.FormatFloat(v.(float64), 'f', 3, 64), 64) if err != nil { return WrapError(err) } request["TargetValue"] = requests.NewFloat(targetValue) } } if d.HasChange("hybrid_monitor_namespace") { request["HybridMonitorNamespace"] = d.Get("hybrid_monitor_namespace") } if d.HasChange("hybrid_metrics") { hybridMetrics := make([]map[string]interface{}, 0) for _, e := range d.Get("hybrid_metrics").([]interface{}) { pack := e.(map[string]interface{}) hybridMetric := make(map[string]interface{}) hybridMetric["Id"] = pack["id"].(string) if pack["metric_name"] != nil && pack["metric_name"] != "" { hybridMetric["MetricName"] = pack["metric_name"].(string) } if pack["statistic"] != nil && pack["statistic"] != "" { hybridMetric["Statistic"] = pack["statistic"].(string) } if pack["expression"] != nil && pack["expression"] != "" { hybridMetric["Expression"] = pack["expression"].(string) } if pack["dimensions"] != nil { dimensions := make([]map[string]interface{}, len(pack["dimensions"].(*schema.Set).List())) for i, dimension := range pack["dimensions"].(*schema.Set).List() { dimensionVar := dimension.(map[string]interface{}) dimensions[i] = make(map[string]interface{}) dimensions[i]["DimensionKey"] = dimensionVar["dimension_key"] dimensions[i]["DimensionValue"] = dimensionVar["dimension_value"] } hybridMetric["Dimensions"] = dimensions } hybridMetrics = append(hybridMetrics, hybridMetric) } request["HybridMetrics"] = hybridMetrics } case string(StepScalingRule): if d.HasChange("min_adjustment_magnitude") { if v, ok := d.GetOkExists("min_adjustment_magnitude"); ok { request["MinAdjustmentMagnitude"] = requests.NewInteger(v.(int)) } } if d.HasChange("step_adjustment") { steps := make([]map[string]interface{}, 0) for _, e := range d.Get("step_adjustment").([]interface{}) { pack := e.(map[string]interface{}) step := make(map[string]interface{}) step["ScalingAdjustment"] = strconv.Itoa(pack["scaling_adjustment"].(int)) if pack["metric_interval_lower_bound"] != "" { lowerBound, err := strconv.ParseFloat(pack["metric_interval_lower_bound"].(string), 64) if err != nil { return WrapError(err) } step["MetricIntervalLowerBound"] = strconv.FormatFloat(lowerBound, 'f', 3, 64) } if pack["metric_interval_upper_bound"] != "" { upperBound, err := strconv.ParseFloat(pack["metric_interval_upper_bound"].(string), 64) if err != nil { return WrapError(err) } step["MetricIntervalUpperBound"] = strconv.FormatFloat(upperBound, 'f', 3, 64) } steps = append(steps, step) } request["StepAdjustment"] = &steps } case string(PredictiveScalingRule): if d.HasChange("metric_name") { request["MetricName"] = d.Get("metric_name").(string) } if d.HasChange("target_value") { if v, ok := d.GetOkExists("target_value"); ok { targetValue, err := strconv.ParseFloat(strconv.FormatFloat(v.(float64), 'f', 3, 64), 64) if err != nil { return WrapError(err) } request["TargetValue"] = requests.NewFloat(targetValue) } } if d.HasChange("initial_max_size") { if v, ok := d.GetOkExists("initial_max_size"); ok { request["InitialMaxSize"] = requests.NewInteger(v.(int)) } } if d.HasChange("predictive_value_buffer") { if v, ok := d.GetOkExists("predictive_value_buffer"); ok { request["PredictiveValueBuffer"] = requests.NewInteger(v.(int)) } } if d.HasChange("predictive_task_buffer_time") { if v, ok := d.GetOkExists("predictive_task_buffer_time"); ok { request["PredictiveTaskBufferTime"] = requests.NewInteger(v.(int)) } } if d.HasChange("predictive_scaling_mode") { request["PredictiveScalingMode"] = d.Get("predictive_scaling_mode").(string) } if d.HasChange("predictive_value_behavior") { request["PredictiveValueBehavior"] = d.Get("predictive_value_behavior").(string) } } raw, err := client.RpcPost("Ess", "2014-08-28", "ModifyScalingRule", nil, request, true) if err != nil { return WrapErrorf(err, DefaultErrorMsg, d.Id(), "ModifyScalingRule", AlibabaCloudSdkGoERROR) } addDebug("ModifyScalingRule", raw, request, request) return resourceAliyunEssScalingRuleRead(d, meta) } func buildAlicloudEssScalingRuleArgs(d *schema.ResourceData, meta interface{}) (map[string]interface{}, error) { client := meta.(*connectivity.AliyunClient) request := map[string]interface{}{ "ScalingGroupId": d.Get("scaling_group_id"), "ScalingRuleType": d.Get("scaling_rule_type"), "RegionId": client.RegionId, } // common params scalingRuleType := d.Get("scaling_rule_type").(string) if v, ok := d.GetOk("scaling_rule_name"); ok && v.(string) != "" { request["ScalingRuleName"] = v.(string) } if v, ok := d.GetOk("metric_type"); ok && v.(string) != "" { request["MetricType"] = v.(string) } switch scalingRuleType { case string(SimpleScalingRule): if v, ok := d.GetOk("adjustment_type"); ok && v.(string) != "" { request["AdjustmentType"] = v.(string) } if v, ok := d.GetOkExists("min_adjustment_magnitude"); ok { request["MinAdjustmentMagnitude"] = requests.NewInteger(v.(int)) } if v, ok := d.GetOkExists("adjustment_value"); ok { request["AdjustmentValue"] = requests.NewInteger(v.(int)) } if v, ok := d.GetOkExists("cooldown"); ok { request["Cooldown"] = requests.NewInteger(v.(int)) } case string(TargetTrackingScalingRule): if v, ok := d.GetOkExists("estimated_instance_warmup"); ok { request["EstimatedInstanceWarmup"] = requests.NewInteger(v.(int)) } if v, ok := d.GetOkExists("scale_in_evaluation_count"); ok { request["ScaleInEvaluationCount"] = requests.NewInteger(v.(int)) } if v, ok := d.GetOkExists("scale_out_evaluation_count"); ok { request["ScaleOutEvaluationCount"] = requests.NewInteger(v.(int)) } if v, ok := d.GetOk("metric_name"); ok && v.(string) != "" { request["MetricName"] = v.(string) } if v, ok := d.GetOkExists("target_value"); ok { targetValue, err := strconv.ParseFloat(strconv.FormatFloat(v.(float64), 'f', 3, 64), 64) if err != nil { return nil, WrapError(err) } request["TargetValue"] = requests.NewFloat(targetValue) } if v, ok := d.GetOkExists("disable_scale_in"); ok { request["DisableScaleIn"] = requests.NewBoolean(v.(bool)) } v, ok := d.GetOk("alarm_dimension") if ok { steps := make([]ess.CreateScalingRuleAlarmDimension, 0) for _, e := range v.([]interface{}) { pack := e.(map[string]interface{}) step := ess.CreateScalingRuleAlarmDimension{ DimensionKey: pack["dimension_key"].(string), DimensionValue: pack["dimension_value"].(string), } steps = append(steps, step) } request["AlarmDimension"] = &steps } if hybridMonitorNamespace, exist := d.GetOk("hybrid_monitor_namespace"); exist && hybridMonitorNamespace.(string) != "" { request["HybridMonitorNamespace"] = hybridMonitorNamespace.(string) } hM, ok := d.GetOk("hybrid_metrics") if ok { hybridMetrics := make([]map[string]interface{}, 0) for _, e := range hM.([]interface{}) { pack := e.(map[string]interface{}) hybridMetric := make(map[string]interface{}) hybridMetric["Id"] = pack["id"].(string) if pack["metric_name"] != nil && pack["metric_name"] != "" { hybridMetric["MetricName"] = pack["metric_name"].(string) } if pack["statistic"] != nil && pack["statistic"] != "" { hybridMetric["Statistic"] = pack["statistic"].(string) } if pack["expression"] != nil && pack["expression"] != "" { hybridMetric["Expression"] = pack["expression"].(string) } if pack["dimensions"] != nil { dimensions := make([]map[string]interface{}, len(pack["dimensions"].(*schema.Set).List())) for i, dimension := range pack["dimensions"].(*schema.Set).List() { dimensionVar := dimension.(map[string]interface{}) dimensions[i] = make(map[string]interface{}) dimensions[i]["DimensionKey"] = dimensionVar["dimension_key"] dimensions[i]["DimensionValue"] = dimensionVar["dimension_value"] } hybridMetric["Dimensions"] = dimensions } hybridMetrics = append(hybridMetrics, hybridMetric) } request["HybridMetrics"] = hybridMetrics } case string(StepScalingRule): v, ok := d.GetOk("step_adjustment") if v, ok := d.GetOk("adjustment_type"); ok && v.(string) != "" { request["AdjustmentType"] = v.(string) } if v, ok := d.GetOkExists("min_adjustment_magnitude"); ok { request["MinAdjustmentMagnitude"] = requests.NewInteger(v.(int)) } if v, ok := d.GetOkExists("estimated_instance_warmup"); ok { request["EstimatedInstanceWarmup"] = requests.NewInteger(v.(int)) } if ok { steps := make([]map[string]interface{}, 0) for _, e := range v.([]interface{}) { pack := e.(map[string]interface{}) step := make(map[string]interface{}) step["ScalingAdjustment"] = strconv.Itoa(pack["scaling_adjustment"].(int)) if pack["metric_interval_lower_bound"] != "" { lowerBound, err := strconv.ParseFloat(pack["metric_interval_lower_bound"].(string), 64) if err != nil { return nil, WrapError(err) } step["MetricIntervalLowerBound"] = strconv.FormatFloat(lowerBound, 'f', 3, 64) } if pack["metric_interval_upper_bound"] != "" { upperBound, err := strconv.ParseFloat(pack["metric_interval_upper_bound"].(string), 64) if err != nil { return nil, WrapError(err) } step["MetricIntervalUpperBound"] = strconv.FormatFloat(upperBound, 'f', 3, 64) } steps = append(steps, step) } request["StepAdjustment"] = &steps } case string(PredictiveScalingRule): if v, ok := d.GetOk("metric_name"); ok && v.(string) != "" { request["MetricName"] = v.(string) } if v, ok := d.GetOkExists("target_value"); ok { targetValue, err := strconv.ParseFloat(strconv.FormatFloat(v.(float64), 'f', 3, 64), 64) if err != nil { return nil, WrapError(err) } request["TargetValue"] = requests.NewFloat(targetValue) } if v, ok := d.GetOk("predictive_scaling_mode"); ok && v.(string) != "" { request["PredictiveScalingMode"] = v.(string) } if v, ok := d.GetOk("predictive_value_behavior"); ok && v.(string) != "" { request["PredictiveValueBehavior"] = v.(string) } if v, ok := d.GetOkExists("predictive_value_buffer"); ok { request["PredictiveValueBuffer"] = requests.NewInteger(v.(int)) } if v, ok := d.GetOkExists("predictive_task_buffer_time"); ok { request["PredictiveTaskBufferTime"] = requests.NewInteger(v.(int)) } if v, ok := d.GetOkExists("initial_max_size"); ok { request["InitialMaxSize"] = requests.NewInteger(v.(int)) } } return request, nil } func flattenStepAdjustmentMappings(list interface{}) ([]map[string]interface{}, error) { result := make([]map[string]interface{}, 0) for _, i := range list.(map[string]interface{})["StepAdjustment"].([]interface{}) { stepAdjustment := i.(map[string]interface{}) l := map[string]interface{}{} if stepAdjustment["MetricIntervalLowerBound"] != nil { lowerBound, err := strconv.ParseFloat(strconv.FormatFloat(stepAdjustment["MetricIntervalLowerBound"].(float64), 'f', 3, 64), 64) if err != nil { return nil, WrapError(err) } l["metric_interval_lower_bound"] = lowerBound } if stepAdjustment["MetricIntervalUpperBound"] != nil { upperBound, err := strconv.ParseFloat(strconv.FormatFloat(stepAdjustment["MetricIntervalUpperBound"].(float64), 'f', 3, 64), 64) if err != nil { return nil, WrapError(err) } l["metric_interval_upper_bound"] = upperBound } l["scaling_adjustment"] = stepAdjustment["ScalingAdjustment"] result = append(result, l) } return result, nil } func flattenHybridMetricsMappings(list interface{}) ([]map[string]interface{}, error) { result := make([]map[string]interface{}, 0) for _, i := range list.(map[string]interface{})["HybridMetric"].([]interface{}) { hybridMetric := i.(map[string]interface{}) l := map[string]interface{}{} l["id"] = hybridMetric["Id"].(string) if hybridMetric["MetricName"] != nil { l["metric_name"] = hybridMetric["MetricName"].(string) } if hybridMetric["Statistic"] != nil { l["statistic"] = hybridMetric["Statistic"].(string) } if hybridMetric["Expression"] != nil { l["expression"] = hybridMetric["Expression"].(string) } if hybridMetric["Dimensions"] != nil { dimensionsVarsMaps := make([]map[string]interface{}, 0) m := hybridMetric["Dimensions"].(map[string]interface{}) for _, dimensionsVarsValue := range m["Dimension"].([]interface{}) { dimensionsVars := dimensionsVarsValue.(map[string]interface{}) dimensionsVarsMap := map[string]interface{}{ "dimension_key": dimensionsVars["DimensionKey"], "dimension_value": dimensionsVars["DimensionValue"], } dimensionsVarsMaps = append(dimensionsVarsMaps, dimensionsVarsMap) } l["dimensions"] = dimensionsVarsMaps } result = append(result, l) } return result, nil } func flattenAlarmDimensionMappings(list interface{}) []map[string]interface{} { result := make([]map[string]interface{}, 0) for _, i := range list.(map[string]interface{})["AlarmDimension"].([]interface{}) { alarmDimension := i.(map[string]interface{}) l := map[string]interface{}{ "dimension_key": alarmDimension["DimensionKey"], "dimension_value": alarmDimension["DimensionValue"], } result = append(result, l) } return result }