aws-sdk-euca 1.8.5

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