provider_test.go 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  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. esv1 "github.com/external-secrets/external-secrets/apis/externalsecrets/v1"
  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. testKubeConfig = `apiVersion: v1
  48. clusters:
  49. - cluster:
  50. server: https://api.my-domain.tld
  51. name: mycluster
  52. contexts:
  53. - context:
  54. cluster: mycluster
  55. user: myuser
  56. name: mycontext
  57. current-context: mycontext
  58. kind: Config
  59. preferences: {}
  60. users:
  61. - name: myuser
  62. user:
  63. token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJPbmxpbmUgSldUIEJ1aWxkZXIiLCJpYXQiOjE3MTkzOTY4OTksImV4cCI6MTc1MDkzMjg4NywiYXVkIjoid3d3LmV4YW1wbGUuY29tIiwic3ViIjoianJvY2tldEBleGFtcGxlLmNvbSIsIkdpdmVuTmFtZSI6IkpvaG5ueSIsIlN1cm5hbWUiOiJSb2NrZXQiLCJFbWFpbCI6Impyb2NrZXRAZXhhbXBsZS5jb20iLCJSb2xlIjpbIk1hbmFnZXIiLCJQcm9qZWN0IEFkbWluaXN0cmF0b3IiXX0.xXrfIl0akhfjWU_BDl7Ad54SXje0YlJdnugzwh96VmM
  64. `
  65. )
  66. func TestNewClient(t *testing.T) {
  67. type fields struct {
  68. Client KClient
  69. ReviewClient RClient
  70. Namespace string
  71. }
  72. type args struct {
  73. store esv1.GenericStore
  74. kube kclient.Client
  75. clientset kubernetes.Interface
  76. namespace string
  77. }
  78. tests := []struct {
  79. name string
  80. fields fields
  81. args args
  82. want bool
  83. wantErr bool
  84. }{
  85. {
  86. name: "invalid store",
  87. fields: fields{},
  88. args: args{
  89. store: &esv1.ClusterSecretStore{
  90. TypeMeta: metav1.TypeMeta{
  91. Kind: esv1.ClusterSecretStoreKind,
  92. },
  93. Spec: esv1.SecretStoreSpec{
  94. Provider: &esv1.SecretStoreProvider{},
  95. },
  96. },
  97. kube: fclient.NewClientBuilder().Build(),
  98. },
  99. wantErr: true,
  100. },
  101. {
  102. name: "test auth ref",
  103. fields: fields{},
  104. args: args{
  105. store: &esv1.ClusterSecretStore{
  106. TypeMeta: metav1.TypeMeta{
  107. Kind: esv1.ClusterSecretStoreKind,
  108. },
  109. Spec: esv1.SecretStoreSpec{
  110. Provider: &esv1.SecretStoreProvider{
  111. Kubernetes: &esv1.KubernetesProvider{
  112. AuthRef: &v1.SecretKeySelector{
  113. Name: "foo",
  114. Namespace: pointer.To("default"),
  115. Key: "config",
  116. },
  117. },
  118. },
  119. },
  120. },
  121. namespace: "",
  122. kube: fclient.NewClientBuilder().WithObjects(&corev1.Secret{
  123. ObjectMeta: metav1.ObjectMeta{
  124. Name: "foo",
  125. Namespace: "default",
  126. },
  127. Data: map[string][]byte{
  128. "config": []byte(testKubeConfig),
  129. },
  130. }).Build(),
  131. clientset: clientgofake.NewSimpleClientset(),
  132. },
  133. want: true,
  134. },
  135. {
  136. name: "test referent auth return",
  137. fields: fields{},
  138. args: args{
  139. store: &esv1.ClusterSecretStore{
  140. TypeMeta: metav1.TypeMeta{
  141. Kind: esv1.ClusterSecretStoreKind,
  142. },
  143. Spec: esv1.SecretStoreSpec{
  144. Provider: &esv1.SecretStoreProvider{
  145. Kubernetes: &esv1.KubernetesProvider{
  146. Server: esv1.KubernetesServer{
  147. URL: "https://my.test.tld",
  148. CABundle: []byte(testCertificate),
  149. },
  150. Auth: &esv1.KubernetesAuth{
  151. Token: &esv1.TokenAuth{
  152. BearerToken: v1.SecretKeySelector{
  153. Name: "foo",
  154. Key: "token",
  155. },
  156. },
  157. },
  158. },
  159. },
  160. },
  161. },
  162. namespace: "",
  163. kube: fclient.NewClientBuilder().Build(),
  164. clientset: clientgofake.NewSimpleClientset(),
  165. },
  166. want: true,
  167. },
  168. {
  169. name: "auth fail results in error",
  170. fields: fields{},
  171. args: args{
  172. store: &esv1.ClusterSecretStore{
  173. TypeMeta: metav1.TypeMeta{
  174. Kind: esv1.ClusterSecretStoreKind,
  175. },
  176. Spec: esv1.SecretStoreSpec{
  177. Provider: &esv1.SecretStoreProvider{
  178. Kubernetes: &esv1.KubernetesProvider{
  179. Server: esv1.KubernetesServer{
  180. URL: "https://my.test.tld",
  181. CABundle: []byte(testCertificate),
  182. },
  183. RemoteNamespace: "remote",
  184. Auth: &esv1.KubernetesAuth{
  185. Token: &esv1.TokenAuth{
  186. BearerToken: v1.SecretKeySelector{
  187. Name: "foo",
  188. Namespace: pointer.To("default"),
  189. Key: "token",
  190. },
  191. },
  192. },
  193. },
  194. },
  195. },
  196. },
  197. namespace: "foobarothernamespace",
  198. clientset: clientgofake.NewSimpleClientset(),
  199. kube: fclient.NewClientBuilder().Build(),
  200. },
  201. wantErr: true,
  202. },
  203. {
  204. name: "test auth",
  205. fields: fields{},
  206. args: args{
  207. store: &esv1.ClusterSecretStore{
  208. TypeMeta: metav1.TypeMeta{
  209. Kind: esv1.ClusterSecretStoreKind,
  210. },
  211. Spec: esv1.SecretStoreSpec{
  212. Provider: &esv1.SecretStoreProvider{
  213. Kubernetes: &esv1.KubernetesProvider{
  214. Server: esv1.KubernetesServer{
  215. URL: "https://my.test.tld",
  216. CABundle: []byte(testCertificate),
  217. },
  218. RemoteNamespace: "remote",
  219. Auth: &esv1.KubernetesAuth{
  220. Token: &esv1.TokenAuth{
  221. BearerToken: v1.SecretKeySelector{
  222. Name: "foo",
  223. Namespace: pointer.To("default"),
  224. Key: "token",
  225. },
  226. },
  227. },
  228. },
  229. },
  230. },
  231. },
  232. namespace: "foobarothernamespace",
  233. clientset: clientgofake.NewSimpleClientset(),
  234. kube: fclient.NewClientBuilder().WithObjects(&corev1.Secret{
  235. ObjectMeta: metav1.ObjectMeta{
  236. Name: "foo",
  237. Namespace: "default",
  238. },
  239. Data: map[string][]byte{
  240. "token": []byte("1234"),
  241. },
  242. }).Build(),
  243. },
  244. want: true,
  245. },
  246. }
  247. for _, tt := range tests {
  248. t.Run(tt.name, func(t *testing.T) {
  249. got, err := (&Provider{}).newClient(context.Background(), tt.args.store, tt.args.kube, tt.args.clientset, tt.args.namespace)
  250. if (err != nil) != tt.wantErr {
  251. t.Errorf("ProviderKubernetes.NewClient() error = %v, wantErr %v", err, tt.wantErr)
  252. return
  253. }
  254. if tt.want {
  255. assert.NotNil(t, got)
  256. } else {
  257. assert.Nil(t, got)
  258. }
  259. })
  260. }
  261. }