datasource_cache_test.go 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. package models
  2. import (
  3. "testing"
  4. "time"
  5. . "github.com/smartystreets/goconvey/convey"
  6. "github.com/grafana/grafana/pkg/components/simplejson"
  7. "github.com/grafana/grafana/pkg/setting"
  8. "github.com/grafana/grafana/pkg/util"
  9. )
  10. func TestDataSourceCache(t *testing.T) {
  11. Convey("When caching a datasource proxy", t, func() {
  12. clearCache()
  13. ds := DataSource{
  14. Id: 1,
  15. Url: "http://k8s:8001",
  16. Type: "Kubernetes",
  17. }
  18. t1, err := ds.GetHttpTransport()
  19. So(err, ShouldBeNil)
  20. t2, err := ds.GetHttpTransport()
  21. So(err, ShouldBeNil)
  22. Convey("Should be using the cached proxy", func() {
  23. So(t2, ShouldEqual, t1)
  24. })
  25. Convey("Should verify TLS by default", func() {
  26. So(t1.TLSClientConfig.InsecureSkipVerify, ShouldEqual, false)
  27. })
  28. Convey("Should have no TLS client certificate configured", func() {
  29. So(len(t1.TLSClientConfig.Certificates), ShouldEqual, 0)
  30. })
  31. Convey("Should have no user-supplied TLS CA onfigured", func() {
  32. So(t1.TLSClientConfig.RootCAs, ShouldBeNil)
  33. })
  34. })
  35. Convey("When caching a datasource proxy then updating it", t, func() {
  36. clearCache()
  37. setting.SecretKey = "password"
  38. json := simplejson.New()
  39. json.Set("tlsAuthWithCACert", true)
  40. tlsCaCert, err := util.Encrypt([]byte(caCert), "password")
  41. So(err, ShouldBeNil)
  42. ds := DataSource{
  43. Id: 1,
  44. Url: "http://k8s:8001",
  45. Type: "Kubernetes",
  46. SecureJsonData: map[string][]byte{"tlsCACert": tlsCaCert},
  47. Updated: time.Now().Add(-2 * time.Minute),
  48. }
  49. t1, err := ds.GetHttpTransport()
  50. So(err, ShouldBeNil)
  51. Convey("Should verify TLS by default", func() {
  52. So(t1.TLSClientConfig.InsecureSkipVerify, ShouldEqual, false)
  53. })
  54. Convey("Should have no TLS client certificate configured", func() {
  55. So(len(t1.TLSClientConfig.Certificates), ShouldEqual, 0)
  56. })
  57. Convey("Should have no user-supplied TLS CA configured", func() {
  58. So(t1.TLSClientConfig.RootCAs, ShouldBeNil)
  59. })
  60. ds.JsonData = nil
  61. ds.SecureJsonData = map[string][]byte{}
  62. ds.Updated = time.Now()
  63. t2, err := ds.GetHttpTransport()
  64. So(err, ShouldBeNil)
  65. Convey("Should have no user-supplied TLS CA configured after the update", func() {
  66. So(t2.TLSClientConfig.RootCAs, ShouldBeNil)
  67. })
  68. })
  69. Convey("When caching a datasource proxy with TLS client authentication enabled", t, func() {
  70. clearCache()
  71. setting.SecretKey = "password"
  72. json := simplejson.New()
  73. json.Set("tlsAuth", true)
  74. tlsClientCert, err := util.Encrypt([]byte(clientCert), "password")
  75. So(err, ShouldBeNil)
  76. tlsClientKey, err := util.Encrypt([]byte(clientKey), "password")
  77. So(err, ShouldBeNil)
  78. ds := DataSource{
  79. Id: 1,
  80. Url: "http://k8s:8001",
  81. Type: "Kubernetes",
  82. JsonData: json,
  83. SecureJsonData: map[string][]byte{
  84. "tlsClientCert": tlsClientCert,
  85. "tlsClientKey": tlsClientKey,
  86. },
  87. }
  88. tr, err := ds.GetHttpTransport()
  89. So(err, ShouldBeNil)
  90. Convey("Should verify TLS by default", func() {
  91. So(tr.TLSClientConfig.InsecureSkipVerify, ShouldEqual, false)
  92. })
  93. Convey("Should have a TLS client certificate configured", func() {
  94. So(len(tr.TLSClientConfig.Certificates), ShouldEqual, 1)
  95. })
  96. })
  97. Convey("When caching a datasource proxy with a user-supplied TLS CA", t, func() {
  98. clearCache()
  99. setting.SecretKey = "password"
  100. json := simplejson.New()
  101. json.Set("tlsAuthWithCACert", true)
  102. tlsCaCert, err := util.Encrypt([]byte(caCert), "password")
  103. So(err, ShouldBeNil)
  104. ds := DataSource{
  105. Id: 1,
  106. Url: "http://k8s:8001",
  107. Type: "Kubernetes",
  108. JsonData: json,
  109. SecureJsonData: map[string][]byte{"tlsCACert": tlsCaCert},
  110. }
  111. tr, err := ds.GetHttpTransport()
  112. So(err, ShouldBeNil)
  113. Convey("Should verify TLS by default", func() {
  114. So(tr.TLSClientConfig.InsecureSkipVerify, ShouldEqual, false)
  115. })
  116. Convey("Should have a TLS CA configured", func() {
  117. So(len(tr.TLSClientConfig.RootCAs.Subjects()), ShouldEqual, 1)
  118. })
  119. })
  120. Convey("When caching a datasource proxy when user skips TLS verification", t, func() {
  121. clearCache()
  122. json := simplejson.New()
  123. json.Set("tlsSkipVerify", true)
  124. ds := DataSource{
  125. Id: 1,
  126. Url: "http://k8s:8001",
  127. Type: "Kubernetes",
  128. JsonData: json,
  129. }
  130. tr, err := ds.GetHttpTransport()
  131. So(err, ShouldBeNil)
  132. Convey("Should skip TLS verification", func() {
  133. So(tr.TLSClientConfig.InsecureSkipVerify, ShouldEqual, true)
  134. })
  135. })
  136. }
  137. func clearCache() {
  138. ptc.Lock()
  139. defer ptc.Unlock()
  140. ptc.cache = make(map[int64]cachedTransport)
  141. }
  142. const caCert string = `-----BEGIN CERTIFICATE-----
  143. MIIDATCCAemgAwIBAgIJAMQ5hC3CPDTeMA0GCSqGSIb3DQEBCwUAMBcxFTATBgNV
  144. BAMMDGNhLWs4cy1zdGhsbTAeFw0xNjEwMjcwODQyMjdaFw00NDAzMTQwODQyMjda
  145. MBcxFTATBgNVBAMMDGNhLWs4cy1zdGhsbTCCASIwDQYJKoZIhvcNAQEBBQADggEP
  146. ADCCAQoCggEBAMLe2AmJ6IleeUt69vgNchOjjmxIIxz5sp1vFu94m1vUip7CqnOg
  147. QkpUsHeBPrGYv8UGloARCL1xEWS+9FVZeXWQoDmbC0SxXhFwRIESNCET7Q8KMi/4
  148. 4YPvnMLGZi3Fjwxa8BdUBCN1cx4WEooMVTWXm7RFMtZgDfuOAn3TNXla732sfT/d
  149. 1HNFrh48b0wA+HhmA3nXoBnBEblA665hCeo7lIAdRr0zJxJpnFnWXkyTClsAUTMN
  150. iL905LdBiiIRenojipfKXvMz88XSaWTI7JjZYU3BvhyXndkT6f12cef3I96NY3WJ
  151. 0uIK4k04WrbzdYXMU3rN6NqlvbHqnI+E7aMCAwEAAaNQME4wHQYDVR0OBBYEFHHx
  152. 2+vSPw9bECHj3O51KNo5VdWOMB8GA1UdIwQYMBaAFHHx2+vSPw9bECHj3O51KNo5
  153. VdWOMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAH2eV5NcV3LBJHs9
  154. I+adbiTPg2vyumrGWwy73T0X8Dtchgt8wU7Q9b9Ucg2fOTmSSyS0iMqEu1Yb2ORB
  155. CknM9mixHC9PwEBbkGCom3VVkqdLwSP6gdILZgyLoH4i8sTUz+S1yGPepi+Vzhs7
  156. adOXtryjcGnwft6HdfKPNklMOHFnjw6uqpho54oj/z55jUpicY/8glDHdrr1bh3k
  157. MHuiWLGewHXPvxfG6UoUx1te65IhifVcJGFZDQwfEmhBflfCmtAJlZEsgTLlBBCh
  158. FHoXIyGOdq1chmRVocdGBCF8fUoGIbuF14r53rpvcbEKtKnnP8+96luKAZLq0a4n
  159. 3lb92xM=
  160. -----END CERTIFICATE-----`
  161. const clientCert string = `
  162. -----BEGIN CERTIFICATE-----
  163. MIICsjCCAZoCCQCcd8sOfstQLzANBgkqhkiG9w0BAQsFADAXMRUwEwYDVQQDDAxj
  164. YS1rOHMtc3RobG0wHhcNMTYxMTAyMDkyNTE1WhcNMTcxMTAyMDkyNTE1WjAfMR0w
  165. GwYDVQQDDBRhZG0tZGFuaWVsLWs4cy1zdGhsbTCCASIwDQYJKoZIhvcNAQEBBQAD
  166. ggEPADCCAQoCggEBAOMliaWyNEUJKM37vWCl5bGub3lMicyRAqGQyY/qxD9yKKM2
  167. FbucVcmWmg5vvTqQVl5rlQ+c7GI8OD6ptmFl8a26coEki7bFr8bkpSyBSEc5p27b
  168. Z0ORFSqBHWHQbr9PkxPLYW6T3gZYUtRYv3OQgGxLXlvUh85n/mQfuR3N1FgmShHo
  169. GtAFi/ht6leXa0Ms+jNSDLCmXpJm1GIEqgyKX7K3+g3vzo9coYqXq4XTa8Efs2v8
  170. SCwqWfBC3rHfgs/5DLB8WT4Kul8QzxkytzcaBQfRfzhSV6bkgm7oTzt2/1eRRsf4
  171. YnXzLE9YkCC9sAn+Owzqf+TYC1KRluWDfqqBTJUCAwEAATANBgkqhkiG9w0BAQsF
  172. AAOCAQEAdMsZg6edWGC+xngizn0uamrUg1ViaDqUsz0vpzY5NWLA4MsBc4EtxWRP
  173. ueQvjUimZ3U3+AX0YWNLIrH1FCVos2jdij/xkTUmHcwzr8rQy+B17cFi+a8jtpgw
  174. AU6WWoaAIEhhbWQfth/Diz3mivl1ARB+YqiWca2mjRPLTPcKJEURDVddQ423el0Q
  175. 4JNxS5icu7T2zYTYHAo/cT9zVdLZl0xuLxYm3asK1IONJ/evxyVZima3il6MPvhe
  176. 58Hwz+m+HdqHxi24b/1J/VKYbISG4huOQCdLzeNXgvwFlGPUmHSnnKo1/KbQDAR5
  177. llG/Sw5+FquFuChaA6l5KWy7F3bQyA==
  178. -----END CERTIFICATE-----`
  179. const clientKey string = `-----BEGIN RSA PRIVATE KEY-----
  180. MIIEpQIBAAKCAQEA4yWJpbI0RQkozfu9YKXlsa5veUyJzJECoZDJj+rEP3IoozYV
  181. u5xVyZaaDm+9OpBWXmuVD5zsYjw4Pqm2YWXxrbpygSSLtsWvxuSlLIFIRzmnbttn
  182. Q5EVKoEdYdBuv0+TE8thbpPeBlhS1Fi/c5CAbEteW9SHzmf+ZB+5Hc3UWCZKEega
  183. 0AWL+G3qV5drQyz6M1IMsKZekmbUYgSqDIpfsrf6De/Oj1yhiperhdNrwR+za/xI
  184. LCpZ8ELesd+Cz/kMsHxZPgq6XxDPGTK3NxoFB9F/OFJXpuSCbuhPO3b/V5FGx/hi
  185. dfMsT1iQIL2wCf47DOp/5NgLUpGW5YN+qoFMlQIDAQABAoIBAQCzy4u312XeW1Cs
  186. Mx6EuOwmh59/ESFmBkZh4rxZKYgrfE5EWlQ7i5SwG4BX+wR6rbNfy6JSmHDXlTkk
  187. CKvvToVNcW6fYHEivDnVojhIERFIJ4+rhQmpBtcNLOQ3/4cZ8X/GxE6b+3lb5l+x
  188. 64mnjPLKRaIr5/+TVuebEy0xNTJmjnJ7yiB2HRz7uXEQaVSk/P7KAkkyl/9J3/LM
  189. 8N9AX1w6qDaNQZ4/P0++1H4SQenosM/b/GqGTomarEk/GE0NcB9rzmR9VCXa7FRh
  190. WV5jyt9vUrwIEiK/6nUnOkGO8Ei3kB7Y+e+2m6WdaNoU5RAfqXmXa0Q/a0lLRruf
  191. vTMo2WrBAoGBAPRaK4cx76Q+3SJ/wfznaPsMM06OSR8A3ctKdV+ip/lyKtb1W8Pz
  192. k8MYQDH7GwPtSu5QD8doL00pPjugZL/ba7X9nAsI+pinyEErfnB9y7ORNEjIYYzs
  193. DiqDKup7ANgw1gZvznWvb9Ge0WUSXvWS0pFkgootQAf+RmnnbWGH6l6RAoGBAO35
  194. aGUrLro5u9RD24uSXNU3NmojINIQFK5dHAT3yl0BBYstL43AEsye9lX95uMPTvOQ
  195. Cqcn42Hjp/bSe3n0ObyOZeXVrWcDFAfE0wwB1BkvL1lpgnFO9+VQORlH4w3Ppnpo
  196. jcPkR2TFeDaAYtvckhxe/Bk3OnuFmnsQ3VzM75fFAoGBAI6PvS2XeNU+yA3EtA01
  197. hg5SQ+zlHswz2TMuMeSmJZJnhY78f5mHlwIQOAPxGQXlf/4iP9J7en1uPpzTK3S0
  198. M9duK4hUqMA/w5oiIhbHjf0qDnMYVbG+V1V+SZ+cPBXmCDihKreGr5qBKnHpkfV8
  199. v9WL6o1rcRw4wiQvnaV1gsvBAoGBALtzVTczr6gDKCAIn5wuWy+cQSGTsBunjRLX
  200. xuVm5iEiV+KMYkPvAx/pKzMLP96lRVR3ptyKgAKwl7LFk3u50+zh4gQLr35QH2wL
  201. Lw7rNc3srAhrItPsFzqrWX6/cGuFoKYVS239l/sZzRppQPXcpb7xVvTp2whHcir0
  202. Wtnpl+TdAoGAGqKqo2KU3JoY3IuTDUk1dsNAm8jd9EWDh+s1x4aG4N79mwcss5GD
  203. FF8MbFPneK7xQd8L6HisKUDAUi2NOyynM81LAftPkvN6ZuUVeFDfCL4vCA0HUXLD
  204. +VrOhtUZkNNJlLMiVRJuQKUOGlg8PpObqYbstQAf/0/yFJMRHG82Tcg=
  205. -----END RSA PRIVATE KEY-----`