Skip to content

Commit 943603e

Browse files
committed
refactor(api): replace PublicKeyGet with PublicKeyResolve pattern
1 parent 9910dc0 commit 943603e

File tree

6 files changed

+162
-79
lines changed

6 files changed

+162
-79
lines changed

api/services/sshkeys.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ func (s *service) GetPublicKey(ctx context.Context, fingerprint, tenant string)
8080
return nil, NewErrNamespaceNotFound(tenant, err)
8181
}
8282

83-
return s.store.PublicKeyGet(ctx, fingerprint, tenant)
83+
return s.store.PublicKeyResolve(ctx, store.PublicKeyFingerprintResolver, fingerprint, s.store.Options().InNamespace(tenant))
8484
}
8585

8686
func (s *service) CreatePublicKey(ctx context.Context, req requests.PublicKeyCreate, tenant string) (*responses.PublicKeyCreate, error) {
@@ -117,7 +117,7 @@ func (s *service) CreatePublicKey(ctx context.Context, req requests.PublicKeyCre
117117

118118
req.Fingerprint = ssh.FingerprintLegacyMD5(pubKey)
119119

120-
returnedKey, err := s.store.PublicKeyGet(ctx, req.Fingerprint, tenant)
120+
returnedKey, err := s.store.PublicKeyResolve(ctx, store.PublicKeyFingerprintResolver, req.Fingerprint, s.store.Options().InNamespace(tenant))
121121
if err != nil && err != store.ErrNoDocuments {
122122
return nil, NewErrPublicKeyNotFound(req.Fingerprint, err)
123123
}
@@ -164,7 +164,7 @@ func (s *service) ListPublicKeys(ctx context.Context, req *requests.ListPublicKe
164164
}
165165

166166
func (s *service) UpdatePublicKey(ctx context.Context, fingerprint, tenant string, key requests.PublicKeyUpdate) (*models.PublicKey, error) {
167-
publicKey, err := s.store.PublicKeyGet(ctx, fingerprint, tenant)
167+
publicKey, err := s.store.PublicKeyResolve(ctx, store.PublicKeyFingerprintResolver, fingerprint, s.store.Options().InNamespace(tenant))
168168
if err != nil {
169169
return nil, NewErrPublicKeyNotFound(fingerprint, err)
170170
}
@@ -206,15 +206,15 @@ func (s *service) UpdatePublicKey(ctx context.Context, fingerprint, tenant strin
206206
return nil, err
207207
}
208208

209-
return s.store.PublicKeyGet(ctx, fingerprint, tenant)
209+
return s.store.PublicKeyResolve(ctx, store.PublicKeyFingerprintResolver, fingerprint, s.store.Options().InNamespace(tenant))
210210
}
211211

212212
func (s *service) DeletePublicKey(ctx context.Context, fingerprint, tenant string) error {
213213
if _, err := s.store.NamespaceResolve(ctx, store.NamespaceTenantIDResolver, tenant); err != nil {
214214
return NewErrNamespaceNotFound(tenant, err)
215215
}
216216

217-
publicKey, err := s.store.PublicKeyGet(ctx, fingerprint, tenant)
217+
publicKey, err := s.store.PublicKeyResolve(ctx, store.PublicKeyFingerprintResolver, fingerprint, s.store.Options().InNamespace(tenant))
218218
if err != nil {
219219
return NewErrPublicKeyNotFound(fingerprint, err)
220220
}

api/services/sshkeys_test.go

Lines changed: 79 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -244,11 +244,13 @@ func TestListPublicKeys(t *testing.T) {
244244
}
245245

246246
func TestGetPublicKeys(t *testing.T) {
247-
mock := &storemock.Store{}
247+
storeMock := &storemock.Store{}
248+
queryOptionsMock := new(storemock.QueryOptions)
249+
storeMock.On("Options").Return(queryOptionsMock)
248250

249251
clockMock.On("Now").Return(now).Twice()
250252

251-
s := NewService(store.Store(mock), privateKey, publicKey, storecache.NewNullCache(), clientMock)
253+
s := NewService(store.Store(storeMock), privateKey, publicKey, storecache.NewNullCache(), clientMock)
252254

253255
ctx := context.TODO()
254256

@@ -271,7 +273,7 @@ func TestGetPublicKeys(t *testing.T) {
271273
fingerprint: "fingerprint",
272274
tenantID: InvalidTenantID,
273275
requiredMocks: func() {
274-
mock.On("NamespaceResolve", ctx, store.NamespaceTenantIDResolver, InvalidTenantID).Return(nil, errors.New("error", "", 0)).Once()
276+
storeMock.On("NamespaceResolve", ctx, store.NamespaceTenantIDResolver, InvalidTenantID).Return(nil, errors.New("error", "", 0)).Once()
275277
},
276278
expected: Expected{nil, NewErrNamespaceNotFound(InvalidTenantID, errors.New("error", "", 0))},
277279
},
@@ -283,8 +285,12 @@ func TestGetPublicKeys(t *testing.T) {
283285
requiredMocks: func() {
284286
namespace := models.Namespace{TenantID: "tenant1"}
285287

286-
mock.On("NamespaceResolve", ctx, store.NamespaceTenantIDResolver, namespace.TenantID).Return(&namespace, nil).Once()
287-
mock.On("PublicKeyGet", ctx, InvalidFingerprint, "tenant1").Return(nil, errors.New("error", "", 0)).Once()
288+
storeMock.On("NamespaceResolve", ctx, store.NamespaceTenantIDResolver, namespace.TenantID).Return(&namespace, nil).Once()
289+
queryOptionsMock.
290+
On("InNamespace", "tenant1").
291+
Return(nil).
292+
Once()
293+
storeMock.On("PublicKeyResolve", ctx, store.PublicKeyFingerprintResolver, InvalidFingerprint, mock.AnythingOfType("store.QueryOption")).Return(nil, errors.New("error", "", 0)).Once()
288294
},
289295
expected: Expected{nil, errors.New("error", "", 0)},
290296
},
@@ -298,8 +304,12 @@ func TestGetPublicKeys(t *testing.T) {
298304
key := models.PublicKey{
299305
Data: []byte("teste"), Fingerprint: "fingerprint", CreatedAt: clock.Now(), TenantID: "tenant1", PublicKeyFields: models.PublicKeyFields{Name: "teste"},
300306
}
301-
mock.On("NamespaceResolve", ctx, store.NamespaceTenantIDResolver, namespace.TenantID).Return(&namespace, nil).Once()
302-
mock.On("PublicKeyGet", ctx, "fingerprint", "tenant1").Return(&key, nil).Once()
307+
storeMock.On("NamespaceResolve", ctx, store.NamespaceTenantIDResolver, namespace.TenantID).Return(&namespace, nil).Once()
308+
queryOptionsMock.
309+
On("InNamespace", "tenant1").
310+
Return(nil).
311+
Once()
312+
storeMock.On("PublicKeyResolve", ctx, store.PublicKeyFingerprintResolver, "fingerprint", mock.AnythingOfType("store.QueryOption")).Return(&key, nil).Once()
303313
},
304314
expected: Expected{&models.PublicKey{
305315
Data: []byte("teste"), Fingerprint: "fingerprint", CreatedAt: clock.Now(), TenantID: "tenant1", PublicKeyFields: models.PublicKeyFields{Name: "teste"},
@@ -315,7 +325,7 @@ func TestGetPublicKeys(t *testing.T) {
315325
})
316326
}
317327

318-
mock.AssertExpectations(t)
328+
storeMock.AssertExpectations(t)
319329
}
320330

321331
func TestUpdatePublicKeys(t *testing.T) {
@@ -350,7 +360,11 @@ func TestUpdatePublicKeys(t *testing.T) {
350360
},
351361
},
352362
requiredMocks: func() {
353-
storeMock.On("PublicKeyGet", ctx, "fingerprint", "tenant").Return(nil, store.ErrNoDocuments).Once()
363+
queryOptionsMock.
364+
On("InNamespace", "tenant").
365+
Return(nil).
366+
Once()
367+
storeMock.On("PublicKeyResolve", ctx, store.PublicKeyFingerprintResolver, "fingerprint", mock.AnythingOfType("store.QueryOption")).Return(nil, store.ErrNoDocuments).Once()
354368
},
355369
expected: Expected{nil, NewErrPublicKeyNotFound("fingerprint", store.ErrNoDocuments)},
356370
},
@@ -368,11 +382,11 @@ func TestUpdatePublicKeys(t *testing.T) {
368382
Fingerprint: "fingerprint",
369383
TenantID: "tenant",
370384
}
371-
storeMock.On("PublicKeyGet", ctx, "fingerprint", "tenant").Return(existingKey, nil).Once()
372385
queryOptionsMock.
373386
On("InNamespace", "tenant").
374387
Return(nil).
375-
Once()
388+
Twice()
389+
storeMock.On("PublicKeyResolve", ctx, store.PublicKeyFingerprintResolver, "fingerprint", mock.AnythingOfType("store.QueryOption")).Return(existingKey, nil).Once()
376390
storeMock.On("TagList", ctx, mock.AnythingOfType("store.QueryOption")).Return(nil, 0, errors.New("error", "", 0)).Once()
377391
},
378392
expected: Expected{nil, NewErrTagEmpty("tenant", errors.New("error", "", 0))},
@@ -395,11 +409,11 @@ func TestUpdatePublicKeys(t *testing.T) {
395409
{ID: "tag1_id", Name: "tag1", TenantID: "tenant"},
396410
{ID: "tag4_id", Name: "tag4", TenantID: "tenant"},
397411
}
398-
storeMock.On("PublicKeyGet", ctx, "fingerprint", "tenant").Return(existingKey, nil).Once()
399412
queryOptionsMock.
400413
On("InNamespace", "tenant").
401414
Return(nil).
402-
Once()
415+
Twice()
416+
storeMock.On("PublicKeyResolve", ctx, store.PublicKeyFingerprintResolver, "fingerprint", mock.AnythingOfType("store.QueryOption")).Return(existingKey, nil).Once()
403417
storeMock.On("TagList", ctx, mock.AnythingOfType("store.QueryOption")).Return(tags, len(tags), nil).Once()
404418
},
405419
expected: Expected{nil, NewErrTagNotFound("tag2", nil)},
@@ -430,11 +444,11 @@ func TestUpdatePublicKeys(t *testing.T) {
430444
expectedKey.Filter.TagIDs = []string{"tag1_id", "tag2_id"}
431445
expectedKey.Filter.Tags = nil
432446

433-
storeMock.On("PublicKeyGet", ctx, "fingerprint", "tenant").Return(existingKey, nil).Once()
434447
queryOptionsMock.
435448
On("InNamespace", "tenant").
436449
Return(nil).
437-
Once()
450+
Twice()
451+
storeMock.On("PublicKeyResolve", ctx, store.PublicKeyFingerprintResolver, "fingerprint", mock.AnythingOfType("store.QueryOption")).Return(existingKey, nil).Once()
438452
storeMock.On("TagList", ctx, mock.AnythingOfType("store.QueryOption")).Return(tags, len(tags), nil).Once()
439453
storeMock.On("PublicKeyUpdate", ctx, &expectedKey).Return(errors.New("error", "", 0)).Once()
440454
},
@@ -476,14 +490,14 @@ func TestUpdatePublicKeys(t *testing.T) {
476490
},
477491
}
478492

