// Copyright 2019 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

syntax = "proto2";

package scheduler;

// Model of .ci.yaml.
// Next ID: 4
message SchedulerConfig {
    // Targets to run from this config.
    repeated Target targets = 1;
    // Git branches to run these targets against.
    repeated string enabled_branches = 2;
    // Universal platform args passed to LUCI builders.
    // Keys are the platforms and values are the PlatformProperties (properties, dimensions etc.).
    map<string, PlatformProperties> platform_properties = 3;
    // Next ID: 3
    message PlatformProperties {
        // Generic key, value pairs to set platform-wide properties
        map<string, string> properties = 1;
        // Generic key, value pairs to set platform-wide dimensions
        // Doc for dimension and properties: https://chromium.googlesource.com/infra/luci/luci-py/+/HEAD/appengine/swarming/doc/User-Guide.md
        map<string, string> dimensions = 2;
    }
}

// A unit of work for infrastructure to run.
// Next ID: 17
message Target {
    // Unique, human readable identifier.
    optional string name = 1;
    // Names of other targets required to succeed before triggering this target.
    repeated string dependencies = 2;
    // Whether this target is stable and can be used to gate commits.
    // Defaults to false which blocks builds and does not run in presubmit.
    optional bool bringup = 3 [default = false];
    // Number of minutes this target is allowed to run before being marked as failed.
    optional int32 timeout = 4 [default = 30];
    // Name of the testbed this target will run on.
    // Defaults to a linux vm.
    optional string testbed = 5 [default = 'linux-vm'];
    // Properties to configure infrastructure tooling.
    map<string, string> properties = 6;
    // Name of the LUCI builder to trigger.
    optional string builder = 7 [deprecated = true];
    // Name of the scheduler to trigger this target.
    // Defaults to being triggered by cocoon.
    optional SchedulerSystem scheduler = 8 [default = cocoon];
    // Whether target should run pre-submit. Defaults to true, will run in presubmit.
    optional bool presubmit = 9 [default = true];
    // Whether target should run post-submit. Defaults to true, will run in postsubmit.
    optional bool postsubmit = 10 [default = true];
    // List of paths that trigger this target in presubmit when there is a diff.
    // If no paths are given, it will always run.
    repeated string run_if = 11;
    // Override of enabled_branches for this target (for release targets).
    repeated string enabled_branches = 12;
    // Name of the LUCI recipe to use for the builder.
    optional string recipe = 13;
    reserved 14; // tags
    // Properties to configure infrastructure tooling for only postsubmit runs.
    map<string, string> postsubmit_properties = 15;
    // Dimensions to configure swarming dimensions of LUCI builds.
    map<string, string> dimensions = 16;
    // Dimensions used when this build runs within a drone.
    repeated string drone_dimensions = 17;
    // Runs the target if files are not in these paths.
    repeated string run_if_not = 18;
}

// Schedulers supported in SchedulerConfig.
// Next ID: 5
enum SchedulerSystem {
    // Cocoon will handle all actions for the target (initial trigger, retries).
    cocoon = 1;
    // LUCI triggers the build when mirrored to GoB. Cocoon triggers retries.
    luci = 2;
    // Google internally uses Flutter, and validates if tip-of-tree causes breakages.
    google_internal = 3;
    // Special Cocoon scheduler case to trigger targets intended for beta and stable releases.
    release = 4;
}
