github.com/justinjmoses/evergreen@v0.0.0-20170530173719-1d50e381ff0d/rest/model/task.go (about)

     1  package model
     2  
     3  import (
     4  	"fmt"
     5  	"time"
     6  
     7  	"github.com/evergreen-ci/evergreen/apimodels"
     8  	"github.com/evergreen-ci/evergreen/model/task"
     9  	"github.com/pkg/errors"
    10  )
    11  
    12  const (
    13  	LogLinkFormat = "%s/task_log_raw/%s/%d?type=%s"
    14  )
    15  
    16  // APITask is the model to be returned by the API whenever tasks are fetched.
    17  type APITask struct {
    18  	Id               APIString        `json:"task_id"`
    19  	CreateTime       APITime          `json:"create_time"`
    20  	DispatchTime     APITime          `json:"dispatch_time"`
    21  	PushTime         APITime          `json:"push_time"`
    22  	ScheduledTime    APITime          `json:"scheduled_time"`
    23  	StartTime        APITime          `json:"start_time"`
    24  	FinishTime       APITime          `json:"finish_time"`
    25  	Version          APIString        `json:"version_id"`
    26  	Branch           APIString        `json:"branch"`
    27  	Revision         APIString        `json:"revision"`
    28  	Priority         int64            `json:"priority"`
    29  	Activated        bool             `json:"activated"`
    30  	ActivatedBy      APIString        `json:"activated_by"`
    31  	BuildId          APIString        `json:"build_id"`
    32  	DistroId         APIString        `json:"distro_id"`
    33  	BuildVariant     APIString        `json:"build_variant"`
    34  	DependsOn        []string         `json:"depends_on"`
    35  	DisplayName      APIString        `json:"display_name"`
    36  	HostId           APIString        `json:"host_id"`
    37  	Restarts         int              `json:"restarts"`
    38  	Execution        int              `json:"execution"`
    39  	Order            int              `json:"order"`
    40  	Status           APIString        `json:"status"`
    41  	Details          apiTaskEndDetail `json:"status_details"`
    42  	Logs             logLinks         `json:"logs"`
    43  	TimeTaken        time.Duration    `json:"time_taken_ms"`
    44  	ExpectedDuration time.Duration    `json:"expected_duration_ms"`
    45  }
    46  
    47  type logLinks struct {
    48  	AllLogLink    APIString `json:"all_log"`
    49  	TaskLogLink   APIString `json:"task_log"`
    50  	AgentLogLink  APIString `json:"agent_log"`
    51  	SystemLogLink APIString `json:"system_log"`
    52  }
    53  type apiTaskEndDetail struct {
    54  	Status      APIString `json:"status"`
    55  	Type        APIString `json:"type"`
    56  	Description APIString `json:"desc"`
    57  	TimedOut    bool      `json:"timed_out"`
    58  }
    59  
    60  // BuildFromService converts from a service level task by loading the data
    61  // into the appropriate fields of the APITask.
    62  func (at *APITask) BuildFromService(t interface{}) error {
    63  	switch v := t.(type) {
    64  	case *task.Task:
    65  		(*at) = APITask{
    66  			Id:            APIString(v.Id),
    67  			CreateTime:    APITime(v.CreateTime),
    68  			DispatchTime:  APITime(v.DispatchTime),
    69  			PushTime:      APITime(v.PushTime),
    70  			ScheduledTime: APITime(v.ScheduledTime),
    71  			StartTime:     APITime(v.StartTime),
    72  			FinishTime:    APITime(v.FinishTime),
    73  			Version:       APIString(v.Version),
    74  			Branch:        APIString(v.Project),
    75  			Revision:      APIString(v.Revision),
    76  			Priority:      v.Priority,
    77  			Activated:     v.Activated,
    78  			ActivatedBy:   APIString(v.ActivatedBy),
    79  			BuildId:       APIString(v.BuildId),
    80  			DistroId:      APIString(v.DistroId),
    81  			BuildVariant:  APIString(v.BuildVariant),
    82  			DisplayName:   APIString(v.DisplayName),
    83  			HostId:        APIString(v.HostId),
    84  			Restarts:      v.Restarts,
    85  			Execution:     v.Execution,
    86  			Order:         v.RevisionOrderNumber,
    87  			Details: apiTaskEndDetail{
    88  				Status:      APIString(v.Details.Status),
    89  				Type:        APIString(v.Details.Type),
    90  				Description: APIString(v.Details.Description),
    91  				TimedOut:    v.Details.TimedOut,
    92  			},
    93  			Status:           APIString(v.Status),
    94  			TimeTaken:        v.TimeTaken,
    95  			ExpectedDuration: v.ExpectedDuration,
    96  		}
    97  
    98  		if len(v.DependsOn) > 0 {
    99  			dependsOn := make([]string, len(v.DependsOn))
   100  			for i, dep := range v.DependsOn {
   101  				dependsOn[i] = dep.TaskId
   102  			}
   103  			at.DependsOn = dependsOn
   104  		}
   105  	case string:
   106  		ll := logLinks{
   107  			AllLogLink:    APIString(fmt.Sprintf(LogLinkFormat, v, at.Id, at.Execution, "ALL")),
   108  			TaskLogLink:   APIString(fmt.Sprintf(LogLinkFormat, v, at.Id, at.Execution, "T")),
   109  			AgentLogLink:  APIString(fmt.Sprintf(LogLinkFormat, v, at.Id, at.Execution, "E")),
   110  			SystemLogLink: APIString(fmt.Sprintf(LogLinkFormat, v, at.Id, at.Execution, "S")),
   111  		}
   112  		at.Logs = ll
   113  	default:
   114  		return errors.New("Incorrect type when unmarshalling task")
   115  	}
   116  
   117  	return nil
   118  }
   119  
   120  // ToService returns a service layer task using the data from the APITask.
   121  func (ad *APITask) ToService() (interface{}, error) {
   122  	st := &task.Task{
   123  		Id:                  string(ad.Id),
   124  		Project:             string(ad.Branch),
   125  		CreateTime:          time.Time(ad.CreateTime),
   126  		DispatchTime:        time.Time(ad.DispatchTime),
   127  		PushTime:            time.Time(ad.PushTime),
   128  		ScheduledTime:       time.Time(ad.ScheduledTime),
   129  		StartTime:           time.Time(ad.StartTime),
   130  		FinishTime:          time.Time(ad.FinishTime),
   131  		Version:             string(ad.Version),
   132  		Revision:            string(ad.Revision),
   133  		Priority:            ad.Priority,
   134  		Activated:           ad.Activated,
   135  		ActivatedBy:         string(ad.ActivatedBy),
   136  		BuildId:             string(ad.BuildId),
   137  		DistroId:            string(ad.DistroId),
   138  		BuildVariant:        string(ad.BuildVariant),
   139  		DisplayName:         string(ad.DisplayName),
   140  		HostId:              string(ad.HostId),
   141  		Restarts:            ad.Restarts,
   142  		Execution:           ad.Execution,
   143  		RevisionOrderNumber: ad.Order,
   144  		Details: apimodels.TaskEndDetail{
   145  			Status:      string(ad.Details.Status),
   146  			Type:        string(ad.Details.Type),
   147  			Description: string(ad.Details.Description),
   148  			TimedOut:    ad.Details.TimedOut,
   149  		},
   150  		Status:           string(ad.Status),
   151  		TimeTaken:        ad.TimeTaken,
   152  		ExpectedDuration: ad.ExpectedDuration,
   153  	}
   154  	dependsOn := make([]task.Dependency, len(ad.DependsOn))
   155  
   156  	for i, depId := range ad.DependsOn {
   157  		dependsOn[i].TaskId = depId
   158  	}
   159  
   160  	st.DependsOn = dependsOn
   161  	return interface{}(st), nil
   162  }