provider_test.go 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. /*
  2. Licensed under the Apache License, Version 2.0 (the "License");
  3. you may not use this file except in compliance with the License.
  4. You may obtain a copy of the License at
  5. http://www.apache.org/licenses/LICENSE-2.0
  6. Unless required by applicable law or agreed to in writing, software
  7. distributed under the License is distributed on an "AS IS" BASIS,
  8. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  9. See the License for the specific language governing permissions and
  10. limitations under the License.
  11. */
  12. package kubernetes
  13. import (
  14. "context"
  15. "testing"
  16. "github.com/stretchr/testify/assert"
  17. corev1 "k8s.io/api/core/v1"
  18. metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
  19. "k8s.io/client-go/kubernetes"
  20. clientgofake "k8s.io/client-go/kubernetes/fake"
  21. pointer "k8s.io/utils/ptr"
  22. kclient "sigs.k8s.io/controller-runtime/pkg/client"
  23. fclient "sigs.k8s.io/controller-runtime/pkg/client/fake"
  24. esv1beta1 "github.com/external-secrets/external-secrets/apis/externalsecrets/v1beta1"
  25. v1 "github.com/external-secrets/external-secrets/apis/meta/v1"
  26. )
  27. const (
  28. testCertificate = `-----BEGIN CERTIFICATE-----
  29. MIIDHTCCAgWgAwIBAgIRAKC4yxy9QGocND+6avTf7BgwDQYJKoZIhvcNAQELBQAw
  30. EjEQMA4GA1UEChMHQWNtZSBDbzAeFw0yMTAzMjAyMDA4MDhaFw0yMTAzMjAyMDM4
  31. MDhaMBIxEDAOBgNVBAoTB0FjbWUgQ28wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
  32. ggEKAoIBAQC3o6/JdZEqNbqNRkopHhJtJG5c4qS5d0tQ/kZYpfD/v/izAYum4Nzj
  33. aG15owr92/11W0pxPUliRLti3y6iScTs+ofm2D7p4UXj/Fnho/2xoWSOoWAodgvW
  34. Y8jh8A0LQALZiV/9QsrJdXZdS47DYZLsQ3z9yFC/CdXkg1l7AQ3fIVGKdrQBr9kE
  35. 1gEDqnKfRxXI8DEQKXr+CKPUwCAytegmy0SHp53zNAvY+kopHytzmJpXLoEhxq4e
  36. ugHe52vXHdh/HJ9VjNp0xOH1waAgAGxHlltCW0PVd5AJ0SXROBS/a3V9sZCbCrJa
  37. YOOonQSEswveSv6PcG9AHvpNPot2Xs6hAgMBAAGjbjBsMA4GA1UdDwEB/wQEAwIC
  38. pDATBgNVHSUEDDAKBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW
  39. BBR00805mrpoonp95RmC3B6oLl+cGTAVBgNVHREEDjAMggpnb29ibGUuY29tMA0G
  40. CSqGSIb3DQEBCwUAA4IBAQAipc1b6JrEDayPjpz5GM5krcI8dCWVd8re0a9bGjjN
  41. ioWGlu/eTr5El0ffwCNZ2WLmL9rewfHf/bMvYz3ioFZJ2OTxfazqYXNggQz6cMfa
  42. lbedDCdt5XLVX2TyerGvFram+9Uyvk3l0uM7rZnwAmdirG4Tv94QRaD3q4xTj/c0
  43. mv+AggtK0aRFb9o47z/BypLdk5mhbf3Mmr88C8XBzEnfdYyf4JpTlZrYLBmDCu5d
  44. 9RLLsjXxhag8xqMtd1uLUM8XOTGzVWacw8iGY+CTtBKqyA+AE6/bDwZvEwVtsKtC
  45. QJ85ioEpy00NioqcF0WyMZH80uMsPycfpnl5uF7RkW8u
  46. -----END CERTIFICATE-----`
  47. )
  48. func TestNewClient(t *testing.T) {
  49. type fields struct {
  50. Client KClient
  51. ReviewClient RClient
  52. Namespace string
  53. }
  54. type args struct {
  55. store esv1beta1.GenericStore
  56. kube kclient.Client
  57. clientset kubernetes.Interface
  58. namespace string
  59. }
  60. tests := []struct {
  61. name string
  62. fields fields
  63. args args
  64. want bool
  65. wantErr bool
  66. }{
  67. {
  68. name: "invalid store",
  69. fields: fields{},
  70. args: args{
  71. store: &esv1beta1.ClusterSecretStore{
  72. TypeMeta: metav1.TypeMeta{
  73. Kind: esv1beta1.ClusterSecretStoreKind,
  74. },
  75. Spec: esv1beta1.SecretStoreSpec{
  76. Provider: &esv1beta1.SecretStoreProvider{},
  77. },
  78. },
  79. kube: fclient.NewClientBuilder().Build(),
  80. },
  81. wantErr: true,
  82. },
  83. {
  84. name: "test referent auth return",
  85. fields: fields{},
  86. args: args{
  87. store: &esv1beta1.ClusterSecretStore{
  88. TypeMeta: metav1.TypeMeta{
  89. Kind: esv1beta1.ClusterSecretStoreKind,
  90. },
  91. Spec: esv1beta1.SecretStoreSpec{
  92. Provider: &esv1beta1.SecretStoreProvider{
  93. Kubernetes: &esv1beta1.KubernetesProvider{
  94. Server: esv1beta1.KubernetesServer{
  95. CABundle: []byte(testCertificate),
  96. },
  97. Auth: esv1beta1.KubernetesAuth{
  98. Token: &esv1beta1.TokenAuth{
  99. BearerToken: v1.SecretKeySelector{
  100. Name: "foo",
  101. Key: "token",
  102. },
  103. },
  104. },
  105. },
  106. },
  107. },
  108. },
  109. namespace: "",
  110. kube: fclient.NewClientBuilder().Build(),
  111. clientset: clientgofake.NewSimpleClientset(),
  112. },
  113. want: true,
  114. },
  115. {
  116. name: "auth fail results in error",
  117. fields: fields{},
  118. args: args{
  119. store: &esv1beta1.ClusterSecretStore{
  120. TypeMeta: metav1.TypeMeta{
  121. Kind: esv1beta1.ClusterSecretStoreKind,
  122. },
  123. Spec: esv1beta1.SecretStoreSpec{
  124. Provider: &esv1beta1.SecretStoreProvider{
  125. Kubernetes: &esv1beta1.KubernetesProvider{
  126. Server: esv1beta1.KubernetesServer{
  127. CABundle: []byte(testCertificate),
  128. },
  129. RemoteNamespace: "remote",
  130. Auth: esv1beta1.KubernetesAuth{
  131. Token: &esv1beta1.TokenAuth{
  132. BearerToken: v1.SecretKeySelector{
  133. Name: "foo",
  134. Namespace: pointer.To("default"),
  135. Key: "token",
  136. },
  137. },
  138. },
  139. },
  140. },
  141. },
  142. },
  143. namespace: "foobarothernamespace",
  144. clientset: clientgofake.NewSimpleClientset(),
  145. kube: fclient.NewClientBuilder().Build(),
  146. },
  147. wantErr: true,
  148. },
  149. {
  150. name: "test auth",
  151. fields: fields{},
  152. args: args{
  153. store: &esv1beta1.ClusterSecretStore{
  154. TypeMeta: metav1.TypeMeta{
  155. Kind: esv1beta1.ClusterSecretStoreKind,
  156. },
  157. Spec: esv1beta1.SecretStoreSpec{
  158. Provider: &esv1beta1.SecretStoreProvider{
  159. Kubernetes: &esv1beta1.KubernetesProvider{
  160. Server: esv1beta1.KubernetesServer{
  161. CABundle: []byte(testCertificate),
  162. },
  163. RemoteNamespace: "remote",
  164. Auth: esv1beta1.KubernetesAuth{
  165. Token: &esv1beta1.TokenAuth{
  166. BearerToken: v1.SecretKeySelector{
  167. Name: "foo",
  168. Namespace: pointer.To("default"),
  169. Key: "token",
  170. },
  171. },
  172. },
  173. },
  174. },
  175. },
  176. },
  177. namespace: "foobarothernamespace",
  178. clientset: clientgofake.NewSimpleClientset(),
  179. kube: fclient.NewClientBuilder().WithObjects(&corev1.Secret{
  180. ObjectMeta: metav1.ObjectMeta{
  181. Name: "foo",
  182. Namespace: "default",
  183. },
  184. Data: map[string][]byte{
  185. "token": []byte("1234"),
  186. },
  187. }).Build(),
  188. },
  189. want: true,
  190. },
  191. }
  192. for _, tt := range tests {
  193. t.Run(tt.name, func(t *testing.T) {
  194. got, err := (&Provider{}).newClient(context.Background(), tt.args.store, tt.args.kube, tt.args.clientset, tt.args.namespace)
  195. if (err != nil) != tt.wantErr {
  196. t.Errorf("ProviderKubernetes.NewClient() error = %v, wantErr %v", err, tt.wantErr)
  197. return
  198. }
  199. if tt.want {
  200. assert.NotNil(t, got)
  201. } else {
  202. assert.Nil(t, got)
  203. }
  204. })
  205. }
  206. }