fake_client.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. /*
  2. Copyright © The ESO Authors
  3. Licensed under the Apache License, Version 2.0 (the "License");
  4. you may not use this file except in compliance with the License.
  5. You may obtain a copy of the License at
  6. https://www.apache.org/licenses/LICENSE-2.0
  7. Unless required by applicable law or agreed to in writing, software
  8. distributed under the License is distributed on an "AS IS" BASIS,
  9. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. See the License for the specific language governing permissions and
  11. limitations under the License.
  12. */
  13. package fake
  14. import (
  15. "context"
  16. "sync"
  17. "sync/atomic"
  18. "github.com/google/uuid"
  19. "google.golang.org/grpc/codes"
  20. "google.golang.org/grpc/status"
  21. "github.com/external-secrets/external-secrets/providers/v1/nebius/common/sdk/mysterybox"
  22. )
  23. type FakeMysteryboxClient struct {
  24. mysteryboxService *MysteryboxService
  25. Closed int32
  26. }
  27. func (f *FakeMysteryboxClient) Close() error {
  28. atomic.AddInt32(&f.Closed, 1)
  29. return nil
  30. }
  31. func (f *FakeMysteryboxClient) GetSecret(_ context.Context, _, secretId, versionId string) (*mysterybox.Payload, error) {
  32. secret, err := f.mysteryboxService.GetSecret(secretId, versionId)
  33. if err != nil {
  34. return nil, err
  35. }
  36. return &mysterybox.Payload{
  37. VersionID: secret.VersionId,
  38. Entries: secret.Entries,
  39. }, nil
  40. }
  41. func (f *FakeMysteryboxClient) GetSecretByKey(_ context.Context, _, secretID, versionID, key string) (*mysterybox.PayloadEntry, error) {
  42. secret, err := f.mysteryboxService.GetSecret(secretID, versionID)
  43. if err != nil {
  44. return nil, err
  45. }
  46. for _, entry := range secret.Entries {
  47. if entry.Key == key {
  48. return &mysterybox.PayloadEntry{
  49. VersionID: secret.VersionId,
  50. Entry: entry,
  51. }, nil
  52. }
  53. }
  54. return nil, notFoundError()
  55. }
  56. type MysteryboxService struct {
  57. mu sync.RWMutex
  58. secretData map[string]map[string][]mysterybox.Entry
  59. }
  60. func InitMysteryboxService() *MysteryboxService {
  61. return &MysteryboxService{
  62. secretData: make(map[string]map[string][]mysterybox.Entry),
  63. }
  64. }
  65. func (s *MysteryboxService) GetSecret(secretId, versionId string) (*Secret, error) {
  66. s.mu.RLock()
  67. defer s.mu.RUnlock()
  68. data, ok := s.secretData[secretId]
  69. if !ok {
  70. return nil, notFoundError()
  71. }
  72. dataByVersion, ok := data[versionId] // if a version is empty -> "" (latest/primary) version will be taken
  73. if !ok {
  74. return nil, notFoundError()
  75. }
  76. return &Secret{
  77. Id: secretId,
  78. VersionId: versionId,
  79. Entries: dataByVersion,
  80. }, nil
  81. }
  82. func (s *MysteryboxService) CreateSecret(payloadEntries []mysterybox.Entry) *Secret {
  83. if len(payloadEntries) == 0 {
  84. return nil
  85. }
  86. secretId := uuid.NewString()
  87. versionId := uuid.NewString()
  88. s.mu.Lock()
  89. defer s.mu.Unlock()
  90. versionData := make(map[string][]mysterybox.Entry)
  91. versionData[versionId] = payloadEntries
  92. versionData[""] = payloadEntries // latest version is primary
  93. s.secretData[secretId] = versionData
  94. return &Secret{
  95. Id: secretId,
  96. VersionId: versionId,
  97. Entries: payloadEntries,
  98. }
  99. }
  100. func (s *MysteryboxService) CreateNewSecretVersion(secretId string, payloadEntries []mysterybox.Entry) (string, error) {
  101. s.mu.Lock()
  102. defer s.mu.Unlock()
  103. versions, ok := s.secretData[secretId]
  104. if !ok {
  105. return "", notFoundError()
  106. }
  107. versionId := uuid.NewString()
  108. versions[versionId] = payloadEntries
  109. versions[""] = payloadEntries // latest version is primary
  110. return versionId, nil
  111. }
  112. func NewFakeMysteryboxClient(service *MysteryboxService) *FakeMysteryboxClient {
  113. return &FakeMysteryboxClient{
  114. mysteryboxService: service,
  115. }
  116. }
  117. type Secret struct {
  118. Id string
  119. VersionId string
  120. Entries []mysterybox.Entry
  121. }
  122. func notFoundError() error {
  123. return status.Error(codes.NotFound, "not found")
  124. }
  125. var _ mysterybox.Client = &FakeMysteryboxClient{}