client.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. package remote
  2. import (
  3. "context"
  4. "encoding/json"
  5. "errors"
  6. "fmt"
  7. "log"
  8. esv1beta1 "github.com/external-secrets/external-secrets/apis/externalsecrets/v1beta1"
  9. pb "github.com/external-secrets/external-secrets/pkg/plugin/grpc"
  10. "google.golang.org/grpc"
  11. "sigs.k8s.io/controller-runtime/pkg/client"
  12. )
  13. // Client is a small wrapper to map ESO SecretsClient to gRPC calls
  14. type Client struct {
  15. store esv1beta1.GenericStore
  16. namespace string
  17. kube client.Client
  18. conn *grpc.ClientConn
  19. grpcClient pb.SecretsClientClient
  20. }
  21. func (s *Client) GetSecret(ctx context.Context, ref esv1beta1.ExternalSecretDataRemoteRef) ([]byte, error) {
  22. storeBytes, err := json.Marshal(s.store)
  23. if err != nil {
  24. return nil, err
  25. }
  26. objects, err := aggregateObjects(ctx, s.store, s.kube, s.namespace)
  27. if err != nil {
  28. return nil, err
  29. }
  30. log.Printf("rpc sending objects=%s", string(objects))
  31. res, err := s.grpcClient.GetSecret(ctx, &pb.GetSecretRequest{
  32. Store: storeBytes,
  33. Namespace: s.namespace,
  34. Objects: objects,
  35. RemoteRef: &pb.RemoteRef{
  36. Key: ref.Key,
  37. Property: ref.Property,
  38. Version: ref.Version,
  39. MetadataPolicy: string(ref.MetadataPolicy),
  40. ConversionStrategy: string(ref.ConversionStrategy),
  41. DecodingStrategy: string(ref.DecodingStrategy),
  42. },
  43. })
  44. if err != nil {
  45. return nil, fmt.Errorf("unable to rpc: %w", err)
  46. }
  47. log.Printf("rpc secret=%s, err=%s", string(res.Secret), res.Error)
  48. if res.Error != "" {
  49. nse := esv1beta1.NoSecretError{}
  50. if res.Error == nse.Error() {
  51. return nil, nse
  52. }
  53. return nil, errors.New(res.Error)
  54. }
  55. return res.Secret, nil
  56. }
  57. func (s *Client) PushSecret(ctx context.Context, value []byte, remoteRef esv1beta1.PushRemoteRef) error {
  58. storeBytes, err := json.Marshal(s.store)
  59. if err != nil {
  60. return err
  61. }
  62. objects, err := aggregateObjects(ctx, s.store, s.kube, s.namespace)
  63. if err != nil {
  64. return err
  65. }
  66. res, err := s.grpcClient.PushSecret(ctx, &pb.PushSecretRequest{
  67. Store: storeBytes,
  68. Namespace: s.namespace,
  69. Objects: objects,
  70. Secret: value,
  71. RemoteRef: &pb.PushRemoteRef{
  72. RemoteKey: remoteRef.GetRemoteKey(),
  73. Property: remoteRef.GetProperty(),
  74. },
  75. })
  76. if err != nil {
  77. return fmt.Errorf("unable to rpc: %w", err)
  78. }
  79. if res.Error != "" {
  80. return fmt.Errorf("rpc error: %s", res.Error)
  81. }
  82. return nil
  83. }
  84. func (s *Client) DeleteSecret(ctx context.Context, remoteRef esv1beta1.PushRemoteRef) error {
  85. storeBytes, err := json.Marshal(s.store)
  86. if err != nil {
  87. return err
  88. }
  89. objects, err := aggregateObjects(ctx, s.store, s.kube, s.namespace)
  90. if err != nil {
  91. return err
  92. }
  93. res, err := s.grpcClient.DeleteSecret(ctx, &pb.DeleteSecretRequest{
  94. Store: storeBytes,
  95. Namespace: s.namespace,
  96. Objects: objects,
  97. RemoteRef: &pb.PushRemoteRef{
  98. RemoteKey: remoteRef.GetRemoteKey(),
  99. Property: remoteRef.GetProperty(),
  100. },
  101. })
  102. if err != nil {
  103. return fmt.Errorf("unable to rpc: %w", err)
  104. }
  105. if res.Error != "" {
  106. return fmt.Errorf("rpc error: %s", res.Error)
  107. }
  108. return nil
  109. }
  110. func (s *Client) Validate() (esv1beta1.ValidationResult, error) {
  111. return esv1beta1.ValidationResultUnknown, nil
  112. }
  113. func (s *Client) GetSecretMap(ctx context.Context, ref esv1beta1.ExternalSecretDataRemoteRef) (map[string][]byte, error) {
  114. storeBytes, err := json.Marshal(s.store)
  115. if err != nil {
  116. return nil, err
  117. }
  118. objects, err := aggregateObjects(ctx, s.store, s.kube, s.namespace)
  119. if err != nil {
  120. return nil, err
  121. }
  122. res, err := s.grpcClient.GetSecretMap(ctx, &pb.GetSecretMapRequest{
  123. Store: storeBytes,
  124. Namespace: s.namespace,
  125. Objects: objects,
  126. RemoteRef: &pb.RemoteRef{
  127. Key: ref.Key,
  128. Property: ref.Property,
  129. Version: ref.Version,
  130. MetadataPolicy: string(ref.MetadataPolicy),
  131. ConversionStrategy: string(ref.ConversionStrategy),
  132. DecodingStrategy: string(ref.DecodingStrategy),
  133. },
  134. })
  135. if err != nil {
  136. return nil, fmt.Errorf("unable to rpc: %w", err)
  137. }
  138. if res.Error != "" {
  139. return nil, fmt.Errorf("rpc error: %s", res.Error)
  140. }
  141. return res.Data, nil
  142. }
  143. func (s *Client) GetAllSecrets(ctx context.Context, ref esv1beta1.ExternalSecretFind) (map[string][]byte, error) {
  144. storeBytes, err := json.Marshal(s.store)
  145. if err != nil {
  146. return nil, err
  147. }
  148. findRef := &pb.ExternalSecretFind{
  149. Tags: ref.Tags,
  150. ConversionStrategy: string(ref.ConversionStrategy),
  151. DecodingStrategy: string(ref.DecodingStrategy),
  152. }
  153. if ref.Path != nil {
  154. findRef.Path = *ref.Path
  155. }
  156. if ref.Name != nil {
  157. findRef.FindNameRegexp = ref.Name.RegExp
  158. }
  159. objects, err := aggregateObjects(ctx, s.store, s.kube, s.namespace)
  160. if err != nil {
  161. return nil, err
  162. }
  163. res, err := s.grpcClient.GetAllSecrets(ctx, &pb.GetAllSecretsRequest{
  164. Store: storeBytes,
  165. Namespace: s.namespace,
  166. Objects: objects,
  167. RemoteRef: findRef,
  168. })
  169. if err != nil {
  170. return nil, fmt.Errorf("unable to rpc: %w", err)
  171. }
  172. if res.Error != "" {
  173. return nil, fmt.Errorf("rpc error: %s", res.Error)
  174. }
  175. return res.Data, nil
  176. }
  177. func (s *Client) Close(ctx context.Context) error {
  178. return s.conn.Close()
  179. }