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,722 @@
1
+ # Copyright 2010 Google Inc. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ """Base class for gsutil commands.
16
+
17
+ In addition to base class code, this file contains helpers that depend on base
18
+ class state (such as GetAclCommandHelper, which depends on self.gsutil_bin_dir,
19
+ self.bucket_storage_uri_class, etc.) In general, functions that depend on class
20
+ state and that are used by multiple commands belong in this file. Functions that
21
+ don't depend on class state belong in util.py, and non-shared helpers belong in
22
+ individual subclasses.
23
+ """
24
+
25
+ import boto
26
+ import getopt
27
+ import gslib
28
+ import logging
29
+ import multiprocessing
30
+ import os
31
+ import platform
32
+ import re
33
+ import sys
34
+ import wildcard_iterator
35
+ import xml.dom.minidom
36
+
37
+ from boto import handler
38
+ from boto.storage_uri import StorageUri
39
+ from getopt import GetoptError
40
+ from gslib import util
41
+ from gslib.exception import CommandException
42
+ from gslib.help_provider import HelpProvider
43
+ from gslib.name_expansion import NameExpansionIterator
44
+ from gslib.name_expansion import NameExpansionIteratorQueue
45
+ from gslib.project_id import ProjectIdHandler
46
+ from gslib.storage_uri_builder import StorageUriBuilder
47
+ from gslib.thread_pool import ThreadPool
48
+ from gslib.util import HAVE_OAUTH2
49
+ from gslib.util import NO_MAX
50
+
51
+ from gslib.wildcard_iterator import ContainsWildcard
52
+
53
+
54
+ def _ThreadedLogger():
55
+ """Creates a logger that resembles 'print' output, but is thread safe.
56
+
57
+ The logger will display all messages logged with level INFO or above. Log
58
+ propagation is disabled.
59
+
60
+ Returns:
61
+ A logger object.
62
+ """
63
+ log = logging.getLogger('threaded-logging')
64
+ log.propagate = False
65
+ log.setLevel(logging.INFO)
66
+ log_handler = logging.StreamHandler()
67
+ log_handler.setFormatter(logging.Formatter('%(message)s'))
68
+ log.addHandler(log_handler)
69
+ return log
70
+
71
+ # command_spec key constants.
72
+ COMMAND_NAME = 'command_name'
73
+ COMMAND_NAME_ALIASES = 'command_name_aliases'
74
+ MIN_ARGS = 'min_args'
75
+ MAX_ARGS = 'max_args'
76
+ SUPPORTED_SUB_ARGS = 'supported_sub_args'
77
+ FILE_URIS_OK = 'file_uri_ok'
78
+ PROVIDER_URIS_OK = 'provider_uri_ok'
79
+ URIS_START_ARG = 'uris_start_arg'
80
+ CONFIG_REQUIRED = 'config_required'
81
+
82
+ _EOF_NAME_EXPANSION_RESULT = ("EOF")
83
+
84
+
85
+ class Command(object):
86
+ # Global instance of a threaded logger object.
87
+ THREADED_LOGGER = _ThreadedLogger()
88
+
89
+ REQUIRED_SPEC_KEYS = [COMMAND_NAME]
90
+
91
+ # Each subclass must define the following map, minimally including the
92
+ # keys in REQUIRED_SPEC_KEYS; other values below will be used as defaults,
93
+ # although for readbility subclasses should specify the complete map.
94
+ command_spec = {
95
+ # Name of command.
96
+ COMMAND_NAME : None,
97
+ # List of command name aliases.
98
+ COMMAND_NAME_ALIASES : [],
99
+ # Min number of args required by this command.
100
+ MIN_ARGS : 0,
101
+ # Max number of args required by this command, or NO_MAX.
102
+ MAX_ARGS : NO_MAX,
103
+ # Getopt-style string specifying acceptable sub args.
104
+ SUPPORTED_SUB_ARGS : '',
105
+ # True if file URIs are acceptable for this command.
106
+ FILE_URIS_OK : False,
107
+ # True if provider-only URIs are acceptable for this command.
108
+ PROVIDER_URIS_OK : False,
109
+ # Index in args of first URI arg.
110
+ URIS_START_ARG : 0,
111
+ # True if must configure gsutil before running command.
112
+ CONFIG_REQUIRED : True,
113
+ }
114
+ _default_command_spec = command_spec
115
+ help_spec = HelpProvider.help_spec
116
+
117
+ """Define an empty test specification, which derived classes must populate.
118
+
119
+ This is a list of tuples containing the following values:
120
+
121
+ step_name - mnemonic name for test, displayed when test is run
122
+ cmd_line - shell command line to run test
123
+ expect_ret or None - expected return code from test (None means ignore)
124
+ (result_file, expect_file) or None - tuple of result file and expected
125
+ file to diff for additional test
126
+ verification beyond the return code
127
+ (None means no diff requested)
128
+ Notes:
129
+
130
+ - Setting expected_ret to None means there is no expectation and,
131
+ hence, any returned value will pass.
132
+
133
+ - Any occurrences of the string 'gsutil' in the cmd_line parameter
134
+ are expanded to the full path to the gsutil command under test.
135
+
136
+ - The cmd_line, result_file and expect_file parameters may
137
+ contain the following special substrings:
138
+
139
+ $Bn - converted to one of 10 unique-for-testing bucket names (n=0..9)
140
+ $On - converted to one of 10 unique-for-testing object names (n=0..9)
141
+ $Fn - converted to one of 10 unique-for-testing file names (n=0..9)
142
+ $G - converted to the directory where gsutil is installed. Useful for
143
+ referencing test data.
144
+
145
+ - The generated file names are full pathnames, whereas the generated
146
+ bucket and object names are simple relative names.
147
+
148
+ - Tests with a non-None result_file and expect_file automatically
149
+ trigger an implicit diff of the two files.
150
+
151
+ - These test specifications, in combination with the conversion strings
152
+ allow tests to be constructed parametrically. For example, here's an
153
+ annotated subset of a test_steps for the cp command:
154
+
155
+ # Copy local file to object, verify 0 return code.
156
+ ('simple cp', 'gsutil cp $F1 gs://$B1/$O1', 0, None, None),
157
+ # Copy uploaded object back to local file and diff vs. orig file.
158
+ ('verify cp', 'gsutil cp gs://$B1/$O1 $F2', 0, '$F2', '$F1'),
159
+
160
+ - After pattern substitution, the specs are run sequentially, in the
161
+ order in which they appear in the test_steps list.
162
+ """
163
+ test_steps = []
164
+
165
+ # Define a convenience property for command name, since it's used many places.
166
+ def _GetDefaultCommandName(self):
167
+ return self.command_spec[COMMAND_NAME]
168
+ command_name = property(_GetDefaultCommandName)
169
+
170
+ def __init__(self, command_runner, args, headers, debug, parallel_operations,
171
+ gsutil_bin_dir, boto_lib_dir, config_file_list, gsutil_ver,
172
+ bucket_storage_uri_class, test_method=None):
173
+ """
174
+ Args:
175
+ command_runner: CommandRunner (for commands built atop other commands).
176
+ args: Command-line args (arg0 = actual arg, not command name ala bash).
177
+ headers: Dictionary containing optional HTTP headers to pass to boto.
178
+ debug: Debug level to pass in to boto connection (range 0..3).
179
+ parallel_operations: Should command operations be executed in parallel?
180
+ gsutil_bin_dir: Bin dir from which gsutil is running.
181
+ boto_lib_dir: Lib dir where boto runs.
182
+ config_file_list: Config file list returned by _GetBotoConfigFileList().
183
+ gsutil_ver: Version string of currently running gsutil command.
184
+ bucket_storage_uri_class: Class to instantiate for cloud StorageUris.
185
+ Settable for testing/mocking.
186
+ test_method: Optional general purpose method for testing purposes.
187
+ Application and semantics of this method will vary by
188
+ command and test type.
189
+
190
+ Implementation note: subclasses shouldn't need to define an __init__
191
+ method, and instead depend on the shared initialization that happens
192
+ here. If you do define an __init__ method in a subclass you'll need to
193
+ explicitly call super().__init__(). But you're encouraged not to do this,
194
+ because it will make changing the __init__ interface more painful.
195
+ """
196
+ # Save class values from constructor params.
197
+ self.command_runner = command_runner
198
+ self.args = args
199
+ self.unparsed_args = args
200
+ self.headers = headers
201
+ self.debug = debug
202
+ self.parallel_operations = parallel_operations
203
+ self.gsutil_bin_dir = gsutil_bin_dir
204
+ self.boto_lib_dir = boto_lib_dir
205
+ self.config_file_list = config_file_list
206
+ self.gsutil_ver = gsutil_ver
207
+ self.bucket_storage_uri_class = bucket_storage_uri_class
208
+ self.test_method = test_method
209
+ self.exclude_symlinks = False
210
+ self.recursion_requested = False
211
+ self.all_versions = False
212
+
213
+ # Process sub-command instance specifications.
214
+ # First, ensure subclass implementation sets all required keys.
215
+ for k in self.REQUIRED_SPEC_KEYS:
216
+ if k not in self.command_spec or self.command_spec[k] is None:
217
+ raise CommandException('"%s" command implementation is missing %s '
218
+ 'specification' % (self.command_name, k))
219
+ # Now override default command_spec with subclass-specified values.
220
+ tmp = self._default_command_spec
221
+ tmp.update(self.command_spec)
222
+ self.command_spec = tmp
223
+ del tmp
224
+
225
+ # Make sure command provides a test specification.
226
+ if not self.test_steps:
227
+ # TODO: Uncomment following lines when test feature is ready.
228
+ #raise CommandException('"%s" command implementation is missing test '
229
+ #'specification' % self.command_name)
230
+ pass
231
+
232
+ # Parse and validate args.
233
+ try:
234
+ (self.sub_opts, self.args) = getopt.getopt(
235
+ args, self.command_spec[SUPPORTED_SUB_ARGS])
236
+ except GetoptError, e:
237
+ raise CommandException('%s for "%s" command.' % (e.msg,
238
+ self.command_name))
239
+ if (len(self.args) < self.command_spec[MIN_ARGS]
240
+ or len(self.args) > self.command_spec[MAX_ARGS]):
241
+ raise CommandException('Wrong number of arguments for "%s" command.' %
242
+ self.command_name)
243
+ if (not self.command_spec[FILE_URIS_OK]
244
+ and self.HaveFileUris(self.args[self.command_spec[URIS_START_ARG]:])):
245
+ raise CommandException('"%s" command does not support "file://" URIs. '
246
+ 'Did you mean to use a gs:// URI?' %
247
+ self.command_name)
248
+ if (not self.command_spec[PROVIDER_URIS_OK]
249
+ and self._HaveProviderUris(
250
+ self.args[self.command_spec[URIS_START_ARG]:])):
251
+ raise CommandException('"%s" command does not support provider-only '
252
+ 'URIs.' % self.command_name)
253
+ if self.command_spec[CONFIG_REQUIRED]:
254
+ self._ConfigureNoOpAuthIfNeeded()
255
+
256
+ self.proj_id_handler = ProjectIdHandler()
257
+ self.suri_builder = StorageUriBuilder(debug, bucket_storage_uri_class)
258
+
259
+ # Cross-platform path to run gsutil binary.
260
+ self.gsutil_cmd = ''
261
+ # Cross-platform list containing gsutil path for use with subprocess.
262
+ self.gsutil_exec_list = []
263
+ # If running on Windows, invoke python interpreter explicitly.
264
+ if platform.system() == "Windows":
265
+ self.gsutil_cmd += 'python '
266
+ self.gsutil_exec_list += ['python']
267
+ # Add full path to gsutil to make sure we test the correct version.
268
+ self.gsutil_path = os.path.join(self.gsutil_bin_dir, 'gsutil')
269
+ self.gsutil_cmd += self.gsutil_path
270
+ self.gsutil_exec_list += [self.gsutil_path]
271
+
272
+ # We're treating recursion_requested like it's used by all commands, but
273
+ # only some of the commands accept the -R option.
274
+ if self.sub_opts:
275
+ for o, unused_a in self.sub_opts:
276
+ if o == '-r' or o == '-R':
277
+ self.recursion_requested = True
278
+ break
279
+
280
+ def WildcardIterator(self, uri_or_str, all_versions=False):
281
+ """
282
+ Helper to instantiate gslib.WildcardIterator. Args are same as
283
+ gslib.WildcardIterator interface, but this method fills in most of the
284
+ values from instance state.
285
+
286
+ Args:
287
+ uri_or_str: StorageUri or URI string naming wildcard objects to iterate.
288
+ """
289
+ return wildcard_iterator.wildcard_iterator(
290
+ uri_or_str, self.proj_id_handler,
291
+ bucket_storage_uri_class=self.bucket_storage_uri_class,
292
+ all_versions=all_versions,
293
+ headers=self.headers, debug=self.debug)
294
+
295
+ def RunCommand(self):
296
+ """Abstract function in base class. Subclasses must implement this. The
297
+ return value of this function will be used as the exit status of the
298
+ process, so subclass commands should return an integer exit code (0 for
299
+ success, a value in [1,255] for failure).
300
+ """
301
+ raise CommandException('Command %s is missing its RunCommand() '
302
+ 'implementation' % self.command_name)
303
+
304
+ ############################################################
305
+ # Shared helper functions that depend on base class state. #
306
+ ############################################################
307
+
308
+ def UrisAreForSingleProvider(self, uri_args):
309
+ """Tests whether the uris are all for a single provider.
310
+
311
+ Returns: a StorageUri for one of the uris on success, None on failure.
312
+ """
313
+ provider = None
314
+ uri = None
315
+ for uri_str in uri_args:
316
+ # validate=False because we allow wildcard uris.
317
+ uri = boto.storage_uri(
318
+ uri_str, debug=self.debug, validate=False,
319
+ bucket_storage_uri_class=self.bucket_storage_uri_class)
320
+ if not provider:
321
+ provider = uri.scheme
322
+ elif uri.scheme != provider:
323
+ return None
324
+ return uri
325
+
326
+ def SetAclCommandHelper(self):
327
+ """
328
+ Common logic for setting ACLs. Sets the standard ACL or the default
329
+ object ACL depending on self.command_name.
330
+ """
331
+
332
+ acl_arg = self.args[0]
333
+ uri_args = self.args[1:]
334
+ # Disallow multi-provider setacl requests, because there are differences in
335
+ # the ACL models.
336
+ storage_uri = self.UrisAreForSingleProvider(uri_args)
337
+ if not storage_uri:
338
+ raise CommandException('"%s" command spanning providers not allowed.' %
339
+ self.command_name)
340
+
341
+ # Determine whether acl_arg names a file containing XML ACL text vs. the
342
+ # string name of a canned ACL.
343
+ if os.path.isfile(acl_arg):
344
+ acl_file = open(acl_arg, 'r')
345
+ acl_arg = acl_file.read()
346
+
347
+ # TODO: Remove this workaround when GCS allows
348
+ # whitespace in the Permission element on the server-side
349
+ acl_arg = re.sub(r'<Permission>\s*(\S+)\s*</Permission>',
350
+ r'<Permission>\1</Permission>', acl_arg)
351
+
352
+ acl_file.close()
353
+ self.canned = False
354
+ else:
355
+ # No file exists, so expect a canned ACL string.
356
+ canned_acls = storage_uri.canned_acls()
357
+ if acl_arg not in canned_acls:
358
+ raise CommandException('Invalid canned ACL "%s".' % acl_arg)
359
+ self.canned = True
360
+
361
+ # Used to track if any ACLs failed to be set.
362
+ self.everything_set_okay = True
363
+
364
+ def _SetAclExceptionHandler(e):
365
+ """Simple exception handler to allow post-completion status."""
366
+ self.THREADED_LOGGER.error(str(e))
367
+ self.everything_set_okay = False
368
+
369
+ def _SetAclFunc(name_expansion_result):
370
+ exp_src_uri = self.suri_builder.StorageUri(
371
+ name_expansion_result.GetExpandedUriStr())
372
+ # We don't do bucket operations multi-threaded (see comment below).
373
+ assert self.command_name != 'setdefacl'
374
+ self.THREADED_LOGGER.info('Setting ACL on %s...' %
375
+ name_expansion_result.expanded_uri_str)
376
+ if self.canned:
377
+ exp_src_uri.set_acl(acl_arg, exp_src_uri.object_name, False,
378
+ self.headers)
379
+ else:
380
+ exp_src_uri.set_xml_acl(acl_arg, exp_src_uri.object_name, False,
381
+ self.headers)
382
+
383
+ # If user specified -R option, convert any bucket args to bucket wildcards
384
+ # (e.g., gs://bucket/*), to prevent the operation from being applied to
385
+ # the buckets themselves.
386
+ if self.recursion_requested:
387
+ for i in range(len(uri_args)):
388
+ uri = self.suri_builder.StorageUri(uri_args[i])
389
+ if uri.names_bucket():
390
+ uri_args[i] = uri.clone_replace_name('*').uri
391
+ else:
392
+ # Handle bucket ACL setting operations single-threaded, because
393
+ # our threading machinery currently assumes it's working with objects
394
+ # (name_expansion_iterator), and normally we wouldn't expect users to need
395
+ # to set ACLs on huge numbers of buckets at once anyway.
396
+ for i in range(len(uri_args)):
397
+ uri_str = uri_args[i]
398
+ if self.suri_builder.StorageUri(uri_str).names_bucket():
399
+ self._RunSingleThreadedSetAcl(acl_arg, uri_args)
400
+ return
401
+
402
+ name_expansion_iterator = NameExpansionIterator(
403
+ self.command_name, self.proj_id_handler, self.headers, self.debug,
404
+ self.bucket_storage_uri_class, uri_args, self.recursion_requested,
405
+ self.recursion_requested, all_versions=self.all_versions)
406
+
407
+ # Perform requests in parallel (-m) mode, if requested, using
408
+ # configured number of parallel processes and threads. Otherwise,
409
+ # perform requests with sequential function calls in current process.
410
+ self.Apply(_SetAclFunc, name_expansion_iterator, _SetAclExceptionHandler)
411
+
412
+ if not self.everything_set_okay:
413
+ raise CommandException('ACLs for some objects could not be set.')
414
+
415
+ def _RunSingleThreadedSetAcl(self, acl_arg, uri_args):
416
+ some_matched = False
417
+ for uri_str in uri_args:
418
+ for blr in self.WildcardIterator(uri_str):
419
+ if blr.HasPrefix():
420
+ continue
421
+ some_matched = True
422
+ uri = blr.GetUri()
423
+ if self.command_name == 'setdefacl':
424
+ print 'Setting default object ACL on %s...' % uri
425
+ if self.canned:
426
+ uri.set_def_acl(acl_arg, uri.object_name, False, self.headers)
427
+ else:
428
+ uri.set_def_xml_acl(acl_arg, False, self.headers)
429
+ else:
430
+ print 'Setting ACL on %s...' % uri
431
+ if self.canned:
432
+ uri.set_acl(acl_arg, uri.object_name, False, self.headers)
433
+ else:
434
+ uri.set_xml_acl(acl_arg, uri.object_name, False, self.headers)
435
+ if not some_matched:
436
+ raise CommandException('No URIs matched')
437
+
438
+ def GetAclCommandHelper(self):
439
+ """Common logic for getting ACLs. Gets the standard ACL or the default
440
+ object ACL depending on self.command_name."""
441
+
442
+ # Resolve to just one object.
443
+ # Handle wildcard-less URI specially in case this is a version-specific
444
+ # URI, because WildcardIterator().IterUris() would lose the versioning info.
445
+ if not ContainsWildcard(self.args[0]):
446
+ uri = self.suri_builder.StorageUri(self.args[0])
447
+ else:
448
+ uris = list(self.WildcardIterator(self.args[0]).IterUris())
449
+ if len(uris) == 0:
450
+ raise CommandException('No URIs matched')
451
+ if len(uris) != 1:
452
+ raise CommandException('%s matched more than one URI, which is not '
453
+ 'allowed by the %s command' % (self.args[0], self.command_name))
454
+ uri = uris[0]
455
+ if not uri.names_bucket() and not uri.names_object():
456
+ raise CommandException('"%s" command must specify a bucket or '
457
+ 'object.' % self.command_name)
458
+ if self.command_name == 'getdefacl':
459
+ acl = uri.get_def_acl(False, self.headers)
460
+ else:
461
+ acl = uri.get_acl(False, self.headers)
462
+ # Pretty-print the XML to make it more easily human editable.
463
+ parsed_xml = xml.dom.minidom.parseString(acl.to_xml().encode('utf-8'))
464
+ print parsed_xml.toprettyxml(indent=' ')
465
+
466
+ def GetXmlSubresource(self, subresource, uri_arg):
467
+ """Print an xml subresource, e.g. logging, for a bucket/object.
468
+
469
+ Args:
470
+ subresource: The subresource name.
471
+ uri_arg: URI for the bucket/object. Wildcards will be expanded.
472
+
473
+ Raises:
474
+ CommandException: if errors encountered.
475
+ """
476
+ # Wildcarding is allowed but must resolve to just one bucket.
477
+ uris = list(self.WildcardIterator(uri_arg).IterUris())
478
+ if len(uris) != 1:
479
+ raise CommandException('Wildcards must resolve to exactly one item for '
480
+ 'get %s' % subresource)
481
+ uri = uris[0]
482
+ xml_str = uri.get_subresource(subresource, False, self.headers)
483
+ # Pretty-print the XML to make it more easily human editable.
484
+ parsed_xml = xml.dom.minidom.parseString(xml_str.encode('utf-8'))
485
+ print parsed_xml.toprettyxml(indent=' ')
486
+
487
+ def Apply(self, func, name_expansion_iterator, thr_exc_handler,
488
+ shared_attrs=None):
489
+ """Dispatch input URI assignments across a pool of parallel OS
490
+ processes and/or Python threads, based on options (-m or not)
491
+ and settings in the user's config file. If non-parallel mode
492
+ or only one OS process requested, execute requests sequentially
493
+ in the current OS process.
494
+
495
+ Args:
496
+ func: Function to call to process each URI.
497
+ name_expansion_iterator: Iterator of NameExpansionResult.
498
+ thr_exc_handler: Exception handler for ThreadPool class.
499
+ shared_attrs: List of attributes to manage across sub-processes.
500
+
501
+ Raises:
502
+ CommandException if invalid config encountered.
503
+ """
504
+
505
+ # Set OS process and python thread count as a function of options
506
+ # and config.
507
+ if self.parallel_operations:
508
+ process_count = boto.config.getint(
509
+ 'GSUtil', 'parallel_process_count',
510
+ gslib.commands.config.DEFAULT_PARALLEL_PROCESS_COUNT)
511
+ if process_count < 1:
512
+ raise CommandException('Invalid parallel_process_count "%d".' %
513
+ process_count)
514
+ thread_count = boto.config.getint(
515
+ 'GSUtil', 'parallel_thread_count',
516
+ gslib.commands.config.DEFAULT_PARALLEL_THREAD_COUNT)
517
+ if thread_count < 1:
518
+ raise CommandException('Invalid parallel_thread_count "%d".' %
519
+ thread_count)
520
+ else:
521
+ # If -m not specified, then assume 1 OS process and 1 Python thread.
522
+ process_count = 1
523
+ thread_count = 1
524
+
525
+ if self.debug:
526
+ self.THREADED_LOGGER.info('process count: %d', process_count)
527
+ self.THREADED_LOGGER.info('thread count: %d', thread_count)
528
+
529
+ if self.parallel_operations and process_count > 1:
530
+ procs = []
531
+ # If any shared attributes passed by caller, create a dictionary of
532
+ # shared memory variables for every element in the list of shared
533
+ # attributes.
534
+ shared_vars = None
535
+ if shared_attrs:
536
+ for name in shared_attrs:
537
+ if not shared_vars:
538
+ shared_vars = {}
539
+ shared_vars[name] = multiprocessing.Value('i', 0)
540
+ # Construct work queue for parceling out work to multiprocessing workers,
541
+ # setting the max queue length of 50k so we will block if workers don't
542
+ # empty the queue as fast as we can continue iterating over the bucket
543
+ # listing. This number may need tuning; it should be large enough to
544
+ # keep workers busy (overlapping bucket list next-page retrieval with
545
+ # operations being fed from the queue) but small enough that we don't
546
+ # overfill memory when runing across a slow network link.
547
+ work_queue = multiprocessing.Queue(50000)
548
+ for shard in range(process_count):
549
+ # Spawn a separate OS process for each shard.
550
+ if self.debug:
551
+ self.THREADED_LOGGER.info('spawning process for shard %d', shard)
552
+ p = multiprocessing.Process(target=self._ApplyThreads,
553
+ args=(func, work_queue, shard,
554
+ thread_count, thr_exc_handler,
555
+ shared_vars))
556
+ procs.append(p)
557
+ p.start()
558
+
559
+ last_name_expansion_result = None
560
+ try:
561
+ # Feed all work into the queue being emptied by the workers.
562
+ for name_expansion_result in name_expansion_iterator:
563
+ last_name_expansion_result = name_expansion_result
564
+ work_queue.put(name_expansion_result)
565
+ except:
566
+ sys.stderr.write('Failed URI iteration. Last result (prior to '
567
+ 'exception) was: %s\n'
568
+ % repr(last_name_expansion_result))
569
+ finally:
570
+ # We do all of the process cleanup in a finally cause in case the name
571
+ # expansion iterator throws an exception. This will send EOF to all the
572
+ # child processes and join them back into the parent process.
573
+
574
+ # Send an EOF per worker.
575
+ for shard in range(process_count):
576
+ work_queue.put(_EOF_NAME_EXPANSION_RESULT)
577
+
578
+ # Wait for all spawned OS processes to finish.
579
+ failed_process_count = 0
580
+ for p in procs:
581
+ p.join()
582
+ # Count number of procs that returned non-zero exit code.
583
+ if p.exitcode != 0:
584
+ failed_process_count += 1
585
+
586
+ # Propagate shared variables back to caller's attributes.
587
+ if shared_vars:
588
+ for (name, var) in shared_vars.items():
589
+ setattr(self, name, var.value)
590
+
591
+ # Abort main process if one or more sub-processes failed. Note that this
592
+ # is outside the finally clause, because we only want to raise a new
593
+ # exception if an exception wasn't already raised in the try clause above.
594
+ if failed_process_count:
595
+ plural_str = ''
596
+ if failed_process_count > 1:
597
+ plural_str = 'es'
598
+ raise Exception('unexpected failure in %d sub-process%s, '
599
+ 'aborting...' % (failed_process_count, plural_str))
600
+
601
+ else:
602
+ # Using just 1 process, so funnel results to _ApplyThreads using facade
603
+ # that makes NameExpansionIterator look like a Multiprocessing.Queue
604
+ # that sends one EOF once the iterator empties.
605
+ work_queue = NameExpansionIteratorQueue(name_expansion_iterator,
606
+ _EOF_NAME_EXPANSION_RESULT)
607
+ self._ApplyThreads(func, work_queue, 0, thread_count, thr_exc_handler,
608
+ None)
609
+
610
+ def HaveFileUris(self, args_to_check):
611
+ """Checks whether args_to_check contain any file URIs.
612
+
613
+ Args:
614
+ args_to_check: Command-line argument subset to check.
615
+
616
+ Returns:
617
+ True if args_to_check contains any file URIs.
618
+ """
619
+ for uri_str in args_to_check:
620
+ if uri_str.lower().startswith('file://') or uri_str.find(':') == -1:
621
+ return True
622
+ return False
623
+
624
+ ######################
625
+ # Private functions. #
626
+ ######################
627
+
628
+ def _HaveProviderUris(self, args_to_check):
629
+ """Checks whether args_to_check contains any provider URIs (like 'gs://').
630
+
631
+ Args:
632
+ args_to_check: Command-line argument subset to check.
633
+
634
+ Returns:
635
+ True if args_to_check contains any provider URIs.
636
+ """
637
+ for uri_str in args_to_check:
638
+ if re.match('^[a-z]+://$', uri_str):
639
+ return True
640
+ return False
641
+
642
+ def _ConfigureNoOpAuthIfNeeded(self):
643
+ """Sets up no-op auth handler if no boto credentials are configured."""
644
+ config = boto.config
645
+ if not util.HasConfiguredCredentials():
646
+ if self.config_file_list:
647
+ if (config.has_option('Credentials', 'gs_oauth2_refresh_token')
648
+ and not HAVE_OAUTH2):
649
+ raise CommandException(
650
+ 'Your gsutil is configured with OAuth2 authentication '
651
+ 'credentials.\nHowever, OAuth2 is only supported when running '
652
+ 'under Python 2.6 or later\n(unless additional dependencies are '
653
+ 'installed, see README for details); you are running Python %s.' %
654
+ sys.version)
655
+ raise CommandException('You have no storage service credentials in any '
656
+ 'of the following boto config\nfiles. Please '
657
+ 'add your credentials as described in the '
658
+ 'gsutil README file, or else\nre-run '
659
+ '"gsutil config" to re-create a config '
660
+ 'file:\n%s' % self.config_file_list)
661
+ else:
662
+ # With no boto config file the user can still access publicly readable
663
+ # buckets and objects.
664
+ from gslib import no_op_auth_plugin
665
+
666
+ def _ApplyThreads(self, func, work_queue, shard, num_threads,
667
+ thr_exc_handler=None, shared_vars=None):
668
+ """
669
+ Perform subset of required requests across a caller specified
670
+ number of parallel Python threads, which may be one, in which
671
+ case the requests are processed in the current thread.
672
+
673
+ Args:
674
+ func: Function to call for each request.
675
+ work_queue: shared queue of NameExpansionResult to process.
676
+ shard: Assigned subset (shard number) for this function.
677
+ num_threads: Number of Python threads to spawn to process this shard.
678
+ thr_exc_handler: Exception handler for ThreadPool class.
679
+ shared_vars: Dict of shared memory variables to be managed.
680
+ (only relevant, and non-None, if this function is
681
+ run in a separate OS process).
682
+ """
683
+ # Each OS process needs to establish its own set of connections to
684
+ # the server to avoid writes from different OS processes interleaving
685
+ # onto the same socket (and garbling the underlying SSL session).
686
+ # We ensure each process gets its own set of connections here by
687
+ # closing all connections in the storage provider connection pool.
688
+ connection_pool = StorageUri.provider_pool
689
+ if connection_pool:
690
+ for i in connection_pool:
691
+ connection_pool[i].connection.close()
692
+
693
+ if num_threads > 1:
694
+ thread_pool = ThreadPool(num_threads, thr_exc_handler)
695
+ try:
696
+ while True: # Loop until we hit EOF marker.
697
+ name_expansion_result = work_queue.get()
698
+ if name_expansion_result == _EOF_NAME_EXPANSION_RESULT:
699
+ break
700
+ exp_src_uri = self.suri_builder.StorageUri(
701
+ name_expansion_result.GetExpandedUriStr())
702
+ if self.debug:
703
+ self.THREADED_LOGGER.info('process %d shard %d is handling uri %s',
704
+ os.getpid(), shard, exp_src_uri)
705
+ if (self.exclude_symlinks and exp_src_uri.is_file_uri()
706
+ and os.path.islink(exp_src_uri.object_name)):
707
+ self.THREADED_LOGGER.info('Skipping symbolic link %s...', exp_src_uri)
708
+ elif num_threads > 1:
709
+ thread_pool.AddTask(func, name_expansion_result)
710
+ else:
711
+ func(name_expansion_result)
712
+ # If any Python threads created, wait here for them to finish.
713
+ if num_threads > 1:
714
+ thread_pool.WaitCompletion()
715
+ finally:
716
+ if num_threads > 1:
717
+ thread_pool.Shutdown()
718
+ # If any shared variables (which means we are running in a separate OS
719
+ # process), increment value for each shared variable.
720
+ if shared_vars:
721
+ for (name, var) in shared_vars.items():
722
+ var.value += getattr(self, name)