blob: 1d4549f2fab0c7b8dd48806a39e829d3d18d0b1c [file] [log] [blame] [edit]
// Copyright 2020 syzkaller project authors. All rights reserved.
// Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.
package kcidb
// Kernel CI report data. To be submitted to/queried from the common report database.
//
// Objects in the data are identified and linked together using "id" and "*_id" string properties.
// Each value of these properties must start with a non-empty string identifying the CI system which
// submitted the object, followed by a colon ':' character. The rest of the string is generated by
// the origin CI system, and must identify that object uniquely among all objects of the same type,
// coming from that CI system.
//
// Any of the immediate properties (except "version") can be missing or be an empty list with each
// submission/query, but only complete data stored in the database should be considered valid.
//
// E.g. a test run referring to a non-existent build is allowed into/from the database,
// but would only appear in reports once both the build and its revision are present.
//
// No special meaning apart from "data is missing" is attached to any immediate or deeper properties being omitted,
// when they're not required, and no default values should be assumed for them.
// At the same time, no properties can be null.
//
// Extra free-form data can be stored under "misc" fields associated with various objects throughout the schema,
// if necessary. That data could later be used as the basis for defining new properties to house it.
type Kcidb struct {
Revisions []*Revision `json:"revisions,omitempty"`
Builds []*Build `json:"builds,omitempty"`
Tests []*Test `json:"tests,omitempty"`
Version *Version `json:"version"`
}
// A build of a revision.
type Build struct {
// Target architecture of the build.
Architecture string `json:"architecture,omitempty"`
// Full shell command line used to make the build, including environment variables.
Command string `json:"command,omitempty"`
// Name and version of the compiler used to make the build.
Compiler string `json:"compiler,omitempty"`
// A name describing the build configuration options.
ConfigName string `json:"config_name,omitempty"`
// The URL of the build configuration file.
ConfigURL string `json:"config_url,omitempty"`
// Human-readable description of the build.
Description string `json:"description,omitempty"`
// The number of seconds it took to complete the build.
Duration float64 `json:"duration,omitempty"`
// Build ID.
// Must start with a non-empty string identifying the CI system which submitted the build,
// followed by a colon ':' character. The rest of the string is generated by the origin CI system,
// and must identify the build uniquely among all builds, coming from that CI system.
ID string `json:"id"`
// A list of build input files. E.g. configuration.
InputFiles []*Resource `json:"input_files,omitempty"`
// The URL of the build log file.
LogURL string `json:"log_url,omitempty"`
// Miscellaneous extra data about the build.
Misc *BuildMisc `json:"misc,omitempty"`
// The name of the CI system which submitted the build.
Origin string `json:"origin"`
// A list of build output files: images, packages, etc.
OutputFiles []*Resource `json:"output_files,omitempty"`
// ID of the built revision. The revision must be valid for the build to be considered valid.
RevisionID string `json:"revision_id"`
// The time the build was started.
StartTime string `json:"start_time,omitempty"`
// True if the build is valid, i.e. if it could be completed.
Valid bool `json:"valid"`
}
// Miscellaneous extra data about the build.
type BuildMisc struct {
OriginURL string `json:"origin_url,omitempty"`
ReportedBy string `json:"reported_by,omitempty"`
}
// The environment the test ran in. E.g. a host, a set of hosts, or a lab;
// amount of memory/storage/CPUs, for each host; process environment variables, etc.
type Environment struct {
// Human-readable description of the environment.
Description string `json:"description,omitempty"`
// Miscellaneous extra data about the environment.
Misc *EnvironmentMisc `json:"misc,omitempty"`
}
// Miscellaneous extra data about the environment.
type EnvironmentMisc struct {
}
// A revision of the tested code.
//
// Represents a way the tested source code could be obtained. E.g. checking out a particular commit from a git repo,
// and applying a set of patches on top.
type Revision struct {
// List of e-mail addresses of contacts concerned with this revision, such as authors, reviewers, and mail lists.
Contacts []string `json:"contacts,omitempty"`
// Human-readable description of the revision. E.g. a release version, or the subject of a patchset message.
Description string `json:"description,omitempty"`
// The time the revision was discovered by the CI system. E.g. the time the CI system found a patch message,
// or noticed a new commit or a new tag in a git repo.
DiscoveryTime string `json:"discovery_time,omitempty"`
// The full commit hash of the revision's base code.
GitCommitHash string `json:"git_commit_hash,omitempty"`
// A human-readable name of the commit containing the base code of the revision,
// as would be output by "git describe", at the discovery time.
GitCommitName string `json:"git_commit_name,omitempty"`
// The Git repository branch in which the commit with the revision's base code was discovered.
GitRepositoryBranch string `json:"git_repository_branch,omitempty"`
// The URL of the Git repository which contains the base code of the revision.
// The shortest possible https:// URL, or, if that's not available, the shortest possible git:// URL.
GitRepositoryURL string `json:"git_repository_url,omitempty"`
// Revision ID.
//
// Must contain the full commit hash of the revision's base code in the Git repository.
//
// If the revision had patches applied to the base code, the commit hash should be followed by the '+'
// character and a sha256 hash over newline-terminated sha256 hashes of each applied patch, in order.
// E.g. generated with this shell command: "sha256sum *.patch | cut -c-64 | sha256sum | cut -c-64".
ID string `json:"id"`
// The URL of the log file of the attempt to construct this revision from its parts. E.g. 'git am' output.
LogURL string `json:"log_url,omitempty"`
// The value of the Message-ID header of the e-mail message introducing this code revision,
// if any. E.g. a message with the revision's patchset, or a release announcement sent to a maillist.
MessageID string `json:"message_id,omitempty"`
// Miscellaneous extra data about the revision.
Misc *RevisionMisc `json:"misc,omitempty"`
// The name of the CI system which submitted the revision.
Origin string `json:"origin"`
// List of mboxes containing patches applied to the base code of the revision, in order of application.
PatchMboxes []*Resource `json:"patch_mboxes,omitempty"`
// The time the revision was made public. E.g. the timestamp on a patch message, a commit, or a tag.
PublishingTime string `json:"publishing_time,omitempty"`
// The widely-recognized name of the sub-tree (fork) of the main code tree that the revision belongs to.
TreeName string `json:"tree_name,omitempty"`
// True if the revision is valid, i.e. if its parts could be combined.
// False if not, e.g. if its patches failed to apply.
Valid bool `json:"valid"`
}
// Miscellaneous extra data about the revision.
type RevisionMisc struct {
}
// A test run against a build.
//
// Could represent a result of execution of a test suite program, a result of one of the tests done by the test
// suite program, as well as a summary of a collection of test suite results.
//
// Each test run should normally have a dot-separated test "path" specified in the "path" property,
// which could identify a specific test within a test suite (e.g. "LTPlite.sem01"), a whole test suite
// (e.g. "LTPlite"), or the summary of all tests for a build ( - the empty string).
type Test struct {
// ID of the tested build. The build must be valid for the test run to be considered valid.
BuildID string `json:"build_id"`
// Human-readable description of the test run.
Description string `json:"description,omitempty"`
// The number of seconds it took to run the test.
Duration float64 `json:"duration,omitempty"`
// The environment the test ran in. E.g. a host, a set of hosts, or a lab; amount of memory/storage/CPUs,
// for each host; process environment variables, etc.
Environment *Environment `json:"environment,omitempty"`
// ID of the test run.
// Must start with a non-empty string identifying the CI system which submitted the test run,
// followed by a colon ':' character. The rest of the string is generated by the origin CI system,
// and must identify the test run uniquely among all test runs, coming from that CI system.
ID string `json:"id"`
// Miscellaneous extra data about the test run.
Misc *TestMisc `json:"misc,omitempty"`
// The name of the CI system which submitted the test run.
Origin string `json:"origin"`
// A list of test outputs: logs, dumps, etc.
OutputFiles []*Resource `json:"output_files,omitempty"`
// Dot-separated path to the node in the test classification tree the executed test belongs to.
// E.g. "ltp.sem01". The empty string signifies the root of the tree, i.e. all tests for the build,
// executed by the origin CI system.
Path string `json:"path,omitempty"`
// The time the test run was started.
StartTime string `json:"start_time,omitempty"`
// The test status string, one of the following. "ERROR" - the test is faulty, the status of the tested
// code is unknown.
// "FAIL" - the test has failed, the tested code is faulty.
// "PASS" - the test has passed, the tested code is correct.
// "DONE" - the test has finished successfully, the status of the tested code is unknown.
// "SKIP" - the test wasn't executed, the status of the tested code is unknown.
//
// The status names above are listed in priority order (highest to lowest), which could be used for producing
// a summary status for a collection of test runs, e.g. for all testing done on a build, based on results of
// executed test suites. The summary status would be the highest priority status across all test runs
// in a collection.
Status string `json:"status,omitempty"`
// True if the test status should be ignored.
// Could be used for reporting test results without affecting the overall test status and alerting
// the contacts concerned with the tested code revision. For example, for collecting test reliability
// statistics when the test is first introduced, or is being fixed.
Waived bool `json:"waived"`
}
// Miscellaneous extra data about the test.
type TestMisc struct {
OriginURL string `json:"origin_url,omitempty"`
ReportedBy string `json:"reported_by,omitempty"`
UserSpaceArch string `json:"user_space_arch,omitempty"`
CauseRevisionID string `json:"cause_revision_id,omitempty"`
}
// A named remote resource.
type Resource struct {
// Resource name. Must be usable as a local file name for the downloaded resource. Cannot be empty.
// Should not include directories.
Name string `json:"name"`
// Resource URL. Must point to the resource file directly, so it could be downloaded automatically.
URL string `json:"url"`
}
type Version struct {
// Major number of the schema version.
//
// Increases represent backward-incompatible changes. E.g. deleting or renaming a property,
// changing a property type, restricting values, making a property required, or adding a new required property.
Major int `json:"major"`
// Minor number of the schema version.
//
// Increases represent backward-compatible changes. E.g. relaxing value restrictions,
// making a property optional, or adding a new optional property.
Minor int `json:"minor"`
}