diff --git a/cmd/climc/shell/misc/tasks.go b/cmd/climc/shell/misc/tasks.go index eedd2d41b4..fa84bf02cd 100644 --- a/cmd/climc/shell/misc/tasks.go +++ b/cmd/climc/shell/misc/tasks.go @@ -31,6 +31,70 @@ import ( "yunion.io/x/onecloud/pkg/mcclient/modules/notify" ) +func RegisterTaskCmds(service string, manager modulebase.Manager, archivedManager modulebase.Manager) { + type TaskListOptions struct { + apis.TaskListInput + } + R(&TaskListOptions{}, fmt.Sprintf("%s-task-list", service), fmt.Sprintf("List tasks on %s server", service), func(s *mcclient.ClientSession, args *TaskListOptions) error { + params := jsonutils.Marshal(args) + result, err := manager.List(s, params) + if err != nil { + return err + } + printList(result, manager.GetColumns(s)) + return nil + }) + + type TaskShowOptions struct { + ID string `help:"ID or name of the task"` + } + R(&TaskShowOptions{}, fmt.Sprintf("%s-task-show", service), fmt.Sprintf("Show details of a %s task", service), func(s *mcclient.ClientSession, args *TaskShowOptions) error { + result, err := manager.GetById(s, args.ID, nil) + if err != nil { + return err + } + printObject(result) + return nil + }) + + R(&TaskShowOptions{}, fmt.Sprintf("%s-task-cancel", service), fmt.Sprintf("Cancel a %s task", service), func(s *mcclient.ClientSession, args *TaskShowOptions) error { + result, err := manager.PerformAction(s, args.ID, "cancel", nil) + if err != nil { + return err + } + printObject(result) + return nil + }) + + R(&TaskListOptions{}, fmt.Sprintf("%s-archived-task-list", service), fmt.Sprintf("List archived tasks on %s server", service), func(s *mcclient.ClientSession, args *TaskListOptions) error { + params := jsonutils.Marshal(args) + result, err := archivedManager.List(s, params) + if err != nil { + return err + } + printList(result, archivedManager.GetColumns(s)) + return nil + }) + + R(&TaskShowOptions{}, fmt.Sprintf("%s-archived-task-show", service), fmt.Sprintf("Show details of an archived %s task", service), func(s *mcclient.ClientSession, args *TaskShowOptions) error { + params := jsonutils.NewDict() + params.Set("task_id", jsonutils.NewString(args.ID)) + result, err := archivedManager.List(s, params) + if err != nil { + return err + } + if result.Total == 1 { + printObject(result.Data[0]) + return nil + } else if result.Total == 0 { + return errors.Wrapf(errors.ErrNotFound, "not found %s", args.ID) + } else { + printList(result, archivedManager.GetColumns(s)) + return errors.Wrapf(errors.ErrDuplicateId, "found %d record for %s", result.Total, args.ID) + } + }) +} + func init() { cmds := []struct { service string @@ -71,68 +135,6 @@ func init() { } for i := range cmds { c := cmds[i] - - type TaskListOptions struct { - apis.TaskListInput - } - R(&TaskListOptions{}, fmt.Sprintf("%s-task-list", c.service), fmt.Sprintf("List tasks on %s server", c.service), func(s *mcclient.ClientSession, args *TaskListOptions) error { - params := jsonutils.Marshal(args) - result, err := c.manager.List(s, params) - if err != nil { - return err - } - printList(result, c.manager.GetColumns(s)) - return nil - }) - - type TaskShowOptions struct { - ID string `help:"ID or name of the task"` - } - R(&TaskShowOptions{}, fmt.Sprintf("%s-task-show", c.service), fmt.Sprintf("Show details of a %s task", c.service), func(s *mcclient.ClientSession, args *TaskShowOptions) error { - result, err := c.manager.GetById(s, args.ID, nil) - if err != nil { - return err - } - printObject(result) - return nil - }) - - R(&TaskShowOptions{}, fmt.Sprintf("%s-task-cancel", c.service), fmt.Sprintf("Cancel a %s task", c.service), func(s *mcclient.ClientSession, args *TaskShowOptions) error { - result, err := c.manager.PerformAction(s, args.ID, "cancel", nil) - if err != nil { - return err - } - printObject(result) - return nil - }) - - R(&TaskListOptions{}, fmt.Sprintf("%s-archived-task-list", c.service), fmt.Sprintf("List archived tasks on %s server", c.service), func(s *mcclient.ClientSession, args *TaskListOptions) error { - params := jsonutils.Marshal(args) - result, err := c.archivedManager.List(s, params) - if err != nil { - return err - } - printList(result, c.archivedManager.GetColumns(s)) - return nil - }) - - R(&TaskShowOptions{}, fmt.Sprintf("%s-archived-task-show", c.service), fmt.Sprintf("Show details of an archived %s task", c.service), func(s *mcclient.ClientSession, args *TaskShowOptions) error { - params := jsonutils.NewDict() - params.Set("task_id", jsonutils.NewString(args.ID)) - result, err := c.archivedManager.List(s, params) - if err != nil { - return err - } - if result.Total == 1 { - printObject(result.Data[0]) - return nil - } else if result.Total == 0 { - return errors.Wrapf(errors.ErrNotFound, "not found %s", args.ID) - } else { - printList(result, c.archivedManager.GetColumns(s)) - return errors.Wrapf(errors.ErrDuplicateId, "found %d record for %s", result.Total, args.ID) - } - }) + RegisterTaskCmds(c.service, c.manager, c.archivedManager) } - } diff --git a/pkg/apis/tasks.go b/pkg/apis/tasks.go index 6368838943..bd2358466e 100644 --- a/pkg/apis/tasks.go +++ b/pkg/apis/tasks.go @@ -79,7 +79,8 @@ type TaskDetails struct { ObjName string ObjId string TaskName string - Params *jsonutils.JSONDict + Params jsonutils.JSONObject + UserCred jsonutils.JSONObject Stage string ParentTaskId string } diff --git a/pkg/cloudcommon/db/taskman/taskarchive.go b/pkg/cloudcommon/db/taskman/taskarchive.go index 2f6ff79bda..bfe9cbda74 100644 --- a/pkg/cloudcommon/db/taskman/taskarchive.go +++ b/pkg/cloudcommon/db/taskman/taskarchive.go @@ -56,7 +56,7 @@ type SArchivedTask struct { TaskId string `width:"36" charset:"ascii" index:"true" list:"user"` - STaskBase + STaskBase `params->list:"user" user_cred->list:"user"` ObjIds []string `charset:"ascii" list:"user"` ObjNames []string `charset:"utf8" list:"user"` @@ -215,7 +215,7 @@ func (manager *SArchivedTaskManager) ResourceScope() rbacscope.TRbacScope { return rbacscope.ScopeProject } -/*func (manager *SArchivedTaskManager) FetchCustomizeColumns( +func (manager *SArchivedTaskManager) FetchCustomizeColumns( ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, @@ -224,8 +224,43 @@ func (manager *SArchivedTaskManager) ResourceScope() rbacscope.TRbacScope { isList bool, ) []apis.TaskDetails { rows := make([]apis.TaskDetails, len(objs)) + projectIds := make([]string, 0) + domainIds := make([]string, 0) + + for i := range objs { + task := objs[i].(*SArchivedTask) + if len(task.ProjectIds) > 0 { + projectIds = append(projectIds, task.ProjectIds[0]) + } else if len(task.DomainIds) > 0 { + domainIds = append(domainIds, task.DomainIds[0]) + } + } + var projectsMap map[string]db.STenant + var domainsMap map[string]db.STenant + if len(projectIds) > 0 { + projectsMap = db.DefaultProjectsFetcher(ctx, projectIds, false) + } + if len(domainIds) > 0 { + domainsMap = db.DefaultProjectsFetcher(ctx, domainIds, true) + } + for i := range objs { + task := objs[i].(*SArchivedTask) + if len(task.ProjectIds) > 0 { + rows[i].ProjectId = task.ProjectIds[0] + rows[i].DomainId = task.DomainIds[0] + if proj, ok := projectsMap[task.ProjectIds[0]]; ok { + rows[i].Project = proj.Name + rows[i].ProjectDomain = proj.Domain + } + } else if len(task.DomainIds) > 0 { + rows[i].DomainId = task.DomainIds[0] + if dom, ok := domainsMap[task.DomainIds[0]]; ok { + rows[i].ProjectDomain = dom.Name + } + } + } return rows -}*/ +} func (manager *SArchivedTaskManager) OrderByExtraFields( ctx context.Context,