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.
 
 
 

309 regels
8.8 KiB

  1. package elb_test
  2. import (
  3. "flag"
  4. "github.com/goamz/goamz/aws"
  5. "github.com/goamz/goamz/ec2"
  6. "github.com/goamz/goamz/elb"
  7. . "gopkg.in/check.v1"
  8. )
  9. var amazon = flag.Bool("amazon", false, "Enable tests against amazon server")
  10. // AmazonServer represents an Amazon AWS server.
  11. type AmazonServer struct {
  12. auth aws.Auth
  13. }
  14. func (s *AmazonServer) SetUp(c *C) {
  15. auth, err := aws.EnvAuth()
  16. if err != nil {
  17. c.Fatal(err)
  18. }
  19. s.auth = auth
  20. }
  21. var _ = Suite(&AmazonClientSuite{})
  22. // AmazonClientSuite tests the client against a live AWS server.
  23. type AmazonClientSuite struct {
  24. srv AmazonServer
  25. ClientTests
  26. }
  27. // ClientTests defines integration tests designed to test the client.
  28. // It is not used as a test suite in itself, but embedded within
  29. // another type.
  30. type ClientTests struct {
  31. elb *elb.ELB
  32. ec2 *ec2.EC2
  33. }
  34. func (s *AmazonClientSuite) SetUpSuite(c *C) {
  35. if !*amazon {
  36. c.Skip("AmazonClientSuite tests not enabled")
  37. }
  38. s.srv.SetUp(c)
  39. s.elb = elb.New(s.srv.auth, aws.USEast)
  40. s.ec2 = ec2.New(s.srv.auth, aws.USEast)
  41. }
  42. func (s *ClientTests) TestCreateAndDeleteLoadBalancer(c *C) {
  43. createLBReq := elb.CreateLoadBalancer{
  44. Name: "testlb",
  45. AvailabilityZones: []string{"us-east-1a"},
  46. Listeners: []elb.Listener{
  47. {
  48. InstancePort: 80,
  49. InstanceProtocol: "http",
  50. LoadBalancerPort: 80,
  51. Protocol: "http",
  52. },
  53. },
  54. }
  55. resp, err := s.elb.CreateLoadBalancer(&createLBReq)
  56. c.Assert(err, IsNil)
  57. defer s.elb.DeleteLoadBalancer(createLBReq.Name)
  58. c.Assert(resp.DNSName, Not(Equals), "")
  59. deleteResp, err := s.elb.DeleteLoadBalancer(createLBReq.Name)
  60. c.Assert(err, IsNil)
  61. c.Assert(deleteResp.RequestId, Not(Equals), "")
  62. }
  63. func (s *ClientTests) TestCreateLoadBalancerError(c *C) {
  64. createLBReq := elb.CreateLoadBalancer{
  65. Name: "testlb",
  66. AvailabilityZones: []string{"us-east-1a"},
  67. Subnets: []string{"subnetid-1"},
  68. Listeners: []elb.Listener{
  69. {
  70. InstancePort: 80,
  71. InstanceProtocol: "http",
  72. LoadBalancerPort: 80,
  73. Protocol: "http",
  74. },
  75. },
  76. }
  77. resp, err := s.elb.CreateLoadBalancer(&createLBReq)
  78. c.Assert(resp, IsNil)
  79. c.Assert(err, NotNil)
  80. e, ok := err.(*elb.Error)
  81. c.Assert(ok, Equals, true)
  82. c.Assert(e.Message, Matches, "Only one of .* or .* may be specified")
  83. c.Assert(e.Code, Equals, "ValidationError")
  84. }
  85. func (s *ClientTests) createInstanceAndLB(c *C) (*elb.CreateLoadBalancer, string) {
  86. options := ec2.RunInstancesOptions{
  87. ImageId: "ami-ccf405a5",
  88. InstanceType: "t1.micro",
  89. AvailabilityZone: "us-east-1c",
  90. }
  91. resp1, err := s.ec2.RunInstances(&options)
  92. c.Assert(err, IsNil)
  93. instId := resp1.Instances[0].InstanceId
  94. createLBReq := elb.CreateLoadBalancer{
  95. Name: "testlb",
  96. AvailabilityZones: []string{"us-east-1c"},
  97. Listeners: []elb.Listener{
  98. {
  99. InstancePort: 80,
  100. InstanceProtocol: "http",
  101. LoadBalancerPort: 80,
  102. Protocol: "http",
  103. },
  104. },
  105. }
  106. _, err = s.elb.CreateLoadBalancer(&createLBReq)
  107. c.Assert(err, IsNil)
  108. return &createLBReq, instId
  109. }
  110. // Cost: 0.02 USD
  111. func (s *ClientTests) TestCreateRegisterAndDeregisterInstanceWithLoadBalancer(c *C) {
  112. createLBReq, instId := s.createInstanceAndLB(c)
  113. defer func() {
  114. _, err := s.elb.DeleteLoadBalancer(createLBReq.Name)
  115. c.Check(err, IsNil)
  116. _, err = s.ec2.TerminateInstances([]string{instId})
  117. c.Check(err, IsNil)
  118. }()
  119. resp, err := s.elb.RegisterInstancesWithLoadBalancer([]string{instId}, createLBReq.Name)
  120. c.Assert(err, IsNil)
  121. c.Assert(resp.InstanceIds, DeepEquals, []string{instId})
  122. resp2, err := s.elb.DeregisterInstancesFromLoadBalancer([]string{instId}, createLBReq.Name)
  123. c.Assert(err, IsNil)
  124. c.Assert(resp2, Not(Equals), "")
  125. }
  126. func (s *ClientTests) TestDescribeLoadBalancers(c *C) {
  127. createLBReq := elb.CreateLoadBalancer{
  128. Name: "testlb",
  129. AvailabilityZones: []string{"us-east-1a"},
  130. Listeners: []elb.Listener{
  131. {
  132. InstancePort: 80,
  133. InstanceProtocol: "http",
  134. LoadBalancerPort: 80,
  135. Protocol: "http",
  136. },
  137. },
  138. }
  139. _, err := s.elb.CreateLoadBalancer(&createLBReq)
  140. c.Assert(err, IsNil)
  141. defer func() {
  142. _, err := s.elb.DeleteLoadBalancer(createLBReq.Name)
  143. c.Check(err, IsNil)
  144. }()
  145. resp, err := s.elb.DescribeLoadBalancers()
  146. c.Assert(err, IsNil)
  147. c.Assert(len(resp.LoadBalancerDescriptions) > 0, Equals, true)
  148. c.Assert(resp.LoadBalancerDescriptions[0].AvailabilityZones, DeepEquals, []string{"us-east-1a"})
  149. c.Assert(resp.LoadBalancerDescriptions[0].LoadBalancerName, Equals, "testlb")
  150. c.Assert(resp.LoadBalancerDescriptions[0].Scheme, Equals, "internet-facing")
  151. hc := elb.HealthCheck{
  152. HealthyThreshold: 10,
  153. Interval: 30,
  154. Target: "TCP:80",
  155. Timeout: 5,
  156. UnhealthyThreshold: 2,
  157. }
  158. c.Assert(resp.LoadBalancerDescriptions[0].HealthCheck, DeepEquals, hc)
  159. ld := []elb.ListenerDescription{
  160. {
  161. Listener: elb.Listener{
  162. Protocol: "HTTP",
  163. LoadBalancerPort: 80,
  164. InstanceProtocol: "HTTP",
  165. InstancePort: 80,
  166. },
  167. },
  168. }
  169. c.Assert(resp.LoadBalancerDescriptions[0].ListenerDescriptions, DeepEquals, ld)
  170. ssg := elb.SourceSecurityGroup{
  171. GroupName: "amazon-elb-sg",
  172. OwnerAlias: "amazon-elb",
  173. }
  174. c.Assert(resp.LoadBalancerDescriptions[0].SourceSecurityGroup, DeepEquals, ssg)
  175. }
  176. func (s *ClientTests) TestDescribeLoadBalancersBadRequest(c *C) {
  177. resp, err := s.elb.DescribeLoadBalancers("absentlb")
  178. c.Assert(err, NotNil)
  179. c.Assert(resp, IsNil)
  180. c.Assert(err, ErrorMatches, ".*(LoadBalancerNotFound).*")
  181. }
  182. func (s *ClientTests) TestDescribeInstanceHealth(c *C) {
  183. createLBReq, instId := s.createInstanceAndLB(c)
  184. defer func() {
  185. _, err := s.elb.DeleteLoadBalancer(createLBReq.Name)
  186. c.Check(err, IsNil)
  187. _, err = s.ec2.TerminateInstances([]string{instId})
  188. c.Check(err, IsNil)
  189. }()
  190. _, err := s.elb.RegisterInstancesWithLoadBalancer([]string{instId}, createLBReq.Name)
  191. c.Assert(err, IsNil)
  192. resp, err := s.elb.DescribeInstanceHealth(createLBReq.Name, instId)
  193. c.Assert(err, IsNil)
  194. c.Assert(len(resp.InstanceStates) > 0, Equals, true)
  195. c.Assert(resp.InstanceStates[0].Description, Equals, "Instance is in pending state.")
  196. c.Assert(resp.InstanceStates[0].InstanceId, Equals, instId)
  197. c.Assert(resp.InstanceStates[0].State, Equals, "OutOfService")
  198. c.Assert(resp.InstanceStates[0].ReasonCode, Equals, "Instance")
  199. }
  200. func (s *ClientTests) TestDescribeInstanceHealthBadRequest(c *C) {
  201. createLBReq := elb.CreateLoadBalancer{
  202. Name: "testlb",
  203. AvailabilityZones: []string{"us-east-1a"},
  204. Listeners: []elb.Listener{
  205. {
  206. InstancePort: 80,
  207. InstanceProtocol: "http",
  208. LoadBalancerPort: 80,
  209. Protocol: "http",
  210. },
  211. },
  212. }
  213. _, err := s.elb.CreateLoadBalancer(&createLBReq)
  214. c.Assert(err, IsNil)
  215. defer func() {
  216. _, err := s.elb.DeleteLoadBalancer(createLBReq.Name)
  217. c.Check(err, IsNil)
  218. }()
  219. resp, err := s.elb.DescribeInstanceHealth(createLBReq.Name, "i-foo")
  220. c.Assert(resp, IsNil)
  221. c.Assert(err, NotNil)
  222. c.Assert(err, ErrorMatches, ".*i-foo.*(InvalidInstance).*")
  223. }
  224. func (s *ClientTests) TestConfigureHealthCheck(c *C) {
  225. createLBReq := elb.CreateLoadBalancer{
  226. Name: "testlb",
  227. AvailabilityZones: []string{"us-east-1a"},
  228. Listeners: []elb.Listener{
  229. {
  230. InstancePort: 80,
  231. InstanceProtocol: "http",
  232. LoadBalancerPort: 80,
  233. Protocol: "http",
  234. },
  235. },
  236. }
  237. _, err := s.elb.CreateLoadBalancer(&createLBReq)
  238. c.Assert(err, IsNil)
  239. defer func() {
  240. _, err := s.elb.DeleteLoadBalancer(createLBReq.Name)
  241. c.Check(err, IsNil)
  242. }()
  243. hc := elb.HealthCheck{
  244. HealthyThreshold: 10,
  245. Interval: 30,
  246. Target: "HTTP:80/",
  247. Timeout: 5,
  248. UnhealthyThreshold: 2,
  249. }
  250. resp, err := s.elb.ConfigureHealthCheck(createLBReq.Name, &hc)
  251. c.Assert(err, IsNil)
  252. c.Assert(resp.HealthCheck.HealthyThreshold, Equals, 10)
  253. c.Assert(resp.HealthCheck.Interval, Equals, 30)
  254. c.Assert(resp.HealthCheck.Target, Equals, "HTTP:80/")
  255. c.Assert(resp.HealthCheck.Timeout, Equals, 5)
  256. c.Assert(resp.HealthCheck.UnhealthyThreshold, Equals, 2)
  257. }
  258. func (s *ClientTests) TestConfigureHealthCheckBadRequest(c *C) {
  259. createLBReq := elb.CreateLoadBalancer{
  260. Name: "testlb",
  261. AvailabilityZones: []string{"us-east-1a"},
  262. Listeners: []elb.Listener{
  263. {
  264. InstancePort: 80,
  265. InstanceProtocol: "http",
  266. LoadBalancerPort: 80,
  267. Protocol: "http",
  268. },
  269. },
  270. }
  271. _, err := s.elb.CreateLoadBalancer(&createLBReq)
  272. c.Assert(err, IsNil)
  273. defer func() {
  274. _, err := s.elb.DeleteLoadBalancer(createLBReq.Name)
  275. c.Check(err, IsNil)
  276. }()
  277. hc := elb.HealthCheck{
  278. HealthyThreshold: 10,
  279. Interval: 30,
  280. Target: "HTTP:80",
  281. Timeout: 5,
  282. UnhealthyThreshold: 2,
  283. }
  284. resp, err := s.elb.ConfigureHealthCheck(createLBReq.Name, &hc)
  285. c.Assert(resp, IsNil)
  286. c.Assert(err, NotNil)
  287. expected := "HealthCheck HTTP Target must specify a port followed by a path that begins with a slash. e.g. HTTP:80/ping/this/path (ValidationError)"
  288. c.Assert(err.Error(), Equals, expected)
  289. }