| // Copyright 2024 Google LLC |
| |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| |
| // https://www.apache.org/licenses/LICENSE-2.0 |
| |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| syntax = "proto3"; |
| |
| package plugin_comm; |
| |
| import "google/protobuf/duration.proto"; |
| import "google/protobuf/struct.proto"; |
| |
| option go_package = "/plugin_comm"; |
| |
| // GuestAgentPlugin service allows Guest Agent to communicate with plugins |
| // and manage their lifecycle. Each Guest Agent plugin must implement this |
| // gRPC interface. |
| service GuestAgentPlugin { |
| // Start command - request to start the plugin. |
| rpc Start(StartRequest) returns (StartResponse) {} |
| // Stop command - request to stop and exit the plugin process. |
| rpc Stop(StopRequest) returns (StopResponse) {} |
| // Status command - request to get current plugin status. |
| rpc GetStatus(GetStatusRequest) returns (Status) {} |
| // Apply command - request to apply config or some work received for plugin. |
| rpc Apply(ApplyRequest) returns (ApplyResponse) {} |
| } |
| |
| // Request sent to plugins to start. |
| message StartRequest { |
| // Config is Guest Agent managed config that is passed to the every plugin on |
| // startup. |
| message Config { |
| // Path to the state directory where plugins are allowed to store any state |
| // that they want to persist across revisions. |
| string state_directory_path = 1; |
| } |
| // Any config like the state directory path can be passed here on startup. |
| Config config = 1; |
| // Data is any additional Guest Agent agnostic payload handed off to the |
| // plugin on every start request. Payload is optional and defined by the |
| // service and plugin itself. |
| oneof service_config { |
| // String configuration. Any string payload that the plugin understands. |
| string string_config = 2; |
| // Struct configuration. Usually used for reading file based configuration |
| // like JSON or yaml. |
| google.protobuf.Struct struct_config = 3; |
| } |
| } |
| |
| // Guest Agent does not expect any response from plugins for start request, it |
| // will poll for status with health check requests later. In case of any error |
| // plugins should throw RPC error. |
| // https://pkg.go.dev/google.golang.org/grpc/status#ErrorProto |
| message StartResponse {} |
| |
| // Guest Agent agnostic request from services forwarded to the plugins. |
| message ApplyRequest { |
| // Field 1 was the deprecated 'data' field of type Any. It is reserved to |
| // prevent reuse and avoid accidental backward compatibility issues. |
| reserved 1; |
| // Service specific configuration that is passed to the plugin. This is same |
| // as the service_config in the StartRequest. However, it allows updating the |
| // config without restarting the plugin. If the plugin does not support |
| // updating the config, it should return an unimplemented error in which case |
| // the plugin manager will restart the plugin with the new config. |
| oneof service_config { |
| // String configuration. Any string payload that the plugin understands. |
| string string_config = 2; |
| // Struct configuration. Usually used for reading file based configuration |
| // like JSON or yaml. |
| google.protobuf.Struct struct_config = 3; |
| } |
| } |
| |
| // Response from plugins for apply request. |
| message ApplyResponse {} |
| |
| // Guest Agent sends requests to get current status. |
| message GetStatusRequest { |
| // This data payload is optionally supplied to the plugin. It's empty for |
| // regular periodic health checks and contains context on what request is for |
| // (like task ID) in specialized requests. |
| // General periodic health check is the request that agent makes to verify |
| // plugins are healthy and running. Plugins can report any ongoing |
| // status which will be sent back to the service. |
| // Specialized status request is something that plugin owners can |
| // define on each plugin similar to apply request. This can be used to |
| // request specific status. For e.g. if Apply() request was made to make run |
| // some task, this type can be used to check status for it. |
| optional string data = 2; |
| } |
| |
| // Response from plugins for status request. |
| message Status { |
| // Non-zero code would mean plugin is unhealthy for health check. |
| // For specialized request contract can be defined between service and plugin |
| // itself, Guest Agent will make no interpretation and simply report as is. |
| int32 code = 1; |
| // Human readable summary on current status describing the status code. |
| // Can include one or more error logs or details describing the issue. |
| repeated string results = 2; |
| } |
| |
| // Request sent to plugins to stop and exit the process. |
| // Plugins processes are killed immediately after this request returns. |
| message StopRequest { |
| // Cleanup is set to true to notify plugins to remove any state stored on |
| // disk. Stop request can be sent as part of plugin restart which does not |
| // require cleanup whereas plugin remove does require. |
| bool cleanup = 1; |
| // Guest Agent will wait for this deadline, if the plugin gracefully |
| // exits, guest agent will do nothing. If the plugin process is still |
| // running, then it is killed. |
| google.protobuf.Duration deadline = 2; |
| } |
| |
| // Response from plugins for stop request. |
| message StopResponse {} |