instance_metadata_test.go 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. package providers
  2. import (
  3. "net/http"
  4. "net/http/httptest"
  5. "strings"
  6. "testing"
  7. "github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
  8. "github.com/stretchr/testify/assert"
  9. )
  10. func TestInstanceMetadataProvider_Retrieve_Success(t *testing.T) {
  11. // Start a test server locally.
  12. ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  13. body := "unsupported path: " + r.URL.Path
  14. status := 500
  15. switch r.URL.Path {
  16. case "/latest/meta-data/ram/security-credentials/":
  17. body = "ELK"
  18. status = 200
  19. case "/latest/meta-data/ram/security-credentials/ELK":
  20. body = ` {
  21. "AccessKeyId" : "STS.L4aBSCSJVMuKg5U1vFDw",
  22. "AccessKeySecret" : "wyLTSmsyPGP1ohvvw8xYgB29dlGI8KMiH2pKCNZ9",
  23. "Expiration" : "2018-08-20T22:30:02Z",
  24. "SecurityToken" : "CAESrAIIARKAAShQquMnLIlbvEcIxO6wCoqJufs8sWwieUxu45hS9AvKNEte8KRUWiJWJ6Y+YHAPgNwi7yfRecMFydL2uPOgBI7LDio0RkbYLmJfIxHM2nGBPdml7kYEOXmJp2aDhbvvwVYIyt/8iES/R6N208wQh0Pk2bu+/9dvalp6wOHF4gkFGhhTVFMuTDRhQlNDU0pWTXVLZzVVMXZGRHciBTQzMjc0KgVhbGljZTCpnJjwySk6BlJzYU1ENUJuCgExGmkKBUFsbG93Eh8KDEFjdGlvbkVxdWFscxIGQWN0aW9uGgcKBW9zczoqEj8KDlJlc291cmNlRXF1YWxzEghSZXNvdXJjZRojCiFhY3M6b3NzOio6NDMyNzQ6c2FtcGxlYm94L2FsaWNlLyo=",
  25. "LastUpdated" : "2018-08-20T16:30:01Z",
  26. "Code" : "Success"
  27. }`
  28. status = 200
  29. }
  30. w.WriteHeader(status)
  31. w.Write([]byte(body))
  32. }))
  33. defer ts.Close()
  34. // Update our securityCredURL to point at our local test server.
  35. originalSecurityCredURL := securityCredURL
  36. securityCredURL = strings.Replace(securityCredURL, "http://100.100.100.200", ts.URL, -1)
  37. defer func() {
  38. securityCredURL = originalSecurityCredURL
  39. }()
  40. credential, err := NewInstanceMetadataProvider().Retrieve()
  41. assert.Nil(t, err)
  42. stsTokenCredential, ok := credential.(*credentials.StsTokenCredential)
  43. assert.True(t, ok)
  44. assert.Equal(t, "STS.L4aBSCSJVMuKg5U1vFDw", stsTokenCredential.AccessKeyId)
  45. assert.Equal(t, "wyLTSmsyPGP1ohvvw8xYgB29dlGI8KMiH2pKCNZ9", stsTokenCredential.AccessKeySecret)
  46. assert.True(t, strings.HasPrefix(stsTokenCredential.AccessKeyStsToken, "CAESrAIIARKAA"))
  47. }
  48. func TestInstanceMetadataProvider_Retrieve_Fail1(t *testing.T) {
  49. // Update our securityCredURL to point at our local test server.
  50. originalSecurityCredURL := securityCredURL
  51. securityCredURL = strings.Replace(securityCredURL, "http://100.100.100.200", "http://invalid-domain-xxx", -1)
  52. defer func() {
  53. securityCredURL = originalSecurityCredURL
  54. }()
  55. _, err := NewInstanceMetadataProvider().Retrieve()
  56. assert.NotNil(t, err)
  57. message := err.Error()
  58. assert.True(t, strings.HasSuffix(message, "no such host"))
  59. }
  60. func TestInstanceMetadataProvider_Retrieve_Fail2(t *testing.T) {
  61. // Start a test server locally.
  62. ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  63. var body string
  64. var status int
  65. switch r.URL.Path {
  66. case "/latest/meta-data/ram/security-credentials/":
  67. body = "ELK"
  68. status = 400
  69. }
  70. w.WriteHeader(status)
  71. w.Write([]byte(body))
  72. }))
  73. defer ts.Close()
  74. // Update our securityCredURL to point at our local test server.
  75. originalSecurityCredURL := securityCredURL
  76. securityCredURL = strings.Replace(securityCredURL, "http://100.100.100.200", ts.URL, -1)
  77. defer func() {
  78. securityCredURL = originalSecurityCredURL
  79. }()
  80. _, err := NewInstanceMetadataProvider().Retrieve()
  81. assert.NotNil(t, err)
  82. assert.Equal(t, "received 400 getting role name: ELK", err.Error())
  83. }
  84. func TestInstanceMetadataProvider_Retrieve_Fail3(t *testing.T) {
  85. // Start a test server locally.
  86. ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  87. var body string
  88. var status int
  89. switch r.URL.Path {
  90. case "/latest/meta-data/ram/security-credentials/":
  91. body = ""
  92. status = 200
  93. }
  94. w.WriteHeader(status)
  95. w.Write([]byte(body))
  96. }))
  97. defer ts.Close()
  98. // Update our securityCredURL to point at our local test server.
  99. originalSecurityCredURL := securityCredURL
  100. securityCredURL = strings.Replace(securityCredURL, "http://100.100.100.200", ts.URL, -1)
  101. defer func() {
  102. securityCredURL = originalSecurityCredURL
  103. }()
  104. _, err := NewInstanceMetadataProvider().Retrieve()
  105. assert.NotNil(t, err)
  106. assert.Equal(t, "unable to retrieve role name, it may be unset", err.Error())
  107. }
  108. func TestInstanceMetadataProvider_Retrieve_Fail4(t *testing.T) {
  109. // Start a test server locally.
  110. ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  111. var body string
  112. var status int
  113. switch r.URL.Path {
  114. case "/latest/meta-data/ram/security-credentials/":
  115. body = "ELK"
  116. status = 200
  117. case "/latest/meta-data/ram/security-credentials/ELK":
  118. body = ``
  119. status = 404
  120. }
  121. w.WriteHeader(status)
  122. w.Write([]byte(body))
  123. }))
  124. defer ts.Close()
  125. // Update our securityCredURL to point at our local test server.
  126. originalSecurityCredURL := securityCredURL
  127. securityCredURL = strings.Replace(securityCredURL, "http://100.100.100.200", ts.URL, -1)
  128. defer func() {
  129. securityCredURL = originalSecurityCredURL
  130. }()
  131. _, err := NewInstanceMetadataProvider().Retrieve()
  132. assert.NotNil(t, err)
  133. assert.Equal(t, "received 404 getting security credentials for ELK", err.Error())
  134. }
  135. func TestInstanceMetadataProvider_Retrieve_Fail5(t *testing.T) {
  136. // Start a test server locally.
  137. ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  138. var body string
  139. var status int
  140. switch r.URL.Path {
  141. case "/latest/meta-data/ram/security-credentials/":
  142. body = "ELK"
  143. status = 200
  144. case "/latest/meta-data/ram/security-credentials/ELK":
  145. body = `invalid json`
  146. status = 200
  147. }
  148. w.WriteHeader(status)
  149. w.Write([]byte(body))
  150. }))
  151. defer ts.Close()
  152. // Update our securityCredURL to point at our local test server.
  153. originalSecurityCredURL := securityCredURL
  154. securityCredURL = strings.Replace(securityCredURL, "http://100.100.100.200", ts.URL, -1)
  155. defer func() {
  156. securityCredURL = originalSecurityCredURL
  157. }()
  158. _, err := NewInstanceMetadataProvider().Retrieve()
  159. assert.NotNil(t, err)
  160. assert.Equal(t, "invalid character 'i' looking for beginning of value", err.Error())
  161. }
  162. func mockServer(json string) (server *httptest.Server) {
  163. // Start a test server locally.
  164. ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  165. var body string
  166. var status int
  167. switch r.URL.Path {
  168. case "/latest/meta-data/ram/security-credentials/":
  169. body = "ELK"
  170. status = 200
  171. case "/latest/meta-data/ram/security-credentials/ELK":
  172. body = json
  173. status = 200
  174. }
  175. w.WriteHeader(status)
  176. w.Write([]byte(body))
  177. }))
  178. return ts
  179. }
  180. func test(t *testing.T, input, expected string) {
  181. // Start a test server locally.
  182. ts := mockServer(input)
  183. defer ts.Close()
  184. // Update our securityCredURL to point at our local test server.
  185. originalSecurityCredURL := securityCredURL
  186. securityCredURL = strings.Replace(securityCredURL, "http://100.100.100.200", ts.URL, -1)
  187. defer func() {
  188. securityCredURL = originalSecurityCredURL
  189. }()
  190. _, err := NewInstanceMetadataProvider().Retrieve()
  191. assert.NotNil(t, err)
  192. assert.Equal(t, expected, err.Error())
  193. }
  194. func TestInstanceMetadataProvider_Retrieve_Fail6(t *testing.T) {
  195. test(t, `{}`, "AccessKeyId not in map")
  196. test(t, `{"AccessKeyId":true}`,
  197. "AccessKeyId is not a string in map")
  198. test(t, `{"AccessKeyId":"access key id"}`,
  199. "AccessKeySecret not in map")
  200. test(t, `{"AccessKeyId":"access key id", "AccessKeySecret":true}`,
  201. "AccessKeySecret is not a string in map")
  202. test(t, `{"AccessKeyId":"access key id", "AccessKeySecret":"secret"}`,
  203. "SecurityToken not in map")
  204. test(t, `{"AccessKeyId":"access key id", "AccessKeySecret":"secret","SecurityToken":true}`,
  205. "SecurityToken is not a string in map")
  206. }