add additionalItems to restore item actions (#1304)

* add additionalItems to restore item actions

Signed-off-by: Steve Kriss <krisss@vmware.com>
Co-authored-by: Andy Goldstein <goldsteina@vmware.com>
This commit is contained in:
Steve Kriss
2019-03-28 13:21:56 -06:00
committed by KubeKween
parent 477e42286c
commit 9b635c0e14
17 changed files with 950 additions and 389 deletions

View File

@@ -23,6 +23,7 @@ import (
"golang.org/x/net/context"
"google.golang.org/grpc"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime/schema"
proto "github.com/heptio/velero/pkg/plugin/generated"
"github.com/heptio/velero/pkg/plugin/velero"
@@ -82,7 +83,7 @@ func (c *RestoreItemActionGRPCClient) Execute(input *velero.RestoreItemActionExe
return nil, errors.WithStack(err)
}
req := &proto.RestoreExecuteRequest{
req := &proto.RestoreItemActionExecuteRequest{
Plugin: c.plugin,
Item: itemJSON,
ItemFromBackup: itemFromBackupJSON,
@@ -104,8 +105,23 @@ func (c *RestoreItemActionGRPCClient) Execute(input *velero.RestoreItemActionExe
warning = errors.New(res.Warning)
}
var additionalItems []velero.ResourceIdentifier
for _, itm := range res.AdditionalItems {
newItem := velero.ResourceIdentifier{
GroupResource: schema.GroupResource{
Group: itm.Group,
Resource: itm.Resource,
},
Namespace: itm.Namespace,
Name: itm.Name,
}
additionalItems = append(additionalItems, newItem)
}
return &velero.RestoreItemActionExecuteOutput{
UpdatedItem: &updatedItem,
Warning: warning,
UpdatedItem: &updatedItem,
Warning: warning,
AdditionalItems: additionalItems,
}, nil
}

View File

@@ -74,7 +74,7 @@ func (s *RestoreItemActionGRPCServer) AppliesTo(ctx context.Context, req *proto.
}, nil
}
func (s *RestoreItemActionGRPCServer) Execute(ctx context.Context, req *proto.RestoreExecuteRequest) (response *proto.RestoreExecuteResponse, err error) {
func (s *RestoreItemActionGRPCServer) Execute(ctx context.Context, req *proto.RestoreItemActionExecuteRequest) (response *proto.RestoreItemActionExecuteResponse, err error) {
defer func() {
if recoveredErr := handlePanic(recover()); recoveredErr != nil {
err = recoveredErr
@@ -113,9 +113,16 @@ func (s *RestoreItemActionGRPCServer) Execute(ctx context.Context, req *proto.Re
return nil, newGRPCError(err)
}
updatedItem, err := json.Marshal(executeOutput.UpdatedItem)
if err != nil {
return nil, newGRPCError(errors.WithStack(err))
// If the plugin implementation returned a nil updateItem (meaning no modifications), reset updatedItem to the
// original item.
var updatedItemJSON []byte
if executeOutput.UpdatedItem == nil {
updatedItemJSON = req.Item
} else {
updatedItemJSON, err = json.Marshal(executeOutput.UpdatedItem.UnstructuredContent())
if err != nil {
return nil, newGRPCError(errors.WithStack(err))
}
}
var warnMessage string
@@ -123,8 +130,23 @@ func (s *RestoreItemActionGRPCServer) Execute(ctx context.Context, req *proto.Re
warnMessage = executeOutput.Warning.Error()
}
return &proto.RestoreExecuteResponse{
Item: updatedItem,
res := &proto.RestoreItemActionExecuteResponse{
Item: updatedItemJSON,
Warning: warnMessage,
}, nil
}
for _, item := range executeOutput.AdditionalItems {
res.AdditionalItems = append(res.AdditionalItems, restoreResourceIdentifierToProto(item))
}
return res, nil
}
func restoreResourceIdentifierToProto(id velero.ResourceIdentifier) *proto.ResourceIdentifier {
return &proto.ResourceIdentifier{
Group: id.Group,
Resource: id.Resource,
Namespace: id.Namespace,
Name: id.Name,
}
}