// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
// or more contributor license agreements. Licensed under the Elastic License;
// you may not use this file except in compliance with the Elastic License.

syntax = "proto3";

package proto;

option cc_enable_arenas = true;
option go_package = "pkg/agent/control/proto;proto";

// Status codes for the current state.
enum Status {
  STARTING = 0;
  CONFIGURING = 1;
  HEALTHY = 2;
  DEGRADED = 3;
  FAILED = 4;
  STOPPING = 5;
  UPGRADING = 6;
  ROLLBACK = 7;
}

// Action status codes for restart and upgrade response.
enum ActionStatus {
  // Action was successful.
  SUCCESS = 0;
  // Action failed.
  FAILURE = 1;
}

// Empty message.
message Empty {
}

// Version response message.
message VersionResponse {
  // Current running version.
  string version = 1;
  // Current running commit.
  string commit = 2;
  // Current running build time.
  string buildTime = 3;
  // Current running version is a snapshot.
  bool snapshot = 4;
}

message RestartResponse {
  // Response status.
  ActionStatus status = 1;
  // Error message when it fails to trigger restart.
  string error = 2;
}

// Upgrade request message.
message UpgradeRequest {
  // (Optional) Version to upgrade to.
  //
  // If not provided Elastic Agent will auto discover the latest version in the same major
  // to upgrade to. If wanting to upgrade to a new major that major must be present in the
  // this version field.
  string version = 1;

  // (Optional) Use a different source URI then configured.
  //
  // If provided the upgrade process will use the provided sourceURI instead of the configured
  // sourceURI in the configuration.
  string sourceURI = 2;
}

// A upgrade response message.
message UpgradeResponse {
  // Response status.
  ActionStatus status = 1;

  // Version that is being upgraded to.
  string version = 2;

  // Error message when it fails to trigger upgrade.
  string error = 3;
}

// Current status of the application in Elastic Agent.
message ApplicationStatus {
  // Unique application ID.
  string id = 1;
  // Application name.
  string name = 2;
  // Current status.
  Status status = 3;
  // Current status message.
  string message = 4;
  // Current status payload.
  string payload = 5;
}

// Status is the current status of Elastic Agent.
message StatusResponse {
  // Overall status of Elastic Agent.
  Status status = 1;
  // Overall status message of Elastic Agent.
  string message = 2;
  // Status of each application in Elastic Agent.
  repeated ApplicationStatus applications = 3;
}

service ElasticAgentControl {
  // Fetches the currently running version of the Elastic Agent.
  rpc Version(Empty) returns (VersionResponse);

  // Fetches the currently status of the Elastic Agent.
  rpc Status(Empty) returns (StatusResponse);

  // Restart restarts the current running Elastic Agent.
  rpc Restart(Empty) returns (RestartResponse);

  // Upgrade starts the upgrade process of Elastic Agent.
  rpc Upgrade(UpgradeRequest) returns (UpgradeResponse);
}
