From 53efa18e140b8b62c2f5df9b03f6d963852491b7 Mon Sep 17 00:00:00 2001 From: Leonard Lyubich Date: Wed, 21 Oct 2020 14:46:40 +0300 Subject: [PATCH] [#109] object/put: Implement remote object sender Define RemoteSender structure with PutObject method that puts object to a remote node locally. Signed-off-by: Leonard Lyubich --- pkg/services/object/put/remote.go | 55 +++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/pkg/services/object/put/remote.go b/pkg/services/object/put/remote.go index 21e82e252..57f9d51a7 100644 --- a/pkg/services/object/put/remote.go +++ b/pkg/services/object/put/remote.go @@ -28,6 +28,19 @@ type remoteTarget struct { obj *object.Object } +// RemoteSender represents utility for +// sending an object to a remote host. +type RemoteSender struct { + keyStorage *util.KeyStorage +} + +// RemotePutPrm groups remote put operation parameters. +type RemotePutPrm struct { + node *network.Address + + obj *object.Object +} + func (t *remoteTarget) WriteHeader(obj *object.RawObject) error { t.obj = obj.Object() @@ -66,3 +79,45 @@ func (t *remoteTarget) Close() (*transformer.AccessIdentifiers, error) { return new(transformer.AccessIdentifiers). WithSelfID(id), nil } + +// NewRemoteSender creates, initializes and returns new RemoteSender instance. +func NewRemoteSender(keyStorage *util.KeyStorage) *RemoteSender { + return &RemoteSender{ + keyStorage: keyStorage, + } +} + +// WithNodeAddress sets network address of the remote node. +func (p *RemotePutPrm) WithNodeAddress(v *network.Address) *RemotePutPrm { + if p != nil { + p.node = v + } + + return p +} + +// WithObject sets transferred object. +func (p *RemotePutPrm) WithObject(v *object.Object) *RemotePutPrm { + if p != nil { + p.obj = v + } + + return p +} + +// PutObject sends object to remote node. +func (s *RemoteSender) PutObject(ctx context.Context, p *RemotePutPrm) error { + t := &remoteTarget{ + ctx: ctx, + keyStorage: s.keyStorage, + addr: p.node, + } + + if err := t.WriteHeader(object.NewRawFromObject(p.obj)); err != nil { + return errors.Wrapf(err, "(%T) could not send object header", s) + } else if _, err := t.Close(); err != nil { + return errors.Wrapf(err, "(%T) could not send object", s) + } + + return nil +}