alibabacloudstack/service_apsarastack_log.go (589 lines of code) (raw):
package alibabacloudstack
import (
"encoding/json"
"time"
sls "github.com/aliyun/aliyun-log-go-sdk"
"github.com/aliyun/terraform-provider-alibabacloudstack/alibabacloudstack/connectivity"
"github.com/aliyun/terraform-provider-alibabacloudstack/alibabacloudstack/errmsgs"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
)
var SlsClientTimeoutCatcher = Catcher{errmsgs.LogClientTimeout, 15, 5}
type LogService struct {
client *connectivity.AlibabacloudStackClient
}
type LogProject struct {
ProjectName string `json:"projectName"`
Status string `json:"status"`
Owner string `json:"owner"`
Description string `json:"description"`
Region string `json:"region"`
CreateTime string `json:"createTime"`
LastModifyTime string `json:"lastModifyTime"`
Count int `json:"count"`
Total int `json:"total"`
Projects []struct {
ProjectName string `json:"projectName"`
Status string `json:"status"`
Owner string `json:"owner"`
Description string `json:"description"`
Region string `json:"region"`
CreateTime string `json:"createTime"`
LastModifyTime string `json:"lastModifyTime"`
} `json:"projects"`
}
func (s *LogService) DescribeLogProject(id string) (*LogProject, error) {
var err error
request := s.client.NewCommonRequest("POST", "SLS", "2020-03-31", "GetProject", "")
request.QueryParams["projectName"] = id
var logProject *LogProject
bresponse, err := s.client.ProcessCommonRequest(request)
if err != nil {
if errmsgs.IsExpectedErrors(err, []string{"ProjectNotExist"}) {
return logProject, errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackLogGoSdkERROR)
}
if bresponse == nil {
return logProject, errmsgs.WrapErrorf(err, "Process Common Request Failed")
}
errmsg := errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
return logProject, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
err = json.Unmarshal(bresponse.GetHttpContentBytes(), &logProject)
if logProject != nil && logProject.ProjectName == "" && len(logProject.Projects) > 0 {
for _, k := range logProject.Projects {
if k.ProjectName == id {
logProject.ProjectName = k.ProjectName
logProject.Description = k.Description
break
}
}
}
if logProject == nil || logProject.ProjectName == "" {
return logProject, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("LogProject", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR)
}
return logProject, 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 errmsgs.NotFoundError(err) {
if status == Deleted {
return nil
}
} else {
return errmsgs.WrapError(err)
}
}
if object.ProjectName == id && status != Deleted {
return nil
}
if time.Now().After(deadline) {
return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, object.ProjectName, id, errmsgs.ProviderERROR)
}
}
}
func (s *LogService) DescribeLogStore(id string) (*sls.LogStore, error) {
store := &sls.LogStore{}
parts, err := ParseResourceId(id, 2)
if err != nil {
return store, errmsgs.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.WithSlsDataClient(func(slsClient *sls.Client) (interface{}, error) {
requestInfo = slsClient
return slsClient.GetLogStore(projectName, name)
})
if err != nil {
if errmsgs.IsExpectedErrors(err, []string{"InternalServerError", errmsgs.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 errmsgs.IsExpectedErrors(err, []string{"ProjectNotExist", "LogStoreNotExist"}) {
return store, errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackLogGoSdkERROR)
}
return store, errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, id, "GetLogStore", errmsgs.AlibabacloudStackLogGoSdkERROR)
}
if store == nil || store.Name == "" {
return store, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("LogStore", id)), errmsgs.NotFoundMsg, errmsgs.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 errmsgs.WrapError(err)
}
name := parts[1]
for {
object, err := s.DescribeLogStore(id)
if err != nil {
if errmsgs.NotFoundError(err) {
if status == Deleted {
return nil
}
} else {
return errmsgs.WrapError(err)
}
}
if object.Name == name && status != Deleted {
return nil
}
if time.Now().After(deadline) {
return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, object.Name, name, errmsgs.ProviderERROR)
}
}
}
func (s *LogService) DescribeLogStoreIndex(id string) (*sls.Index, error) {
index := &sls.Index{}
parts, err := ParseResourceId(id, 2)
if err != nil {
return index, errmsgs.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.WithSlsDataClient(func(slsClient *sls.Client) (interface{}, error) {
requestInfo = slsClient
return slsClient.GetIndex(projectName, name)
})
if err != nil {
if errmsgs.IsExpectedErrors(err, []string{"InternalServerError", errmsgs.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 errmsgs.IsExpectedErrors(err, []string{"ProjectNotExist", "LogStoreNotExist", "IndexConfigNotExist"}) {
return index, errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackLogGoSdkERROR)
}
return index, errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, id, "GetIndex", errmsgs.AlibabacloudStackLogGoSdkERROR)
}
if index == nil || (index.Line == nil && index.Keys == nil) {
return index, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("LogStoreIndex", id)), errmsgs.NotFoundMsg, errmsgs.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, errmsgs.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.WithSlsDataClient(func(slsClient *sls.Client) (interface{}, error) {
requestInfo = slsClient
return slsClient.GetMachineGroup(projectName, groupName)
})
if err != nil {
if errmsgs.IsExpectedErrors(err, []string{"InternalServerError", errmsgs.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 errmsgs.IsExpectedErrors(err, []string{"ProjectNotExist", "GroupNotExist", "MachineGroupNotExist"}) {
return group, errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackLogGoSdkERROR)
}
return group, errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, id, "GetMachineGroup", errmsgs.AlibabacloudStackLogGoSdkERROR)
}
if group == nil || group.Name == "" {
return group, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("LogMachineGroup", id)), errmsgs.NotFoundMsg, errmsgs.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 errmsgs.WrapError(err)
}
name := parts[1]
for {
object, err := s.DescribeLogMachineGroup(id)
if err != nil {
if errmsgs.NotFoundError(err) {
if status == Deleted {
return nil
}
} else {
return errmsgs.WrapError(err)
}
}
if object.Name == name && status != Deleted {
return nil
}
if time.Now().After(deadline) {
return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, object.Name, name, errmsgs.ProviderERROR)
}
}
}
func (s *LogService) DescribeLogtailConfig(id string) (*sls.LogConfig, error) {
response := &sls.LogConfig{}
parts, err := ParseResourceId(id, 3)
if err != nil {
return response, errmsgs.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.WithSlsDataClient(func(slsClient *sls.Client) (interface{}, error) {
requestInfo = slsClient
return slsClient.GetConfig(projectName, configName)
})
if err != nil {
if errmsgs.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 errmsgs.IsExpectedErrors(err, []string{"ProjectNotExist", "LogStoreNotExist", "ConfigNotExist"}) {
return response, errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackLogGoSdkERROR)
}
return response, errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, id, "GetConfig", errmsgs.AlibabacloudStackLogGoSdkERROR)
}
if response == nil || response.Name == "" {
return response, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("LogTailConfig", id)), errmsgs.NotFoundMsg, errmsgs.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 errmsgs.WrapError(err)
}
name := parts[2]
for {
object, err := s.DescribeLogtailConfig(id)
if err != nil {
if errmsgs.NotFoundError(err) {
if status == Deleted {
return nil
}
} else {
return errmsgs.WrapError(err)
}
}
if object.Name == name && status != Deleted {
return nil
}
if time.Now().After(deadline) {
return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, object.Name, name, errmsgs.ProviderERROR)
}
}
}
func (s *LogService) DescribeLogtailAttachment(id string) (groupName string, err error) {
parts, err := ParseResourceId(id, 3)
if err != nil {
return groupName, errmsgs.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.WithSlsDataClient(func(slsClient *sls.Client) (interface{}, error) {
requestInfo = slsClient
return slsClient.GetAppliedMachineGroups(projectName, configName)
})
if err != nil {
if errmsgs.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 errmsgs.IsExpectedErrors(err, []string{"ProjectNotExist", "ConfigNotExist", "MachineGroupNotExist"}) {
return groupName, errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackLogGoSdkERROR)
}
return groupName, errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, id, "GetAppliedMachineGroups", errmsgs.AlibabacloudStackLogGoSdkERROR)
}
for _, group_name := range groupNames {
if group_name == name {
groupName = group_name
}
}
if groupName == "" {
return groupName, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("LogtailAttachment", id)), errmsgs.NotFoundMsg, errmsgs.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 errmsgs.WrapError(err)
}
name := parts[2]
for {
object, err := s.DescribeLogtailAttachment(id)
if err != nil {
if errmsgs.NotFoundError(err) {
if status == Deleted {
return nil
}
} else {
return errmsgs.WrapError(err)
}
}
if object == name && status != Deleted {
return nil
}
if time.Now().After(deadline) {
return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, object, name, errmsgs.ProviderERROR)
}
}
}
func (s *LogService) DescribeLogAlert(id string) (*sls.Alert, error) {
alert := &sls.Alert{}
parts, err := ParseResourceId(id, 2)
if err != nil {
return alert, errmsgs.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.WithSlsDataClient(func(slsClient *sls.Client) (interface{}, error) {
requestInfo = slsClient
return slsClient.GetAlert(projectName, alertName)
})
if err != nil {
if errmsgs.IsExpectedErrors(err, []string{"InternalServerError", errmsgs.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 errmsgs.IsExpectedErrors(err, []string{"ProjectNotExist", "JobNotExist"}) {
return alert, errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackLogGoSdkERROR)
}
return alert, errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, id, "GetLogstoreAlert", errmsgs.AlibabacloudStackLogGoSdkERROR)
}
if alert == nil || alert.Name == "" {
return alert, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("LogstoreAlert", id)), errmsgs.NotFoundMsg, errmsgs.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 errmsgs.WrapError(err)
}
name := parts[1]
for {
object, err := s.DescribeLogAlert(id)
if err != nil {
if errmsgs.NotFoundError(err) {
if status == Deleted {
return nil
}
} else {
return errmsgs.WrapError(err)
}
}
if object.Name == name && status != Deleted {
return nil
}
if time.Now().After(deadline) {
return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, object.Name, name, errmsgs.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.WithSlsDataClient(func(slsClient *sls.Client) (interface{}, error) {
return nil, slsClient.CreateDashboard(project, dashboard)
})
if err != nil {
if errmsgs.IsExpectedErrors(err, []string{"InternalServerError", errmsgs.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 errmsgs.IsExpectedErrors(err, []string{"InternalServerError", errmsgs.LogClientTimeout}) {
return resource.RetryableError(err)
}
}
if debugOn() {
addDebug("CreateLogDashboard", dashboard, map[string]string{
"project": project,
"dashboard_name": name,
})
}
return nil
})
return err
}
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) (*sls.Dashboard, error) {
dashboard := &sls.Dashboard{}
parts, err := ParseResourceId(id, 2)
if err != nil {
return dashboard, errmsgs.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.WithSlsDataClient(func(slsClient *sls.Client) (interface{}, error) {
requestInfo = slsClient
return slsClient.GetDashboard(projectName, dashboardName)
})
if err != nil {
if errmsgs.IsExpectedErrors(err, []string{"InternalServerError", errmsgs.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.(*sls.Dashboard)
return nil
})
if err != nil {
if errmsgs.IsExpectedErrors(err, []string{"ProjectNotExist", "DashboardNotExist"}) {
return dashboard, errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackLogGoSdkERROR)
}
return dashboard, errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, id, "GetLogstoreDashboard", errmsgs.AlibabacloudStackLogGoSdkERROR)
}
if dashboard == nil || dashboard.DashboardName == "" {
return dashboard, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("LogstoreDashboard", id)), errmsgs.NotFoundMsg, errmsgs.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 errmsgs.WrapError(err)
}
name := parts[1]
for {
object, err := s.DescribeLogDashboard(id)
if err != nil {
if errmsgs.NotFoundError(err) {
if status == Deleted {
return nil
}
} else {
return errmsgs.WrapError(err)
}
}
if object.DashboardName == name && status != Deleted {
return nil
}
if time.Now().After(deadline) {
return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, object.DashboardName, name, errmsgs.ProviderERROR)
}
}
}