// Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Package types contains common types used by the Go continuous build // system. package types import "time" // BuildStatus is the data structure that's marshalled as JSON // for the https://build.golang.org/?mode=json page. type BuildStatus struct { // Builders is a list of all known builders. // The order that builders appear is the same order as the build results for a revision. Builders []string `json:"builders"` // Revisions are the revisions shown on the front page of build.golang.org, // in the same order. It starts with the "go" repo, from recent to old, and then // it has 1 each of the subrepos, with only their most recent commit. Revisions []BuildRevision `json:"revisions"` } // BuildRevision is the status of a commit across all builders. // It corresponds to a single row of https://build.golang.org/ type BuildRevision struct { // Repo is "go" for the main repo, else "tools", "crypto", "net", etc. // These are repos as listed at https://go.googlesource.com/ Repo string `json:"repo"` // Revision is the full git hash of the repo. Revision string `json:"revision"` // GoRevision is the full git hash of the "go" repo, if Repo is not "go" itself. // Otherwise this is empty. GoRevision string `json:"goRevision,omitempty"` // Date is the commit date of this revision, formatted in RFC3339. Date string `json:"date"` // Branch is the branch of this commit, e.g. "master" or "dev.ssa". Branch string `json:"branch"` // GoBranch is the branch of the GoRevision, for subrepos. // It is empty for the main repo. // Otherwise it's of the form "master", "release-branch.go1.8", etc. GoBranch string `json:"goBranch,omitempty"` // Author is the author of this commit in standard git form // "Name ". Author string `json:"author"` // Desc is the commit message of this commit. It may be // truncated. Desc string `json:"desc"` // Results are the build results for each of the builders in // the same length slice BuildStatus.Builders. // Each string is either "" (if no data), "ok", or the URL to failure logs. Results []string `json:"results"` } // SpanRecord is a datastore entity we write only at the end of a span // (roughly a "step") of the build. type SpanRecord struct { BuildID string IsTry bool // is trybot run GoRev string Rev string // same as GoRev for repo "go" Repo string // "go", "net", etc. Builder string // "linux-amd64-foo" OS string // "linux" Arch string // "amd64" Event string Error string // empty for no error Detail string StartTime time.Time EndTime time.Time Seconds float64 } // BuildRecord is the datastore entity we write both at the beginning // and end of a build. Some fields are not updated until the end. type BuildRecord struct { ID string ProcessID string StartTime time.Time IsTry bool // is trybot run IsSlowBot bool // is an explicitly requested "slowbot" builder GoRev string Rev string // same as GoRev for repo "go" Repo string // "go", "net", etc. Builder string // "linux-amd64-foo" ContainerHost string // "" means GKE; "cos" means Container-Optimized OS OS string // "linux" Arch string // "amd64" EndTime time.Time Seconds float64 Result string // empty string, "ok", "fail" FailureURL string `datastore:",noindex"` // deprecated; use LogURL LogURL string `datastore:",noindex"` // TODO(bradfitz): log which reverse buildlet we got? // Buildlet string } type ReverseBuilder struct { Name string HostType string ConnectedSec float64 IdleSec float64 `json:",omitempty"` BusySec float64 `json:",omitempty"` Version string // buildlet version Busy bool } // ReverseHostStatus is part of ReverseBuilderStatus. type ReverseHostStatus struct { HostType string // dashboard.Hosts key Connected int // number of connected buildlets Expect int // expected number, from dashboard.Hosts config Idle int Busy int Waiters int // number of builds waiting on a buildlet host of this type // Machines are all connected buildlets of this host type, // keyed by machine self-reported unique name. Machines map[string]*ReverseBuilder } // ReverseBuilderStatus is https://farmer.golang.org/status/reverse.json // // It is used by monitoring and the Mac VMWare infrastructure to // adjust the Mac VMs based on deaths and demand. type ReverseBuilderStatus struct { // Machines maps from the connected builder name (anything unique) to its status. HostTypes map[string]*ReverseHostStatus } func (s *ReverseBuilderStatus) Host(hostType string) *ReverseHostStatus { if s.HostTypes == nil { s.HostTypes = make(map[string]*ReverseHostStatus) } hs, ok := s.HostTypes[hostType] if ok { return hs } hs = &ReverseHostStatus{HostType: hostType} s.HostTypes[hostType] = hs return hs } // MajorMinor is a major-minor version pair. type MajorMinor struct { Major, Minor int } // Less reports whether a is less than b. func (a MajorMinor) Less(b MajorMinor) bool { if a.Major != b.Major { return a.Major < b.Major } return a.Minor < b.Minor } // BuildletWaitStatus is the periodic messages we send to "gomote create" // clients or show on trybot status pages to tell the user who long // they're expected to wait. type BuildletWaitStatus struct { // Message is a free-form message to send to the user's gomote binary. // If present, all other fields are ignored. Message string `json:"message"` // Ahead are the number of waiters ahead of this buildlet request. Ahead int `json:"ahead"` // TODO: add number of active builds, and number of builds // creating. And for how long. And maybe an estimate of how // long those builds typically take? But recognize which are // dynamic vs static (reverse) builder types and don't say // that "1 is creating" on a reverse buildlet that can't // actually "create" any. (It can just wait for one register // itself) } // ActivePostSubmitBuild is a summary of an active build that the // coordinator's doing. Each one is rendered on build.golang.org as a // blue gopher which links to StatusURL to watch the build live. type ActivePostSubmitBuild struct { Builder string `json:"builder"` // "linux-amd64" Commit string `json:"commit"` // hash of commit being tested GoCommit string `json:"goCommit,omitempty"` // hash of Go commit, or empty for the main repo StatusURL string `json:"statusURL"` }