gcloud 0.0.4 → 0.0.6

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 (768) hide show
  1. data.tar.gz.sig +0 -0
  2. data/CHANGELOG +4 -0
  3. data/Makefile +4 -0
  4. data/Manifest +760 -1
  5. data/bin/gcloud +7 -0
  6. data/bin/{gcutil → gcutil.symlink} +0 -0
  7. data/bin/gsutil-symlink +377 -0
  8. data/gcloud.gemspec +5 -5
  9. data/packages/gsutil/CHECKSUM +1 -0
  10. data/packages/gsutil/COPYING +202 -0
  11. data/packages/gsutil/LICENSE.third_party +295 -0
  12. data/packages/gsutil/MANIFEST.in +5 -0
  13. data/packages/gsutil/README +38 -0
  14. data/packages/gsutil/README.pkg +49 -0
  15. data/packages/gsutil/ReleaseNotes.txt +780 -0
  16. data/packages/gsutil/VERSION +1 -0
  17. data/packages/gsutil/boto/Changelog.rst +35 -0
  18. data/packages/gsutil/boto/LICENSE +18 -0
  19. data/packages/gsutil/boto/MANIFEST.in +12 -0
  20. data/packages/gsutil/boto/README.rst +163 -0
  21. data/packages/gsutil/boto/bin/asadmin +290 -0
  22. data/packages/gsutil/boto/bin/bundle_image +27 -0
  23. data/packages/gsutil/boto/bin/cfadmin +108 -0
  24. data/packages/gsutil/boto/bin/cq +89 -0
  25. data/packages/gsutil/boto/bin/cwutil +140 -0
  26. data/packages/gsutil/boto/bin/elbadmin +284 -0
  27. data/packages/gsutil/boto/bin/fetch_file +43 -0
  28. data/packages/gsutil/boto/bin/glacier +154 -0
  29. data/packages/gsutil/boto/bin/instance_events +145 -0
  30. data/packages/gsutil/boto/bin/kill_instance +35 -0
  31. data/packages/gsutil/boto/bin/launch_instance +252 -0
  32. data/packages/gsutil/boto/bin/list_instances +90 -0
  33. data/packages/gsutil/boto/bin/lss3 +77 -0
  34. data/packages/gsutil/boto/bin/mturk +465 -0
  35. data/packages/gsutil/boto/bin/pyami_sendmail +52 -0
  36. data/packages/gsutil/boto/bin/route53 +205 -0
  37. data/packages/gsutil/boto/bin/s3put +374 -0
  38. data/packages/gsutil/boto/bin/sdbadmin +194 -0
  39. data/packages/gsutil/boto/bin/taskadmin +116 -0
  40. data/packages/gsutil/boto/boto/__init__.py +793 -0
  41. data/packages/gsutil/boto/boto/__init__.pyc +0 -0
  42. data/packages/gsutil/boto/boto/auth.py +682 -0
  43. data/packages/gsutil/boto/boto/auth.pyc +0 -0
  44. data/packages/gsutil/boto/boto/auth_handler.py +58 -0
  45. data/packages/gsutil/boto/boto/auth_handler.pyc +0 -0
  46. data/packages/gsutil/boto/boto/beanstalk/__init__.py +65 -0
  47. data/packages/gsutil/boto/boto/beanstalk/exception.py +64 -0
  48. data/packages/gsutil/boto/boto/beanstalk/layer1.py +1153 -0
  49. data/packages/gsutil/boto/boto/beanstalk/response.py +703 -0
  50. data/packages/gsutil/boto/boto/beanstalk/wrapper.py +29 -0
  51. data/packages/gsutil/boto/boto/cacerts/__init__.py +22 -0
  52. data/packages/gsutil/boto/boto/cacerts/__init__.pyc +0 -0
  53. data/packages/gsutil/boto/boto/cacerts/cacerts.txt +633 -0
  54. data/packages/gsutil/boto/boto/cloudformation/__init__.py +68 -0
  55. data/packages/gsutil/boto/boto/cloudformation/connection.py +364 -0
  56. data/packages/gsutil/boto/boto/cloudformation/stack.py +360 -0
  57. data/packages/gsutil/boto/boto/cloudformation/template.py +43 -0
  58. data/packages/gsutil/boto/boto/cloudfront/__init__.py +324 -0
  59. data/packages/gsutil/boto/boto/cloudfront/distribution.py +745 -0
  60. data/packages/gsutil/boto/boto/cloudfront/exception.py +26 -0
  61. data/packages/gsutil/boto/boto/cloudfront/identity.py +122 -0
  62. data/packages/gsutil/boto/boto/cloudfront/invalidation.py +216 -0
  63. data/packages/gsutil/boto/boto/cloudfront/logging.py +38 -0
  64. data/packages/gsutil/boto/boto/cloudfront/object.py +48 -0
  65. data/packages/gsutil/boto/boto/cloudfront/origin.py +150 -0
  66. data/packages/gsutil/boto/boto/cloudfront/signers.py +60 -0
  67. data/packages/gsutil/boto/boto/cloudsearch/__init__.py +45 -0
  68. data/packages/gsutil/boto/boto/cloudsearch/document.py +265 -0
  69. data/packages/gsutil/boto/boto/cloudsearch/domain.py +394 -0
  70. data/packages/gsutil/boto/boto/cloudsearch/layer1.py +738 -0
  71. data/packages/gsutil/boto/boto/cloudsearch/layer2.py +67 -0
  72. data/packages/gsutil/boto/boto/cloudsearch/optionstatus.py +248 -0
  73. data/packages/gsutil/boto/boto/cloudsearch/search.py +365 -0
  74. data/packages/gsutil/boto/boto/cloudsearch/sourceattribute.py +75 -0
  75. data/packages/gsutil/boto/boto/compat.py +28 -0
  76. data/packages/gsutil/boto/boto/compat.pyc +0 -0
  77. data/packages/gsutil/boto/boto/connection.py +1081 -0
  78. data/packages/gsutil/boto/boto/connection.pyc +0 -0
  79. data/packages/gsutil/boto/boto/contrib/__init__.py +22 -0
  80. data/packages/gsutil/boto/boto/contrib/ymlmessage.py +52 -0
  81. data/packages/gsutil/boto/boto/core/README +58 -0
  82. data/packages/gsutil/boto/boto/core/__init__.py +23 -0
  83. data/packages/gsutil/boto/boto/core/auth.py +78 -0
  84. data/packages/gsutil/boto/boto/core/credentials.py +154 -0
  85. data/packages/gsutil/boto/boto/core/dictresponse.py +178 -0
  86. data/packages/gsutil/boto/boto/core/service.py +67 -0
  87. data/packages/gsutil/boto/boto/datapipeline/__init__.py +0 -0
  88. data/packages/gsutil/boto/boto/datapipeline/exceptions.py +42 -0
  89. data/packages/gsutil/boto/boto/datapipeline/layer1.py +546 -0
  90. data/packages/gsutil/boto/boto/dynamodb/__init__.py +66 -0
  91. data/packages/gsutil/boto/boto/dynamodb/batch.py +262 -0
  92. data/packages/gsutil/boto/boto/dynamodb/condition.py +170 -0
  93. data/packages/gsutil/boto/boto/dynamodb/exceptions.py +64 -0
  94. data/packages/gsutil/boto/boto/dynamodb/item.py +196 -0
  95. data/packages/gsutil/boto/boto/dynamodb/layer1.py +575 -0
  96. data/packages/gsutil/boto/boto/dynamodb/layer2.py +798 -0
  97. data/packages/gsutil/boto/boto/dynamodb/schema.py +112 -0
  98. data/packages/gsutil/boto/boto/dynamodb/table.py +540 -0
  99. data/packages/gsutil/boto/boto/dynamodb/types.py +326 -0
  100. data/packages/gsutil/boto/boto/ec2/__init__.py +96 -0
  101. data/packages/gsutil/boto/boto/ec2/address.py +103 -0
  102. data/packages/gsutil/boto/boto/ec2/autoscale/__init__.py +781 -0
  103. data/packages/gsutil/boto/boto/ec2/autoscale/activity.py +74 -0
  104. data/packages/gsutil/boto/boto/ec2/autoscale/group.py +337 -0
  105. data/packages/gsutil/boto/boto/ec2/autoscale/instance.py +60 -0
  106. data/packages/gsutil/boto/boto/ec2/autoscale/launchconfig.py +209 -0
  107. data/packages/gsutil/boto/boto/ec2/autoscale/policy.py +166 -0
  108. data/packages/gsutil/boto/boto/ec2/autoscale/request.py +38 -0
  109. data/packages/gsutil/boto/boto/ec2/autoscale/scheduled.py +60 -0
  110. data/packages/gsutil/boto/boto/ec2/autoscale/tag.py +84 -0
  111. data/packages/gsutil/boto/boto/ec2/blockdevicemapping.py +141 -0
  112. data/packages/gsutil/boto/boto/ec2/bundleinstance.py +78 -0
  113. data/packages/gsutil/boto/boto/ec2/buyreservation.py +84 -0
  114. data/packages/gsutil/boto/boto/ec2/cloudwatch/__init__.py +603 -0
  115. data/packages/gsutil/boto/boto/ec2/cloudwatch/alarm.py +316 -0
  116. data/packages/gsutil/boto/boto/ec2/cloudwatch/datapoint.py +40 -0
  117. data/packages/gsutil/boto/boto/ec2/cloudwatch/dimension.py +38 -0
  118. data/packages/gsutil/boto/boto/ec2/cloudwatch/listelement.py +31 -0
  119. data/packages/gsutil/boto/boto/ec2/cloudwatch/metric.py +175 -0
  120. data/packages/gsutil/boto/boto/ec2/connection.py +3409 -0
  121. data/packages/gsutil/boto/boto/ec2/ec2object.py +107 -0
  122. data/packages/gsutil/boto/boto/ec2/elb/__init__.py +553 -0
  123. data/packages/gsutil/boto/boto/ec2/elb/healthcheck.py +89 -0
  124. data/packages/gsutil/boto/boto/ec2/elb/instancestate.py +62 -0
  125. data/packages/gsutil/boto/boto/ec2/elb/listelement.py +36 -0
  126. data/packages/gsutil/boto/boto/ec2/elb/listener.py +75 -0
  127. data/packages/gsutil/boto/boto/ec2/elb/loadbalancer.py +324 -0
  128. data/packages/gsutil/boto/boto/ec2/elb/policies.py +89 -0
  129. data/packages/gsutil/boto/boto/ec2/elb/securitygroup.py +38 -0
  130. data/packages/gsutil/boto/boto/ec2/group.py +39 -0
  131. data/packages/gsutil/boto/boto/ec2/image.py +350 -0
  132. data/packages/gsutil/boto/boto/ec2/instance.py +661 -0
  133. data/packages/gsutil/boto/boto/ec2/instanceinfo.py +51 -0
  134. data/packages/gsutil/boto/boto/ec2/instancestatus.py +207 -0
  135. data/packages/gsutil/boto/boto/ec2/keypair.py +113 -0
  136. data/packages/gsutil/boto/boto/ec2/launchspecification.py +105 -0
  137. data/packages/gsutil/boto/boto/ec2/networkinterface.py +247 -0
  138. data/packages/gsutil/boto/boto/ec2/placementgroup.py +51 -0
  139. data/packages/gsutil/boto/boto/ec2/regioninfo.py +34 -0
  140. data/packages/gsutil/boto/boto/ec2/reservedinstance.py +227 -0
  141. data/packages/gsutil/boto/boto/ec2/securitygroup.py +357 -0
  142. data/packages/gsutil/boto/boto/ec2/snapshot.py +170 -0
  143. data/packages/gsutil/boto/boto/ec2/spotdatafeedsubscription.py +63 -0
  144. data/packages/gsutil/boto/boto/ec2/spotinstancerequest.py +188 -0
  145. data/packages/gsutil/boto/boto/ec2/spotpricehistory.py +55 -0
  146. data/packages/gsutil/boto/boto/ec2/tag.py +87 -0
  147. data/packages/gsutil/boto/boto/ec2/vmtype.py +58 -0
  148. data/packages/gsutil/boto/boto/ec2/volume.py +293 -0
  149. data/packages/gsutil/boto/boto/ec2/volumestatus.py +200 -0
  150. data/packages/gsutil/boto/boto/ec2/zone.py +80 -0
  151. data/packages/gsutil/boto/boto/ecs/__init__.py +90 -0
  152. data/packages/gsutil/boto/boto/ecs/item.py +153 -0
  153. data/packages/gsutil/boto/boto/elasticache/__init__.py +62 -0
  154. data/packages/gsutil/boto/boto/elasticache/layer1.py +1252 -0
  155. data/packages/gsutil/boto/boto/elastictranscoder/__init__.py +62 -0
  156. data/packages/gsutil/boto/boto/elastictranscoder/exceptions.py +46 -0
  157. data/packages/gsutil/boto/boto/elastictranscoder/layer1.py +509 -0
  158. data/packages/gsutil/boto/boto/emr/__init__.py +73 -0
  159. data/packages/gsutil/boto/boto/emr/bootstrap_action.py +44 -0
  160. data/packages/gsutil/boto/boto/emr/connection.py +531 -0
  161. data/packages/gsutil/boto/boto/emr/emrobject.py +176 -0
  162. data/packages/gsutil/boto/boto/emr/instance_group.py +43 -0
  163. data/packages/gsutil/boto/boto/emr/step.py +281 -0
  164. data/packages/gsutil/boto/boto/exception.py +476 -0
  165. data/packages/gsutil/boto/boto/exception.pyc +0 -0
  166. data/packages/gsutil/boto/boto/file/README +49 -0
  167. data/packages/gsutil/boto/boto/file/__init__.py +28 -0
  168. data/packages/gsutil/boto/boto/file/bucket.py +112 -0
  169. data/packages/gsutil/boto/boto/file/connection.py +33 -0
  170. data/packages/gsutil/boto/boto/file/key.py +199 -0
  171. data/packages/gsutil/boto/boto/file/simpleresultset.py +30 -0
  172. data/packages/gsutil/boto/boto/fps/__init__.py +21 -0
  173. data/packages/gsutil/boto/boto/fps/connection.py +369 -0
  174. data/packages/gsutil/boto/boto/fps/exception.py +344 -0
  175. data/packages/gsutil/boto/boto/fps/response.py +175 -0
  176. data/packages/gsutil/boto/boto/glacier/__init__.py +57 -0
  177. data/packages/gsutil/boto/boto/glacier/concurrent.py +409 -0
  178. data/packages/gsutil/boto/boto/glacier/exceptions.py +58 -0
  179. data/packages/gsutil/boto/boto/glacier/job.py +152 -0
  180. data/packages/gsutil/boto/boto/glacier/layer1.py +637 -0
  181. data/packages/gsutil/boto/boto/glacier/layer2.py +93 -0
  182. data/packages/gsutil/boto/boto/glacier/response.py +48 -0
  183. data/packages/gsutil/boto/boto/glacier/utils.py +163 -0
  184. data/packages/gsutil/boto/boto/glacier/vault.py +387 -0
  185. data/packages/gsutil/boto/boto/glacier/writer.py +242 -0
  186. data/packages/gsutil/boto/boto/gs/__init__.py +22 -0
  187. data/packages/gsutil/boto/boto/gs/__init__.pyc +0 -0
  188. data/packages/gsutil/boto/boto/gs/acl.py +304 -0
  189. data/packages/gsutil/boto/boto/gs/acl.pyc +0 -0
  190. data/packages/gsutil/boto/boto/gs/bucket.py +870 -0
  191. data/packages/gsutil/boto/boto/gs/bucket.pyc +0 -0
  192. data/packages/gsutil/boto/boto/gs/bucketlistresultset.py +64 -0
  193. data/packages/gsutil/boto/boto/gs/bucketlistresultset.pyc +0 -0
  194. data/packages/gsutil/boto/boto/gs/connection.py +103 -0
  195. data/packages/gsutil/boto/boto/gs/connection.pyc +0 -0
  196. data/packages/gsutil/boto/boto/gs/cors.py +169 -0
  197. data/packages/gsutil/boto/boto/gs/cors.pyc +0 -0
  198. data/packages/gsutil/boto/boto/gs/key.py +704 -0
  199. data/packages/gsutil/boto/boto/gs/key.pyc +0 -0
  200. data/packages/gsutil/boto/boto/gs/resumable_upload_handler.py +659 -0
  201. data/packages/gsutil/boto/boto/gs/resumable_upload_handler.pyc +0 -0
  202. data/packages/gsutil/boto/boto/gs/user.py +54 -0
  203. data/packages/gsutil/boto/boto/gs/user.pyc +0 -0
  204. data/packages/gsutil/boto/boto/handler.py +44 -0
  205. data/packages/gsutil/boto/boto/handler.pyc +0 -0
  206. data/packages/gsutil/boto/boto/https_connection.py +124 -0
  207. data/packages/gsutil/boto/boto/https_connection.pyc +0 -0
  208. data/packages/gsutil/boto/boto/iam/__init__.py +74 -0
  209. data/packages/gsutil/boto/boto/iam/connection.py +1317 -0
  210. data/packages/gsutil/boto/boto/iam/summarymap.py +42 -0
  211. data/packages/gsutil/boto/boto/jsonresponse.py +163 -0
  212. data/packages/gsutil/boto/boto/jsonresponse.pyc +0 -0
  213. data/packages/gsutil/boto/boto/manage/__init__.py +23 -0
  214. data/packages/gsutil/boto/boto/manage/cmdshell.py +241 -0
  215. data/packages/gsutil/boto/boto/manage/propget.py +64 -0
  216. data/packages/gsutil/boto/boto/manage/server.py +556 -0
  217. data/packages/gsutil/boto/boto/manage/task.py +175 -0
  218. data/packages/gsutil/boto/boto/manage/test_manage.py +34 -0
  219. data/packages/gsutil/boto/boto/manage/volume.py +420 -0
  220. data/packages/gsutil/boto/boto/mashups/__init__.py +23 -0
  221. data/packages/gsutil/boto/boto/mashups/interactive.py +97 -0
  222. data/packages/gsutil/boto/boto/mashups/iobject.py +115 -0
  223. data/packages/gsutil/boto/boto/mashups/order.py +211 -0
  224. data/packages/gsutil/boto/boto/mashups/server.py +395 -0
  225. data/packages/gsutil/boto/boto/mturk/__init__.py +23 -0
  226. data/packages/gsutil/boto/boto/mturk/connection.py +1027 -0
  227. data/packages/gsutil/boto/boto/mturk/layoutparam.py +55 -0
  228. data/packages/gsutil/boto/boto/mturk/notification.py +103 -0
  229. data/packages/gsutil/boto/boto/mturk/price.py +48 -0
  230. data/packages/gsutil/boto/boto/mturk/qualification.py +137 -0
  231. data/packages/gsutil/boto/boto/mturk/question.py +455 -0
  232. data/packages/gsutil/boto/boto/mws/__init__.py +21 -0
  233. data/packages/gsutil/boto/boto/mws/connection.py +813 -0
  234. data/packages/gsutil/boto/boto/mws/exception.py +75 -0
  235. data/packages/gsutil/boto/boto/mws/response.py +655 -0
  236. data/packages/gsutil/boto/boto/plugin.py +90 -0
  237. data/packages/gsutil/boto/boto/plugin.pyc +0 -0
  238. data/packages/gsutil/boto/boto/provider.py +337 -0
  239. data/packages/gsutil/boto/boto/provider.pyc +0 -0
  240. data/packages/gsutil/boto/boto/pyami/__init__.py +22 -0
  241. data/packages/gsutil/boto/boto/pyami/__init__.pyc +0 -0
  242. data/packages/gsutil/boto/boto/pyami/bootstrap.py +134 -0
  243. data/packages/gsutil/boto/boto/pyami/config.py +229 -0
  244. data/packages/gsutil/boto/boto/pyami/config.pyc +0 -0
  245. data/packages/gsutil/boto/boto/pyami/copybot.cfg +60 -0
  246. data/packages/gsutil/boto/boto/pyami/copybot.py +97 -0
  247. data/packages/gsutil/boto/boto/pyami/helloworld.py +28 -0
  248. data/packages/gsutil/boto/boto/pyami/installers/__init__.py +64 -0
  249. data/packages/gsutil/boto/boto/pyami/installers/ubuntu/__init__.py +22 -0
  250. data/packages/gsutil/boto/boto/pyami/installers/ubuntu/apache.py +43 -0
  251. data/packages/gsutil/boto/boto/pyami/installers/ubuntu/ebs.py +238 -0
  252. data/packages/gsutil/boto/boto/pyami/installers/ubuntu/installer.py +96 -0
  253. data/packages/gsutil/boto/boto/pyami/installers/ubuntu/mysql.py +109 -0
  254. data/packages/gsutil/boto/boto/pyami/installers/ubuntu/trac.py +139 -0
  255. data/packages/gsutil/boto/boto/pyami/launch_ami.py +178 -0
  256. data/packages/gsutil/boto/boto/pyami/scriptbase.py +44 -0
  257. data/packages/gsutil/boto/boto/pyami/startup.py +60 -0
  258. data/packages/gsutil/boto/boto/rds/__init__.py +1194 -0
  259. data/packages/gsutil/boto/boto/rds/dbinstance.py +357 -0
  260. data/packages/gsutil/boto/boto/rds/dbsecuritygroup.py +177 -0
  261. data/packages/gsutil/boto/boto/rds/dbsnapshot.py +108 -0
  262. data/packages/gsutil/boto/boto/rds/event.py +49 -0
  263. data/packages/gsutil/boto/boto/rds/parametergroup.py +201 -0
  264. data/packages/gsutil/boto/boto/rds/regioninfo.py +32 -0
  265. data/packages/gsutil/boto/boto/regioninfo.py +63 -0
  266. data/packages/gsutil/boto/boto/regioninfo.pyc +0 -0
  267. data/packages/gsutil/boto/boto/resultset.py +169 -0
  268. data/packages/gsutil/boto/boto/resultset.pyc +0 -0
  269. data/packages/gsutil/boto/boto/roboto/__init__.py +1 -0
  270. data/packages/gsutil/boto/boto/roboto/awsqueryrequest.py +504 -0
  271. data/packages/gsutil/boto/boto/roboto/awsqueryservice.py +121 -0
  272. data/packages/gsutil/boto/boto/roboto/param.py +147 -0
  273. data/packages/gsutil/boto/boto/route53/__init__.py +75 -0
  274. data/packages/gsutil/boto/boto/route53/connection.py +403 -0
  275. data/packages/gsutil/boto/boto/route53/exception.py +27 -0
  276. data/packages/gsutil/boto/boto/route53/hostedzone.py +56 -0
  277. data/packages/gsutil/boto/boto/route53/record.py +306 -0
  278. data/packages/gsutil/boto/boto/route53/status.py +42 -0
  279. data/packages/gsutil/boto/boto/route53/zone.py +412 -0
  280. data/packages/gsutil/boto/boto/s3/__init__.py +84 -0
  281. data/packages/gsutil/boto/boto/s3/__init__.pyc +0 -0
  282. data/packages/gsutil/boto/boto/s3/acl.py +164 -0
  283. data/packages/gsutil/boto/boto/s3/acl.pyc +0 -0
  284. data/packages/gsutil/boto/boto/s3/bucket.py +1634 -0
  285. data/packages/gsutil/boto/boto/s3/bucket.pyc +0 -0
  286. data/packages/gsutil/boto/boto/s3/bucketlistresultset.py +139 -0
  287. data/packages/gsutil/boto/boto/s3/bucketlistresultset.pyc +0 -0
  288. data/packages/gsutil/boto/boto/s3/bucketlogging.py +83 -0
  289. data/packages/gsutil/boto/boto/s3/bucketlogging.pyc +0 -0
  290. data/packages/gsutil/boto/boto/s3/connection.py +540 -0
  291. data/packages/gsutil/boto/boto/s3/connection.pyc +0 -0
  292. data/packages/gsutil/boto/boto/s3/cors.py +210 -0
  293. data/packages/gsutil/boto/boto/s3/cors.pyc +0 -0
  294. data/packages/gsutil/boto/boto/s3/deletemarker.py +55 -0
  295. data/packages/gsutil/boto/boto/s3/deletemarker.pyc +0 -0
  296. data/packages/gsutil/boto/boto/s3/key.py +1712 -0
  297. data/packages/gsutil/boto/boto/s3/key.pyc +0 -0
  298. data/packages/gsutil/boto/boto/s3/keyfile.py +134 -0
  299. data/packages/gsutil/boto/boto/s3/keyfile.pyc +0 -0
  300. data/packages/gsutil/boto/boto/s3/lifecycle.py +231 -0
  301. data/packages/gsutil/boto/boto/s3/lifecycle.pyc +0 -0
  302. data/packages/gsutil/boto/boto/s3/multidelete.py +138 -0
  303. data/packages/gsutil/boto/boto/s3/multidelete.pyc +0 -0
  304. data/packages/gsutil/boto/boto/s3/multipart.py +315 -0
  305. data/packages/gsutil/boto/boto/s3/multipart.pyc +0 -0
  306. data/packages/gsutil/boto/boto/s3/prefix.py +42 -0
  307. data/packages/gsutil/boto/boto/s3/prefix.pyc +0 -0
  308. data/packages/gsutil/boto/boto/s3/resumable_download_handler.py +339 -0
  309. data/packages/gsutil/boto/boto/s3/resumable_download_handler.pyc +0 -0
  310. data/packages/gsutil/boto/boto/s3/tagging.py +71 -0
  311. data/packages/gsutil/boto/boto/s3/tagging.pyc +0 -0
  312. data/packages/gsutil/boto/boto/s3/user.py +49 -0
  313. data/packages/gsutil/boto/boto/s3/user.pyc +0 -0
  314. data/packages/gsutil/boto/boto/s3/website.py +237 -0
  315. data/packages/gsutil/boto/boto/s3/website.pyc +0 -0
  316. data/packages/gsutil/boto/boto/sdb/__init__.py +67 -0
  317. data/packages/gsutil/boto/boto/sdb/connection.py +617 -0
  318. data/packages/gsutil/boto/boto/sdb/db/__init__.py +20 -0
  319. data/packages/gsutil/boto/boto/sdb/db/blob.py +75 -0
  320. data/packages/gsutil/boto/boto/sdb/db/key.py +59 -0
  321. data/packages/gsutil/boto/boto/sdb/db/manager/__init__.py +85 -0
  322. data/packages/gsutil/boto/boto/sdb/db/manager/sdbmanager.py +732 -0
  323. data/packages/gsutil/boto/boto/sdb/db/manager/xmlmanager.py +517 -0
  324. data/packages/gsutil/boto/boto/sdb/db/model.py +294 -0
  325. data/packages/gsutil/boto/boto/sdb/db/property.py +703 -0
  326. data/packages/gsutil/boto/boto/sdb/db/query.py +85 -0
  327. data/packages/gsutil/boto/boto/sdb/db/sequence.py +226 -0
  328. data/packages/gsutil/boto/boto/sdb/db/test_db.py +231 -0
  329. data/packages/gsutil/boto/boto/sdb/domain.py +377 -0
  330. data/packages/gsutil/boto/boto/sdb/item.py +181 -0
  331. data/packages/gsutil/boto/boto/sdb/queryresultset.py +92 -0
  332. data/packages/gsutil/boto/boto/sdb/regioninfo.py +32 -0
  333. data/packages/gsutil/boto/boto/services/__init__.py +23 -0
  334. data/packages/gsutil/boto/boto/services/bs.py +179 -0
  335. data/packages/gsutil/boto/boto/services/message.py +58 -0
  336. data/packages/gsutil/boto/boto/services/result.py +136 -0
  337. data/packages/gsutil/boto/boto/services/service.py +161 -0
  338. data/packages/gsutil/boto/boto/services/servicedef.py +91 -0
  339. data/packages/gsutil/boto/boto/services/sonofmmm.cfg +43 -0
  340. data/packages/gsutil/boto/boto/services/sonofmmm.py +81 -0
  341. data/packages/gsutil/boto/boto/services/submit.py +88 -0
  342. data/packages/gsutil/boto/boto/ses/__init__.py +54 -0
  343. data/packages/gsutil/boto/boto/ses/connection.py +521 -0
  344. data/packages/gsutil/boto/boto/ses/exceptions.py +77 -0
  345. data/packages/gsutil/boto/boto/sns/__init__.py +78 -0
  346. data/packages/gsutil/boto/boto/sns/connection.py +431 -0
  347. data/packages/gsutil/boto/boto/sqs/__init__.py +56 -0
  348. data/packages/gsutil/boto/boto/sqs/attributes.py +46 -0
  349. data/packages/gsutil/boto/boto/sqs/batchresults.py +95 -0
  350. data/packages/gsutil/boto/boto/sqs/connection.py +417 -0
  351. data/packages/gsutil/boto/boto/sqs/jsonmessage.py +43 -0
  352. data/packages/gsutil/boto/boto/sqs/message.py +253 -0
  353. data/packages/gsutil/boto/boto/sqs/queue.py +478 -0
  354. data/packages/gsutil/boto/boto/sqs/regioninfo.py +32 -0
  355. data/packages/gsutil/boto/boto/storage_uri.py +835 -0
  356. data/packages/gsutil/boto/boto/storage_uri.pyc +0 -0
  357. data/packages/gsutil/boto/boto/sts/__init__.py +55 -0
  358. data/packages/gsutil/boto/boto/sts/connection.py +207 -0
  359. data/packages/gsutil/boto/boto/sts/credentials.py +215 -0
  360. data/packages/gsutil/boto/boto/swf/__init__.py +60 -0
  361. data/packages/gsutil/boto/boto/swf/exceptions.py +44 -0
  362. data/packages/gsutil/boto/boto/swf/layer1.py +1512 -0
  363. data/packages/gsutil/boto/boto/swf/layer1_decisions.py +287 -0
  364. data/packages/gsutil/boto/boto/swf/layer2.py +342 -0
  365. data/packages/gsutil/boto/boto/utils.py +927 -0
  366. data/packages/gsutil/boto/boto/utils.pyc +0 -0
  367. data/packages/gsutil/boto/boto/vpc/__init__.py +910 -0
  368. data/packages/gsutil/boto/boto/vpc/customergateway.py +54 -0
  369. data/packages/gsutil/boto/boto/vpc/dhcpoptions.py +72 -0
  370. data/packages/gsutil/boto/boto/vpc/internetgateway.py +72 -0
  371. data/packages/gsutil/boto/boto/vpc/routetable.py +109 -0
  372. data/packages/gsutil/boto/boto/vpc/subnet.py +57 -0
  373. data/packages/gsutil/boto/boto/vpc/vpc.py +54 -0
  374. data/packages/gsutil/boto/boto/vpc/vpnconnection.py +60 -0
  375. data/packages/gsutil/boto/boto/vpc/vpngateway.py +83 -0
  376. data/packages/gsutil/boto/docs/BotoCheatSheet.pdf +0 -0
  377. data/packages/gsutil/boto/docs/Makefile +89 -0
  378. data/packages/gsutil/boto/docs/make.bat +113 -0
  379. data/packages/gsutil/boto/docs/source/_templates/layout.html +3 -0
  380. data/packages/gsutil/boto/docs/source/autoscale_tut.rst +220 -0
  381. data/packages/gsutil/boto/docs/source/boto_config_tut.rst +125 -0
  382. data/packages/gsutil/boto/docs/source/boto_theme/static/boto.css_t +239 -0
  383. data/packages/gsutil/boto/docs/source/boto_theme/static/pygments.css +61 -0
  384. data/packages/gsutil/boto/docs/source/boto_theme/theme.conf +3 -0
  385. data/packages/gsutil/boto/docs/source/cloudfront_tut.rst +196 -0
  386. data/packages/gsutil/boto/docs/source/cloudsearch_tut.rst +411 -0
  387. data/packages/gsutil/boto/docs/source/cloudwatch_tut.rst +116 -0
  388. data/packages/gsutil/boto/docs/source/conf.py +32 -0
  389. data/packages/gsutil/boto/docs/source/contributing.rst +204 -0
  390. data/packages/gsutil/boto/docs/source/documentation.rst +59 -0
  391. data/packages/gsutil/boto/docs/source/dynamodb_tut.rst +339 -0
  392. data/packages/gsutil/boto/docs/source/ec2_tut.rst +86 -0
  393. data/packages/gsutil/boto/docs/source/elb_tut.rst +257 -0
  394. data/packages/gsutil/boto/docs/source/emr_tut.rst +108 -0
  395. data/packages/gsutil/boto/docs/source/index.rst +146 -0
  396. data/packages/gsutil/boto/docs/source/rds_tut.rst +108 -0
  397. data/packages/gsutil/boto/docs/source/ref/autoscale.rst +62 -0
  398. data/packages/gsutil/boto/docs/source/ref/beanstalk.rst +26 -0
  399. data/packages/gsutil/boto/docs/source/ref/boto.rst +47 -0
  400. data/packages/gsutil/boto/docs/source/ref/cloudformation.rst +34 -0
  401. data/packages/gsutil/boto/docs/source/ref/cloudfront.rst +68 -0
  402. data/packages/gsutil/boto/docs/source/ref/cloudsearch.rst +59 -0
  403. data/packages/gsutil/boto/docs/source/ref/cloudwatch.rst +27 -0
  404. data/packages/gsutil/boto/docs/source/ref/contrib.rst +32 -0
  405. data/packages/gsutil/boto/docs/source/ref/datapipeline.rst +26 -0
  406. data/packages/gsutil/boto/docs/source/ref/dynamodb.rst +61 -0
  407. data/packages/gsutil/boto/docs/source/ref/ec2.rst +140 -0
  408. data/packages/gsutil/boto/docs/source/ref/ecs.rst +19 -0
  409. data/packages/gsutil/boto/docs/source/ref/elasticache.rst +19 -0
  410. data/packages/gsutil/boto/docs/source/ref/elastictranscoder.rst +26 -0
  411. data/packages/gsutil/boto/docs/source/ref/elb.rst +47 -0
  412. data/packages/gsutil/boto/docs/source/ref/emr.rst +34 -0
  413. data/packages/gsutil/boto/docs/source/ref/file.rst +34 -0
  414. data/packages/gsutil/boto/docs/source/ref/fps.rst +19 -0
  415. data/packages/gsutil/boto/docs/source/ref/glacier.rst +63 -0
  416. data/packages/gsutil/boto/docs/source/ref/gs.rst +72 -0
  417. data/packages/gsutil/boto/docs/source/ref/iam.rst +27 -0
  418. data/packages/gsutil/boto/docs/source/ref/index.rst +40 -0
  419. data/packages/gsutil/boto/docs/source/ref/manage.rst +47 -0
  420. data/packages/gsutil/boto/docs/source/ref/mturk.rst +54 -0
  421. data/packages/gsutil/boto/docs/source/ref/mws.rst +33 -0
  422. data/packages/gsutil/boto/docs/source/ref/pyami.rst +103 -0
  423. data/packages/gsutil/boto/docs/source/ref/rds.rst +47 -0
  424. data/packages/gsutil/boto/docs/source/ref/route53.rst +34 -0
  425. data/packages/gsutil/boto/docs/source/ref/s3.rst +111 -0
  426. data/packages/gsutil/boto/docs/source/ref/sdb.rst +45 -0
  427. data/packages/gsutil/boto/docs/source/ref/sdb_db.rst +83 -0
  428. data/packages/gsutil/boto/docs/source/ref/services.rst +61 -0
  429. data/packages/gsutil/boto/docs/source/ref/ses.rst +21 -0
  430. data/packages/gsutil/boto/docs/source/ref/sns.rst +17 -0
  431. data/packages/gsutil/boto/docs/source/ref/sqs.rst +61 -0
  432. data/packages/gsutil/boto/docs/source/ref/sts.rst +25 -0
  433. data/packages/gsutil/boto/docs/source/ref/swf.rst +22 -0
  434. data/packages/gsutil/boto/docs/source/ref/vpc.rst +54 -0
  435. data/packages/gsutil/boto/docs/source/s3_tut.rst +450 -0
  436. data/packages/gsutil/boto/docs/source/security_groups.rst +82 -0
  437. data/packages/gsutil/boto/docs/source/ses_tut.rst +171 -0
  438. data/packages/gsutil/boto/docs/source/simpledb_tut.rst +188 -0
  439. data/packages/gsutil/boto/docs/source/sqs_tut.rst +246 -0
  440. data/packages/gsutil/boto/docs/source/vpc_tut.rst +100 -0
  441. data/packages/gsutil/boto/pylintrc +305 -0
  442. data/packages/gsutil/boto/requirements.txt +10 -0
  443. data/packages/gsutil/boto/setup.py +89 -0
  444. data/packages/gsutil/boto/tests/__init__.py +20 -0
  445. data/packages/gsutil/boto/tests/db/test_lists.py +96 -0
  446. data/packages/gsutil/boto/tests/db/test_password.py +128 -0
  447. data/packages/gsutil/boto/tests/db/test_query.py +152 -0
  448. data/packages/gsutil/boto/tests/db/test_sequence.py +109 -0
  449. data/packages/gsutil/boto/tests/devpay/__init__.py +0 -0
  450. data/packages/gsutil/boto/tests/devpay/test_s3.py +181 -0
  451. data/packages/gsutil/boto/tests/fps/__init__.py +0 -0
  452. data/packages/gsutil/boto/tests/fps/test.py +100 -0
  453. data/packages/gsutil/boto/tests/fps/test_verify_signature.py +12 -0
  454. data/packages/gsutil/boto/tests/integration/__init__.py +0 -0
  455. data/packages/gsutil/boto/tests/integration/beanstalk/test_wrapper.py +209 -0
  456. data/packages/gsutil/boto/tests/integration/cloudformation/__init__.py +21 -0
  457. data/packages/gsutil/boto/tests/integration/cloudformation/test_cert_verification.py +40 -0
  458. data/packages/gsutil/boto/tests/integration/cloudformation/test_connection.py +110 -0
  459. data/packages/gsutil/boto/tests/integration/cloudsearch/__init__.py +21 -0
  460. data/packages/gsutil/boto/tests/integration/cloudsearch/test_cert_verification.py +40 -0
  461. data/packages/gsutil/boto/tests/integration/datapipeline/test_layer1.py +122 -0
  462. data/packages/gsutil/boto/tests/integration/dynamodb/__init__.py +20 -0
  463. data/packages/gsutil/boto/tests/integration/dynamodb/test_cert_verification.py +40 -0
  464. data/packages/gsutil/boto/tests/integration/dynamodb/test_layer1.py +266 -0
  465. data/packages/gsutil/boto/tests/integration/dynamodb/test_layer2.py +484 -0
  466. data/packages/gsutil/boto/tests/integration/dynamodb/test_table.py +84 -0
  467. data/packages/gsutil/boto/tests/integration/ec2/__init__.py +20 -0
  468. data/packages/gsutil/boto/tests/integration/ec2/autoscale/__init__.py +21 -0
  469. data/packages/gsutil/boto/tests/integration/ec2/autoscale/test_cert_verification.py +40 -0
  470. data/packages/gsutil/boto/tests/integration/ec2/autoscale/test_connection.py +167 -0
  471. data/packages/gsutil/boto/tests/integration/ec2/cloudwatch/__init__.py +20 -0
  472. data/packages/gsutil/boto/tests/integration/ec2/cloudwatch/test_cert_verification.py +40 -0
  473. data/packages/gsutil/boto/tests/integration/ec2/cloudwatch/test_connection.py +277 -0
  474. data/packages/gsutil/boto/tests/integration/ec2/elb/__init__.py +20 -0
  475. data/packages/gsutil/boto/tests/integration/ec2/elb/test_cert_verification.py +40 -0
  476. data/packages/gsutil/boto/tests/integration/ec2/elb/test_connection.py +130 -0
  477. data/packages/gsutil/boto/tests/integration/ec2/test_cert_verification.py +40 -0
  478. data/packages/gsutil/boto/tests/integration/ec2/test_connection.py +192 -0
  479. data/packages/gsutil/boto/tests/integration/ec2/vpc/__init__.py +0 -0
  480. data/packages/gsutil/boto/tests/integration/ec2/vpc/test_connection.py +95 -0
  481. data/packages/gsutil/boto/tests/integration/elasticache/__init__.py +0 -0
  482. data/packages/gsutil/boto/tests/integration/elasticache/test_layer1.py +67 -0
  483. data/packages/gsutil/boto/tests/integration/elastictranscoder/__init__.py +0 -0
  484. data/packages/gsutil/boto/tests/integration/elastictranscoder/test_cert_verification.py +35 -0
  485. data/packages/gsutil/boto/tests/integration/elastictranscoder/test_layer1.py +115 -0
  486. data/packages/gsutil/boto/tests/integration/emr/__init__.py +20 -0
  487. data/packages/gsutil/boto/tests/integration/emr/test_cert_verification.py +40 -0
  488. data/packages/gsutil/boto/tests/integration/glacier/__init__.py +22 -0
  489. data/packages/gsutil/boto/tests/integration/glacier/test_cert_verification.py +40 -0
  490. data/packages/gsutil/boto/tests/integration/glacier/test_layer1.py +44 -0
  491. data/packages/gsutil/boto/tests/integration/glacier/test_layer2.py +45 -0
  492. data/packages/gsutil/boto/tests/integration/gs/__init__.py +0 -0
  493. data/packages/gsutil/boto/tests/integration/gs/cb_test_harness.py +71 -0
  494. data/packages/gsutil/boto/tests/integration/gs/test_basic.py +379 -0
  495. data/packages/gsutil/boto/tests/integration/gs/test_generation_conditionals.py +399 -0
  496. data/packages/gsutil/boto/tests/integration/gs/test_resumable_downloads.py +358 -0
  497. data/packages/gsutil/boto/tests/integration/gs/test_resumable_uploads.py +525 -0
  498. data/packages/gsutil/boto/tests/integration/gs/test_storage_uri.py +125 -0
  499. data/packages/gsutil/boto/tests/integration/gs/test_versioning.py +268 -0
  500. data/packages/gsutil/boto/tests/integration/gs/testcase.py +116 -0
  501. data/packages/gsutil/boto/tests/integration/gs/util.py +63 -0
  502. data/packages/gsutil/boto/tests/integration/iam/__init__.py +20 -0
  503. data/packages/gsutil/boto/tests/integration/iam/test_cert_verification.py +40 -0
  504. data/packages/gsutil/boto/tests/integration/mws/__init__.py +0 -0
  505. data/packages/gsutil/boto/tests/integration/mws/test.py +100 -0
  506. data/packages/gsutil/boto/tests/integration/rds/__init__.py +21 -0
  507. data/packages/gsutil/boto/tests/integration/rds/test_cert_verification.py +40 -0
  508. data/packages/gsutil/boto/tests/integration/route53/__init__.py +20 -0
  509. data/packages/gsutil/boto/tests/integration/route53/test_cert_verification.py +40 -0
  510. data/packages/gsutil/boto/tests/integration/route53/test_zone.py +132 -0
  511. data/packages/gsutil/boto/tests/integration/s3/__init__.py +20 -0
  512. data/packages/gsutil/boto/tests/integration/s3/mock_storage_service.py +589 -0
  513. data/packages/gsutil/boto/tests/integration/s3/other_cacerts.txt +70 -0
  514. data/packages/gsutil/boto/tests/integration/s3/test_bucket.py +263 -0
  515. data/packages/gsutil/boto/tests/integration/s3/test_cert_verification.py +40 -0
  516. data/packages/gsutil/boto/tests/integration/s3/test_connection.py +245 -0
  517. data/packages/gsutil/boto/tests/integration/s3/test_cors.py +78 -0
  518. data/packages/gsutil/boto/tests/integration/s3/test_encryption.py +115 -0
  519. data/packages/gsutil/boto/tests/integration/s3/test_https_cert_validation.py +141 -0
  520. data/packages/gsutil/boto/tests/integration/s3/test_key.py +375 -0
  521. data/packages/gsutil/boto/tests/integration/s3/test_mfa.py +95 -0
  522. data/packages/gsutil/boto/tests/integration/s3/test_multidelete.py +181 -0
  523. data/packages/gsutil/boto/tests/integration/s3/test_multipart.py +139 -0
  524. data/packages/gsutil/boto/tests/integration/s3/test_pool.py +246 -0
  525. data/packages/gsutil/boto/tests/integration/s3/test_versioning.py +158 -0
  526. data/packages/gsutil/boto/tests/integration/sdb/__init__.py +20 -0
  527. data/packages/gsutil/boto/tests/integration/sdb/test_cert_verification.py +40 -0
  528. data/packages/gsutil/boto/tests/integration/sdb/test_connection.py +119 -0
  529. data/packages/gsutil/boto/tests/integration/ses/__init__.py +0 -0
  530. data/packages/gsutil/boto/tests/integration/ses/test_cert_verification.py +40 -0
  531. data/packages/gsutil/boto/tests/integration/ses/test_connection.py +38 -0
  532. data/packages/gsutil/boto/tests/integration/sns/__init__.py +20 -0
  533. data/packages/gsutil/boto/tests/integration/sns/test_cert_verification.py +40 -0
  534. data/packages/gsutil/boto/tests/integration/sqs/__init__.py +20 -0
  535. data/packages/gsutil/boto/tests/integration/sqs/test_cert_verification.py +40 -0
  536. data/packages/gsutil/boto/tests/integration/sqs/test_connection.py +217 -0
  537. data/packages/gsutil/boto/tests/integration/sts/__init__.py +20 -0
  538. data/packages/gsutil/boto/tests/integration/sts/test_cert_verification.py +40 -0
  539. data/packages/gsutil/boto/tests/integration/sts/test_session_token.py +65 -0
  540. data/packages/gsutil/boto/tests/integration/swf/__init__.py +0 -0
  541. data/packages/gsutil/boto/tests/integration/swf/test_cert_verification.py +40 -0
  542. data/packages/gsutil/boto/tests/integration/swf/test_layer1.py +246 -0
  543. data/packages/gsutil/boto/tests/integration/swf/test_layer1_workflow_execution.py +173 -0
  544. data/packages/gsutil/boto/tests/mturk/__init__.py +0 -0
  545. data/packages/gsutil/boto/tests/mturk/_init_environment.py +28 -0
  546. data/packages/gsutil/boto/tests/mturk/all_tests.py +24 -0
  547. data/packages/gsutil/boto/tests/mturk/cleanup_tests.py +47 -0
  548. data/packages/gsutil/boto/tests/mturk/common.py +45 -0
  549. data/packages/gsutil/boto/tests/mturk/create_free_text_question_regex.doctest +100 -0
  550. data/packages/gsutil/boto/tests/mturk/create_hit.doctest +92 -0
  551. data/packages/gsutil/boto/tests/mturk/create_hit_binary.doctest +94 -0
  552. data/packages/gsutil/boto/tests/mturk/create_hit_external.py +21 -0
  553. data/packages/gsutil/boto/tests/mturk/create_hit_from_hit_type.doctest +103 -0
  554. data/packages/gsutil/boto/tests/mturk/create_hit_test.py +21 -0
  555. data/packages/gsutil/boto/tests/mturk/create_hit_with_qualifications.py +16 -0
  556. data/packages/gsutil/boto/tests/mturk/hit_persistence.py +27 -0
  557. data/packages/gsutil/boto/tests/mturk/mocks.py +11 -0
  558. data/packages/gsutil/boto/tests/mturk/reviewable_hits.doctest +129 -0
  559. data/packages/gsutil/boto/tests/mturk/run-doctest.py +13 -0
  560. data/packages/gsutil/boto/tests/mturk/search_hits.doctest +16 -0
  561. data/packages/gsutil/boto/tests/mturk/selenium_support.py +61 -0
  562. data/packages/gsutil/boto/tests/mturk/support.py +7 -0
  563. data/packages/gsutil/boto/tests/mturk/test_disable_hit.py +11 -0
  564. data/packages/gsutil/boto/tests/test.py +59 -0
  565. data/packages/gsutil/boto/tests/unit/__init__.py +79 -0
  566. data/packages/gsutil/boto/tests/unit/auth/__init__.py +0 -0
  567. data/packages/gsutil/boto/tests/unit/auth/test_sigv4.py +73 -0
  568. data/packages/gsutil/boto/tests/unit/beanstalk/__init__.py +0 -0
  569. data/packages/gsutil/boto/tests/unit/beanstalk/test_layer1.py +128 -0
  570. data/packages/gsutil/boto/tests/unit/cloudformation/__init__.py +0 -0
  571. data/packages/gsutil/boto/tests/unit/cloudformation/test_connection.py +605 -0
  572. data/packages/gsutil/boto/tests/unit/cloudformation/test_stack.py +63 -0
  573. data/packages/gsutil/boto/tests/unit/cloudfront/__init__.py +0 -0
  574. data/packages/gsutil/boto/tests/unit/cloudfront/test_invalidation_list.py +113 -0
  575. data/packages/gsutil/boto/tests/unit/cloudfront/test_signed_urls.py +354 -0
  576. data/packages/gsutil/boto/tests/unit/cloudsearch/__init__.py +1 -0
  577. data/packages/gsutil/boto/tests/unit/cloudsearch/test_connection.py +241 -0
  578. data/packages/gsutil/boto/tests/unit/cloudsearch/test_document.py +324 -0
  579. data/packages/gsutil/boto/tests/unit/cloudsearch/test_search.py +325 -0
  580. data/packages/gsutil/boto/tests/unit/dynamodb/__init__.py +0 -0
  581. data/packages/gsutil/boto/tests/unit/dynamodb/test_batch.py +103 -0
  582. data/packages/gsutil/boto/tests/unit/dynamodb/test_layer2.py +119 -0
  583. data/packages/gsutil/boto/tests/unit/dynamodb/test_types.py +82 -0
  584. data/packages/gsutil/boto/tests/unit/ec2/__init__.py +0 -0
  585. data/packages/gsutil/boto/tests/unit/ec2/autoscale/__init__.py +0 -0
  586. data/packages/gsutil/boto/tests/unit/ec2/autoscale/test_group.py +162 -0
  587. data/packages/gsutil/boto/tests/unit/ec2/test_address.py +39 -0
  588. data/packages/gsutil/boto/tests/unit/ec2/test_blockdevicemapping.py +79 -0
  589. data/packages/gsutil/boto/tests/unit/ec2/test_connection.py +480 -0
  590. data/packages/gsutil/boto/tests/unit/ec2/test_instance.py +243 -0
  591. data/packages/gsutil/boto/tests/unit/ec2/test_networkinterface.py +140 -0
  592. data/packages/gsutil/boto/tests/unit/ec2/test_volume.py +248 -0
  593. data/packages/gsutil/boto/tests/unit/emr/test_emr_responses.py +373 -0
  594. data/packages/gsutil/boto/tests/unit/glacier/__init__.py +0 -0
  595. data/packages/gsutil/boto/tests/unit/glacier/test_concurrent.py +120 -0
  596. data/packages/gsutil/boto/tests/unit/glacier/test_job.py +60 -0
  597. data/packages/gsutil/boto/tests/unit/glacier/test_layer1.py +98 -0
  598. data/packages/gsutil/boto/tests/unit/glacier/test_layer2.py +266 -0
  599. data/packages/gsutil/boto/tests/unit/glacier/test_utils.py +116 -0
  600. data/packages/gsutil/boto/tests/unit/glacier/test_vault.py +100 -0
  601. data/packages/gsutil/boto/tests/unit/glacier/test_writer.py +185 -0
  602. data/packages/gsutil/boto/tests/unit/provider/__init__.py +0 -0
  603. data/packages/gsutil/boto/tests/unit/provider/test_provider.py +176 -0
  604. data/packages/gsutil/boto/tests/unit/rds/__init__.py +0 -0
  605. data/packages/gsutil/boto/tests/unit/rds/test_connection.py +131 -0
  606. data/packages/gsutil/boto/tests/unit/s3/__init__.py +0 -0
  607. data/packages/gsutil/boto/tests/unit/s3/test_cors_configuration.py +77 -0
  608. data/packages/gsutil/boto/tests/unit/s3/test_key.py +75 -0
  609. data/packages/gsutil/boto/tests/unit/s3/test_keyfile.py +101 -0
  610. data/packages/gsutil/boto/tests/unit/s3/test_lifecycle.py +97 -0
  611. data/packages/gsutil/boto/tests/unit/s3/test_tagging.py +47 -0
  612. data/packages/gsutil/boto/tests/unit/s3/test_uri.py +257 -0
  613. data/packages/gsutil/boto/tests/unit/s3/test_website.py +188 -0
  614. data/packages/gsutil/boto/tests/unit/sns/__init__.py +0 -0
  615. data/packages/gsutil/boto/tests/unit/sns/test_connection.py +99 -0
  616. data/packages/gsutil/boto/tests/unit/sqs/__init__.py +0 -0
  617. data/packages/gsutil/boto/tests/unit/sqs/test_connection.py +98 -0
  618. data/packages/gsutil/boto/tests/unit/sqs/test_queue.py +40 -0
  619. data/packages/gsutil/boto/tests/unit/sts/test_connection.py +74 -0
  620. data/packages/gsutil/boto/tests/unit/test_connection.py +60 -0
  621. data/packages/gsutil/boto/tests/unit/utils/test_utils.py +109 -0
  622. data/packages/gsutil/boto/tox.ini +8 -0
  623. data/packages/gsutil/gslib/README +5 -0
  624. data/packages/gsutil/gslib/__init__.py +22 -0
  625. data/packages/gsutil/gslib/__init__.pyc +0 -0
  626. data/packages/gsutil/gslib/addlhelp/__init__.py +15 -0
  627. data/packages/gsutil/gslib/addlhelp/acls.py +234 -0
  628. data/packages/gsutil/gslib/addlhelp/anon.py +57 -0
  629. data/packages/gsutil/gslib/addlhelp/command_opts.py +116 -0
  630. data/packages/gsutil/gslib/addlhelp/dev.py +139 -0
  631. data/packages/gsutil/gslib/addlhelp/metadata.py +186 -0
  632. data/packages/gsutil/gslib/addlhelp/naming.py +173 -0
  633. data/packages/gsutil/gslib/addlhelp/prod.py +160 -0
  634. data/packages/gsutil/gslib/addlhelp/projects.py +130 -0
  635. data/packages/gsutil/gslib/addlhelp/subdirs.py +110 -0
  636. data/packages/gsutil/gslib/addlhelp/support.py +86 -0
  637. data/packages/gsutil/gslib/addlhelp/versioning.py +242 -0
  638. data/packages/gsutil/gslib/addlhelp/wildcards.py +170 -0
  639. data/packages/gsutil/gslib/bucket_listing_ref.py +175 -0
  640. data/packages/gsutil/gslib/bucket_listing_ref.pyc +0 -0
  641. data/packages/gsutil/gslib/command.py +722 -0
  642. data/packages/gsutil/gslib/command.pyc +0 -0
  643. data/packages/gsutil/gslib/command_runner.py +101 -0
  644. data/packages/gsutil/gslib/command_runner.pyc +0 -0
  645. data/packages/gsutil/gslib/commands/__init__.py +15 -0
  646. data/packages/gsutil/gslib/commands/__init__.pyc +0 -0
  647. data/packages/gsutil/gslib/commands/cat.py +131 -0
  648. data/packages/gsutil/gslib/commands/cat.pyc +0 -0
  649. data/packages/gsutil/gslib/commands/chacl.py +532 -0
  650. data/packages/gsutil/gslib/commands/chacl.pyc +0 -0
  651. data/packages/gsutil/gslib/commands/config.py +694 -0
  652. data/packages/gsutil/gslib/commands/config.pyc +0 -0
  653. data/packages/gsutil/gslib/commands/cp.py +1818 -0
  654. data/packages/gsutil/gslib/commands/cp.pyc +0 -0
  655. data/packages/gsutil/gslib/commands/disablelogging.py +101 -0
  656. data/packages/gsutil/gslib/commands/disablelogging.pyc +0 -0
  657. data/packages/gsutil/gslib/commands/enablelogging.py +149 -0
  658. data/packages/gsutil/gslib/commands/enablelogging.pyc +0 -0
  659. data/packages/gsutil/gslib/commands/getacl.py +82 -0
  660. data/packages/gsutil/gslib/commands/getacl.pyc +0 -0
  661. data/packages/gsutil/gslib/commands/getcors.py +121 -0
  662. data/packages/gsutil/gslib/commands/getcors.pyc +0 -0
  663. data/packages/gsutil/gslib/commands/getdefacl.py +86 -0
  664. data/packages/gsutil/gslib/commands/getdefacl.pyc +0 -0
  665. data/packages/gsutil/gslib/commands/getlogging.py +137 -0
  666. data/packages/gsutil/gslib/commands/getlogging.pyc +0 -0
  667. data/packages/gsutil/gslib/commands/getversioning.py +116 -0
  668. data/packages/gsutil/gslib/commands/getversioning.pyc +0 -0
  669. data/packages/gsutil/gslib/commands/getwebcfg.py +122 -0
  670. data/packages/gsutil/gslib/commands/getwebcfg.pyc +0 -0
  671. data/packages/gsutil/gslib/commands/help.py +218 -0
  672. data/packages/gsutil/gslib/commands/help.pyc +0 -0
  673. data/packages/gsutil/gslib/commands/ls.py +578 -0
  674. data/packages/gsutil/gslib/commands/ls.pyc +0 -0
  675. data/packages/gsutil/gslib/commands/mb.py +172 -0
  676. data/packages/gsutil/gslib/commands/mb.pyc +0 -0
  677. data/packages/gsutil/gslib/commands/mv.py +159 -0
  678. data/packages/gsutil/gslib/commands/mv.pyc +0 -0
  679. data/packages/gsutil/gslib/commands/perfdiag.py +903 -0
  680. data/packages/gsutil/gslib/commands/perfdiag.pyc +0 -0
  681. data/packages/gsutil/gslib/commands/rb.py +113 -0
  682. data/packages/gsutil/gslib/commands/rb.pyc +0 -0
  683. data/packages/gsutil/gslib/commands/rm.py +239 -0
  684. data/packages/gsutil/gslib/commands/rm.pyc +0 -0
  685. data/packages/gsutil/gslib/commands/setacl.py +138 -0
  686. data/packages/gsutil/gslib/commands/setacl.pyc +0 -0
  687. data/packages/gsutil/gslib/commands/setcors.py +145 -0
  688. data/packages/gsutil/gslib/commands/setcors.pyc +0 -0
  689. data/packages/gsutil/gslib/commands/setdefacl.py +105 -0
  690. data/packages/gsutil/gslib/commands/setdefacl.pyc +0 -0
  691. data/packages/gsutil/gslib/commands/setmeta.py +428 -0
  692. data/packages/gsutil/gslib/commands/setmeta.pyc +0 -0
  693. data/packages/gsutil/gslib/commands/setversioning.py +114 -0
  694. data/packages/gsutil/gslib/commands/setversioning.pyc +0 -0
  695. data/packages/gsutil/gslib/commands/setwebcfg.py +190 -0
  696. data/packages/gsutil/gslib/commands/setwebcfg.pyc +0 -0
  697. data/packages/gsutil/gslib/commands/test.py +228 -0
  698. data/packages/gsutil/gslib/commands/test.pyc +0 -0
  699. data/packages/gsutil/gslib/commands/update.py +305 -0
  700. data/packages/gsutil/gslib/commands/update.pyc +0 -0
  701. data/packages/gsutil/gslib/commands/version.py +150 -0
  702. data/packages/gsutil/gslib/commands/version.pyc +0 -0
  703. data/packages/gsutil/gslib/exception.py +76 -0
  704. data/packages/gsutil/gslib/exception.pyc +0 -0
  705. data/packages/gsutil/gslib/help_provider.py +81 -0
  706. data/packages/gsutil/gslib/help_provider.pyc +0 -0
  707. data/packages/gsutil/gslib/name_expansion.py +550 -0
  708. data/packages/gsutil/gslib/name_expansion.pyc +0 -0
  709. data/packages/gsutil/gslib/no_op_auth_plugin.py +30 -0
  710. data/packages/gsutil/gslib/plurality_checkable_iterator.py +56 -0
  711. data/packages/gsutil/gslib/plurality_checkable_iterator.pyc +0 -0
  712. data/packages/gsutil/gslib/project_id.py +67 -0
  713. data/packages/gsutil/gslib/project_id.pyc +0 -0
  714. data/packages/gsutil/gslib/storage_uri_builder.py +56 -0
  715. data/packages/gsutil/gslib/storage_uri_builder.pyc +0 -0
  716. data/packages/gsutil/gslib/tests/__init__.py +15 -0
  717. data/packages/gsutil/gslib/tests/__init__.pyc +0 -0
  718. data/packages/gsutil/gslib/tests/test_chacl.py +236 -0
  719. data/packages/gsutil/gslib/tests/test_cp.py +267 -0
  720. data/packages/gsutil/gslib/tests/test_data/test.gif +0 -0
  721. data/packages/gsutil/gslib/tests/test_data/test.mp3 +0 -0
  722. data/packages/gsutil/gslib/tests/test_ls.py +66 -0
  723. data/packages/gsutil/gslib/tests/test_mv.py +69 -0
  724. data/packages/gsutil/gslib/tests/test_naming.py +989 -0
  725. data/packages/gsutil/gslib/tests/test_perfdiag.py +41 -0
  726. data/packages/gsutil/gslib/tests/test_plurality_checkable_iterator.py +67 -0
  727. data/packages/gsutil/gslib/tests/test_rm.py +143 -0
  728. data/packages/gsutil/gslib/tests/test_setacl.py +152 -0
  729. data/packages/gsutil/gslib/tests/test_setcors.py +168 -0
  730. data/packages/gsutil/gslib/tests/test_setmeta.py +91 -0
  731. data/packages/gsutil/gslib/tests/test_setversioning.py +44 -0
  732. data/packages/gsutil/gslib/tests/test_setwebcfg.py +63 -0
  733. data/packages/gsutil/gslib/tests/test_thread_pool.py +92 -0
  734. data/packages/gsutil/gslib/tests/test_wildcard_iterator.py +364 -0
  735. data/packages/gsutil/gslib/tests/testcase/__init__.py +18 -0
  736. data/packages/gsutil/gslib/tests/testcase/base.py +89 -0
  737. data/packages/gsutil/gslib/tests/testcase/integration_testcase.py +197 -0
  738. data/packages/gsutil/gslib/tests/testcase/unit_testcase.py +230 -0
  739. data/packages/gsutil/gslib/tests/util.py +125 -0
  740. data/packages/gsutil/gslib/tests/util.pyc +0 -0
  741. data/packages/gsutil/gslib/thread_pool.py +79 -0
  742. data/packages/gsutil/gslib/thread_pool.pyc +0 -0
  743. data/packages/gsutil/gslib/util.py +151 -0
  744. data/packages/gsutil/gslib/util.pyc +0 -0
  745. data/packages/gsutil/gslib/wildcard_iterator.py +492 -0
  746. data/packages/gsutil/gslib/wildcard_iterator.pyc +0 -0
  747. data/packages/gsutil/gsutil +377 -0
  748. data/packages/gsutil/gsutil.spec.in +75 -0
  749. data/packages/gsutil/oauth2_plugin/__init__.py +22 -0
  750. data/packages/gsutil/oauth2_plugin/__init__.pyc +0 -0
  751. data/packages/gsutil/oauth2_plugin/oauth2_client.py +642 -0
  752. data/packages/gsutil/oauth2_plugin/oauth2_client.pyc +0 -0
  753. data/packages/gsutil/oauth2_plugin/oauth2_client_test.py +374 -0
  754. data/packages/gsutil/oauth2_plugin/oauth2_helper.py +110 -0
  755. data/packages/gsutil/oauth2_plugin/oauth2_helper.pyc +0 -0
  756. data/packages/gsutil/oauth2_plugin/oauth2_plugin.py +24 -0
  757. data/packages/gsutil/oauth2_plugin/oauth2_plugin.pyc +0 -0
  758. data/packages/gsutil/pkg_gen.sh +54 -0
  759. data/packages/gsutil/pkg_util.py +60 -0
  760. data/packages/gsutil/setup.py +141 -0
  761. data/packages/gsutil/third_party/__init__.py +0 -0
  762. data/packages/gsutil/third_party/__init__.pyc +0 -0
  763. data/packages/gsutil/third_party/fancy_urllib/README +21 -0
  764. data/packages/gsutil/third_party/fancy_urllib/__init__.py +398 -0
  765. data/packages/gsutil/third_party/fancy_urllib/__init__.pyc +0 -0
  766. data/tasks/rubygem.rake +3 -1
  767. metadata +770 -7
  768. metadata.gz.sig +0 -0
