alicloud/service_alicloud_log.go (1,175 lines of code) (raw):

package alicloud import ( "encoding/json" "errors" "fmt" "strings" "time" slsPop "github.com/aliyun/alibaba-cloud-sdk-go/services/sls" sls "github.com/aliyun/aliyun-log-go-sdk" "github.com/aliyun/terraform-provider-alicloud/alicloud/connectivity" "github.com/hashicorp/terraform-plugin-sdk/helper/resource" ) var SlsClientTimeoutCatcher = Catcher{LogClientTimeout, 15, 5} type LogService struct { client *connectivity.AliyunClient } func (s *LogService) DescribeLogProject(id string) (*sls.LogProject, error) { project := &sls.LogProject{} var requestInfo *sls.Client err := resource.Retry(2*time.Minute, func() *resource.RetryError { raw, err := s.client.WithLogClient(func(slsClient *sls.Client) (interface{}, error) { requestInfo = slsClient return slsClient.GetProject(id) }) if err != nil { if IsExpectedErrors(err, []string{LogClientTimeout, "ProjectForbidden"}) { time.Sleep(5 * time.Second) return resource.RetryableError(err) } return resource.NonRetryableError(err) } if debugOn() { addDebug("GetProject", raw, requestInfo, map[string]string{"name": id}) } project, _ = raw.(*sls.LogProject) return nil }) if err != nil { if IsExpectedErrors(err, []string{"ProjectNotExist"}) { return project, WrapErrorf(err, NotFoundMsg, AliyunLogGoSdkERROR) } return project, WrapErrorf(err, DefaultErrorMsg, id, "GetProject", AliyunLogGoSdkERROR) } if project == nil || project.Name == "" { return project, WrapErrorf(NotFoundErr("LogProject", id), NotFoundMsg, ProviderERROR) } return project, nil } func (s *LogService) WaitForLogProject(id string, status Status, timeout int) error { deadline := time.Now().Add(time.Duration(timeout) * time.Second) for { object, err := s.DescribeLogProject(id) if err != nil { if NotFoundError(err) { if status == Deleted { return nil } } else { return WrapError(err) } } if object.Name == id && status != Deleted { return nil } if time.Now().After(deadline) { return WrapErrorf(err, WaitTimeoutMsg, id, GetFunc(1), timeout, object.Name, id, ProviderERROR) } } } func (s *LogService) DescribeLogStore(id string) (*sls.LogStore, error) { store := &sls.LogStore{} parts, err := ParseResourceId(id, 2) if err != nil { return store, WrapError(err) } projectName, name := parts[0], parts[1] var requestInfo *sls.Client err = resource.Retry(2*time.Minute, func() *resource.RetryError { raw, err := s.client.WithLogClient(func(slsClient *sls.Client) (interface{}, error) { requestInfo = slsClient return slsClient.GetLogStore(projectName, name) }) if err != nil { if IsExpectedErrors(err, []string{"InternalServerError", LogClientTimeout}) { return resource.RetryableError(err) } return resource.NonRetryableError(err) } if debugOn() { addDebug("GetLogStore", raw, requestInfo, map[string]string{ "project": projectName, "logstore": name, }) } store, _ = raw.(*sls.LogStore) return nil }) if err != nil { if IsExpectedErrors(err, []string{"ProjectNotExist", "LogStoreNotExist"}) { return store, WrapErrorf(err, NotFoundMsg, AliyunLogGoSdkERROR) } return store, WrapErrorf(err, DefaultErrorMsg, id, "GetLogStore", AliyunLogGoSdkERROR) } if store == nil || store.Name == "" { return store, WrapErrorf(NotFoundErr("LogStore", id), NotFoundMsg, ProviderERROR) } return store, nil } func (s *LogService) WaitForLogStore(id string, status Status, timeout int) error { deadline := time.Now().Add(time.Duration(timeout) * time.Second) parts, err := ParseResourceId(id, 2) if err != nil { return WrapError(err) } name := parts[1] for { object, err := s.DescribeLogStore(id) if err != nil { if NotFoundError(err) { if status == Deleted { return nil } } else { return WrapError(err) } } if object.Name == name && status != Deleted { return nil } if time.Now().After(deadline) { return WrapErrorf(err, WaitTimeoutMsg, id, GetFunc(1), timeout, object.Name, name, ProviderERROR) } } } func (s *LogService) DescribeLogStoreIndex(id string) (*sls.Index, error) { index := &sls.Index{} parts, err := ParseResourceId(id, 2) if err != nil { return index, WrapError(err) } projectName, name := parts[0], parts[1] var requestInfo *sls.Client err = resource.Retry(2*time.Minute, func() *resource.RetryError { raw, err := s.client.WithLogClient(func(slsClient *sls.Client) (interface{}, error) { requestInfo = slsClient return slsClient.GetIndex(projectName, name) }) if err != nil { if IsExpectedErrors(err, []string{"InternalServerError", LogClientTimeout}) { return resource.RetryableError(err) } return resource.NonRetryableError(err) } if debugOn() { addDebug("GetIndex", raw, requestInfo, map[string]string{ "project": projectName, "logstore": name, }) } index, _ = raw.(*sls.Index) return nil }) if err != nil { if IsExpectedErrors(err, []string{"ProjectNotExist", "LogStoreNotExist", "IndexConfigNotExist"}) { return index, WrapErrorf(err, NotFoundMsg, AliyunLogGoSdkERROR) } return index, WrapErrorf(err, DefaultErrorMsg, id, "GetIndex", AliyunLogGoSdkERROR) } if index == nil || (index.Line == nil && index.Keys == nil) { return index, WrapErrorf(NotFoundErr("LogStoreIndex", id), NotFoundMsg, ProviderERROR) } return index, nil } func (s *LogService) DescribeLogMachineGroup(id string) (*sls.MachineGroup, error) { group := &sls.MachineGroup{} parts, err := ParseResourceId(id, 2) if err != nil { return group, WrapError(err) } projectName, groupName := parts[0], parts[1] var requestInfo *sls.Client err = resource.Retry(2*time.Minute, func() *resource.RetryError { raw, err := s.client.WithLogClient(func(slsClient *sls.Client) (interface{}, error) { requestInfo = slsClient return slsClient.GetMachineGroup(projectName, groupName) }) if err != nil { if IsExpectedErrors(err, []string{"InternalServerError", LogClientTimeout}) { return resource.RetryableError(err) } return resource.NonRetryableError(err) } if debugOn() { addDebug("GetMachineGroup", raw, requestInfo, map[string]string{ "project": projectName, "machineGroup": groupName, }) } group, _ = raw.(*sls.MachineGroup) return nil }) if err != nil { if IsExpectedErrors(err, []string{"ProjectNotExist", "GroupNotExist", "MachineGroupNotExist"}) { return group, WrapErrorf(err, NotFoundMsg, AliyunLogGoSdkERROR) } return group, WrapErrorf(err, DefaultErrorMsg, id, "GetMachineGroup", AliyunLogGoSdkERROR) } if group == nil || group.Name == "" { return group, WrapErrorf(NotFoundErr("LogMachineGroup", id), NotFoundMsg, ProviderERROR) } return group, nil } func (s *LogService) WaitForLogMachineGroup(id string, status Status, timeout int) error { deadline := time.Now().Add(time.Duration(timeout) * time.Second) parts, err := ParseResourceId(id, 2) if err != nil { return WrapError(err) } name := parts[1] for { object, err := s.DescribeLogMachineGroup(id) if err != nil { if NotFoundError(err) { if status == Deleted { return nil } } else { return WrapError(err) } } if object.Name == name && status != Deleted { return nil } if time.Now().After(deadline) { return WrapErrorf(err, WaitTimeoutMsg, id, GetFunc(1), timeout, object.Name, name, ProviderERROR) } } } func (s *LogService) DescribeLogtailConfig(id string) (*sls.LogConfig, error) { response := &sls.LogConfig{} parts, err := ParseResourceId(id, 3) if err != nil { return response, WrapError(err) } projectName, configName := parts[0], parts[2] var requestInfo *sls.Client 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) } return resource.NonRetryableError(err) } if debugOn() { addDebug("GetConfig", raw, requestInfo, map[string]string{ "project": projectName, "config": configName, }) } response, _ = raw.(*sls.LogConfig) return nil }) if err != nil { if IsExpectedErrors(err, []string{"ProjectNotExist", "LogStoreNotExist", "ConfigNotExist"}) { return response, WrapErrorf(err, NotFoundMsg, AliyunLogGoSdkERROR) } return response, WrapErrorf(err, DefaultErrorMsg, id, "GetConfig", AliyunLogGoSdkERROR) } if response == nil || response.Name == "" { return response, WrapErrorf(NotFoundErr("LogTailConfig", id), NotFoundMsg, ProviderERROR) } return response, nil } func (s *LogService) WaitForLogtailConfig(id string, status Status, timeout int) error { deadline := time.Now().Add(time.Duration(timeout) * time.Second) parts, err := ParseResourceId(id, 3) if err != nil { return WrapError(err) } name := parts[2] for { object, err := s.DescribeLogtailConfig(id) if err != nil { if NotFoundError(err) { if status == Deleted { return nil } } else { return WrapError(err) } } if object.Name == name && status != Deleted { return nil } if time.Now().After(deadline) { return WrapErrorf(err, WaitTimeoutMsg, id, GetFunc(1), timeout, object.Name, name, ProviderERROR) } } } func (s *LogService) DescribeLogtailAttachment(id string) (groupName string, err error) { parts, err := ParseResourceId(id, 3) if err != nil { return groupName, WrapError(err) } projectName, configName, name := parts[0], parts[1], parts[2] var groupNames []string var requestInfo *sls.Client err = resource.Retry(2*time.Minute, func() *resource.RetryError { raw, err := s.client.WithLogClient(func(slsClient *sls.Client) (interface{}, error) { requestInfo = slsClient return slsClient.GetAppliedMachineGroups(projectName, configName) }) if err != nil { if IsExpectedErrors(err, []string{"InternalServerError"}) { return resource.RetryableError(err) } return resource.NonRetryableError(err) } if debugOn() { addDebug("GetAppliedMachineGroups", raw, requestInfo, map[string]string{ "project": projectName, "confName": configName, }) } groupNames, _ = raw.([]string) return nil }) if err != nil { if IsExpectedErrors(err, []string{"ProjectNotExist", "ConfigNotExist", "MachineGroupNotExist"}) { return groupName, WrapErrorf(err, NotFoundMsg, AliyunLogGoSdkERROR) } return groupName, WrapErrorf(err, DefaultErrorMsg, id, "GetAppliedMachineGroups", AliyunLogGoSdkERROR) } for _, group_name := range groupNames { if group_name == name { groupName = group_name } } if groupName == "" { return groupName, WrapErrorf(NotFoundErr("LogtailAttachment", id), NotFoundMsg, ProviderERROR) } return groupName, nil } func (s *LogService) WaitForLogtailAttachment(id string, status Status, timeout int) error { deadline := time.Now().Add(time.Duration(timeout) * time.Second) parts, err := ParseResourceId(id, 3) if err != nil { return WrapError(err) } name := parts[2] for { object, err := s.DescribeLogtailAttachment(id) if err != nil { if NotFoundError(err) { if status == Deleted { return nil } } else { return WrapError(err) } } if object == name && status != Deleted { return nil } if time.Now().After(deadline) { return WrapErrorf(err, WaitTimeoutMsg, id, GetFunc(1), timeout, object, name, ProviderERROR) } } } func (s *LogService) DescribeLogAlertResource(id string) (map[string]string, error) { var result = map[string]string{} parts, err := ParseResourceId(id, 3) if err != nil { return result, WrapError(err) } resourceType := parts[1] if err := resource.Retry(2*time.Minute, func() *resource.RetryError { _, err := s.client.WithLogPopClient(func(slsPopClient *slsPop.Client) (interface{}, error) { switch resourceType { case "user": _, err := s.client.WithLogClient(func(slsClient *sls.Client) (interface{}, error) { record, err := slsClient.GetResourceRecord("sls.alert.global_config", "default_config") if err != nil { return nil, err } var alertGlobalConfig AlertGlobalConfig err = json.Unmarshal([]byte(record.Value), &alertGlobalConfig) if err != nil { return nil, err } region := alertGlobalConfig.ConfigDetail.AlertCenterLog.Region accountId, err := s.client.AccountId() if err != nil { return nil, err } projectName := fmt.Sprintf("sls-alert-%s-%s", accountId, region) endpoint := slsClient.Endpoint slsClient.Endpoint = strings.Replace(endpoint, s.client.RegionId, region, 1) _, err = slsClient.GetProject(projectName) if err != nil { slsClient.Endpoint = endpoint return nil, err } _, err = slsClient.GetLogStore(projectName, "internal-alert-center-log") slsClient.Endpoint = endpoint if err != nil { return nil, err } return nil, nil }) if err != nil { if IsExpectedErrors(err, []string{"ProjectNotExist"}) || IsExpectedErrors(err, []string{"LogStoreNotExist"}) { return result, nil } return nil, err } lang := parts[2] result["type"] = resourceType result["project"] = "" result["lang"] = lang return result, nil case "project": project := parts[2] _, err := s.client.WithLogClient(func(slsClient *sls.Client) (interface{}, error) { return slsClient.GetLogStore(project, "internal-alert-history") }) if err != nil { if IsExpectedErrors(err, []string{"LogStoreNotExist"}) { return nil, nil } return nil, err } result["type"] = resourceType result["project"] = project result["lang"] = "" return result, nil default: return result, WrapErrorf(errors.New("type error"), DefaultErrorMsg, "alicloud_log_alert_resource", "ReadAlertResource", AliyunLogGoSdkERROR) } }) if err != nil { if IsExpectedErrors(err, []string{LogClientTimeout}) { time.Sleep(5 * time.Second) return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }); err != nil { return result, WrapErrorf(err, DefaultErrorMsg, "alicloud_log_alert_resource", "ReadAlertResource", AliyunLogGoSdkERROR) } return result, nil } func (s *LogService) DescribeLogAlert(id string) (*sls.Alert, error) { alert := &sls.Alert{} parts, err := ParseResourceId(id, 2) if err != nil { return alert, WrapError(err) } projectName, alertName := parts[0], parts[1] var requestInfo *sls.Client err = resource.Retry(2*time.Minute, func() *resource.RetryError { raw, err := s.client.WithLogClient(func(slsClient *sls.Client) (interface{}, error) { requestInfo = slsClient return slsClient.GetAlert(projectName, alertName) }) if err != nil { if IsExpectedErrors(err, []string{"InternalServerError", LogClientTimeout}) { return resource.RetryableError(err) } return resource.NonRetryableError(err) } if debugOn() { addDebug("GetLogstoreAlert", raw, requestInfo, map[string]string{ "project": projectName, "alert_name": alertName, }) } alert, _ = raw.(*sls.Alert) return nil }) if err != nil { if IsExpectedErrors(err, []string{"ProjectNotExist", "JobNotExist"}) { return alert, WrapErrorf(err, NotFoundMsg, AliyunLogGoSdkERROR) } return alert, WrapErrorf(err, DefaultErrorMsg, id, "GetLogstoreAlert", AliyunLogGoSdkERROR) } if alert == nil || alert.Name == "" { return alert, WrapErrorf(NotFoundErr("LogstoreAlert", id), NotFoundMsg, ProviderERROR) } return alert, nil } func (s *LogService) WaitForLogstoreAlert(id string, status Status, timeout int) error { deadline := time.Now().Add(time.Duration(timeout) * time.Second) parts, err := ParseResourceId(id, 2) if err != nil { return WrapError(err) } name := parts[1] for { object, err := s.DescribeLogAlert(id) if err != nil { if NotFoundError(err) { if status == Deleted { return nil } } else { return WrapError(err) } } if object.Name == name && status != Deleted { return nil } if time.Now().After(deadline) { return WrapErrorf(err, WaitTimeoutMsg, id, GetFunc(1), timeout, object.Name, name, ProviderERROR) } } } func (s *LogService) CreateLogDashboard(project, name string) error { dashboard := sls.Dashboard{ DashboardName: name, ChartList: []sls.Chart{}, } err := resource.Retry(2*time.Minute, func() *resource.RetryError { raw, err := s.client.WithLogClient(func(slsClient *sls.Client) (interface{}, error) { return nil, slsClient.CreateDashboard(project, dashboard) }) if err != nil { if IsExpectedErrors(err, []string{"InternalServerError", LogClientTimeout}) { return resource.RetryableError(err) } if err.(*sls.Error).Message == "specified dashboard already exists" { return nil } return resource.NonRetryableError(err) } if debugOn() { addDebug("CreateLogDashboard", raw, map[string]string{ "project": project, "dashboard_name": name, }) } return nil }) if err != nil { return err } return nil } func CreateDashboard(project, name string, client *sls.Client) error { dashboard := sls.Dashboard{ DashboardName: name, ChartList: []sls.Chart{}, } err := resource.Retry(2*time.Minute, func() *resource.RetryError { err := client.CreateDashboard(project, dashboard) if err != nil { if err.(*sls.Error).Message == "specified dashboard already exists" { return nil } if IsExpectedErrors(err, []string{"InternalServerError", LogClientTimeout}) { return resource.RetryableError(err) } } if debugOn() { addDebug("CreateLogDashboard", dashboard, map[string]string{ "project": project, "dashboard_name": name, }) } return nil }) return err } func (s *LogService) DescribeLogAudit(id string) (*slsPop.DescribeAppResponse, error) { request := slsPop.CreateDescribeAppRequest() response := &slsPop.DescribeAppResponse{} request.AppName = "audit" raw, err := s.client.WithLogPopClient(func(client *slsPop.Client) (interface{}, error) { return client.DescribeApp(request) }) if err != nil { if IsExpectedErrors(err, []string{"AppNotExist"}) { return response, WrapErrorf(err, NotFoundMsg, AlibabaCloudSdkGoERROR) } } addDebug(request.GetActionName(), raw, request.RpcRequest, request) response, _ = raw.(*slsPop.DescribeAppResponse) return response, nil } func GetCharTitile(project, dashboard, char string, client *sls.Client) string { board, err := client.GetDashboard(project, dashboard) // If the query fails to ignore the error, return the original value. if err != nil { return char } for _, v := range board.ChartList { if v.Display.DisplayName == char { return v.Title } else { return char } } return char } func (s *LogService) DescribeLogDashboard(id string) (string, error) { dashboard := "" parts, err := ParseResourceId(id, 2) if err != nil { return dashboard, WrapError(err) } projectName, dashboardName := parts[0], parts[1] var requestInfo *sls.Client err = resource.Retry(2*time.Minute, func() *resource.RetryError { raw, err := s.client.WithLogClient(func(slsClient *sls.Client) (interface{}, error) { requestInfo = slsClient return slsClient.GetDashboardString(projectName, dashboardName) }) if err != nil { if IsExpectedErrors(err, []string{"InternalServerError", LogClientTimeout}) { return resource.RetryableError(err) } return resource.NonRetryableError(err) } if debugOn() { addDebug("GetLogstoreDashboard", raw, requestInfo, map[string]string{ "project": projectName, "dashboard_name": dashboardName, }) } dashboard, _ = raw.(string) return nil }) if err != nil { if IsExpectedErrors(err, []string{"ProjectNotExist", "DashboardNotExist"}) { return dashboard, WrapErrorf(err, NotFoundMsg, AliyunLogGoSdkERROR) } return dashboard, WrapErrorf(err, DefaultErrorMsg, id, "GetLogstoreDashboard", AliyunLogGoSdkERROR) } if dashboard == "" { return dashboard, WrapErrorf(NotFoundErr("LogstoreDashboard", id), NotFoundMsg, ProviderERROR) } return dashboard, nil } func (s *LogService) WaitForLogDashboard(id string, status Status, timeout int) error { deadline := time.Now().Add(time.Duration(timeout) * time.Second) parts, err := ParseResourceId(id, 2) if err != nil { return WrapError(err) } name := parts[1] for { objectString, err := s.DescribeLogDashboard(id) if err != nil { if NotFoundError(err) { if status == Deleted { return nil } } else { return WrapError(err) } } if objectString != "" && status != Deleted { return nil } if time.Now().After(deadline) { return WrapErrorf(err, WaitTimeoutMsg, id, GetFunc(1), timeout, objectString, name, ProviderERROR) } } } func (s *LogService) DescribeLogProjectPolicy(id string) (string, error) { policy := "" projectName := id var requestInfo *sls.Client err := resource.Retry(2*time.Minute, func() *resource.RetryError { raw, err := s.client.WithLogClient(func(slsClient *sls.Client) (interface{}, error) { requestInfo = slsClient return slsClient.GetProjectPolicy(projectName) }) if err != nil { if IsExpectedErrors(err, []string{"InternalServerError", LogClientTimeout}) { return resource.RetryableError(err) } return resource.NonRetryableError(err) } if debugOn() { addDebug("GetLogProjectPolicy", raw, requestInfo, map[string]string{ "project": projectName, }) } policy, _ = raw.(string) return nil }) if err != nil { if IsExpectedErrors(err, []string{"ProjectNotExist"}) { return policy, WrapErrorf(err, NotFoundMsg, AliyunLogGoSdkERROR) } return policy, WrapErrorf(err, DefaultErrorMsg, id, "GetProjectPolicy", AliyunLogGoSdkERROR) } return policy, nil } func (s *LogService) DescribeLogProjectTags(project_name string) ([]*sls.ResourceTagResponse, error) { var requestInfo *sls.Client var respTags []*sls.ResourceTagResponse err := resource.Retry(2*time.Minute, func() *resource.RetryError { raw, err := s.client.WithLogClient(func(slsClient *sls.Client) (interface{}, error) { requestInfo = slsClient raw, _, err := slsClient.ListTagResources(project_name, "project", []string{project_name}, []sls.ResourceFilterTag{}, "") return raw, err }) if err != nil { if IsExpectedErrors(err, []string{LogClientTimeout}) { time.Sleep(5 * time.Second) return resource.RetryableError(err) } return resource.NonRetryableError(err) } if debugOn() { addDebug("GetProjectTags", raw, requestInfo, map[string]string{"project_name": project_name}) } respTags = raw.([]*sls.ResourceTagResponse) return nil }) if err != nil { if IsExpectedErrors(err, []string{"ProjectNotExist"}) { return respTags, WrapErrorf(err, NotFoundMsg, AliyunLogGoSdkERROR) } return respTags, WrapErrorf(err, DefaultErrorMsg, project_name, "GetProejctTags", AliyunLogGoSdkERROR) } return respTags, nil } func (s *LogService) DescribeLogEtl(id string) (*sls.ETL, error) { etl := &sls.ETL{} parts, err := ParseResourceId(id, 2) if err != nil { return etl, WrapError(err) } projectName, etlName := parts[0], parts[1] var requestInfo *sls.Client err = resource.Retry(2*time.Minute, func() *resource.RetryError { raw, err := s.client.WithLogClient(func(slsClient *sls.Client) (interface{}, error) { requestInfo = slsClient return slsClient.GetETL(projectName, etlName) }) if err != nil { if IsExpectedErrors(err, []string{"InternalServerError", LogClientTimeout}) { return resource.RetryableError(err) } return resource.NonRetryableError(err) } if debugOn() { addDebug("GetLogETL", raw, requestInfo, map[string]string{ "project": projectName, "etl_name": etlName, }) } etl, _ = raw.(*sls.ETL) return nil }) if err != nil { if IsExpectedErrors(err, []string{"ProjectNotExist", "JobNotExist"}) { return etl, WrapErrorf(err, NotFoundMsg, AliyunLogGoSdkERROR) } return etl, WrapErrorf(err, DefaultErrorMsg, id, "GetETL", AliyunLogGoSdkERROR) } return etl, nil } func (s *LogService) WaitForLogETL(id string, status Status, timeout int) error { deadline := time.Now().Add(time.Duration(timeout) * time.Second) parts, err := ParseResourceId(id, 2) if err != nil { return WrapError(err) } for { object, err := s.DescribeLogEtl(id) if err != nil { if NotFoundError(err) { if status == Deleted { return nil } } else { return WrapError(err) } } if object.Name == parts[1] && status != Deleted { return nil } if time.Now().After(deadline) { return WrapErrorf(err, WaitTimeoutMsg, id, GetFunc(1), timeout, object.Name, id, ProviderERROR) } } } func (s *LogService) LogETLStateRefreshFunc(id string, failStates []string, slsClient *sls.Client) resource.StateRefreshFunc { return func() (interface{}, string, error) { parts, err := ParseResourceId(id, 2) if err != nil { return nil, "", WrapError(err) } object, err := slsClient.GetETL(parts[0], parts[1]) if err != nil { if NotFoundError(err) { // Set this to nil as if we didn't find anything. return nil, "", nil } return nil, "", WrapError(err) } for _, failState := range failStates { if object.Status == failState { return object, object.Status, WrapError(Error(FailedToReachTargetStatus, object.Status)) } } return object, object.Status, nil } } func (s *LogService) LogOssShipperStateRefreshFunc(id string, failStates []string) resource.StateRefreshFunc { return func() (interface{}, string, error) { object, err := s.DescribeLogEtl(id) if err != nil { if NotFoundError(err) { // Set this to nil as if we didn't find anything. return nil, "", nil } return nil, "", WrapError(err) } for _, failState := range failStates { if object.Status == failState { return object, object.Status, WrapError(Error(FailedToReachTargetStatus, object.Status)) } } return object, object.Status, nil } } func (s *LogService) DescribeLogOssShipper(id string) (*sls.Shipper, error) { var shipper *sls.Shipper parts, err := ParseResourceId(id, 3) if err != nil { return shipper, WrapError(err) } projectName, logstoreName, shipperName := parts[0], parts[1], parts[2] var requestInfo *sls.Client err = resource.Retry(2*time.Minute, func() *resource.RetryError { raw, err := s.client.WithLogClient(func(slsClient *sls.Client) (interface{}, error) { requestInfo = slsClient project, _ := sls.NewLogProject(projectName, slsClient.Endpoint, slsClient.AccessKeyID, slsClient.AccessKeySecret) project, _ = project.WithToken(slsClient.SecurityToken) logstore, _ := sls.NewLogStore(logstoreName, project) return logstore.GetShipper(shipperName) }) if err != nil { if IsExpectedErrors(err, []string{"InternalServerError", LogClientTimeout}) { return resource.RetryableError(err) } return resource.NonRetryableError(err) } if debugOn() { addDebug("GetLogOssShipper", raw, requestInfo, map[string]string{ "project_name": projectName, "logstore_name": logstoreName, "shipper_name": shipperName, }) } shipper, _ = raw.(*sls.Shipper) return nil }) if err != nil { if IsExpectedErrors(err, []string{"ProjectNotExist"}) { return shipper, WrapErrorf(err, NotFoundMsg, AliyunLogGoSdkERROR) } // SLS server problem, temporarily by returning nil value to solve. if d, ok := err.(*sls.Error); ok { if d.Message == fmt.Sprintf("shipperName %s does not exist", parts[2]) { return shipper, WrapErrorf(err, NotFoundMsg, AliyunLogGoSdkERROR) } } return shipper, WrapErrorf(err, DefaultErrorMsg, id, "GetLogOssShipper", AliyunLogGoSdkERROR) } return shipper, nil } func (s *LogService) WaitForLogOssShipper(id string, status Status, timeout int) error { deadline := time.Now().Add(time.Duration(timeout) * time.Second) parts, err := ParseResourceId(id, 3) if err != nil { return WrapError(err) } for { object, err := s.DescribeLogOssShipper(id) if err != nil { if object == nil { if status == Deleted { return nil } } else { return WrapError(err) } } if object.ShipperName == parts[2] && status != Deleted { return nil } if time.Now().After(deadline) { return WrapErrorf(err, WaitTimeoutMsg, id, GetFunc(1), timeout, object.ShipperName, id, ProviderERROR) } } } func (s *LogService) LogProjectStateRefreshFunc(id string, failStates []string) resource.StateRefreshFunc { return func() (interface{}, string, error) { object, err := s.DescribeLogProject(id) if err != nil { if NotFoundError(err) { // Set this to nil as if we didn't find anything. return nil, "", nil } return nil, "", WrapError(err) } for _, failState := range failStates { if object.Status == failState { return object, object.Status, WrapError(Error(FailedToReachTargetStatus, object.Status)) } } return object, object.Status, nil } } func (s *LogService) DescribeLogIngestion(id string) (*sls.Ingestion, error) { var ingestion *sls.Ingestion parts, err := ParseResourceId(id, 3) if err != nil { return ingestion, WrapError(err) } projectName, logstoreName, ingestionName := parts[0], parts[1], parts[2] var requestInfo *sls.Client err = resource.Retry(2*time.Minute, func() *resource.RetryError { raw, err := s.client.WithLogClient(func(slsClient *sls.Client) (interface{}, error) { requestInfo = slsClient return slsClient.GetIngestion(projectName, ingestionName) }) if err != nil { if IsExpectedErrors(err, []string{"InternalServerError", LogClientTimeout}) { return resource.RetryableError(err) } return resource.NonRetryableError(err) } if debugOn() { addDebug("GetIngestion", raw, requestInfo, map[string]string{ "project": projectName, "logstore": logstoreName, "ingestion_name": ingestionName, }) } ingestion, _ = raw.(*sls.Ingestion) return nil }) if err != nil { if IsExpectedErrors(err, []string{"ProjectNotExist", "JobNotExist"}) { return ingestion, WrapErrorf(err, NotFoundMsg, AliyunLogGoSdkERROR) } return ingestion, WrapErrorf(err, DefaultErrorMsg, id, "GetIngestion", AliyunLogGoSdkERROR) } return ingestion, nil } func (s *LogService) WaitForLogIngestion(id string, status Status, timeout int) error { deadline := time.Now().Add(time.Duration(timeout) * time.Second) parts, err := ParseResourceId(id, 3) if err != nil { return WrapError(err) } for { object, err := s.DescribeLogIngestion(id) if err != nil { if NotFoundError(err) { if status == Deleted { return nil } } else { return WrapError(err) } } if object.Name == parts[2] && status != Deleted { return nil } if time.Now().After(deadline) { return WrapErrorf(err, WaitTimeoutMsg, id, GetFunc(1), timeout, object.Name, id, ProviderERROR) } } } func (s *LogService) DescribeLogOssExport(id string) (*sls.Export, error) { return s.describeLogExport(id) } func (s *LogService) describeLogExport(id string) (*sls.Export, error) { var export *sls.Export parts, err := ParseResourceId(id, 3) if err != nil { return export, WrapError(err) } projectName, logstoreName, exportName := parts[0], parts[1], parts[2] var requestInfo *sls.Client err = resource.Retry(2*time.Minute, func() *resource.RetryError { raw, err := s.client.WithLogClient(func(slsClient *sls.Client) (interface{}, error) { requestInfo = slsClient return slsClient.GetExport(projectName, exportName) }) if err != nil { if IsExpectedErrors(err, []string{"InternalServerError", LogClientTimeout}) { return resource.RetryableError(err) } return resource.NonRetryableError(err) } if debugOn() { addDebug("GetExport", raw, requestInfo, map[string]string{ "project": projectName, "logstore": logstoreName, "export_name": exportName, }) } export, _ = raw.(*sls.Export) return nil }) if err != nil { if IsExpectedErrors(err, []string{"ProjectNotExist", "JobNotExist"}) { return export, WrapErrorf(err, NotFoundMsg, AliyunLogGoSdkERROR) } return export, WrapErrorf(err, DefaultErrorMsg, id, "GetExport", AliyunLogGoSdkERROR) } return export, nil } func (s *LogService) WaitForLogOssExport(id string, status Status, timeout int) error { return s.waitForLogExport(id, status, timeout) } func (s *LogService) waitForLogExport(id string, status Status, timeout int) error { deadline := time.Now().Add(time.Duration(timeout) * time.Second) parts, err := ParseResourceId(id, 3) if err != nil { return WrapError(err) } for { object, err := s.DescribeLogOssExport(id) if err != nil { if NotFoundError(err) { if status == Deleted { return nil } } else { return WrapError(err) } } if object.Name == parts[2] && status != Deleted { return nil } if time.Now().After(deadline) { return WrapErrorf(err, WaitTimeoutMsg, id, GetFunc(1), timeout, object.Name, id, ProviderERROR) } } } func (s *LogService) DescribeLogResource(id string) (*sls.Resource, error) { res := &sls.Resource{} resourceName := id var requestInfo *sls.Client err := resource.Retry(2*time.Minute, func() *resource.RetryError { raw, err := s.client.WithLogClient(func(slsClient *sls.Client) (interface{}, error) { requestInfo = slsClient return slsClient.GetResource(resourceName) }) if err != nil { if IsExpectedErrors(err, []string{"InternalServerError", LogClientTimeout}) { return resource.RetryableError(err) } return resource.NonRetryableError(err) } if debugOn() { addDebug("GetResource", raw, requestInfo, map[string]string{ "resource_name": resourceName, }) } res, _ = raw.(*sls.Resource) return nil }) if err != nil { if IsExpectedErrors(err, []string{"ResourceNotExist"}) { return res, WrapErrorf(err, NotFoundMsg, AliyunLogGoSdkERROR) } return res, WrapErrorf(err, DefaultErrorMsg, id, "GetLogResource", AliyunLogGoSdkERROR) } if res == nil { return res, WrapErrorf(NotFoundErr("LogResource", id), NotFoundMsg, ProviderERROR) } return res, nil } func (s *LogService) WaitForLogResource(id string, status Status, timeout int) error { deadline := time.Now().Add(time.Duration(timeout) * time.Second) resourceName := id for { object, err := s.DescribeLogResource(resourceName) if err != nil { if NotFoundError(err) { if status == Deleted { return nil } } else { return WrapError(err) } } if object.Name == resourceName && status != Deleted { return nil } if time.Now().After(deadline) { return WrapErrorf(err, WaitTimeoutMsg, id, GetFunc(1), timeout, object.Name, resourceName, ProviderERROR) } } } func (s *LogService) DescribeLogResourceRecord(id string) (*sls.ResourceRecord, error) { res := &sls.ResourceRecord{} parts, err := ParseResourceId(id, 2) if err != nil { return res, WrapError(err) } resourceName, recordId := parts[0], parts[1] var requestInfo *sls.Client err = resource.Retry(2*time.Minute, func() *resource.RetryError { raw, err := s.client.WithLogClient(func(slsClient *sls.Client) (interface{}, error) { requestInfo = slsClient return slsClient.GetResourceRecord(resourceName, recordId) }) if err != nil { if IsExpectedErrors(err, []string{"InternalServerError", LogClientTimeout}) { return resource.RetryableError(err) } return resource.NonRetryableError(err) } if debugOn() { addDebug("GetResourceRecord", raw, requestInfo, map[string]string{ "resource_name": resourceName, "record_id": recordId, }) } res, _ = raw.(*sls.ResourceRecord) return nil }) if err != nil { if IsExpectedErrors(err, []string{"ResourceNotExist", "ResourceRecordNotExist"}) { return res, WrapErrorf(err, NotFoundMsg, AliyunLogGoSdkERROR) } return res, WrapErrorf(err, DefaultErrorMsg, id, "GetLogResourceRecord", AliyunLogGoSdkERROR) } if res == nil { return res, WrapErrorf(NotFoundErr("LogResourceRecord", id), NotFoundMsg, ProviderERROR) } return res, nil } func (s *LogService) WaitForLogResourceRecord(id string, status Status, timeout int) error { parts, err := ParseResourceId(id, 2) if err != nil { return WrapError(err) } recordId := parts[1] deadline := time.Now().Add(time.Duration(timeout) * time.Second) for { object, err := s.DescribeLogResourceRecord(id) if err != nil { if NotFoundError(err) { if status == Deleted { return nil } } else { return WrapError(err) } } if object.Id == recordId && status != Deleted { return nil } if time.Now().After(deadline) { return WrapErrorf(err, WaitTimeoutMsg, id, GetFunc(1), timeout, object.Id, recordId, ProviderERROR) } } }