// Copyright 2022 The LUCI Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

syntax = "proto3";

package provenance.snooperpb;

option go_package = "go.chromium.org/luci/provenance/api/snooperpb/v1;snooperpb";

import "google/protobuf/empty.proto";
import "google/protobuf/timestamp.proto";
import "go.chromium.org/luci/cipd/api/cipd/v1/repo.proto";

service SelfReport {
    // Interface to report cipd packages admitted on the local machine. This
    // should be used by Admission plugin only.
    rpc ReportCipd(ReportCipdRequest) returns (google.protobuf.Empty);

    // Interface to report git repos checked out  on the local machine. This
    // should be used by git plugin only.
    rpc ReportGit(ReportGitRequest) returns (google.protobuf.Empty);

    // Reports running task's stage. A task is typically a collection of
    // workflows/statements. Some of these statements can be grouped together
    // to define a stage, e.g. when a task is downloading sources/deps, it is
    // known as `FETCH` stage.
    // For details read go/snoopy-design (Google-internal).
    rpc ReportTaskStage(ReportTaskStageRequest) returns (google.protobuf.Empty);

    // Reports digest of produced artifact from a task.
    rpc ReportArtifactDigest(ReportArtifactDigestRequest) returns (google.protobuf.Empty);
}

// Indicator to task status. This is used to annotate logs when a task starts
// ends or reaches a certain "interesting" stage.
//
// This is crucial to enforce security policies based on current state of the
// task. For example, more restrictive network connections can be applied when a
// task reaches `compile` stage.
//
// Below is a brief rationale behind each steps:
//   * STARTED: provenance of an artifact captures sources that goes into a
//              build. A single compute resource typically outlives a task, in
//              other words, a single machine can run multiple tasks in it's
//              lifetime. Task start indicates the capturing time window began.
//   * FETCH: typically a task depends on a bunch of dependencies that are
//            fetched to set up the environment before compiling the artifact.
//            Fetch indicates that the task is currently installing these deps.
//   * COMPILE: ideally in compile step, there shouldn't be any new fetching.
//   * UPLOAD: after finishing compilation, this step indicates built artifacts
//             are being uploaded to its destination. A single task can have
//             multiple produced artifacts.
//   * UPLOAD_COMPLETE: it indicates all produced artifacts have been uploaded.
//                      This is crucial to closing the capturing time window for
//                      provenance generation.
//   * TEST: often a task runs regression tests after an artifact has been
//           produced. Some times requirements around this tests is an open
//           environment which might not be safe for other task phases. To
//           support effective tests, some policies can be lifted at this stage.
//           (Although it is highly encouraged to schedule tests on a separate
//           machine when possible to minimize risks of cross-contamination).
//   * COMPLETE: complete indicates whether a task execution finished. This is
//               crucial for server to set as this creates a clear boundary
//               between subsequent tasks on a same machine.
enum TaskStage {
    STAGE_UNSPECIFIED = 0;
    STARTED = 1;
    FETCH = 2;
    COMPILE = 3;
    UPLOAD = 4;
    UPLOAD_COMPLETE = 5;
    TEST = 6;
    COMPLETE = 7;
}

// Identifies storage location of a particular artifact. This will be used to
// attach provenance:
//      * GCS: provenance will be uploaded alongside the artifact.
//      * CIPD: provenance will be added to package metadata.
// Currently we support provenance for two types of artifacts (gcs, cipd).
message Artifact {
    // Artifacts stored on CIPD. This defaults to prod instance of CIPD.
    message CIPD {
        // Identifies a hierarchical package. This will be the absolute name
        // of a package (including path).
        string package_name = 1;
        // Unique identifier of an instance of a package.
        string instance_id = 2;
        // CIPD backend host (dev/prod) where the artifact is stored.
        // If not provided, default is CIPD prod host.
        string host = 3;
    }
    oneof kind {
        // Artifacts stored on Google Cloud Storage, e.g. Chrome binaries.
        // Identifier of artifact's storage location, e.g.
        // gs://example-bucket/app/1.2.3.4/mac64/bin.dmg
        string gcs = 1;
        CIPD cipd = 2;
    }
}

message CipdReport {
    // An identifier to map multiple reports to a machine/task. This is
    // going to be the hash(access_token) used by bots to make requests
    // to luci services.
    string requestor_id = 1;

    // CIPD package name requested/installed on the machine.
    string package_name = 2;

    // Unique identifier of the package instance, a.k.a. instance_id.
    string iid = 3;

    // CIPD tags attached to the deployed package.
    repeated cipd.Tag tags = 4;

    // CIPD refs attached to the deployed package.
    repeated cipd.Ref refs = 5;

    // Event timestamp. This is local to the service, not necessarily same as
    // the reflected recorded timestamp on the logs.
    google.protobuf.Timestamp event_ts = 6;
}

message GitReport {
    // An identifier to map multiple reports to a machine/task. Reporter do not
    // need to set this. It is used by the server to group reports together and
    // bind them to a single task.
    string requestor_id = 1;

    // Git repository URL.
    string repo = 2;
    // Commit that was fetched for this repo.
    string commit = 3;
    // This is coming from an upstream dependency, although a checkout can be
    // uniquely attributed by a repo and a commit, they don't often produce
    // measurable inputs for security policy.
    // For example, a git repo may have multiple refs/branches and only some of
    // them may have `Code Review` required.
    //
    // To make a security policy decision about a particular commit, sometimes
    // it is useful to know which branch/ref the commit is associated with, note
    // a single commit can be associated with multiple branches, but the highest
    // security policy will always be enforced.
    // Scenario:
    // Git repo: "http://repo.git"
    // Commit  : "deadbeef"
    // Refs    : ["refs/heads/main", "refs/feature/experimental"]
    // In this example, the particular commit belongs to two branches, one does
    // not have mandatory code review (experimental) but the other does.
    //
    // Irrespective of the order of where the commit belonged first, it is
    // certain that the change was reviewed as this was merged to main branch.
    string refs = 4;

    // Event timestamp. This is local to the service, not necessarily same as
    // the reflected recorded timestamp on the logs.
    google.protobuf.Timestamp event_ts = 5;
}

message ReportTaskStageRequest {
    TaskStage task_stage = 1;
    google.protobuf.Timestamp timestamp = 2;

    // Recipe is essentially the entry point for the given task, it can be a
    // `build_rule` or a custom executable (like `luci recipes`) that dictates
    // workflow of a task.
    //
    // (Required) when reporting a task start.
    string recipe = 3;
    // Process ID of the task that self-reports task stages. It is used by the
    // server to periodically check health of running task and assert a close
    // approximation of task end time.
    //
    // Accuracy on task end time estimation can vary between implementations, it
    // directly depends on frequency at which provenance server checks status of
    // reported pid.
    //
    // (Required) when reported a task start.
    int64 pid = 4;
}

message ReportArtifactDigestRequest {
    // SHA256 digest of artifact.
    string digest = 1;

    // Identifies storage location of a particular artifact. This will be used
    // by Spike to attach provenance:
    //      * GCS: provenance will be uploaded alongside the artifact.
    //      * CIPD: provenance will be added to package metadata.
    Artifact artifact = 2;
}

message ReportCipdRequest {
    // cipd_report will consist of package name, instance_id of a cipd package.
    CipdReport cipd_report = 1;
}

message ReportGitRequest {
    // git_report will consist of repo name, git hash of checked out repo.
    GitReport git_report = 1;
}
