// 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;
  
  // (Optional) Overrides predefined behavior for agent package verification.
  //
  // If provided Elastic Agent package is not checked for signature during upgrade.
  bool skipVerify = 3;

  // (Optional) Overrides predefined behavior for agent package verification.
  //
  // If provided Elastic Agent package is checked against these pgp keys as well.
  repeated string pgpBytes = 4;
}

// 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;
}

// Current metadata for a running process.
message ProcMeta {
  string process = 1;
  string name = 2;
  string hostname = 3;
  string id = 4;
  string ephemeral_id = 5;
  string version = 6;
  string build_commit = 7;
  string build_time = 8;
  string username = 9;
  string user_id = 10;
  string user_gid = 11;
  string architecture = 12;
  string route_key = 13;
  bool elastic_licensed = 14;
  string error = 15;
}

// 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;
}

// ProcMetaResponse is the current running version infomation for all processes.
message ProcMetaResponse {
  repeated ProcMeta procs = 1;
}

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);

  // Gather all running process metadata.
  rpc ProcMeta(Empty) returns (ProcMetaResponse);
}