@@ -0,0 +1,64 @@
1
+ # Copyright 2012 Google Inc.
2
+ # Copyright (c) 2006,2007 Mitch Garnaat http://garnaat.org/
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining a
5
+ # copy of this software and associated documentation files (the
6
+ # "Software"), to deal in the Software without restriction, including
7
+ # without limitation the rights to use, copy, modify, merge, publish, dis-
8
+ # tribute, sublicense, and/or sell copies of the Software, and to permit
9
+ # persons to whom the Software is furnished to do so, subject to the fol-
10
+ # lowing conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included
13
+ # in all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
16
+ # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
17
+ # ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
18
+ # SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
19
+ # WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21
+ # IN THE SOFTWARE.
22
+
23
+ def versioned_bucket_lister(bucket, prefix='', delimiter='',
24
+ marker='', generation_marker='', headers=None):
25
+ """
26
+ A generator function for listing versioned objects.
27
+ """
28
+ more_results = True
29
+ k = None
30
+ while more_results:
31
+ rs = bucket.get_all_versions(prefix=prefix, marker=marker,
32
+ generation_marker=generation_marker,
33
+ delimiter=delimiter, headers=headers,
34
+ max_keys=999)
35
+ for k in rs:
36
+ yield k
37
+ marker = rs.next_marker
38
+ generation_marker = rs.next_generation_marker
39
+ more_results= rs.is_truncated
40
+
41
+ class VersionedBucketListResultSet:
42
+ """
43
+ A resultset for listing versions within a bucket. Uses the bucket_lister
44
+ generator function and implements the iterator interface. This
45
+ transparently handles the results paging from GCS so even if you have
46
+ many thousands of keys within the bucket you can iterate over all
47
+ keys in a reasonably efficient manner.
48
+ """
49
+
50
+ def __init__(self, bucket=None, prefix='', delimiter='', marker='',
51
+ generation_marker='', headers=None):
52
+ self.bucket = bucket
53
+ self.prefix = prefix
54
+ self.delimiter = delimiter
55
+ self.marker = marker
56
+ self.generation_marker = generation_marker
57
+ self.headers = headers
58
+
59
+ def __iter__(self):
60
+ return versioned_bucket_lister(self.bucket, prefix=self.prefix,
61
+ delimiter=self.delimiter,
62
+ marker=self.marker,
63
+ generation_marker=self.generation_marker,
64
+ headers=self.headers)
@@ -0,0 +1,103 @@
1
+ # Copyright 2010 Google Inc.
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a
4
+ # copy of this software and associated documentation files (the
5
+ # "Software"), to deal in the Software without restriction, including
6
+ # without limitation the rights to use, copy, modify, merge, publish, dis-
7
+ # tribute, sublicense, and/or sell copies of the Software, and to permit
8
+ # persons to whom the Software is furnished to do so, subject to the fol-
9
+ # lowing conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be included
12
+ # in all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15
+ # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
16
+ # ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
17
+ # SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
18
+ # WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
20
+ # IN THE SOFTWARE.
21
+
22
+ from boto.gs.bucket import Bucket
23
+ from boto.s3.connection import S3Connection
24
+ from boto.s3.connection import SubdomainCallingFormat
25
+ from boto.s3.connection import check_lowercase_bucketname
26
+
27
+ class Location:
28
+ DEFAULT = 'US'
29
+ EU = 'EU'
30
+
31
+ class GSConnection(S3Connection):
32
+
33
+ DefaultHost = 'storage.googleapis.com'
34
+ QueryString = 'Signature=%s&Expires=%d&AWSAccessKeyId=%s'
35
+
36
+ def __init__(self, gs_access_key_id=None, gs_secret_access_key=None,
37
+ is_secure=True, port=None, proxy=None, proxy_port=None,
38
+ proxy_user=None, proxy_pass=None,
39
+ host=DefaultHost, debug=0, https_connection_factory=None,
40
+ calling_format=SubdomainCallingFormat(), path='/',
41
+ suppress_consec_slashes=True):
42
+ S3Connection.__init__(self, gs_access_key_id, gs_secret_access_key,
43
+ is_secure, port, proxy, proxy_port, proxy_user, proxy_pass,
44
+ host, debug, https_connection_factory, calling_format, path,
45
+ "google", Bucket,
46
+ suppress_consec_slashes=suppress_consec_slashes)
47
+
48
+ def create_bucket(self, bucket_name, headers=None,
49
+ location=Location.DEFAULT, policy=None,
50
+ storage_class='STANDARD'):
51
+ """
52
+ Creates a new bucket. By default it's located in the USA. You can
53
+ pass Location.EU to create an European bucket. You can also pass
54
+ a LocationConstraint for where the bucket should be located, and
55
+ a StorageClass describing how the data should be stored.
56
+
57
+ :type bucket_name: string
58
+ :param bucket_name: The name of the new bucket.
59
+
60
+ :type headers: dict
61
+ :param headers: Additional headers to pass along with the request to GCS.
62
+
63
+ :type location: :class:`boto.gs.connection.Location`
64
+ :param location: The location of the new bucket.
65
+
66
+ :type policy: :class:`boto.gs.acl.CannedACLStrings`
67
+ :param policy: A canned ACL policy that will be applied to the new key
68
+ in GCS.
69
+
70
+ :type storage_class: string
71
+ :param storage_class: Either 'STANDARD' or 'DURABLE_REDUCED_AVAILABILITY'.
72
+
73
+ """
74
+ check_lowercase_bucketname(bucket_name)
75
+
76
+ if policy:
77
+ if headers:
78
+ headers[self.provider.acl_header] = policy
79
+ else:
80
+ headers = {self.provider.acl_header : policy}
81
+ if not location:
82
+ location = Location.DEFAULT
83
+ location_elem = ('<LocationConstraint>%s</LocationConstraint>'
84
+ % location)
85
+ if storage_class:
86
+ storage_class_elem = ('<StorageClass>%s</StorageClass>'
87
+ % storage_class)
88
+ else:
89
+ storage_class_elem = ''
90
+ data = ('<CreateBucketConfiguration>%s%s</CreateBucketConfiguration>'
91
+ % (location_elem, storage_class_elem))
92
+ response = self.make_request('PUT', bucket_name, headers=headers,
93
+ data=data)
94
+ body = response.read()
95
+ if response.status == 409:
96
+ raise self.provider.storage_create_error(
97
+ response.status, response.reason, body)
98
+ if response.status == 200:
99
+ return self.bucket_class(self, bucket_name)
100
+ else:
101
+ raise self.provider.storage_response_error(
102
+ response.status, response.reason, body)
103
+
@@ -0,0 +1,169 @@
1
+ # Copyright 2012 Google Inc.
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a
4
+ # copy of this software and associated documentation files (the
5
+ # "Software"), to deal in the Software without restriction, including
6
+ # without limitation the rights to use, copy, modify, merge, publish, dis-
7
+ # tribute, sublicense, and/or sell copies of the Software, and to permit
8
+ # persons to whom the Software is furnished to do so, subject to the fol-
9
+ # lowing conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be included
12
+ # in all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15
+ # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
16
+ # ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
17
+ # SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
18
+ # WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
20
+ # IN THE SOFTWARE.
21
+
22
+ import types
23
+ from boto.gs.user import User
24
+ from boto.exception import InvalidCorsError
25
+ from xml.sax import handler
26
+
27
+ # Relevant tags for the CORS XML document.
28
+ CORS_CONFIG = 'CorsConfig'
29
+ CORS = 'Cors'
30
+ ORIGINS = 'Origins'
31
+ ORIGIN = 'Origin'
32
+ METHODS = 'Methods'
33
+ METHOD = 'Method'
34
+ HEADERS = 'ResponseHeaders'
35
+ HEADER = 'ResponseHeader'
36
+ MAXAGESEC = 'MaxAgeSec'
37
+
38
+ class Cors(handler.ContentHandler):
39
+ """Encapsulates the CORS configuration XML document"""
40
+ def __init__(self):
41
+ # List of CORS elements found within a CorsConfig element.
42
+ self.cors = []
43
+ # List of collections (e.g. Methods, ResponseHeaders, Origins)
44
+ # found within a CORS element. We use a list of lists here
45
+ # instead of a dictionary because the collections need to be
46
+ # preserved in the order in which they appear in the input XML
47
+ # document (and Python dictionary keys are inherently unordered).
48
+ # The elements on this list are two element tuples of the form
49
+ # (collection name, [list of collection contents]).
50
+ self.collections = []
51
+ # Lists of elements within a collection. Again a list is needed to
52
+ # preserve ordering but also because the same element may appear
53
+ # multiple times within a collection.
54
+ self.elements = []
55
+ # Dictionary mapping supported collection names to element types
56
+ # which may be contained within each.
57
+ self.legal_collections = {
58
+ ORIGINS : [ORIGIN],
59
+ METHODS : [METHOD],
60
+ HEADERS : [HEADER],
61
+ MAXAGESEC: []
62
+ }
63
+ # List of supported element types within any collection, used for
64
+ # checking validadity of a parsed element name.
65
+ self.legal_elements = [ORIGIN, METHOD, HEADER]
66
+
67
+ self.parse_level = 0
68
+ self.collection = None
69
+ self.element = None
70
+
71
+ def validateParseLevel(self, tag, level):
72
+ """Verify parse level for a given tag."""
73
+ if self.parse_level != level:
74
+ raise InvalidCorsError('Invalid tag %s at parse level %d: ' %
75
+ (tag, self.parse_level))
76
+
77
+ def startElement(self, name, attrs, connection):
78
+ """SAX XML logic for parsing new element found."""
79
+ if name == CORS_CONFIG:
80
+ self.validateParseLevel(name, 0)
81
+ self.parse_level += 1;
82
+ elif name == CORS:
83
+ self.validateParseLevel(name, 1)
84
+ self.parse_level += 1;
85
+ elif name in self.legal_collections:
86
+ self.validateParseLevel(name, 2)
87
+ self.parse_level += 1;
88
+ self.collection = name
89
+ elif name in self.legal_elements:
90
+ self.validateParseLevel(name, 3)
91
+ # Make sure this tag is found inside a collection tag.
92
+ if self.collection is None:
93
+ raise InvalidCorsError('Tag %s found outside collection' % name)
94
+ # Make sure this tag is allowed for the current collection tag.
95
+ if name not in self.legal_collections[self.collection]:
96
+ raise InvalidCorsError('Tag %s not allowed in %s collection' %
97
+ (name, self.collection))
98
+ self.element = name
99
+ else:
100
+ raise InvalidCorsError('Unsupported tag ' + name)
101
+
102
+ def endElement(self, name, value, connection):
103
+ """SAX XML logic for parsing new element found."""
104
+ if name == CORS_CONFIG:
105
+ self.validateParseLevel(name, 1)
106
+ self.parse_level -= 1;
107
+ elif name == CORS:
108
+ self.validateParseLevel(name, 2)
109
+ self.parse_level -= 1;
110
+ # Terminating a CORS element, save any collections we found
111
+ # and re-initialize collections list.
112
+ self.cors.append(self.collections)
113
+ self.collections = []
114
+ elif name in self.legal_collections:
115
+ self.validateParseLevel(name, 3)
116
+ if name != self.collection:
117
+ raise InvalidCorsError('Mismatched start and end tags (%s/%s)' %
118
+ (self.collection, name))
119
+ self.parse_level -= 1;
120
+ if not self.legal_collections[name]:
121
+ # If this collection doesn't contain any sub-elements, store
122
+ # a tuple of name and this tag's element value.
123
+ self.collections.append((name, value.strip()))
124
+ else:
125
+ # Otherwise, we're terminating a collection of sub-elements,
126
+ # so store a tuple of name and list of contained elements.
127
+ self.collections.append((name, self.elements))
128
+ self.elements = []
129
+ self.collection = None
130
+ elif name in self.legal_elements:
131
+ self.validateParseLevel(name, 3)
132
+ # Make sure this tag is found inside a collection tag.
133
+ if self.collection is None:
134
+ raise InvalidCorsError('Tag %s found outside collection' % name)
135
+ # Make sure this end tag is allowed for the current collection tag.
136
+ if name not in self.legal_collections[self.collection]:
137
+ raise InvalidCorsError('Tag %s not allowed in %s collection' %
138
+ (name, self.collection))
139
+ if name != self.element:
140
+ raise InvalidCorsError('Mismatched start and end tags (%s/%s)' %
141
+ (self.element, name))
142
+ # Terminating an element tag, add it to the list of elements
143
+ # for the current collection.
144
+ self.elements.append((name, value.strip()))
145
+ self.element = None
146
+ else:
147
+ raise InvalidCorsError('Unsupported end tag ' + name)
148
+
149
+ def to_xml(self):
150
+ """Convert CORS object into XML string representation."""
151
+ s = '<' + CORS_CONFIG + '>'
152
+ for collections in self.cors:
153
+ s += '<' + CORS + '>'
154
+ for (collection, elements_or_value) in collections:
155
+ assert collection is not None
156
+ s += '<' + collection + '>'
157
+ # If collection elements has type string, append atomic value,
158
+ # otherwise, append sequence of values in named tags.
159
+ if isinstance(elements_or_value, types.StringTypes):
160
+ s += elements_or_value
161
+ else:
162
+ for (name, value) in elements_or_value:
163
+ assert name is not None
164
+ assert value is not None
165
+ s += '<' + name + '>' + value + '</' + name + '>'
166
+ s += '</' + collection + '>'
167
+ s += '</' + CORS + '>'
168
+ s += '</' + CORS_CONFIG + '>'
169
+ return s
@@ -0,0 +1,704 @@
1
+ # Copyright 2010 Google Inc.
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a
4
+ # copy of this software and associated documentation files (the
5
+ # "Software"), to deal in the Software without restriction, including
6
+ # without limitation the rights to use, copy, modify, merge, publish, dis-
7
+ # tribute, sublicense, and/or sell copies of the Software, and to permit
8
+ # persons to whom the Software is furnished to do so, subject to the fol-
9
+ # lowing conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be included
12
+ # in all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15
+ # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
16
+ # ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
17
+ # SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
18
+ # WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
20
+ # IN THE SOFTWARE.
21
+
22
+ import base64
23
+ import binascii
24
+ import os
25
+ import re
26
+ import StringIO
27
+ from boto.exception import BotoClientError
28
+ from boto.s3.key import Key as S3Key
29
+ from boto.s3.keyfile import KeyFile
30
+
31
+ class Key(S3Key):
32
+ """
33
+ Represents a key (object) in a GS bucket.
34
+
35
+ :ivar bucket: The parent :class:`boto.gs.bucket.Bucket`.
36
+ :ivar name: The name of this Key object.
37
+ :ivar metadata: A dictionary containing user metadata that you
38
+ wish to store with the object or that has been retrieved from
39
+ an existing object.
40
+ :ivar cache_control: The value of the `Cache-Control` HTTP header.
41
+ :ivar content_type: The value of the `Content-Type` HTTP header.
42
+ :ivar content_encoding: The value of the `Content-Encoding` HTTP header.
43
+ :ivar content_disposition: The value of the `Content-Disposition` HTTP
44
+ header.
45
+ :ivar content_language: The value of the `Content-Language` HTTP header.
46
+ :ivar etag: The `etag` associated with this object.
47
+ :ivar last_modified: The string timestamp representing the last
48
+ time this object was modified in GS.
49
+ :ivar owner: The ID of the owner of this object.
50
+ :ivar storage_class: The storage class of the object. Currently, one of:
51
+ STANDARD | DURABLE_REDUCED_AVAILABILITY.
52
+ :ivar md5: The MD5 hash of the contents of the object.
53
+ :ivar size: The size, in bytes, of the object.
54
+ :ivar generation: The generation number of the object.
55
+ :ivar meta_generation: The generation number of the object metadata.
56
+ :ivar encrypted: Whether the object is encrypted while at rest on
57
+ the server.
58
+ """
59
+ generation = None
60
+ meta_generation = None
61
+
62
+ def __repr__(self):
63
+ if self.generation and self.meta_generation:
64
+ ver_str = '#%s.%s' % (self.generation, self.meta_generation)
65
+ else:
66
+ ver_str = ''
67
+ if self.bucket:
68
+ return '<Key: %s,%s%s>' % (self.bucket.name, self.name, ver_str)
69
+ else:
70
+ return '<Key: None,%s%s>' % (self.name, ver_str)
71
+
72
+ def endElement(self, name, value, connection):
73
+ if name == 'Key':
74
+ self.name = value
75
+ elif name == 'ETag':
76
+ self.etag = value
77
+ elif name == 'IsLatest':
78
+ if value == 'true':
79
+ self.is_latest = True
80
+ else:
81
+ self.is_latest = False
82
+ elif name == 'LastModified':
83
+ self.last_modified = value
84
+ elif name == 'Size':
85
+ self.size = int(value)
86
+ elif name == 'StorageClass':
87
+ self.storage_class = value
88
+ elif name == 'Owner':
89
+ pass
90
+ elif name == 'VersionId':
91
+ self.version_id = value
92
+ elif name == 'Generation':
93
+ self.generation = value
94
+ elif name == 'MetaGeneration':
95
+ self.meta_generation = value
96
+ else:
97
+ setattr(self, name, value)
98
+
99
+ def handle_version_headers(self, resp, force=False):
100
+ self.meta_generation = resp.getheader('x-goog-metageneration', None)
101
+ self.generation = resp.getheader('x-goog-generation', None)
102
+
103
+ def get_file(self, fp, headers=None, cb=None, num_cb=10,
104
+ torrent=False, version_id=None, override_num_retries=None,
105
+ response_headers=None):
106
+ query_args = None
107
+ if self.generation:
108
+ query_args = ['generation=%s' % self.generation]
109
+ self._get_file_internal(fp, headers=headers, cb=cb, num_cb=num_cb,
110
+ override_num_retries=override_num_retries,
111
+ response_headers=response_headers,
112
+ query_args=query_args)
113
+
114
+ def delete(self):
115
+ return self.bucket.delete_key(self.name, version_id=self.version_id,
116
+ generation=self.generation)
117
+
118
+ def add_email_grant(self, permission, email_address):
119
+ """
120
+ Convenience method that provides a quick way to add an email grant to a
121
+ key. This method retrieves the current ACL, creates a new grant based on
122
+ the parameters passed in, adds that grant to the ACL and then PUT's the
123
+ new ACL back to GS.
124
+
125
+ :type permission: string
126
+ :param permission: The permission being granted. Should be one of:
127
+ READ|FULL_CONTROL
128
+ See http://code.google.com/apis/storage/docs/developer-guide.html#authorization
129
+ for more details on permissions.
130
+
131
+ :type email_address: string
132
+ :param email_address: The email address associated with the Google
133
+ account to which you are granting the permission.
134
+ """
135
+ acl = self.get_acl()
136
+ acl.add_email_grant(permission, email_address)
137
+ self.set_acl(acl)
138
+
139
+ def add_user_grant(self, permission, user_id):
140
+ """
141
+ Convenience method that provides a quick way to add a canonical user
142
+ grant to a key. This method retrieves the current ACL, creates a new
143
+ grant based on the parameters passed in, adds that grant to the ACL and
144
+ then PUT's the new ACL back to GS.
145
+
146
+ :type permission: string
147
+ :param permission: The permission being granted. Should be one of:
148
+ READ|FULL_CONTROL
149
+ See http://code.google.com/apis/storage/docs/developer-guide.html#authorization
150
+ for more details on permissions.
151
+
152
+ :type user_id: string
153
+ :param user_id: The canonical user id associated with the GS account to
154
+ which you are granting the permission.
155
+ """
156
+ acl = self.get_acl()
157
+ acl.add_user_grant(permission, user_id)
158
+ self.set_acl(acl)
159
+
160
+ def add_group_email_grant(self, permission, email_address, headers=None):
161
+ """
162
+ Convenience method that provides a quick way to add an email group
163
+ grant to a key. This method retrieves the current ACL, creates a new
164
+ grant based on the parameters passed in, adds that grant to the ACL and
165
+ then PUT's the new ACL back to GS.
166
+
167
+ :type permission: string
168
+ :param permission: The permission being granted. Should be one of:
169
+ READ|FULL_CONTROL
170
+ See http://code.google.com/apis/storage/docs/developer-guide.html#authorization
171
+ for more details on permissions.
172
+
173
+ :type email_address: string
174
+ :param email_address: The email address associated with the Google
175
+ Group to which you are granting the permission.
176
+ """
177
+ acl = self.get_acl(headers=headers)
178
+ acl.add_group_email_grant(permission, email_address)
179
+ self.set_acl(acl, headers=headers)
180
+
181
+ def add_group_grant(self, permission, group_id):
182
+ """
183
+ Convenience method that provides a quick way to add a canonical group
184
+ grant to a key. This method retrieves the current ACL, creates a new
185
+ grant based on the parameters passed in, adds that grant to the ACL and
186
+ then PUT's the new ACL back to GS.
187
+
188
+ :type permission: string
189
+ :param permission: The permission being granted. Should be one of:
190
+ READ|FULL_CONTROL
191
+ See http://code.google.com/apis/storage/docs/developer-guide.html#authorization
192
+ for more details on permissions.
193
+
194
+ :type group_id: string
195
+ :param group_id: The canonical group id associated with the Google
196
+ Groups account you are granting the permission to.
197
+ """
198
+ acl = self.get_acl()
199
+ acl.add_group_grant(permission, group_id)
200
+ self.set_acl(acl)
201
+
202
+ def set_contents_from_file(self, fp, headers=None, replace=True,
203
+ cb=None, num_cb=10, policy=None, md5=None,
204
+ res_upload_handler=None, size=None, rewind=False,
205
+ if_generation=None):
206
+ """
207
+ Store an object in GS using the name of the Key object as the
208
+ key in GS and the contents of the file pointed to by 'fp' as the
209
+ contents.
210
+
211
+ :type fp: file
212
+ :param fp: the file whose contents are to be uploaded
213
+
214
+ :type headers: dict
215
+ :param headers: additional HTTP headers to be sent with the PUT request.
216
+
217
+ :type replace: bool
218
+ :param replace: If this parameter is False, the method will first check
219
+ to see if an object exists in the bucket with the same key. If it
220
+ does, it won't overwrite it. The default value is True which will
221
+ overwrite the object.
222
+
223
+ :type cb: function
224
+ :param cb: a callback function that will be called to report
225
+ progress on the upload. The callback should accept two integer
226
+ parameters, the first representing the number of bytes that have
227
+ been successfully transmitted to GS and the second representing the
228
+ total number of bytes that need to be transmitted.
229
+
230
+ :type num_cb: int
231
+ :param num_cb: (optional) If a callback is specified with the cb
232
+ parameter, this parameter determines the granularity of the callback
233
+ by defining the maximum number of times the callback will be called
234
+ during the file transfer.
235
+
236
+ :type policy: :class:`boto.gs.acl.CannedACLStrings`
237
+ :param policy: A canned ACL policy that will be applied to the new key
238
+ in GS.
239
+
240
+ :type md5: A tuple containing the hexdigest version of the MD5 checksum
241
+ of the file as the first element and the Base64-encoded version of
242
+ the plain checksum as the second element. This is the same format
243
+ returned by the compute_md5 method.
244
+ :param md5: If you need to compute the MD5 for any reason prior to
245
+ upload, it's silly to have to do it twice so this param, if present,
246
+ will be used as the MD5 values of the file. Otherwise, the checksum
247
+ will be computed.
248
+
249
+ :type res_upload_handler: ResumableUploadHandler
250
+ :param res_upload_handler: If provided, this handler will perform the
251
+ upload.
252
+
253
+ :type size: int
254
+ :param size: (optional) The Maximum number of bytes to read from
255
+ the file pointer (fp). This is useful when uploading
256
+ a file in multiple parts where you are splitting the
257
+ file up into different ranges to be uploaded. If not
258
+ specified, the default behaviour is to read all bytes
259
+ from the file pointer. Less bytes may be available.
260
+ Notes:
261
+
262
+ 1. The "size" parameter currently cannot be used when
263
+ a resumable upload handler is given but is still
264
+ useful for uploading part of a file as implemented
265
+ by the parent class.
266
+ 2. At present Google Cloud Storage does not support
267
+ multipart uploads.
268
+
269
+ :type rewind: bool
270
+ :param rewind: (optional) If True, the file pointer (fp) will be
271
+ rewound to the start before any bytes are read from
272
+ it. The default behaviour is False which reads from
273
+ the current position of the file pointer (fp).
274
+
275
+ :type if_generation: int
276
+ :param if_generation: (optional) If set to a generation number, the
277
+ object will only be written to if its current generation number is
278
+ this value. If set to the value 0, the object will only be written
279
+ if it doesn't already exist.
280
+
281
+ :rtype: int
282
+ :return: The number of bytes written to the key.
283
+
284
+ TODO: At some point we should refactor the Bucket and Key classes,
285
+ to move functionality common to all providers into a parent class,
286
+ and provider-specific functionality into subclasses (rather than
287
+ just overriding/sharing code the way it currently works).
288
+ """
289
+ provider = self.bucket.connection.provider
290
+ if res_upload_handler and size:
291
+ # could use size instead of file_length if provided but...
292
+ raise BotoClientError('"size" param not supported for resumable uploads.')
293
+ headers = headers or {}
294
+ if policy:
295
+ headers[provider.acl_header] = policy
296
+
297
+ if rewind:
298
+ # caller requests reading from beginning of fp.
299
+ fp.seek(0, os.SEEK_SET)
300
+ else:
301
+ # The following seek/tell/seek logic is intended
302
+ # to detect applications using the older interface to
303
+ # set_contents_from_file(), which automatically rewound the
304
+ # file each time the Key was reused. This changed with commit
305
+ # 14ee2d03f4665fe20d19a85286f78d39d924237e, to support uploads
306
+ # split into multiple parts and uploaded in parallel, and at
307
+ # the time of that commit this check was added because otherwise
308
+ # older programs would get a success status and upload an empty
309
+ # object. Unfortuantely, it's very inefficient for fp's implemented
310
+ # by KeyFile (used, for example, by gsutil when copying between
311
+ # providers). So, we skip the check for the KeyFile case.
312
+ # TODO: At some point consider removing this seek/tell/seek
313
+ # logic, after enough time has passed that it's unlikely any
314
+ # programs remain that assume the older auto-rewind interface.
315
+ if not isinstance(fp, KeyFile):
316
+ spos = fp.tell()
317
+ fp.seek(0, os.SEEK_END)
318
+ if fp.tell() == spos:
319
+ fp.seek(0, os.SEEK_SET)
320
+ if fp.tell() != spos:
321
+ # Raise an exception as this is likely a programming
322
+ # error whereby there is data before the fp but nothing
323
+ # after it.
324
+ fp.seek(spos)
325
+ raise AttributeError('fp is at EOF. Use rewind option '
326
+ 'or seek() to data start.')
327
+ # seek back to the correct position.
328
+ fp.seek(spos)
329
+
330
+ if hasattr(fp, 'name'):
331
+ self.path = fp.name
332
+ if self.bucket != None:
333
+ if isinstance(fp, KeyFile):
334
+ # Avoid EOF seek for KeyFile case as it's very inefficient.
335
+ key = fp.getkey()
336
+ size = key.size - fp.tell()
337
+ self.size = size
338
+ # At present both GCS and S3 use MD5 for the etag for
339
+ # non-multipart-uploaded objects. If the etag is 32 hex
340
+ # chars use it as an MD5, to avoid having to read the file
341
+ # twice while transferring.
342
+ if (re.match('^"[a-fA-F0-9]{32}"$', key.etag)):
343
+ etag = key.etag.strip('"')
344
+ md5 = (etag, base64.b64encode(binascii.unhexlify(etag)))
345
+ if size:
346
+ self.size = size
347
+ else:
348
+ # If md5 is provided, still need to size so
349
+ # calculate based on bytes to end of content
350
+ spos = fp.tell()
351
+ fp.seek(0, os.SEEK_END)
352
+ self.size = fp.tell() - spos
353
+ fp.seek(spos)
354
+ size = self.size
355
+
356
+ if md5 == None:
357
+ md5 = self.compute_md5(fp, size)
358
+ self.md5 = md5[0]
359
+ self.base64md5 = md5[1]
360
+
361
+ if self.name == None:
362
+ self.name = self.md5
363
+
364
+ if not replace:
365
+ if self.bucket.lookup(self.name):
366
+ return
367
+
368
+ if if_generation is not None:
369
+ headers['x-goog-if-generation-match'] = str(if_generation)
370
+
371
+ if res_upload_handler:
372
+ res_upload_handler.send_file(self, fp, headers, cb, num_cb)
373
+ else:
374
+ # Not a resumable transfer so use basic send_file mechanism.
375
+ self.send_file(fp, headers, cb, num_cb, size=size)
376
+
377
+ def set_contents_from_filename(self, filename, headers=None, replace=True,
378
+ cb=None, num_cb=10, policy=None, md5=None,
379
+ reduced_redundancy=None,
380
+ res_upload_handler=None,
381
+ if_generation=None):
382
+ """
383
+ Store an object in GS using the name of the Key object as the
384
+ key in GS and the contents of the file named by 'filename'.
385
+ See set_contents_from_file method for details about the
386
+ parameters.
387
+
388
+ :type filename: string
389
+ :param filename: The name of the file that you want to put onto GS
390
+
391
+ :type headers: dict
392
+ :param headers: Additional headers to pass along with the request to GS.
393
+
394
+ :type replace: bool
395
+ :param replace: If True, replaces the contents of the file if it
396
+ already exists.
397
+
398
+ :type cb: function
399
+ :param cb: (optional) a callback function that will be called to report
400
+ progress on the download. The callback should accept two integer
401
+ parameters, the first representing the number of bytes that have
402
+ been successfully transmitted from GS and the second representing
403
+ the total number of bytes that need to be transmitted.
404
+
405
+ :type cb: int
406
+ :param num_cb: (optional) If a callback is specified with the cb
407
+ parameter this parameter determines the granularity of the callback
408
+ by defining the maximum number of times the callback will be called
409
+ during the file transfer.
410
+
411
+ :type policy: :class:`boto.gs.acl.CannedACLStrings`
412
+ :param policy: A canned ACL policy that will be applied to the new key
413
+ in GS.
414
+
415
+ :type md5: A tuple containing the hexdigest version of the MD5 checksum
416
+ of the file as the first element and the Base64-encoded version of
417
+ the plain checksum as the second element. This is the same format
418
+ returned by the compute_md5 method.
419
+ :param md5: If you need to compute the MD5 for any reason prior to
420
+ upload, it's silly to have to do it twice so this param, if present,
421
+ will be used as the MD5 values of the file. Otherwise, the checksum
422
+ will be computed.
423
+
424
+ :type res_upload_handler: ResumableUploadHandler
425
+ :param res_upload_handler: If provided, this handler will perform the
426
+ upload.
427
+
428
+ :type if_generation: int
429
+ :param if_generation: (optional) If set to a generation number, the
430
+ object will only be written to if its current generation number is
431
+ this value. If set to the value 0, the object will only be written
432
+ if it doesn't already exist.
433
+ """
434
+ # Clear out any previously computed md5 hashes, since we are setting the content.
435
+ self.md5 = None
436
+ self.base64md5 = None
437
+
438
+ fp = open(filename, 'rb')
439
+ self.set_contents_from_file(fp, headers, replace, cb, num_cb,
440
+ policy, md5, res_upload_handler,
441
+ if_generation=if_generation)
442
+ fp.close()
443
+
444
+ def set_contents_from_string(self, s, headers=None, replace=True,
445
+ cb=None, num_cb=10, policy=None, md5=None,
446
+ if_generation=None):
447
+ """
448
+ Store an object in S3 using the name of the Key object as the
449
+ key in S3 and the string 's' as the contents.
450
+ See set_contents_from_file method for details about the
451
+ parameters.
452
+
453
+ :type headers: dict
454
+ :param headers: Additional headers to pass along with the
455
+ request to AWS.
456
+
457
+ :type replace: bool
458
+ :param replace: If True, replaces the contents of the file if
459
+ it already exists.
460
+
461
+ :type cb: function
462
+ :param cb: a callback function that will be called to report
463
+ progress on the upload. The callback should accept
464
+ two integer parameters, the first representing the
465
+ number of bytes that have been successfully
466
+ transmitted to S3 and the second representing the
467
+ size of the to be transmitted object.
468
+
469
+ :type cb: int
470
+ :param num_cb: (optional) If a callback is specified with
471
+ the cb parameter this parameter determines the
472
+ granularity of the callback by defining
473
+ the maximum number of times the callback will
474
+ be called during the file transfer.
475
+
476
+ :type policy: :class:`boto.s3.acl.CannedACLStrings`
477
+ :param policy: A canned ACL policy that will be applied to the
478
+ new key in S3.
479
+
480
+ :type md5: A tuple containing the hexdigest version of the MD5
481
+ checksum of the file as the first element and the
482
+ Base64-encoded version of the plain checksum as the
483
+ second element. This is the same format returned by
484
+ the compute_md5 method.
485
+ :param md5: If you need to compute the MD5 for any reason prior
486
+ to upload, it's silly to have to do it twice so this
487
+ param, if present, will be used as the MD5 values
488
+ of the file. Otherwise, the checksum will be computed.
489
+
490
+ :type if_generation: int
491
+ :param if_generation: (optional) If set to a generation number, the
492
+ object will only be written to if its current generation number is
493
+ this value. If set to the value 0, the object will only be written
494
+ if it doesn't already exist.
495
+ """
496
+
497
+ # Clear out any previously computed md5 hashes, since we are setting the content.
498
+ self.md5 = None
499
+ self.base64md5 = None
500
+
501
+ if isinstance(s, unicode):
502
+ s = s.encode("utf-8")
503
+ fp = StringIO.StringIO(s)
504
+ r = self.set_contents_from_file(fp, headers, replace, cb, num_cb,
505
+ policy, md5,
506
+ if_generation=if_generation)
507
+ fp.close()
508
+ return r
509
+
510
+ def set_contents_from_stream(self, *args, **kwargs):
511
+ """
512
+ Store an object using the name of the Key object as the key in
513
+ cloud and the contents of the data stream pointed to by 'fp' as
514
+ the contents.
515
+
516
+ The stream object is not seekable and total size is not known.
517
+ This has the implication that we can't specify the
518
+ Content-Size and Content-MD5 in the header. So for huge
519
+ uploads, the delay in calculating MD5 is avoided but with a
520
+ penalty of inability to verify the integrity of the uploaded
521
+ data.
522
+
523
+ :type fp: file
524
+ :param fp: the file whose contents are to be uploaded
525
+
526
+ :type headers: dict
527
+ :param headers: additional HTTP headers to be sent with the
528
+ PUT request.
529
+
530
+ :type replace: bool
531
+ :param replace: If this parameter is False, the method will first check
532
+ to see if an object exists in the bucket with the same key. If it
533
+ does, it won't overwrite it. The default value is True which will
534
+ overwrite the object.
535
+
536
+ :type cb: function
537
+ :param cb: a callback function that will be called to report
538
+ progress on the upload. The callback should accept two integer
539
+ parameters, the first representing the number of bytes that have
540
+ been successfully transmitted to GS and the second representing the
541
+ total number of bytes that need to be transmitted.
542
+
543
+ :type num_cb: int
544
+ :param num_cb: (optional) If a callback is specified with the
545
+ cb parameter, this parameter determines the granularity of
546
+ the callback by defining the maximum number of times the
547
+ callback will be called during the file transfer.
548
+
549
+ :type policy: :class:`boto.gs.acl.CannedACLStrings`
550
+ :param policy: A canned ACL policy that will be applied to the new key
551
+ in GS.
552
+
553
+ :type reduced_redundancy: bool
554
+ :param reduced_redundancy: If True, this will set the storage
555
+ class of the new Key to be REDUCED_REDUNDANCY. The Reduced
556
+ Redundancy Storage (RRS) feature of S3, provides lower
557
+ redundancy at lower storage cost.
558
+
559
+ :type size: int
560
+ :param size: (optional) The Maximum number of bytes to read from
561
+ the file pointer (fp). This is useful when uploading a
562
+ file in multiple parts where you are splitting the file up
563
+ into different ranges to be uploaded. If not specified,
564
+ the default behaviour is to read all bytes from the file
565
+ pointer. Less bytes may be available.
566
+
567
+ :type if_generation: int
568
+ :param if_generation: (optional) If set to a generation number, the
569
+ object will only be written to if its current generation number is
570
+ this value. If set to the value 0, the object will only be written
571
+ if it doesn't already exist.
572
+ """
573
+ if_generation = kwargs.pop('if_generation', None)
574
+ if if_generation is not None:
575
+ headers = kwargs.get('headers', {})
576
+ headers['x-goog-if-generation-match'] = str(if_generation)
577
+ kwargs['headers'] = headers
578
+ super(Key, self).set_contents_from_stream(*args, **kwargs)
579
+
580
+ def set_acl(self, acl_or_str, headers=None, generation=None,
581
+ if_generation=None, if_metageneration=None):
582
+ """Sets the ACL for this object.
583
+
584
+ :type acl_or_str: string or :class:`boto.gs.acl.ACL`
585
+ :param acl_or_str: A canned ACL string (see
586
+ :data:`~.gs.acl.CannedACLStrings`) or an ACL object.
587
+
588
+ :type headers: dict
589
+ :param headers: Additional headers to set during the request.
590
+
591
+ :type generation: int
592
+ :param generation: If specified, sets the ACL for a specific generation
593
+ of a versioned object. If not specified, the current version is
594
+ modified.
595
+
596
+ :type if_generation: int
597
+ :param if_generation: (optional) If set to a generation number, the acl
598
+ will only be updated if its current generation number is this value.
599
+
600
+ :type if_metageneration: int
601
+ :param if_metageneration: (optional) If set to a metageneration number,
602
+ the acl will only be updated if its current metageneration number is
603
+ this value.
604
+ """
605
+ if self.bucket != None:
606
+ self.bucket.set_acl(acl_or_str, self.name, headers=headers,
607
+ generation=generation,
608
+ if_generation=if_generation,
609
+ if_metageneration=if_metageneration)
610
+
611
+ def get_acl(self, headers=None, generation=None):
612
+ """Returns the ACL of this object.
613
+
614
+ :param dict headers: Additional headers to set during the request.
615
+
616
+ :param int generation: If specified, gets the ACL for a specific
617
+ generation of a versioned object. If not specified, the current
618
+ version is returned.
619
+
620
+ :rtype: :class:`.gs.acl.ACL`
621
+ """
622
+ if self.bucket != None:
623
+ return self.bucket.get_acl(self.name, headers=headers,
624
+ generation=generation)
625
+
626
+ def get_xml_acl(self, headers=None, generation=None):
627
+ """Returns the ACL string of this object.
628
+
629
+ :param dict headers: Additional headers to set during the request.
630
+
631
+ :param int generation: If specified, gets the ACL for a specific
632
+ generation of a versioned object. If not specified, the current
633
+ version is returned.
634
+
635
+ :rtype: str
636
+ """
637
+ if self.bucket != None:
638
+ return self.bucket.get_xml_acl(self.name, headers=headers,
639
+ generation=generation)
640
+
641
+ def set_xml_acl(self, acl_str, headers=None, generation=None,
642
+ if_generation=None, if_metageneration=None):
643
+ """Sets this objects's ACL to an XML string.
644
+
645
+ :type acl_str: string
646
+ :param acl_str: A string containing the ACL XML.
647
+
648
+ :type headers: dict
649
+ :param headers: Additional headers to set during the request.
650
+
651
+ :type generation: int
652
+ :param generation: If specified, sets the ACL for a specific generation
653
+ of a versioned object. If not specified, the current version is
654
+ modified.
655
+
656
+ :type if_generation: int
657
+ :param if_generation: (optional) If set to a generation number, the acl
658
+ will only be updated if its current generation number is this value.
659
+
660
+ :type if_metageneration: int
661
+ :param if_metageneration: (optional) If set to a metageneration number,
662
+ the acl will only be updated if its current metageneration number is
663
+ this value.
664
+ """
665
+ if self.bucket != None:
666
+ return self.bucket.set_xml_acl(acl_str, self.name, headers=headers,
667
+ generation=generation,
668
+ if_generation=if_generation,
669
+ if_metageneration=if_metageneration)
670
+
671
+ def set_canned_acl(self, acl_str, headers=None, generation=None,
672
+ if_generation=None, if_metageneration=None):
673
+ """Sets this objects's ACL using a predefined (canned) value.
674
+
675
+ :type acl_str: string
676
+ :param acl_str: A canned ACL string. See
677
+ :data:`~.gs.acl.CannedACLStrings`.
678
+
679
+ :type headers: dict
680
+ :param headers: Additional headers to set during the request.
681
+
682
+ :type generation: int
683
+ :param generation: If specified, sets the ACL for a specific generation
684
+ of a versioned object. If not specified, the current version is
685
+ modified.
686
+
687
+ :type if_generation: int
688
+ :param if_generation: (optional) If set to a generation number, the acl
689
+ will only be updated if its current generation number is this value.
690
+
691
+ :type if_metageneration: int
692
+ :param if_metageneration: (optional) If set to a metageneration number,
693
+ the acl will only be updated if its current metageneration number is
694
+ this value.
695
+ """
696
+ if self.bucket != None:
697
+ return self.bucket.set_canned_acl(
698
+ acl_str,
699
+ self.name,
700
+ headers=headers,
701
+ generation=generation,
702
+ if_generation=if_generation,
703
+ if_metageneration=if_metageneration
704
+ )