| // Copyright 2023 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 jobs supports jobs, which are collections of enqueued tasks. |
| package jobs |
| |
| import ( |
| "time" |
| ) |
| |
| // A Job is a set of related scan tasks enqueued at the same time. |
| type Job struct { |
| User string |
| StartedAt time.Time |
| URL string // The URL that initiated the job. |
| Binary string // Name of binary. |
| BinaryVersion string // Hex-encoded hash of binary. |
| BinaryArgs string // The args to the binary. |
| Canceled bool // The job was canceled. |
| // Counts of tasks. |
| NumEnqueued int // Written by enqueue endpoint. |
| NumStarted int // Incremented at the start of a scan. |
| NumSkipped int // Previously run, stored in BigQuery. |
| NumFailed int // The HTTP request failed (status != 200) |
| NumErrored int // The HTTP request succeeded, but the scan resulted in an error. |
| NumSucceeded int |
| } |
| |
| // NewJob creates a new Job. |
| func NewJob(user string, start time.Time, url, binaryName, binaryVersion, binaryArgs string) *Job { |
| return &Job{ |
| User: user, |
| StartedAt: start, |
| URL: url, |
| Binary: binaryName, |
| BinaryVersion: binaryVersion, |
| BinaryArgs: binaryArgs, |
| } |
| } |
| |
| const startTimeFormat = "060102-150405" // YYMMDD-HHMMSS, UTC |
| |
| // ID returns a unique identifier for a job which can serve as a database key. |
| func (j *Job) ID() string { |
| return j.User + "-" + j.StartedAt.In(time.UTC).Format(startTimeFormat) |
| } |
| |
| func (j *Job) NumFinished() int { |
| return j.NumSkipped + j.NumFailed + j.NumErrored + j.NumSucceeded |
| } |