aws-sdk-v1 1.52.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (560) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +7 -0
  3. data/LICENSE.txt +12 -0
  4. data/README.md +337 -0
  5. data/bin/aws-rb +179 -0
  6. data/ca-bundle.crt +3554 -0
  7. data/endpoints.json +1671 -0
  8. data/lib/aws-sdk-v1.rb +2 -0
  9. data/lib/aws-sdk.rb +1 -0
  10. data/lib/aws.rb +14 -0
  11. data/lib/aws/api_config/AutoScaling-2011-01-01.yml +1070 -0
  12. data/lib/aws/api_config/CloudFormation-2010-05-15.yml +372 -0
  13. data/lib/aws/api_config/CloudFront-2013-05-12.yml +2448 -0
  14. data/lib/aws/api_config/CloudFront-2013-08-26.yml +2599 -0
  15. data/lib/aws/api_config/CloudFront-2013-09-27.yml +2765 -0
  16. data/lib/aws/api_config/CloudFront-2013-11-11.yml +2886 -0
  17. data/lib/aws/api_config/CloudFront-2013-11-22.yml +2918 -0
  18. data/lib/aws/api_config/CloudFront-2014-01-31.yml +2934 -0
  19. data/lib/aws/api_config/CloudFront-2014-05-31.yml +3100 -0
  20. data/lib/aws/api_config/CloudSearch-2011-02-01.yml +681 -0
  21. data/lib/aws/api_config/CloudSearch-2013-01-01.yml +1164 -0
  22. data/lib/aws/api_config/CloudTrail-2013-11-01.yml +130 -0
  23. data/lib/aws/api_config/CloudWatch-2010-08-01.yml +433 -0
  24. data/lib/aws/api_config/DataPipeline-2012-10-29.yml +422 -0
  25. data/lib/aws/api_config/DirectConnect-2012-10-25.yml +735 -0
  26. data/lib/aws/api_config/DynamoDB-2011-12-05.yml +1168 -0
  27. data/lib/aws/api_config/DynamoDB-2012-08-10.yml +2105 -0
  28. data/lib/aws/api_config/EC2-2013-08-15.yml +4708 -0
  29. data/lib/aws/api_config/EC2-2013-10-01.yml +4726 -0
  30. data/lib/aws/api_config/EC2-2013-10-15.yml +4651 -0
  31. data/lib/aws/api_config/EC2-2014-02-01.yml +4755 -0
  32. data/lib/aws/api_config/EC2-2014-05-01.yml +4812 -0
  33. data/lib/aws/api_config/ELB-2012-06-01.yml +766 -0
  34. data/lib/aws/api_config/EMR-2009-03-31.yml +972 -0
  35. data/lib/aws/api_config/ElastiCache-2013-06-15.yml +1188 -0
  36. data/lib/aws/api_config/ElastiCache-2014-03-24.yml +1375 -0
  37. data/lib/aws/api_config/ElastiCache-2014-07-15.yml +1385 -0
  38. data/lib/aws/api_config/ElasticBeanstalk-2010-12-01.yml +854 -0
  39. data/lib/aws/api_config/ElasticTranscoder-2012-09-25.yml +3082 -0
  40. data/lib/aws/api_config/Glacier-2012-06-01.yml +649 -0
  41. data/lib/aws/api_config/IAM-2010-05-08.yml +1339 -0
  42. data/lib/aws/api_config/ImportExport-2010-06-01.yml +109 -0
  43. data/lib/aws/api_config/Kinesis-2013-12-02.yml +201 -0
  44. data/lib/aws/api_config/OpsWorks-2013-02-18.yml +2025 -0
  45. data/lib/aws/api_config/RDS-2013-05-15.yml +2464 -0
  46. data/lib/aws/api_config/RDS-2013-09-09.yml +2640 -0
  47. data/lib/aws/api_config/Redshift-2012-12-01.yml +2161 -0
  48. data/lib/aws/api_config/Route53-2012-12-12.yml +547 -0
  49. data/lib/aws/api_config/Route53-2013-04-01.yml +889 -0
  50. data/lib/aws/api_config/SNS-2010-03-31.yml +448 -0
  51. data/lib/aws/api_config/SQS-2012-11-05.yml +404 -0
  52. data/lib/aws/api_config/STS-2011-06-15.yml +151 -0
  53. data/lib/aws/api_config/SimpleDB-2009-04-15.yml +306 -0
  54. data/lib/aws/api_config/SimpleEmailService-2010-12-01.yml +346 -0
  55. data/lib/aws/api_config/SimpleWorkflow-2012-01-25.yml +2388 -0
  56. data/lib/aws/api_config/StorageGateway-2012-06-30.yml +748 -0
  57. data/lib/aws/api_config/StorageGateway-2013-06-30.yml +1025 -0
  58. data/lib/aws/api_config/Support-2013-04-15.yml +489 -0
  59. data/lib/aws/auto_scaling.rb +163 -0
  60. data/lib/aws/auto_scaling/activity.rb +102 -0
  61. data/lib/aws/auto_scaling/activity_collection.rb +81 -0
  62. data/lib/aws/auto_scaling/client.rb +48 -0
  63. data/lib/aws/auto_scaling/config.rb +18 -0
  64. data/lib/aws/auto_scaling/errors.rb +22 -0
  65. data/lib/aws/auto_scaling/group.rb +421 -0
  66. data/lib/aws/auto_scaling/group_collection.rb +96 -0
  67. data/lib/aws/auto_scaling/group_options.rb +155 -0
  68. data/lib/aws/auto_scaling/instance.rb +192 -0
  69. data/lib/aws/auto_scaling/instance_collection.rb +63 -0
  70. data/lib/aws/auto_scaling/launch_configuration.rb +162 -0
  71. data/lib/aws/auto_scaling/launch_configuration_collection.rb +160 -0
  72. data/lib/aws/auto_scaling/notification_configuration.rb +89 -0
  73. data/lib/aws/auto_scaling/notification_configuration_collection.rb +183 -0
  74. data/lib/aws/auto_scaling/scaling_policy.rb +142 -0
  75. data/lib/aws/auto_scaling/scaling_policy_collection.rb +72 -0
  76. data/lib/aws/auto_scaling/scaling_policy_options.rb +65 -0
  77. data/lib/aws/auto_scaling/scheduled_action.rb +141 -0
  78. data/lib/aws/auto_scaling/scheduled_action_collection.rb +202 -0
  79. data/lib/aws/auto_scaling/tag.rb +59 -0
  80. data/lib/aws/auto_scaling/tag_collection.rb +114 -0
  81. data/lib/aws/cloud_formation.rb +272 -0
  82. data/lib/aws/cloud_formation/client.rb +48 -0
  83. data/lib/aws/cloud_formation/config.rb +18 -0
  84. data/lib/aws/cloud_formation/errors.rb +22 -0
  85. data/lib/aws/cloud_formation/stack.rb +266 -0
  86. data/lib/aws/cloud_formation/stack_collection.rb +232 -0
  87. data/lib/aws/cloud_formation/stack_event.rb +73 -0
  88. data/lib/aws/cloud_formation/stack_event_collection.rb +47 -0
  89. data/lib/aws/cloud_formation/stack_options.rb +72 -0
  90. data/lib/aws/cloud_formation/stack_output.rb +53 -0
  91. data/lib/aws/cloud_formation/stack_resource.rb +117 -0
  92. data/lib/aws/cloud_formation/stack_resource_collection.rb +83 -0
  93. data/lib/aws/cloud_formation/stack_resource_summary_collection.rb +64 -0
  94. data/lib/aws/cloud_formation/stack_summary_collection.rb +123 -0
  95. data/lib/aws/cloud_front.rb +72 -0
  96. data/lib/aws/cloud_front/client.rb +57 -0
  97. data/lib/aws/cloud_front/config.rb +18 -0
  98. data/lib/aws/cloud_front/errors.rb +22 -0
  99. data/lib/aws/cloud_search.rb +73 -0
  100. data/lib/aws/cloud_search/client.rb +40 -0
  101. data/lib/aws/cloud_search/config.rb +18 -0
  102. data/lib/aws/cloud_search/errors.rb +22 -0
  103. data/lib/aws/cloud_trail.rb +72 -0
  104. data/lib/aws/cloud_trail/client.rb +35 -0
  105. data/lib/aws/cloud_trail/config.rb +18 -0
  106. data/lib/aws/cloud_trail/errors.rb +22 -0
  107. data/lib/aws/cloud_watch.rb +118 -0
  108. data/lib/aws/cloud_watch/alarm.rb +293 -0
  109. data/lib/aws/cloud_watch/alarm_collection.rb +153 -0
  110. data/lib/aws/cloud_watch/alarm_history_item.rb +50 -0
  111. data/lib/aws/cloud_watch/alarm_history_item_collection.rb +84 -0
  112. data/lib/aws/cloud_watch/client.rb +40 -0
  113. data/lib/aws/cloud_watch/config.rb +18 -0
  114. data/lib/aws/cloud_watch/errors.rb +22 -0
  115. data/lib/aws/cloud_watch/metric.rb +135 -0
  116. data/lib/aws/cloud_watch/metric_alarm_collection.rb +160 -0
  117. data/lib/aws/cloud_watch/metric_collection.rb +129 -0
  118. data/lib/aws/cloud_watch/metric_statistics.rb +69 -0
  119. data/lib/aws/core.rb +716 -0
  120. data/lib/aws/core/async_handle.rb +90 -0
  121. data/lib/aws/core/cacheable.rb +77 -0
  122. data/lib/aws/core/client.rb +787 -0
  123. data/lib/aws/core/collection.rb +263 -0
  124. data/lib/aws/core/collection/simple.rb +82 -0
  125. data/lib/aws/core/collection/with_limit_and_next_token.rb +71 -0
  126. data/lib/aws/core/collection/with_next_token.rb +97 -0
  127. data/lib/aws/core/configuration.rb +542 -0
  128. data/lib/aws/core/credential_providers.rb +639 -0
  129. data/lib/aws/core/data.rb +247 -0
  130. data/lib/aws/core/deprecations.rb +84 -0
  131. data/lib/aws/core/endpoints.rb +37 -0
  132. data/lib/aws/core/http/connection_pool.rb +369 -0
  133. data/lib/aws/core/http/curb_handler.rb +148 -0
  134. data/lib/aws/core/http/handler.rb +89 -0
  135. data/lib/aws/core/http/net_http_handler.rb +144 -0
  136. data/lib/aws/core/http/patch.rb +102 -0
  137. data/lib/aws/core/http/request.rb +259 -0
  138. data/lib/aws/core/http/response.rb +81 -0
  139. data/lib/aws/core/indifferent_hash.rb +88 -0
  140. data/lib/aws/core/inflection.rb +56 -0
  141. data/lib/aws/core/ini_parser.rb +42 -0
  142. data/lib/aws/core/json_client.rb +47 -0
  143. data/lib/aws/core/json_parser.rb +76 -0
  144. data/lib/aws/core/json_request_builder.rb +35 -0
  145. data/lib/aws/core/json_response_parser.rb +79 -0
  146. data/lib/aws/core/lazy_error_classes.rb +108 -0
  147. data/lib/aws/core/log_formatter.rb +428 -0
  148. data/lib/aws/core/managed_file.rb +32 -0
  149. data/lib/aws/core/meta_utils.rb +45 -0
  150. data/lib/aws/core/model.rb +62 -0
  151. data/lib/aws/core/naming.rb +30 -0
  152. data/lib/aws/core/option_grammar.rb +738 -0
  153. data/lib/aws/core/options/json_serializer.rb +82 -0
  154. data/lib/aws/core/options/validator.rb +155 -0
  155. data/lib/aws/core/options/xml_serializer.rb +118 -0
  156. data/lib/aws/core/page_result.rb +75 -0
  157. data/lib/aws/core/policy.rb +941 -0
  158. data/lib/aws/core/query_client.rb +41 -0
  159. data/lib/aws/core/query_error_parser.rb +24 -0
  160. data/lib/aws/core/query_request_builder.rb +47 -0
  161. data/lib/aws/core/query_response_parser.rb +35 -0
  162. data/lib/aws/core/region.rb +85 -0
  163. data/lib/aws/core/region_collection.rb +80 -0
  164. data/lib/aws/core/resource.rb +413 -0
  165. data/lib/aws/core/resource_cache.rb +40 -0
  166. data/lib/aws/core/response.rb +215 -0
  167. data/lib/aws/core/response_cache.rb +50 -0
  168. data/lib/aws/core/rest_error_parser.rb +24 -0
  169. data/lib/aws/core/rest_json_client.rb +40 -0
  170. data/lib/aws/core/rest_request_builder.rb +154 -0
  171. data/lib/aws/core/rest_response_parser.rb +66 -0
  172. data/lib/aws/core/rest_xml_client.rb +47 -0
  173. data/lib/aws/core/service_interface.rb +83 -0
  174. data/lib/aws/core/signers/base.rb +46 -0
  175. data/lib/aws/core/signers/cloud_front.rb +56 -0
  176. data/lib/aws/core/signers/s3.rb +159 -0
  177. data/lib/aws/core/signers/version_2.rb +72 -0
  178. data/lib/aws/core/signers/version_3.rb +86 -0
  179. data/lib/aws/core/signers/version_3_https.rb +61 -0
  180. data/lib/aws/core/signers/version_4.rb +228 -0
  181. data/lib/aws/core/signers/version_4/chunk_signed_stream.rb +191 -0
  182. data/lib/aws/core/uri_escape.rb +44 -0
  183. data/lib/aws/core/xml/frame.rb +245 -0
  184. data/lib/aws/core/xml/frame_stack.rb +85 -0
  185. data/lib/aws/core/xml/grammar.rb +307 -0
  186. data/lib/aws/core/xml/parser.rb +70 -0
  187. data/lib/aws/core/xml/root_frame.rb +65 -0
  188. data/lib/aws/core/xml/sax_handlers/libxml.rb +47 -0
  189. data/lib/aws/core/xml/sax_handlers/nokogiri.rb +56 -0
  190. data/lib/aws/core/xml/sax_handlers/ox.rb +41 -0
  191. data/lib/aws/core/xml/sax_handlers/rexml.rb +47 -0
  192. data/lib/aws/core/xml/stub.rb +123 -0
  193. data/lib/aws/data_pipeline.rb +72 -0
  194. data/lib/aws/data_pipeline/client.rb +36 -0
  195. data/lib/aws/data_pipeline/config.rb +18 -0
  196. data/lib/aws/data_pipeline/errors.rb +20 -0
  197. data/lib/aws/direct_connect.rb +73 -0
  198. data/lib/aws/direct_connect/client.rb +36 -0
  199. data/lib/aws/direct_connect/config.rb +18 -0
  200. data/lib/aws/direct_connect/errors.rb +22 -0
  201. data/lib/aws/dynamo_db.rb +230 -0
  202. data/lib/aws/dynamo_db/attribute_collection.rb +456 -0
  203. data/lib/aws/dynamo_db/batch_get.rb +213 -0
  204. data/lib/aws/dynamo_db/batch_write.rb +254 -0
  205. data/lib/aws/dynamo_db/binary.rb +35 -0
  206. data/lib/aws/dynamo_db/client.rb +129 -0
  207. data/lib/aws/dynamo_db/client/v20111205.rb +1266 -0
  208. data/lib/aws/dynamo_db/client/v20120810.rb +1409 -0
  209. data/lib/aws/dynamo_db/client_v2.rb +44 -0
  210. data/lib/aws/dynamo_db/config.rb +24 -0
  211. data/lib/aws/dynamo_db/errors.rb +20 -0
  212. data/lib/aws/dynamo_db/expectations.rb +40 -0
  213. data/lib/aws/dynamo_db/item.rb +133 -0
  214. data/lib/aws/dynamo_db/item_collection.rb +856 -0
  215. data/lib/aws/dynamo_db/item_data.rb +31 -0
  216. data/lib/aws/dynamo_db/keys.rb +41 -0
  217. data/lib/aws/dynamo_db/primary_key_element.rb +48 -0
  218. data/lib/aws/dynamo_db/resource.rb +33 -0
  219. data/lib/aws/dynamo_db/table.rb +492 -0
  220. data/lib/aws/dynamo_db/table_collection.rb +165 -0
  221. data/lib/aws/dynamo_db/types.rb +111 -0
  222. data/lib/aws/ec2.rb +428 -0
  223. data/lib/aws/ec2/attachment.rb +135 -0
  224. data/lib/aws/ec2/attachment_collection.rb +54 -0
  225. data/lib/aws/ec2/availability_zone.rb +86 -0
  226. data/lib/aws/ec2/availability_zone_collection.rb +43 -0
  227. data/lib/aws/ec2/block_device_mappings.rb +53 -0
  228. data/lib/aws/ec2/client.rb +154 -0
  229. data/lib/aws/ec2/collection.rb +36 -0
  230. data/lib/aws/ec2/config.rb +21 -0
  231. data/lib/aws/ec2/customer_gateway.rb +90 -0
  232. data/lib/aws/ec2/customer_gateway_collection.rb +73 -0
  233. data/lib/aws/ec2/dhcp_options.rb +106 -0
  234. data/lib/aws/ec2/dhcp_options_collection.rb +87 -0
  235. data/lib/aws/ec2/elastic_ip.rb +209 -0
  236. data/lib/aws/ec2/elastic_ip_collection.rb +93 -0
  237. data/lib/aws/ec2/errors.rb +32 -0
  238. data/lib/aws/ec2/export_task.rb +120 -0
  239. data/lib/aws/ec2/export_task_collection.rb +67 -0
  240. data/lib/aws/ec2/filtered_collection.rb +87 -0
  241. data/lib/aws/ec2/has_permissions.rb +44 -0
  242. data/lib/aws/ec2/image.rb +270 -0
  243. data/lib/aws/ec2/image_collection.rb +219 -0
  244. data/lib/aws/ec2/instance.rb +803 -0
  245. data/lib/aws/ec2/instance_collection.rb +402 -0
  246. data/lib/aws/ec2/internet_gateway.rb +122 -0
  247. data/lib/aws/ec2/internet_gateway/attachment.rb +78 -0
  248. data/lib/aws/ec2/internet_gateway_collection.rb +54 -0
  249. data/lib/aws/ec2/key_pair.rb +82 -0
  250. data/lib/aws/ec2/key_pair_collection.rb +99 -0
  251. data/lib/aws/ec2/network_acl.rb +256 -0
  252. data/lib/aws/ec2/network_acl/association.rb +56 -0
  253. data/lib/aws/ec2/network_acl/entry.rb +147 -0
  254. data/lib/aws/ec2/network_acl_collection.rb +64 -0
  255. data/lib/aws/ec2/network_interface.rb +237 -0
  256. data/lib/aws/ec2/network_interface/attachment.rb +100 -0
  257. data/lib/aws/ec2/network_interface_collection.rb +103 -0
  258. data/lib/aws/ec2/permission_collection.rb +174 -0
  259. data/lib/aws/ec2/region.rb +106 -0
  260. data/lib/aws/ec2/region_collection.rb +51 -0
  261. data/lib/aws/ec2/reserved_instances.rb +57 -0
  262. data/lib/aws/ec2/reserved_instances_collection.rb +40 -0
  263. data/lib/aws/ec2/reserved_instances_offering.rb +60 -0
  264. data/lib/aws/ec2/reserved_instances_offering_collection.rb +45 -0
  265. data/lib/aws/ec2/resource.rb +161 -0
  266. data/lib/aws/ec2/resource_tag_collection.rb +211 -0
  267. data/lib/aws/ec2/route_table.rb +205 -0
  268. data/lib/aws/ec2/route_table/association.rb +119 -0
  269. data/lib/aws/ec2/route_table/route.rb +119 -0
  270. data/lib/aws/ec2/route_table_collection.rb +72 -0
  271. data/lib/aws/ec2/security_group.rb +482 -0
  272. data/lib/aws/ec2/security_group/ip_permission.rb +135 -0
  273. data/lib/aws/ec2/security_group/ip_permission_collection.rb +82 -0
  274. data/lib/aws/ec2/security_group_collection.rb +133 -0
  275. data/lib/aws/ec2/snapshot.rb +143 -0
  276. data/lib/aws/ec2/snapshot_collection.rb +131 -0
  277. data/lib/aws/ec2/subnet.rb +161 -0
  278. data/lib/aws/ec2/subnet_collection.rb +119 -0
  279. data/lib/aws/ec2/tag.rb +81 -0
  280. data/lib/aws/ec2/tag_collection.rb +107 -0
  281. data/lib/aws/ec2/tagged_collection.rb +67 -0
  282. data/lib/aws/ec2/tagged_item.rb +85 -0
  283. data/lib/aws/ec2/volume.rb +185 -0
  284. data/lib/aws/ec2/volume_collection.rb +102 -0
  285. data/lib/aws/ec2/vpc.rb +174 -0
  286. data/lib/aws/ec2/vpc_collection.rb +70 -0
  287. data/lib/aws/ec2/vpn_connection.rb +99 -0
  288. data/lib/aws/ec2/vpn_connection/telemetry.rb +49 -0
  289. data/lib/aws/ec2/vpn_connection_collection.rb +96 -0
  290. data/lib/aws/ec2/vpn_gateway.rb +123 -0
  291. data/lib/aws/ec2/vpn_gateway/attachment.rb +45 -0
  292. data/lib/aws/ec2/vpn_gateway_collection.rb +77 -0
  293. data/lib/aws/elastic_beanstalk.rb +49 -0
  294. data/lib/aws/elastic_beanstalk/client.rb +36 -0
  295. data/lib/aws/elastic_beanstalk/config.rb +18 -0
  296. data/lib/aws/elastic_beanstalk/errors.rb +22 -0
  297. data/lib/aws/elastic_transcoder.rb +29 -0
  298. data/lib/aws/elastic_transcoder/client.rb +48 -0
  299. data/lib/aws/elastic_transcoder/config.rb +18 -0
  300. data/lib/aws/elastic_transcoder/errors.rb +23 -0
  301. data/lib/aws/elasticache.rb +49 -0
  302. data/lib/aws/elasticache/client.rb +41 -0
  303. data/lib/aws/elasticache/config.rb +18 -0
  304. data/lib/aws/elasticache/errors.rb +22 -0
  305. data/lib/aws/elb.rb +66 -0
  306. data/lib/aws/elb/availability_zone_collection.rb +138 -0
  307. data/lib/aws/elb/backend_server_policy_collection.rb +139 -0
  308. data/lib/aws/elb/client.rb +35 -0
  309. data/lib/aws/elb/config.rb +18 -0
  310. data/lib/aws/elb/errors.rb +26 -0
  311. data/lib/aws/elb/instance_collection.rb +168 -0
  312. data/lib/aws/elb/listener.rb +190 -0
  313. data/lib/aws/elb/listener_collection.rb +113 -0
  314. data/lib/aws/elb/listener_opts.rb +45 -0
  315. data/lib/aws/elb/load_balancer.rb +280 -0
  316. data/lib/aws/elb/load_balancer_collection.rb +146 -0
  317. data/lib/aws/elb/load_balancer_policy.rb +93 -0
  318. data/lib/aws/elb/load_balancer_policy_collection.rb +208 -0
  319. data/lib/aws/emr.rb +87 -0
  320. data/lib/aws/emr/client.rb +35 -0
  321. data/lib/aws/emr/config.rb +18 -0
  322. data/lib/aws/emr/errors.rb +22 -0
  323. data/lib/aws/emr/instance_group.rb +138 -0
  324. data/lib/aws/emr/instance_group_collection.rb +82 -0
  325. data/lib/aws/emr/job_flow.rb +307 -0
  326. data/lib/aws/emr/job_flow_collection.rb +183 -0
  327. data/lib/aws/errors.rb +162 -0
  328. data/lib/aws/glacier.rb +79 -0
  329. data/lib/aws/glacier/archive.rb +56 -0
  330. data/lib/aws/glacier/archive_collection.rb +146 -0
  331. data/lib/aws/glacier/client.rb +49 -0
  332. data/lib/aws/glacier/config.rb +19 -0
  333. data/lib/aws/glacier/errors.rb +22 -0
  334. data/lib/aws/glacier/resource.rb +30 -0
  335. data/lib/aws/glacier/vault.rb +145 -0
  336. data/lib/aws/glacier/vault_collection.rb +75 -0
  337. data/lib/aws/glacier/vault_notification_configuration.rb +29 -0
  338. data/lib/aws/iam.rb +408 -0
  339. data/lib/aws/iam/access_key.rb +185 -0
  340. data/lib/aws/iam/access_key_collection.rb +128 -0
  341. data/lib/aws/iam/account_alias_collection.rb +79 -0
  342. data/lib/aws/iam/client.rb +49 -0
  343. data/lib/aws/iam/collection.rb +83 -0
  344. data/lib/aws/iam/config.rb +18 -0
  345. data/lib/aws/iam/errors.rb +22 -0
  346. data/lib/aws/iam/group.rb +111 -0
  347. data/lib/aws/iam/group_collection.rb +132 -0
  348. data/lib/aws/iam/group_policy_collection.rb +47 -0
  349. data/lib/aws/iam/group_user_collection.rb +84 -0
  350. data/lib/aws/iam/login_profile.rb +111 -0
  351. data/lib/aws/iam/mfa_device.rb +52 -0
  352. data/lib/aws/iam/mfa_device_collection.rb +127 -0
  353. data/lib/aws/iam/policy.rb +46 -0
  354. data/lib/aws/iam/policy_collection.rb +188 -0
  355. data/lib/aws/iam/resource.rb +62 -0
  356. data/lib/aws/iam/server_certificate.rb +148 -0
  357. data/lib/aws/iam/server_certificate_collection.rb +138 -0
  358. data/lib/aws/iam/signing_certificate.rb +186 -0
  359. data/lib/aws/iam/signing_certificate_collection.rb +131 -0
  360. data/lib/aws/iam/user.rb +200 -0
  361. data/lib/aws/iam/user_collection.rb +133 -0
  362. data/lib/aws/iam/user_group_collection.rb +98 -0
  363. data/lib/aws/iam/user_policy.rb +90 -0
  364. data/lib/aws/iam/user_policy_collection.rb +45 -0
  365. data/lib/aws/iam/virtual_mfa_device.rb +139 -0
  366. data/lib/aws/iam/virtual_mfa_device_collection.rb +73 -0
  367. data/lib/aws/import_export.rb +73 -0
  368. data/lib/aws/import_export/client.rb +35 -0
  369. data/lib/aws/import_export/config.rb +19 -0
  370. data/lib/aws/import_export/errors.rb +22 -0
  371. data/lib/aws/kinesis.rb +53 -0
  372. data/lib/aws/kinesis/client.rb +35 -0
  373. data/lib/aws/kinesis/config.rb +18 -0
  374. data/lib/aws/kinesis/errors.rb +20 -0
  375. data/lib/aws/ops_works.rb +29 -0
  376. data/lib/aws/ops_works/client.rb +35 -0
  377. data/lib/aws/ops_works/config.rb +18 -0
  378. data/lib/aws/ops_works/errors.rb +20 -0
  379. data/lib/aws/rails.rb +195 -0
  380. data/lib/aws/rds.rb +70 -0
  381. data/lib/aws/rds/client.rb +42 -0
  382. data/lib/aws/rds/config.rb +18 -0
  383. data/lib/aws/rds/db_instance.rb +215 -0
  384. data/lib/aws/rds/db_instance_collection.rb +75 -0
  385. data/lib/aws/rds/db_snapshot.rb +163 -0
  386. data/lib/aws/rds/db_snapshot_collection.rb +89 -0
  387. data/lib/aws/rds/errors.rb +22 -0
  388. data/lib/aws/record.rb +139 -0
  389. data/lib/aws/record/abstract_base.rb +689 -0
  390. data/lib/aws/record/attributes.rb +388 -0
  391. data/lib/aws/record/conversion.rb +38 -0
  392. data/lib/aws/record/dirty_tracking.rb +287 -0
  393. data/lib/aws/record/errors.rb +143 -0
  394. data/lib/aws/record/exceptions.rb +51 -0
  395. data/lib/aws/record/hash_model.rb +204 -0
  396. data/lib/aws/record/hash_model/attributes.rb +195 -0
  397. data/lib/aws/record/hash_model/finder_methods.rb +172 -0
  398. data/lib/aws/record/hash_model/scope.rb +108 -0
  399. data/lib/aws/record/model.rb +453 -0
  400. data/lib/aws/record/model/attributes.rb +377 -0
  401. data/lib/aws/record/model/finder_methods.rb +232 -0
  402. data/lib/aws/record/model/scope.rb +212 -0
  403. data/lib/aws/record/naming.rb +31 -0
  404. data/lib/aws/record/scope.rb +203 -0
  405. data/lib/aws/record/validations.rb +694 -0
  406. data/lib/aws/record/validator.rb +246 -0
  407. data/lib/aws/record/validators/acceptance.rb +49 -0
  408. data/lib/aws/record/validators/block.rb +36 -0
  409. data/lib/aws/record/validators/confirmation.rb +41 -0
  410. data/lib/aws/record/validators/count.rb +106 -0
  411. data/lib/aws/record/validators/exclusion.rb +41 -0
  412. data/lib/aws/record/validators/format.rb +55 -0
  413. data/lib/aws/record/validators/inclusion.rb +54 -0
  414. data/lib/aws/record/validators/length.rb +105 -0
  415. data/lib/aws/record/validators/method.rb +31 -0
  416. data/lib/aws/record/validators/numericality.rb +136 -0
  417. data/lib/aws/record/validators/presence.rb +43 -0
  418. data/lib/aws/redshift.rb +51 -0
  419. data/lib/aws/redshift/client.rb +35 -0
  420. data/lib/aws/redshift/config.rb +18 -0
  421. data/lib/aws/redshift/errors.rb +22 -0
  422. data/lib/aws/route_53.rb +86 -0
  423. data/lib/aws/route_53/change_batch.rb +161 -0
  424. data/lib/aws/route_53/change_info.rb +72 -0
  425. data/lib/aws/route_53/client.rb +38 -0
  426. data/lib/aws/route_53/config.rb +18 -0
  427. data/lib/aws/route_53/errors.rb +22 -0
  428. data/lib/aws/route_53/hosted_zone.rb +134 -0
  429. data/lib/aws/route_53/hosted_zone_collection.rb +101 -0
  430. data/lib/aws/route_53/resource_record_set.rb +251 -0
  431. data/lib/aws/route_53/resource_record_set_collection.rb +110 -0
  432. data/lib/aws/s3.rb +156 -0
  433. data/lib/aws/s3/access_control_list.rb +265 -0
  434. data/lib/aws/s3/acl_object.rb +264 -0
  435. data/lib/aws/s3/acl_options.rb +204 -0
  436. data/lib/aws/s3/bucket.rb +742 -0
  437. data/lib/aws/s3/bucket_collection.rb +162 -0
  438. data/lib/aws/s3/bucket_lifecycle_configuration.rb +473 -0
  439. data/lib/aws/s3/bucket_tag_collection.rb +111 -0
  440. data/lib/aws/s3/bucket_version_collection.rb +79 -0
  441. data/lib/aws/s3/cipher_io.rb +120 -0
  442. data/lib/aws/s3/client.rb +2067 -0
  443. data/lib/aws/s3/client/xml.rb +266 -0
  444. data/lib/aws/s3/config.rb +48 -0
  445. data/lib/aws/s3/cors_rule.rb +108 -0
  446. data/lib/aws/s3/cors_rule_collection.rb +194 -0
  447. data/lib/aws/s3/data_options.rb +191 -0
  448. data/lib/aws/s3/encryption_utils.rb +146 -0
  449. data/lib/aws/s3/errors.rb +94 -0
  450. data/lib/aws/s3/multipart_upload.rb +353 -0
  451. data/lib/aws/s3/multipart_upload_collection.rb +76 -0
  452. data/lib/aws/s3/object_collection.rb +353 -0
  453. data/lib/aws/s3/object_metadata.rb +103 -0
  454. data/lib/aws/s3/object_upload_collection.rb +77 -0
  455. data/lib/aws/s3/object_version.rb +154 -0
  456. data/lib/aws/s3/object_version_collection.rb +89 -0
  457. data/lib/aws/s3/paginated_collection.rb +75 -0
  458. data/lib/aws/s3/policy.rb +74 -0
  459. data/lib/aws/s3/prefix_and_delimiter_collection.rb +47 -0
  460. data/lib/aws/s3/prefixed_collection.rb +85 -0
  461. data/lib/aws/s3/presign_v4.rb +136 -0
  462. data/lib/aws/s3/presigned_post.rb +554 -0
  463. data/lib/aws/s3/request.rb +62 -0
  464. data/lib/aws/s3/s3_object.rb +1784 -0
  465. data/lib/aws/s3/tree.rb +116 -0
  466. data/lib/aws/s3/tree/branch_node.rb +68 -0
  467. data/lib/aws/s3/tree/child_collection.rb +104 -0
  468. data/lib/aws/s3/tree/leaf_node.rb +94 -0
  469. data/lib/aws/s3/tree/node.rb +22 -0
  470. data/lib/aws/s3/tree/parent.rb +87 -0
  471. data/lib/aws/s3/uploaded_part.rb +82 -0
  472. data/lib/aws/s3/uploaded_part_collection.rb +84 -0
  473. data/lib/aws/s3/website_configuration.rb +102 -0
  474. data/lib/aws/simple_db.rb +218 -0
  475. data/lib/aws/simple_db/attribute.rb +156 -0
  476. data/lib/aws/simple_db/attribute_collection.rb +240 -0
  477. data/lib/aws/simple_db/client.rb +67 -0
  478. data/lib/aws/simple_db/config.rb +20 -0
  479. data/lib/aws/simple_db/consistent_read_option.rb +42 -0
  480. data/lib/aws/simple_db/delete_attributes.rb +62 -0
  481. data/lib/aws/simple_db/domain.rb +123 -0
  482. data/lib/aws/simple_db/domain_collection.rb +86 -0
  483. data/lib/aws/simple_db/domain_metadata.rb +110 -0
  484. data/lib/aws/simple_db/errors.rb +55 -0
  485. data/lib/aws/simple_db/expect_condition_option.rb +45 -0
  486. data/lib/aws/simple_db/item.rb +93 -0
  487. data/lib/aws/simple_db/item_collection.rb +654 -0
  488. data/lib/aws/simple_db/item_data.rb +73 -0
  489. data/lib/aws/simple_db/put_attributes.rb +60 -0
  490. data/lib/aws/simple_email_service.rb +443 -0
  491. data/lib/aws/simple_email_service/client.rb +37 -0
  492. data/lib/aws/simple_email_service/config.rb +18 -0
  493. data/lib/aws/simple_email_service/email_address_collection.rb +69 -0
  494. data/lib/aws/simple_email_service/errors.rb +22 -0
  495. data/lib/aws/simple_email_service/identity.rb +230 -0
  496. data/lib/aws/simple_email_service/identity_collection.rb +81 -0
  497. data/lib/aws/simple_email_service/quotas.rb +66 -0
  498. data/lib/aws/simple_workflow.rb +227 -0
  499. data/lib/aws/simple_workflow/activity_task.rb +178 -0
  500. data/lib/aws/simple_workflow/activity_task_collection.rb +123 -0
  501. data/lib/aws/simple_workflow/activity_type.rb +131 -0
  502. data/lib/aws/simple_workflow/activity_type_collection.rb +93 -0
  503. data/lib/aws/simple_workflow/client.rb +69 -0
  504. data/lib/aws/simple_workflow/config.rb +18 -0
  505. data/lib/aws/simple_workflow/count.rb +49 -0
  506. data/lib/aws/simple_workflow/decision_task.rb +603 -0
  507. data/lib/aws/simple_workflow/decision_task_collection.rb +223 -0
  508. data/lib/aws/simple_workflow/domain.rb +122 -0
  509. data/lib/aws/simple_workflow/domain_collection.rb +169 -0
  510. data/lib/aws/simple_workflow/errors.rb +20 -0
  511. data/lib/aws/simple_workflow/history_event.rb +276 -0
  512. data/lib/aws/simple_workflow/history_event_collection.rb +76 -0
  513. data/lib/aws/simple_workflow/option_formatters.rb +82 -0
  514. data/lib/aws/simple_workflow/resource.rb +94 -0
  515. data/lib/aws/simple_workflow/type.rb +89 -0
  516. data/lib/aws/simple_workflow/type_collection.rb +140 -0
  517. data/lib/aws/simple_workflow/workflow_execution.rb +384 -0
  518. data/lib/aws/simple_workflow/workflow_execution_collection.rb +617 -0
  519. data/lib/aws/simple_workflow/workflow_type.rb +177 -0
  520. data/lib/aws/simple_workflow/workflow_type_collection.rb +91 -0
  521. data/lib/aws/sns.rb +76 -0
  522. data/lib/aws/sns/client.rb +35 -0
  523. data/lib/aws/sns/config.rb +18 -0
  524. data/lib/aws/sns/errors.rb +22 -0
  525. data/lib/aws/sns/has_delivery_policy.rb +68 -0
  526. data/lib/aws/sns/message.rb +204 -0
  527. data/lib/aws/sns/originators/from_auto_scaling.rb +68 -0
  528. data/lib/aws/sns/policy.rb +47 -0
  529. data/lib/aws/sns/subscription.rb +165 -0
  530. data/lib/aws/sns/subscription_collection.rb +78 -0
  531. data/lib/aws/sns/topic.rb +403 -0
  532. data/lib/aws/sns/topic_collection.rb +62 -0
  533. data/lib/aws/sns/topic_subscription_collection.rb +54 -0
  534. data/lib/aws/sqs.rb +80 -0
  535. data/lib/aws/sqs/client.rb +53 -0
  536. data/lib/aws/sqs/config.rb +20 -0
  537. data/lib/aws/sqs/errors.rb +125 -0
  538. data/lib/aws/sqs/policy.rb +48 -0
  539. data/lib/aws/sqs/queue.rb +856 -0
  540. data/lib/aws/sqs/queue_collection.rb +186 -0
  541. data/lib/aws/sqs/received_message.rb +190 -0
  542. data/lib/aws/sqs/received_sns_message.rb +116 -0
  543. data/lib/aws/storage_gateway.rb +72 -0
  544. data/lib/aws/storage_gateway/client.rb +42 -0
  545. data/lib/aws/storage_gateway/config.rb +18 -0
  546. data/lib/aws/storage_gateway/errors.rb +22 -0
  547. data/lib/aws/sts.rb +164 -0
  548. data/lib/aws/sts/client.rb +55 -0
  549. data/lib/aws/sts/config.rb +18 -0
  550. data/lib/aws/sts/errors.rb +22 -0
  551. data/lib/aws/sts/federated_session.rb +56 -0
  552. data/lib/aws/sts/policy.rb +30 -0
  553. data/lib/aws/sts/session.rb +48 -0
  554. data/lib/aws/support.rb +29 -0
  555. data/lib/aws/support/client.rb +35 -0
  556. data/lib/aws/support/config.rb +18 -0
  557. data/lib/aws/support/errors.rb +20 -0
  558. data/lib/aws/version.rb +17 -0
  559. data/rails/init.rb +15 -0
  560. metadata +634 -0
