From 174c2473cdad807466dc9ade9a6bfd37966e7295 Mon Sep 17 00:00:00 2001 From: Gianmaria Del Monte Date: Wed, 8 Feb 2023 17:50:14 +0100 Subject: [PATCH] add other tests and bugfixes --- pkg/ocm/share/repository/json/json.go | 29 +++++---- tests/integration/grpc/ocm_share_test.go | 75 ++++++++++++++++++++++++ 2 files changed, 92 insertions(+), 12 deletions(-) diff --git a/pkg/ocm/share/repository/json/json.go b/pkg/ocm/share/repository/json/json.go index 97a064ccc7..0b6862e0e2 100644 --- a/pkg/ocm/share/repository/json/json.go +++ b/pkg/ocm/share/repository/json/json.go @@ -229,7 +229,7 @@ func genID() string { return uuid.New().String() } -func (m *mgr) StoreShare(ctx context.Context, share *ocm.Share) (*ocm.Share, error) { +func (m *mgr) StoreShare(ctx context.Context, ocmshare *ocm.Share) (*ocm.Share, error) { m.Lock() defer m.Unlock() @@ -237,14 +237,22 @@ func (m *mgr) StoreShare(ctx context.Context, share *ocm.Share) (*ocm.Share, err return nil, err } - share.Id = &ocm.ShareId{OpaqueId: genID()} - m.model.Shares[share.Id.OpaqueId] = cloneShare(share) + if _, err := m.getByKey(ctx, &ocm.ShareKey{ + Owner: ocmshare.Owner, + ResourceId: ocmshare.ResourceId, + Grantee: ocmshare.Grantee, + }); err == nil { + return nil, share.ErrShareAlreadyExisting + } + + ocmshare.Id = &ocm.ShareId{OpaqueId: genID()} + m.model.Shares[ocmshare.Id.OpaqueId] = cloneShare(ocmshare) if err := m.save(); err != nil { return nil, errors.Wrap(err, "error saving share") } - return share, nil + return ocmshare, nil } func cloneShare(s *ocm.Share) *ocm.Share { @@ -272,6 +280,9 @@ func cloneReceivedShare(s *ocm.ReceivedShare) *ocm.ReceivedShare { } func (m *mgr) GetShare(ctx context.Context, user *userpb.User, ref *ocm.ShareReference) (*ocm.Share, error) { + m.Lock() + defer m.Unlock() + var ( s *ocm.Share err error @@ -299,13 +310,10 @@ func (m *mgr) GetShare(ctx context.Context, user *userpb.User, ref *ocm.ShareRef return s, nil } - return nil, errtypes.NotFound(ref.String()) + return nil, share.ErrShareNotFound } func (m *mgr) getByID(ctx context.Context, id *ocm.ShareId) (*ocm.Share, error) { - m.Lock() - defer m.Unlock() - if share, ok := m.model.Shares[id.OpaqueId]; ok { return share, nil } @@ -313,16 +321,13 @@ func (m *mgr) getByID(ctx context.Context, id *ocm.ShareId) (*ocm.Share, error) } func (m *mgr) getByKey(ctx context.Context, key *ocm.ShareKey) (*ocm.Share, error) { - m.Lock() - defer m.Unlock() - for _, share := range m.model.Shares { if (utils.UserEqual(key.Owner, share.Owner) || utils.UserEqual(key.Owner, share.Creator)) && utils.ResourceIDEqual(key.ResourceId, share.ResourceId) && utils.GranteeEqual(key.Grantee, share.Grantee) { return share, nil } } - return nil, errtypes.NotFound(key.String()) + return nil, share.ErrShareNotFound } func (m *mgr) DeleteShare(ctx context.Context, user *userpb.User, ref *ocm.ShareReference) error { diff --git a/tests/integration/grpc/ocm_share_test.go b/tests/integration/grpc/ocm_share_test.go index bfb52c95a6..da74e0788a 100644 --- a/tests/integration/grpc/ocm_share_test.go +++ b/tests/integration/grpc/ocm_share_test.go @@ -411,6 +411,81 @@ var _ = Describe("ocm share", func() { }) }) + Context("einstein creates twice the share to marie", func() { + It("fail with already existing error", func() { + fileToShare := &provider.Reference{Path: "/home/double-share"} + Expect(helpers.CreateFolder(ctxEinstein, cernboxgw, fileToShare.Path)).To(Succeed()) + + By("share the file with marie") + + info, err := stat(ctxEinstein, cernboxgw, fileToShare) + Expect(err).ToNot(HaveOccurred()) + + cesnet, err := cernboxgw.GetInfoByDomain(ctxEinstein, &ocmproviderpb.GetInfoByDomainRequest{ + Domain: "cesnet.cz", + }) + Expect(err).ToNot(HaveOccurred()) + Expect(cesnet.Status.Code).To(Equal(rpcv1beta1.Code_CODE_OK)) + + createShareRes, err := cernboxgw.CreateOCMShare(ctxEinstein, &ocmv1beta1.CreateOCMShareRequest{ + ResourceId: info.Id, + Grantee: &provider.Grantee{ + Id: &provider.Grantee_UserId{ + UserId: marie.Id, + }, + }, + AccessMethods: []*ocmv1beta1.AccessMethod{ + share.NewWebDavAccessMethod(conversions.NewEditorRole().CS3ResourcePermissions()), + }, + RecipientMeshProvider: cesnet.ProviderInfo, + }) + Expect(err).ToNot(HaveOccurred()) + Expect(createShareRes.Status.Code).To(Equal(rpcv1beta1.Code_CODE_OK)) + + By("resharing the same file with marie") + + createShareRes2, err := cernboxgw.CreateOCMShare(ctxEinstein, &ocmv1beta1.CreateOCMShareRequest{ + ResourceId: info.Id, + Grantee: &provider.Grantee{ + Id: &provider.Grantee_UserId{ + UserId: marie.Id, + }, + }, + AccessMethods: []*ocmv1beta1.AccessMethod{ + share.NewWebDavAccessMethod(conversions.NewEditorRole().CS3ResourcePermissions()), + }, + RecipientMeshProvider: cesnet.ProviderInfo, + }) + Expect(err).ToNot(HaveOccurred()) + Expect(createShareRes2.Status.Code).To(Equal(rpcv1beta1.Code_CODE_ALREADY_EXISTS)) + }) + }) + + Context("einstein creates a share on a not existing resource", func() { + It("fail with not found error", func() { + cesnet, err := cernboxgw.GetInfoByDomain(ctxEinstein, &ocmproviderpb.GetInfoByDomainRequest{ + Domain: "cesnet.cz", + }) + Expect(err).ToNot(HaveOccurred()) + Expect(cesnet.Status.Code).To(Equal(rpcv1beta1.Code_CODE_OK)) + + createShareRes, err := cernboxgw.CreateOCMShare(ctxEinstein, &ocmv1beta1.CreateOCMShareRequest{ + ResourceId: &provider.ResourceId{StorageId: "123e4567-e89b-12d3-a456-426655440000", OpaqueId: "NON_EXISTING_FILE"}, + Grantee: &provider.Grantee{ + Id: &provider.Grantee_UserId{ + UserId: marie.Id, + }, + }, + AccessMethods: []*ocmv1beta1.AccessMethod{ + share.NewWebDavAccessMethod(conversions.NewEditorRole().CS3ResourcePermissions()), + }, + RecipientMeshProvider: cesnet.ProviderInfo, + }) + Expect(err).ToNot(HaveOccurred()) + Expect(createShareRes.Status.Code).To(Equal(rpcv1beta1.Code_CODE_NOT_FOUND)) + }) + }) + }) })