// GetPanelConfig returns a plugin.PanelConfig struct representing panels // that will be added to the Task and Build pages. func (self *AttachPlugin) GetPanelConfig() (*plugin.PanelConfig, error) { return &plugin.PanelConfig{ StaticRoot: plugin.StaticWebRootFromSourceFile(), Panels: []plugin.UIPanel{ { Page: plugin.TaskPage, Position: plugin.PageCenter, PanelHTML: "<div ng-include=\"'/plugin/attach/static/partials/task_files_panel.html'\" " + "ng-init='files=plugins.attach' ng-show='plugins.attach.length'></div>", DataFunc: func(context plugin.UIContext) (interface{}, error) { if context.Task == nil { return nil, nil } artifactEntry, err := artifact.FindOne(artifact.ByTaskId(context.Task.Id)) if err != nil { return nil, fmt.Errorf("error finding artifact files for task: %v", err) } if artifactEntry == nil { return nil, nil } return stripHiddenFiles(artifactEntry.Files, context.User), nil }, }, { Page: plugin.BuildPage, Position: plugin.PageLeft, PanelHTML: "<div ng-include=\"'/plugin/attach/static/partials/build_files_panel.html'\" " + "ng-init='filesByTask=plugins.attach' ng-show='plugins.attach.length'></div>", DataFunc: func(context plugin.UIContext) (interface{}, error) { if context.Build == nil { return nil, nil } taskArtifactFiles, err := artifact.FindAll(artifact.ByBuildId(context.Build.Id)) if err != nil { return nil, fmt.Errorf("error finding artifact files for build: %v", err) } for i := range taskArtifactFiles { // remove hidden files if the user isn't logged in taskArtifactFiles[i].Files = stripHiddenFiles(taskArtifactFiles[i].Files, context.User) } return taskArtifactFiles, nil }, }, }, }, nil }
// Returns a JSON response with the marshalled output of the task // specified in the request. func (restapi restAPI) getTaskInfo(w http.ResponseWriter, r *http.Request) { projCtx := MustHaveProjectContext(r) srcTask := projCtx.Task if srcTask == nil { restapi.WriteJSON(w, http.StatusNotFound, responseError{Message: "error finding task"}) return } destTask := &restTask{} destTask.Id = srcTask.Id destTask.CreateTime = srcTask.CreateTime destTask.ScheduledTime = srcTask.ScheduledTime destTask.DispatchTime = srcTask.DispatchTime destTask.StartTime = srcTask.StartTime destTask.FinishTime = srcTask.FinishTime destTask.PushTime = srcTask.PushTime destTask.Version = srcTask.Version destTask.Project = srcTask.Project destTask.Revision = srcTask.Revision destTask.Priority = srcTask.Priority destTask.LastHeartbeat = srcTask.LastHeartbeat destTask.Activated = srcTask.Activated destTask.BuildId = srcTask.BuildId destTask.DistroId = srcTask.DistroId destTask.BuildVariant = srcTask.BuildVariant destTask.DependsOn = srcTask.DependsOn destTask.DisplayName = srcTask.DisplayName destTask.HostId = srcTask.HostId destTask.Restarts = srcTask.Restarts destTask.Execution = srcTask.Execution destTask.Archived = srcTask.Archived destTask.RevisionOrderNumber = srcTask.RevisionOrderNumber destTask.Requester = srcTask.Requester destTask.Status = srcTask.Status destTask.Aborted = srcTask.Aborted destTask.TimeTaken = srcTask.TimeTaken destTask.ExpectedDuration = srcTask.ExpectedDuration destTask.MinQueuePos = srcTask.MinQueuePos // Copy over the status details destTask.StatusDetails.TimedOut = srcTask.Details.TimedOut destTask.StatusDetails.TimeoutStage = srcTask.Details.Description // Copy over the test results destTask.TestResults = make(taskTestResultsByName, len(srcTask.TestResults)) for _, _testResult := range srcTask.TestResults { numSecs := _testResult.EndTime - _testResult.StartTime testResult := taskTestResult{ Status: _testResult.Status, TimeTaken: time.Duration(numSecs * float64(time.Second)), Logs: taskTestLogURL{_testResult.URL}, } destTask.TestResults[_testResult.TestFile] = testResult } // Copy over artifacts and binaries entries, err := artifact.FindAll(artifact.ByTaskId(srcTask.Id)) if err != nil { msg := fmt.Sprintf("Error finding task '%v'", srcTask.Id) evergreen.Logger.Logf(slogger.ERROR, "%v: %v", msg, err) restapi.WriteJSON(w, http.StatusInternalServerError, responseError{Message: msg}) return } for _, entry := range entries { for _, _file := range entry.Files { file := taskFile{ Name: _file.Name, URL: _file.Link, } destTask.Files = append(destTask.Files, file) } } restapi.WriteJSON(w, http.StatusOK, destTask) return }
// Returns a JSON response with the marshalled output of the task // specified in the request. func (restapi restAPI) getTaskInfo(w http.ResponseWriter, r *http.Request) { taskId := mux.Vars(r)["task_id"] srcTask, err := model.FindTask(taskId) if err != nil || srcTask == nil { msg := fmt.Sprintf("Error finding task '%v'", taskId) statusCode := http.StatusNotFound if err != nil { evergreen.Logger.Logf(slogger.ERROR, "%v: %v", msg, err) statusCode = http.StatusInternalServerError } restapi.WriteJSON(w, statusCode, responseError{Message: msg}) return } destTask := &task{} // Copy the contents from the database into our local task type err = angier.TransferByFieldNames(srcTask, destTask) if err != nil { msg := fmt.Sprintf("Error finding task '%v'", taskId) evergreen.Logger.Logf(slogger.ERROR, "%v: %v", msg, err) restapi.WriteJSON(w, http.StatusInternalServerError, responseError{Message: msg}) return } // Copy over the status details destTask.StatusDetails.TimedOut = srcTask.StatusDetails.TimedOut destTask.StatusDetails.TimeoutStage = srcTask.StatusDetails.TimeoutStage // Copy over the test results destTask.TestResults = make(taskTestResultsByName, len(srcTask.TestResults)) for _, _testResult := range srcTask.TestResults { numSecs := _testResult.EndTime - _testResult.StartTime testResult := taskTestResult{ Status: _testResult.Status, TimeTaken: time.Duration(numSecs * float64(time.Second)), Logs: taskTestLogURL{_testResult.URL}, } destTask.TestResults[_testResult.TestFile] = testResult } // Copy over artifacts and binaries entries, err := artifact.FindAll(artifact.ByTaskId(taskId)) if err != nil { msg := fmt.Sprintf("Error finding task '%v'", taskId) evergreen.Logger.Logf(slogger.ERROR, "%v: %v", msg, err) restapi.WriteJSON(w, http.StatusInternalServerError, responseError{Message: msg}) return } for _, entry := range entries { for _, _file := range entry.Files { file := taskFile{ Name: _file.Name, URL: _file.Link, } destTask.Files = append(destTask.Files, file) } } restapi.WriteJSON(w, http.StatusOK, destTask) return }