syntax = "proto3"; package resf.peridot.v1; import "google/protobuf/wrappers.proto"; import "google/protobuf/timestamp.proto"; import "google/api/annotations.proto"; import "peridot/proto/v1/import.proto"; import "peridot/proto/v1/task.proto"; import "peridot/proto/v1/batch.proto"; import "peridot/proto/v1/yumrepofs/yumrepofs.proto"; import "validate/validate.proto"; option go_package = "peridot.resf.org/peridot/pb;peridotpb"; service BuildService { // ListBuilds returns all builds filtered through given filters rpc ListBuilds(ListBuildsRequest) returns (ListBuildsResponse) { option (google.api.http) = { get: "/v1/projects/{project_id=*}/builds" }; } // GetBuild returns a build by its id rpc GetBuild(GetBuildRequest) returns (GetBuildResponse) { option (google.api.http) = { get: "/v1/projects/{project_id=*}/builds/{build_id=*}" }; } // ListBuildBatches returns all build batches rpc ListBuildBatches(ListBuildBatchesRequest) returns (ListBuildBatchesResponse) { option (google.api.http) = { get: "/v1/projects/{project_id=*}/build_batches" }; } // GetBuildBatch returns a build batch by its id rpc GetBuildBatch(GetBuildBatchRequest) returns (GetBuildBatchResponse) { option (google.api.http) = { get: "/v1/projects/{project_id=*}/build_batches/{build_batch_id=*}" }; } // SubmitBuild builds a package scoped to a project // The project has to contain an import for the specific package // This method is asynchronous. Peridot uses the AsyncTask abstraction. // Check out `//peridot/proto/v1:task.proto` for more information rpc SubmitBuild(SubmitBuildRequest) returns (AsyncTask) { option (google.api.http) = { post: "/v1/projects/{project_id=*}/builds" body: "*" }; option (resf.peridot.v1.task_info) = { response_type: "SubmitBuildTask" metadata_type: "PackageOperationMetadata" }; } // SubmitBuildBatch submits a batch of builds. rpc SubmitBuildBatch(SubmitBuildBatchRequest) returns (SubmitBuildBatchResponse) { option (google.api.http) = { post: "/v1/projects/{project_id=*}/build_batches" body: "*" }; } // RpmImport imports rpm files into a project (packaged into tar format) rpc RpmImport(RpmImportRequest) returns (AsyncTask) { option (google.api.http) = { post: "/v1/projects/{project_id=*}/builds/rpm-import" body: "*" }; option (resf.peridot.v1.task_info) = { response_type: "RpmImportTask" metadata_type: "RpmImportOperationMetadata" }; } // RpmLookasideBatchImport imports rpm files into a project (stored in Lookaside) rpc RpmLookasideBatchImport(RpmLookasideBatchImportRequest) returns (AsyncTask) { option (google.api.http) = { post: "/v1/projects/{project_id=*}/builds/rpm-lookaside-batch-import" body: "*" }; option (resf.peridot.v1.task_info) = { response_type: "RpmLookasideBatchImportTask" metadata_type: "RpmLookasideBatchImportOperationMetadata" }; } } message Build { // Unique identifier for the specific build string id = 1; // Timestamp the build was created google.protobuf.Timestamp created_at = 2; // Package or module name string name = 3; // Import revisions (usually one, but multiple for modules) repeated ImportRevision import_revisions = 4; // Parent task ID for the specific build string task_id = 5; // Task status TaskStatus status = 6; } message SubmitBuildRequest { // Project ID that we want this build to be assigned to // All build requests need a project id, however after // the initial import, sharing the VRE in an inter-project // way is possible. string project_id = 1; // Package name we want to build // Has to follow the OpenPatch architecture oneof package { google.protobuf.StringValue package_name = 2 [(validate.rules).message.required = true]; google.protobuf.StringValue package_id = 8 [(validate.rules).message.required = true]; } // Specific import hash to build // Optional, latest is built if null google.protobuf.StringValue scm_hash = 3; // Disable checks will disable testing on specified target // NOT RECOMMENDED AND WILL BE LIMITED IN THE FUTURE // THE RESULTING ARTIFACTS SHOULD NOT BE USED bool disable_checks = 4; // Only build specified branches // Branches is only valid for modular packages // If specified, "normal" packages won't be built repeated string branches = 5; // Whether to build module variant only // This only works with packages with two variants // Ignored for single variant packages bool module_variant = 6; // Side NVRs pulls in the specified NVRs only for this build // Fails if any NVR is not available repeated string side_nvrs = 7; // Whether to set inactive or not bool set_inactive = 9; } message SubmitBuildBatchRequest { // Only the top-most project id is used for all build requests string project_id = 1; repeated SubmitBuildRequest builds = 2 [(validate.rules).repeated.min_items = 1]; } message SubmitBuildBatchResponse { string build_batch_id = 1; } message SubmitBuildTask { // Build ID is the unique identifier that is used for a specific build request string build_id = 1; // Package name that was built string package_name = 2; // Import revision that was built ImportRevision import_revision = 3; // All produced artifacts (all artifacts should be available in blob storage) repeated TaskArtifact artifacts = 4; // True if tests/checks was disabled bool checks_disabled = 5; // Whether it was a module build or not bool modular = 6; // Parent task ID (usually for module builds) google.protobuf.StringValue parent_task_id = 7; // Repo changes resf.peridot.yumrepofs.v1.UpdateRepoTask repo_changes = 8; // Build task ID is the unique identifier that is used for a specific build request string build_task_id = 9; } message SubmitBuildBatchTask { repeated SubmitBuildTask builds = 1; } message BuildFilters { // The status filter only returns builds that // has the given status TaskStatus status = 1; } message ListBuildsRequest { string project_id = 1; // Filters that should be applied to the list query // No filters will return all builds globally BuildFilters filters = 2; int32 page = 3; int32 limit = 4 [(validate.rules).int32.lte = 100]; } message ListBuildsResponse { repeated Build builds = 1; // Total packages from server int64 total = 2; // Limit from request int32 size = 3; // Current page int32 page = 4; } message GetBuildRequest { string project_id = 1; string build_id = 2; } message GetBuildResponse { Build build = 1; } message BuildBatch { string id = 1; google.protobuf.Timestamp created_at = 2; int32 count = 3; int32 pending = 4; int32 running = 5; int32 succeeded = 6; int32 failed = 7; int32 canceled = 8; } message ListBuildBatchesRequest { string project_id = 1; int32 page = 2; int32 limit = 3 [(validate.rules).int32.lte = 100]; } message ListBuildBatchesResponse { repeated BuildBatch build_batches = 1; // Total packages from server int64 total = 2; // Limit from request int32 size = 3; // Current page int32 page = 4; } message GetBuildBatchRequest { string project_id = 1; string build_batch_id = 2; int32 page = 3; int32 limit = 4 [(validate.rules).int32.lte = 100]; BatchFilter filter = 5; } message GetBuildBatchResponse { repeated Build builds = 1; int32 pending = 2; int32 running = 3; int32 succeeded = 4; int32 failed = 5; int32 canceled = 6; // Total packages from server int64 total = 7; // Limit from request int32 size = 8; // Current page int32 page = 9; } message ExtraYumrepofsRepo { string name = 1; bool module_hotfixes = 2; bool ignore_exclude = 3; } // These options can be used to customize the behavior of the service // Can only be defined/set by internal services // Is especially used when building modules and module components message ExtraBuildOptions { // Disable yumrepofs updates bool disable_yumrepofs_updates = 1; // Extra files that should be added to the build root // Key = path to file, value = contents of file map build_arch_extra_files = 2; // Reusable build ID // Used specifically for module builds string reusable_build_id = 3; // Extra yumrepofs repos that should be added to the build root repeated ExtraYumrepofsRepo extra_yumrepofs_repos = 4; // Whether the build is part of a batch string build_batch_id = 5; // Modules to enable during build repeated string modules = 6; // Packages to exclude from all repositories not marked with ignore_exclude repeated string exclude_packages = 7; // Whether to enable networking in rpmbuild bool enable_networking = 8; // Force a specific dist string force_dist = 9; } message RpmImportRequest { string project_id = 1; // Rpms // // Previously uploaded RPM tarball string rpms = 2 [(validate.rules).string = { prefix: "/data/rpms/", }]; // Force override // // Overwrite existing RPMs even if NVRA is locked // Useful for secure boot scenarios for example bool force_override = 3; } message RpmImportTask { resf.peridot.yumrepofs.v1.UpdateRepoTask repo_changes = 1; } message RpmImportOperationMetadata { string package_name = 1; } message RpmLookasideBatchImportRequest { string project_id = 1; // Rpms // // Previously uploaded RPM tarball repeated string lookaside_blobs = 2; // Force override // // Overwrite existing RPMs even if NVRA is locked // Useful for secure boot scenarios for example bool force_override = 3; } message RpmLookasideBatchImportTask { resf.peridot.yumrepofs.v1.UpdateRepoTask repo_changes = 1; } message RpmLookasideBatchImportOperationMetadata { repeated string package_names = 1; }