@@ -0,0 +1,82 @@
1
+ # Copyright 2011-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"). You
4
+ # may not use this file except in compliance with the License. A copy of
5
+ # the License is located at
6
+ #
7
+ # http://aws.amazon.com/apache2.0/
8
+ #
9
+ # or in the "license" file accompanying this file. This file is
10
+ # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
11
+ # ANY KIND, either express or implied. See the License for the specific
12
+ # language governing permissions and limitations under the License.
13
+
14
+ require 'json'
15
+ require 'base64'
16
+
17
+ module AWS
18
+ module Core
19
+ module Options
20
+
21
+ # Given a hash of serialization rules, a JSONSerializer can convert
22
+ # a hash of request options into a JSON document. The request options
23
+ # are validated before returning JSON.
24
+ class JSONSerializer
25
+
26
+ # @param [Hash] rules A hash of option rules to validate against.
27
+ # @param [String,nil] payload_param
28
+ def initialize rules, payload_param
29
+ @payload_param = payload_param
30
+ @rules = @payload_param ? rules[@payload_param][:members] : rules
31
+ end
32
+
33
+ # @return [String] Returns the name of the API operation.
34
+ attr_reader :operation_name
35
+
36
+ # @return [String]
37
+ attr_reader :namespace
38
+
39
+ # @return [Hash]
40
+ attr_reader :rules
41
+
42
+ # @overload serialize!(request_options)
43
+ # @param [Hash] request_options A hash of already validated
44
+ # request options with normalized values.
45
+ # @return [String] Returns an string of the request parameters
46
+ # serialized into XML.
47
+ def serialize request_options
48
+ request_options = request_options[@payload_param] if @payload_param
49
+ data = normalize_keys(request_options, rules)
50
+ if rules.any?{|k,v| v[:location] == 'body' }
51
+ data = data.values.first
52
+ end
53
+ JSON.pretty_generate(data)
54
+ end
55
+
56
+ protected
57
+
58
+ def normalize_keys values, rules
59
+ values.inject({}) do |h,(k,v)|
60
+ child_rules = rules[k]
61
+ child_name = child_rules[:name] || Inflection.class_name(k.to_s)
62
+ h.merge(child_name => normalize_value(v, child_rules))
63
+ end
64
+ end
65
+
66
+ def normalize_value value, rules
67
+ case rules[:type]
68
+ when :hash then normalize_keys(value, rules[:members])
69
+ when :array then value.map{|v| normalize_value(v, rules[:members]) }
70
+ when :map
71
+ value.inject({}) do |h,(k,v)|
72
+ h.merge(k => normalize_value(v, rules[:members]))
73
+ end
74
+ when :blob then Base64.encode64(value.read).strip
75
+ else value
76
+ end
77
+ end
78
+
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,155 @@
1
+ # Copyright 2011-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"). You
4
+ # may not use this file except in compliance with the License. A copy of
5
+ # the License is located at
6
+ #
7
+ # http://aws.amazon.com/apache2.0/
8
+ #
9
+ # or in the "license" file accompanying this file. This file is
10
+ # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
11
+ # ANY KIND, either express or implied. See the License for the specific
12
+ # language governing permissions and limitations under the License.
13
+
14
+ module AWS
15
+ module Core
16
+ module Options
17
+
18
+ # Given a hash of validation rules, a validator validate request
19
+ # options. Validations support:
20
+ #
21
+ # * rejecting unknown options
22
+ # * ensuring presence of required options
23
+ # * validating expected option types (e.g. hash, array, string,
24
+ # integer, etc).
25
+ #
26
+ # After validating, a hash of request options is returned with
27
+ # with normalized values (with converted types).
28
+ class Validator
29
+
30
+ # @param [Hash] rules A hash of option rules to validate against.
31
+ def initialize rules
32
+ @rules = rules
33
+ end
34
+
35
+ # @return [Hash]
36
+ attr_reader :rules
37
+
38
+ # @overload validate!(request_options)
39
+ # @param [Hash] request_options The hash of options to validate.
40
+ # @raise [ArgumentError] Raised when the options do not validate.
41
+ # @return [Hash]
42
+ def validate! request_options, rules = @rules
43
+
44
+ # Verify all required options are present.
45
+ rules.each_pair do |opt_name, opt_rules|
46
+ if opt_rules[:required]
47
+ unless request_options.key?(opt_name)
48
+ raise ArgumentError, "missing required option #{opt_name.inspect}"
49
+ end
50
+ end
51
+ end
52
+
53
+ request_options.inject({}) do |options, (opt_name, value)|
54
+
55
+ # Ensure this is a valid/accepted option
56
+ unless rules.key?(opt_name)
57
+ raise ArgumentError, "unexpected option #{opt_name.inspect}"
58
+ end
59
+
60
+ # Validate and convert the value
61
+ valid_value = validate_value(rules[opt_name], value, opt_name)
62
+
63
+ options.merge(opt_name => valid_value)
64
+
65
+ end
66
+ end
67
+
68
+ protected
69
+
70
+ # Proxies calls to the correct validation method based on the
71
+ # rules[:type].
72
+ def validate_value *args
73
+ send("validate_#{args.first[:type]}", *args)
74
+ end
75
+
76
+ # Ensures the value is a hash and validates the hash context.
77
+ def validate_hash rules, value, opt_name, context = nil
78
+ unless value.respond_to?(:to_hash)
79
+ format_error('hash value', opt_name, context)
80
+ end
81
+ validate!(value.to_hash, rules[:members])
82
+ end
83
+
84
+ def validate_map rules, value, opt_name, context = nil
85
+ unless value.respond_to?(:to_hash)
86
+ format_error('hash value', opt_name, context)
87
+ end
88
+ value.inject({}) do |values,(k,v)|
89
+ context = "member #{k.inspect} of :#{opt_name}"
90
+ values[k] = validate_value(rules[:members], v, opt_name, context)
91
+ values
92
+ end
93
+ end
94
+
95
+ # Ensures the value is an array (or at least enumerable) and
96
+ # that the yielded values are valid.
97
+ def validate_array rules, value, opt_name, context = nil
98
+ unless value.respond_to?(:each)
99
+ format_error('enumerable value', opt_name, context)
100
+ end
101
+ values = []
102
+ value.each do |v|
103
+ context = "member #{values.size} of :#{opt_name}"
104
+ values << validate_value(rules[:members], v, opt_name, context)
105
+ end
106
+ values
107
+ end
108
+
109
+ # Ensures the value is a string.
110
+ def validate_string rules, value, opt_name, context = nil
111
+
112
+ unless value.respond_to?(:to_str)
113
+ format_error('string value', opt_name, context)
114
+ end
115
+
116
+ rules[:lstrip] ?
117
+ value.to_str.sub(/^#{rules[:lstrip]}/, '') :
118
+ value.to_str
119
+ end
120
+
121
+ # Ensures the value is a boolean.
122
+ def validate_boolean rules, value, opt_name, context = nil
123
+ unless [true, false].include?(value)
124
+ format_error('true or false', opt_name, context)
125
+ end
126
+ value
127
+ end
128
+
129
+ # Ensures the value is an integer.
130
+ def validate_integer rules, value, opt_name, context = nil
131
+ unless value.respond_to?(:to_int)
132
+ format_error('integer value', opt_name, context)
133
+ end
134
+ value.to_int
135
+ end
136
+
137
+ # Ensures the value is a timestamp.
138
+ def validate_timestamp rules, value, opt_name, context = nil
139
+ # TODO : add validation to timestamps values
140
+ value.to_s
141
+ end
142
+
143
+ def validate_blob rules, value, opt_name, context = nil
144
+ value
145
+ end
146
+
147
+ def format_error description, opt_name, context
148
+ context = context || "option :#{opt_name}"
149
+ raise ArgumentError, "expected #{description} for #{context}"
150
+ end
151
+
152
+ end
153
+ end
154
+ end
155
+ end
@@ -0,0 +1,118 @@
1
+ # Copyright 2011-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"). You
4
+ # may not use this file except in compliance with the License. A copy of
5
+ # the License is located at
6
+ #
7
+ # http://aws.amazon.com/apache2.0/
8
+ #
9
+ # or in the "license" file accompanying this file. This file is
10
+ # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
11
+ # ANY KIND, either express or implied. See the License for the specific
12
+ # language governing permissions and limitations under the License.
13
+
14
+ require 'nokogiri'
15
+
16
+ module AWS
17
+ module Core
18
+ module Options
19
+
20
+ # Given a hash of serialization rules, an XMLSerializer can convert
21
+ # a hash of request options into XML. The request options are
22
+ # validated before returning XML.
23
+ class XMLSerializer
24
+
25
+ # @param [String] namespace
26
+ # @param [String] operation_name
27
+ # @param [Hash] operation
28
+ def initialize namespace, operation_name, operation
29
+ @namespace = namespace
30
+ @operation_name = operation_name
31
+ @rules = operation[:inputs]
32
+ @http = operation[:http]
33
+ @validator = Validator.new(rules)
34
+ end
35
+
36
+ # @return [String] Returns the name of the API operation.
37
+ attr_reader :operation_name
38
+
39
+ # @return [String]
40
+ attr_reader :namespace
41
+
42
+ # @return [Hash]
43
+ attr_reader :rules
44
+
45
+ # @return [Hash,nil]
46
+ attr_reader :http
47
+
48
+ # @return [Validator]
49
+ attr_reader :validator
50
+
51
+ # @overload serialize!(request_options)
52
+ # @param [Hash] request_options A hash of already validated
53
+ # request options with normalized values.
54
+ # @return [String] Returns an string of the request parameters
55
+ # serialized into XML.
56
+ def serialize request_options
57
+ if http && http[:request_payload]
58
+ payload = http[:request_payload]
59
+ root_node_name = rules[payload][:name]
60
+ params = request_options[payload]
61
+ rules = self.rules[payload][:members]
62
+ else
63
+ root_node_name = "#{operation_name}Request"
64
+ params = request_options
65
+ rules = self.rules
66
+ end
67
+ xml = Nokogiri::XML::Builder.new
68
+ xml.send(root_node_name, :xmlns => namespace) do |xml|
69
+ hash_members_xml(params, rules, xml)
70
+ end
71
+ xml.doc.root.to_xml
72
+ end
73
+
74
+ protected
75
+
76
+ def to_xml builder, opt_name, rules, value
77
+
78
+ xml_name = rules[:name]
79
+ xml_name ||= opt_name.is_a?(String) ?
80
+ opt_name : Inflection.class_name(opt_name.to_s)
81
+
82
+ case value
83
+ when Hash
84
+
85
+ builder.send(xml_name) do |builder|
86
+ hash_members_xml(value, rules[:members], builder)
87
+ end
88
+
89
+ when Array
90
+ builder.send(xml_name) do
91
+ value.each do |member_value|
92
+ to_xml(builder, 'member', rules[:members], member_value)
93
+ end
94
+ end
95
+ else builder.send(xml_name, value)
96
+ end
97
+
98
+ end
99
+
100
+ def hash_members_xml hash, rules, builder
101
+ xml_ordered_members(rules).each do |member_name|
102
+ if hash.key?(member_name)
103
+ value = hash[member_name]
104
+ to_xml(builder, member_name, rules[member_name], value)
105
+ end
106
+ end
107
+ end
108
+
109
+ def xml_ordered_members members
110
+ members.inject([]) do |list,(member_name, member)|
111
+ list << [member[:position] || 0, member_name]
112
+ end.sort_by(&:first).map(&:last)
113
+ end
114
+
115
+ end
116
+ end
117
+ end
118
+ end
@@ -0,0 +1,75 @@
1
+ # Copyright 2011-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"). You
4
+ # may not use this file except in compliance with the License. A copy of
5
+ # the License is located at
6
+ #
7
+ # http://aws.amazon.com/apache2.0/
8
+ #
9
+ # or in the "license" file accompanying this file. This file is
10
+ # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
11
+ # ANY KIND, either express or implied. See the License for the specific
12
+ # language governing permissions and limitations under the License.
13
+
14
+ module AWS
15
+ module Core
16
+ class PageResult < Array
17
+
18
+ # @return [Collection] Returns the collection that was used to
19
+ # populated this page of results.
20
+ attr_reader :collection
21
+
22
+ # @return [Integer] Returns the maximum number of results per page.
23
+ # The final page in a collection may return fewer than `:per_page`
24
+ # items (e.g. `:per_page` is 10 and there are only 7 items).
25
+ attr_reader :per_page
26
+
27
+ # @return [String] An opaque token that can be passed the #page method
28
+ # of the collection that returned this page of results. This next
29
+ # token behaves as a pseudo offset. If `next_token` is `nil` then
30
+ # there are no more results for the collection.
31
+ attr_reader :next_token
32
+
33
+ # @param [Collection] collection The collection that was used to
34
+ # request this page of results. The collection should respond to
35
+ # #page and accept a :next_token option.
36
+ #
37
+ # @param [Array] items An array of result items that represent a
38
+ # page of results.
39
+ #
40
+ # @param [Integer] per_page The number of requested items for this
41
+ # page of results. If the count of items is smaller than `per_page`
42
+ # then this is the last page of results.
43
+ #
44
+ # @param [String] next_token (nil) A token that can be passed to the
45
+ #
46
+ def initialize collection, items, per_page, next_token
47
+ @collection = collection
48
+ @per_page = per_page
49
+ @next_token = next_token
50
+ super(items)
51
+ end
52
+
53
+ # @return [PageResult]
54
+ # @raise [RuntimeError] Raises a runtime error when called against
55
+ # a collection that has no more results (i.e. #last_page? == true).
56
+ def next_page
57
+ if last_page?
58
+ raise 'unable to get the next page, already at the last page'
59
+ end
60
+ collection.page(:per_page => per_page, :next_token => next_token)
61
+ end
62
+
63
+ # @return [Boolean] Returns `true` if this is the last page of results.
64
+ def last_page?
65
+ next_token.nil?
66
+ end
67
+
68
+ # @return [Boolean] Returns `true` if there are more pages of results.
69
+ def more?
70
+ !!next_token
71
+ end
72
+
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,941 @@
1
+ # Copyright 2011-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"). You
4
+ # may not use this file except in compliance with the License. A copy of
5
+ # the License is located at
6
+ #
7
+ # http://aws.amazon.com/apache2.0/
8
+ #
9
+ # or in the "license" file accompanying this file. This file is
10
+ # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
11
+ # ANY KIND, either express or implied. See the License for the specific
12
+ # language governing permissions and limitations under the License.
13
+
14
+ require 'date'
15
+ require 'json'
16
+
17
+ module AWS
18
+ module Core
19
+
20
+ # Represents an access policy for AWS operations and resources. For example:
21
+ #
22
+ # policy = Policy.new
23
+ # policy.allow(
24
+ # :actions => ['s3:PutObject'],
25
+ # :resources => "arn:aws:s3:::mybucket/mykey/*",
26
+ # :principals => :any
27
+ # ).where(:acl).is("public-read")
28
+ #
29
+ # policy.to_json # => '{ "Version":"2008-10-17", ...'
30
+ #
31
+ # @see #initialize More ways to construct a policy.
32
+ # @see http://docs.amazonwebservices.com/AmazonS3/latest/dev/AccessPolicyLanguage_UseCases_s3_a.html Example policies (in JSON).
33
+ class Policy
34
+
35
+ # @see Statement
36
+ # @return [Array] An array of policy statements.
37
+ attr_reader :statements
38
+
39
+ # @return [String] The version of the policy language used in this
40
+ # policy object.
41
+ attr_reader :version
42
+
43
+ # @return [String] A unique ID for the policy.
44
+ attr_reader :id
45
+
46
+ class Statement; end
47
+
48
+ # Constructs a policy. There are a few different ways to
49
+ # build a policy:
50
+ #
51
+ # * With hash arguments:
52
+ #
53
+ # Policy.new(:statements => [
54
+ # {
55
+ # :effect => :allow,
56
+ # :actions => :all,
57
+ # :principals => ["abc123"],
58
+ # :resources => "mybucket/mykey"
59
+ # }
60
+ # ])
61
+ #
62
+ # * From a JSON policy document:
63
+ #
64
+ # Policy.from_json(policy_json_string)
65
+ #
66
+ # * With a block:
67
+ #
68
+ # Policy.new do |policy|
69
+ # policy.allow(
70
+ # :actions => ['s3:PutObject'],
71
+ # :resources => "arn:aws:s3:::mybucket/mykey/*",
72
+ # :principals => :any
73
+ # ).where(:acl).is("public-read")
74
+ # end
75
+ #
76
+ def initialize(opts = {})
77
+ @statements = opts.values_at(:statements, "Statement").select do |a|
78
+ a.kind_of?(Array)
79
+ end.flatten.map do |stmt|
80
+ self.class::Statement.new(stmt)
81
+ end
82
+
83
+ if opts.has_key?(:id) or opts.has_key?("Id")
84
+ @id = opts[:id] || opts["Id"]
85
+ else
86
+ @id = SecureRandom.uuid.tr('-','')
87
+ end
88
+ if opts.has_key?(:version) or opts.has_key?("Version")
89
+ @version = opts[:version] || opts["Version"]
90
+ else
91
+ @version = "2008-10-17"
92
+ end
93
+
94
+ yield(self) if block_given?
95
+ end
96
+
97
+ # @return [Boolean] Returns true if the two policies are the same.
98
+ def ==(other)
99
+ if other.kind_of?(Core::Policy)
100
+ self.hash_without_ids == other.hash_without_ids
101
+ else
102
+ false
103
+ end
104
+ end
105
+ alias_method :eql?, :==
106
+
107
+ # Removes the ids from the policy and its statements for the purpose
108
+ # of comparing two policies for equivilence.
109
+ # @return [Hash] Returns the policy as a hash with no ids
110
+ # @api private
111
+ def hash_without_ids
112
+ hash = self.to_h
113
+ hash.delete('Id')
114
+ hash['Statement'].each do |statement|
115
+ statement.delete('Sid')
116
+ end
117
+ hash
118
+ end
119
+ protected :hash_without_ids
120
+
121
+ # Returns a hash representation of the policy. The following
122
+ # statements are equivalent:
123
+ #
124
+ # policy.to_h.to_json
125
+ # policy.to_json
126
+ #
127
+ # @return [Hash]
128
+ def to_h
129
+ {
130
+ "Version" => version,
131
+ "Id" => id,
132
+ "Statement" => statements.map { |st| st.to_h }
133
+ }
134
+ end
135
+
136
+ # @return [String] a JSON representation of the policy.
137
+ def to_json
138
+ to_h.to_json
139
+ end
140
+
141
+ # Constructs a policy from a JSON representation.
142
+ # @see #initialize
143
+ # @return [Policy] Returns a Policy object constructed by parsing
144
+ # the passed JSON policy.
145
+ def self.from_json(json)
146
+ new(JSON.parse(json))
147
+ end
148
+
149
+ # Convenient syntax for expressing operators in statement
150
+ # condition blocks. For example, the following:
151
+ #
152
+ # policy.allow.where(:s3_prefix).not("forbidden").
153
+ # where(:current_time).lte(Date.today+1)
154
+ #
155
+ # is equivalent to:
156
+ #
157
+ # conditions = Policy::ConditionBlock.new
158
+ # conditions.add(:not, :s3_prefix, "forbidden")
159
+ # conditions.add(:lte, :current_time, Date.today+1)
160
+ # policy.allow(:conditions => conditions)
161
+ #
162
+ # @see ConditionBlock#add
163
+ class OperatorBuilder
164
+
165
+ # @api private
166
+ def initialize(condition_builder, key)
167
+ @condition_builder = condition_builder
168
+ @key = key
169
+ end
170
+
171
+ def method_missing(m, *values)
172
+ @condition_builder.conditions.add(m, @key, *values)
173
+ @condition_builder
174
+ end
175
+
176
+ end
177
+
178
+ # Convenient syntax for adding conditions to a statement.
179
+ # @see Policy#allow
180
+ # @see Policy#deny
181
+ class ConditionBuilder
182
+
183
+ # @return [Array] Returns an array of policy conditions.
184
+ attr_reader :conditions
185
+
186
+ # @api private
187
+ def initialize(conditions)
188
+ @conditions = conditions
189
+ end
190
+
191
+ # Adds a condition for the given key. For example:
192
+ #
193
+ # policy.allow(...).where(:current_time).lte(Date.today + 1)
194
+ #
195
+ # @return [OperatorBuilder]
196
+ def where(key, operator = nil, *values)
197
+ if operator
198
+ @conditions.add(operator, key, *values)
199
+ self
200
+ else
201
+ OperatorBuilder.new(self, key)
202
+ end
203
+ end
204
+
205
+ end
206
+
207
+ # Convenience method for constructing a new statement with the
208
+ # "Allow" effect and adding it to the policy. For example:
209
+ #
210
+ # policy.allow(
211
+ # :actions => [:put_object],
212
+ # :principals => :any,
213
+ # :resources => "mybucket/mykey/*").
214
+ # where(:acl).is("public-read")
215
+ #
216
+ # @option (see Statement#initialize)
217
+ # @see Statement#initialize
218
+ # @return [ConditionBuilder]
219
+ def allow(opts = {})
220
+ stmt = self.class::Statement.new(opts.merge(:effect => :allow))
221
+ statements << stmt
222
+ ConditionBuilder.new(stmt.conditions)
223
+ end
224
+
225
+ # Convenience method for constructing a new statement with the
226
+ # "Deny" effect and adding it to the policy. For example:
227
+ #
228
+ # policy.deny(
229
+ # :actions => [:put_object],
230
+ # :principals => :any,
231
+ # :resources => "mybucket/mykey/*"
232
+ # ).where(:acl).is("public-read")
233
+ #
234
+ # @param (see Statement#initialize)
235
+ # @see Statement#initialize
236
+ # @return [ConditionBuilder]
237
+ def deny(opts = {})
238
+ stmt = self.class::Statement.new(opts.merge(:effect => :deny))
239
+ statements << stmt
240
+ ConditionBuilder.new(stmt.conditions)
241
+ end
242
+
243
+ # Represents the condition block of a policy. In JSON,
244
+ # condition blocks look like this:
245
+ #
246
+ # { "StringLike": { "s3:prefix": ["photos/*", "photos.html"] } }
247
+ #
248
+ # ConditionBlock lets you specify conditions like the above
249
+ # example using the add method, for example:
250
+ #
251
+ # conditions.add(:like, :s3_prefix, "photos/*", "photos.html")
252
+ #
253
+ # See the add method documentation for more details about how
254
+ # to specify keys and operators.
255
+ #
256
+ # This class also provides a convenient way to query a
257
+ # condition block to see what operators, keys, and values it
258
+ # has. For example, consider the following condition block
259
+ # (in JSON):
260
+ #
261
+ # {
262
+ # "StringEquals": {
263
+ # "s3:prefix": "photos/index.html"
264
+ # },
265
+ # "DateEquals": {
266
+ # "aws:CurrentTime": ["2010-10-12", "2011-01-02"]
267
+ # },
268
+ # "NumericEquals": {
269
+ # "s3:max-keys": 10
270
+ # }
271
+ # }
272
+ #
273
+ # You can get access to the condition data using #[], #keys,
274
+ # #operators, and #values -- for example:
275
+ #
276
+ # conditions["DateEquals"]["aws:CurrentTime"].values
277
+ # # => ["2010-10-12", "2011-01-02"]
278
+ #
279
+ # You can also perform more sophisticated queries, like this
280
+ # one:
281
+ #
282
+ # conditions[:is].each do |equality_conditions|
283
+ # equality_conditions.keys.each do |key|
284
+ # puts("#{key} may be any of: " +
285
+ # equality_conditions[key].values.join(" ")
286
+ # end
287
+ # end
288
+ #
289
+ # This would print the following lines:
290
+ #
291
+ # s3:prefix may be any of: photos/index.html
292
+ # aws:CurrentTime may be any of: 2010-10-12 2011-01-02
293
+ # s3:max-keys may be any of: 10
294
+ #
295
+ class ConditionBlock
296
+
297
+ # @api private
298
+ def initialize(conditions = {})
299
+ # filter makes a copy
300
+ @conditions = filter_conditions(conditions)
301
+ end
302
+
303
+ # Adds a condition to the block. This method defines a
304
+ # convenient set of abbreviations for operators based on the
305
+ # type of value passed in. For example:
306
+ #
307
+ # conditions.add(:is, :secure_transport, true)
308
+ #
309
+ # Maps to:
310
+ #
311
+ # { "Bool": { "aws:SecureTransport": true } }
312
+ #
313
+ # While:
314
+ #
315
+ # conditions.add(:is, :s3_prefix, "photos/")
316
+ #
317
+ # Maps to:
318
+ #
319
+ # { "StringEquals": { "s3:prefix": "photos/" } }
320
+ #
321
+ # The following list shows which operators are accepted as
322
+ # symbols and how they are represented in the JSON policy:
323
+ #
324
+ # * `:is` (StringEquals, NumericEquals, DateEquals, or Bool)
325
+ # * `:like` (StringLike)
326
+ # * `:not_like` (StringNotLike)
327
+ # * `:not` (StringNotEquals, NumericNotEquals, or DateNotEquals)
328
+ # * `:greater_than`, `:gt` (NumericGreaterThan or DateGreaterThan)
329
+ # * `:greater_than_equals`, `:gte`
330
+ # (NumericGreaterThanEquals or DateGreaterThanEquals)
331
+ # * `:less_than`, `:lt` (NumericLessThan or DateLessThan)
332
+ # * `:less_than_equals`, `:lte`
333
+ # (NumericLessThanEquals or DateLessThanEquals)
334
+ # * `:is_ip_address` (IpAddress)
335
+ # * `:not_ip_address` (NotIpAddress)
336
+ # * `:is_arn` (ArnEquals)
337
+ # * `:not_arn` (ArnNotEquals)
338
+ # * `:is_arn_like` (ArnLike)
339
+ # * `:not_arn_like` (ArnNotLike)
340
+ #
341
+ # @param [Symbol or String] operator The operator used to
342
+ # compare the key with the value. See above for valid
343
+ # values and their interpretations.
344
+ #
345
+ # @param [Symbol or String] key The key to compare. Symbol
346
+ # keys are inflected to match AWS conventions. By
347
+ # default, the key is assumed to be in the "aws"
348
+ # namespace, but if you prefix the symbol name with "s3_"
349
+ # it will be sent in the "s3" namespace. For example,
350
+ # `:s3_prefix` is sent as "s3:prefix" while
351
+ # `:secure_transport` is sent as "aws:SecureTransport".
352
+ # See
353
+ # http://docs.amazonwebservices.com/AmazonS3/latest/dev/UsingResOpsConditions.html
354
+ # for a list of the available keys for each action in S3.
355
+ #
356
+ # @param [Mixed] values The value to compare against.
357
+ # This can be:
358
+ # * a String
359
+ # * a number
360
+ # * a Date, DateTime, or Time
361
+ # * a boolean value
362
+ # This method does not attempt to validate that the values
363
+ # are valid for the operators or keys they are used with.
364
+ #
365
+ def add(operator, key, *values)
366
+ if operator.kind_of?(Symbol)
367
+ converted_values = values.map { |v| convert_value(v) }
368
+ else
369
+ converted_values = values
370
+ end
371
+ operator = translate_operator(operator, values.first)
372
+ op = (@conditions[operator] ||= {})
373
+ raise "duplicate #{operator} conditions for #{key}" if op[key]
374
+ op[translate_key(key)] = converted_values
375
+ end
376
+
377
+ # @api private
378
+ def to_h
379
+ @conditions
380
+ end
381
+
382
+ # Filters the conditions described in the block, returning a
383
+ # new ConditionBlock that contains only the matching
384
+ # conditions. Each argument is matched against either the
385
+ # keys or the operators in the block, and you can specify
386
+ # the key or operator in any way that's valid for the #add
387
+ # method. Some examples:
388
+ #
389
+ # # all conditions using the StringLike operator
390
+ # conditions["StringLike"]
391
+ #
392
+ # # all conditions using StringEquals, DateEquals, NumericEquals, or Bool
393
+ # conditions[:is]
394
+ #
395
+ # # all conditions on the s3:prefix key
396
+ # conditions["s3:prefix"]
397
+ #
398
+ # # all conditions on the aws:CurrentTime key
399
+ # conditions[:current_time]
400
+ #
401
+ # Multiple conditions are ANDed together, so the following
402
+ # are equivalent:
403
+ #
404
+ # conditions[:s3_prefix][:is]
405
+ # conditions[:is][:s3_prefix]
406
+ # conditions[:s3_prefix, :is]
407
+ #
408
+ # @see #add
409
+ # @return [ConditionBlock] A new set of conditions filtered by the
410
+ # given conditions.
411
+ def [](*args)
412
+ filtered = @conditions
413
+ args.each do |filter|
414
+ type = valid_operator?(filter) ? nil : :key
415
+ filtered = filter_conditions(filtered) do |op, key, value|
416
+ (match, type) = match_triple(filter, type, op, key, value)
417
+ match
418
+ end
419
+ end
420
+ self.class.new(filtered)
421
+ end
422
+
423
+ # @return [Array] Returns an array of operators used in this block.
424
+ def operators
425
+ @conditions.keys
426
+ end
427
+
428
+ # @return [Array] Returns an array of unique keys used in the block.
429
+ def keys
430
+ @conditions.values.map do |keys|
431
+ keys.keys if keys
432
+ end.compact.flatten.uniq
433
+ end
434
+
435
+ # Returns all values used in the block. Note that the
436
+ # values may not all be from the same condition; for example:
437
+ #
438
+ # conditions.add(:like, :user_agent, "mozilla", "explorer")
439
+ # conditions.add(:lt, :s3_max_keys, 12)
440
+ # conditions.values # => ["mozilla", "explorer", 12]
441
+ #
442
+ # @return [Array] Returns an array of values used in this condition block.
443
+ def values
444
+ @conditions.values.map do |keys|
445
+ keys.values
446
+ end.compact.flatten
447
+ end
448
+
449
+ # @api private
450
+ protected
451
+ def match_triple(filter, type, op, key, value)
452
+ value = [value].flatten.first
453
+ if type
454
+ target = (type == :operator ? op : key)
455
+ match = send("match_#{type}", filter, target, value)
456
+ else
457
+ if match_operator(filter, op, value)
458
+ match = true
459
+ type = :operator
460
+ elsif match_key(filter, key)
461
+ match = true
462
+ type = :key
463
+ else
464
+ match = false
465
+ end
466
+ end
467
+ [match, type]
468
+ end
469
+
470
+ # @api private
471
+ protected
472
+ def match_operator(filter, op, value)
473
+ # dates are the only values that don't come back as native types in JSON
474
+ # but where we use the type as a cue to the operator translation
475
+ value = Date.today if op =~ /^Date/
476
+ translate_operator(filter, value) == op
477
+ end
478
+
479
+ # @api private
480
+ protected
481
+ def match_key(filter, key, value = nil)
482
+ translate_key(filter) == key
483
+ end
484
+
485
+ # @api private
486
+ protected
487
+ def filter_conditions(conditions = @conditions)
488
+ conditions.inject({}) do |m, (op, keys)|
489
+ m[op] = keys.inject({}) do |m2, (key, value)|
490
+ m2[key] = value if !block_given? or yield(op, key, value)
491
+ m2
492
+ end
493
+ m.delete(op) if m[op].empty?
494
+ m
495
+ end
496
+ end
497
+
498
+ # @api private
499
+ protected
500
+ def translate_key(key)
501
+ if key.kind_of?(Symbol)
502
+ if key.to_s =~ /^s3_(.*)$/
503
+ s3_name = $1
504
+ if s3_name == "version_id" or
505
+ s3_name == "location_constraint"
506
+ s3_name = Inflection.class_name(s3_name)
507
+ else
508
+ s3_name.tr!('_', '-')
509
+ end
510
+ "s3:#{s3_name}"
511
+ else
512
+ "aws:#{Inflection.class_name(key.to_s)}"
513
+ end
514
+ else
515
+ key
516
+ end
517
+ end
518
+
519
+ # @api private
520
+ MODIFIERS = {
521
+ /_ignoring_case$/ => "IgnoreCase",
522
+ /_equals$/ => "Equals"
523
+ }
524
+
525
+ # @api private
526
+ protected
527
+ def valid_operator?(operator)
528
+ translate_operator(operator, "")
529
+ true
530
+ rescue ArgumentError => e
531
+ false
532
+ end
533
+
534
+ # @api private
535
+ protected
536
+ def translate_operator(operator, example_value)
537
+ return operator if operator.kind_of?(String)
538
+
539
+ original_operator = operator
540
+ (operator, opts) = strip_modifiers(operator)
541
+
542
+ raise ArgumentError.new("unrecognized operator #{original_operator}") unless
543
+ respond_to?("translate_#{operator}", true)
544
+ send("translate_#{operator}", example_value, opts)
545
+ end
546
+
547
+ # @api private
548
+ protected
549
+ def translate_is(example, opts)
550
+ return "Bool" if type_notation(example) == "Bool"
551
+ base_translate(example, "Equals", opts[:ignore_case])
552
+ end
553
+
554
+ # @api private
555
+ protected
556
+ def translate_not(example, opts)
557
+ base_translate(example, "NotEquals", opts[:ignore_case])
558
+ end
559
+
560
+ # @api private
561
+ protected
562
+ def translate_like(example, opts)
563
+ base_translate(example, "Like")
564
+ end
565
+
566
+ # @api private
567
+ protected
568
+ def translate_not_like(example, opts)
569
+ base_translate(example, "NotLike")
570
+ end
571
+
572
+ # @api private
573
+ protected
574
+ def translate_less_than(example, opts)
575
+ base_translate(example, "LessThan", opts[:equals])
576
+ end
577
+ alias_method :translate_lt, :translate_less_than
578
+
579
+ # @api private
580
+ protected
581
+ def translate_lte(example, opts)
582
+ translate_less_than(example, { :equals => "Equals" })
583
+ end
584
+
585
+ # @api private
586
+ protected
587
+ def translate_greater_than(example, opts)
588
+ base_translate(example, "GreaterThan", opts[:equals])
589
+ end
590
+ alias_method :translate_gt, :translate_greater_than
591
+
592
+ # @api private
593
+ protected
594
+ def translate_gte(example, opts)
595
+ translate_greater_than(example, { :equals => "Equals" })
596
+ end
597
+
598
+ # @api private
599
+ protected
600
+ def translate_is_ip_address(example, opts)
601
+ "IpAddress"
602
+ end
603
+
604
+ # @api private
605
+ protected
606
+ def translate_not_ip_address(example, opts)
607
+ "NotIpAddress"
608
+ end
609
+
610
+ # @api private
611
+ protected
612
+ def translate_is_arn(example, opts)
613
+ "ArnEquals"
614
+ end
615
+
616
+ # @api private
617
+ protected
618
+ def translate_not_arn(example, opts)
619
+ "ArnNotEquals"
620
+ end
621
+
622
+ # @api private
623
+ protected
624
+ def translate_is_arn_like(example, opts)
625
+ "ArnLike"
626
+ end
627
+
628
+ # @api private
629
+ protected
630
+ def translate_not_arn_like(example, opts)
631
+ "ArnNotLike"
632
+ end
633
+
634
+ # @api private
635
+ protected
636
+ def base_translate(example, base_operator, *modifiers)
637
+ "#{type_notation(example)}#{base_operator}#{modifiers.join}"
638
+ end
639
+
640
+ # @api private
641
+ protected
642
+ def type_notation(example)
643
+ case example
644
+ when String
645
+ "String"
646
+ when Numeric
647
+ "Numeric"
648
+ when Time, Date
649
+ "Date"
650
+ when true, false
651
+ "Bool"
652
+ end
653
+ end
654
+
655
+ # @api private
656
+ protected
657
+ def convert_value(value)
658
+ case value
659
+ when DateTime, Time
660
+ Time.parse(value.to_s).iso8601
661
+ when Date
662
+ value.strftime("%Y-%m-%d")
663
+ else
664
+ value
665
+ end
666
+ end
667
+
668
+ # @api private
669
+ protected
670
+ def strip_modifiers(operator)
671
+ opts = {}
672
+ MODIFIERS.each do |(regex, mod)|
673
+ ruby_name = Inflection.ruby_name(mod).to_sym
674
+ opts[ruby_name] = ""
675
+ if operator.to_s =~ regex
676
+ opts[ruby_name] = mod
677
+ operator = operator.to_s.sub(regex, '').to_sym
678
+ end
679
+ end
680
+ [operator, opts]
681
+ end
682
+
683
+ end
684
+
685
+ # Represents a statement in a policy.
686
+ #
687
+ # @see Policy#allow
688
+ # @see Policy#deny
689
+ class Statement
690
+
691
+ # @return [String] Returns the statement id
692
+ attr_accessor :sid
693
+
694
+ # @return [String] Returns the statement effect, either "Allow" or
695
+ # "Deny"
696
+ attr_accessor :effect
697
+
698
+ # @return [Array] Returns an array of principals.
699
+ attr_accessor :principals
700
+
701
+ # @return [Array] Returns an array of statement actions included
702
+ # by this policy statement.
703
+ attr_accessor :actions
704
+
705
+ # @return [Array] Returns an array of actions excluded by this
706
+ # policy statement.
707
+ attr_accessor :excluded_actions
708
+
709
+ # @return [Array] Returns an array of resources affected by this
710
+ # policy statement.
711
+ attr_accessor :resources
712
+
713
+ # @return [Array] Returns an array of conditions for this policy.
714
+ attr_accessor :conditions
715
+
716
+ attr_accessor :excluded_resources
717
+
718
+ # Constructs a new statement.
719
+ #
720
+ # @option opts [String] :sid The statement ID. This is optional; if
721
+ # omitted, a UUID will be generated for the statement.
722
+ # @option opts [String] :effect The statement effect, which must be either
723
+ # "Allow" or "Deny".
724
+ # @see Policy#allow
725
+ # @see Policy#deny
726
+ # @option opts [String or array of strings] :principals The account(s)
727
+ # affected by the statement. These should be AWS account IDs.
728
+ # @option opts :actions The action or actions affected by
729
+ # the statement. These can be symbols or strings. If
730
+ # they are strings, you can use wildcard character "*"
731
+ # to match zero or more characters in the action name.
732
+ # Symbols are expected to match methods of S3::Client.
733
+ # @option opts :excluded_actions Action or actions which are
734
+ # explicitly not affected by this statement. As with
735
+ # `:actions`, these may be symbols or strings.
736
+ # @option opts [String or array of strings] :resources The
737
+ # resource(s) affected by the statement. These can be
738
+ # expressed as ARNs (e.g. `arn:aws:s3:::mybucket/mykey`)
739
+ # or you may omit the `arn:aws:s3:::` prefix and just give
740
+ # the path as `bucket_name/key`. You may use the wildcard
741
+ # character "*" to match zero or more characters in the
742
+ # resource name.
743
+ # @option opts [ConditionBlock or Hash] :conditions
744
+ # Additional conditions that narrow the effect of the
745
+ # statement. It's typically more convenient to use the
746
+ # ConditionBuilder instance returned from Policy#allow or
747
+ # Policy#deny to add conditions to a statement.
748
+ # @see S3::Client
749
+ def initialize(opts = {})
750
+ self.sid = SecureRandom.uuid.tr('-','')
751
+ self.conditions = ConditionBlock.new
752
+
753
+ parse_options(opts)
754
+
755
+ yield(self) if block_given?
756
+ end
757
+
758
+ # Convenience method to add to the list of actions affected
759
+ # by this statement.
760
+ def include_actions(*actions)
761
+ self.actions ||= []
762
+ self.actions.push(*actions)
763
+ end
764
+ alias_method :include_action, :include_actions
765
+
766
+ # Convenience method to add to the list of actions
767
+ # explicitly not affected by this statement.
768
+ def exclude_actions(*actions)
769
+ self.excluded_actions ||= []
770
+ self.excluded_actions.push(*actions)
771
+ end
772
+ alias_method :exclude_action, :exclude_actions
773
+
774
+ # @api private
775
+ def to_h
776
+ stmt = {
777
+ "Sid" => sid,
778
+ "Effect" => Inflection.class_name(effect.to_s),
779
+ "Principal" => principals_hash,
780
+ "Resource" => (resource_arns if resource_arns),
781
+ "NotResource" => (excluded_resource_arns if excluded_resource_arns),
782
+ "Condition" => (conditions.to_h if conditions)
783
+ }
784
+ stmt.delete("Condition") if !conditions || conditions.to_h.empty?
785
+ stmt.delete("Principal") unless principals_hash
786
+ stmt.delete("Resource") unless resource_arns
787
+ stmt.delete("NotResource") unless excluded_resource_arns
788
+ if !translated_actions || translated_actions.empty?
789
+ stmt["NotAction"] = translated_excluded_actions
790
+ else
791
+ stmt["Action"] = translated_actions
792
+ end
793
+ stmt
794
+ end
795
+
796
+ protected
797
+ def parse_options(options)
798
+ options.each do |name, value|
799
+ name = Inflection.ruby_name(name.to_s)
800
+ name.sub!(/s$/,'')
801
+ send("parse_#{name}_option", value) if
802
+ respond_to?("parse_#{name}_option", true)
803
+ end
804
+ end
805
+
806
+ protected
807
+ def parse_effect_option(value)
808
+ self.effect = value
809
+ end
810
+
811
+ protected
812
+ def parse_sid_option(value)
813
+ self.sid = value
814
+ end
815
+
816
+ protected
817
+ def parse_action_option(value)
818
+ coerce_array_option(:actions, value)
819
+ end
820
+
821
+ protected
822
+ def parse_not_action_option(value)
823
+ coerce_array_option(:excluded_actions, value)
824
+ end
825
+ alias_method :parse_excluded_action_option, :parse_not_action_option
826
+
827
+ protected
828
+ def parse_principal_option(value)
829
+ if value and value.kind_of?(Hash)
830
+ value = value["AWS"] || []
831
+ end
832
+
833
+ coerce_array_option(:principals, value)
834
+ end
835
+
836
+ protected
837
+ def parse_resource_option(value)
838
+ coerce_array_option(:resources, value)
839
+ end
840
+
841
+ def parse_not_resource_option(value)
842
+ coerce_array_option(:excluded_resources, value)
843
+ end
844
+ alias_method :parse_excluded_resource_option, :parse_not_resource_option
845
+
846
+ protected
847
+ def parse_condition_option(value)
848
+ self.conditions = ConditionBlock.new(value)
849
+ end
850
+
851
+ protected
852
+ def coerce_array_option(attr, value)
853
+ if value.kind_of?(Array)
854
+ send("#{attr}=", value)
855
+ else
856
+ send("#{attr}=", [value])
857
+ end
858
+ end
859
+
860
+ protected
861
+ def principals_hash
862
+ return nil unless principals
863
+ { "AWS" =>
864
+ principals.map do |principal|
865
+ principal == :any ? "*" : principal
866
+ end }
867
+ end
868
+
869
+ protected
870
+ def translate_action(action)
871
+ case action
872
+ when String then action
873
+ when :any then '*'
874
+ when Symbol
875
+
876
+ if self.class == Core::Policy::Statement
877
+ msg = 'symbolized action names are only accepted by service ' +
878
+ 'specific policies (e.g. AWS::S3::Policy)'
879
+ raise ArgumentError, msg
880
+ end
881
+
882
+ unless self.class::ACTION_MAPPING.has_key?(action)
883
+ raise ArgumentError, "unrecognized action: #{action}"
884
+ end
885
+
886
+ self.class::ACTION_MAPPING[action]
887
+
888
+ end
889
+ end
890
+
891
+ protected
892
+ def translated_actions
893
+ return nil unless actions
894
+ actions.map do |action|
895
+ translate_action(action)
896
+ end
897
+ end
898
+
899
+ protected
900
+ def translated_excluded_actions
901
+ return nil unless excluded_actions
902
+ excluded_actions.map { |a| translate_action(a) }
903
+ end
904
+
905
+ protected
906
+ def resource_arns
907
+ return nil unless resources
908
+ resources.map do |resource|
909
+ case resource
910
+ when :any then "*"
911
+ else resource_arn(resource)
912
+ end
913
+ end
914
+ end
915
+
916
+ protected
917
+ def resource_arn resource
918
+ resource.to_s
919
+ end
920
+
921
+ protected
922
+ def excluded_resource_arns
923
+ return nil unless excluded_resources
924
+ excluded_resources.map do |excluded_resource|
925
+ case excluded_resource
926
+ when :any then "*"
927
+ else excluded_resource_arn(excluded_resource)
928
+ end
929
+ end
930
+ end
931
+
932
+ protected
933
+ def excluded_resource_arn excluded_resource
934
+ excluded_resource.to_s
935
+ end
936
+
937
+ end
938
+
939
+ end
940
+ end
941
+ end