dataproxy_test.go 7.4 KB

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