You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

370 lines
14 KiB

  1. package elb_test
  2. import (
  3. "time"
  4. "github.com/goamz/goamz/aws"
  5. "github.com/goamz/goamz/elb"
  6. . "gopkg.in/check.v1"
  7. )
  8. type S struct {
  9. HTTPSuite
  10. elb *elb.ELB
  11. }
  12. var _ = Suite(&S{})
  13. func (s *S) SetUpSuite(c *C) {
  14. s.HTTPSuite.SetUpSuite(c)
  15. auth := aws.Auth{AccessKey: "abc", SecretKey: "123"}
  16. s.elb = elb.New(auth, aws.Region{ELBEndpoint: testServer.URL})
  17. }
  18. func (s *S) TestCreateLoadBalancer(c *C) {
  19. testServer.PrepareResponse(200, nil, CreateLoadBalancer)
  20. createLB := &elb.CreateLoadBalancer{
  21. Name: "testlb",
  22. AvailabilityZones: []string{"us-east-1a", "us-east-1b"},
  23. Listeners: []elb.Listener{
  24. {
  25. InstancePort: 80,
  26. InstanceProtocol: "http",
  27. Protocol: "http",
  28. LoadBalancerPort: 80,
  29. },
  30. },
  31. }
  32. resp, err := s.elb.CreateLoadBalancer(createLB)
  33. c.Assert(err, IsNil)
  34. defer s.elb.DeleteLoadBalancer(createLB.Name)
  35. values := testServer.WaitRequest().URL.Query()
  36. c.Assert(values.Get("Version"), Equals, "2012-06-01")
  37. c.Assert(values.Get("Action"), Equals, "CreateLoadBalancer")
  38. c.Assert(values.Get("Timestamp"), Not(Equals), "")
  39. c.Assert(values.Get("LoadBalancerName"), Equals, "testlb")
  40. c.Assert(values.Get("AvailabilityZones.member.1"), Equals, "us-east-1a")
  41. c.Assert(values.Get("AvailabilityZones.member.2"), Equals, "us-east-1b")
  42. c.Assert(values.Get("Listeners.member.1.InstancePort"), Equals, "80")
  43. c.Assert(values.Get("Listeners.member.1.InstanceProtocol"), Equals, "http")
  44. c.Assert(values.Get("Listeners.member.1.Protocol"), Equals, "http")
  45. c.Assert(values.Get("Listeners.member.1.LoadBalancerPort"), Equals, "80")
  46. c.Assert(resp.DNSName, Equals, "testlb-339187009.us-east-1.elb.amazonaws.com")
  47. }
  48. func (s *S) TestCreateLoadBalancerWithSubnetsAndMoreListeners(c *C) {
  49. testServer.PrepareResponse(200, nil, CreateLoadBalancer)
  50. createLB := &elb.CreateLoadBalancer{
  51. Name: "testlb",
  52. Listeners: []elb.Listener{
  53. {
  54. InstancePort: 80,
  55. InstanceProtocol: "http",
  56. Protocol: "http",
  57. LoadBalancerPort: 80,
  58. },
  59. {
  60. InstancePort: 8080,
  61. InstanceProtocol: "http",
  62. Protocol: "http",
  63. LoadBalancerPort: 8080,
  64. },
  65. },
  66. Subnets: []string{"subnetid-1", "subnetid-2"},
  67. SecurityGroups: []string{"sg-1", "sg-2"},
  68. }
  69. _, err := s.elb.CreateLoadBalancer(createLB)
  70. c.Assert(err, IsNil)
  71. defer s.elb.DeleteLoadBalancer(createLB.Name)
  72. values := testServer.WaitRequest().URL.Query()
  73. c.Assert(values.Get("Listeners.member.1.InstancePort"), Equals, "80")
  74. c.Assert(values.Get("Listeners.member.1.LoadBalancerPort"), Equals, "80")
  75. c.Assert(values.Get("Listeners.member.2.InstancePort"), Equals, "8080")
  76. c.Assert(values.Get("Listeners.member.2.LoadBalancerPort"), Equals, "8080")
  77. c.Assert(values.Get("Subnets.member.1"), Equals, "subnetid-1")
  78. c.Assert(values.Get("Subnets.member.2"), Equals, "subnetid-2")
  79. c.Assert(values.Get("SecurityGroups.member.1"), Equals, "sg-1")
  80. c.Assert(values.Get("SecurityGroups.member.2"), Equals, "sg-2")
  81. }
  82. func (s *S) TestCreateLoadBalancerWithWrongParamsCombination(c *C) {
  83. testServer.PrepareResponse(400, nil, CreateLoadBalancerBadRequest)
  84. createLB := &elb.CreateLoadBalancer{
  85. Name: "testlb",
  86. AvailabilityZones: []string{"us-east-1a", "us-east-1b"},
  87. Listeners: []elb.Listener{
  88. {
  89. InstancePort: 80,
  90. InstanceProtocol: "http",
  91. Protocol: "http",
  92. LoadBalancerPort: 80,
  93. },
  94. },
  95. Subnets: []string{"subnetid-1", "subnetid2"},
  96. }
  97. resp, err := s.elb.CreateLoadBalancer(createLB)
  98. c.Assert(resp, IsNil)
  99. c.Assert(err, NotNil)
  100. e, ok := err.(*elb.Error)
  101. c.Assert(ok, Equals, true)
  102. c.Assert(e.Message, Equals, "Only one of SubnetIds or AvailabilityZones may be specified")
  103. c.Assert(e.Code, Equals, "ValidationError")
  104. }
  105. func (s *S) TestDeleteLoadBalancer(c *C) {
  106. testServer.PrepareResponse(200, nil, DeleteLoadBalancer)
  107. resp, err := s.elb.DeleteLoadBalancer("testlb")
  108. c.Assert(err, IsNil)
  109. values := testServer.WaitRequest().URL.Query()
  110. c.Assert(values.Get("Version"), Equals, "2012-06-01")
  111. c.Assert(values.Get("Timestamp"), Not(Equals), "")
  112. c.Assert(values.Get("Action"), Equals, "DeleteLoadBalancer")
  113. c.Assert(values.Get("LoadBalancerName"), Equals, "testlb")
  114. c.Assert(resp.RequestId, Equals, "8d7223db-49d7-11e2-bba9-35ba56032fe1")
  115. }
  116. func (s *S) TestRegisterInstancesWithLoadBalancer(c *C) {
  117. testServer.PrepareResponse(200, nil, RegisterInstancesWithLoadBalancer)
  118. resp, err := s.elb.RegisterInstancesWithLoadBalancer([]string{"i-b44db8ca", "i-461ecf38"}, "testlb")
  119. c.Assert(err, IsNil)
  120. values := testServer.WaitRequest().URL.Query()
  121. c.Assert(values.Get("Version"), Equals, "2012-06-01")
  122. c.Assert(values.Get("Timestamp"), Not(Equals), "")
  123. c.Assert(values.Get("Action"), Equals, "RegisterInstancesWithLoadBalancer")
  124. c.Assert(values.Get("LoadBalancerName"), Equals, "testlb")
  125. c.Assert(values.Get("Instances.member.1.InstanceId"), Equals, "i-b44db8ca")
  126. c.Assert(values.Get("Instances.member.2.InstanceId"), Equals, "i-461ecf38")
  127. c.Assert(resp.InstanceIds, DeepEquals, []string{"i-b44db8ca", "i-461ecf38"})
  128. }
  129. func (s *S) TestRegisterInstancesWithLoadBalancerBadRequest(c *C) {
  130. testServer.PrepareResponse(400, nil, RegisterInstancesWithLoadBalancerBadRequest)
  131. resp, err := s.elb.RegisterInstancesWithLoadBalancer([]string{"i-b44db8ca", "i-461ecf38"}, "absentLB")
  132. c.Assert(resp, IsNil)
  133. c.Assert(err, NotNil)
  134. e, ok := err.(*elb.Error)
  135. c.Assert(ok, Equals, true)
  136. c.Assert(e.Message, Equals, "There is no ACTIVE Load Balancer named 'absentLB'")
  137. c.Assert(e.Code, Equals, "LoadBalancerNotFound")
  138. }
  139. func (s *S) TestDeregisterInstancesFromLoadBalancer(c *C) {
  140. testServer.PrepareResponse(200, nil, DeregisterInstancesFromLoadBalancer)
  141. resp, err := s.elb.DeregisterInstancesFromLoadBalancer([]string{"i-b44db8ca", "i-461ecf38"}, "testlb")
  142. c.Assert(err, IsNil)
  143. values := testServer.WaitRequest().URL.Query()
  144. c.Assert(values.Get("Version"), Equals, "2012-06-01")
  145. c.Assert(values.Get("Timestamp"), Not(Equals), "")
  146. c.Assert(values.Get("Action"), Equals, "DeregisterInstancesFromLoadBalancer")
  147. c.Assert(values.Get("LoadBalancerName"), Equals, "testlb")
  148. c.Assert(values.Get("Instances.member.1.InstanceId"), Equals, "i-b44db8ca")
  149. c.Assert(values.Get("Instances.member.2.InstanceId"), Equals, "i-461ecf38")
  150. c.Assert(resp.RequestId, Equals, "d6490837-49fd-11e2-bba9-35ba56032fe1")
  151. }
  152. func (s *S) TestDeregisterInstancesFromLoadBalancerBadRequest(c *C) {
  153. testServer.PrepareResponse(400, nil, DeregisterInstancesFromLoadBalancerBadRequest)
  154. resp, err := s.elb.DeregisterInstancesFromLoadBalancer([]string{"i-b44db8ca", "i-461ecf38"}, "testlb")
  155. c.Assert(resp, IsNil)
  156. c.Assert(err, NotNil)
  157. e, ok := err.(*elb.Error)
  158. c.Assert(ok, Equals, true)
  159. c.Assert(e.Message, Equals, "There is no ACTIVE Load Balancer named 'absentlb'")
  160. c.Assert(e.Code, Equals, "LoadBalancerNotFound")
  161. }
  162. func (s *S) TestDescribeLoadBalancers(c *C) {
  163. testServer.PrepareResponse(200, nil, DescribeLoadBalancers)
  164. resp, err := s.elb.DescribeLoadBalancers()
  165. c.Assert(err, IsNil)
  166. values := testServer.WaitRequest().URL.Query()
  167. c.Assert(values.Get("Version"), Equals, "2012-06-01")
  168. c.Assert(values.Get("Timestamp"), Not(Equals), "")
  169. c.Assert(values.Get("Action"), Equals, "DescribeLoadBalancers")
  170. t, _ := time.Parse(time.RFC3339, "2012-12-27T11:51:52.970Z")
  171. expected := &elb.DescribeLoadBalancerResp{
  172. []elb.LoadBalancerDescription{
  173. {
  174. AvailabilityZones: []string{"us-east-1a"},
  175. BackendServerDescriptions: []elb.BackendServerDescriptions(nil),
  176. CanonicalHostedZoneName: "testlb-2087227216.us-east-1.elb.amazonaws.com",
  177. CanonicalHostedZoneNameId: "Z3DZXE0Q79N41H",
  178. CreatedTime: t,
  179. DNSName: "testlb-2087227216.us-east-1.elb.amazonaws.com",
  180. HealthCheck: elb.HealthCheck{
  181. HealthyThreshold: 10,
  182. Interval: 30,
  183. Target: "TCP:80",
  184. Timeout: 5,
  185. UnhealthyThreshold: 2,
  186. },
  187. Instances: []elb.Instance(nil),
  188. ListenerDescriptions: []elb.ListenerDescription{
  189. {
  190. Listener: elb.Listener{
  191. Protocol: "HTTP",
  192. LoadBalancerPort: 80,
  193. InstanceProtocol: "HTTP",
  194. InstancePort: 80,
  195. },
  196. },
  197. },
  198. LoadBalancerName: "testlb",
  199. //Policies: elb.Policies(nil),
  200. Scheme: "internet-facing",
  201. SecurityGroups: []string(nil),
  202. SourceSecurityGroup: elb.SourceSecurityGroup{
  203. GroupName: "amazon-elb-sg",
  204. OwnerAlias: "amazon-elb",
  205. },
  206. Subnets: []string(nil),
  207. },
  208. },
  209. }
  210. c.Assert(resp, DeepEquals, expected)
  211. }
  212. func (s *S) TestDescribeLoadBalancersByName(c *C) {
  213. testServer.PrepareResponse(200, nil, DescribeLoadBalancers)
  214. s.elb.DescribeLoadBalancers("somelb")
  215. values := testServer.WaitRequest().URL.Query()
  216. c.Assert(values.Get("Version"), Equals, "2012-06-01")
  217. c.Assert(values.Get("Timestamp"), Not(Equals), "")
  218. c.Assert(values.Get("Action"), Equals, "DescribeLoadBalancers")
  219. c.Assert(values.Get("LoadBalancerNames.member.1"), Equals, "somelb")
  220. }
  221. func (s *S) TestDescribeLoadBalancersBadRequest(c *C) {
  222. testServer.PrepareResponse(400, nil, DescribeLoadBalancersBadRequest)
  223. resp, err := s.elb.DescribeLoadBalancers()
  224. c.Assert(resp, IsNil)
  225. c.Assert(err, NotNil)
  226. c.Assert(err, ErrorMatches, `^Cannot find Load Balancer absentlb \(LoadBalancerNotFound\)$`)
  227. }
  228. func (s *S) TestDescribeInstanceHealth(c *C) {
  229. testServer.PrepareResponse(200, nil, DescribeInstanceHealth)
  230. resp, err := s.elb.DescribeInstanceHealth("testlb", "i-b44db8ca")
  231. c.Assert(err, IsNil)
  232. values := testServer.WaitRequest().URL.Query()
  233. c.Assert(values.Get("Version"), Equals, "2012-06-01")
  234. c.Assert(values.Get("Timestamp"), Not(Equals), "")
  235. c.Assert(values.Get("Action"), Equals, "DescribeInstanceHealth")
  236. c.Assert(values.Get("LoadBalancerName"), Equals, "testlb")
  237. c.Assert(values.Get("Instances.member.1.InstanceId"), Equals, "i-b44db8ca")
  238. c.Assert(len(resp.InstanceStates) > 0, Equals, true)
  239. c.Assert(resp.InstanceStates[0].Description, Equals, "Instance registration is still in progress.")
  240. c.Assert(resp.InstanceStates[0].InstanceId, Equals, "i-b44db8ca")
  241. c.Assert(resp.InstanceStates[0].State, Equals, "OutOfService")
  242. c.Assert(resp.InstanceStates[0].ReasonCode, Equals, "ELB")
  243. }
  244. func (s *S) TestDescribeInstanceHealthBadRequest(c *C) {
  245. testServer.PrepareResponse(400, nil, DescribeInstanceHealthBadRequest)
  246. resp, err := s.elb.DescribeInstanceHealth("testlb", "i-foooo")
  247. c.Assert(err, NotNil)
  248. c.Assert(resp, IsNil)
  249. c.Assert(err, ErrorMatches, ".*i-foooo.*(InvalidInstance).*")
  250. }
  251. func (s *S) TestConfigureHealthCheck(c *C) {
  252. testServer.PrepareResponse(200, nil, ConfigureHealthCheck)
  253. hc := elb.HealthCheck{
  254. HealthyThreshold: 10,
  255. Interval: 30,
  256. Target: "HTTP:80/",
  257. Timeout: 5,
  258. UnhealthyThreshold: 2,
  259. }
  260. resp, err := s.elb.ConfigureHealthCheck("testlb", &hc)
  261. c.Assert(err, IsNil)
  262. values := testServer.WaitRequest().URL.Query()
  263. c.Assert(values.Get("Version"), Equals, "2012-06-01")
  264. c.Assert(values.Get("Timestamp"), Not(Equals), "")
  265. c.Assert(values.Get("Action"), Equals, "ConfigureHealthCheck")
  266. c.Assert(values.Get("LoadBalancerName"), Equals, "testlb")
  267. c.Assert(values.Get("HealthCheck.HealthyThreshold"), Equals, "10")
  268. c.Assert(values.Get("HealthCheck.Interval"), Equals, "30")
  269. c.Assert(values.Get("HealthCheck.Target"), Equals, "HTTP:80/")
  270. c.Assert(values.Get("HealthCheck.Timeout"), Equals, "5")
  271. c.Assert(values.Get("HealthCheck.UnhealthyThreshold"), Equals, "2")
  272. c.Assert(resp.HealthCheck.HealthyThreshold, Equals, 10)
  273. c.Assert(resp.HealthCheck.Interval, Equals, 30)
  274. c.Assert(resp.HealthCheck.Target, Equals, "HTTP:80/")
  275. c.Assert(resp.HealthCheck.Timeout, Equals, 5)
  276. c.Assert(resp.HealthCheck.UnhealthyThreshold, Equals, 2)
  277. }
  278. func (s *S) TestConfigureHealthCheckBadRequest(c *C) {
  279. testServer.PrepareResponse(400, nil, ConfigureHealthCheckBadRequest)
  280. hc := elb.HealthCheck{
  281. HealthyThreshold: 10,
  282. Interval: 30,
  283. Target: "HTTP:80/",
  284. Timeout: 5,
  285. UnhealthyThreshold: 2,
  286. }
  287. resp, err := s.elb.ConfigureHealthCheck("foolb", &hc)
  288. c.Assert(resp, IsNil)
  289. c.Assert(err, NotNil)
  290. c.Assert(err, ErrorMatches, ".*foolb.*(LoadBalancerNotFound).*")
  291. }
  292. func (s *S) TestAddTags(c *C) {
  293. testServer.PrepareResponse(200, nil, AddTagsSuccessResponse)
  294. tagsToAdd := map[string]string{
  295. "my-key": "my-value",
  296. "my-super-silly-tag": "its-another-valid-value",
  297. }
  298. resp, err := s.elb.AddTags("my-elb", tagsToAdd)
  299. c.Assert(err, IsNil)
  300. values := testServer.WaitRequest().URL.Query()
  301. c.Assert(values.Get("Version"), Equals, "2012-06-01")
  302. c.Assert(values.Get("Action"), Equals, "AddTags")
  303. c.Assert(values.Get("Timestamp"), Not(Equals), "")
  304. c.Assert(values.Get("LoadBalancerNames.member.1"), Equals, "my-elb")
  305. c.Assert(values.Get("Tags.member.1.Key"), Equals, "my-super-silly-tag")
  306. c.Assert(values.Get("Tags.member.1.Value"), Equals, "its-another-valid-value")
  307. c.Assert(values.Get("Tags.member.2.Key"), Equals, "my-key")
  308. c.Assert(values.Get("Tags.member.2.Value"), Equals, "my-value")
  309. c.Assert(resp.RequestId, Equals, "360e81f7-1100-11e4-b6ed-0f30SOME-SAUCY-EXAMPLE")
  310. }
  311. func (s *S) TestAddBadTags(c *C) {
  312. testServer.PrepareResponse(400, nil, TagsBadRequest)
  313. tagsToAdd := map[string]string{
  314. "my-first-key": "an invalid value",
  315. }
  316. resp, err := s.elb.AddTags("my-bad-elb", tagsToAdd)
  317. c.Assert(resp, IsNil)
  318. c.Assert(err, ErrorMatches, ".*(InvalidParameterValue).*")
  319. }
  320. func (s *S) TestRemoveTags(c *C) {
  321. testServer.PrepareResponse(200, nil, RemoveTagsSuccessResponse)
  322. tagKeysToRemove := []string{"a-key-one", "a-key-two"}
  323. resp, err := s.elb.RemoveTags("my-test-elb-1", tagKeysToRemove)
  324. c.Assert(err, IsNil)
  325. values := testServer.WaitRequest().URL.Query()
  326. c.Assert(values.Get("Version"), Equals, "2012-06-01")
  327. c.Assert(values.Get("Action"), Equals, "RemoveTags")
  328. c.Assert(values.Get("Timestamp"), Not(Equals), "")
  329. c.Assert(values.Get("LoadBalancerNames.member.1"), Equals, "my-test-elb-1")
  330. c.Assert([]string{values.Get("Tags.member.1.Key"), values.Get("Tags.member.2.Key")}, DeepEquals, tagKeysToRemove)
  331. c.Assert(resp.RequestId, Equals, "83c88b9d-12b7-11e3-8b82-87b12DIFFEXAMPLE")
  332. }
  333. func (s *S) TestRemoveTagsFailure(c *C) {
  334. testServer.PrepareResponse(400, nil, TagsBadRequest)
  335. resp, err := s.elb.RemoveTags("my-test-elb", []string{"non-existant-tag"})
  336. c.Assert(resp, IsNil)
  337. c.Assert(err, ErrorMatches, ".*(InvalidParameterValue).*")
  338. }