From 0a42253426684960c1f2951e545688c65d817a04 Mon Sep 17 00:00:00 2001 From: quzard <1191890118@qq.com> Date: Thu, 14 Mar 2024 11:36:59 +0800 Subject: [PATCH] resource/alicloud_logtail_config: Fall back to server config on UpdateConfig failure and avoid using server config after GetConfig errors --- alicloud/resource_alicloud_logtail_config.go | 29 +++++++++++++++++++- alicloud/service_alicloud_log.go | 4 +++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/alicloud/resource_alicloud_logtail_config.go b/alicloud/resource_alicloud_logtail_config.go index d80fbbc9ed1c..f9019de6a988 100644 --- a/alicloud/resource_alicloud_logtail_config.go +++ b/alicloud/resource_alicloud_logtail_config.go @@ -121,14 +121,30 @@ func getConfig(d *schema.ResourceData, meta interface{}) (*sls.LogConfig, error) return config, err } +func isLogtailConfigUnconvertable(d *schema.ResourceData, err error, split []string) bool { + if IsExpectedErrors(err, []string{"unconvertable", "Unconvertable"}) { + d.Set("project", split[0]) + d.Set("logstore", split[1]) + d.Set("name", split[2]) + d.Set("input_detail", "[Warning!] Server configuration is an unconvertable pipeline config.") + d.Set("last_modify_time", "") + return true + } + return false +} + func resourceAlicloudLogtailConfigSave(d *schema.ResourceData, meta interface{}) error { split := strings.Split(d.Id(), COLON_SEPARATED) config, err := getConfig(d, meta) if err != nil { + if isLogtailConfigUnconvertable(d, err, split) { + return nil + } if NotFoundError(err) { d.SetId("") return nil } + d.Set("last_modify_time", "") return WrapError(err) } @@ -149,10 +165,14 @@ func resourceAlicloudLogtailConfigRead(d *schema.ResourceData, meta interface{}) split := strings.Split(d.Id(), COLON_SEPARATED) config, err := getConfig(d, meta) if err != nil { + if isLogtailConfigUnconvertable(d, err, split) { + return nil + } if NotFoundError(err) { d.SetId("") return nil } + d.Set("last_modify_time", "") return WrapError(err) } @@ -166,7 +186,7 @@ func resourceAlicloudLogtailConfigRead(d *schema.ResourceData, meta interface{}) var oMap map[string]interface{} json.Unmarshal([]byte(inputDetail), &oMap) nMap := config.InputDetail.(map[string]interface{}) - if inputDetail != "" { + if inputDetail != "" && !strings.HasPrefix(inputDetail, "[Warning!]") { for nk := range nMap { if _, ok := oMap[nk]; !ok { delete(nMap, nk) @@ -175,6 +195,7 @@ func resourceAlicloudLogtailConfigRead(d *schema.ResourceData, meta interface{}) } nMapJson, err := json.Marshal(nMap) if err != nil { + d.Set("last_modify_time", "") return WrapError(err) } lastModifyTimeNew := strconv.Itoa(int(config.LastModifyTime)) @@ -222,11 +243,15 @@ func resourceAlicloudLogtailConfiglUpdate(d *schema.ResourceData, meta interface data := d.Get("input_detail").(string) conver_err := json.Unmarshal([]byte(data), &inputConfigInputDetail) if conver_err != nil { + old, _ := d.GetChange("input_detail") + d.Set("input_detail", old) return WrapError(conver_err) } sls.AddNecessaryInputConfigField(inputConfigInputDetail) covertInput, covertErr := assertInputDetailType(inputConfigInputDetail, logconfig) if covertErr != nil { + old, _ := d.GetChange("input_detail") + d.Set("input_detail", old) return WrapError(covertErr) } logconfig.InputDetail = covertInput @@ -249,6 +274,8 @@ func resourceAlicloudLogtailConfiglUpdate(d *schema.ResourceData, meta interface return nil, slsClient.UpdateConfig(parts[0], params) }) if err != nil { + old, _ := d.GetChange("input_detail") + d.Set("input_detail", old) return WrapErrorf(err, DefaultErrorMsg, d.Id(), "UpdateConfig", AliyunLogGoSdkERROR) } if debugOn() { diff --git a/alicloud/service_alicloud_log.go b/alicloud/service_alicloud_log.go index 5ef5825f07bf..c933327b7c85 100644 --- a/alicloud/service_alicloud_log.go +++ b/alicloud/service_alicloud_log.go @@ -263,9 +263,13 @@ func (s *LogService) DescribeLogtailConfig(id string) (*sls.LogConfig, error) { err = resource.Retry(2*time.Minute, func() *resource.RetryError { raw, err := s.client.WithLogClient(func(slsClient *sls.Client) (interface{}, error) { requestInfo = slsClient + slsClient.RetryTimeOut = 30 * time.Second return slsClient.GetConfig(projectName, configName) }) if err != nil { + if IsExpectedErrors(err, []string{"unconvertable", "Unconvertable"}) { + return resource.NonRetryableError(err) + } if IsExpectedErrors(err, []string{"InternalServerError"}) { return resource.RetryableError(err) }