479-
storeMock.On("PublicKeyGet", ctx, "fingerprint", "tenant").Return(existingKey, nil).Once()
480493
queryOptionsMock.
481494
On("InNamespace", "tenant").
482495
Return(nil).
483-
Once()
496+
Times(3)
497+
storeMock.On("PublicKeyResolve", ctx, store.PublicKeyFingerprintResolver, "fingerprint", mock.AnythingOfType("store.QueryOption")).Return(existingKey, nil).Once()
484498
storeMock.On("TagList", ctx, mock.AnythingOfType("store.QueryOption")).Return(tags, len(tags), nil).Once()
485499
storeMock.On("PublicKeyUpdate", ctx, &expectedKey).Return(nil).Once()
486-
storeMock.On("PublicKeyGet", ctx, "fingerprint", "tenant").Return(updatedKey, nil).Once()
500+
storeMock.On("PublicKeyResolve", ctx, store.PublicKeyFingerprintResolver, "fingerprint", mock.AnythingOfType("store.QueryOption")).Return(updatedKey, nil).Once()
487501
},
488502
expected: Expected{&models.PublicKey{
489503
Fingerprint: "fingerprint",
@@ -528,9 +542,13 @@ func TestUpdatePublicKeys(t *testing.T) {
528542
},
529543
}
530544

531-
storeMock.On("PublicKeyGet", ctx, "fingerprint", "tenant").Return(existingKey, nil).Once()
545+
queryOptionsMock.
546+
On("InNamespace", "tenant").
547+
Return(nil).
548+
Twice()
549+
storeMock.On("PublicKeyResolve", ctx, store.PublicKeyFingerprintResolver, "fingerprint", mock.AnythingOfType("store.QueryOption")).Return(existingKey, nil).Once()
532550
storeMock.On("PublicKeyUpdate", ctx, &expectedKey).Return(nil).Once()
533-
storeMock.On("PublicKeyGet", ctx, "fingerprint", "tenant").Return(updatedKey, nil).Once()
551+
storeMock.On("PublicKeyResolve", ctx, store.PublicKeyFingerprintResolver, "fingerprint", mock.AnythingOfType("store.QueryOption")).Return(updatedKey, nil).Once()
534552
},
535553
expected: Expected{&models.PublicKey{
536554
Fingerprint: "fingerprint",
@@ -558,6 +576,8 @@ func TestUpdatePublicKeys(t *testing.T) {
558576

559577
func TestDeletePublicKeys(t *testing.T) {
560578
storeMock := new(storemock.Store)
579+
queryOptionsMock := new(storemock.QueryOptions)
580+
storeMock.On("Options").Return(queryOptionsMock)
561581

562582
ctx := context.TODO()
563583

@@ -596,7 +616,11 @@ func TestDeletePublicKeys(t *testing.T) {
596616
namespace := &models.Namespace{TenantID: "tenant1"}
597617

598618
storeMock.On("NamespaceResolve", ctx, store.NamespaceTenantIDResolver, namespace.TenantID).Return(namespace, nil).Once()
599-
storeMock.On("PublicKeyGet", ctx, InvalidFingerprint, namespace.TenantID).
619+
queryOptionsMock.
620+
On("InNamespace", "tenant1").
621+
Return(nil).
622+
Once()
623+
storeMock.On("PublicKeyResolve", ctx, store.PublicKeyFingerprintResolver, InvalidFingerprint, mock.AnythingOfType("store.QueryOption")).
600624
Return(nil, errors.New("error", "", 0)).Once()
601625
},
602626
expected: Expected{NewErrPublicKeyNotFound(InvalidFingerprint, errors.New("error", "", 0))},
@@ -617,7 +641,11 @@ func TestDeletePublicKeys(t *testing.T) {
617641
}
618642

619643
storeMock.On("NamespaceResolve", ctx, store.NamespaceTenantIDResolver, namespace.TenantID).Return(namespace, nil).Once()
620-
storeMock.On("PublicKeyGet", ctx, "fingerprint", namespace.TenantID).
644+
queryOptionsMock.
645+
On("InNamespace", "tenant1").
646+
Return(nil).
647+
Once()
648+
storeMock.On("PublicKeyResolve", ctx, store.PublicKeyFingerprintResolver, "fingerprint", mock.AnythingOfType("store.QueryOption")).
621649
Return(publicKey, nil).Once()
622650
storeMock.On("PublicKeyDelete", ctx, publicKey).
623651
Return(errors.New("error", "", 0)).Once()
@@ -640,7 +668,11 @@ func TestDeletePublicKeys(t *testing.T) {
640668
}
641669

642670
storeMock.On("NamespaceResolve", ctx, store.NamespaceTenantIDResolver, namespace.TenantID).Return(namespace, nil).Once()
643-
storeMock.On("PublicKeyGet", ctx, "fingerprint", namespace.TenantID).
671+
queryOptionsMock.
672+
On("InNamespace", "tenant1").
673+
Return(nil).
674+
Once()
675+
storeMock.On("PublicKeyResolve", ctx, store.PublicKeyFingerprintResolver, "fingerprint", mock.AnythingOfType("store.QueryOption")).
644676
Return(publicKey, nil).Once()
645677
storeMock.On("PublicKeyDelete", ctx, publicKey).Return(nil).Once()
646678
},
@@ -772,7 +804,11 @@ func TestCreatePublicKeys(t *testing.T) {
772804
},
773805
}
774806

775-
storeMock.On("PublicKeyGet", ctx, keyWithHostname.Fingerprint, "tenant").Return(nil, errors.New("error", "", 0)).Once()
807+
queryOptionsMock.
808+
On("InNamespace", "tenant").
809+
Return(nil).
810+
Once()
811+
storeMock.On("PublicKeyResolve", ctx, store.PublicKeyFingerprintResolver, keyWithHostname.Fingerprint, mock.AnythingOfType("store.QueryOption")).Return(nil, errors.New("error", "", 0)).Once()
776812
},
777813
expected: Expected{nil, NewErrPublicKeyNotFound(requests.PublicKeyCreate{
778814
Data: ssh.MarshalAuthorizedKey(pubKey),
@@ -816,7 +852,11 @@ func TestCreatePublicKeys(t *testing.T) {
816852
},
817853
}
818854

819-
storeMock.On("PublicKeyGet", ctx, keyWithHostname.Fingerprint, "tenant").Return(&keyWithHostnameModel, nil).Once()
855+
queryOptionsMock.
856+
On("InNamespace", "tenant").
857+
Return(nil).
858+
Once()
859+
storeMock.On("PublicKeyResolve", ctx, store.PublicKeyFingerprintResolver, keyWithHostname.Fingerprint, mock.AnythingOfType("store.QueryOption")).Return(&keyWithHostnameModel, nil).Once()
820860
},
821861
expected: Expected{nil, NewErrPublicKeyDuplicated([]string{ssh.FingerprintLegacyMD5(pubKey)}, nil)},
822862
},
@@ -854,7 +894,11 @@ func TestCreatePublicKeys(t *testing.T) {
854894
},
855895
}
856896

