provider_test.go 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  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 implieclient.
  9. See the License for the specific language governing permissions and
  10. limitations under the License.
  11. */
  12. package beyondtrust
  13. import (
  14. "context"
  15. "net/http"
  16. "net/http/httptest"
  17. "testing"
  18. "github.com/stretchr/testify/assert"
  19. "k8s.io/client-go/tools/clientcmd"
  20. clientcmdapi "k8s.io/client-go/tools/clientcmd/api"
  21. kubeclient "sigs.k8s.io/controller-runtime/pkg/client"
  22. esv1beta1 "github.com/external-secrets/external-secrets/apis/externalsecrets/v1beta1"
  23. )
  24. const (
  25. errTestCase = "Test case Failed"
  26. fakeAPIURL = "https://example.com:443/BeyondTrust/api/public/v3/"
  27. clientID = "12345678-25fg-4b05-9ced-35e7dd5093ae"
  28. clientSecret = "12345678-25fg-4b05-9ced-35e7dd5093ae"
  29. )
  30. func createMockPasswordSafeClient(t *testing.T) kubeclient.Client {
  31. server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  32. switch r.URL.Path {
  33. case "/Auth/SignAppin":
  34. _, err := w.Write([]byte(`{"UserId":1, "EmailAddress":"fake@beyondtrust.com"}`))
  35. if err != nil {
  36. t.Error(errTestCase)
  37. }
  38. case "/Auth/Signout":
  39. _, err := w.Write([]byte(``))
  40. if err != nil {
  41. t.Error(errTestCase)
  42. }
  43. case "/secrets-safe/secrets":
  44. _, err := w.Write([]byte(`[{"SecretType": "FILE", "Password": "credential_in_sub_3_password","Id": "12345678-07d6-4955-175a-08db047219ce","Title": "credential_in_sub_3"}]`))
  45. if err != nil {
  46. t.Error(errTestCase)
  47. }
  48. case "/secrets-safe/secrets/12345678-07d6-4955-175a-08db047219ce/file/download":
  49. _, err := w.Write([]byte(`fake_password`))
  50. if err != nil {
  51. t.Error(errTestCase)
  52. }
  53. default:
  54. http.NotFound(w, r)
  55. }
  56. }))
  57. t.Cleanup(server.Close)
  58. clientConfig := clientcmd.NewDefaultClientConfig(clientcmdapi.Config{
  59. Clusters: map[string]*clientcmdapi.Cluster{
  60. "test": {
  61. Server: server.URL,
  62. },
  63. },
  64. AuthInfos: map[string]*clientcmdapi.AuthInfo{
  65. "test": {
  66. Token: "token",
  67. },
  68. },
  69. Contexts: map[string]*clientcmdapi.Context{
  70. "test": {
  71. Cluster: "test",
  72. AuthInfo: "test",
  73. },
  74. },
  75. CurrentContext: "test",
  76. }, &clientcmd.ConfigOverrides{})
  77. restConfig, err := clientConfig.ClientConfig()
  78. assert.Nil(t, err)
  79. c, err := kubeclient.New(restConfig, kubeclient.Options{})
  80. assert.Nil(t, err)
  81. return c
  82. }
  83. func TestNewClient(t *testing.T) {
  84. type args struct {
  85. store esv1beta1.SecretStore
  86. kube kubeclient.Client
  87. provider esv1beta1.Provider
  88. }
  89. tests := []struct {
  90. name string
  91. nameSpace string
  92. args args
  93. validateErrorNil bool
  94. validateErrorText bool
  95. expectedErrorText string
  96. }{
  97. {
  98. name: "Client ok",
  99. nameSpace: "test",
  100. args: args{
  101. store: esv1beta1.SecretStore{
  102. Spec: esv1beta1.SecretStoreSpec{
  103. Provider: &esv1beta1.SecretStoreProvider{
  104. Beyondtrust: &esv1beta1.BeyondtrustProvider{
  105. Server: &esv1beta1.BeyondtrustServer{
  106. APIURL: fakeAPIURL,
  107. RetrievalType: "SECRET",
  108. },
  109. Auth: &esv1beta1.BeyondtrustAuth{
  110. ClientID: &esv1beta1.BeyondTrustProviderSecretRef{
  111. Value: clientID,
  112. },
  113. ClientSecret: &esv1beta1.BeyondTrustProviderSecretRef{
  114. Value: clientSecret,
  115. },
  116. },
  117. },
  118. },
  119. },
  120. },
  121. kube: createMockPasswordSafeClient(t),
  122. provider: &Provider{},
  123. },
  124. validateErrorNil: true,
  125. validateErrorText: false,
  126. },
  127. {
  128. name: "Bad Client Id",
  129. nameSpace: "test",
  130. args: args{
  131. store: esv1beta1.SecretStore{
  132. Spec: esv1beta1.SecretStoreSpec{
  133. Provider: &esv1beta1.SecretStoreProvider{
  134. Beyondtrust: &esv1beta1.BeyondtrustProvider{
  135. Server: &esv1beta1.BeyondtrustServer{
  136. APIURL: fakeAPIURL,
  137. RetrievalType: "SECRET",
  138. },
  139. Auth: &esv1beta1.BeyondtrustAuth{
  140. ClientID: &esv1beta1.BeyondTrustProviderSecretRef{
  141. Value: "6138d050",
  142. },
  143. ClientSecret: &esv1beta1.BeyondTrustProviderSecretRef{
  144. Value: clientSecret,
  145. },
  146. },
  147. },
  148. },
  149. },
  150. },
  151. kube: createMockPasswordSafeClient(t),
  152. provider: &Provider{},
  153. },
  154. validateErrorNil: false,
  155. validateErrorText: true,
  156. expectedErrorText: "error in Inputs: Key: 'UserInputValidaton.ClientId' Error:Field validation for 'ClientId' failed on the 'min' tag",
  157. },
  158. {
  159. name: "Bad Client Secret",
  160. nameSpace: "test",
  161. args: args{
  162. store: esv1beta1.SecretStore{
  163. Spec: esv1beta1.SecretStoreSpec{
  164. Provider: &esv1beta1.SecretStoreProvider{
  165. Beyondtrust: &esv1beta1.BeyondtrustProvider{
  166. Server: &esv1beta1.BeyondtrustServer{
  167. APIURL: fakeAPIURL,
  168. RetrievalType: "SECRET",
  169. },
  170. Auth: &esv1beta1.BeyondtrustAuth{
  171. ClientSecret: &esv1beta1.BeyondTrustProviderSecretRef{
  172. Value: "8i7U0Yulabon8mTc",
  173. },
  174. ClientID: &esv1beta1.BeyondTrustProviderSecretRef{
  175. Value: clientID,
  176. },
  177. },
  178. },
  179. },
  180. },
  181. },
  182. kube: createMockPasswordSafeClient(t),
  183. provider: &Provider{},
  184. },
  185. validateErrorNil: false,
  186. validateErrorText: true,
  187. expectedErrorText: "error in Inputs: Key: 'UserInputValidaton.ClientSecret' Error:Field validation for 'ClientSecret' failed on the 'min' tag",
  188. },
  189. {
  190. name: "Bad Separator",
  191. nameSpace: "test",
  192. args: args{
  193. store: esv1beta1.SecretStore{
  194. Spec: esv1beta1.SecretStoreSpec{
  195. Provider: &esv1beta1.SecretStoreProvider{
  196. Beyondtrust: &esv1beta1.BeyondtrustProvider{
  197. Server: &esv1beta1.BeyondtrustServer{
  198. APIURL: fakeAPIURL,
  199. Separator: "//",
  200. RetrievalType: "SECRET",
  201. },
  202. Auth: &esv1beta1.BeyondtrustAuth{
  203. ClientID: &esv1beta1.BeyondTrustProviderSecretRef{
  204. Value: clientID,
  205. },
  206. ClientSecret: &esv1beta1.BeyondTrustProviderSecretRef{
  207. Value: clientSecret,
  208. },
  209. },
  210. },
  211. },
  212. },
  213. },
  214. kube: createMockPasswordSafeClient(t),
  215. provider: &Provider{},
  216. },
  217. validateErrorNil: false,
  218. validateErrorText: true,
  219. expectedErrorText: "error in Inputs: Key: 'UserInputValidaton.Separator' Error:Field validation for 'Separator' failed on the 'max' tag",
  220. },
  221. {
  222. name: "Time Out",
  223. nameSpace: "test",
  224. args: args{
  225. store: esv1beta1.SecretStore{
  226. Spec: esv1beta1.SecretStoreSpec{
  227. Provider: &esv1beta1.SecretStoreProvider{
  228. Beyondtrust: &esv1beta1.BeyondtrustProvider{
  229. Server: &esv1beta1.BeyondtrustServer{
  230. APIURL: fakeAPIURL,
  231. Separator: "/",
  232. ClientTimeOutSeconds: 400,
  233. RetrievalType: "SECRET",
  234. },
  235. Auth: &esv1beta1.BeyondtrustAuth{
  236. ClientID: &esv1beta1.BeyondTrustProviderSecretRef{
  237. Value: clientID,
  238. },
  239. ClientSecret: &esv1beta1.BeyondTrustProviderSecretRef{
  240. Value: clientSecret,
  241. },
  242. },
  243. },
  244. },
  245. },
  246. },
  247. kube: createMockPasswordSafeClient(t),
  248. provider: &Provider{},
  249. },
  250. validateErrorNil: false,
  251. validateErrorText: true,
  252. expectedErrorText: "error in Inputs: Key: 'UserInputValidaton.ClientTimeOutinSeconds' Error:Field validation for 'ClientTimeOutinSeconds' failed on the 'lte' tag",
  253. },
  254. }
  255. for _, tt := range tests {
  256. t.Run(tt.name, func(t *testing.T) {
  257. _, err := tt.args.provider.NewClient(context.Background(), &tt.args.store, tt.args.kube, tt.nameSpace)
  258. if err != nil && tt.validateErrorNil {
  259. t.Errorf("ProviderBeyondtrust.NewClient() error = %v", err)
  260. }
  261. if err != nil && tt.validateErrorText {
  262. assert.Equal(t, err.Error(), tt.expectedErrorText)
  263. }
  264. })
  265. }
  266. }