service

package
v0.0.0-...-366f0b0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 2, 2019 License: Apache-2.0 Imports: 65 Imported by: 0

Documentation

Index

Constants

View Source
const (
	APIServerLockTitle = evergreen.APIServerTaskActivator
	TaskStartCaller    = "start task"
	EndTaskCaller      = "end task"
)
View Source
const (
	FlashSeveritySuccess = "success"
	FlashSeverityInfo    = "info"
	FlashSeverityWarning = "warning"
	FlashSeverityError   = "danger"
)
View Source
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"
)
View Source
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
)
View Source
const (
	WebRootPath  = "service"
	Templates    = "templates"
	Static       = "static"
	DefaultSkip  = 0
	DefaultLimit = 10
)
View Source
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
)
View Source
const AllLogsType = "ALL"
View Source
const DefaultLogMessages = 100 // passed as a limit, so 0 means don't limit

the task's most recent log messages

View Source
const FlashSession = "mci-session"
View Source
const (
	IncludeSpawnedHosts = "includeSpawnedHosts"
)
View Source
const NumRecentVersions = 10
View Source
const RestContext restContextKey = 0
View Source
const (
	// The resolution of times stored in the database
	TimePrecision = time.Millisecond
)

Variables

View Source
var (
	HostPasswordUpdate         = "updateRDPPassword"
	HostExpirationExtension    = "extendHostExpiration"
	HostTerminate              = "terminate"
	MaxExpirationDurationHours = 24 * 7 // 7 days
)
View Source
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 GetHost

func GetHost(r *http.Request) *host.Host

GetHost loads the host attached to a request

func GetListener

func GetListener(addr string) (net.Listener, error)

GetListener creates a network listener on the given address.

func GetProject

func GetProject(r *http.Request) (*model.ProjectRef, *model.Project)

GetProject loads the project attached to a request into request context.

func GetProjectContext

func GetProjectContext(r *http.Request) (projectContext, error)

GetProjectContext fetches the projectContext associated with the request. Returns an error if no projectContext has been loaded and attached to the request.

func GetRESTContext

func GetRESTContext(r *http.Request) (*model.Context, error)

GetRESTContext fetches the context associated with the request.

func GetRESTv1App

func GetRESTv1App(evgService restAPIService) *gimlet.APIApp

AttachRESTHandler attaches a router at the given root that hooks up REST endpoint URIs to be handled by the given restAPIService.

func GetRouter

func GetRouter(as *APIServer, uis *UIServer) (http.Handler, error)

func GetServer

func GetServer(addr string, n http.Handler) *http.Server

GetServer produces an HTTP server instance for a handler.

func GetTLSListener

func GetTLSListener(addr string, conf *tls.Config) (net.Listener, error)

GetTLSListener creates an encrypted listener with the given TLS config and address.

func GetTask

func GetTask(r *http.Request) *task.Task

GetTask loads the task attached to a request.

func MakeTemplateFuncs

func MakeTemplateFuncs(fo TemplateFunctionOptions, superUsers []string) map[string]interface{}

MakeTemplateFuncs creates and registers all of our built-in template functions.

func MustHaveHost

func MustHaveHost(r *http.Request) *host.Host

MustHaveHost gets the host from the HTTP Request Panics if the host is not in the request context

func MustHaveProject

func MustHaveProject(r *http.Request) (*model.ProjectRef, *model.Project)

MustHaveProject gets the project from the HTTP request and panics if there is no project specified

func MustHaveProjectContext

func MustHaveProjectContext(r *http.Request) projectContext

MustHaveProjectContext gets the projectContext from the request, or panics if it does not exist.

func MustHaveRESTContext

func MustHaveRESTContext(r *http.Request) *model.Context

MustHaveRESTContext fetches the model.Context stored with the request, and panics if the key is not set.

func MustHaveTask

func MustHaveTask(r *http.Request) *task.Task

MustHaveTask gets the task from an HTTP Request. Panics if the task is not in request context.

func MustHaveUser

func MustHaveUser(r *http.Request) *user.DBUser

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 PopulateUIVersion(version *model.Version) (*uiVersion, error)

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

func (as *APIServer) GetServiceApp() *gimlet.APIApp

NewRouter returns the root router for all APIServer endpoints.

func (*APIServer) GetSettings

func (as *APIServer) GetSettings() evergreen.Settings

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

func (as *APIServer) LoggedError(w http.ResponseWriter, r *http.Request, code int, err error)

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

type TemplateFunctionOptions struct {
	WebHome  string
	HelpHome string
}

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 CreateTestServer(settings *evergreen.Settings, tlsConfig *tls.Config) (*TestServer, error)

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 UIDisplayTask struct {
	Name           string   `json:"name"`
	ExecutionTasks []string `json:"execution_tasks"`
}

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 NewUIServer(settings *evergreen.Settings, queue amboy.Queue, home string, fo TemplateFunctionOptions) (*UIServer, error)

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

func (uis *UIServer) GetServiceApp() *gimlet.APIApp

NewRouter sets up a request router for the UI, installing hard-coded routes as well as those belonging to plugins.

func (*UIServer) GetSettings

func (uis *UIServer) GetSettings() evergreen.Settings

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

func (uis *UIServer) LoggedError(w http.ResponseWriter, r *http.Request, code int, err error)

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

type ViewData

type ViewData struct {
	User        *user.DBUser
	ProjectData projectContext
	Project     model.Project
	Flashes     []interface{}
	Banner      string
	BannerTheme string
	Csrf        htmlTemplate.HTML
	JiraHost    string
	Bugsnag     string
}

ViewData contains common data that is provided to all Evergreen pages

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL