Documentation ¶
Index ¶
- Constants
- Variables
- func ForbiddenHandler(w http.ResponseWriter, r *http.Request)
- func GetHost(r *http.Request) *host.Host
- func GetListener(addr string) (net.Listener, error)
- func GetProject(r *http.Request) (*model.ProjectRef, *model.Project)
- func GetProjectContext(r *http.Request) (projectContext, error)
- func GetRESTContext(r *http.Request) (*model.Context, error)
- func GetRESTv1App(evgService restAPIService) *gimlet.APIApp
- func GetRouter(as *APIServer, uis *UIServer) (http.Handler, error)
- func GetServer(addr string, n http.Handler) *http.Server
- func GetTLSListener(addr string, conf *tls.Config) (net.Listener, error)
- func GetTask(r *http.Request) *task.Task
- func MakeTemplateFuncs(fo TemplateFunctionOptions, superUsers []string) map[string]interface{}
- func MustHaveHost(r *http.Request) *host.Host
- func MustHaveProject(r *http.Request) (*model.ProjectRef, *model.Project)
- func MustHaveProjectContext(r *http.Request) projectContext
- func MustHaveRESTContext(r *http.Request) *model.Context
- func MustHaveTask(r *http.Request) *task.Task
- func MustHaveUser(r *http.Request) *user.DBUser
- func NewErrorFlash(message string) flashMessage
- func NewInfoFlash(message string) flashMessage
- func NewSuccessFlash(message string) flashMessage
- func NewWarningFlash(message string) flashMessage
- func PopFlashes(store *sessions.CookieStore, r *http.Request, w http.ResponseWriter) []interface{}
- func PopulateUIVersion(version *model.Version) (*uiVersion, error)
- func PushFlash(store *sessions.CookieStore, r *http.Request, w http.ResponseWriter, ...)
- type APIServer
- func (as *APIServer) AppendTaskLog(w http.ResponseWriter, r *http.Request)
- func (as *APIServer) AttachFiles(w http.ResponseWriter, r *http.Request)
- func (as *APIServer) AttachResults(w http.ResponseWriter, r *http.Request)
- func (as *APIServer) AttachTestLog(w http.ResponseWriter, r *http.Request)
- func (as *APIServer) EndTask(w http.ResponseWriter, r *http.Request)
- func (as *APIServer) FetchProjectVars(w http.ResponseWriter, r *http.Request)
- func (as *APIServer) FetchTask(w http.ResponseWriter, r *http.Request)
- func (as *APIServer) GetDistro(w http.ResponseWriter, r *http.Request)
- func (as *APIServer) GetExpansions(w http.ResponseWriter, r *http.Request)
- func (as *APIServer) GetProjectRef(w http.ResponseWriter, r *http.Request)
- func (as *APIServer) GetServiceApp() *gimlet.APIApp
- func (as *APIServer) GetSettings() evergreen.Settings
- func (as *APIServer) GetVersion(w http.ResponseWriter, r *http.Request)
- func (as *APIServer) Heartbeat(w http.ResponseWriter, r *http.Request)
- func (as *APIServer) LoggedError(w http.ResponseWriter, r *http.Request, code int, err error)
- func (as *APIServer) NextTask(w http.ResponseWriter, r *http.Request)
- func (as *APIServer) StartTask(w http.ResponseWriter, r *http.Request)
- type PatchAPIResponse
- type RestPatch
- type RestTask
- type TemplateFunctionOptions
- type TestServer
- type UIBuild
- type UIBuildVariant
- type UIDisplayTask
- type UIProject
- type UIProjectFields
- type UIServer
- func (uis *UIServer) GetCommonViewData(w http.ResponseWriter, r *http.Request, needsUser, needsProject bool) ViewData
- func (uis *UIServer) GetManifest(w http.ResponseWriter, r *http.Request)
- func (uis *UIServer) GetPluginHandler(uiPage *plugin.UIPage, pluginName string) func(http.ResponseWriter, *http.Request)
- func (uis *UIServer) GetServiceApp() *gimlet.APIApp
- func (uis *UIServer) GetSettings() evergreen.Settings
- func (uis *UIServer) LoadProjectContext(rw http.ResponseWriter, r *http.Request) (projectContext, error)
- func (uis *UIServer) LoggedError(w http.ResponseWriter, r *http.Request, code int, err error)
- func (uis *UIServer) ProjectNotFound(projCtx projectContext, w http.ResponseWriter, r *http.Request)
- func (uis *UIServer) RedirectToLogin(w http.ResponseWriter, r *http.Request)
- type UIStats
- type UITask
- type ViewData
Constants ¶
const ( APIServerLockTitle = evergreen.APIServerTaskActivator TaskStartCaller = "start task" EndTaskCaller = "end task" )
const ( FlashSeveritySuccess = "success" FlashSeverityInfo = "info" FlashSeverityWarning = "warning" FlashSeverityError = "danger" )
const ( InvalidStatusError = "'%v' is not a valid status" DecommissionStaticHostError = "Cannot decommission static hosts" HostTerminationQueueingError = "Error starting background job for host termination" HostUpdateError = "Error updating host" HostTerminationQueueingSuccess = "Host %v successfully queued for termination" HostStatusUpdateSuccess = "Host status successfully updated from '%v' to '%v'" HostStatusWriteConfirm = "Successfully updated host status" UnrecognizedAction = "Unrecognized action: %v" )
const ( ProjectCookieName string = "mci-project-cookie" // Key values used to map user and project data to request context. // These are private custom types to avoid key collisions. RequestTask reqCtxKey = iota RequestProjectContext )
const ( WebRootPath = "service" Templates = "templates" Static = "static" DefaultSkip = 0 DefaultLimit = 10 )
const ( // Initial number of revisions to return on first page load InitRevisionsBefore = 50 InitRevisionsAfter = 100 // Number of revisions to return on subsequent requests NoRevisions = 0 MaxNumRevisions = 50 )
const AllLogsType = "ALL"
const DefaultLogMessages = 100 // passed as a limit, so 0 means don't limit
the task's most recent log messages
const FlashSession = "mci-session"
const (
IncludeSpawnedHosts = "includeSpawnedHosts"
)
const NumRecentVersions = 10
const RestContext restContextKey = 0
const ( // The resolution of times stored in the database TimePrecision = time.Millisecond )
Variables ¶
var ( HostPasswordUpdate = "updateRDPPassword" HostExpirationExtension = "extendHostExpiration" HostTerminate = "terminate" MaxExpirationDurationHours = 24 * 7 // 7 days )
var NumTestsToSearchForTestNames = 100
Functions ¶
func ForbiddenHandler ¶
func ForbiddenHandler(w http.ResponseWriter, r *http.Request)
ForbiddenHandler logs a rejected request befure returning a 403 to the client
func GetListener ¶
GetListener creates a network listener on the given address.
func GetProject ¶
GetProject loads the project attached to a request into request context.
func GetProjectContext ¶
GetProjectContext fetches the projectContext associated with the request. Returns an error if no projectContext has been loaded and attached to the request.
func GetRESTContext ¶
GetRESTContext fetches the context associated with the request.
func GetRESTv1App ¶
AttachRESTHandler attaches a router at the given root that hooks up REST endpoint URIs to be handled by the given restAPIService.
func GetTLSListener ¶
GetTLSListener creates an encrypted listener with the given TLS config and address.
func MakeTemplateFuncs ¶
func MakeTemplateFuncs(fo TemplateFunctionOptions, superUsers []string) map[string]interface{}
MakeTemplateFuncs creates and registers all of our built-in template functions.
func MustHaveHost ¶
MustHaveHost gets the host from the HTTP Request Panics if the host is not in the request context
func MustHaveProject ¶
MustHaveProject gets the project from the HTTP request and panics if there is no project specified
func MustHaveProjectContext ¶
MustHaveProjectContext gets the projectContext from the request, or panics if it does not exist.
func MustHaveRESTContext ¶
MustHaveRESTContext fetches the model.Context stored with the request, and panics if the key is not set.
func MustHaveTask ¶
MustHaveTask gets the task from an HTTP Request. Panics if the task is not in request context.
func MustHaveUser ¶
MustHaveUser gets the user from the request or panics if it does not exist.
func NewErrorFlash ¶
func NewErrorFlash(message string) flashMessage
func NewInfoFlash ¶
func NewInfoFlash(message string) flashMessage
func NewSuccessFlash ¶
func NewSuccessFlash(message string) flashMessage
func NewWarningFlash ¶
func NewWarningFlash(message string) flashMessage
func PopFlashes ¶
func PopFlashes(store *sessions.CookieStore, r *http.Request, w http.ResponseWriter) []interface{}
func PopulateUIVersion ¶
func PushFlash ¶
func PushFlash(store *sessions.CookieStore, r *http.Request, w http.ResponseWriter, msg flashMessage)
Types ¶
type APIServer ¶
type APIServer struct { UserManager gimlet.UserManager Settings evergreen.Settings // contains filtered or unexported fields }
APIServer handles communication with Evergreen agents and other back-end requests.
func NewAPIServer ¶
func NewAPIServer(settings *evergreen.Settings, queue amboy.Queue, queueGroup amboy.QueueGroup) (*APIServer, error)
NewAPIServer returns an APIServer initialized with the given settings and plugins.
func (*APIServer) AppendTaskLog ¶
func (as *APIServer) AppendTaskLog(w http.ResponseWriter, r *http.Request)
AppendTaskLog appends the received logs to the task's internal logs.
func (*APIServer) AttachFiles ¶
func (as *APIServer) AttachFiles(w http.ResponseWriter, r *http.Request)
AttachFiles updates file mappings for a task or build
func (*APIServer) AttachResults ¶
func (as *APIServer) AttachResults(w http.ResponseWriter, r *http.Request)
AttachResults attaches the received results to the task in the database.
func (*APIServer) AttachTestLog ¶
func (as *APIServer) AttachTestLog(w http.ResponseWriter, r *http.Request)
AttachTestLog is the API Server hook for getting the test logs and storing them in the test_logs collection.
func (*APIServer) EndTask ¶
func (as *APIServer) EndTask(w http.ResponseWriter, r *http.Request)
EndTask creates test results from the request and the project config. It then acquires the lock, and with it, marks tasks as finished or inactive if aborted. If the task is a patch, it will alert the users based on failures It also updates the expected task duration of the task for scheduling. NOTE this should eventually become the default code path.
func (*APIServer) FetchProjectVars ¶
func (as *APIServer) FetchProjectVars(w http.ResponseWriter, r *http.Request)
FetchProjectVars is an API hook for returning the project variables associated with a task's project.
func (*APIServer) FetchTask ¶
func (as *APIServer) FetchTask(w http.ResponseWriter, r *http.Request)
FetchTask loads the task from the database and sends it to the requester.
func (*APIServer) GetDistro ¶
func (as *APIServer) GetDistro(w http.ResponseWriter, r *http.Request)
GetDistro loads the task's distro and sends it to the requester.
func (*APIServer) GetExpansions ¶
func (as *APIServer) GetExpansions(w http.ResponseWriter, r *http.Request)
func (*APIServer) GetProjectRef ¶
func (as *APIServer) GetProjectRef(w http.ResponseWriter, r *http.Request)
func (*APIServer) GetServiceApp ¶
NewRouter returns the root router for all APIServer endpoints.
func (*APIServer) GetSettings ¶
GetSettings returns the global evergreen settings.
func (*APIServer) GetVersion ¶
func (as *APIServer) GetVersion(w http.ResponseWriter, r *http.Request)
func (*APIServer) Heartbeat ¶
func (as *APIServer) Heartbeat(w http.ResponseWriter, r *http.Request)
Heartbeat handles heartbeat pings from Evergreen agents. If the heartbeating task is marked to be aborted, the abort response is sent.
func (*APIServer) LoggedError ¶
LoggedError logs the given error and writes an HTTP response with its details formatted as JSON if the request headers indicate that it's acceptable (or plaintext otherwise).
func (*APIServer) NextTask ¶
func (as *APIServer) NextTask(w http.ResponseWriter, r *http.Request)
NextTask retrieves the next task's id given the host name and host secret by retrieving the task queue and popping the next task off the task queue.
func (*APIServer) StartTask ¶
func (as *APIServer) StartTask(w http.ResponseWriter, r *http.Request)
StartTask is the handler function that retrieves the task from the request and acquires the global lock With the lock, it marks associated tasks, builds, and versions as started. It then updates the host document with relevant information, including the pid of the agent, and ensures that the host has the running task field set.
type PatchAPIResponse ¶
type PatchAPIResponse struct { Message string `json:"message"` Action string `json:"action"` Patch *patch.Patch `json:"patch"` }
PatchAPIResponse is returned by all patch-related API calls
type RestPatch ¶
type RestPatch struct { Id string `json:"_id"` Description string `json:"desc"` Project string `json:"project"` Revision string `json:"revision"` PatchNumber int `json:"patch_number"` Author string `json:"author"` Version string `json:"version"` CreateTime time.Time `json:"create_time"` Patches []patch.ModulePatch `json:"patches"` }
type RestTask ¶
type RestTask struct { Id string `json:"id"` CreateTime time.Time `json:"create_time"` ScheduledTime time.Time `json:"scheduled_time"` DispatchTime time.Time `json:"dispatch_time"` StartTime time.Time `json:"start_time"` FinishTime time.Time `json:"finish_time"` Version string `json:"version"` Project string `json:"project"` Revision string `json:"revision"` Priority int64 `json:"priority"` LastHeartbeat time.Time `json:"last_heartbeat"` Activated bool `json:"activated"` BuildId string `json:"build_id"` DistroId string `json:"distro"` BuildVariant string `json:"build_variant"` DependsOn []task.Dependency `json:"depends_on"` DisplayName string `json:"display_name"` HostId string `json:"host_id"` Restarts int `json:"restarts"` Execution int `json:"execution"` Archived bool `json:"archived"` RevisionOrderNumber int `json:"order"` Requester string `json:"requester"` Status string `json:"status"` StatusDetails taskStatusDetails `json:"status_details"` Aborted bool `json:"aborted"` TimeTaken time.Duration `json:"time_taken"` ExpectedDuration time.Duration `json:"expected_duration"` LocalTestResults taskTestResultsByName `json:"test_results"` MinQueuePos int `json:"min_queue_pos"` PatchNumber int `json:"patch_number,omitempty"` PatchId string `json:"patch_id,omitempty"` // Artifacts and binaries Files []taskFile `json:"files"` }
type TemplateFunctionOptions ¶
FuncOptions are global variables injected into our templating functions.
type TestServer ¶
type TestServer struct { URL string net.Listener *APIServer // contains filtered or unexported fields }
func CreateTestServer ¶
func (*TestServer) Close ¶
func (s *TestServer) Close()
type UIBuild ¶
type UIBuild struct { Id string `json:"id"` CreateTime time.Time `json:"create_time"` StartTime time.Time `json:"start_time"` FinishTime time.Time `json:"finish_time"` Version string `json:"version"` Status string `json:"status"` Tasks []build.TaskCache `json:"tasks"` TimeTaken int64 `json:"time_taken"` }
UIBuild has the fields that are necessary to send over the wire for builds
type UIBuildVariant ¶
type UIBuildVariant struct { Name string `json:"name"` TaskNames []string `json:"task_names"` DisplayTasks []UIDisplayTask `json:"display_tasks"` }
UIBuildVariant contains the name of the build variant and the tasks associated with that build variant.
type UIDisplayTask ¶
type UIProject ¶
type UIProject struct { Name string `json:"name"` BuildVariants []UIBuildVariant `json:"build_variants"` TaskNames []string `json:"task_names"` }
UIProject has all the tasks that are in a project and all the BuildVariants.
type UIProjectFields ¶
type UIProjectFields struct { Identifier string `json:"identifier"` DisplayName string `json:"display_name"` Repo string `json:"repo_name"` Owner string `json:"owner_name"` }
publicProjectFields are the fields needed by the UI on base_angular and the menu
type UIServer ¶
type UIServer struct { // Home is the root path on disk from which relative urls are constructed for loading // plugins or other assets. Home string // The root URL of the server, used in redirects for instance. RootURL string //authManager UserManager gimlet.UserManager Settings evergreen.Settings CookieStore *sessions.CookieStore plugin.PanelManager // contains filtered or unexported fields }
UIServer provides a web interface for Evergreen.
func NewUIServer ¶
func (*UIServer) GetCommonViewData ¶
func (uis *UIServer) GetCommonViewData(w http.ResponseWriter, r *http.Request, needsUser, needsProject bool) ViewData
GetCommonViewData returns a struct that can supplement the struct used to provide data to views. It contains data that is used for most/all Evergreen pages. The needsUser and needsProject params will cause an error to be logged if there is no user/project, but other data will still be returned
func (*UIServer) GetManifest ¶
func (uis *UIServer) GetManifest(w http.ResponseWriter, r *http.Request)
func (*UIServer) GetPluginHandler ¶
func (uis *UIServer) GetPluginHandler(uiPage *plugin.UIPage, pluginName string) func(http.ResponseWriter, *http.Request)
GetPluginHandler returns a handler function given the template route and data to go to that page.
func (*UIServer) GetServiceApp ¶
NewRouter sets up a request router for the UI, installing hard-coded routes as well as those belonging to plugins.
func (*UIServer) GetSettings ¶
GetSettings returns the global evergreen settings.
func (*UIServer) LoadProjectContext ¶
func (uis *UIServer) LoadProjectContext(rw http.ResponseWriter, r *http.Request) (projectContext, error)
LoadProjectContext builds a projectContext from vars in the request's URL. This is done by reading in specific variables and inferring other required context variables when necessary (e.g. loading a project based on the task).
func (*UIServer) LoggedError ¶
LoggedError logs the given error and writes an HTTP response with its details formatted as JSON if the request headers indicate that it's acceptable (or plaintext otherwise).
func (*UIServer) ProjectNotFound ¶
func (uis *UIServer) ProjectNotFound(projCtx projectContext, w http.ResponseWriter, r *http.Request)
ProjectNotFound calls WriteHTML with the invalid-project page. It should be called whenever the project specified by the user does not exist, or when there are no projects at all.
func (*UIServer) RedirectToLogin ¶
func (uis *UIServer) RedirectToLogin(w http.ResponseWriter, r *http.Request)
RedirectToLogin forces a redirect to the login page. The redirect param is set on the query so that the user will be returned to the original page after they login.
type UIStats ¶
type UIStats struct { Tasks []*UITask `json:"tasks"` Builds []*UIBuild `json:"builds"` Versions []model.Version `json:"versions"` Patches []patch.Patch `json:"patches"` }
UIStats is all of the data that the stats page might need.
type UITask ¶
type UITask struct { Id string `json:"id"` CreateTime time.Time `json:"create_time"` DispatchTime time.Time `json:"dispatch_time"` ScheduledTime time.Time `json:"scheduled_time"` StartTime time.Time `json:"start_time"` FinishTime time.Time `json:"finish_time"` Version string `json:"version"` Status string `json:"status"` Host string `json:"host"` Distro string `json:"distro"` IsDisplay bool `json:"is_display"` }
UITask has the fields that are necessary to send over the wire for tasks
Source Files ¶
- admin.go
- api.go
- api_distro.go
- api_patch.go
- api_plugin_git.go
- api_plugin_keyval.go
- api_plugin_manifest.go
- api_plugin_s3copy.go
- api_plugin_taskdata.go
- api_spawn.go
- api_status.go
- api_task.go
- api_test_utils.go
- bf_suggestion.go
- build.go
- distros.go
- event_log.go
- flash.go
- forms.go
- grid.go
- host.go
- host_helpers.go
- middleware.go
- middleware_helpers_current.go
- models.go
- notifications.go
- patch.go
- perfdiscovery.go
- plugin.go
- project.go
- rest.go
- rest_build.go
- rest_locals.go
- rest_patch.go
- rest_project.go
- rest_stats.go
- rest_task.go
- rest_version.go
- scheduler.go
- service.go
- signal_processing.go
- spawn.go
- stats.go
- task.go
- task_history.go
- task_queue.go
- templatefuncs.go
- timeline.go
- ui.go
- ui_plugin_build_baron.go
- ui_plugin_manifest.go
- ui_plugin_perf_json.go
- ui_plugin_perfdash.go
- user.go
- version.go
- waterfall.go