From 73a5ee41fa3e6ca1402ed1e0e2f851781113f8fd Mon Sep 17 00:00:00 2001 From: Scott Seago Date: Thu, 22 Sep 2022 12:25:02 -0400 Subject: [PATCH] BackupItemAction v2 design This includes necessary changes to support async item action monitoring. Signed-off-by: Scott Seago --- design/biav2-design.md | 89 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 design/biav2-design.md diff --git a/design/biav2-design.md b/design/biav2-design.md new file mode 100644 index 0000000000..4294e53ccc --- /dev/null +++ b/design/biav2-design.md @@ -0,0 +1,89 @@ +# Design for BackupItemAction v2 API + +## Abstract +This design includes the changes to the BackupItemAction (BIA) api design as required by the [Item Action Progress Monitoring](general-progress-monitoring.md) feature. +The BIA v2 interface will have two new methods, and the Execute() return signature will be modified. +If there are any additional BIA API changes that are needed in the same Velero release cycle as this change, those can be added here as well. + +## Background +This API change is needed to facilitate long-running plugin actions that may not be complete when the Execute() method returns. +It is an optional feature, so plugins which don't need this feature can simply return an empty operation ID and the new methods can be no-ops. +This will allow long-running plugin actions to continue in the background while Velero moves on to the next plugin, the next item, etc. + +## Goals +- Allow for BIA Execute() to optionally initiate a long-running operation and report on operation status. + +## Non Goals +- Allowing velero control over when the long-running operation begins. + + +## High-Level Design +As per the [Plugin Versioning](plugin-versioning.md) design, a new BIAv2 plugin `.proto` file will be created to define the GRPC interface. +v2 go files will also be created in `plugin/clientmgmt/backupitemaction` and `plugin/framework/backupitemaction`, and a new PluginKind will be created. +The velero Backup process will be modified to reference v2 plugins instead of v1 plugins. +An adapter will be created so that any existing BIA v1 plugin can be executed as a v2 plugin when executing a backup. + +## Detailed Design + +### proto changes (compiled into golang by protoc) + +The v2 BackupItemAction.proto will be like the current v1 version with the following changes: +ExecuteResponse gets a new field: +``` +message ExecuteResponse { + bytes item = 1; + repeated generated.ResourceIdentifier additionalItems = 2; + string operationID = 3; +} +``` +The BackupItemAction service gets two new rpc methods: +``` +service BackupItemAction { + rpc AppliesTo(BackupItemActionAppliesToRequest) returns (BackupItemActionAppliesToResponse); + rpc Execute(ExecuteRequest) returns (ExecuteResponse); + rpc Progress(BackupItemActionProgressRequest) returns (BackupItemActionProgressResponse); + rpc Cancel(BackupItemActionCancelRequest) returns (google.protobuf.Empty); +} +``` +To support these new rpc methods, we define new request/response message types: +``` +message BackupItemActionProgressRequest { + string plugin = 1; + string operationID = 2; + bytes backup = 3; +} + +message BackupItemActionProgressResponse { + generated.OperationProgress progress = 1; +} + +message BackupItemActionCancelRequest { + string plugin = 1; + string operationID = 2; + bytes backup = 3; +} + +``` +One new shared message type will be added, as this will also be needed for v2 RestoreItemAction and VolmeSnapshotter: +``` +message OperationProgress { + bool completed = 1; + string err = 2; + int64 completed = 3; + int64 total = 4; + string operationUnits = 5; + string description = 6; + google.protobuf.Timestamp started = 7; + google.protobuf.Timestamp updated = 8; +} +``` + +A new PluginKind, `BackupItemActionV2`, will be created, and the backup process will be modified to use this plugin kind. +See [Plugin Versioning](plugin-versioning.md) for more details on implementation plans, including v1 adapters, etc. + + +## Compatibility +The included v1 adapter will allow any existing BackupItemAction plugin to work as expected, with an empty operation ID returned from Execute() and no-op Progress() and Cancel() methods. + +## Implementation +This will be implemented during the Velero 1.11 development cycle.