agent/taskengine/api.go (71 lines of code) (raw):
package taskengine
import (
"encoding/json"
"fmt"
"net/url"
"time"
"github.com/aliyun/aliyun_assist_client/agent/log"
"github.com/aliyun/aliyun_assist_client/agent/util"
"github.com/aliyun/aliyun_assist_client/common/langutil"
)
const (
invalidParamCron string = "cron"
invalidSignature string = "signature"
stopReasonKilled string = "killed"
stopReasonCompleted string = "completed"
stopFailed string = "failed"
)
const (
TaskReportErrTaskNotFound = "TaskNotFound"
TaskReportErrTaskStatusInvalid = "TaskStatusInvalid"
TaskInvalidStatusTerminated = "Terminated"
)
type TaskReportResp struct {
ErrorCode string `json:"errorCode"`
Status string `json:"status"`
}
func reportInvalidTask(taskId string, invokeVersion int, param, value string, extraLubanParams string) (string, error) {
escapedParam := url.QueryEscape(param)
escapedValue := url.QueryEscape(value)
path := util.GetInvalidTaskService()
querystring := fmt.Sprintf("?taskId=%s&invokeVersion=%d¶m=%s&value=%s",
taskId, invokeVersion, escapedParam, escapedValue)
url := path + querystring
url += extraLubanParams
var response string
var err error
response, err = util.HttpPost(url, "", "text")
for i := 0; i < 3 && err != nil; i++ {
time.Sleep(time.Duration(2) * time.Second)
response, err = util.HttpPost(url, "", "text")
}
return response, err
}
func sendStoppedOutput(taskId string, invokeVersion int, start int64, end int64, exitcode int,
dropped int, output string, reason string, stopErr error) (string, error) {
path := util.GetStoppedOutputService()
// luban/api/v1/task/stopped API requires extra result=killed parameter in
// querystring
querystring := fmt.Sprintf("?taskId=%s&invokeVersion=%d&start=%d&end=%d&exitcode=%d&dropped=%d&result=%s",
taskId, invokeVersion, start, end, exitcode, dropped, reason)
if stopErr != nil {
errDesc := stopErr.Error()
safelyTruncatedErrDesc := langutil.SafeTruncateStringInBytes(errDesc, 255)
escapedErrDesc := url.QueryEscape(safelyTruncatedErrDesc)
querystring = querystring + "&errCode=TerminationException&errDesc=" + escapedErrDesc
}
url := path + querystring
var response string
var err error
response, err = util.HttpPost(url, output, "text")
for i := 0; i < 3 && err != nil; i++ {
time.Sleep(time.Duration(2) * time.Second)
response, err = util.HttpPost(url, output, "text")
}
return response, err
}
func parseTaskReportResp(content string) *TaskReportResp {
resp := &TaskReportResp{}
if err := json.Unmarshal([]byte(content), resp); err != nil {
log.GetLogger().WithError(err).Error("Marshal TaskReportResp failed")
}
return resp
}