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.
- data.tar.gz.sig +0 -0
- data/CHANGELOG +4 -0
- data/Makefile +4 -0
- data/Manifest +760 -1
- data/bin/gcloud +7 -0
- data/bin/{gcutil → gcutil.symlink} +0 -0
- data/bin/gsutil-symlink +377 -0
- data/gcloud.gemspec +5 -5
- data/packages/gsutil/CHECKSUM +1 -0
- data/packages/gsutil/COPYING +202 -0
- data/packages/gsutil/LICENSE.third_party +295 -0
- data/packages/gsutil/MANIFEST.in +5 -0
- data/packages/gsutil/README +38 -0
- data/packages/gsutil/README.pkg +49 -0
- data/packages/gsutil/ReleaseNotes.txt +780 -0
- data/packages/gsutil/VERSION +1 -0
- data/packages/gsutil/boto/Changelog.rst +35 -0
- data/packages/gsutil/boto/LICENSE +18 -0
- data/packages/gsutil/boto/MANIFEST.in +12 -0
- data/packages/gsutil/boto/README.rst +163 -0
- data/packages/gsutil/boto/bin/asadmin +290 -0
- data/packages/gsutil/boto/bin/bundle_image +27 -0
- data/packages/gsutil/boto/bin/cfadmin +108 -0
- data/packages/gsutil/boto/bin/cq +89 -0
- data/packages/gsutil/boto/bin/cwutil +140 -0
- data/packages/gsutil/boto/bin/elbadmin +284 -0
- data/packages/gsutil/boto/bin/fetch_file +43 -0
- data/packages/gsutil/boto/bin/glacier +154 -0
- data/packages/gsutil/boto/bin/instance_events +145 -0
- data/packages/gsutil/boto/bin/kill_instance +35 -0
- data/packages/gsutil/boto/bin/launch_instance +252 -0
- data/packages/gsutil/boto/bin/list_instances +90 -0
- data/packages/gsutil/boto/bin/lss3 +77 -0
- data/packages/gsutil/boto/bin/mturk +465 -0
- data/packages/gsutil/boto/bin/pyami_sendmail +52 -0
- data/packages/gsutil/boto/bin/route53 +205 -0
- data/packages/gsutil/boto/bin/s3put +374 -0
- data/packages/gsutil/boto/bin/sdbadmin +194 -0
- data/packages/gsutil/boto/bin/taskadmin +116 -0
- data/packages/gsutil/boto/boto/__init__.py +793 -0
- data/packages/gsutil/boto/boto/__init__.pyc +0 -0
- data/packages/gsutil/boto/boto/auth.py +682 -0
- data/packages/gsutil/boto/boto/auth.pyc +0 -0
- data/packages/gsutil/boto/boto/auth_handler.py +58 -0
- data/packages/gsutil/boto/boto/auth_handler.pyc +0 -0
- data/packages/gsutil/boto/boto/beanstalk/__init__.py +65 -0
- data/packages/gsutil/boto/boto/beanstalk/exception.py +64 -0
- data/packages/gsutil/boto/boto/beanstalk/layer1.py +1153 -0
- data/packages/gsutil/boto/boto/beanstalk/response.py +703 -0
- data/packages/gsutil/boto/boto/beanstalk/wrapper.py +29 -0
- data/packages/gsutil/boto/boto/cacerts/__init__.py +22 -0
- data/packages/gsutil/boto/boto/cacerts/__init__.pyc +0 -0
- data/packages/gsutil/boto/boto/cacerts/cacerts.txt +633 -0
- data/packages/gsutil/boto/boto/cloudformation/__init__.py +68 -0
- data/packages/gsutil/boto/boto/cloudformation/connection.py +364 -0
- data/packages/gsutil/boto/boto/cloudformation/stack.py +360 -0
- data/packages/gsutil/boto/boto/cloudformation/template.py +43 -0
- data/packages/gsutil/boto/boto/cloudfront/__init__.py +324 -0
- data/packages/gsutil/boto/boto/cloudfront/distribution.py +745 -0
- data/packages/gsutil/boto/boto/cloudfront/exception.py +26 -0
- data/packages/gsutil/boto/boto/cloudfront/identity.py +122 -0
- data/packages/gsutil/boto/boto/cloudfront/invalidation.py +216 -0
- data/packages/gsutil/boto/boto/cloudfront/logging.py +38 -0
- data/packages/gsutil/boto/boto/cloudfront/object.py +48 -0
- data/packages/gsutil/boto/boto/cloudfront/origin.py +150 -0
- data/packages/gsutil/boto/boto/cloudfront/signers.py +60 -0
- data/packages/gsutil/boto/boto/cloudsearch/__init__.py +45 -0
- data/packages/gsutil/boto/boto/cloudsearch/document.py +265 -0
- data/packages/gsutil/boto/boto/cloudsearch/domain.py +394 -0
- data/packages/gsutil/boto/boto/cloudsearch/layer1.py +738 -0
- data/packages/gsutil/boto/boto/cloudsearch/layer2.py +67 -0
- data/packages/gsutil/boto/boto/cloudsearch/optionstatus.py +248 -0
- data/packages/gsutil/boto/boto/cloudsearch/search.py +365 -0
- data/packages/gsutil/boto/boto/cloudsearch/sourceattribute.py +75 -0
- data/packages/gsutil/boto/boto/compat.py +28 -0
- data/packages/gsutil/boto/boto/compat.pyc +0 -0
- data/packages/gsutil/boto/boto/connection.py +1081 -0
- data/packages/gsutil/boto/boto/connection.pyc +0 -0
- data/packages/gsutil/boto/boto/contrib/__init__.py +22 -0
- data/packages/gsutil/boto/boto/contrib/ymlmessage.py +52 -0
- data/packages/gsutil/boto/boto/core/README +58 -0
- data/packages/gsutil/boto/boto/core/__init__.py +23 -0
- data/packages/gsutil/boto/boto/core/auth.py +78 -0
- data/packages/gsutil/boto/boto/core/credentials.py +154 -0
- data/packages/gsutil/boto/boto/core/dictresponse.py +178 -0
- data/packages/gsutil/boto/boto/core/service.py +67 -0
- data/packages/gsutil/boto/boto/datapipeline/__init__.py +0 -0
- data/packages/gsutil/boto/boto/datapipeline/exceptions.py +42 -0
- data/packages/gsutil/boto/boto/datapipeline/layer1.py +546 -0
- data/packages/gsutil/boto/boto/dynamodb/__init__.py +66 -0
- data/packages/gsutil/boto/boto/dynamodb/batch.py +262 -0
- data/packages/gsutil/boto/boto/dynamodb/condition.py +170 -0
- data/packages/gsutil/boto/boto/dynamodb/exceptions.py +64 -0
- data/packages/gsutil/boto/boto/dynamodb/item.py +196 -0
- data/packages/gsutil/boto/boto/dynamodb/layer1.py +575 -0
- data/packages/gsutil/boto/boto/dynamodb/layer2.py +798 -0
- data/packages/gsutil/boto/boto/dynamodb/schema.py +112 -0
- data/packages/gsutil/boto/boto/dynamodb/table.py +540 -0
- data/packages/gsutil/boto/boto/dynamodb/types.py +326 -0
- data/packages/gsutil/boto/boto/ec2/__init__.py +96 -0
- data/packages/gsutil/boto/boto/ec2/address.py +103 -0
- data/packages/gsutil/boto/boto/ec2/autoscale/__init__.py +781 -0
- data/packages/gsutil/boto/boto/ec2/autoscale/activity.py +74 -0
- data/packages/gsutil/boto/boto/ec2/autoscale/group.py +337 -0
- data/packages/gsutil/boto/boto/ec2/autoscale/instance.py +60 -0
- data/packages/gsutil/boto/boto/ec2/autoscale/launchconfig.py +209 -0
- data/packages/gsutil/boto/boto/ec2/autoscale/policy.py +166 -0
- data/packages/gsutil/boto/boto/ec2/autoscale/request.py +38 -0
- data/packages/gsutil/boto/boto/ec2/autoscale/scheduled.py +60 -0
- data/packages/gsutil/boto/boto/ec2/autoscale/tag.py +84 -0
- data/packages/gsutil/boto/boto/ec2/blockdevicemapping.py +141 -0
- data/packages/gsutil/boto/boto/ec2/bundleinstance.py +78 -0
- data/packages/gsutil/boto/boto/ec2/buyreservation.py +84 -0
- data/packages/gsutil/boto/boto/ec2/cloudwatch/__init__.py +603 -0
- data/packages/gsutil/boto/boto/ec2/cloudwatch/alarm.py +316 -0
- data/packages/gsutil/boto/boto/ec2/cloudwatch/datapoint.py +40 -0
- data/packages/gsutil/boto/boto/ec2/cloudwatch/dimension.py +38 -0
- data/packages/gsutil/boto/boto/ec2/cloudwatch/listelement.py +31 -0
- data/packages/gsutil/boto/boto/ec2/cloudwatch/metric.py +175 -0
- data/packages/gsutil/boto/boto/ec2/connection.py +3409 -0
- data/packages/gsutil/boto/boto/ec2/ec2object.py +107 -0
- data/packages/gsutil/boto/boto/ec2/elb/__init__.py +553 -0
- data/packages/gsutil/boto/boto/ec2/elb/healthcheck.py +89 -0
- data/packages/gsutil/boto/boto/ec2/elb/instancestate.py +62 -0
- data/packages/gsutil/boto/boto/ec2/elb/listelement.py +36 -0
- data/packages/gsutil/boto/boto/ec2/elb/listener.py +75 -0
- data/packages/gsutil/boto/boto/ec2/elb/loadbalancer.py +324 -0
- data/packages/gsutil/boto/boto/ec2/elb/policies.py +89 -0
- data/packages/gsutil/boto/boto/ec2/elb/securitygroup.py +38 -0
- data/packages/gsutil/boto/boto/ec2/group.py +39 -0
- data/packages/gsutil/boto/boto/ec2/image.py +350 -0
- data/packages/gsutil/boto/boto/ec2/instance.py +661 -0
- data/packages/gsutil/boto/boto/ec2/instanceinfo.py +51 -0
- data/packages/gsutil/boto/boto/ec2/instancestatus.py +207 -0
- data/packages/gsutil/boto/boto/ec2/keypair.py +113 -0
- data/packages/gsutil/boto/boto/ec2/launchspecification.py +105 -0
- data/packages/gsutil/boto/boto/ec2/networkinterface.py +247 -0
- data/packages/gsutil/boto/boto/ec2/placementgroup.py +51 -0
- data/packages/gsutil/boto/boto/ec2/regioninfo.py +34 -0
- data/packages/gsutil/boto/boto/ec2/reservedinstance.py +227 -0
- data/packages/gsutil/boto/boto/ec2/securitygroup.py +357 -0
- data/packages/gsutil/boto/boto/ec2/snapshot.py +170 -0
- data/packages/gsutil/boto/boto/ec2/spotdatafeedsubscription.py +63 -0
- data/packages/gsutil/boto/boto/ec2/spotinstancerequest.py +188 -0
- data/packages/gsutil/boto/boto/ec2/spotpricehistory.py +55 -0
- data/packages/gsutil/boto/boto/ec2/tag.py +87 -0
- data/packages/gsutil/boto/boto/ec2/vmtype.py +58 -0
- data/packages/gsutil/boto/boto/ec2/volume.py +293 -0
- data/packages/gsutil/boto/boto/ec2/volumestatus.py +200 -0
- data/packages/gsutil/boto/boto/ec2/zone.py +80 -0
- data/packages/gsutil/boto/boto/ecs/__init__.py +90 -0
- data/packages/gsutil/boto/boto/ecs/item.py +153 -0
- data/packages/gsutil/boto/boto/elasticache/__init__.py +62 -0
- data/packages/gsutil/boto/boto/elasticache/layer1.py +1252 -0
- data/packages/gsutil/boto/boto/elastictranscoder/__init__.py +62 -0
- data/packages/gsutil/boto/boto/elastictranscoder/exceptions.py +46 -0
- data/packages/gsutil/boto/boto/elastictranscoder/layer1.py +509 -0
- data/packages/gsutil/boto/boto/emr/__init__.py +73 -0
- data/packages/gsutil/boto/boto/emr/bootstrap_action.py +44 -0
- data/packages/gsutil/boto/boto/emr/connection.py +531 -0
- data/packages/gsutil/boto/boto/emr/emrobject.py +176 -0
- data/packages/gsutil/boto/boto/emr/instance_group.py +43 -0
- data/packages/gsutil/boto/boto/emr/step.py +281 -0
- data/packages/gsutil/boto/boto/exception.py +476 -0
- data/packages/gsutil/boto/boto/exception.pyc +0 -0
- data/packages/gsutil/boto/boto/file/README +49 -0
- data/packages/gsutil/boto/boto/file/__init__.py +28 -0
- data/packages/gsutil/boto/boto/file/bucket.py +112 -0
- data/packages/gsutil/boto/boto/file/connection.py +33 -0
- data/packages/gsutil/boto/boto/file/key.py +199 -0
- data/packages/gsutil/boto/boto/file/simpleresultset.py +30 -0
- data/packages/gsutil/boto/boto/fps/__init__.py +21 -0
- data/packages/gsutil/boto/boto/fps/connection.py +369 -0
- data/packages/gsutil/boto/boto/fps/exception.py +344 -0
- data/packages/gsutil/boto/boto/fps/response.py +175 -0
- data/packages/gsutil/boto/boto/glacier/__init__.py +57 -0
- data/packages/gsutil/boto/boto/glacier/concurrent.py +409 -0
- data/packages/gsutil/boto/boto/glacier/exceptions.py +58 -0
- data/packages/gsutil/boto/boto/glacier/job.py +152 -0
- data/packages/gsutil/boto/boto/glacier/layer1.py +637 -0
- data/packages/gsutil/boto/boto/glacier/layer2.py +93 -0
- data/packages/gsutil/boto/boto/glacier/response.py +48 -0
- data/packages/gsutil/boto/boto/glacier/utils.py +163 -0
- data/packages/gsutil/boto/boto/glacier/vault.py +387 -0
- data/packages/gsutil/boto/boto/glacier/writer.py +242 -0
- data/packages/gsutil/boto/boto/gs/__init__.py +22 -0
- data/packages/gsutil/boto/boto/gs/__init__.pyc +0 -0
- data/packages/gsutil/boto/boto/gs/acl.py +304 -0
- data/packages/gsutil/boto/boto/gs/acl.pyc +0 -0
- data/packages/gsutil/boto/boto/gs/bucket.py +870 -0
- data/packages/gsutil/boto/boto/gs/bucket.pyc +0 -0
- data/packages/gsutil/boto/boto/gs/bucketlistresultset.py +64 -0
- data/packages/gsutil/boto/boto/gs/bucketlistresultset.pyc +0 -0
- data/packages/gsutil/boto/boto/gs/connection.py +103 -0
- data/packages/gsutil/boto/boto/gs/connection.pyc +0 -0
- data/packages/gsutil/boto/boto/gs/cors.py +169 -0
- data/packages/gsutil/boto/boto/gs/cors.pyc +0 -0
- data/packages/gsutil/boto/boto/gs/key.py +704 -0
- data/packages/gsutil/boto/boto/gs/key.pyc +0 -0
- data/packages/gsutil/boto/boto/gs/resumable_upload_handler.py +659 -0
- data/packages/gsutil/boto/boto/gs/resumable_upload_handler.pyc +0 -0
- data/packages/gsutil/boto/boto/gs/user.py +54 -0
- data/packages/gsutil/boto/boto/gs/user.pyc +0 -0
- data/packages/gsutil/boto/boto/handler.py +44 -0
- data/packages/gsutil/boto/boto/handler.pyc +0 -0
- data/packages/gsutil/boto/boto/https_connection.py +124 -0
- data/packages/gsutil/boto/boto/https_connection.pyc +0 -0
- data/packages/gsutil/boto/boto/iam/__init__.py +74 -0
- data/packages/gsutil/boto/boto/iam/connection.py +1317 -0
- data/packages/gsutil/boto/boto/iam/summarymap.py +42 -0
- data/packages/gsutil/boto/boto/jsonresponse.py +163 -0
- data/packages/gsutil/boto/boto/jsonresponse.pyc +0 -0
- data/packages/gsutil/boto/boto/manage/__init__.py +23 -0
- data/packages/gsutil/boto/boto/manage/cmdshell.py +241 -0
- data/packages/gsutil/boto/boto/manage/propget.py +64 -0
- data/packages/gsutil/boto/boto/manage/server.py +556 -0
- data/packages/gsutil/boto/boto/manage/task.py +175 -0
- data/packages/gsutil/boto/boto/manage/test_manage.py +34 -0
- data/packages/gsutil/boto/boto/manage/volume.py +420 -0
- data/packages/gsutil/boto/boto/mashups/__init__.py +23 -0
- data/packages/gsutil/boto/boto/mashups/interactive.py +97 -0
- data/packages/gsutil/boto/boto/mashups/iobject.py +115 -0
- data/packages/gsutil/boto/boto/mashups/order.py +211 -0
- data/packages/gsutil/boto/boto/mashups/server.py +395 -0
- data/packages/gsutil/boto/boto/mturk/__init__.py +23 -0
- data/packages/gsutil/boto/boto/mturk/connection.py +1027 -0
- data/packages/gsutil/boto/boto/mturk/layoutparam.py +55 -0
- data/packages/gsutil/boto/boto/mturk/notification.py +103 -0
- data/packages/gsutil/boto/boto/mturk/price.py +48 -0
- data/packages/gsutil/boto/boto/mturk/qualification.py +137 -0
- data/packages/gsutil/boto/boto/mturk/question.py +455 -0
- data/packages/gsutil/boto/boto/mws/__init__.py +21 -0
- data/packages/gsutil/boto/boto/mws/connection.py +813 -0
- data/packages/gsutil/boto/boto/mws/exception.py +75 -0
- data/packages/gsutil/boto/boto/mws/response.py +655 -0
- data/packages/gsutil/boto/boto/plugin.py +90 -0
- data/packages/gsutil/boto/boto/plugin.pyc +0 -0
- data/packages/gsutil/boto/boto/provider.py +337 -0
- data/packages/gsutil/boto/boto/provider.pyc +0 -0
- data/packages/gsutil/boto/boto/pyami/__init__.py +22 -0
- data/packages/gsutil/boto/boto/pyami/__init__.pyc +0 -0
- data/packages/gsutil/boto/boto/pyami/bootstrap.py +134 -0
- data/packages/gsutil/boto/boto/pyami/config.py +229 -0
- data/packages/gsutil/boto/boto/pyami/config.pyc +0 -0
- data/packages/gsutil/boto/boto/pyami/copybot.cfg +60 -0
- data/packages/gsutil/boto/boto/pyami/copybot.py +97 -0
- data/packages/gsutil/boto/boto/pyami/helloworld.py +28 -0
- data/packages/gsutil/boto/boto/pyami/installers/__init__.py +64 -0
- data/packages/gsutil/boto/boto/pyami/installers/ubuntu/__init__.py +22 -0
- data/packages/gsutil/boto/boto/pyami/installers/ubuntu/apache.py +43 -0
- data/packages/gsutil/boto/boto/pyami/installers/ubuntu/ebs.py +238 -0
- data/packages/gsutil/boto/boto/pyami/installers/ubuntu/installer.py +96 -0
- data/packages/gsutil/boto/boto/pyami/installers/ubuntu/mysql.py +109 -0
- data/packages/gsutil/boto/boto/pyami/installers/ubuntu/trac.py +139 -0
- data/packages/gsutil/boto/boto/pyami/launch_ami.py +178 -0
- data/packages/gsutil/boto/boto/pyami/scriptbase.py +44 -0
- data/packages/gsutil/boto/boto/pyami/startup.py +60 -0
- data/packages/gsutil/boto/boto/rds/__init__.py +1194 -0
- data/packages/gsutil/boto/boto/rds/dbinstance.py +357 -0
- data/packages/gsutil/boto/boto/rds/dbsecuritygroup.py +177 -0
- data/packages/gsutil/boto/boto/rds/dbsnapshot.py +108 -0
- data/packages/gsutil/boto/boto/rds/event.py +49 -0
- data/packages/gsutil/boto/boto/rds/parametergroup.py +201 -0
- data/packages/gsutil/boto/boto/rds/regioninfo.py +32 -0
- data/packages/gsutil/boto/boto/regioninfo.py +63 -0
- data/packages/gsutil/boto/boto/regioninfo.pyc +0 -0
- data/packages/gsutil/boto/boto/resultset.py +169 -0
- data/packages/gsutil/boto/boto/resultset.pyc +0 -0
- data/packages/gsutil/boto/boto/roboto/__init__.py +1 -0
- data/packages/gsutil/boto/boto/roboto/awsqueryrequest.py +504 -0
- data/packages/gsutil/boto/boto/roboto/awsqueryservice.py +121 -0
- data/packages/gsutil/boto/boto/roboto/param.py +147 -0
- data/packages/gsutil/boto/boto/route53/__init__.py +75 -0
- data/packages/gsutil/boto/boto/route53/connection.py +403 -0
- data/packages/gsutil/boto/boto/route53/exception.py +27 -0
- data/packages/gsutil/boto/boto/route53/hostedzone.py +56 -0
- data/packages/gsutil/boto/boto/route53/record.py +306 -0
- data/packages/gsutil/boto/boto/route53/status.py +42 -0
- data/packages/gsutil/boto/boto/route53/zone.py +412 -0
- data/packages/gsutil/boto/boto/s3/__init__.py +84 -0
- data/packages/gsutil/boto/boto/s3/__init__.pyc +0 -0
- data/packages/gsutil/boto/boto/s3/acl.py +164 -0
- data/packages/gsutil/boto/boto/s3/acl.pyc +0 -0
- data/packages/gsutil/boto/boto/s3/bucket.py +1634 -0
- data/packages/gsutil/boto/boto/s3/bucket.pyc +0 -0
- data/packages/gsutil/boto/boto/s3/bucketlistresultset.py +139 -0
- data/packages/gsutil/boto/boto/s3/bucketlistresultset.pyc +0 -0
- data/packages/gsutil/boto/boto/s3/bucketlogging.py +83 -0
- data/packages/gsutil/boto/boto/s3/bucketlogging.pyc +0 -0
- data/packages/gsutil/boto/boto/s3/connection.py +540 -0
- data/packages/gsutil/boto/boto/s3/connection.pyc +0 -0
- data/packages/gsutil/boto/boto/s3/cors.py +210 -0
- data/packages/gsutil/boto/boto/s3/cors.pyc +0 -0
- data/packages/gsutil/boto/boto/s3/deletemarker.py +55 -0
- data/packages/gsutil/boto/boto/s3/deletemarker.pyc +0 -0
- data/packages/gsutil/boto/boto/s3/key.py +1712 -0
- data/packages/gsutil/boto/boto/s3/key.pyc +0 -0
- data/packages/gsutil/boto/boto/s3/keyfile.py +134 -0
- data/packages/gsutil/boto/boto/s3/keyfile.pyc +0 -0
- data/packages/gsutil/boto/boto/s3/lifecycle.py +231 -0
- data/packages/gsutil/boto/boto/s3/lifecycle.pyc +0 -0
- data/packages/gsutil/boto/boto/s3/multidelete.py +138 -0
- data/packages/gsutil/boto/boto/s3/multidelete.pyc +0 -0
- data/packages/gsutil/boto/boto/s3/multipart.py +315 -0
- data/packages/gsutil/boto/boto/s3/multipart.pyc +0 -0
- data/packages/gsutil/boto/boto/s3/prefix.py +42 -0
- data/packages/gsutil/boto/boto/s3/prefix.pyc +0 -0
- data/packages/gsutil/boto/boto/s3/resumable_download_handler.py +339 -0
- data/packages/gsutil/boto/boto/s3/resumable_download_handler.pyc +0 -0
- data/packages/gsutil/boto/boto/s3/tagging.py +71 -0
- data/packages/gsutil/boto/boto/s3/tagging.pyc +0 -0
- data/packages/gsutil/boto/boto/s3/user.py +49 -0
- data/packages/gsutil/boto/boto/s3/user.pyc +0 -0
- data/packages/gsutil/boto/boto/s3/website.py +237 -0
- data/packages/gsutil/boto/boto/s3/website.pyc +0 -0
- data/packages/gsutil/boto/boto/sdb/__init__.py +67 -0
- data/packages/gsutil/boto/boto/sdb/connection.py +617 -0
- data/packages/gsutil/boto/boto/sdb/db/__init__.py +20 -0
- data/packages/gsutil/boto/boto/sdb/db/blob.py +75 -0
- data/packages/gsutil/boto/boto/sdb/db/key.py +59 -0
- data/packages/gsutil/boto/boto/sdb/db/manager/__init__.py +85 -0
- data/packages/gsutil/boto/boto/sdb/db/manager/sdbmanager.py +732 -0
- data/packages/gsutil/boto/boto/sdb/db/manager/xmlmanager.py +517 -0
- data/packages/gsutil/boto/boto/sdb/db/model.py +294 -0
- data/packages/gsutil/boto/boto/sdb/db/property.py +703 -0
- data/packages/gsutil/boto/boto/sdb/db/query.py +85 -0
- data/packages/gsutil/boto/boto/sdb/db/sequence.py +226 -0
- data/packages/gsutil/boto/boto/sdb/db/test_db.py +231 -0
- data/packages/gsutil/boto/boto/sdb/domain.py +377 -0
- data/packages/gsutil/boto/boto/sdb/item.py +181 -0
- data/packages/gsutil/boto/boto/sdb/queryresultset.py +92 -0
- data/packages/gsutil/boto/boto/sdb/regioninfo.py +32 -0
- data/packages/gsutil/boto/boto/services/__init__.py +23 -0
- data/packages/gsutil/boto/boto/services/bs.py +179 -0
- data/packages/gsutil/boto/boto/services/message.py +58 -0
- data/packages/gsutil/boto/boto/services/result.py +136 -0
- data/packages/gsutil/boto/boto/services/service.py +161 -0
- data/packages/gsutil/boto/boto/services/servicedef.py +91 -0
- data/packages/gsutil/boto/boto/services/sonofmmm.cfg +43 -0
- data/packages/gsutil/boto/boto/services/sonofmmm.py +81 -0
- data/packages/gsutil/boto/boto/services/submit.py +88 -0
- data/packages/gsutil/boto/boto/ses/__init__.py +54 -0
- data/packages/gsutil/boto/boto/ses/connection.py +521 -0
- data/packages/gsutil/boto/boto/ses/exceptions.py +77 -0
- data/packages/gsutil/boto/boto/sns/__init__.py +78 -0
- data/packages/gsutil/boto/boto/sns/connection.py +431 -0
- data/packages/gsutil/boto/boto/sqs/__init__.py +56 -0
- data/packages/gsutil/boto/boto/sqs/attributes.py +46 -0
- data/packages/gsutil/boto/boto/sqs/batchresults.py +95 -0
- data/packages/gsutil/boto/boto/sqs/connection.py +417 -0
- data/packages/gsutil/boto/boto/sqs/jsonmessage.py +43 -0
- data/packages/gsutil/boto/boto/sqs/message.py +253 -0
- data/packages/gsutil/boto/boto/sqs/queue.py +478 -0
- data/packages/gsutil/boto/boto/sqs/regioninfo.py +32 -0
- data/packages/gsutil/boto/boto/storage_uri.py +835 -0
- data/packages/gsutil/boto/boto/storage_uri.pyc +0 -0
- data/packages/gsutil/boto/boto/sts/__init__.py +55 -0
- data/packages/gsutil/boto/boto/sts/connection.py +207 -0
- data/packages/gsutil/boto/boto/sts/credentials.py +215 -0
- data/packages/gsutil/boto/boto/swf/__init__.py +60 -0
- data/packages/gsutil/boto/boto/swf/exceptions.py +44 -0
- data/packages/gsutil/boto/boto/swf/layer1.py +1512 -0
- data/packages/gsutil/boto/boto/swf/layer1_decisions.py +287 -0
- data/packages/gsutil/boto/boto/swf/layer2.py +342 -0
- data/packages/gsutil/boto/boto/utils.py +927 -0
- data/packages/gsutil/boto/boto/utils.pyc +0 -0
- data/packages/gsutil/boto/boto/vpc/__init__.py +910 -0
- data/packages/gsutil/boto/boto/vpc/customergateway.py +54 -0
- data/packages/gsutil/boto/boto/vpc/dhcpoptions.py +72 -0
- data/packages/gsutil/boto/boto/vpc/internetgateway.py +72 -0
- data/packages/gsutil/boto/boto/vpc/routetable.py +109 -0
- data/packages/gsutil/boto/boto/vpc/subnet.py +57 -0
- data/packages/gsutil/boto/boto/vpc/vpc.py +54 -0
- data/packages/gsutil/boto/boto/vpc/vpnconnection.py +60 -0
- data/packages/gsutil/boto/boto/vpc/vpngateway.py +83 -0
- data/packages/gsutil/boto/docs/BotoCheatSheet.pdf +0 -0
- data/packages/gsutil/boto/docs/Makefile +89 -0
- data/packages/gsutil/boto/docs/make.bat +113 -0
- data/packages/gsutil/boto/docs/source/_templates/layout.html +3 -0
- data/packages/gsutil/boto/docs/source/autoscale_tut.rst +220 -0
- data/packages/gsutil/boto/docs/source/boto_config_tut.rst +125 -0
- data/packages/gsutil/boto/docs/source/boto_theme/static/boto.css_t +239 -0
- data/packages/gsutil/boto/docs/source/boto_theme/static/pygments.css +61 -0
- data/packages/gsutil/boto/docs/source/boto_theme/theme.conf +3 -0
- data/packages/gsutil/boto/docs/source/cloudfront_tut.rst +196 -0
- data/packages/gsutil/boto/docs/source/cloudsearch_tut.rst +411 -0
- data/packages/gsutil/boto/docs/source/cloudwatch_tut.rst +116 -0
- data/packages/gsutil/boto/docs/source/conf.py +32 -0
- data/packages/gsutil/boto/docs/source/contributing.rst +204 -0
- data/packages/gsutil/boto/docs/source/documentation.rst +59 -0
- data/packages/gsutil/boto/docs/source/dynamodb_tut.rst +339 -0
- data/packages/gsutil/boto/docs/source/ec2_tut.rst +86 -0
- data/packages/gsutil/boto/docs/source/elb_tut.rst +257 -0
- data/packages/gsutil/boto/docs/source/emr_tut.rst +108 -0
- data/packages/gsutil/boto/docs/source/index.rst +146 -0
- data/packages/gsutil/boto/docs/source/rds_tut.rst +108 -0
- data/packages/gsutil/boto/docs/source/ref/autoscale.rst +62 -0
- data/packages/gsutil/boto/docs/source/ref/beanstalk.rst +26 -0
- data/packages/gsutil/boto/docs/source/ref/boto.rst +47 -0
- data/packages/gsutil/boto/docs/source/ref/cloudformation.rst +34 -0
- data/packages/gsutil/boto/docs/source/ref/cloudfront.rst +68 -0
- data/packages/gsutil/boto/docs/source/ref/cloudsearch.rst +59 -0
- data/packages/gsutil/boto/docs/source/ref/cloudwatch.rst +27 -0
- data/packages/gsutil/boto/docs/source/ref/contrib.rst +32 -0
- data/packages/gsutil/boto/docs/source/ref/datapipeline.rst +26 -0
- data/packages/gsutil/boto/docs/source/ref/dynamodb.rst +61 -0
- data/packages/gsutil/boto/docs/source/ref/ec2.rst +140 -0
- data/packages/gsutil/boto/docs/source/ref/ecs.rst +19 -0
- data/packages/gsutil/boto/docs/source/ref/elasticache.rst +19 -0
- data/packages/gsutil/boto/docs/source/ref/elastictranscoder.rst +26 -0
- data/packages/gsutil/boto/docs/source/ref/elb.rst +47 -0
- data/packages/gsutil/boto/docs/source/ref/emr.rst +34 -0
- data/packages/gsutil/boto/docs/source/ref/file.rst +34 -0
- data/packages/gsutil/boto/docs/source/ref/fps.rst +19 -0
- data/packages/gsutil/boto/docs/source/ref/glacier.rst +63 -0
- data/packages/gsutil/boto/docs/source/ref/gs.rst +72 -0
- data/packages/gsutil/boto/docs/source/ref/iam.rst +27 -0
- data/packages/gsutil/boto/docs/source/ref/index.rst +40 -0
- data/packages/gsutil/boto/docs/source/ref/manage.rst +47 -0
- data/packages/gsutil/boto/docs/source/ref/mturk.rst +54 -0
- data/packages/gsutil/boto/docs/source/ref/mws.rst +33 -0
- data/packages/gsutil/boto/docs/source/ref/pyami.rst +103 -0
- data/packages/gsutil/boto/docs/source/ref/rds.rst +47 -0
- data/packages/gsutil/boto/docs/source/ref/route53.rst +34 -0
- data/packages/gsutil/boto/docs/source/ref/s3.rst +111 -0
- data/packages/gsutil/boto/docs/source/ref/sdb.rst +45 -0
- data/packages/gsutil/boto/docs/source/ref/sdb_db.rst +83 -0
- data/packages/gsutil/boto/docs/source/ref/services.rst +61 -0
- data/packages/gsutil/boto/docs/source/ref/ses.rst +21 -0
- data/packages/gsutil/boto/docs/source/ref/sns.rst +17 -0
- data/packages/gsutil/boto/docs/source/ref/sqs.rst +61 -0
- data/packages/gsutil/boto/docs/source/ref/sts.rst +25 -0
- data/packages/gsutil/boto/docs/source/ref/swf.rst +22 -0
- data/packages/gsutil/boto/docs/source/ref/vpc.rst +54 -0
- data/packages/gsutil/boto/docs/source/s3_tut.rst +450 -0
- data/packages/gsutil/boto/docs/source/security_groups.rst +82 -0
- data/packages/gsutil/boto/docs/source/ses_tut.rst +171 -0
- data/packages/gsutil/boto/docs/source/simpledb_tut.rst +188 -0
- data/packages/gsutil/boto/docs/source/sqs_tut.rst +246 -0
- data/packages/gsutil/boto/docs/source/vpc_tut.rst +100 -0
- data/packages/gsutil/boto/pylintrc +305 -0
- data/packages/gsutil/boto/requirements.txt +10 -0
- data/packages/gsutil/boto/setup.py +89 -0
- data/packages/gsutil/boto/tests/__init__.py +20 -0
- data/packages/gsutil/boto/tests/db/test_lists.py +96 -0
- data/packages/gsutil/boto/tests/db/test_password.py +128 -0
- data/packages/gsutil/boto/tests/db/test_query.py +152 -0
- data/packages/gsutil/boto/tests/db/test_sequence.py +109 -0
- data/packages/gsutil/boto/tests/devpay/__init__.py +0 -0
- data/packages/gsutil/boto/tests/devpay/test_s3.py +181 -0
- data/packages/gsutil/boto/tests/fps/__init__.py +0 -0
- data/packages/gsutil/boto/tests/fps/test.py +100 -0
- data/packages/gsutil/boto/tests/fps/test_verify_signature.py +12 -0
- data/packages/gsutil/boto/tests/integration/__init__.py +0 -0
- data/packages/gsutil/boto/tests/integration/beanstalk/test_wrapper.py +209 -0
- data/packages/gsutil/boto/tests/integration/cloudformation/__init__.py +21 -0
- data/packages/gsutil/boto/tests/integration/cloudformation/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/cloudformation/test_connection.py +110 -0
- data/packages/gsutil/boto/tests/integration/cloudsearch/__init__.py +21 -0
- data/packages/gsutil/boto/tests/integration/cloudsearch/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/datapipeline/test_layer1.py +122 -0
- data/packages/gsutil/boto/tests/integration/dynamodb/__init__.py +20 -0
- data/packages/gsutil/boto/tests/integration/dynamodb/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/dynamodb/test_layer1.py +266 -0
- data/packages/gsutil/boto/tests/integration/dynamodb/test_layer2.py +484 -0
- data/packages/gsutil/boto/tests/integration/dynamodb/test_table.py +84 -0
- data/packages/gsutil/boto/tests/integration/ec2/__init__.py +20 -0
- data/packages/gsutil/boto/tests/integration/ec2/autoscale/__init__.py +21 -0
- data/packages/gsutil/boto/tests/integration/ec2/autoscale/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/ec2/autoscale/test_connection.py +167 -0
- data/packages/gsutil/boto/tests/integration/ec2/cloudwatch/__init__.py +20 -0
- data/packages/gsutil/boto/tests/integration/ec2/cloudwatch/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/ec2/cloudwatch/test_connection.py +277 -0
- data/packages/gsutil/boto/tests/integration/ec2/elb/__init__.py +20 -0
- data/packages/gsutil/boto/tests/integration/ec2/elb/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/ec2/elb/test_connection.py +130 -0
- data/packages/gsutil/boto/tests/integration/ec2/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/ec2/test_connection.py +192 -0
- data/packages/gsutil/boto/tests/integration/ec2/vpc/__init__.py +0 -0
- data/packages/gsutil/boto/tests/integration/ec2/vpc/test_connection.py +95 -0
- data/packages/gsutil/boto/tests/integration/elasticache/__init__.py +0 -0
- data/packages/gsutil/boto/tests/integration/elasticache/test_layer1.py +67 -0
- data/packages/gsutil/boto/tests/integration/elastictranscoder/__init__.py +0 -0
- data/packages/gsutil/boto/tests/integration/elastictranscoder/test_cert_verification.py +35 -0
- data/packages/gsutil/boto/tests/integration/elastictranscoder/test_layer1.py +115 -0
- data/packages/gsutil/boto/tests/integration/emr/__init__.py +20 -0
- data/packages/gsutil/boto/tests/integration/emr/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/glacier/__init__.py +22 -0
- data/packages/gsutil/boto/tests/integration/glacier/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/glacier/test_layer1.py +44 -0
- data/packages/gsutil/boto/tests/integration/glacier/test_layer2.py +45 -0
- data/packages/gsutil/boto/tests/integration/gs/__init__.py +0 -0
- data/packages/gsutil/boto/tests/integration/gs/cb_test_harness.py +71 -0
- data/packages/gsutil/boto/tests/integration/gs/test_basic.py +379 -0
- data/packages/gsutil/boto/tests/integration/gs/test_generation_conditionals.py +399 -0
- data/packages/gsutil/boto/tests/integration/gs/test_resumable_downloads.py +358 -0
- data/packages/gsutil/boto/tests/integration/gs/test_resumable_uploads.py +525 -0
- data/packages/gsutil/boto/tests/integration/gs/test_storage_uri.py +125 -0
- data/packages/gsutil/boto/tests/integration/gs/test_versioning.py +268 -0
- data/packages/gsutil/boto/tests/integration/gs/testcase.py +116 -0
- data/packages/gsutil/boto/tests/integration/gs/util.py +63 -0
- data/packages/gsutil/boto/tests/integration/iam/__init__.py +20 -0
- data/packages/gsutil/boto/tests/integration/iam/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/mws/__init__.py +0 -0
- data/packages/gsutil/boto/tests/integration/mws/test.py +100 -0
- data/packages/gsutil/boto/tests/integration/rds/__init__.py +21 -0
- data/packages/gsutil/boto/tests/integration/rds/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/route53/__init__.py +20 -0
- data/packages/gsutil/boto/tests/integration/route53/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/route53/test_zone.py +132 -0
- data/packages/gsutil/boto/tests/integration/s3/__init__.py +20 -0
- data/packages/gsutil/boto/tests/integration/s3/mock_storage_service.py +589 -0
- data/packages/gsutil/boto/tests/integration/s3/other_cacerts.txt +70 -0
- data/packages/gsutil/boto/tests/integration/s3/test_bucket.py +263 -0
- data/packages/gsutil/boto/tests/integration/s3/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/s3/test_connection.py +245 -0
- data/packages/gsutil/boto/tests/integration/s3/test_cors.py +78 -0
- data/packages/gsutil/boto/tests/integration/s3/test_encryption.py +115 -0
- data/packages/gsutil/boto/tests/integration/s3/test_https_cert_validation.py +141 -0
- data/packages/gsutil/boto/tests/integration/s3/test_key.py +375 -0
- data/packages/gsutil/boto/tests/integration/s3/test_mfa.py +95 -0
- data/packages/gsutil/boto/tests/integration/s3/test_multidelete.py +181 -0
- data/packages/gsutil/boto/tests/integration/s3/test_multipart.py +139 -0
- data/packages/gsutil/boto/tests/integration/s3/test_pool.py +246 -0
- data/packages/gsutil/boto/tests/integration/s3/test_versioning.py +158 -0
- data/packages/gsutil/boto/tests/integration/sdb/__init__.py +20 -0
- data/packages/gsutil/boto/tests/integration/sdb/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/sdb/test_connection.py +119 -0
- data/packages/gsutil/boto/tests/integration/ses/__init__.py +0 -0
- data/packages/gsutil/boto/tests/integration/ses/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/ses/test_connection.py +38 -0
- data/packages/gsutil/boto/tests/integration/sns/__init__.py +20 -0
- data/packages/gsutil/boto/tests/integration/sns/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/sqs/__init__.py +20 -0
- data/packages/gsutil/boto/tests/integration/sqs/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/sqs/test_connection.py +217 -0
- data/packages/gsutil/boto/tests/integration/sts/__init__.py +20 -0
- data/packages/gsutil/boto/tests/integration/sts/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/sts/test_session_token.py +65 -0
- data/packages/gsutil/boto/tests/integration/swf/__init__.py +0 -0
- data/packages/gsutil/boto/tests/integration/swf/test_cert_verification.py +40 -0
- data/packages/gsutil/boto/tests/integration/swf/test_layer1.py +246 -0
- data/packages/gsutil/boto/tests/integration/swf/test_layer1_workflow_execution.py +173 -0
- data/packages/gsutil/boto/tests/mturk/__init__.py +0 -0
- data/packages/gsutil/boto/tests/mturk/_init_environment.py +28 -0
- data/packages/gsutil/boto/tests/mturk/all_tests.py +24 -0
- data/packages/gsutil/boto/tests/mturk/cleanup_tests.py +47 -0
- data/packages/gsutil/boto/tests/mturk/common.py +45 -0
- data/packages/gsutil/boto/tests/mturk/create_free_text_question_regex.doctest +100 -0
- data/packages/gsutil/boto/tests/mturk/create_hit.doctest +92 -0
- data/packages/gsutil/boto/tests/mturk/create_hit_binary.doctest +94 -0
- data/packages/gsutil/boto/tests/mturk/create_hit_external.py +21 -0
- data/packages/gsutil/boto/tests/mturk/create_hit_from_hit_type.doctest +103 -0
- data/packages/gsutil/boto/tests/mturk/create_hit_test.py +21 -0
- data/packages/gsutil/boto/tests/mturk/create_hit_with_qualifications.py +16 -0
- data/packages/gsutil/boto/tests/mturk/hit_persistence.py +27 -0
- data/packages/gsutil/boto/tests/mturk/mocks.py +11 -0
- data/packages/gsutil/boto/tests/mturk/reviewable_hits.doctest +129 -0
- data/packages/gsutil/boto/tests/mturk/run-doctest.py +13 -0
- data/packages/gsutil/boto/tests/mturk/search_hits.doctest +16 -0
- data/packages/gsutil/boto/tests/mturk/selenium_support.py +61 -0
- data/packages/gsutil/boto/tests/mturk/support.py +7 -0
- data/packages/gsutil/boto/tests/mturk/test_disable_hit.py +11 -0
- data/packages/gsutil/boto/tests/test.py +59 -0
- data/packages/gsutil/boto/tests/unit/__init__.py +79 -0
- data/packages/gsutil/boto/tests/unit/auth/__init__.py +0 -0
- data/packages/gsutil/boto/tests/unit/auth/test_sigv4.py +73 -0
- data/packages/gsutil/boto/tests/unit/beanstalk/__init__.py +0 -0
- data/packages/gsutil/boto/tests/unit/beanstalk/test_layer1.py +128 -0
- data/packages/gsutil/boto/tests/unit/cloudformation/__init__.py +0 -0
- data/packages/gsutil/boto/tests/unit/cloudformation/test_connection.py +605 -0
- data/packages/gsutil/boto/tests/unit/cloudformation/test_stack.py +63 -0
- data/packages/gsutil/boto/tests/unit/cloudfront/__init__.py +0 -0
- data/packages/gsutil/boto/tests/unit/cloudfront/test_invalidation_list.py +113 -0
- data/packages/gsutil/boto/tests/unit/cloudfront/test_signed_urls.py +354 -0
- data/packages/gsutil/boto/tests/unit/cloudsearch/__init__.py +1 -0
- data/packages/gsutil/boto/tests/unit/cloudsearch/test_connection.py +241 -0
- data/packages/gsutil/boto/tests/unit/cloudsearch/test_document.py +324 -0
- data/packages/gsutil/boto/tests/unit/cloudsearch/test_search.py +325 -0
- data/packages/gsutil/boto/tests/unit/dynamodb/__init__.py +0 -0
- data/packages/gsutil/boto/tests/unit/dynamodb/test_batch.py +103 -0
- data/packages/gsutil/boto/tests/unit/dynamodb/test_layer2.py +119 -0
- data/packages/gsutil/boto/tests/unit/dynamodb/test_types.py +82 -0
- data/packages/gsutil/boto/tests/unit/ec2/__init__.py +0 -0
- data/packages/gsutil/boto/tests/unit/ec2/autoscale/__init__.py +0 -0
- data/packages/gsutil/boto/tests/unit/ec2/autoscale/test_group.py +162 -0
- data/packages/gsutil/boto/tests/unit/ec2/test_address.py +39 -0
- data/packages/gsutil/boto/tests/unit/ec2/test_blockdevicemapping.py +79 -0
- data/packages/gsutil/boto/tests/unit/ec2/test_connection.py +480 -0
- data/packages/gsutil/boto/tests/unit/ec2/test_instance.py +243 -0
- data/packages/gsutil/boto/tests/unit/ec2/test_networkinterface.py +140 -0
- data/packages/gsutil/boto/tests/unit/ec2/test_volume.py +248 -0
- data/packages/gsutil/boto/tests/unit/emr/test_emr_responses.py +373 -0
- data/packages/gsutil/boto/tests/unit/glacier/__init__.py +0 -0
- data/packages/gsutil/boto/tests/unit/glacier/test_concurrent.py +120 -0
- data/packages/gsutil/boto/tests/unit/glacier/test_job.py +60 -0
- data/packages/gsutil/boto/tests/unit/glacier/test_layer1.py +98 -0
- data/packages/gsutil/boto/tests/unit/glacier/test_layer2.py +266 -0
- data/packages/gsutil/boto/tests/unit/glacier/test_utils.py +116 -0
- data/packages/gsutil/boto/tests/unit/glacier/test_vault.py +100 -0
- data/packages/gsutil/boto/tests/unit/glacier/test_writer.py +185 -0
- data/packages/gsutil/boto/tests/unit/provider/__init__.py +0 -0
- data/packages/gsutil/boto/tests/unit/provider/test_provider.py +176 -0
- data/packages/gsutil/boto/tests/unit/rds/__init__.py +0 -0
- data/packages/gsutil/boto/tests/unit/rds/test_connection.py +131 -0
- data/packages/gsutil/boto/tests/unit/s3/__init__.py +0 -0
- data/packages/gsutil/boto/tests/unit/s3/test_cors_configuration.py +77 -0
- data/packages/gsutil/boto/tests/unit/s3/test_key.py +75 -0
- data/packages/gsutil/boto/tests/unit/s3/test_keyfile.py +101 -0
- data/packages/gsutil/boto/tests/unit/s3/test_lifecycle.py +97 -0
- data/packages/gsutil/boto/tests/unit/s3/test_tagging.py +47 -0
- data/packages/gsutil/boto/tests/unit/s3/test_uri.py +257 -0
- data/packages/gsutil/boto/tests/unit/s3/test_website.py +188 -0
- data/packages/gsutil/boto/tests/unit/sns/__init__.py +0 -0
- data/packages/gsutil/boto/tests/unit/sns/test_connection.py +99 -0
- data/packages/gsutil/boto/tests/unit/sqs/__init__.py +0 -0
- data/packages/gsutil/boto/tests/unit/sqs/test_connection.py +98 -0
- data/packages/gsutil/boto/tests/unit/sqs/test_queue.py +40 -0
- data/packages/gsutil/boto/tests/unit/sts/test_connection.py +74 -0
- data/packages/gsutil/boto/tests/unit/test_connection.py +60 -0
- data/packages/gsutil/boto/tests/unit/utils/test_utils.py +109 -0
- data/packages/gsutil/boto/tox.ini +8 -0
- data/packages/gsutil/gslib/README +5 -0
- data/packages/gsutil/gslib/__init__.py +22 -0
- data/packages/gsutil/gslib/__init__.pyc +0 -0
- data/packages/gsutil/gslib/addlhelp/__init__.py +15 -0
- data/packages/gsutil/gslib/addlhelp/acls.py +234 -0
- data/packages/gsutil/gslib/addlhelp/anon.py +57 -0
- data/packages/gsutil/gslib/addlhelp/command_opts.py +116 -0
- data/packages/gsutil/gslib/addlhelp/dev.py +139 -0
- data/packages/gsutil/gslib/addlhelp/metadata.py +186 -0
- data/packages/gsutil/gslib/addlhelp/naming.py +173 -0
- data/packages/gsutil/gslib/addlhelp/prod.py +160 -0
- data/packages/gsutil/gslib/addlhelp/projects.py +130 -0
- data/packages/gsutil/gslib/addlhelp/subdirs.py +110 -0
- data/packages/gsutil/gslib/addlhelp/support.py +86 -0
- data/packages/gsutil/gslib/addlhelp/versioning.py +242 -0
- data/packages/gsutil/gslib/addlhelp/wildcards.py +170 -0
- data/packages/gsutil/gslib/bucket_listing_ref.py +175 -0
- data/packages/gsutil/gslib/bucket_listing_ref.pyc +0 -0
- data/packages/gsutil/gslib/command.py +722 -0
- data/packages/gsutil/gslib/command.pyc +0 -0
- data/packages/gsutil/gslib/command_runner.py +101 -0
- data/packages/gsutil/gslib/command_runner.pyc +0 -0
- data/packages/gsutil/gslib/commands/__init__.py +15 -0
- data/packages/gsutil/gslib/commands/__init__.pyc +0 -0
- data/packages/gsutil/gslib/commands/cat.py +131 -0
- data/packages/gsutil/gslib/commands/cat.pyc +0 -0
- data/packages/gsutil/gslib/commands/chacl.py +532 -0
- data/packages/gsutil/gslib/commands/chacl.pyc +0 -0
- data/packages/gsutil/gslib/commands/config.py +694 -0
- data/packages/gsutil/gslib/commands/config.pyc +0 -0
- data/packages/gsutil/gslib/commands/cp.py +1818 -0
- data/packages/gsutil/gslib/commands/cp.pyc +0 -0
- data/packages/gsutil/gslib/commands/disablelogging.py +101 -0
- data/packages/gsutil/gslib/commands/disablelogging.pyc +0 -0
- data/packages/gsutil/gslib/commands/enablelogging.py +149 -0
- data/packages/gsutil/gslib/commands/enablelogging.pyc +0 -0
- data/packages/gsutil/gslib/commands/getacl.py +82 -0
- data/packages/gsutil/gslib/commands/getacl.pyc +0 -0
- data/packages/gsutil/gslib/commands/getcors.py +121 -0
- data/packages/gsutil/gslib/commands/getcors.pyc +0 -0
- data/packages/gsutil/gslib/commands/getdefacl.py +86 -0
- data/packages/gsutil/gslib/commands/getdefacl.pyc +0 -0
- data/packages/gsutil/gslib/commands/getlogging.py +137 -0
- data/packages/gsutil/gslib/commands/getlogging.pyc +0 -0
- data/packages/gsutil/gslib/commands/getversioning.py +116 -0
- data/packages/gsutil/gslib/commands/getversioning.pyc +0 -0
- data/packages/gsutil/gslib/commands/getwebcfg.py +122 -0
- data/packages/gsutil/gslib/commands/getwebcfg.pyc +0 -0
- data/packages/gsutil/gslib/commands/help.py +218 -0
- data/packages/gsutil/gslib/commands/help.pyc +0 -0
- data/packages/gsutil/gslib/commands/ls.py +578 -0
- data/packages/gsutil/gslib/commands/ls.pyc +0 -0
- data/packages/gsutil/gslib/commands/mb.py +172 -0
- data/packages/gsutil/gslib/commands/mb.pyc +0 -0
- data/packages/gsutil/gslib/commands/mv.py +159 -0
- data/packages/gsutil/gslib/commands/mv.pyc +0 -0
- data/packages/gsutil/gslib/commands/perfdiag.py +903 -0
- data/packages/gsutil/gslib/commands/perfdiag.pyc +0 -0
- data/packages/gsutil/gslib/commands/rb.py +113 -0
- data/packages/gsutil/gslib/commands/rb.pyc +0 -0
- data/packages/gsutil/gslib/commands/rm.py +239 -0
- data/packages/gsutil/gslib/commands/rm.pyc +0 -0
- data/packages/gsutil/gslib/commands/setacl.py +138 -0
- data/packages/gsutil/gslib/commands/setacl.pyc +0 -0
- data/packages/gsutil/gslib/commands/setcors.py +145 -0
- data/packages/gsutil/gslib/commands/setcors.pyc +0 -0
- data/packages/gsutil/gslib/commands/setdefacl.py +105 -0
- data/packages/gsutil/gslib/commands/setdefacl.pyc +0 -0
- data/packages/gsutil/gslib/commands/setmeta.py +428 -0
- data/packages/gsutil/gslib/commands/setmeta.pyc +0 -0
- data/packages/gsutil/gslib/commands/setversioning.py +114 -0
- data/packages/gsutil/gslib/commands/setversioning.pyc +0 -0
- data/packages/gsutil/gslib/commands/setwebcfg.py +190 -0
- data/packages/gsutil/gslib/commands/setwebcfg.pyc +0 -0
- data/packages/gsutil/gslib/commands/test.py +228 -0
- data/packages/gsutil/gslib/commands/test.pyc +0 -0
- data/packages/gsutil/gslib/commands/update.py +305 -0
- data/packages/gsutil/gslib/commands/update.pyc +0 -0
- data/packages/gsutil/gslib/commands/version.py +150 -0
- data/packages/gsutil/gslib/commands/version.pyc +0 -0
- data/packages/gsutil/gslib/exception.py +76 -0
- data/packages/gsutil/gslib/exception.pyc +0 -0
- data/packages/gsutil/gslib/help_provider.py +81 -0
- data/packages/gsutil/gslib/help_provider.pyc +0 -0
- data/packages/gsutil/gslib/name_expansion.py +550 -0
- data/packages/gsutil/gslib/name_expansion.pyc +0 -0
- data/packages/gsutil/gslib/no_op_auth_plugin.py +30 -0
- data/packages/gsutil/gslib/plurality_checkable_iterator.py +56 -0
- data/packages/gsutil/gslib/plurality_checkable_iterator.pyc +0 -0
- data/packages/gsutil/gslib/project_id.py +67 -0
- data/packages/gsutil/gslib/project_id.pyc +0 -0
- data/packages/gsutil/gslib/storage_uri_builder.py +56 -0
- data/packages/gsutil/gslib/storage_uri_builder.pyc +0 -0
- data/packages/gsutil/gslib/tests/__init__.py +15 -0
- data/packages/gsutil/gslib/tests/__init__.pyc +0 -0
- data/packages/gsutil/gslib/tests/test_chacl.py +236 -0
- data/packages/gsutil/gslib/tests/test_cp.py +267 -0
- data/packages/gsutil/gslib/tests/test_data/test.gif +0 -0
- data/packages/gsutil/gslib/tests/test_data/test.mp3 +0 -0
- data/packages/gsutil/gslib/tests/test_ls.py +66 -0
- data/packages/gsutil/gslib/tests/test_mv.py +69 -0
- data/packages/gsutil/gslib/tests/test_naming.py +989 -0
- data/packages/gsutil/gslib/tests/test_perfdiag.py +41 -0
- data/packages/gsutil/gslib/tests/test_plurality_checkable_iterator.py +67 -0
- data/packages/gsutil/gslib/tests/test_rm.py +143 -0
- data/packages/gsutil/gslib/tests/test_setacl.py +152 -0
- data/packages/gsutil/gslib/tests/test_setcors.py +168 -0
- data/packages/gsutil/gslib/tests/test_setmeta.py +91 -0
- data/packages/gsutil/gslib/tests/test_setversioning.py +44 -0
- data/packages/gsutil/gslib/tests/test_setwebcfg.py +63 -0
- data/packages/gsutil/gslib/tests/test_thread_pool.py +92 -0
- data/packages/gsutil/gslib/tests/test_wildcard_iterator.py +364 -0
- data/packages/gsutil/gslib/tests/testcase/__init__.py +18 -0
- data/packages/gsutil/gslib/tests/testcase/base.py +89 -0
- data/packages/gsutil/gslib/tests/testcase/integration_testcase.py +197 -0
- data/packages/gsutil/gslib/tests/testcase/unit_testcase.py +230 -0
- data/packages/gsutil/gslib/tests/util.py +125 -0
- data/packages/gsutil/gslib/tests/util.pyc +0 -0
- data/packages/gsutil/gslib/thread_pool.py +79 -0
- data/packages/gsutil/gslib/thread_pool.pyc +0 -0
- data/packages/gsutil/gslib/util.py +151 -0
- data/packages/gsutil/gslib/util.pyc +0 -0
- data/packages/gsutil/gslib/wildcard_iterator.py +492 -0
- data/packages/gsutil/gslib/wildcard_iterator.pyc +0 -0
- data/packages/gsutil/gsutil +377 -0
- data/packages/gsutil/gsutil.spec.in +75 -0
- data/packages/gsutil/oauth2_plugin/__init__.py +22 -0
- data/packages/gsutil/oauth2_plugin/__init__.pyc +0 -0
- data/packages/gsutil/oauth2_plugin/oauth2_client.py +642 -0
- data/packages/gsutil/oauth2_plugin/oauth2_client.pyc +0 -0
- data/packages/gsutil/oauth2_plugin/oauth2_client_test.py +374 -0
- data/packages/gsutil/oauth2_plugin/oauth2_helper.py +110 -0
- data/packages/gsutil/oauth2_plugin/oauth2_helper.pyc +0 -0
- data/packages/gsutil/oauth2_plugin/oauth2_plugin.py +24 -0
- data/packages/gsutil/oauth2_plugin/oauth2_plugin.pyc +0 -0
- data/packages/gsutil/pkg_gen.sh +54 -0
- data/packages/gsutil/pkg_util.py +60 -0
- data/packages/gsutil/setup.py +141 -0
- data/packages/gsutil/third_party/__init__.py +0 -0
- data/packages/gsutil/third_party/__init__.pyc +0 -0
- data/packages/gsutil/third_party/fancy_urllib/README +21 -0
- data/packages/gsutil/third_party/fancy_urllib/__init__.py +398 -0
- data/packages/gsutil/third_party/fancy_urllib/__init__.pyc +0 -0
- data/tasks/rubygem.rake +3 -1
- metadata +770 -7
- metadata.gz.sig +0 -0
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
# Copyright 2012 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
|
+
from gslib.help_provider import HELP_NAME
|
|
16
|
+
from gslib.help_provider import HELP_NAME_ALIASES
|
|
17
|
+
from gslib.help_provider import HELP_ONE_LINE_SUMMARY
|
|
18
|
+
from gslib.help_provider import HelpProvider
|
|
19
|
+
from gslib.help_provider import HELP_TEXT
|
|
20
|
+
from gslib.help_provider import HelpType
|
|
21
|
+
from gslib.help_provider import HELP_TYPE
|
|
22
|
+
|
|
23
|
+
_detailed_help_text = ("""
|
|
24
|
+
<B>OVERVIEW</B>
|
|
25
|
+
Versioning-enabled buckets maintain an archive of objects, providing a way to
|
|
26
|
+
un-delete data that you accidentally deleted, or to retrieve older versions of
|
|
27
|
+
your data. You can turn versioning on or off for a bucket at any time. Turning
|
|
28
|
+
versioning off leaves existing object versions in place, and simply causes the
|
|
29
|
+
bucket to stop accumulating new object versions. In this case, if you upload
|
|
30
|
+
to an existing object the current version is overwritten instead of creating
|
|
31
|
+
a new version.
|
|
32
|
+
|
|
33
|
+
Regardless of whether you have enabled versioning on a bucket, every object
|
|
34
|
+
has two associated positive integer fields:
|
|
35
|
+
- the generation, which is updated when the content of an object is
|
|
36
|
+
overwritten.
|
|
37
|
+
- the meta-generation, which identifies the metadata generation. It starts
|
|
38
|
+
at 1; is updated every time the metadata (e.g., ACL or Content-Type) for a
|
|
39
|
+
given content generation is updated; and gets reset when the generation
|
|
40
|
+
number changes.
|
|
41
|
+
|
|
42
|
+
Of these two integers, only the generation is used when working with versioned
|
|
43
|
+
data. Both generation and meta-generation can be used with concurrency control
|
|
44
|
+
(discussed in a later section).
|
|
45
|
+
|
|
46
|
+
To work with object versioning in gsutil, you can use a flavor of storage URIs
|
|
47
|
+
that that embed the object generation, which we refer to as version-specific URIs.
|
|
48
|
+
For example, the version-less object URI:
|
|
49
|
+
|
|
50
|
+
gs://bucket/object
|
|
51
|
+
|
|
52
|
+
might have have two versions, with these version-specific URIs:
|
|
53
|
+
|
|
54
|
+
gs://bucket/object#1360383693690000
|
|
55
|
+
gs://bucket/object#1360383802725000
|
|
56
|
+
|
|
57
|
+
The following sections discuss how to work with versioning and concurrency
|
|
58
|
+
control.
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
<B>OBJECT VERSIONING</B>
|
|
62
|
+
You can view, enable, and disable object versioning on a bucket using
|
|
63
|
+
the getversioning and setversioning commands. For example:
|
|
64
|
+
|
|
65
|
+
gsutil setversioning on gs://bucket
|
|
66
|
+
|
|
67
|
+
will enable versioning for the named bucket. See 'gsutil help getversioning'
|
|
68
|
+
and 'gsutil help setversioning' for additional details.
|
|
69
|
+
|
|
70
|
+
To see all object versions in a versioning-enabled bucket along with
|
|
71
|
+
their generation.meta-generation information, use gsutil ls -a:
|
|
72
|
+
|
|
73
|
+
gsutil ls -a gs://bucket
|
|
74
|
+
|
|
75
|
+
You can also specify particular objects for which you want to find the
|
|
76
|
+
version-specific URI(s), or you can use wildcards:
|
|
77
|
+
|
|
78
|
+
gsutil ls -a gs://bucket/object1 gs://bucket/images/*.jpg
|
|
79
|
+
|
|
80
|
+
The generation values form a monotonically increasing sequence as you create
|
|
81
|
+
additional object versions. Because of this, the latest object version is
|
|
82
|
+
always the last one listed in the gsutil ls output for a particular object.
|
|
83
|
+
For example, if a bucket contains these three versions of gs://bucket/object:
|
|
84
|
+
|
|
85
|
+
gs://bucket/object#1360035307075000
|
|
86
|
+
gs://bucket/object#1360101007329000
|
|
87
|
+
gs://bucket/object#1360102216114000
|
|
88
|
+
|
|
89
|
+
then gs://bucket/object#1360102216114000 is the latest version and
|
|
90
|
+
gs://bucket/object#1360035307075000 is the oldest available version.
|
|
91
|
+
|
|
92
|
+
If you specify version-less URIs with gsutil, you will operate on the
|
|
93
|
+
latest not-deleted version of an object, for example:
|
|
94
|
+
|
|
95
|
+
gsutil cp gs://bucket/object ./dir
|
|
96
|
+
|
|
97
|
+
or
|
|
98
|
+
|
|
99
|
+
gsutil rm gs://bucket/object
|
|
100
|
+
|
|
101
|
+
To operate on a specific object version, use a version-specific URI.
|
|
102
|
+
For example, suppose the output of the above gsutil ls -a command is:
|
|
103
|
+
|
|
104
|
+
gs://bucket/object#1360035307075000
|
|
105
|
+
gs://bucket/object#1360101007329000
|
|
106
|
+
|
|
107
|
+
In this case, the command:
|
|
108
|
+
|
|
109
|
+
gsutil cp gs://bucket/object#1360035307075000 ./dir
|
|
110
|
+
|
|
111
|
+
will retrieve the second most recent version of the object.
|
|
112
|
+
|
|
113
|
+
Note that version-specific URIs cannot be the target of the gsutil cp
|
|
114
|
+
command (trying to do so will result in an error), because writing to a
|
|
115
|
+
versioned object always creates a new version.
|
|
116
|
+
|
|
117
|
+
If an object has been deleted, it will not show up in a normal gsutil ls
|
|
118
|
+
listing (i.e., ls without the -a option). You can restore a deleted object by
|
|
119
|
+
running gsutil ls -a to find the available versions, and then copying one of
|
|
120
|
+
the version-specific URIs to the version-less URI, for example:
|
|
121
|
+
|
|
122
|
+
gsutil cp gs://bucket/object#1360101007329000 gs://bucket/object
|
|
123
|
+
|
|
124
|
+
Note that when you do this it creates a new object version, which will incur
|
|
125
|
+
additional charges. You can get rid of the extra copy by deleting the older
|
|
126
|
+
version-specfic object:
|
|
127
|
+
|
|
128
|
+
gsutil rm gs://bucket/object#1360101007329000
|
|
129
|
+
|
|
130
|
+
Or you can combine the two steps by using the gsutil mv command:
|
|
131
|
+
|
|
132
|
+
gsutil mv gs://bucket/object#1360101007329000 gs://bucket/object
|
|
133
|
+
|
|
134
|
+
If you want to remove all versions of an object use the gsutil rm -a option:
|
|
135
|
+
|
|
136
|
+
gsutil rm -a gs://bucket/object
|
|
137
|
+
|
|
138
|
+
Note that there is no limit to the number of older versions of an object you
|
|
139
|
+
will create if you continue to upload to the same object in a versioning-
|
|
140
|
+
enabled bucket. It is your responsibility to delete versions beyond the ones
|
|
141
|
+
you want to retain.
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
<B>CONCURRENCY CONTROL</B>
|
|
145
|
+
If you are building an application using Google Cloud Storage, you may need to
|
|
146
|
+
be careful about concurrency control. Normally gsutil itself isn't used for
|
|
147
|
+
this purpose, but it's possible to write scripts around gsutil that perform
|
|
148
|
+
concurrency control.
|
|
149
|
+
|
|
150
|
+
For example, suppose you want to implement a "rolling update" system using
|
|
151
|
+
gsutil, where a periodic job computes some data and uploads it to the cloud.
|
|
152
|
+
On each run, the job starts with the data that it computed from last run, and
|
|
153
|
+
computes a new value. To make this system robust, you need to have multiple
|
|
154
|
+
machines on which the job can run, which raises the possibility that two
|
|
155
|
+
simultaneous runs could attempt to update an object at the same time. This
|
|
156
|
+
leads to the following potential race condition:
|
|
157
|
+
- job 1 computes the new value to be written
|
|
158
|
+
- job 2 computes the new value to be written
|
|
159
|
+
- job 2 writes the new value
|
|
160
|
+
- job 1 writes the new value
|
|
161
|
+
|
|
162
|
+
In this case, the value that job 1 read is no longer current by the time
|
|
163
|
+
it goes to write the updated object, and writing at this point would result
|
|
164
|
+
in stale (or, depending on the application, corrupt) data.
|
|
165
|
+
|
|
166
|
+
To prevent this, you can find the version-specific name of the object that was
|
|
167
|
+
created, and then use the information contained in that URI to specify an
|
|
168
|
+
x-goog-if-generation-match header on a subsequent gsutil cp command. You can
|
|
169
|
+
do this in two steps. First, use the gsutil cp -v option at upload time to get
|
|
170
|
+
the version-specific name of the object that was created, for example:
|
|
171
|
+
|
|
172
|
+
gsutil cp -v file gs://bucket/object
|
|
173
|
+
|
|
174
|
+
might output:
|
|
175
|
+
|
|
176
|
+
Created: gs://bucket/object#1360432179236000
|
|
177
|
+
|
|
178
|
+
You can extract the generation value from this object and then construct a
|
|
179
|
+
subsequent gsutil command like this:
|
|
180
|
+
|
|
181
|
+
gsutil -h x-goog-if-generation-match:1360432179236000 cp newfile \\
|
|
182
|
+
gs://bucket/object
|
|
183
|
+
|
|
184
|
+
This command requests Google Cloud Storage to attempt to upload newfile
|
|
185
|
+
but to fail the request if the generation of newfile that is live at the
|
|
186
|
+
time of the upload does not match that specified.
|
|
187
|
+
|
|
188
|
+
If the command you use updates object metadata, you will need to find the
|
|
189
|
+
current meta_generation for an object. To do this, use the gsutil ls -a and
|
|
190
|
+
-l options. For example, the command:
|
|
191
|
+
|
|
192
|
+
gsutil ls -l -a gs://bucket/object
|
|
193
|
+
|
|
194
|
+
will output something like:
|
|
195
|
+
|
|
196
|
+
64 2013-02-12T19:59:13 gs://bucket/object#1360699153986000 meta_generation=3
|
|
197
|
+
1521 2013-02-13T02:04:08 gs://bucket/object#1360721048778000 meta_generation=2
|
|
198
|
+
|
|
199
|
+
Given this information, you could use the following command to request setting
|
|
200
|
+
the ACL on the older version of the object, such that the command will fail
|
|
201
|
+
unless that is the current version of the data+metadata:
|
|
202
|
+
|
|
203
|
+
gsutil -h x-goog-if-generation-match:1360699153986000 -h \\
|
|
204
|
+
x-goog-if-metageneration-match:3 setacl public-read \\
|
|
205
|
+
gs://bucket/object#1360699153986000
|
|
206
|
+
|
|
207
|
+
Without adding these headers, the update would simply overwrite the existing
|
|
208
|
+
ACL. Note that in contrast, the gsutil chacl command uses these headers
|
|
209
|
+
automatically, because it performs a read-modify-write cycle in order to edit
|
|
210
|
+
ACLs.
|
|
211
|
+
|
|
212
|
+
If you want to experiment with how generations and metagenerations work, try
|
|
213
|
+
the following. First, upload an object; then use gsutil ls -l -a to list all
|
|
214
|
+
versions of the object, along with each version's meta_generation; then re-
|
|
215
|
+
upload the object and repeat the gsutil ls -l -a. You should see two object
|
|
216
|
+
versions, each with meta_generation=1. Now try setting the ACL, and rerun the
|
|
217
|
+
gsutil ls -l -a. You should see the most recent object generation now has
|
|
218
|
+
meta_generation=2.
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
<B>FOR MORE INFORMATION</B>
|
|
222
|
+
For more details on how to use versioning and preconditions, see
|
|
223
|
+
https://developers.google.com/storage/docs/object-versioning
|
|
224
|
+
""")
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
class CommandOptions(HelpProvider):
|
|
228
|
+
"""Additional help about object versioning."""
|
|
229
|
+
|
|
230
|
+
help_spec = {
|
|
231
|
+
# Name of command or auxiliary help info for which this help applies.
|
|
232
|
+
HELP_NAME : 'versioning',
|
|
233
|
+
# List of help name aliases.
|
|
234
|
+
HELP_NAME_ALIASES : ['concurrency', 'concurrency control', 'versioning',
|
|
235
|
+
'versions'],
|
|
236
|
+
# Type of help:
|
|
237
|
+
HELP_TYPE : HelpType.ADDITIONAL_HELP,
|
|
238
|
+
# One line summary of this help.
|
|
239
|
+
HELP_ONE_LINE_SUMMARY : 'Working with object versions; concurrency control',
|
|
240
|
+
# The full help text.
|
|
241
|
+
HELP_TEXT : _detailed_help_text,
|
|
242
|
+
}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
# Copyright 2012 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
|
+
from gslib.help_provider import HELP_NAME
|
|
16
|
+
from gslib.help_provider import HELP_NAME_ALIASES
|
|
17
|
+
from gslib.help_provider import HELP_ONE_LINE_SUMMARY
|
|
18
|
+
from gslib.help_provider import HelpProvider
|
|
19
|
+
from gslib.help_provider import HELP_TEXT
|
|
20
|
+
from gslib.help_provider import HelpType
|
|
21
|
+
from gslib.help_provider import HELP_TYPE
|
|
22
|
+
|
|
23
|
+
_detailed_help_text = ("""
|
|
24
|
+
<B>DESCRIPTION</B>
|
|
25
|
+
gsutil supports URI wildcards. For example, the command:
|
|
26
|
+
|
|
27
|
+
gsutil cp gs://bucket/data/abc* .
|
|
28
|
+
|
|
29
|
+
will copy all objects that start with gs://bucket/data/abc followed by any
|
|
30
|
+
number of characters within that subdirectory.
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
<B>DIRECTORY BY DIRECTORY VS RECURSIVE WILDCARDS</B>
|
|
34
|
+
The "*" wildcard only matches up to the end of a path within
|
|
35
|
+
a subdirectory. For example, if bucket contains objects
|
|
36
|
+
named gs://bucket/data/abcd, gs://bucket/data/abcdef,
|
|
37
|
+
and gs://bucket/data/abcxyx, as well as an object in a sub-directory
|
|
38
|
+
(gs://bucket/data/abc/def) the above gsutil cp command would match the
|
|
39
|
+
first 3 object names but not the last one.
|
|
40
|
+
|
|
41
|
+
If you want matches to span directory boundaries, use a '**' wildcard:
|
|
42
|
+
|
|
43
|
+
gsutil cp gs://bucket/data/abc** .
|
|
44
|
+
|
|
45
|
+
will match all four objects above.
|
|
46
|
+
|
|
47
|
+
Note that gsutil supports the same wildcards for both objects and file names.
|
|
48
|
+
Thus, for example:
|
|
49
|
+
|
|
50
|
+
gsutil cp data/abc* gs://bucket
|
|
51
|
+
|
|
52
|
+
will match all names in the local file system. Most command shells also
|
|
53
|
+
support wildcarding, so if you run the above command probably your shell
|
|
54
|
+
is expanding the matches before running gsutil. However, most shells do not
|
|
55
|
+
support recursive wildcards ('**'), and you can cause gsutil's wildcarding
|
|
56
|
+
support to work for such shells by single-quoting the arguments so they
|
|
57
|
+
don't get interpreted by the shell before being passed to gsutil:
|
|
58
|
+
|
|
59
|
+
gsutil cp 'data/abc**' gs://bucket
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
<B>BUCKET WILDCARDS</B>
|
|
63
|
+
You can specify wildcards for bucket names. For example:
|
|
64
|
+
|
|
65
|
+
gsutil ls gs://data*.example.com
|
|
66
|
+
|
|
67
|
+
will list the contents of all buckets whose name starts with "data" and
|
|
68
|
+
ends with ".example.com".
|
|
69
|
+
|
|
70
|
+
You can also combine bucket and object name wildcards. For example this
|
|
71
|
+
command will remove all ".txt" files in any of your Google Cloud Storage
|
|
72
|
+
buckets:
|
|
73
|
+
|
|
74
|
+
gsutil rm gs://*/**.txt
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
<B>OTHER WILDCARD CHARACTERS</B>
|
|
78
|
+
In addition to '*', you can use these wildcards:
|
|
79
|
+
|
|
80
|
+
? Matches a single character. For example "gs://bucket/??.txt"
|
|
81
|
+
only matches objects with two characters followed by .txt.
|
|
82
|
+
|
|
83
|
+
[chars] Match any of the specified characters. For example
|
|
84
|
+
"gs://bucket/[aeiou].txt" matches objects that contain a single vowel
|
|
85
|
+
character followed by .txt
|
|
86
|
+
|
|
87
|
+
[char range] Match any of the range of characters. For example
|
|
88
|
+
"gs://bucket/[a-m].txt" matches objects that contain letters
|
|
89
|
+
a, b, c, ... or m, and end with .txt.
|
|
90
|
+
|
|
91
|
+
You can combine wildcards to provide more powerful matches, for example:
|
|
92
|
+
gs://bucket/[a-m]??.j*g
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
<B>EFFICIENCY CONSIDERATION: USING WILDCARDS OVER MANY OBJECTS</B>
|
|
96
|
+
It is more efficient, faster, and less network traffic-intensive
|
|
97
|
+
to use wildcards that have a non-wildcard object-name prefix, like:
|
|
98
|
+
|
|
99
|
+
gs://bucket/abc*.txt
|
|
100
|
+
|
|
101
|
+
than it is to use wildcards as the first part of the object name, like:
|
|
102
|
+
|
|
103
|
+
gs://bucket/*abc.txt
|
|
104
|
+
|
|
105
|
+
This is because the request for "gs://bucket/abc*.txt" asks the server
|
|
106
|
+
to send back the subset of results whose object names start with "abc",
|
|
107
|
+
and then gsutil filters the result list for objects whose name ends with
|
|
108
|
+
".txt". In contrast, "gs://bucket/*abc.txt" asks the server for the complete
|
|
109
|
+
list of objects in the bucket and then filters for those objects whose name
|
|
110
|
+
ends with "abc.txt". This efficiency consideration becomes increasingly
|
|
111
|
+
noticeable when you use buckets containing thousands or more objects. It is
|
|
112
|
+
sometimes possible to set up the names of your objects to fit with expected
|
|
113
|
+
wildcard matching patterns, to take advantage of the efficiency of doing
|
|
114
|
+
server-side prefix requests. See, for example "gsutil help prod" for a
|
|
115
|
+
concrete use case example.
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
<B>EFFICIENCY CONSIDERATION: USING MID-PATH WILDCARDS</B>
|
|
119
|
+
Suppose you have a bucket with these objects:
|
|
120
|
+
gs://bucket/obj1
|
|
121
|
+
gs://bucket/obj2
|
|
122
|
+
gs://bucket/obj3
|
|
123
|
+
gs://bucket/obj4
|
|
124
|
+
gs://bucket/dir1/obj5
|
|
125
|
+
gs://bucket/dir2/obj6
|
|
126
|
+
|
|
127
|
+
If you run the command:
|
|
128
|
+
gsutil ls gs://bucket/*/obj5
|
|
129
|
+
gsutil will perform a /-delimited top-level bucket listing and then one bucket
|
|
130
|
+
listing for each subdirectory, for a total of 3 bucket listings:
|
|
131
|
+
GET /bucket/?delimiter=/
|
|
132
|
+
GET /bucket/?prefix=dir1/obj5&delimiter=/
|
|
133
|
+
GET /bucket/?prefix=dir2/obj5&delimiter=/
|
|
134
|
+
|
|
135
|
+
The more bucket listings your wildcard requires, the slower and more expensive
|
|
136
|
+
it will be. The number of bucket listings required grows as:
|
|
137
|
+
- the number of wildcard components (e.g., "gs://bucket/a??b/c*/*/d"
|
|
138
|
+
has 3 wildcard components);
|
|
139
|
+
- the number of subdirectories that match each component; and
|
|
140
|
+
- the number of results (pagination is implemented using one GET
|
|
141
|
+
request per 1000 results, specifying markers for each).
|
|
142
|
+
|
|
143
|
+
If you want to use a mid-path wildcard, you might try instead using a
|
|
144
|
+
recursive wildcard, for example:
|
|
145
|
+
|
|
146
|
+
gsutil ls gs://bucket/**/obj5
|
|
147
|
+
|
|
148
|
+
This will match more objects than gs://bucket/*/obj5 (since it spans
|
|
149
|
+
directories), but is implemented using a delimiter-less bucket listing
|
|
150
|
+
request (which means fewer bucket requests, though it will list the entire
|
|
151
|
+
bucket and filter locally, so that could require a non-trivial amount of
|
|
152
|
+
network traffic).
|
|
153
|
+
""")
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
class CommandOptions(HelpProvider):
|
|
157
|
+
"""Additional help about wildcards."""
|
|
158
|
+
|
|
159
|
+
help_spec = {
|
|
160
|
+
# Name of command or auxiliary help info for which this help applies.
|
|
161
|
+
HELP_NAME : 'wildcards',
|
|
162
|
+
# List of help name aliases.
|
|
163
|
+
HELP_NAME_ALIASES : ['wildcard', '*', '**'],
|
|
164
|
+
# Type of help:
|
|
165
|
+
HELP_TYPE : HelpType.ADDITIONAL_HELP,
|
|
166
|
+
# One line summary of this help.
|
|
167
|
+
HELP_ONE_LINE_SUMMARY : 'Wildcard support',
|
|
168
|
+
# The full help text.
|
|
169
|
+
HELP_TEXT : _detailed_help_text,
|
|
170
|
+
}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
# Copyright 2012 Google Inc. All Rights Reserved.
|
|
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 time
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class BucketListingRef(object):
|
|
26
|
+
"""
|
|
27
|
+
Container that holds a reference to one result from a bucket listing, allowing
|
|
28
|
+
polymorphic iteration over wildcard-iterated URIs, Keys, or Prefixes. At a
|
|
29
|
+
minimum, every reference contains a StorageUri. If the reference came from a
|
|
30
|
+
bucket listing (as opposed to a manually instantiated ref that might populate
|
|
31
|
+
only the StorageUri), it will additionally contain either a Key or a Prefix,
|
|
32
|
+
depending on whether it was a reference to an object or was just a prefix of a
|
|
33
|
+
path (i.e., bucket subdirectory). The latter happens when the bucket was
|
|
34
|
+
listed using delimiter='/'.
|
|
35
|
+
|
|
36
|
+
Note that Keys are shallow-populated, based on the contents extracted from
|
|
37
|
+
parsing a bucket listing. This includes name, length, and other fields
|
|
38
|
+
(basically, the info listed by gsutil ls -l), but does not include information
|
|
39
|
+
like ACL and location (which require separate server requests, which is why
|
|
40
|
+
there's a separate gsutil ls -L option to get this more detailed info).
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
def __init__(self, uri, key=None, prefix=None, headers=None):
|
|
44
|
+
"""Instantiate BucketListingRef from uri and (if available) key or prefix.
|
|
45
|
+
|
|
46
|
+
Args:
|
|
47
|
+
uri: StorageUri for the object (required).
|
|
48
|
+
key: Key for the object, or None if not available.
|
|
49
|
+
prefix: Prefix for the subdir, or None if not available.
|
|
50
|
+
headers: Dictionary containing optional HTTP headers to pass to boto
|
|
51
|
+
(which happens when GetKey() is called on an BucketListingRef which
|
|
52
|
+
has no constructor-populated Key), or None if not available.
|
|
53
|
+
|
|
54
|
+
At most one of key and prefix can be populated.
|
|
55
|
+
"""
|
|
56
|
+
assert key is None or prefix is None
|
|
57
|
+
self.uri = uri
|
|
58
|
+
self.key = key
|
|
59
|
+
self.prefix = prefix
|
|
60
|
+
self.headers = headers or {}
|
|
61
|
+
|
|
62
|
+
def GetUri(self):
|
|
63
|
+
"""Get URI form of listed URI.
|
|
64
|
+
|
|
65
|
+
Returns:
|
|
66
|
+
StorageUri.
|
|
67
|
+
"""
|
|
68
|
+
return self.uri
|
|
69
|
+
|
|
70
|
+
def GetUriString(self):
|
|
71
|
+
"""Get string URI form of listed URI.
|
|
72
|
+
|
|
73
|
+
Returns:
|
|
74
|
+
String.
|
|
75
|
+
"""
|
|
76
|
+
return self.uri.uri
|
|
77
|
+
|
|
78
|
+
def NamesBucket(self):
|
|
79
|
+
"""Determines if this BucketListingRef names a bucket.
|
|
80
|
+
|
|
81
|
+
Returns:
|
|
82
|
+
bool indicator.
|
|
83
|
+
"""
|
|
84
|
+
return self.key is None and self.prefix is None and self.uri.names_bucket()
|
|
85
|
+
|
|
86
|
+
def IsLatest(self):
|
|
87
|
+
"""Determines if this BucketListingRef names the latest version of an
|
|
88
|
+
object.
|
|
89
|
+
|
|
90
|
+
Returns:
|
|
91
|
+
bool indicator.
|
|
92
|
+
"""
|
|
93
|
+
return hasattr(self.uri, 'is_latest') and self.uri.is_latest
|
|
94
|
+
|
|
95
|
+
def GetRStrippedUriString(self):
|
|
96
|
+
"""Get string URI form of listed URI, stripped of any right trailing
|
|
97
|
+
delims, and without version string.
|
|
98
|
+
|
|
99
|
+
Returns:
|
|
100
|
+
String.
|
|
101
|
+
"""
|
|
102
|
+
return self.uri.versionless_uri.rstrip('/')
|
|
103
|
+
|
|
104
|
+
def HasKey(self):
|
|
105
|
+
"""Return bool indicator of whether this BucketListingRef has a Key."""
|
|
106
|
+
return bool(self.key)
|
|
107
|
+
|
|
108
|
+
def HasPrefix(self):
|
|
109
|
+
"""Return bool indicator of whether this BucketListingRef has a Prefix."""
|
|
110
|
+
return bool(self.prefix)
|
|
111
|
+
|
|
112
|
+
def GetKey(self):
|
|
113
|
+
"""Get Key form of listed URI.
|
|
114
|
+
|
|
115
|
+
Returns:
|
|
116
|
+
Subclass of boto.s3.key.Key.
|
|
117
|
+
|
|
118
|
+
Raises:
|
|
119
|
+
BucketListingRefException: for bucket-only uri.
|
|
120
|
+
"""
|
|
121
|
+
# For gsutil ls -l gs://bucket self.key will be populated from (boto)
|
|
122
|
+
# parsing the bucket listing. But as noted and handled below there are
|
|
123
|
+
# cases where self.key isn't populated.
|
|
124
|
+
if not self.key:
|
|
125
|
+
if not self.uri.names_object():
|
|
126
|
+
raise BucketListingRefException(
|
|
127
|
+
'Attempt to call GetKey() on Key-less BucketListingRef (uri=%s) ' %
|
|
128
|
+
self.uri)
|
|
129
|
+
# This case happens when we do gsutil ls -l on a object name-ful
|
|
130
|
+
# StorageUri with no object-name wildcard. Since the ls command
|
|
131
|
+
# implementation only reads bucket info we need to read the object
|
|
132
|
+
# for this case.
|
|
133
|
+
self.key = self.uri.get_key(validate=False, headers=self.headers)
|
|
134
|
+
# When we retrieve the object this way its last_modified timestamp
|
|
135
|
+
# is formatted in RFC 1123 format, which is different from when we
|
|
136
|
+
# retrieve from the bucket listing (which uses ISO 8601 format), so
|
|
137
|
+
# convert so we consistently return ISO 8601 format.
|
|
138
|
+
tuple_time = (time.strptime(self.key.last_modified,
|
|
139
|
+
'%a, %d %b %Y %H:%M:%S %Z'))
|
|
140
|
+
self.key.last_modified = time.strftime('%Y-%m-%dT%H:%M:%S', tuple_time)
|
|
141
|
+
return self.key
|
|
142
|
+
|
|
143
|
+
def GetPrefix(self):
|
|
144
|
+
"""Get Prefix form of listed URI.
|
|
145
|
+
|
|
146
|
+
Returns:
|
|
147
|
+
boto.s3.prefix.Prefix.
|
|
148
|
+
|
|
149
|
+
Raises:
|
|
150
|
+
BucketListingRefException: if this object has no Prefix.
|
|
151
|
+
"""
|
|
152
|
+
if not self.prefix:
|
|
153
|
+
raise BucketListingRefException(
|
|
154
|
+
'Attempt to call GetPrefix() on Prefix-less BucketListingRef '
|
|
155
|
+
'(uri=%s)' % self.uri)
|
|
156
|
+
return self.prefix
|
|
157
|
+
|
|
158
|
+
def __repr__(self):
|
|
159
|
+
"""Returns string representation of BucketListingRef."""
|
|
160
|
+
return 'BucketListingRef(%s, HasKey=%s, HasPrefix=%s)' % (
|
|
161
|
+
self.uri, self.HasKey(), self.HasPrefix())
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
class BucketListingRefException(StandardError):
|
|
165
|
+
"""Exception thrown for invalid BucketListingRef requests."""
|
|
166
|
+
|
|
167
|
+
def __init__(self, reason):
|
|
168
|
+
StandardError.__init__(self)
|
|
169
|
+
self.reason = reason
|
|
170
|
+
|
|
171
|
+
def __repr__(self):
|
|
172
|
+
return 'BucketListingRefException: %s' % self.reason
|
|
173
|
+
|
|
174
|
+
def __str__(self):
|
|
175
|
+
return 'BucketListingRefException: %s' % self.reason
|