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.
 
 
 

1281 lines
50 KiB

  1. package ec2_test
  2. import (
  3. "testing"
  4. "github.com/goamz/goamz/aws"
  5. "github.com/goamz/goamz/ec2"
  6. "github.com/goamz/goamz/testutil"
  7. . "gopkg.in/check.v1"
  8. )
  9. func Test(t *testing.T) {
  10. TestingT(t)
  11. }
  12. var _ = Suite(&S{})
  13. type S struct {
  14. ec2 *ec2.EC2
  15. }
  16. var testServer = testutil.NewHTTPServer()
  17. func (s *S) SetUpSuite(c *C) {
  18. testServer.Start()
  19. auth := aws.Auth{AccessKey: "abc", SecretKey: "123"}
  20. s.ec2 = ec2.NewWithClient(
  21. auth,
  22. aws.Region{EC2Endpoint: testServer.URL},
  23. testutil.DefaultClient,
  24. )
  25. }
  26. func (s *S) TearDownTest(c *C) {
  27. testServer.Flush()
  28. }
  29. func (s *S) TestRunInstancesErrorDump(c *C) {
  30. testServer.Response(400, nil, ErrorDump)
  31. options := ec2.RunInstancesOptions{
  32. ImageId: "ami-a6f504cf", // Ubuntu Maverick, i386, instance store
  33. InstanceType: "t1.micro", // Doesn't work with micro, results in 400.
  34. }
  35. msg := `AMIs with an instance-store root device are not supported for the instance type 't1\.micro'\.`
  36. resp, err := s.ec2.RunInstances(&options)
  37. testServer.WaitRequest()
  38. c.Assert(resp, IsNil)
  39. c.Assert(err, ErrorMatches, msg+` \(UnsupportedOperation\)`)
  40. ec2err, ok := err.(*ec2.Error)
  41. c.Assert(ok, Equals, true)
  42. c.Assert(ec2err.StatusCode, Equals, 400)
  43. c.Assert(ec2err.Code, Equals, "UnsupportedOperation")
  44. c.Assert(ec2err.Message, Matches, msg)
  45. c.Assert(ec2err.RequestId, Equals, "0503f4e9-bbd6-483c-b54f-c4ae9f3b30f4")
  46. }
  47. func (s *S) TestRequestSpotInstancesErrorDump(c *C) {
  48. testServer.Response(400, nil, ErrorDump)
  49. options := ec2.RequestSpotInstances{
  50. SpotPrice: "0.01",
  51. ImageId: "ami-a6f504cf", // Ubuntu Maverick, i386, instance store
  52. InstanceType: "t1.micro", // Doesn't work with micro, results in 400.
  53. }
  54. msg := `AMIs with an instance-store root device are not supported for the instance type 't1\.micro'\.`
  55. resp, err := s.ec2.RequestSpotInstances(&options)
  56. testServer.WaitRequest()
  57. c.Assert(resp, IsNil)
  58. c.Assert(err, ErrorMatches, msg+` \(UnsupportedOperation\)`)
  59. ec2err, ok := err.(*ec2.Error)
  60. c.Assert(ok, Equals, true)
  61. c.Assert(ec2err.StatusCode, Equals, 400)
  62. c.Assert(ec2err.Code, Equals, "UnsupportedOperation")
  63. c.Assert(ec2err.Message, Matches, msg)
  64. c.Assert(ec2err.RequestId, Equals, "0503f4e9-bbd6-483c-b54f-c4ae9f3b30f4")
  65. }
  66. func (s *S) TestRunInstancesErrorWithoutXML(c *C) {
  67. testServer.Responses(5, 500, nil, "")
  68. options := ec2.RunInstancesOptions{ImageId: "image-id"}
  69. resp, err := s.ec2.RunInstances(&options)
  70. testServer.WaitRequest()
  71. c.Assert(resp, IsNil)
  72. c.Assert(err, ErrorMatches, "500 Internal Server Error")
  73. ec2err, ok := err.(*ec2.Error)
  74. c.Assert(ok, Equals, true)
  75. c.Assert(ec2err.StatusCode, Equals, 500)
  76. c.Assert(ec2err.Code, Equals, "")
  77. c.Assert(ec2err.Message, Equals, "500 Internal Server Error")
  78. c.Assert(ec2err.RequestId, Equals, "")
  79. }
  80. func (s *S) TestRequestSpotInstancesErrorWithoutXML(c *C) {
  81. testServer.Responses(5, 500, nil, "")
  82. options := ec2.RequestSpotInstances{SpotPrice: "spot-price", ImageId: "image-id"}
  83. resp, err := s.ec2.RequestSpotInstances(&options)
  84. testServer.WaitRequest()
  85. c.Assert(resp, IsNil)
  86. c.Assert(err, ErrorMatches, "500 Internal Server Error")
  87. ec2err, ok := err.(*ec2.Error)
  88. c.Assert(ok, Equals, true)
  89. c.Assert(ec2err.StatusCode, Equals, 500)
  90. c.Assert(ec2err.Code, Equals, "")
  91. c.Assert(ec2err.Message, Equals, "500 Internal Server Error")
  92. c.Assert(ec2err.RequestId, Equals, "")
  93. }
  94. func (s *S) TestRunInstancesExample(c *C) {
  95. testServer.Response(200, nil, RunInstancesExample)
  96. options := ec2.RunInstancesOptions{
  97. KeyName: "my-keys",
  98. ImageId: "image-id",
  99. InstanceType: "inst-type",
  100. SecurityGroups: []ec2.SecurityGroup{{Name: "g1"}, {Id: "g2"}, {Name: "g3"}, {Id: "g4"}},
  101. UserData: []byte("1234"),
  102. KernelId: "kernel-id",
  103. RamdiskId: "ramdisk-id",
  104. AvailabilityZone: "zone",
  105. PlacementGroupName: "group",
  106. Monitoring: true,
  107. SubnetId: "subnet-id",
  108. DisableAPITermination: true,
  109. ShutdownBehavior: "terminate",
  110. PrivateIPAddress: "10.0.0.25",
  111. BlockDevices: []ec2.BlockDeviceMapping{
  112. {DeviceName: "/dev/sdb", VirtualName: "ephemeral0"},
  113. {DeviceName: "/dev/sdc", SnapshotId: "snap-a08912c9", DeleteOnTermination: true},
  114. },
  115. }
  116. resp, err := s.ec2.RunInstances(&options)
  117. req := testServer.WaitRequest()
  118. c.Assert(req.Form["Action"], DeepEquals, []string{"RunInstances"})
  119. c.Assert(req.Form["ImageId"], DeepEquals, []string{"image-id"})
  120. c.Assert(req.Form["MinCount"], DeepEquals, []string{"1"})
  121. c.Assert(req.Form["MaxCount"], DeepEquals, []string{"1"})
  122. c.Assert(req.Form["KeyName"], DeepEquals, []string{"my-keys"})
  123. c.Assert(req.Form["InstanceType"], DeepEquals, []string{"inst-type"})
  124. c.Assert(req.Form["SecurityGroup.1"], DeepEquals, []string{"g1"})
  125. c.Assert(req.Form["SecurityGroup.2"], DeepEquals, []string{"g3"})
  126. c.Assert(req.Form["SecurityGroupId.1"], DeepEquals, []string{"g2"})
  127. c.Assert(req.Form["SecurityGroupId.2"], DeepEquals, []string{"g4"})
  128. c.Assert(req.Form["UserData"], DeepEquals, []string{"MTIzNA=="})
  129. c.Assert(req.Form["KernelId"], DeepEquals, []string{"kernel-id"})
  130. c.Assert(req.Form["RamdiskId"], DeepEquals, []string{"ramdisk-id"})
  131. c.Assert(req.Form["Placement.AvailabilityZone"], DeepEquals, []string{"zone"})
  132. c.Assert(req.Form["Placement.GroupName"], DeepEquals, []string{"group"})
  133. c.Assert(req.Form["Monitoring.Enabled"], DeepEquals, []string{"true"})
  134. c.Assert(req.Form["SubnetId"], DeepEquals, []string{"subnet-id"})
  135. c.Assert(req.Form["DisableApiTermination"], DeepEquals, []string{"true"})
  136. c.Assert(req.Form["InstanceInitiatedShutdownBehavior"], DeepEquals, []string{"terminate"})
  137. c.Assert(req.Form["PrivateIpAddress"], DeepEquals, []string{"10.0.0.25"})
  138. c.Assert(req.Form["BlockDeviceMapping.1.DeviceName"], DeepEquals, []string{"/dev/sdb"})
  139. c.Assert(req.Form["BlockDeviceMapping.1.VirtualName"], DeepEquals, []string{"ephemeral0"})
  140. c.Assert(req.Form["BlockDeviceMapping.2.Ebs.SnapshotId"], DeepEquals, []string{"snap-a08912c9"})
  141. c.Assert(req.Form["BlockDeviceMapping.2.Ebs.DeleteOnTermination"], DeepEquals, []string{"true"})
  142. c.Assert(err, IsNil)
  143. c.Assert(resp.RequestId, Equals, "59dbff89-35bd-4eac-99ed-be587EXAMPLE")
  144. c.Assert(resp.ReservationId, Equals, "r-47a5402e")
  145. c.Assert(resp.OwnerId, Equals, "999988887777")
  146. c.Assert(resp.SecurityGroups, DeepEquals, []ec2.SecurityGroup{{Name: "default", Id: "sg-67ad940e"}})
  147. c.Assert(resp.Instances, HasLen, 3)
  148. i0 := resp.Instances[0]
  149. c.Assert(i0.InstanceId, Equals, "i-2ba64342")
  150. c.Assert(i0.InstanceType, Equals, "m1.small")
  151. c.Assert(i0.ImageId, Equals, "ami-60a54009")
  152. c.Assert(i0.Monitoring, Equals, "enabled")
  153. c.Assert(i0.KeyName, Equals, "example-key-name")
  154. c.Assert(i0.AMILaunchIndex, Equals, 0)
  155. c.Assert(i0.VirtualizationType, Equals, "paravirtual")
  156. c.Assert(i0.Hypervisor, Equals, "xen")
  157. i1 := resp.Instances[1]
  158. c.Assert(i1.InstanceId, Equals, "i-2bc64242")
  159. c.Assert(i1.InstanceType, Equals, "m1.small")
  160. c.Assert(i1.ImageId, Equals, "ami-60a54009")
  161. c.Assert(i1.Monitoring, Equals, "enabled")
  162. c.Assert(i1.KeyName, Equals, "example-key-name")
  163. c.Assert(i1.AMILaunchIndex, Equals, 1)
  164. c.Assert(i1.VirtualizationType, Equals, "paravirtual")
  165. c.Assert(i1.Hypervisor, Equals, "xen")
  166. i2 := resp.Instances[2]
  167. c.Assert(i2.InstanceId, Equals, "i-2be64332")
  168. c.Assert(i2.InstanceType, Equals, "m1.small")
  169. c.Assert(i2.ImageId, Equals, "ami-60a54009")
  170. c.Assert(i2.Monitoring, Equals, "enabled")
  171. c.Assert(i2.KeyName, Equals, "example-key-name")
  172. c.Assert(i2.AMILaunchIndex, Equals, 2)
  173. c.Assert(i2.VirtualizationType, Equals, "paravirtual")
  174. c.Assert(i2.Hypervisor, Equals, "xen")
  175. }
  176. func (s *S) TestRequestSpotInstancesExample(c *C) {
  177. testServer.Response(200, nil, RequestSpotInstancesExample)
  178. options := ec2.RequestSpotInstances{
  179. SpotPrice: "0.5",
  180. KeyName: "my-keys",
  181. ImageId: "image-id",
  182. InstanceType: "inst-type",
  183. SecurityGroups: []ec2.SecurityGroup{{Name: "g1"}, {Id: "g2"}, {Name: "g3"}, {Id: "g4"}},
  184. UserData: []byte("1234"),
  185. KernelId: "kernel-id",
  186. RamdiskId: "ramdisk-id",
  187. AvailZone: "zone",
  188. PlacementGroupName: "group",
  189. Monitoring: true,
  190. SubnetId: "subnet-id",
  191. PrivateIPAddress: "10.0.0.25",
  192. BlockDevices: []ec2.BlockDeviceMapping{
  193. {DeviceName: "/dev/sdb", VirtualName: "ephemeral0"},
  194. {DeviceName: "/dev/sdc", SnapshotId: "snap-a08912c9", DeleteOnTermination: true},
  195. },
  196. }
  197. resp, err := s.ec2.RequestSpotInstances(&options)
  198. req := testServer.WaitRequest()
  199. c.Assert(req.Form["Action"], DeepEquals, []string{"RequestSpotInstances"})
  200. c.Assert(req.Form["SpotPrice"], DeepEquals, []string{"0.5"})
  201. c.Assert(req.Form["LaunchSpecification.ImageId"], DeepEquals, []string{"image-id"})
  202. c.Assert(req.Form["LaunchSpecification.KeyName"], DeepEquals, []string{"my-keys"})
  203. c.Assert(req.Form["LaunchSpecification.InstanceType"], DeepEquals, []string{"inst-type"})
  204. c.Assert(req.Form["LaunchSpecification.SecurityGroup.1"], DeepEquals, []string{"g1"})
  205. c.Assert(req.Form["LaunchSpecification.SecurityGroup.2"], DeepEquals, []string{"g3"})
  206. c.Assert(req.Form["LaunchSpecification.SecurityGroupId.1"], DeepEquals, []string{"g2"})
  207. c.Assert(req.Form["LaunchSpecification.SecurityGroupId.2"], DeepEquals, []string{"g4"})
  208. c.Assert(req.Form["LaunchSpecification.UserData"], DeepEquals, []string{"MTIzNA=="})
  209. c.Assert(req.Form["LaunchSpecification.KernelId"], DeepEquals, []string{"kernel-id"})
  210. c.Assert(req.Form["LaunchSpecification.RamdiskId"], DeepEquals, []string{"ramdisk-id"})
  211. c.Assert(req.Form["LaunchSpecification.Placement.AvailabilityZone"], DeepEquals, []string{"zone"})
  212. c.Assert(req.Form["LaunchSpecification.Placement.GroupName"], DeepEquals, []string{"group"})
  213. c.Assert(req.Form["LaunchSpecification.Monitoring.Enabled"], DeepEquals, []string{"true"})
  214. c.Assert(req.Form["LaunchSpecification.SubnetId"], DeepEquals, []string{"subnet-id"})
  215. c.Assert(req.Form["LaunchSpecification.PrivateIpAddress"], DeepEquals, []string{"10.0.0.25"})
  216. c.Assert(req.Form["LaunchSpecification.BlockDeviceMapping.1.DeviceName"], DeepEquals, []string{"/dev/sdb"})
  217. c.Assert(req.Form["LaunchSpecification.BlockDeviceMapping.1.VirtualName"], DeepEquals, []string{"ephemeral0"})
  218. c.Assert(req.Form["LaunchSpecification.BlockDeviceMapping.2.Ebs.SnapshotId"], DeepEquals, []string{"snap-a08912c9"})
  219. c.Assert(req.Form["LaunchSpecification.BlockDeviceMapping.2.Ebs.DeleteOnTermination"], DeepEquals, []string{"true"})
  220. c.Assert(err, IsNil)
  221. c.Assert(resp.RequestId, Equals, "59dbff89-35bd-4eac-99ed-be587EXAMPLE")
  222. c.Assert(resp.SpotRequestResults[0].SpotRequestId, Equals, "sir-1a2b3c4d")
  223. c.Assert(resp.SpotRequestResults[0].SpotPrice, Equals, "0.5")
  224. c.Assert(resp.SpotRequestResults[0].State, Equals, "open")
  225. c.Assert(resp.SpotRequestResults[0].SpotLaunchSpec.ImageId, Equals, "ami-1a2b3c4d")
  226. }
  227. func (s *S) TestCancelSpotRequestsExample(c *C) {
  228. testServer.Response(200, nil, CancelSpotRequestsExample)
  229. resp, err := s.ec2.CancelSpotRequests([]string{"s-1", "s-2"})
  230. req := testServer.WaitRequest()
  231. c.Assert(req.Form["Action"], DeepEquals, []string{"CancelSpotInstanceRequests"})
  232. c.Assert(req.Form["SpotInstanceRequestId.1"], DeepEquals, []string{"s-1"})
  233. c.Assert(req.Form["SpotInstanceRequestId.2"], DeepEquals, []string{"s-2"})
  234. c.Assert(err, IsNil)
  235. c.Assert(resp.RequestId, Equals, "59dbff89-35bd-4eac-99ed-be587EXAMPLE")
  236. c.Assert(resp.CancelSpotRequestResults[0].SpotRequestId, Equals, "sir-1a2b3c4d")
  237. c.Assert(resp.CancelSpotRequestResults[0].State, Equals, "cancelled")
  238. }
  239. func (s *S) TestTerminateInstancesExample(c *C) {
  240. testServer.Response(200, nil, TerminateInstancesExample)
  241. resp, err := s.ec2.TerminateInstances([]string{"i-1", "i-2"})
  242. req := testServer.WaitRequest()
  243. c.Assert(req.Form["Action"], DeepEquals, []string{"TerminateInstances"})
  244. c.Assert(req.Form["InstanceId.1"], DeepEquals, []string{"i-1"})
  245. c.Assert(req.Form["InstanceId.2"], DeepEquals, []string{"i-2"})
  246. c.Assert(req.Form["UserData"], IsNil)
  247. c.Assert(req.Form["KernelId"], IsNil)
  248. c.Assert(req.Form["RamdiskId"], IsNil)
  249. c.Assert(req.Form["Placement.AvailabilityZone"], IsNil)
  250. c.Assert(req.Form["Placement.GroupName"], IsNil)
  251. c.Assert(req.Form["Monitoring.Enabled"], IsNil)
  252. c.Assert(req.Form["SubnetId"], IsNil)
  253. c.Assert(req.Form["DisableApiTermination"], IsNil)
  254. c.Assert(req.Form["InstanceInitiatedShutdownBehavior"], IsNil)
  255. c.Assert(req.Form["PrivateIpAddress"], IsNil)
  256. c.Assert(err, IsNil)
  257. c.Assert(resp.RequestId, Equals, "59dbff89-35bd-4eac-99ed-be587EXAMPLE")
  258. c.Assert(resp.StateChanges, HasLen, 1)
  259. c.Assert(resp.StateChanges[0].InstanceId, Equals, "i-3ea74257")
  260. c.Assert(resp.StateChanges[0].CurrentState.Code, Equals, 32)
  261. c.Assert(resp.StateChanges[0].CurrentState.Name, Equals, "shutting-down")
  262. c.Assert(resp.StateChanges[0].PreviousState.Code, Equals, 16)
  263. c.Assert(resp.StateChanges[0].PreviousState.Name, Equals, "running")
  264. }
  265. func (s *S) TestDescribeSpotRequestsExample(c *C) {
  266. testServer.Response(200, nil, DescribeSpotRequestsExample)
  267. filter := ec2.NewFilter()
  268. filter.Add("key1", "value1")
  269. filter.Add("key2", "value2", "value3")
  270. resp, err := s.ec2.DescribeSpotRequests([]string{"s-1", "s-2"}, filter)
  271. req := testServer.WaitRequest()
  272. c.Assert(req.Form["Action"], DeepEquals, []string{"DescribeSpotInstanceRequests"})
  273. c.Assert(req.Form["SpotInstanceRequestId.1"], DeepEquals, []string{"s-1"})
  274. c.Assert(req.Form["SpotInstanceRequestId.2"], DeepEquals, []string{"s-2"})
  275. c.Assert(err, IsNil)
  276. c.Assert(resp.RequestId, Equals, "b1719f2a-5334-4479-b2f1-26926EXAMPLE")
  277. c.Assert(resp.SpotRequestResults[0].SpotRequestId, Equals, "sir-1a2b3c4d")
  278. c.Assert(resp.SpotRequestResults[0].State, Equals, "active")
  279. c.Assert(resp.SpotRequestResults[0].SpotPrice, Equals, "0.5")
  280. c.Assert(resp.SpotRequestResults[0].SpotLaunchSpec.ImageId, Equals, "ami-1a2b3c4d")
  281. }
  282. func (s *S) TestDescribeInstancesExample1(c *C) {
  283. testServer.Response(200, nil, DescribeInstancesExample1)
  284. filter := ec2.NewFilter()
  285. filter.Add("key1", "value1")
  286. filter.Add("key2", "value2", "value3")
  287. resp, err := s.ec2.DescribeInstances([]string{"i-1", "i-2"}, nil)
  288. req := testServer.WaitRequest()
  289. c.Assert(req.Form["Action"], DeepEquals, []string{"DescribeInstances"})
  290. c.Assert(req.Form["InstanceId.1"], DeepEquals, []string{"i-1"})
  291. c.Assert(req.Form["InstanceId.2"], DeepEquals, []string{"i-2"})
  292. c.Assert(err, IsNil)
  293. c.Assert(resp.RequestId, Equals, "98e3c9a4-848c-4d6d-8e8a-b1bdEXAMPLE")
  294. c.Assert(resp.Reservations, HasLen, 2)
  295. r0 := resp.Reservations[0]
  296. c.Assert(r0.ReservationId, Equals, "r-b27e30d9")
  297. c.Assert(r0.OwnerId, Equals, "999988887777")
  298. c.Assert(r0.RequesterId, Equals, "854251627541")
  299. c.Assert(r0.SecurityGroups, DeepEquals, []ec2.SecurityGroup{{Name: "default", Id: "sg-67ad940e"}})
  300. c.Assert(r0.Instances, HasLen, 1)
  301. r0i := r0.Instances[0]
  302. c.Assert(r0i.InstanceId, Equals, "i-c5cd56af")
  303. c.Assert(r0i.PrivateDNSName, Equals, "domU-12-31-39-10-56-34.compute-1.internal")
  304. c.Assert(r0i.DNSName, Equals, "ec2-174-129-165-232.compute-1.amazonaws.com")
  305. c.Assert(r0i.AvailabilityZone, Equals, "us-east-1b")
  306. c.Assert(r0i.IPAddress, Equals, "174.129.165.232")
  307. c.Assert(r0i.PrivateIPAddress, Equals, "10.198.85.190")
  308. }
  309. func (s *S) TestDescribeInstancesExample2(c *C) {
  310. testServer.Response(200, nil, DescribeInstancesExample2)
  311. filter := ec2.NewFilter()
  312. filter.Add("key1", "value1")
  313. filter.Add("key2", "value2", "value3")
  314. resp, err := s.ec2.DescribeInstances([]string{"i-1", "i-2"}, filter)
  315. req := testServer.WaitRequest()
  316. c.Assert(req.Form["Action"], DeepEquals, []string{"DescribeInstances"})
  317. c.Assert(req.Form["InstanceId.1"], DeepEquals, []string{"i-1"})
  318. c.Assert(req.Form["InstanceId.2"], DeepEquals, []string{"i-2"})
  319. c.Assert(req.Form["Filter.1.Name"], DeepEquals, []string{"key1"})
  320. c.Assert(req.Form["Filter.1.Value.1"], DeepEquals, []string{"value1"})
  321. c.Assert(req.Form["Filter.1.Value.2"], IsNil)
  322. c.Assert(req.Form["Filter.2.Name"], DeepEquals, []string{"key2"})
  323. c.Assert(req.Form["Filter.2.Value.1"], DeepEquals, []string{"value2"})
  324. c.Assert(req.Form["Filter.2.Value.2"], DeepEquals, []string{"value3"})
  325. c.Assert(err, IsNil)
  326. c.Assert(resp.RequestId, Equals, "59dbff89-35bd-4eac-99ed-be587EXAMPLE")
  327. c.Assert(resp.Reservations, HasLen, 1)
  328. r0 := resp.Reservations[0]
  329. r0i := r0.Instances[0]
  330. c.Assert(r0i.State.Code, Equals, 16)
  331. c.Assert(r0i.State.Name, Equals, "running")
  332. r0t0 := r0i.Tags[0]
  333. r0t1 := r0i.Tags[1]
  334. c.Assert(r0t0.Key, Equals, "webserver")
  335. c.Assert(r0t0.Value, Equals, "")
  336. c.Assert(r0t1.Key, Equals, "stack")
  337. c.Assert(r0t1.Value, Equals, "Production")
  338. }
  339. func (s *S) TestDescribeInstanceStatusExample(c *C) {
  340. testServer.Response(200, nil, DescribeInstanceStatusExample)
  341. resp, err := s.ec2.DescribeInstanceStatus(&ec2.DescribeInstanceStatusOptions{}, nil)
  342. req := testServer.WaitRequest()
  343. c.Assert(req.Form["Action"], DeepEquals, []string{"DescribeInstanceStatus"})
  344. c.Assert(err, IsNil)
  345. c.Assert(resp.RequestId, Equals, "59dbff89-35bd-4eac-99ed-be587EXAMPLE")
  346. c.Assert(resp.InstanceStatusSet, HasLen, 1)
  347. c.Assert(resp.NextToken, Equals, "exampleToken")
  348. i0 := resp.InstanceStatusSet[0]
  349. c.Assert(i0.InstanceId, Equals, "i-c7cd56ad")
  350. c.Assert(i0.AvailabilityZone, Equals, "us-east-1b")
  351. c.Assert(i0.Events, HasLen, 1)
  352. e0 := i0.Events[0]
  353. c.Assert(e0.Code, Equals, "instance-reboot")
  354. c.Assert(e0.Description, Equals, "example description")
  355. c.Assert(e0.NotBefore, Equals, "2010-08-17T01:15:18.000Z")
  356. c.Assert(e0.NotAfter, Equals, "2010-08-17T01:15:18.000Z")
  357. c.Assert(i0.InstanceState.Code, Equals, 16)
  358. c.Assert(i0.InstanceState.Name, Equals, "running")
  359. c.Assert(i0.SystemStatus.Status, Equals, "ok")
  360. c.Assert(i0.SystemStatus.Details.Name, Equals, "reachability")
  361. c.Assert(i0.SystemStatus.Details.Status, Equals, "passed")
  362. c.Assert(i0.SystemStatus.Details.ImpairedSince, Equals, "2010-08-17T01:15:18.000Z")
  363. c.Assert(i0.InstanceStatus.Status, Equals, "ok")
  364. c.Assert(i0.InstanceStatus.Details.Name, Equals, "reachability")
  365. c.Assert(i0.InstanceStatus.Details.Status, Equals, "passed")
  366. c.Assert(i0.InstanceStatus.Details.ImpairedSince, Equals, "2010-08-17T01:15:18.000Z")
  367. }
  368. func (s *S) TestDescribeAddressesPublicIPExample(c *C) {
  369. testServer.Response(200, nil, DescribeAddressesExample)
  370. filter := ec2.NewFilter()
  371. filter.Add("key1", "value1")
  372. filter.Add("key2", "value2", "value3")
  373. resp, err := s.ec2.DescribeAddresses([]string{"192.0.2.1", "198.51.100.2", "203.0.113.41"}, []string{}, nil)
  374. req := testServer.WaitRequest()
  375. c.Assert(req.Form["Action"], DeepEquals, []string{"DescribeAddresses"})
  376. c.Assert(req.Form["PublicIp.1"], DeepEquals, []string{"192.0.2.1"})
  377. c.Assert(req.Form["PublicIp.2"], DeepEquals, []string{"198.51.100.2"})
  378. c.Assert(req.Form["PublicIp.3"], DeepEquals, []string{"203.0.113.41"})
  379. c.Assert(err, IsNil)
  380. c.Assert(resp.RequestId, Equals, "59dbff89-35bd-4eac-99ed-be587EXAMPLE")
  381. c.Assert(resp.Addresses, HasLen, 3)
  382. r0 := resp.Addresses[0]
  383. c.Assert(r0.PublicIp, Equals, "192.0.2.1")
  384. c.Assert(r0.Domain, Equals, "standard")
  385. c.Assert(r0.InstanceId, Equals, "i-f15ebb98")
  386. r0i := resp.Addresses[1]
  387. c.Assert(r0i.PublicIp, Equals, "198.51.100.2")
  388. c.Assert(r0i.Domain, Equals, "standard")
  389. c.Assert(r0i.InstanceId, Equals, "")
  390. r0ii := resp.Addresses[2]
  391. c.Assert(r0ii.PublicIp, Equals, "203.0.113.41")
  392. c.Assert(r0ii.Domain, Equals, "vpc")
  393. c.Assert(r0ii.InstanceId, Equals, "i-64600030")
  394. c.Assert(r0ii.AssociationId, Equals, "eipassoc-f0229899")
  395. c.Assert(r0ii.AllocationId, Equals, "eipalloc-08229861")
  396. c.Assert(r0ii.NetworkInterfaceOwnerId, Equals, "053230519467")
  397. c.Assert(r0ii.NetworkInterfaceId, Equals, "eni-ef229886")
  398. c.Assert(r0ii.PrivateIpAddress, Equals, "10.0.0.228")
  399. }
  400. func (s *S) TestDescribeAddressesAllocationIDExample(c *C) {
  401. testServer.Response(200, nil, DescribeAddressesAllocationIdExample)
  402. filter := ec2.NewFilter()
  403. filter.Add("key1", "value1")
  404. filter.Add("key2", "value2", "value3")
  405. resp, err := s.ec2.DescribeAddresses([]string{}, []string{"eipalloc-08229861", "eipalloc-08364752"}, nil)
  406. req := testServer.WaitRequest()
  407. c.Assert(req.Form["Action"], DeepEquals, []string{"DescribeAddresses"})
  408. c.Assert(req.Form["AllocationId.1"], DeepEquals, []string{"eipalloc-08229861"})
  409. c.Assert(req.Form["AllocationId.2"], DeepEquals, []string{"eipalloc-08364752"})
  410. c.Assert(err, IsNil)
  411. c.Assert(resp.RequestId, Equals, "59dbff89-35bd-4eac-99ed-be587EXAMPLE")
  412. c.Assert(resp.Addresses, HasLen, 2)
  413. r0 := resp.Addresses[0]
  414. c.Assert(r0.PublicIp, Equals, "203.0.113.41")
  415. c.Assert(r0.AllocationId, Equals, "eipalloc-08229861")
  416. c.Assert(r0.Domain, Equals, "vpc")
  417. c.Assert(r0.InstanceId, Equals, "i-64600030")
  418. c.Assert(r0.AssociationId, Equals, "eipassoc-f0229899")
  419. c.Assert(r0.NetworkInterfaceId, Equals, "eni-ef229886")
  420. c.Assert(r0.NetworkInterfaceOwnerId, Equals, "053230519467")
  421. c.Assert(r0.PrivateIpAddress, Equals, "10.0.0.228")
  422. r1 := resp.Addresses[1]
  423. c.Assert(r1.PublicIp, Equals, "146.54.2.230")
  424. c.Assert(r1.AllocationId, Equals, "eipalloc-08364752")
  425. c.Assert(r1.Domain, Equals, "vpc")
  426. c.Assert(r1.InstanceId, Equals, "i-64693456")
  427. c.Assert(r1.AssociationId, Equals, "eipassoc-f0348693")
  428. c.Assert(r1.NetworkInterfaceId, Equals, "eni-da764039")
  429. c.Assert(r1.NetworkInterfaceOwnerId, Equals, "053230519467")
  430. c.Assert(r1.PrivateIpAddress, Equals, "10.0.0.102")
  431. }
  432. func (s *S) TestCreateImageExample(c *C) {
  433. testServer.Response(200, nil, CreateImageExample)
  434. options := &ec2.CreateImage{
  435. InstanceId: "i-123456",
  436. Name: "foo",
  437. Description: "Test CreateImage",
  438. NoReboot: true,
  439. BlockDevices: []ec2.BlockDeviceMapping{
  440. {DeviceName: "/dev/sdb", VirtualName: "ephemeral0"},
  441. {DeviceName: "/dev/sdc", SnapshotId: "snap-a08912c9", DeleteOnTermination: true},
  442. },
  443. }
  444. resp, err := s.ec2.CreateImage(options)
  445. req := testServer.WaitRequest()
  446. c.Assert(req.Form["Action"], DeepEquals, []string{"CreateImage"})
  447. c.Assert(req.Form["InstanceId"], DeepEquals, []string{options.InstanceId})
  448. c.Assert(req.Form["Name"], DeepEquals, []string{options.Name})
  449. c.Assert(req.Form["Description"], DeepEquals, []string{options.Description})
  450. c.Assert(req.Form["NoReboot"], DeepEquals, []string{"true"})
  451. c.Assert(req.Form["BlockDeviceMapping.1.DeviceName"], DeepEquals, []string{"/dev/sdb"})
  452. c.Assert(req.Form["BlockDeviceMapping.1.VirtualName"], DeepEquals, []string{"ephemeral0"})
  453. c.Assert(req.Form["BlockDeviceMapping.2.DeviceName"], DeepEquals, []string{"/dev/sdc"})
  454. c.Assert(req.Form["BlockDeviceMapping.2.Ebs.SnapshotId"], DeepEquals, []string{"snap-a08912c9"})
  455. c.Assert(req.Form["BlockDeviceMapping.2.Ebs.DeleteOnTermination"], DeepEquals, []string{"true"})
  456. c.Assert(err, IsNil)
  457. c.Assert(resp.RequestId, Equals, "59dbff89-35bd-4eac-99ed-be587EXAMPLE")
  458. c.Assert(resp.ImageId, Equals, "ami-4fa54026")
  459. }
  460. func (s *S) TestDescribeImagesExample(c *C) {
  461. testServer.Response(200, nil, DescribeImagesExample)
  462. filter := ec2.NewFilter()
  463. filter.Add("key1", "value1")
  464. filter.Add("key2", "value2", "value3")
  465. resp, err := s.ec2.Images([]string{"ami-1", "ami-2"}, filter)
  466. req := testServer.WaitRequest()
  467. c.Assert(req.Form["Action"], DeepEquals, []string{"DescribeImages"})
  468. c.Assert(req.Form["ImageId.1"], DeepEquals, []string{"ami-1"})
  469. c.Assert(req.Form["ImageId.2"], DeepEquals, []string{"ami-2"})
  470. c.Assert(req.Form["Filter.1.Name"], DeepEquals, []string{"key1"})
  471. c.Assert(req.Form["Filter.1.Value.1"], DeepEquals, []string{"value1"})
  472. c.Assert(req.Form["Filter.1.Value.2"], IsNil)
  473. c.Assert(req.Form["Filter.2.Name"], DeepEquals, []string{"key2"})
  474. c.Assert(req.Form["Filter.2.Value.1"], DeepEquals, []string{"value2"})
  475. c.Assert(req.Form["Filter.2.Value.2"], DeepEquals, []string{"value3"})
  476. c.Assert(err, IsNil)
  477. c.Assert(resp.RequestId, Equals, "4a4a27a2-2e7c-475d-b35b-ca822EXAMPLE")
  478. c.Assert(resp.Images, HasLen, 1)
  479. i0 := resp.Images[0]
  480. c.Assert(i0.Id, Equals, "ami-a2469acf")
  481. c.Assert(i0.Type, Equals, "machine")
  482. c.Assert(i0.Name, Equals, "example-marketplace-amzn-ami.1")
  483. c.Assert(i0.Description, Equals, "Amazon Linux AMI i386 EBS")
  484. c.Assert(i0.Location, Equals, "aws-marketplace/example-marketplace-amzn-ami.1")
  485. c.Assert(i0.State, Equals, "available")
  486. c.Assert(i0.Public, Equals, true)
  487. c.Assert(i0.OwnerId, Equals, "123456789999")
  488. c.Assert(i0.OwnerAlias, Equals, "aws-marketplace")
  489. c.Assert(i0.Architecture, Equals, "i386")
  490. c.Assert(i0.KernelId, Equals, "aki-805ea7e9")
  491. c.Assert(i0.RootDeviceType, Equals, "ebs")
  492. c.Assert(i0.RootDeviceName, Equals, "/dev/sda1")
  493. c.Assert(i0.VirtualizationType, Equals, "paravirtual")
  494. c.Assert(i0.Hypervisor, Equals, "xen")
  495. c.Assert(i0.Tags, HasLen, 1)
  496. c.Assert(i0.Tags[0].Key, Equals, "Purpose")
  497. c.Assert(i0.Tags[0].Value, Equals, "EXAMPLE")
  498. c.Assert(i0.BlockDevices, HasLen, 1)
  499. c.Assert(i0.BlockDevices[0].DeviceName, Equals, "/dev/sda1")
  500. c.Assert(i0.BlockDevices[0].SnapshotId, Equals, "snap-787e9403")
  501. c.Assert(i0.BlockDevices[0].VolumeSize, Equals, int64(8))
  502. c.Assert(i0.BlockDevices[0].DeleteOnTermination, Equals, true)
  503. testServer.Response(200, nil, DescribeImagesExample)
  504. resp2, err := s.ec2.ImagesByOwners([]string{"ami-1", "ami-2"}, []string{"123456789999", "id2"}, filter)
  505. req2 := testServer.WaitRequest()
  506. c.Assert(req2.Form["Action"], DeepEquals, []string{"DescribeImages"})
  507. c.Assert(req2.Form["ImageId.1"], DeepEquals, []string{"ami-1"})
  508. c.Assert(req2.Form["ImageId.2"], DeepEquals, []string{"ami-2"})
  509. c.Assert(req2.Form["Owner.1"], DeepEquals, []string{"123456789999"})
  510. c.Assert(req2.Form["Owner.2"], DeepEquals, []string{"id2"})
  511. c.Assert(req2.Form["Filter.1.Name"], DeepEquals, []string{"key1"})
  512. c.Assert(req2.Form["Filter.1.Value.1"], DeepEquals, []string{"value1"})
  513. c.Assert(req2.Form["Filter.1.Value.2"], IsNil)
  514. c.Assert(req2.Form["Filter.2.Name"], DeepEquals, []string{"key2"})
  515. c.Assert(req2.Form["Filter.2.Value.1"], DeepEquals, []string{"value2"})
  516. c.Assert(req2.Form["Filter.2.Value.2"], DeepEquals, []string{"value3"})
  517. c.Assert(err, IsNil)
  518. c.Assert(resp2.RequestId, Equals, "4a4a27a2-2e7c-475d-b35b-ca822EXAMPLE")
  519. c.Assert(resp2.Images, HasLen, 1)
  520. i1 := resp2.Images[0]
  521. c.Assert(i1.Id, Equals, "ami-a2469acf")
  522. c.Assert(i1.Type, Equals, "machine")
  523. c.Assert(i1.Name, Equals, "example-marketplace-amzn-ami.1")
  524. c.Assert(i1.Description, Equals, "Amazon Linux AMI i386 EBS")
  525. c.Assert(i1.Location, Equals, "aws-marketplace/example-marketplace-amzn-ami.1")
  526. c.Assert(i1.State, Equals, "available")
  527. c.Assert(i1.Public, Equals, true)
  528. c.Assert(i1.OwnerId, Equals, "123456789999")
  529. c.Assert(i1.OwnerAlias, Equals, "aws-marketplace")
  530. c.Assert(i1.Architecture, Equals, "i386")
  531. c.Assert(i1.KernelId, Equals, "aki-805ea7e9")
  532. c.Assert(i1.RootDeviceType, Equals, "ebs")
  533. c.Assert(i1.RootDeviceName, Equals, "/dev/sda1")
  534. c.Assert(i1.VirtualizationType, Equals, "paravirtual")
  535. c.Assert(i1.Hypervisor, Equals, "xen")
  536. c.Assert(i1.BlockDevices, HasLen, 1)
  537. c.Assert(i1.BlockDevices[0].DeviceName, Equals, "/dev/sda1")
  538. c.Assert(i1.BlockDevices[0].SnapshotId, Equals, "snap-787e9403")
  539. c.Assert(i1.BlockDevices[0].VolumeSize, Equals, int64(8))
  540. c.Assert(i1.BlockDevices[0].DeleteOnTermination, Equals, true)
  541. }
  542. func (s *S) TestImageAttributeExample(c *C) {
  543. testServer.Response(200, nil, ImageAttributeExample)
  544. resp, err := s.ec2.ImageAttribute("ami-61a54008", "launchPermission")
  545. req := testServer.WaitRequest()
  546. c.Assert(req.Form["Action"], DeepEquals, []string{"DescribeImageAttribute"})
  547. c.Assert(err, IsNil)
  548. c.Assert(resp.RequestId, Equals, "59dbff89-35bd-4eac-99ed-be587EXAMPLE")
  549. c.Assert(resp.ImageId, Equals, "ami-61a54008")
  550. c.Assert(resp.Group, Equals, "all")
  551. c.Assert(resp.UserIds[0], Equals, "495219933132")
  552. }
  553. func (s *S) TestCreateSnapshotExample(c *C) {
  554. testServer.Response(200, nil, CreateSnapshotExample)
  555. resp, err := s.ec2.CreateSnapshot("vol-4d826724", "Daily Backup")
  556. req := testServer.WaitRequest()
  557. c.Assert(req.Form["Action"], DeepEquals, []string{"CreateSnapshot"})
  558. c.Assert(req.Form["VolumeId"], DeepEquals, []string{"vol-4d826724"})
  559. c.Assert(req.Form["Description"], DeepEquals, []string{"Daily Backup"})
  560. c.Assert(err, IsNil)
  561. c.Assert(resp.RequestId, Equals, "59dbff89-35bd-4eac-99ed-be587EXAMPLE")
  562. c.Assert(resp.Snapshot.Id, Equals, "snap-78a54011")
  563. c.Assert(resp.Snapshot.VolumeId, Equals, "vol-4d826724")
  564. c.Assert(resp.Snapshot.Status, Equals, "pending")
  565. c.Assert(resp.Snapshot.StartTime, Equals, "2008-05-07T12:51:50.000Z")
  566. c.Assert(resp.Snapshot.Progress, Equals, "60%")
  567. c.Assert(resp.Snapshot.OwnerId, Equals, "111122223333")
  568. c.Assert(resp.Snapshot.VolumeSize, Equals, "10")
  569. c.Assert(resp.Snapshot.Description, Equals, "Daily Backup")
  570. }
  571. func (s *S) TestDeleteSnapshotsExample(c *C) {
  572. testServer.Response(200, nil, DeleteSnapshotExample)
  573. resp, err := s.ec2.DeleteSnapshots([]string{"snap-78a54011"})
  574. req := testServer.WaitRequest()
  575. c.Assert(req.Form["Action"], DeepEquals, []string{"DeleteSnapshot"})
  576. c.Assert(req.Form["SnapshotId.1"], DeepEquals, []string{"snap-78a54011"})
  577. c.Assert(err, IsNil)
  578. c.Assert(resp.RequestId, Equals, "59dbff89-35bd-4eac-99ed-be587EXAMPLE")
  579. }
  580. func (s *S) TestDescribeSnapshotsExample(c *C) {
  581. testServer.Response(200, nil, DescribeSnapshotsExample)
  582. filter := ec2.NewFilter()
  583. filter.Add("key1", "value1")
  584. filter.Add("key2", "value2", "value3")
  585. resp, err := s.ec2.Snapshots([]string{"snap-1", "snap-2"}, filter)
  586. req := testServer.WaitRequest()
  587. c.Assert(req.Form["Action"], DeepEquals, []string{"DescribeSnapshots"})
  588. c.Assert(req.Form["SnapshotId.1"], DeepEquals, []string{"snap-1"})
  589. c.Assert(req.Form["SnapshotId.2"], DeepEquals, []string{"snap-2"})
  590. c.Assert(req.Form["Filter.1.Name"], DeepEquals, []string{"key1"})
  591. c.Assert(req.Form["Filter.1.Value.1"], DeepEquals, []string{"value1"})
  592. c.Assert(req.Form["Filter.1.Value.2"], IsNil)
  593. c.Assert(req.Form["Filter.2.Name"], DeepEquals, []string{"key2"})
  594. c.Assert(req.Form["Filter.2.Value.1"], DeepEquals, []string{"value2"})
  595. c.Assert(req.Form["Filter.2.Value.2"], DeepEquals, []string{"value3"})
  596. c.Assert(err, IsNil)
  597. c.Assert(resp.RequestId, Equals, "59dbff89-35bd-4eac-99ed-be587EXAMPLE")
  598. c.Assert(resp.Snapshots, HasLen, 1)
  599. s0 := resp.Snapshots[0]
  600. c.Assert(s0.Id, Equals, "snap-1a2b3c4d")
  601. c.Assert(s0.VolumeId, Equals, "vol-8875daef")
  602. c.Assert(s0.VolumeSize, Equals, "15")
  603. c.Assert(s0.Status, Equals, "pending")
  604. c.Assert(s0.StartTime, Equals, "2010-07-29T04:12:01.000Z")
  605. c.Assert(s0.Progress, Equals, "30%")
  606. c.Assert(s0.OwnerId, Equals, "111122223333")
  607. c.Assert(s0.Description, Equals, "Daily Backup")
  608. c.Assert(s0.Tags, HasLen, 1)
  609. c.Assert(s0.Tags[0].Key, Equals, "Purpose")
  610. c.Assert(s0.Tags[0].Value, Equals, "demo_db_14_backup")
  611. }
  612. func (s *S) TestModifyImageAttributeExample(c *C) {
  613. testServer.Response(200, nil, ModifyImageAttributeExample)
  614. options := ec2.ModifyImageAttribute{
  615. Description: "Test Description",
  616. }
  617. resp, err := s.ec2.ModifyImageAttribute("ami-4fa54026", &options)
  618. req := testServer.WaitRequest()
  619. c.Assert(req.Form["Action"], DeepEquals, []string{"ModifyImageAttribute"})
  620. c.Assert(err, IsNil)
  621. c.Assert(resp.RequestId, Equals, "59dbff89-35bd-4eac-99ed-be587EXAMPLE")
  622. }
  623. func (s *S) TestModifyImageAttributeExample_complex(c *C) {
  624. testServer.Response(200, nil, ModifyImageAttributeExample)
  625. options := ec2.ModifyImageAttribute{
  626. AddUsers: []string{"u1", "u2"},
  627. RemoveUsers: []string{"u3"},
  628. AddGroups: []string{"g1", "g3"},
  629. RemoveGroups: []string{"g2"},
  630. Description: "Test Description",
  631. }
  632. resp, err := s.ec2.ModifyImageAttribute("ami-4fa54026", &options)
  633. req := testServer.WaitRequest()
  634. c.Assert(req.Form["Action"], DeepEquals, []string{"ModifyImageAttribute"})
  635. c.Assert(req.Form["LaunchPermission.Add.1.UserId"], DeepEquals, []string{"u1"})
  636. c.Assert(req.Form["LaunchPermission.Add.2.UserId"], DeepEquals, []string{"u2"})
  637. c.Assert(req.Form["LaunchPermission.Remove.1.UserId"], DeepEquals, []string{"u3"})
  638. c.Assert(req.Form["LaunchPermission.Add.1.Group"], DeepEquals, []string{"g1"})
  639. c.Assert(req.Form["LaunchPermission.Add.2.Group"], DeepEquals, []string{"g3"})
  640. c.Assert(req.Form["LaunchPermission.Remove.1.Group"], DeepEquals, []string{"g2"})
  641. c.Assert(err, IsNil)
  642. c.Assert(resp.RequestId, Equals, "59dbff89-35bd-4eac-99ed-be587EXAMPLE")
  643. }
  644. func (s *S) TestCopyImageExample(c *C) {
  645. testServer.Response(200, nil, CopyImageExample)
  646. options := ec2.CopyImage{
  647. SourceRegion: "us-west-2",
  648. SourceImageId: "ami-1a2b3c4d",
  649. Description: "Test Description",
  650. }
  651. resp, err := s.ec2.CopyImage(&options)
  652. req := testServer.WaitRequest()
  653. c.Assert(req.Form["Action"], DeepEquals, []string{"CopyImage"})
  654. c.Assert(err, IsNil)
  655. c.Assert(resp.RequestId, Equals, "60bc441d-fa2c-494d-b155-5d6a3EXAMPLE")
  656. }
  657. func (s *S) TestCreateKeyPairExample(c *C) {
  658. testServer.Response(200, nil, CreateKeyPairExample)
  659. resp, err := s.ec2.CreateKeyPair("foo")
  660. req := testServer.WaitRequest()
  661. c.Assert(req.Form["Action"], DeepEquals, []string{"CreateKeyPair"})
  662. c.Assert(req.Form["KeyName"], DeepEquals, []string{"foo"})
  663. c.Assert(err, IsNil)
  664. c.Assert(resp.RequestId, Equals, "59dbff89-35bd-4eac-99ed-be587EXAMPLE")
  665. c.Assert(resp.KeyName, Equals, "foo")
  666. c.Assert(resp.KeyFingerprint, Equals, "00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00")
  667. }
  668. func (s *S) TestDeleteKeyPairExample(c *C) {
  669. testServer.Response(200, nil, DeleteKeyPairExample)
  670. resp, err := s.ec2.DeleteKeyPair("foo")
  671. req := testServer.WaitRequest()
  672. c.Assert(req.Form["Action"], DeepEquals, []string{"DeleteKeyPair"})
  673. c.Assert(req.Form["KeyName"], DeepEquals, []string{"foo"})
  674. c.Assert(err, IsNil)
  675. c.Assert(resp.RequestId, Equals, "59dbff89-35bd-4eac-99ed-be587EXAMPLE")
  676. }
  677. func (s *S) TestCreateSecurityGroupExample(c *C) {
  678. testServer.Response(200, nil, CreateSecurityGroupExample)
  679. resp, err := s.ec2.CreateSecurityGroup(ec2.SecurityGroup{Name: "websrv", Description: "Web Servers"})
  680. req := testServer.WaitRequest()
  681. c.Assert(req.Form["Action"], DeepEquals, []string{"CreateSecurityGroup"})
  682. c.Assert(req.Form["GroupName"], DeepEquals, []string{"websrv"})
  683. c.Assert(req.Form["GroupDescription"], DeepEquals, []string{"Web Servers"})
  684. c.Assert(err, IsNil)
  685. c.Assert(resp.RequestId, Equals, "59dbff89-35bd-4eac-99ed-be587EXAMPLE")
  686. c.Assert(resp.Name, Equals, "websrv")
  687. c.Assert(resp.Id, Equals, "sg-67ad940e")
  688. }
  689. func (s *S) TestDescribeSecurityGroupsExample(c *C) {
  690. testServer.Response(200, nil, DescribeSecurityGroupsExample)
  691. resp, err := s.ec2.SecurityGroups([]ec2.SecurityGroup{{Name: "WebServers"}, {Name: "RangedPortsBySource"}}, nil)
  692. req := testServer.WaitRequest()
  693. c.Assert(req.Form["Action"], DeepEquals, []string{"DescribeSecurityGroups"})
  694. c.Assert(req.Form["GroupName.1"], DeepEquals, []string{"WebServers"})
  695. c.Assert(req.Form["GroupName.2"], DeepEquals, []string{"RangedPortsBySource"})
  696. c.Assert(err, IsNil)
  697. c.Assert(resp.RequestId, Equals, "59dbff89-35bd-4eac-99ed-be587EXAMPLE")
  698. c.Assert(resp.Groups, HasLen, 2)
  699. g0 := resp.Groups[0]
  700. c.Assert(g0.OwnerId, Equals, "999988887777")
  701. c.Assert(g0.Name, Equals, "WebServers")
  702. c.Assert(g0.Id, Equals, "sg-67ad940e")
  703. c.Assert(g0.Description, Equals, "Web Servers")
  704. c.Assert(g0.IPPerms, HasLen, 1)
  705. c.Assert(g0.IPPermsEgress, HasLen, 1)
  706. g0ipp := g0.IPPerms[0]
  707. c.Assert(g0ipp.Protocol, Equals, "tcp")
  708. c.Assert(g0ipp.FromPort, Equals, 80)
  709. c.Assert(g0ipp.ToPort, Equals, 80)
  710. c.Assert(g0ipp.SourceIPs, DeepEquals, []string{"0.0.0.0/0"})
  711. g0ippe := g0.IPPermsEgress[0]
  712. c.Assert(g0ippe.Protocol, Equals, "tcp")
  713. c.Assert(g0ippe.FromPort, Equals, 80)
  714. c.Assert(g0ippe.ToPort, Equals, 80)
  715. c.Assert(g0ippe.SourceIPs, DeepEquals, []string{"0.0.0.0/0"})
  716. g1 := resp.Groups[1]
  717. c.Assert(g1.OwnerId, Equals, "999988887777")
  718. c.Assert(g1.Name, Equals, "RangedPortsBySource")
  719. c.Assert(g1.Id, Equals, "sg-76abc467")
  720. c.Assert(g1.Description, Equals, "Group A")
  721. c.Assert(g1.IPPerms, HasLen, 1)
  722. g1ipp := g1.IPPerms[0]
  723. c.Assert(g1ipp.Protocol, Equals, "tcp")
  724. c.Assert(g1ipp.FromPort, Equals, 6000)
  725. c.Assert(g1ipp.ToPort, Equals, 7000)
  726. c.Assert(g1ipp.SourceIPs, IsNil)
  727. }
  728. func (s *S) TestDescribeSecurityGroupsExampleWithFilter(c *C) {
  729. testServer.Response(200, nil, DescribeSecurityGroupsExample)
  730. filter := ec2.NewFilter()
  731. filter.Add("ip-permission.protocol", "tcp")
  732. filter.Add("ip-permission.from-port", "22")
  733. filter.Add("ip-permission.to-port", "22")
  734. filter.Add("ip-permission.group-name", "app_server_group", "database_group")
  735. _, err := s.ec2.SecurityGroups(nil, filter)
  736. req := testServer.WaitRequest()
  737. c.Assert(req.Form["Action"], DeepEquals, []string{"DescribeSecurityGroups"})
  738. c.Assert(req.Form["Filter.1.Name"], DeepEquals, []string{"ip-permission.from-port"})
  739. c.Assert(req.Form["Filter.1.Value.1"], DeepEquals, []string{"22"})
  740. c.Assert(req.Form["Filter.2.Name"], DeepEquals, []string{"ip-permission.group-name"})
  741. c.Assert(req.Form["Filter.2.Value.1"], DeepEquals, []string{"app_server_group"})
  742. c.Assert(req.Form["Filter.2.Value.2"], DeepEquals, []string{"database_group"})
  743. c.Assert(req.Form["Filter.3.Name"], DeepEquals, []string{"ip-permission.protocol"})
  744. c.Assert(req.Form["Filter.3.Value.1"], DeepEquals, []string{"tcp"})
  745. c.Assert(req.Form["Filter.4.Name"], DeepEquals, []string{"ip-permission.to-port"})
  746. c.Assert(req.Form["Filter.4.Value.1"], DeepEquals, []string{"22"})
  747. c.Assert(err, IsNil)
  748. }
  749. func (s *S) TestDescribeSecurityGroupsDumpWithGroup(c *C) {
  750. testServer.Response(200, nil, DescribeSecurityGroupsDump)
  751. resp, err := s.ec2.SecurityGroups(nil, nil)
  752. req := testServer.WaitRequest()
  753. c.Assert(req.Form["Action"], DeepEquals, []string{"DescribeSecurityGroups"})
  754. c.Assert(err, IsNil)
  755. c.Check(resp.Groups, HasLen, 1)
  756. c.Check(resp.Groups[0].IPPerms, HasLen, 2)
  757. ipp0 := resp.Groups[0].IPPerms[0]
  758. c.Assert(ipp0.SourceIPs, IsNil)
  759. c.Check(ipp0.Protocol, Equals, "icmp")
  760. c.Assert(ipp0.SourceGroups, HasLen, 1)
  761. c.Check(ipp0.SourceGroups[0].OwnerId, Equals, "12345")
  762. c.Check(ipp0.SourceGroups[0].Name, Equals, "default")
  763. c.Check(ipp0.SourceGroups[0].Id, Equals, "sg-67ad940e")
  764. ipp1 := resp.Groups[0].IPPerms[1]
  765. c.Check(ipp1.Protocol, Equals, "tcp")
  766. c.Assert(ipp0.SourceIPs, IsNil)
  767. c.Assert(ipp0.SourceGroups, HasLen, 1)
  768. c.Check(ipp1.SourceGroups[0].Id, Equals, "sg-76abc467")
  769. c.Check(ipp1.SourceGroups[0].OwnerId, Equals, "12345")
  770. c.Check(ipp1.SourceGroups[0].Name, Equals, "other")
  771. }
  772. func (s *S) TestDeleteSecurityGroupExample(c *C) {
  773. testServer.Response(200, nil, DeleteSecurityGroupExample)
  774. resp, err := s.ec2.DeleteSecurityGroup(ec2.SecurityGroup{Name: "websrv"})
  775. req := testServer.WaitRequest()
  776. c.Assert(req.Form["Action"], DeepEquals, []string{"DeleteSecurityGroup"})
  777. c.Assert(req.Form["GroupName"], DeepEquals, []string{"websrv"})
  778. c.Assert(req.Form["GroupId"], IsNil)
  779. c.Assert(err, IsNil)
  780. c.Assert(resp.RequestId, Equals, "59dbff89-35bd-4eac-99ed-be587EXAMPLE")
  781. }
  782. func (s *S) TestDeleteSecurityGroupExampleWithId(c *C) {
  783. testServer.Response(200, nil, DeleteSecurityGroupExample)
  784. // ignore return and error - we're only want to check the parameter handling.
  785. s.ec2.DeleteSecurityGroup(ec2.SecurityGroup{Id: "sg-67ad940e", Name: "ignored"})
  786. req := testServer.WaitRequest()
  787. c.Assert(req.Form["GroupName"], IsNil)
  788. c.Assert(req.Form["GroupId"], DeepEquals, []string{"sg-67ad940e"})
  789. }
  790. func (s *S) TestAuthorizeSecurityGroupExample1(c *C) {
  791. testServer.Response(200, nil, AuthorizeSecurityGroupIngressExample)
  792. perms := []ec2.IPPerm{{
  793. Protocol: "tcp",
  794. FromPort: 80,
  795. ToPort: 80,
  796. SourceIPs: []string{"205.192.0.0/16", "205.159.0.0/16"},
  797. }}
  798. resp, err := s.ec2.AuthorizeSecurityGroup(ec2.SecurityGroup{Name: "websrv"}, perms)
  799. req := testServer.WaitRequest()
  800. c.Assert(req.Form["Action"], DeepEquals, []string{"AuthorizeSecurityGroupIngress"})
  801. c.Assert(req.Form["GroupName"], DeepEquals, []string{"websrv"})
  802. c.Assert(req.Form["IpPermissions.1.IpProtocol"], DeepEquals, []string{"tcp"})
  803. c.Assert(req.Form["IpPermissions.1.FromPort"], DeepEquals, []string{"80"})
  804. c.Assert(req.Form["IpPermissions.1.ToPort"], DeepEquals, []string{"80"})
  805. c.Assert(req.Form["IpPermissions.1.IpRanges.1.CidrIp"], DeepEquals, []string{"205.192.0.0/16"})
  806. c.Assert(req.Form["IpPermissions.1.IpRanges.2.CidrIp"], DeepEquals, []string{"205.159.0.0/16"})
  807. c.Assert(err, IsNil)
  808. c.Assert(resp.RequestId, Equals, "59dbff89-35bd-4eac-99ed-be587EXAMPLE")
  809. }
  810. func (s *S) TestAuthorizeSecurityGroupExample1WithId(c *C) {
  811. testServer.Response(200, nil, AuthorizeSecurityGroupIngressExample)
  812. perms := []ec2.IPPerm{{
  813. Protocol: "tcp",
  814. FromPort: 80,
  815. ToPort: 80,
  816. SourceIPs: []string{"205.192.0.0/16", "205.159.0.0/16"},
  817. }}
  818. // ignore return and error - we're only want to check the parameter handling.
  819. s.ec2.AuthorizeSecurityGroup(ec2.SecurityGroup{Id: "sg-67ad940e", Name: "ignored"}, perms)
  820. req := testServer.WaitRequest()
  821. c.Assert(req.Form["GroupName"], IsNil)
  822. c.Assert(req.Form["GroupId"], DeepEquals, []string{"sg-67ad940e"})
  823. }
  824. func (s *S) TestAuthorizeSecurityGroupExample2(c *C) {
  825. testServer.Response(200, nil, AuthorizeSecurityGroupIngressExample)
  826. perms := []ec2.IPPerm{{
  827. Protocol: "tcp",
  828. FromPort: 80,
  829. ToPort: 81,
  830. SourceGroups: []ec2.UserSecurityGroup{
  831. {OwnerId: "999988887777", Name: "OtherAccountGroup"},
  832. {Id: "sg-67ad940e"},
  833. },
  834. }}
  835. resp, err := s.ec2.AuthorizeSecurityGroup(ec2.SecurityGroup{Name: "websrv"}, perms)
  836. req := testServer.WaitRequest()
  837. c.Assert(req.Form["Action"], DeepEquals, []string{"AuthorizeSecurityGroupIngress"})
  838. c.Assert(req.Form["GroupName"], DeepEquals, []string{"websrv"})
  839. c.Assert(req.Form["IpPermissions.1.IpProtocol"], DeepEquals, []string{"tcp"})
  840. c.Assert(req.Form["IpPermissions.1.FromPort"], DeepEquals, []string{"80"})
  841. c.Assert(req.Form["IpPermissions.1.ToPort"], DeepEquals, []string{"81"})
  842. c.Assert(req.Form["IpPermissions.1.Groups.1.UserId"], DeepEquals, []string{"999988887777"})
  843. c.Assert(req.Form["IpPermissions.1.Groups.1.GroupName"], DeepEquals, []string{"OtherAccountGroup"})
  844. c.Assert(req.Form["IpPermissions.1.Groups.2.UserId"], IsNil)
  845. c.Assert(req.Form["IpPermissions.1.Groups.2.GroupName"], IsNil)
  846. c.Assert(req.Form["IpPermissions.1.Groups.2.GroupId"], DeepEquals, []string{"sg-67ad940e"})
  847. c.Assert(err, IsNil)
  848. c.Assert(resp.RequestId, Equals, "59dbff89-35bd-4eac-99ed-be587EXAMPLE")
  849. }
  850. func (s *S) TestRevokeSecurityGroupExample(c *C) {
  851. // RevokeSecurityGroup is implemented by the same code as AuthorizeSecurityGroup
  852. // so there's no need to duplicate all the tests.
  853. testServer.Response(200, nil, RevokeSecurityGroupIngressExample)
  854. resp, err := s.ec2.RevokeSecurityGroup(ec2.SecurityGroup{Name: "websrv"}, nil)
  855. req := testServer.WaitRequest()
  856. c.Assert(req.Form["Action"], DeepEquals, []string{"RevokeSecurityGroupIngress"})
  857. c.Assert(req.Form["GroupName"], DeepEquals, []string{"websrv"})
  858. c.Assert(err, IsNil)
  859. c.Assert(resp.RequestId, Equals, "59dbff89-35bd-4eac-99ed-be587EXAMPLE")
  860. }
  861. func (s *S) TestCreateTags(c *C) {
  862. testServer.Response(200, nil, CreateTagsExample)
  863. resp, err := s.ec2.CreateTags([]string{"ami-1a2b3c4d", "i-7f4d3a2b"}, []ec2.Tag{{"webserver", ""}, {"stack", "Production"}})
  864. req := testServer.WaitRequest()
  865. c.Assert(req.Form["ResourceId.1"], DeepEquals, []string{"ami-1a2b3c4d"})
  866. c.Assert(req.Form["ResourceId.2"], DeepEquals, []string{"i-7f4d3a2b"})
  867. c.Assert(req.Form["Tag.1.Key"], DeepEquals, []string{"webserver"})
  868. c.Assert(req.Form["Tag.1.Value"], DeepEquals, []string{""})
  869. c.Assert(req.Form["Tag.2.Key"], DeepEquals, []string{"stack"})
  870. c.Assert(req.Form["Tag.2.Value"], DeepEquals, []string{"Production"})
  871. c.Assert(err, IsNil)
  872. c.Assert(resp.RequestId, Equals, "59dbff89-35bd-4eac-99ed-be587EXAMPLE")
  873. }
  874. func (s *S) TestStartInstances(c *C) {
  875. testServer.Response(200, nil, StartInstancesExample)
  876. resp, err := s.ec2.StartInstances("i-10a64379")
  877. req := testServer.WaitRequest()
  878. c.Assert(req.Form["Action"], DeepEquals, []string{"StartInstances"})
  879. c.Assert(req.Form["InstanceId.1"], DeepEquals, []string{"i-10a64379"})
  880. c.Assert(err, IsNil)
  881. c.Assert(resp.RequestId, Equals, "59dbff89-35bd-4eac-99ed-be587EXAMPLE")
  882. s0 := resp.StateChanges[0]
  883. c.Assert(s0.InstanceId, Equals, "i-10a64379")
  884. c.Assert(s0.CurrentState.Code, Equals, 0)
  885. c.Assert(s0.CurrentState.Name, Equals, "pending")
  886. c.Assert(s0.PreviousState.Code, Equals, 80)
  887. c.Assert(s0.PreviousState.Name, Equals, "stopped")
  888. }
  889. func (s *S) TestStopInstances(c *C) {
  890. testServer.Response(200, nil, StopInstancesExample)
  891. resp, err := s.ec2.StopInstances("i-10a64379")
  892. req := testServer.WaitRequest()
  893. c.Assert(req.Form["Action"], DeepEquals, []string{"StopInstances"})
  894. c.Assert(req.Form["InstanceId.1"], DeepEquals, []string{"i-10a64379"})
  895. c.Assert(err, IsNil)
  896. c.Assert(resp.RequestId, Equals, "59dbff89-35bd-4eac-99ed-be587EXAMPLE")
  897. s0 := resp.StateChanges[0]
  898. c.Assert(s0.InstanceId, Equals, "i-10a64379")
  899. c.Assert(s0.CurrentState.Code, Equals, 64)
  900. c.Assert(s0.CurrentState.Name, Equals, "stopping")
  901. c.Assert(s0.PreviousState.Code, Equals, 16)
  902. c.Assert(s0.PreviousState.Name, Equals, "running")
  903. }
  904. func (s *S) TestRebootInstances(c *C) {
  905. testServer.Response(200, nil, RebootInstancesExample)
  906. resp, err := s.ec2.RebootInstances("i-10a64379")
  907. req := testServer.WaitRequest()
  908. c.Assert(req.Form["Action"], DeepEquals, []string{"RebootInstances"})
  909. c.Assert(req.Form["InstanceId.1"], DeepEquals, []string{"i-10a64379"})
  910. c.Assert(err, IsNil)
  911. c.Assert(resp.RequestId, Equals, "59dbff89-35bd-4eac-99ed-be587EXAMPLE")
  912. }
  913. func (s *S) TestSignatureWithEndpointPath(c *C) {
  914. ec2.FakeTime(true)
  915. defer ec2.FakeTime(false)
  916. testServer.Response(200, nil, RebootInstancesExample)
  917. // https://bugs.launchpad.net/goamz/+bug/1022749
  918. ec2 := ec2.NewWithClient(s.ec2.Auth, aws.Region{EC2Endpoint: testServer.URL + "/services/Cloud"}, testutil.DefaultClient)
  919. _, err := ec2.RebootInstances("i-10a64379")
  920. c.Assert(err, IsNil)
  921. req := testServer.WaitRequest()
  922. c.Assert(req.Form["Signature"], DeepEquals, []string{"VVoC6Y6xfES+KvZo+789thP8+tye4F6fOKBiKmXk4S4="})
  923. }
  924. func (s *S) TestAllocateAddressExample(c *C) {
  925. testServer.Response(200, nil, AllocateAddressExample)
  926. options := &ec2.AllocateAddressOptions{
  927. Domain: "vpc",
  928. }
  929. resp, err := s.ec2.AllocateAddress(options)
  930. req := testServer.WaitRequest()
  931. c.Assert(req.Form["Action"], DeepEquals, []string{"AllocateAddress"})
  932. c.Assert(req.Form["Domain"], DeepEquals, []string{"vpc"})
  933. c.Assert(err, IsNil)
  934. c.Assert(resp.RequestId, Equals, "59dbff89-35bd-4eac-99ed-be587EXAMPLE")
  935. c.Assert(resp.PublicIp, Equals, "198.51.100.1")
  936. c.Assert(resp.Domain, Equals, "vpc")
  937. c.Assert(resp.AllocationId, Equals, "eipalloc-5723d13e")
  938. }
  939. func (s *S) TestReleaseAddressExample(c *C) {
  940. testServer.Response(200, nil, ReleaseAddressExample)
  941. resp, err := s.ec2.ReleaseAddress("192.0.2.1", "eipalloc-5723d13e")
  942. req := testServer.WaitRequest()
  943. c.Assert(req.Form["Action"], DeepEquals, []string{"ReleaseAddress"})
  944. c.Assert(req.Form["PublicIp"], DeepEquals, []string{"192.0.2.1"})
  945. c.Assert(req.Form["AllocationId"], DeepEquals, []string{"eipalloc-5723d13e"})
  946. c.Assert(err, IsNil)
  947. c.Assert(resp.RequestId, Equals, "59dbff89-35bd-4eac-99ed-be587EXAMPLE")
  948. c.Assert(resp.Return, Equals, true)
  949. }
  950. func (s *S) TestAssociateAddressExample(c *C) {
  951. testServer.Response(200, nil, AssociateAddressExample)
  952. options := &ec2.AssociateAddressOptions{
  953. PublicIp: "192.0.2.1",
  954. InstanceId: "i-4fd2431a",
  955. AllocationId: "eipalloc-5723d13e",
  956. AllowReassociation: true,
  957. }
  958. resp, err := s.ec2.AssociateAddress(options)
  959. req := testServer.WaitRequest()
  960. c.Assert(req.Form["Action"], DeepEquals, []string{"AssociateAddress"})
  961. c.Assert(req.Form["PublicIp"], DeepEquals, []string{"192.0.2.1"})
  962. c.Assert(req.Form["InstanceId"], DeepEquals, []string{"i-4fd2431a"})
  963. c.Assert(req.Form["AllocationId"], DeepEquals, []string{"eipalloc-5723d13e"})
  964. c.Assert(req.Form["AllowReassociation"], DeepEquals, []string{"true"})
  965. c.Assert(err, IsNil)
  966. c.Assert(resp.RequestId, Equals, "59dbff89-35bd-4eac-99ed-be587EXAMPLE")
  967. c.Assert(resp.AssociationId, Equals, "eipassoc-fc5ca095")
  968. c.Assert(resp.Return, Equals, true)
  969. }
  970. func (s *S) TestDisassociateAddressExample(c *C) {
  971. testServer.Response(200, nil, DisassociateAddressExample)
  972. resp, err := s.ec2.DisassociateAddress("192.0.2.1", "eipassoc-aa7486c3")
  973. req := testServer.WaitRequest()
  974. c.Assert(req.Form["Action"], DeepEquals, []string{"DisassociateAddress"})
  975. c.Assert(req.Form["PublicIp"], DeepEquals, []string{"192.0.2.1"})
  976. c.Assert(req.Form["AssociationId"], DeepEquals, []string{"eipassoc-aa7486c3"})
  977. c.Assert(err, IsNil)
  978. c.Assert(resp.RequestId, Equals, "59dbff89-35bd-4eac-99ed-be587EXAMPLE")
  979. c.Assert(resp.Return, Equals, true)
  980. }
  981. func (s *S) TestModifyInstance(c *C) {
  982. testServer.Response(200, nil, ModifyInstanceExample)
  983. options := ec2.ModifyInstance{
  984. InstanceType: "m1.small",
  985. DisableAPITermination: true,
  986. EbsOptimized: true,
  987. SecurityGroups: []ec2.SecurityGroup{{Id: "g1"}, {Id: "g2"}},
  988. ShutdownBehavior: "terminate",
  989. KernelId: "kernel-id",
  990. RamdiskId: "ramdisk-id",
  991. SourceDestCheck: true,
  992. SriovNetSupport: true,
  993. UserData: []byte("1234"),
  994. BlockDevices: []ec2.BlockDeviceMapping{
  995. {DeviceName: "/dev/sda1", SnapshotId: "snap-a08912c9", DeleteOnTermination: true},
  996. },
  997. }
  998. resp, err := s.ec2.ModifyInstance("i-2ba64342", &options)
  999. req := testServer.WaitRequest()
  1000. c.Assert(req.Form["Action"], DeepEquals, []string{"ModifyInstanceAttribute"})
  1001. c.Assert(req.Form["InstanceId"], DeepEquals, []string{"i-2ba64342"})
  1002. c.Assert(req.Form["InstanceType.Value"], DeepEquals, []string{"m1.small"})
  1003. c.Assert(req.Form["BlockDeviceMapping.1.DeviceName"], DeepEquals, []string{"/dev/sda1"})
  1004. c.Assert(req.Form["BlockDeviceMapping.1.Ebs.SnapshotId"], DeepEquals, []string{"snap-a08912c9"})
  1005. c.Assert(req.Form["BlockDeviceMapping.1.Ebs.DeleteOnTermination"], DeepEquals, []string{"true"})
  1006. c.Assert(req.Form["DisableApiTermination.Value"], DeepEquals, []string{"true"})
  1007. c.Assert(req.Form["EbsOptimized"], DeepEquals, []string{"true"})
  1008. c.Assert(req.Form["GroupId.1"], DeepEquals, []string{"g1"})
  1009. c.Assert(req.Form["GroupId.2"], DeepEquals, []string{"g2"})
  1010. c.Assert(req.Form["InstanceInitiatedShutdownBehavior.Value"], DeepEquals, []string{"terminate"})
  1011. c.Assert(req.Form["Kernel.Value"], DeepEquals, []string{"kernel-id"})
  1012. c.Assert(req.Form["Ramdisk.Value"], DeepEquals, []string{"ramdisk-id"})
  1013. c.Assert(req.Form["SourceDestCheck.Value"], DeepEquals, []string{"true"})
  1014. c.Assert(req.Form["SriovNetSupport.Value"], DeepEquals, []string{"simple"})
  1015. c.Assert(req.Form["UserData"], DeepEquals, []string{"MTIzNA=="})
  1016. c.Assert(err, IsNil)
  1017. c.Assert(resp.RequestId, Equals, "59dbff89-35bd-4eac-99ed-be587EXAMPLE")
  1018. }
  1019. func (s *S) TestDescribeReservedInstancesExample(c *C) {
  1020. testServer.Response(200, nil, DescribeReservedInstancesExample)
  1021. resp, err := s.ec2.DescribeReservedInstances([]string{"i-1", "i-2"}, nil)
  1022. req := testServer.WaitRequest()
  1023. c.Assert(req.Form["Action"], DeepEquals, []string{"DescribeReservedInstances"})
  1024. c.Assert(err, IsNil)
  1025. c.Assert(resp.RequestId, Equals, "59dbff89-35bd-4eac-99ed-be587EXAMPLE")
  1026. c.Assert(resp.ReservedInstances, HasLen, 1)
  1027. r0 := resp.ReservedInstances[0]
  1028. c.Assert(r0.ReservedInstanceId, Equals, "e5a2ff3b-7d14-494f-90af-0b5d0EXAMPLE")
  1029. }