func resourceAliCloudSlsAlertUpdate()

in alicloud/resource_alicloud_sls_alert.go [1012:1406]


func resourceAliCloudSlsAlertUpdate(d *schema.ResourceData, meta interface{}) error {
	client := meta.(*connectivity.AliyunClient)
	var request map[string]interface{}
	var response map[string]interface{}
	var query map[string]*string
	var body map[string]interface{}
	update := false
	parts := strings.Split(d.Id(), ":")
	alertName := parts[1]
	action := fmt.Sprintf("/alerts/%s", alertName)
	var err error
	request = make(map[string]interface{})
	query = make(map[string]*string)
	body = make(map[string]interface{})
	hostMap := make(map[string]*string)
	hostMap["project"] = StringPointer(parts[0])
	if !d.IsNewResource() && d.HasChange("display_name") {
		update = true
	}
	request["displayName"] = d.Get("display_name")
	if !d.IsNewResource() && d.HasChange("description") {
		update = true
	}
	request["description"] = d.Get("description")
	if d.HasChange("configuration") {
		update = true
	}
	objectDataLocalMap := make(map[string]interface{})
	if v := d.Get("configuration"); v != nil {
		nodeNative, _ := jsonpath.Get("$[0].mute_until", v)
		if nodeNative != nil && nodeNative != "" {
			objectDataLocalMap["muteUntil"] = nodeNative
		}
		nodeNative1, _ := jsonpath.Get("$[0].version", v)
		if nodeNative1 != nil && nodeNative1 != "" {
			objectDataLocalMap["version"] = nodeNative1
		}
		nodeNative2, _ := jsonpath.Get("$[0].type", v)
		if nodeNative2 != nil && nodeNative2 != "" {
			objectDataLocalMap["type"] = nodeNative2
		}
		templateConfiguration := make(map[string]interface{})
		nodeNative3, _ := jsonpath.Get("$[0].template_configuration[0].type", v)
		if nodeNative3 != nil && nodeNative3 != "" {
			templateConfiguration["type"] = nodeNative3
		}
		nodeNative4, _ := jsonpath.Get("$[0].template_configuration[0].version", v)
		if nodeNative4 != nil && nodeNative4 != "" {
			templateConfiguration["version"] = nodeNative4
		}
		nodeNative5, _ := jsonpath.Get("$[0].template_configuration[0].lang", v)
		if nodeNative5 != nil && nodeNative5 != "" {
			templateConfiguration["lang"] = nodeNative5
		}
		nodeNative6, _ := jsonpath.Get("$[0].template_configuration[0].template_id", v)
		if nodeNative6 != nil && nodeNative6 != "" {
			templateConfiguration["id"] = nodeNative6
		}
		nodeNative7, _ := jsonpath.Get("$[0].template_configuration[0].tokens", v)
		if nodeNative7 != nil && nodeNative7 != "" {
			templateConfiguration["tokens"] = nodeNative7
		}
		nodeNative8, _ := jsonpath.Get("$[0].template_configuration[0].annotations", v)
		if nodeNative8 != nil && nodeNative8 != "" {
			templateConfiguration["aonotations"] = nodeNative8
		}

		objectDataLocalMap["templateConfiguration"] = templateConfiguration
		nodeNative9, _ := jsonpath.Get("$[0].dashboard", v)
		if nodeNative9 != nil && nodeNative9 != "" {
			objectDataLocalMap["dashboard"] = nodeNative9
		}
		nodeNative10, _ := jsonpath.Get("$[0].threshold", v)
		if nodeNative10 != nil && nodeNative10 != "" {
			objectDataLocalMap["threshold"] = nodeNative10
		}
		nodeNative11, _ := jsonpath.Get("$[0].no_data_fire", v)
		if nodeNative11 != nil && nodeNative11 != "" {
			objectDataLocalMap["noDataFire"] = nodeNative11
		}
		nodeNative12, _ := jsonpath.Get("$[0].no_data_severity", v)
		if nodeNative12 != nil && nodeNative12 != "" {
			objectDataLocalMap["noDataSeverity"] = nodeNative12
		}
		nodeNative13, _ := jsonpath.Get("$[0].send_resolved", v)
		if nodeNative13 != nil && nodeNative13 != "" {
			objectDataLocalMap["sendResolved"] = nodeNative13
		}
		if v, ok := d.GetOk("configuration"); ok {
			localData, err := jsonpath.Get("$[0].query_list", v)
			if err != nil {
				return WrapError(err)
			}
			localMaps := make([]interface{}, 0)
			for _, dataLoop := range localData.([]interface{}) {
				dataLoopTmp := dataLoop.(map[string]interface{})
				dataLoopMap := make(map[string]interface{})
				dataLoopMap["chartTitle"] = dataLoopTmp["chart_title"]
				dataLoopMap["query"] = dataLoopTmp["query"]
				dataLoopMap["timeSpanType"] = dataLoopTmp["time_span_type"]
				dataLoopMap["start"] = dataLoopTmp["start"]
				dataLoopMap["end"] = dataLoopTmp["end"]
				dataLoopMap["storeType"] = dataLoopTmp["store_type"]
				dataLoopMap["project"] = dataLoopTmp["project"]
				dataLoopMap["store"] = dataLoopTmp["store"]
				dataLoopMap["region"] = dataLoopTmp["region"]
				dataLoopMap["roleArn"] = dataLoopTmp["role_arn"]
				dataLoopMap["powerSqlMode"] = dataLoopTmp["power_sql_mode"]
				dataLoopMap["dashboardId"] = dataLoopTmp["dashboard_id"]
				dataLoopMap["ui"] = dataLoopTmp["ui"]
				localMaps = append(localMaps, dataLoopMap)
			}
			objectDataLocalMap["queryList"] = localMaps
		}
		if v, ok := d.GetOk("configuration"); ok {
			localData1, err := jsonpath.Get("$[0].annotations", v)
			if err != nil {
				return WrapError(err)
			}
			localMaps1 := make([]interface{}, 0)
			for _, dataLoop1 := range localData1.([]interface{}) {
				dataLoop1Tmp := dataLoop1.(map[string]interface{})
				dataLoop1Map := make(map[string]interface{})
				dataLoop1Map["key"] = dataLoop1Tmp["key"]
				dataLoop1Map["value"] = dataLoop1Tmp["value"]
				localMaps1 = append(localMaps1, dataLoop1Map)
			}
			objectDataLocalMap["annotations"] = localMaps1
		}
		if v, ok := d.GetOk("configuration"); ok {
			localData2, err := jsonpath.Get("$[0].labels", v)
			if err != nil {
				return WrapError(err)
			}
			localMaps2 := make([]interface{}, 0)
			for _, dataLoop2 := range localData2.([]interface{}) {
				dataLoop2Tmp := dataLoop2.(map[string]interface{})
				dataLoop2Map := make(map[string]interface{})
				dataLoop2Map["key"] = dataLoop2Tmp["key"]
				dataLoop2Map["value"] = dataLoop2Tmp["value"]
				localMaps2 = append(localMaps2, dataLoop2Map)
			}
			objectDataLocalMap["labels"] = localMaps2
		}
		conditionConfiguration := make(map[string]interface{})
		nodeNative31, _ := jsonpath.Get("$[0].condition_configuration[0].condition", v)
		if nodeNative31 != nil && nodeNative31 != "" {
			conditionConfiguration["condition"] = nodeNative31
		}
		nodeNative32, _ := jsonpath.Get("$[0].condition_configuration[0].count_condition", v)
		if nodeNative32 != nil && nodeNative32 != "" {
			conditionConfiguration["countCondition"] = nodeNative32
		}

		objectDataLocalMap["conditionConfiguration"] = conditionConfiguration
		if v, ok := d.GetOk("configuration"); ok {
			localData3, err := jsonpath.Get("$[0].severity_configurations", v)
			if err != nil {
				return WrapError(err)
			}
			localMaps3 := make([]interface{}, 0)
			for _, dataLoop3 := range localData3.([]interface{}) {
				dataLoop3Tmp := dataLoop3.(map[string]interface{})
				dataLoop3Map := make(map[string]interface{})
				dataLoop3Map["severity"] = dataLoop3Tmp["severity"]
				if !IsNil(dataLoop3Tmp["eval_condition"]) {
					localData4 := make(map[string]interface{})
					nodeNative34, _ := jsonpath.Get("$[0].condition", dataLoop3Tmp["eval_condition"])
					if nodeNative34 != nil && nodeNative34 != "" {
						localData4["condition"] = nodeNative34
					}
					nodeNative35, _ := jsonpath.Get("$[0].count_condition", dataLoop3Tmp["eval_condition"])
					if nodeNative35 != nil && nodeNative35 != "" {
						localData4["countCondition"] = nodeNative35
					}
					dataLoop3Map["evalCondition"] = localData4
				}
				localMaps3 = append(localMaps3, dataLoop3Map)
			}
			objectDataLocalMap["severityConfigurations"] = localMaps3
		}
		if v, ok := d.GetOk("configuration"); ok {
			localData5, err := jsonpath.Get("$[0].join_configurations", v)
			if err != nil {
				return WrapError(err)
			}
			localMaps5 := make([]interface{}, 0)
			for _, dataLoop5 := range localData5.([]interface{}) {
				dataLoop5Tmp := dataLoop5.(map[string]interface{})
				dataLoop5Map := make(map[string]interface{})
				dataLoop5Map["type"] = dataLoop5Tmp["type"]
				dataLoop5Map["condition"] = dataLoop5Tmp["condition"]
				localMaps5 = append(localMaps5, dataLoop5Map)
			}
			objectDataLocalMap["joinConfigurations"] = localMaps5
		}
		groupConfiguration := make(map[string]interface{})
		nodeNative38, _ := jsonpath.Get("$[0].group_configuration[0].type", v)
		if nodeNative38 != nil && nodeNative38 != "" {
			groupConfiguration["type"] = nodeNative38
		}
		nodeNative39, _ := jsonpath.Get("$[0].group_configuration[0].fields", d.Get("configuration"))
		if nodeNative39 != nil && nodeNative39 != "" {
			groupConfiguration["fields"] = nodeNative39
		}

		objectDataLocalMap["groupConfiguration"] = groupConfiguration
		policyConfiguration := make(map[string]interface{})
		nodeNative40, _ := jsonpath.Get("$[0].policy_configuration[0].alert_policy_id", v)
		if nodeNative40 != nil && nodeNative40 != "" {
			policyConfiguration["alertPolicyId"] = nodeNative40
		}
		nodeNative41, _ := jsonpath.Get("$[0].policy_configuration[0].action_policy_id", v)
		if nodeNative41 != nil && nodeNative41 != "" {
			policyConfiguration["actionPolicyId"] = nodeNative41
		}
		nodeNative42, _ := jsonpath.Get("$[0].policy_configuration[0].repeat_interval", v)
		if nodeNative42 != nil && nodeNative42 != "" {
			policyConfiguration["repeatInterval"] = nodeNative42
		}

		objectDataLocalMap["policyConfiguration"] = policyConfiguration
		nodeNative43, _ := jsonpath.Get("$[0].auto_annotation", v)
		if nodeNative43 != nil && nodeNative43 != "" {
			objectDataLocalMap["autoAnnotation"] = nodeNative43
		}
		sinkEventStore := make(map[string]interface{})
		nodeNative44, _ := jsonpath.Get("$[0].sink_event_store[0].enabled", v)
		if nodeNative44 != nil && nodeNative44 != "" {
			sinkEventStore["enabled"] = nodeNative44
		}
		nodeNative45, _ := jsonpath.Get("$[0].sink_event_store[0].endpoint", v)
		if nodeNative45 != nil && nodeNative45 != "" {
			sinkEventStore["endpoint"] = nodeNative45
		}
		nodeNative46, _ := jsonpath.Get("$[0].sink_event_store[0].project", v)
		if nodeNative46 != nil && nodeNative46 != "" {
			sinkEventStore["project"] = nodeNative46
		}
		nodeNative47, _ := jsonpath.Get("$[0].sink_event_store[0].event_store", v)
		if nodeNative47 != nil && nodeNative47 != "" {
			sinkEventStore["eventStore"] = nodeNative47
		}
		nodeNative48, _ := jsonpath.Get("$[0].sink_event_store[0].role_arn", v)
		if nodeNative48 != nil && nodeNative48 != "" {
			sinkEventStore["roleArn"] = nodeNative48
		}

		objectDataLocalMap["sinkEventStore"] = sinkEventStore
		sinkCms := make(map[string]interface{})
		nodeNative49, _ := jsonpath.Get("$[0].sink_cms[0].enabled", v)
		if nodeNative49 != nil && nodeNative49 != "" {
			sinkCms["enabled"] = nodeNative49
		}

		objectDataLocalMap["sinkCms"] = sinkCms
		sinkAlerthub := make(map[string]interface{})
		nodeNative50, _ := jsonpath.Get("$[0].sink_alerthub[0].enabled", v)
		if nodeNative50 != nil && nodeNative50 != "" {
			sinkAlerthub["enabled"] = nodeNative50
		}

		objectDataLocalMap["sinkAlerthub"] = sinkAlerthub
		nodeNative51, _ := jsonpath.Get("$[0].tags", d.Get("configuration"))
		if nodeNative51 != nil && nodeNative51 != "" {
			objectDataLocalMap["tags"] = nodeNative51
		}

		request["configuration"] = objectDataLocalMap
	}

	if d.HasChange("schedule") {
		update = true
	}
	objectDataLocalMap1 := make(map[string]interface{})
	if v := d.Get("schedule"); v != nil {
		nodeNative52, _ := jsonpath.Get("$[0].type", v)
		if nodeNative52 != nil && nodeNative52 != "" {
			objectDataLocalMap1["type"] = nodeNative52
		}
		nodeNative53, _ := jsonpath.Get("$[0].cron_expression", v)
		if nodeNative53 != nil && nodeNative53 != "" {
			objectDataLocalMap1["cronExpression"] = nodeNative53
		}
		nodeNative54, _ := jsonpath.Get("$[0].run_immdiately", v)
		if nodeNative54 != nil && nodeNative54 != "" {
			objectDataLocalMap1["runImmediately"] = nodeNative54
		}
		nodeNative55, _ := jsonpath.Get("$[0].time_zone", v)
		if nodeNative55 != nil && nodeNative55 != "" {
			objectDataLocalMap1["timeZone"] = nodeNative55
		}
		nodeNative56, _ := jsonpath.Get("$[0].delay", v)
		if nodeNative56 != nil && nodeNative56 != "" {
			objectDataLocalMap1["delay"] = nodeNative56
		}
		nodeNative57, _ := jsonpath.Get("$[0].interval", v)
		if nodeNative57 != nil && nodeNative57 != "" {
			objectDataLocalMap1["interval"] = nodeNative57
		}

		request["schedule"] = objectDataLocalMap1
	}

	body = request
	if update {
		wait := incrementalWait(3*time.Second, 5*time.Second)
		err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError {
			response, err = client.Do("Sls", roaParam("PUT", "2020-12-30", "UpdateAlert", action), query, body, nil, hostMap, false)
			if err != nil {
				if NeedRetry(err) {
					wait()
					return resource.RetryableError(err)
				}
				return resource.NonRetryableError(err)
			}
			addDebug(action, response, request)
			return nil
		})
		if err != nil {
			return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
		}
	}

	if d.HasChange("status") {
		client := meta.(*connectivity.AliyunClient)
		slsServiceV2 := SlsServiceV2{client}
		object, err := slsServiceV2.DescribeSlsAlert(d.Id())
		if err != nil {
			return WrapError(err)
		}

		target := d.Get("status").(string)
		if object["status"].(string) != target {
			if target == "ENABLED" {
				parts = strings.Split(d.Id(), ":")
				alertName = parts[1]
				action = fmt.Sprintf("/alerts/%s?action=enable", alertName)
				request = make(map[string]interface{})
				query = make(map[string]*string)
				body = make(map[string]interface{})
				hostMap := make(map[string]*string)
				hostMap["project"] = StringPointer(parts[0])
				body = request
				wait := incrementalWait(3*time.Second, 5*time.Second)
				err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError {
					response, err = client.Do("Sls", roaParam("PUT", "2020-12-30", "EnableAlert", action), query, body, nil, hostMap, false)
					if err != nil {
						if NeedRetry(err) {
							wait()
							return resource.RetryableError(err)
						}
						return resource.NonRetryableError(err)
					}
					addDebug(action, response, request)
					return nil
				})
				if err != nil {
					return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
				}

			}
			if target == "DISABLED" {
				parts = strings.Split(d.Id(), ":")
				alertName = parts[1]
				action = fmt.Sprintf("/alerts/%s?action=disable", alertName)
				request = make(map[string]interface{})
				query = make(map[string]*string)
				body = make(map[string]interface{})
				hostMap := make(map[string]*string)
				hostMap["project"] = StringPointer(parts[0])
				body = request
				wait := incrementalWait(3*time.Second, 5*time.Second)
				err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError {
					response, err = client.Do("Sls", roaParam("PUT", "2020-12-30", "DisableAlert", action), query, body, nil, hostMap, false)
					if err != nil {
						if NeedRetry(err) {
							wait()
							return resource.RetryableError(err)
						}
						return resource.NonRetryableError(err)
					}
					addDebug(action, response, request)
					return nil
				})
				if err != nil {
					return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
				}

			}
		}
	}

	return resourceAliCloudSlsAlertRead(d, meta)
}