857-
storeMock.On("PublicKeyGet", ctx, keyWithHostname.Fingerprint, "tenant").Return(nil, store.ErrNoDocuments).Once()
897+
queryOptionsMock.
898+
On("InNamespace", "tenant").
899+
Return(nil).
900+
Once()
901+
storeMock.On("PublicKeyResolve", ctx, store.PublicKeyFingerprintResolver, keyWithHostname.Fingerprint, mock.AnythingOfType("store.QueryOption")).Return(nil, store.ErrNoDocuments).Once()
858902
storeMock.On("PublicKeyCreate", ctx, &keyWithHostnameModel).Return("", errors.New("error", "", 0)).Once()
859903
},
860904
expected: Expected{nil, errors.New("error", "", 0)},
@@ -893,7 +937,11 @@ func TestCreatePublicKeys(t *testing.T) {
893937
},
894938
}
895939

896-
storeMock.On("PublicKeyGet", ctx, keyWithHostname.Fingerprint, "tenant").Return(nil, store.ErrNoDocuments).Once()
940+
queryOptionsMock.
941+
On("InNamespace", "tenant").
942+
Return(nil).
943+
Once()
944+
storeMock.On("PublicKeyResolve", ctx, store.PublicKeyFingerprintResolver, keyWithHostname.Fingerprint, mock.AnythingOfType("store.QueryOption")).Return(nil, store.ErrNoDocuments).Once()
897945
storeMock.On("PublicKeyCreate", ctx, &keyWithHostnameModel).Return(ssh.FingerprintLegacyMD5(pubKey), nil).Once()
898946
},
899947
expected: Expected{&responses.PublicKeyCreate{
@@ -949,9 +997,9 @@ func TestCreatePublicKeys(t *testing.T) {
949997
queryOptionsMock.
950998
On("InNamespace", "tenant").
951999
Return(nil).
952-
Once()
1000+
Twice()
9531001
storeMock.On("TagList", ctx, mock.AnythingOfType("store.QueryOption")).Return(tags, len(tags), nil).Once()
954-
storeMock.On("PublicKeyGet", ctx, keyWithTags.Fingerprint, "tenant").Return(nil, store.ErrNoDocuments).Once()
1002+
storeMock.On("PublicKeyResolve", ctx, store.PublicKeyFingerprintResolver, keyWithTags.Fingerprint, mock.AnythingOfType("store.QueryOption")).Return(nil, store.ErrNoDocuments).Once()
9551003
storeMock.On("PublicKeyCreate", ctx, &keyWithTagsModel).Return("", errors.New("error", "", 0)).Once()
9561004
},
9571005
expected: Expected{nil, errors.New("error", "", 0)},
@@ -997,9 +1045,9 @@ func TestCreatePublicKeys(t *testing.T) {
9971045
queryOptionsMock.
9981046
On("InNamespace", "tenant").
9991047
Return(nil).
1000-
Once()
1048+
Twice()
10011049
storeMock.On("TagList", ctx, mock.AnythingOfType("store.QueryOption")).Return(tags, len(tags), nil).Once()
1002-
storeMock.On("PublicKeyGet", ctx, keyWithTags.Fingerprint, "tenant").Return(nil, store.ErrNoDocuments).Once()
1050+
storeMock.On("PublicKeyResolve", ctx, store.PublicKeyFingerprintResolver, keyWithTags.Fingerprint, mock.AnythingOfType("store.QueryOption")).Return(nil, store.ErrNoDocuments).Once()
10031051
storeMock.On("PublicKeyCreate", ctx, &keyWithTagsModel).Return(ssh.FingerprintLegacyMD5(pubKey), nil).Once()
10041052
},
10051053
expected: Expected{&responses.PublicKeyCreate{

0 commit comments

Comments
 (0)