syntax = "proto3";
package cloud.bmaas.server.api;
option go_package = "source.monogon.dev/cloud/bmaas/server/api";

// AgentCallback runs on the BMDB Server and exposes a gRPC interface to agents
// running on machines. These APIs are served over TLS using component-style
// server certificates, but clients are authenticated using ephemeral
// certificates proving ownership of an agent keypair.
service AgentCallback {
  // Heartbeat is called by agents repeatedly to upload a hardware report, signal
  // liveness and retrieve actions to be prformed on a host.
  //
  // This isn't a streaming RPC as the current server implementation actually
  // isn't reactive, so it would have to do its own inner polling to create
  // a stream of updates. To keep things simple, we instead let the agent decide
  // on the cadence of updates it wants to keep up with.
  rpc Heartbeat(AgentHeartbeatRequest) returns (AgentHeartbeatResponse);
}

message AgentHardwareReport {
  // TODO(lorenz): implement
}

// OSInstallationReport is submitted from the agent to the BMDB server after
// successful OS installation.
message OSInstallationReport {
  // generation must be set to the same value as 'generation' in the
  // OSInstallation request which triggered the OS installation
  int64 generation = 1;
}

message AgentHeartbeatRequest {
  // MachineID that this agent represents. Technically not necessary since
  // keypairs between agents should be unique, but this provides an extra layer
  // of protection against programming bugs.
  string machine_id = 1;
  // Optional hardware report to be upserted for this machine. An agent should
  // submit one at least once after it's started, as early as it can.
  AgentHardwareReport hardware_report = 2;
  // Optional installation report sent to be upserted to this machine. An agent
  // should submit one after it successfully installed an operating system for
  // a given OSInstallationRequest.
  OSInstallationReport installation_report = 3;
}

// OSInstallationRequest is provided to the agent by the BMDB server, from
// a responding BMDB tag, when an OS installation request is pending.
message OSInstallationRequest {
  // generation is the 'version' of the OS installation request, and will always
  // be incremented within the BMDB when a new OS installation request is
  // submitted. The agent must pipe this through to the OSInstallationReport to
  // let the rest of the system know which OS installation request it actually
  // fulfilled.
  int64 generation = 1;
  // TODO(lorenz): implement
}

message AgentHeartbeatResponse {
  // If set, the control plane is requesting the installation of an operating
  // system.
  OSInstallationRequest installation_request = 1;
}