syntax = "proto3";

package tidb_mgmt_service.v1;

import "google/api/field_behavior.proto";
import "google/protobuf/empty.proto";
import "google/protobuf/timestamp.proto";

service MaintenanceService {
  rpc ListMaintenanceWindows(ListMaintenanceWindowsRequest) returns (ListMaintenanceWindowsResponse) {}

  rpc GetMaintenanceWindow(GetMaintenanceWindowRequest) returns (MaintenanceWindow) {}

  rpc UpdateMaintenanceWindow(UpdateMaintenanceWindowRequest) returns (MaintenanceWindow) {}

  rpc SyncMaintenanceWindow(SyncMaintenanceWindowRequest) returns (google.protobuf.Empty) {}

  rpc ListMaintenanceTasks(ListMaintenanceTasksRequest) returns (ListMaintenanceTasksResponse) {}

  rpc QueryMaintenanceTasks(QueryMaintenanceTasksRequest) returns (QueryMaintenanceTasksResponse) {}

  rpc CountMaintenanceTasks(CountMaintenanceTasksRequest) returns (CountMaintenanceTasksResponse) {}

  rpc GetMaintenanceTask(GetMaintenanceTaskRequest) returns (MaintenanceTask) {}

  rpc CreateMaintenanceTask(CreateMaintenanceTaskRequest) returns (MaintenanceTask) {}

  rpc UpdateMaintenanceTask(UpdateMaintenanceTaskRequest) returns (MaintenanceTask) {}

  rpc ListMaintenanceTaskExecutions(ListMaintenanceTaskExecutionsRequest) returns (ListMaintenanceTaskExecutionsResponse) {}

  rpc UpdateMaintenanceTaskExecution(UpdateMaintenanceTaskExecutionRequest) returns (MaintenanceTaskExecution) {}

  rpc QueryMaintenanceTaskExecutions(QueryMaintenanceTaskExecutionsRequest) returns (QueryMaintenanceTaskExecutionsResponse) {}
}

message MaintenanceWindow {
  string name = 1 [
    (google.api.field_behavior) = IDENTIFIER,
    (google.api.field_behavior) = OUTPUT_ONLY
  ];

  // Format: project-{project_id}
  string maintenance_window_id = 2 [(google.api.field_behavior) = OUTPUT_ONLY];

  uint64 project_id = 3 [(google.api.field_behavior) = REQUIRED];

  // 0-6, 0 is Sunday.
  int32 week_day = 4 [(google.api.field_behavior) = REQUIRED];

  // 0-23 in UTC.
  int32 day_hour = 5 [(google.api.field_behavior) = REQUIRED];

  // 0-59 in UTC.
  int32 hour_minute = 6 [(google.api.field_behavior) = REQUIRED];

  google.protobuf.Timestamp next_maintenance_date = 7 [(google.api.field_behavior) = OUTPUT_ONLY];
}

message ListMaintenanceWindowsRequest {
  uint64 project_id = 1;
}

message ListMaintenanceWindowsResponse {
  repeated MaintenanceWindow maintenance_windows = 1;
}

message GetMaintenanceWindowRequest {
  // Format: project-{project_id}
  string maintenance_window_id = 1 [(google.api.field_behavior) = REQUIRED];
}

message UpdateMaintenanceWindowRequest {
  MaintenanceWindow maintenance_window = 1 [(google.api.field_behavior) = REQUIRED];
}

message SyncMaintenanceWindowRequest {}

message MaintenanceTask {
  // Format: maintenanceTasks/{maintenance_task_id}
  string name = 1 [(google.api.field_behavior) = IDENTIFIER];

  uint64 maintenance_task_id = 2 [(google.api.field_behavior) = OUTPUT_ONLY];

  uint64 project_id = 3 [(google.api.field_behavior) = REQUIRED];

  repeated uint64 cluster_ids = 4 [(google.api.field_behavior) = REQUIRED];

  string description = 5 [(google.api.field_behavior) = OPTIONAL];

  State state = 6 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Timestamp when the task was created.
  google.protobuf.Timestamp create_time = 7 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Timestamp when the task run.
  google.protobuf.Timestamp scheduled_apply_time = 8 [(google.api.field_behavior) = OPTIONAL];

  // Timestamp when the task will be expired.
  google.protobuf.Timestamp deadline = 9 [(google.api.field_behavior) = REQUIRED];

  enum State {
    STATE_UNSPECIFIED = 0;

    PENDING = 1;

    RUNNING = 2;

    DONE = 3;
  }
}

message ListMaintenanceTasksRequest {
  uint64 project_id = 1 [(google.api.field_behavior) = REQUIRED];
}

message ListMaintenanceTasksResponse {
  repeated MaintenanceTask maintenance_tasks = 1;
}

message MaintenanceTaskFilter {
  repeated uint64 project_ids = 1;
  repeated MaintenanceTask.State states = 2;
  repeated uint64 maintenance_task_ids = 3;
}

message QueryMaintenanceTasksRequest {
  MaintenanceTaskFilter filter = 1;
}

message QueryMaintenanceTasksResponse {
  repeated MaintenanceTask maintenance_tasks = 1;
}

message CountMaintenanceTasksRequest {
  MaintenanceTaskFilter filter = 1;
}

message CountMaintenanceTasksResponse {
  uint64 count = 1;
}

message GetMaintenanceTaskRequest {
  uint64 maintenance_task_id = 1 [(google.api.field_behavior) = REQUIRED];
}

message CreateMaintenanceTaskRequest {
  MaintenanceTask maintenance_task = 1;
}

message UpdateMaintenanceTaskRequest {
  MaintenanceTask maintenance_task = 2 [(google.api.field_behavior) = REQUIRED];
}

message MaintenanceTaskExecution {
  uint64 maintenance_task_execution_id = 1 [(google.api.field_behavior) = OUTPUT_ONLY];
  uint64 maintenance_task_id = 2 [(google.api.field_behavior) = OUTPUT_ONLY];
  uint64 cluster_id = 3 [(google.api.field_behavior) = OUTPUT_ONLY];
  State state = 4 [(google.api.field_behavior) = OUTPUT_ONLY];
  CancellationReason cancellation_reason = 5 [(google.api.field_behavior) = OUTPUT_ONLY];

  enum State {
    STATE_UNSPECIFIED = 0;
    PENDING = 1;
    RUNNING = 2;
    DONE = 3;
    CANCELED = 4;
  }

  enum CancellationReason {
    REASON_UNSPECIFIED = 0;
    OPS_CANCELED = 1;
    CLUSTER_DELETED = 2;
  }
}

message ListMaintenanceTaskExecutionsRequest {
  uint64 maintenance_task_id = 1 [(google.api.field_behavior) = REQUIRED];
}

message ListMaintenanceTaskExecutionsResponse {
  repeated MaintenanceTaskExecution maintenance_task_executions = 1;
}

message UpdateMaintenanceTaskExecutionRequest {
  MaintenanceTaskExecution maintenance_task_execution = 1 [(google.api.field_behavior) = REQUIRED];
}

message QueryMaintenanceTaskExecutionsRequest {
  Filter filter = 1;
  message Filter {
    repeated uint64 cluster_ids = 1;
    repeated MaintenanceTaskExecution.State states = 2;
    repeated uint64 maintenance_task_ids = 3;
    repeated uint64 maintenance_task_execution_ids = 4;
  }
}

message QueryMaintenanceTaskExecutionsResponse {
  repeated MaintenanceTaskExecution maintenance_task_executions = 1;
}
