blob: 1df484972a2e910641cba200595fbf2c5a2ec58b [file] [log] [blame]
edition = "2023";
package safepower_agent_proto;
import "google/protobuf/timestamp.proto";
option features.field_presence = IMPLICIT;
service SafepowerLocalAgent {
// Get a list of all supported actions
rpc GetSupportedActions(GetSupportedActionsRequest)
returns (GetSupportedActionsResponse) {}
// Execute an action when a condition is met
rpc StartAction(StartActionRequest) returns (StartActionResponse) {}
// Monitor reaction
rpc MonitorAction(MonitorActionRequest) returns (stream ActionStateLog) {}
// Monitor state.
rpc MonitorState(MonitorStateRequest) returns (stream SystemState) {}
// Update the global system state. This is used by the safepower service to
// update the state of the system as a whole, so that nodes that don't have a
// complete picture can synhronize with other nodes.
rpc SystemStateUpdate(SystemState) returns (SystemStateUpdateResponse) {}
}
message GetSupportedActionsRequest {}
message GetSupportedActionsResponse {
// This lists all supported actions.
repeated Action actions = 1; // may be empty
}
enum ActionTargetType {
ACTION_TARGET_TYPE_UNSPECIFIED = 0;
ACTION_TARGET_TYPE_SYSTEM = 1;
}
// Identifies a component of the system whose state is monitored or acted upon.
message SystemComponent {
string node_entity_tag = 1 [features.field_presence = EXPLICIT];
// Component name. This is optional and may be empty.
string name = 2 [features.field_presence = EXPLICIT];
// The type of target. `name` identifies the name of the target if it is
// required.
ActionTargetType target_type = 3 [features.field_presence = EXPLICIT];
}
enum ActionType {
ACTION_TYPE_UNSPECIFIED = 0;
ACTION_TYPE_CYCLE = 1;
ACTION_TYPE_REBOOT = 2;
ACTION_TYPE_OFF = 3;
ACTION_TYPE_ON = 4;
ACTION_TYPE_HALT = 5;
}
enum ActionSeverity {
ACTION_SEVERITY_UNSPECIFIED = 0;
ACTION_SEVERITY_FORCE = 1;
ACTION_SEVERITY_GRACEFUL = 2;
}
// LINT.IfChange(ActionFields)
message Action {
ActionType action_type = 1 [features.field_presence = EXPLICIT]; // Required
ActionSeverity action_severity = 2 [features.field_presence = EXPLICIT];
// This may or may not correspond to an entry in SystemStatus reported by
// this node. For example, it is possible that the actuating node is not the
// same as the one that can get this status reliably.
SystemComponent target_component = 3; // Required
}
// LINT.ThenChange(//depot/action_hash.h:ActionFields)
message StartActionRequest {
// This is an informational string that can be used to identidfy the caller
string caller_cookie = 1 [features.field_presence = EXPLICIT]; // required
// Wait for this condition before running the action. If the matching
// condition(s) specify that they should abort, the action will not be run. If
// unspecified, runs the action immediately.
Condition precondition = 2;
Action action = 3; // required
// Wait until this condition is met. If matching conditions(s) specify that
// they should abort, the result will be an error.
Condition validation = 4;
}
message StartActionResponse {
string response_id = 1 [features.field_presence = EXPLICIT];
}
message Condition {
oneof condition_type {
AnyOfCondition any_of = 1;
AllOfCondition all_of = 2;
StateMatchedCondition state_condition = 3;
TimeoutCondition timeout = 4;
}
}
// Condition that matches when any of nested conditions match
message AnyOfCondition {
repeated Condition conditions = 1;
}
// Condition that matches when all of nested conditions match
message AllOfCondition {
repeated Condition conditions = 1;
}
// Condition that matches when the system state changes to match some expected
// state(s)
message StateMatchedCondition {
// This matches the keys in SystemState.node_state
string node_entity_tag = 1 [features.field_presence = EXPLICIT];
// Determine how to compare ComponentStates. Not all types may be applicable
// to all state types.
ComparisonType comparison_type = 2 [features.field_presence = EXPLICIT];
// The current state is compared to this state.
NodeState node_state = 3;
// If true, the action will be aborted on match.
bool abort = 4 [features.field_presence = EXPLICIT];
}
enum ComparisonType {
COMPARISON_TYPE_UNSPECIFIED = 0;
COMPARISON_TYPE_EQ = 1;
COMPARISON_TYPE_NE = 2;
COMPARISON_TYPE_GT = 3;
COMPARISON_TYPE_GE = 4;
COMPARISON_TYPE_LT = 5;
COMPARISON_TYPE_LE = 6;
}
// Condition that matches at/after some time
message TimeoutCondition {
oneof time {
uint64 timeout_ms = 1;
google.protobuf.Timestamp deadline = 2;
}
// If true, the action will be aborted on match.
bool abort = 3 [features.field_presence = EXPLICIT];
}
message MonitorActionRequest {
// This should be an ID returned in StartActionResponse
string response_id = 1 [features.field_presence = EXPLICIT];
}
message ActionStateLog {
// Included in all updates. This is a timestamp that is set at service start.
// This is mostly useful to detect service restarts.
uint64 epoch_ms = 1 [features.field_presence = EXPLICIT]; // required
repeated ActionStateChange history = 2;
ActionState current_state = 3
[features.field_presence = EXPLICIT]; // required
}
enum ActionState {
ACTION_STATE_UNDEFINED = 0;
ACTION_STATE_INIT = 1;
ACTION_STATE_CHECKING_PRECONDITION = 2;
ACTION_STATE_RUNNING_ACTION = 3;
ACTION_STATE_VALIDATING_FINAL_STATE = 4;
ACTION_STATE_ERROR = 5;
ACTION_STATE_SUCCESS = 6;
}
message ActionStateChange {
ActionState previous_state = 1
[features.field_presence =
EXPLICIT]; // Required except for transition to Init
// Time when the state changed to the next state
google.protobuf.Timestamp changed_at = 2;
// Status of the operation that caused the state change
Status status = 3;
// Optional conditions that matched resulting in the state change. This is
// only present if the state change was because of a condition match.
repeated Condition matching_conditions = 4;
}
message Status {
int64 code = 1 [features.field_presence = EXPLICIT];
string message = 2 [features.field_presence = EXPLICIT];
}
message MonitorStateRequest {}
message SystemStateUpdateResponse {}
// LINT.IfChange(SystemState)
message SystemState {
// Included in all updates. This is a timestamp that is set at service start.
// This is mostly useful to detect service restarts.
uint64 epoch_ms = 1 [features.field_presence = EXPLICIT]; // required
// The contents are platform and node specific. Keys are node entity tags and
// values are state information for the corresponding node. This includes all
// nodes for which this node can obtain status. For example, an arena
// controller may have power state information for other nodes in the arena.
map<string, NodeState> node_state = 2;
}
message NodeState {
map<string, DaemonState> daemon_state = 1;
BootState boot_state = 2;
PowerState power_state = 3;
}
message DaemonState {
uint32 restart_counter = 1 [features.field_presence = EXPLICIT];
bool healthy = 2 [features.field_presence = EXPLICIT];
}
enum BootStateSpecifier {
BOOT_STATE_UNSPECIFIED = 0;
BOOT_STATE_NOT_BOOTED = 1;
BOOT_STATE_BOOTING = 2;
BOOT_STATE_BOOTED = 3;
}
message BootState {
uint32 boot_counter = 1 [features.field_presence = EXPLICIT];
uint64 uptime_ms = 2 [features.field_presence = EXPLICIT];
BootStateSpecifier state = 3 [features.field_presence = EXPLICIT];
}
message ConnectionState {
uint32 reconnect_counter = 1 [features.field_presence = EXPLICIT];
}
// Based on Redfish PowerState
enum PowerStateSpecifier {
POWER_STATE_UNSPECIFIED = 0;
POWER_STATE_OFF = 1;
POWER_STATE_ON = 2;
POWER_STATE_PAUSED = 3;
POWER_STATE_POWERING_ON = 4;
POWER_STATE_POWERING_OFF = 5;
}
message PowerState {
PowerStateSpecifier state = 1 [features.field_presence = EXPLICIT];
uint32 power_cycle_counter = 2 [features.field_presence = EXPLICIT];
}
// LINT.ThenChange(//depot/state_fields.h:SystemStateFields)