github.com/liamawhite/cli-with-i18n@v6.32.1-0.20171122084555-dede0a5c3448+incompatible/actor/v3action/task.go (about)

     1  package v3action
     2  
     3  import (
     4  	"fmt"
     5  	"net/url"
     6  	"strconv"
     7  
     8  	"sort"
     9  
    10  	"github.com/liamawhite/cli-with-i18n/api/cloudcontroller/ccerror"
    11  	"github.com/liamawhite/cli-with-i18n/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  }