// Copyright 2020 The Chromium OS 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 = "proto3";

package client;

import "client/profile_id.proto";
import "google/protobuf/duration.proto";

option go_package = "go.chromium.org/chromiumos/infra/proto/go/client";

// Profile to coordinate behavioral configs of internal sub services e.g. test platform
// Next Tag: 4
message Profile {
  string name = 1;
  client.ProfileId id = 2;
  TestPlatformProfile test_platform_profile = 3;
}

// TestPlatformProfile configures aspects of the test platform behaviour per-request.
// Configure the scheduling priorities in the test platform, retry behavior, timeout characteristics
// and alerting thresholds throughout the test platform stack.
// Next Tag: 5
message TestPlatformProfile {
  SchedulerProfile scheduler = 1;
  RetryProfile retry = 2;
  TimeoutProfile timeout = 3;
  MonitoringProfile monitoring = 4;
}

// SchedulerProfile controls the test platform scheduling behaviour.
// Next Tag: 5
message SchedulerProfile {

  // ManagedPool enumerates the different lab platform-managed pools.
  // Devices in these pools are automatically managed by lab platform
  // systems and can not be arbitrarily assigned to pools by users.
  //
  // Managed pool implementations are specific to test platform's scheduling
  // backends.
  // For Skylab, see
  // https://chromium.googlesource.com/infra/infra/+/5566668428c6b286702bf440d9dfd0be7bca1d84/go/src/infra/libs/skylab/inventory/device.proto#173
  // For autotest, see
  // https://chromium.googlesource.com/chromiumos/third_party/autotest/+/7436c2b6e6bd32ed1f1bd08cf8e0feb40cfe7b89/server/constants.py#18
  enum ManagedPool {
    MANAGED_POOL_UNSPECIFIED = 0;
    MANAGED_POOL_CQ = 1;
    MANAGED_POOL_BVT = 2;
    MANAGED_POOL_SUITES = 3;
    MANAGED_POOL_CTS = 4;
    MANAGED_POOL_CTS_PERBUILD = 5;
    MANAGED_POOL_CONTINUOUS = 6;
    MANAGED_POOL_ARC_PRESUBMIT = 7;
    MANAGED_POOL_QUOTA = 8;
  }

  oneof pool {
    // Managed pool of devices to run tests in.
    ManagedPool managed_pool = 1;

    // Unmanaged pool of devices to run tests in.
    // Must not be a managed pool.
    string unmanaged_pool = 2;
  }

  // Priority corresponding to a swarming task priority.
  // If specified, it should be in the range [50,255].
  // It will be used for any swarming tasks created by this run.
  //
  // Note that the scheduler behavior with a given priority depends on
  // other factors, such as pool. In particular, if requests are run in
  // a quotascheduler-controlled pool, then this priority will be ignored,
  // as priority will be determined by quota account balances.
  uint32 priority = 3;

  // Quota account for both managed and unamanged pools.
  // It should be used if the request is scheduled on a pool
  // managed by QuotaScheduler. See go/qs-enabled-pools for details.
  // If set for requests on no QuotaScheduler pools,
  // it will be ignored and the request will default to running at
  // the lowest priority.
  string quota_account = 4;
}

// RetryPrfoile defines parameters that affect how failed tests within
// a request are retried.
message RetryProfile {
  // Whether to allow test retries.
  bool allow = 1;

  // Maximum number of retries of tests within this invocation to allow.
  // 0 = unlimited.
  uint32 max = 2;
}

// TimeoutProfile defines parameters related to timeouts.
message TimeoutProfile {
  // Maximum duration for the entire request to be handled.
  google.protobuf.Duration maximum_duration = 1;
}

// MonitoringProfile controls the alerting and monitoring of requests
// associated with the profile throughout the test infrastructure
// stack.
message MonitoringProfile {
  TestPlatformAlertingThresholds test_platform_alerting_thresholds = 1;
}

// TestPlatformAlertingThresholds capture alerting thresholds for test platform.
message TestPlatformAlertingThresholds {
  // TODO: TBD
}