You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
151 lines
3.4 KiB
151 lines
3.4 KiB
package tasks
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
)
|
|
|
|
// Result structure of the task to provide methods
|
|
type Result struct {
|
|
Result interface{} `json:"result"`
|
|
}
|
|
|
|
// Detailed information about task
|
|
type RecordTask struct {
|
|
// Updated by
|
|
UpdatedBy string `json:"updatedBy"`
|
|
|
|
ItemTask
|
|
}
|
|
|
|
type ItemTask struct {
|
|
// Audit ID
|
|
AuditID string `json:"auditId"`
|
|
|
|
// Completed
|
|
Completed bool `json:"completed"`
|
|
|
|
// Error
|
|
Error string `json:"error"`
|
|
|
|
// GUID
|
|
GUID string `json:"guid"`
|
|
|
|
// List of logs
|
|
Log []string `json:"log"`
|
|
|
|
// Final result
|
|
Result
|
|
|
|
// Stage
|
|
Stage string `json:"stage"`
|
|
|
|
// Status
|
|
Status string `json:"status"`
|
|
|
|
// Update time
|
|
UpdateTime uint64 `json:"updateTime"`
|
|
|
|
// Updated by
|
|
UpdatedBy string `json:"updatedBy"`
|
|
|
|
// Updated time
|
|
UpdatedTime uint64 `json:"updatedTime"`
|
|
}
|
|
|
|
// List of tasks
|
|
type ListTasks struct {
|
|
// Data
|
|
Data []ItemTask `json:"data"`
|
|
|
|
// Entry count
|
|
EntryCount uint64 `json:"entryCount"`
|
|
}
|
|
|
|
// ID returns ID of cluster or WG or any other resource successfully created as a Result of the task.
|
|
// It returns error if Result does not contain any resource ID.
|
|
func (r Result) ID() (int, error) {
|
|
// check id from cluster - it comes as slice, like [1234, "cluster-name"]
|
|
slice, ok := r.Result.([]interface{})
|
|
if ok {
|
|
if len(slice) == 0 {
|
|
return 0, fmt.Errorf("could not get ID from empty slice")
|
|
}
|
|
|
|
idFloat64, ok := slice[0].(float64)
|
|
if !ok {
|
|
return 0, fmt.Errorf("could not get ID from first slice element (%v)", slice[0])
|
|
}
|
|
|
|
return int(idFloat64), nil
|
|
}
|
|
|
|
// check id from other resources - it comes as id
|
|
idFloat64, ok := r.Result.(float64)
|
|
if ok {
|
|
return int(idFloat64), nil
|
|
}
|
|
|
|
return 0, errors.New("could not get ID because result is neither slice nor number (%v)")
|
|
}
|
|
|
|
// Name returns name of cluster or wg successfully created as a result of the task.
|
|
// It returns error if Result does not contain k8s name.
|
|
func (r Result) Name() (string, error) {
|
|
slice, ok := r.Result.([]interface{})
|
|
if !ok {
|
|
return "", fmt.Errorf("could not convert Result (%v) to slice", r.Result)
|
|
}
|
|
|
|
if len(slice) < 2 {
|
|
return "", fmt.Errorf("could not get name from second slice element")
|
|
}
|
|
|
|
var name string
|
|
name, ok = slice[1].(string)
|
|
if !ok {
|
|
return "", fmt.Errorf("could not get name from second slice element (%v)", slice[1])
|
|
}
|
|
|
|
return name, nil
|
|
}
|
|
|
|
// ToMaps converts Result to a slice of maps containing back-up information as a result of the task.
|
|
// It returns error if Result does not contain back-up information.
|
|
func (r Result) ToMaps() ([]map[string]interface{}, error) {
|
|
slice, ok := r.Result.([]interface{})
|
|
if !ok {
|
|
return nil, fmt.Errorf("could not convert Result (%v) to slice", r.Result)
|
|
}
|
|
|
|
if len(slice) == 0 {
|
|
return nil, fmt.Errorf("could not get maps from empty slice")
|
|
}
|
|
|
|
result := make([]map[string]interface{}, 0, len(slice))
|
|
for _, s := range slice {
|
|
elem, ok := s.(map[string]interface{})
|
|
if !ok {
|
|
return nil, fmt.Errorf("could not get map[string]interface{} from slice element (%v)", s)
|
|
}
|
|
result = append(result, elem)
|
|
}
|
|
|
|
return result, nil
|
|
}
|
|
|
|
// ToString converts Result to non-empty string.
|
|
// It returns error if Result is not a string or is an empty string.
|
|
func (r Result) ToString() (string, error) {
|
|
status, ok := r.Result.(string)
|
|
if !ok {
|
|
return "", fmt.Errorf("could not convert Result (%v) to string", r.Result)
|
|
}
|
|
|
|
if status == "" {
|
|
return "", fmt.Errorf("info contains empty string")
|
|
}
|
|
|
|
return status, nil
|
|
}
|