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 }