github.com/cloudfoundry-attic/cli-with-i18n@v6.32.1-0.20171002233121-7401370d3b85+incompatible/actor/v3action/task.go (about) 1 package v3action 2 3 import ( 4 "fmt" 5 "net/url" 6 "strconv" 7 8 "sort" 9 10 "code.cloudfoundry.org/cli/api/cloudcontroller/ccerror" 11 "code.cloudfoundry.org/cli/api/cloudcontroller/ccv3" 12 ) 13 14 // Task represents a V3 actor Task. 15 type Task ccv3.Task 16 17 // TaskWorkersUnavailableError is returned when there are no workers to run a 18 // given task. 19 type TaskWorkersUnavailableError struct { 20 Message string 21 } 22 23 func (e TaskWorkersUnavailableError) Error() string { 24 return e.Message 25 } 26 27 // TaskNotFoundError is returned when no tasks matching the filters are found. 28 type TaskNotFoundError struct { 29 SequenceID int 30 } 31 32 func (e TaskNotFoundError) Error() string { 33 return fmt.Sprintf("Task sequence ID %d not found.", e.SequenceID) 34 } 35 36 // RunTask runs the provided command in the application environment associated 37 // with the provided application GUID. 38 func (actor Actor) RunTask(appGUID string, task Task) (Task, Warnings, error) { 39 createdTask, warnings, err := actor.CloudControllerClient.CreateApplicationTask(appGUID, ccv3.Task(task)) 40 if err != nil { 41 if e, ok := err.(ccerror.TaskWorkersUnavailableError); ok { 42 return Task{}, Warnings(warnings), TaskWorkersUnavailableError{Message: e.Error()} 43 } 44 } 45 46 return Task(createdTask), Warnings(warnings), err 47 } 48 49 // GetApplicationTasks returns a list of tasks associated with the provided 50 // appplication GUID. 51 func (actor Actor) GetApplicationTasks(appGUID string, sortOrder SortOrder) ([]Task, Warnings, error) { 52 query := url.Values{} 53 54 tasks, warnings, err := actor.CloudControllerClient.GetApplicationTasks(appGUID, query) 55 actorWarnings := Warnings(warnings) 56 if err != nil { 57 return nil, actorWarnings, err 58 } 59 60 allTasks := []Task{} 61 for _, task := range tasks { 62 allTasks = append(allTasks, Task(task)) 63 } 64 65 if sortOrder == Descending { 66 sort.Slice(allTasks, func(i int, j int) bool { return allTasks[i].SequenceID > allTasks[j].SequenceID }) 67 } else { 68 sort.Slice(allTasks, func(i int, j int) bool { return allTasks[i].SequenceID < allTasks[j].SequenceID }) 69 } 70 71 return allTasks, actorWarnings, nil 72 } 73 74 func (actor Actor) GetTaskBySequenceIDAndApplication(sequenceID int, appGUID string) (Task, Warnings, error) { 75 query := url.Values{ 76 "sequence_ids": []string{strconv.Itoa(sequenceID)}, 77 } 78 79 tasks, warnings, err := actor.CloudControllerClient.GetApplicationTasks(appGUID, query) 80 if err != nil { 81 return Task{}, Warnings(warnings), err 82 } 83 84 if len(tasks) == 0 { 85 return Task{}, Warnings(warnings), TaskNotFoundError{SequenceID: sequenceID} 86 } 87 88 return Task(tasks[0]), Warnings(warnings), nil 89 } 90 91 func (actor Actor) TerminateTask(taskGUID string) (Task, Warnings, error) { 92 task, warnings, err := actor.CloudControllerClient.UpdateTask(taskGUID) 93 return Task(task), Warnings(warnings), err 94 }