294 lines
6.5 KiB
Go
294 lines
6.5 KiB
Go
/*
|
|
* Tencent is pleased to support the open source community by making Blueking Container Service available.
|
|
* Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
|
|
* Licensed under the MIT License (the "License"); you may not use this file except
|
|
* in compliance with the License. You may obtain a copy of the License at
|
|
* http://opensource.org/licenses/MIT
|
|
* Unless required by applicable law or agreed to in writing, software distributed under
|
|
* the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
|
|
* either express or implied. See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
// Package types for task
|
|
package types
|
|
|
|
import (
|
|
"encoding/json"
|
|
"time"
|
|
)
|
|
|
|
// StepOptions xxx
|
|
type StepOptions struct {
|
|
MaxRetries uint32
|
|
SkipFailed bool
|
|
MaxExecutionSeconds uint32
|
|
}
|
|
|
|
// StepOption xxx
|
|
type StepOption func(opt *StepOptions)
|
|
|
|
// WithMaxRetries xxx
|
|
func WithMaxRetries(count uint32) StepOption {
|
|
return func(opt *StepOptions) {
|
|
opt.MaxRetries = count
|
|
}
|
|
}
|
|
|
|
// WithStepSkipFailed xxx
|
|
func WithStepSkipFailed(skip bool) StepOption {
|
|
return func(opt *StepOptions) {
|
|
opt.SkipFailed = skip
|
|
}
|
|
}
|
|
|
|
// WithMaxExecutionSeconds xxx
|
|
func WithMaxExecutionSeconds(execSecs uint32) StepOption {
|
|
return func(opt *StepOptions) {
|
|
opt.MaxExecutionSeconds = execSecs
|
|
}
|
|
}
|
|
|
|
// NewStep return a new step by default params
|
|
func NewStep(name string, executor string, opts ...StepOption) *Step {
|
|
defaultOptions := &StepOptions{MaxRetries: 0}
|
|
for _, opt := range opts {
|
|
opt(defaultOptions)
|
|
}
|
|
|
|
return &Step{
|
|
Name: name,
|
|
Executor: executor,
|
|
Params: map[string]string{},
|
|
Payload: DefaultPayloadContent,
|
|
Status: TaskStatusNotStarted,
|
|
Message: "",
|
|
RetryCount: 0,
|
|
SkipOnFailed: defaultOptions.SkipFailed,
|
|
MaxRetries: defaultOptions.MaxRetries,
|
|
MaxExecutionSeconds: defaultOptions.MaxExecutionSeconds,
|
|
}
|
|
}
|
|
|
|
// GetName return task name
|
|
func (s *Step) GetName() string {
|
|
return s.Name
|
|
}
|
|
|
|
// GetAlias return task alias
|
|
func (s *Step) GetAlias() string {
|
|
return s.Alias
|
|
}
|
|
|
|
// SetAlias set task alias
|
|
func (s *Step) SetAlias(alias string) *Step {
|
|
s.Alias = alias
|
|
return s
|
|
}
|
|
|
|
// GetParam return step param by key
|
|
func (s *Step) GetParam(key string) (string, bool) {
|
|
if value, ok := s.Params[key]; ok {
|
|
return value, true
|
|
}
|
|
return "", false
|
|
}
|
|
|
|
// AddParam set step param by key,value
|
|
func (s *Step) AddParam(key, value string) *Step {
|
|
if s.Params == nil {
|
|
s.Params = make(map[string]string, 0)
|
|
}
|
|
s.Params[key] = value
|
|
return s
|
|
}
|
|
|
|
// GetParams return all step params
|
|
func (s *Step) GetParams() map[string]string {
|
|
if s.Params == nil {
|
|
s.Params = make(map[string]string, 0)
|
|
}
|
|
return s.Params
|
|
}
|
|
|
|
// SetParams set step params by map
|
|
func (s *Step) SetParams(params map[string]string) {
|
|
if s.Params == nil {
|
|
s.Params = make(map[string]string, 0)
|
|
}
|
|
for key, value := range params {
|
|
s.Params[key] = value
|
|
}
|
|
}
|
|
|
|
// SetNewParams replace all params by new params
|
|
func (s *Step) SetNewParams(params map[string]string) *Step {
|
|
s.Params = params
|
|
return s
|
|
}
|
|
|
|
// GetPayload unmarshal step payload to struct obj
|
|
func (s *Step) GetPayload(obj any) error {
|
|
if len(s.Payload) == 0 {
|
|
s.Payload = DefaultPayloadContent
|
|
}
|
|
return json.Unmarshal([]byte(s.Payload), obj)
|
|
}
|
|
|
|
// SetPayload marshal struct obj to step payload
|
|
func (s *Step) SetPayload(obj any) error {
|
|
result, err := json.Marshal(obj)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
s.Payload = string(result)
|
|
return nil
|
|
}
|
|
|
|
// GetStatus return step status
|
|
func (s *Step) GetStatus() string {
|
|
return s.Status
|
|
}
|
|
|
|
// IsCompleted return step completed or not
|
|
func (s *Step) IsCompleted() bool {
|
|
// 已经完成
|
|
if s.Status == TaskStatusSuccess {
|
|
return true
|
|
}
|
|
|
|
// 失败需要看重试次数
|
|
if s.Status == TaskStatusFailure {
|
|
// 还有重试次数
|
|
if s.MaxRetries > 0 && s.RetryCount < s.MaxRetries {
|
|
return false
|
|
}
|
|
return true
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
// SetStatus set status
|
|
func (s *Step) SetStatus(stat string) *Step {
|
|
s.Status = stat
|
|
return s
|
|
}
|
|
|
|
// GetMessage get step message
|
|
func (s *Step) GetMessage() string {
|
|
return s.Message
|
|
}
|
|
|
|
// SetMessage set step message
|
|
func (s *Step) SetMessage(msg string) *Step {
|
|
s.Message = msg
|
|
return s
|
|
}
|
|
|
|
// GetSkipOnFailed get step skipOnFailed
|
|
func (s *Step) GetSkipOnFailed() bool {
|
|
return s.SkipOnFailed
|
|
}
|
|
|
|
// SetSkipOnFailed set step skipOnFailed
|
|
func (s *Step) SetSkipOnFailed(skipOnFailed bool) *Step {
|
|
s.SkipOnFailed = skipOnFailed
|
|
return s
|
|
}
|
|
|
|
// SetMaxTries set step max retry count
|
|
func (s *Step) SetMaxTries(count uint32) *Step {
|
|
s.MaxRetries = count
|
|
return s
|
|
}
|
|
|
|
// GetRetryCount get step retry count
|
|
func (s *Step) GetRetryCount() uint32 {
|
|
return s.RetryCount
|
|
}
|
|
|
|
// AddRetryCount add step retry count
|
|
func (s *Step) AddRetryCount(count uint32) *Step {
|
|
s.RetryCount += count
|
|
return s
|
|
}
|
|
|
|
// SetCountdown step eta with countdown(seconds)
|
|
func (s *Step) SetCountdown(c int) *Step {
|
|
// 默认就是立即执行, 0值忽略
|
|
if c <= 0 {
|
|
return s
|
|
}
|
|
|
|
t := time.Now().Add(time.Duration(c) * time.Second)
|
|
s.ETA = &t
|
|
return s
|
|
}
|
|
|
|
// SetETA step estimated time of arrival
|
|
func (s *Step) SetETA(t time.Time) *Step {
|
|
if t.Before(time.Now()) {
|
|
return s
|
|
}
|
|
|
|
s.ETA = &t
|
|
return s
|
|
}
|
|
|
|
// GetStartTime get start time
|
|
func (s *Step) GetStartTime() time.Time {
|
|
return s.Start
|
|
}
|
|
|
|
// SetStartTime update start time
|
|
func (s *Step) SetStartTime(t time.Time) *Step {
|
|
s.Start = t
|
|
return s
|
|
}
|
|
|
|
// GetEndTime get end time
|
|
func (s *Step) GetEndTime() time.Time {
|
|
return s.End
|
|
}
|
|
|
|
// SetEndTime set end time
|
|
func (s *Step) SetEndTime(t time.Time) *Step {
|
|
// set end time
|
|
s.End = t
|
|
return s
|
|
}
|
|
|
|
// GetExecutionTime set execution time
|
|
func (s *Step) GetExecutionTime() time.Duration {
|
|
return time.Duration(s.ExecutionTime) * time.Millisecond
|
|
}
|
|
|
|
// SetExecutionTime set execution time
|
|
func (s *Step) SetExecutionTime(start time.Time, end time.Time) *Step {
|
|
s.ExecutionTime = uint32(end.Sub(start).Milliseconds())
|
|
return s
|
|
}
|
|
|
|
// GetMaxExecution get max execution seconds
|
|
func (s *Step) GetMaxExecution() time.Duration {
|
|
return time.Duration(s.MaxExecutionSeconds) * time.Second
|
|
}
|
|
|
|
// SetMaxExecution set max execution seconds
|
|
func (s *Step) SetMaxExecution(duration time.Duration) *Step {
|
|
s.MaxExecutionSeconds = uint32(duration.Seconds())
|
|
return s
|
|
}
|
|
|
|
// GetLastUpdate get last update time
|
|
func (s *Step) GetLastUpdate() time.Time {
|
|
return s.LastUpdate
|
|
}
|
|
|
|
// SetLastUpdate set last update time
|
|
func (s *Step) SetLastUpdate(t time.Time) *Step {
|
|
s.LastUpdate = t
|
|
return s
|
|
}
|