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
|
Binary file
|
|
@@ -0,0 +1,145 @@
|
|
|
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
|
+
import xml.sax
|
|
16
|
+
from boto import handler
|
|
17
|
+
from boto.gs.cors import Cors
|
|
18
|
+
from gslib.command import Command
|
|
19
|
+
from gslib.command import COMMAND_NAME
|
|
20
|
+
from gslib.command import COMMAND_NAME_ALIASES
|
|
21
|
+
from gslib.command import CONFIG_REQUIRED
|
|
22
|
+
from gslib.command import FILE_URIS_OK
|
|
23
|
+
from gslib.command import MAX_ARGS
|
|
24
|
+
from gslib.command import MIN_ARGS
|
|
25
|
+
from gslib.command import PROVIDER_URIS_OK
|
|
26
|
+
from gslib.command import SUPPORTED_SUB_ARGS
|
|
27
|
+
from gslib.command import URIS_START_ARG
|
|
28
|
+
from gslib.exception import CommandException
|
|
29
|
+
from gslib.help_provider import HELP_NAME
|
|
30
|
+
from gslib.help_provider import HELP_NAME_ALIASES
|
|
31
|
+
from gslib.help_provider import HELP_ONE_LINE_SUMMARY
|
|
32
|
+
from gslib.help_provider import HELP_TEXT
|
|
33
|
+
from gslib.help_provider import HelpType
|
|
34
|
+
from gslib.help_provider import HELP_TYPE
|
|
35
|
+
from gslib.util import NO_MAX
|
|
36
|
+
|
|
37
|
+
_detailed_help_text = ("""
|
|
38
|
+
<B>SYNOPSIS</B>
|
|
39
|
+
gsutil setcors cors-xml-file uri...
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
<B>DESCRIPTION</B>
|
|
43
|
+
Sets the Cross-Origin Resource Sharing (CORS) configuration on one or more
|
|
44
|
+
buckets. This command is supported for buckets only, not objects. The
|
|
45
|
+
cors-xml-file specified on the command line should be a path to a local
|
|
46
|
+
file containing an XML document with the following structure:
|
|
47
|
+
|
|
48
|
+
<?xml version="1.0" ?>
|
|
49
|
+
<CorsConfig>
|
|
50
|
+
<Cors>
|
|
51
|
+
<Origins>
|
|
52
|
+
<Origin>http://origin1.example.com</Origin>
|
|
53
|
+
</Origins>
|
|
54
|
+
<Methods>
|
|
55
|
+
<Method>GET</Method>
|
|
56
|
+
</Methods>
|
|
57
|
+
<ResponseHeaders>
|
|
58
|
+
<ResponseHeader>Content-Type</ResponseHeader>
|
|
59
|
+
</ResponseHeaders>
|
|
60
|
+
</Cors>
|
|
61
|
+
</CorsConfig>
|
|
62
|
+
|
|
63
|
+
The above XML document explicitly allows cross-origin GET requests from
|
|
64
|
+
http://origin1.example.com and may include the Content-Type response header.
|
|
65
|
+
|
|
66
|
+
For more info about CORS, see http://www.w3.org/TR/cors/.
|
|
67
|
+
""")
|
|
68
|
+
|
|
69
|
+
class SetCorsCommand(Command):
|
|
70
|
+
"""Implementation of gsutil setcors command."""
|
|
71
|
+
|
|
72
|
+
# Command specification (processed by parent class).
|
|
73
|
+
command_spec = {
|
|
74
|
+
# Name of command.
|
|
75
|
+
COMMAND_NAME : 'setcors',
|
|
76
|
+
# List of command name aliases.
|
|
77
|
+
COMMAND_NAME_ALIASES : [],
|
|
78
|
+
# Min number of args required by this command.
|
|
79
|
+
MIN_ARGS : 2,
|
|
80
|
+
# Max number of args required by this command, or NO_MAX.
|
|
81
|
+
MAX_ARGS : NO_MAX,
|
|
82
|
+
# Getopt-style string specifying acceptable sub args.
|
|
83
|
+
SUPPORTED_SUB_ARGS : '',
|
|
84
|
+
# True if file URIs acceptable for this command.
|
|
85
|
+
FILE_URIS_OK : False,
|
|
86
|
+
# True if provider-only URIs acceptable for this command.
|
|
87
|
+
PROVIDER_URIS_OK : False,
|
|
88
|
+
# Index in args of first URI arg.
|
|
89
|
+
URIS_START_ARG : 1,
|
|
90
|
+
# True if must configure gsutil before running command.
|
|
91
|
+
CONFIG_REQUIRED : True,
|
|
92
|
+
}
|
|
93
|
+
help_spec = {
|
|
94
|
+
# Name of command or auxiliary help info for which this help applies.
|
|
95
|
+
HELP_NAME : 'setcors',
|
|
96
|
+
# List of help name aliases.
|
|
97
|
+
HELP_NAME_ALIASES : ['cors', 'cross-origin'],
|
|
98
|
+
# Type of help)
|
|
99
|
+
HELP_TYPE : HelpType.COMMAND_HELP,
|
|
100
|
+
# One line summary of this help.
|
|
101
|
+
HELP_ONE_LINE_SUMMARY : 'Set a CORS XML document for one or more buckets',
|
|
102
|
+
# The full help text.
|
|
103
|
+
HELP_TEXT : _detailed_help_text,
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
# Command entry point.
|
|
107
|
+
def RunCommand(self):
|
|
108
|
+
cors_arg = self.args[0]
|
|
109
|
+
uri_args = self.args[1:]
|
|
110
|
+
# Disallow multi-provider setcors requests.
|
|
111
|
+
storage_uri = self.UrisAreForSingleProvider(uri_args)
|
|
112
|
+
if not storage_uri:
|
|
113
|
+
raise CommandException('"%s" command spanning providers not allowed.' %
|
|
114
|
+
self.command_name)
|
|
115
|
+
|
|
116
|
+
# Open, read and parse file containing XML document.
|
|
117
|
+
cors_file = open(cors_arg, 'r')
|
|
118
|
+
cors_txt = cors_file.read()
|
|
119
|
+
cors_file.close()
|
|
120
|
+
cors_obj = Cors()
|
|
121
|
+
|
|
122
|
+
# Parse XML document and convert into Cors object.
|
|
123
|
+
h = handler.XmlHandler(cors_obj, None)
|
|
124
|
+
try:
|
|
125
|
+
xml.sax.parseString(cors_txt, h)
|
|
126
|
+
except xml.sax._exceptions.SAXParseException, e:
|
|
127
|
+
raise CommandException('Requested CORS is invalid: %s at line %s, '
|
|
128
|
+
'column %s' % (e.getMessage(), e.getLineNumber(),
|
|
129
|
+
e.getColumnNumber()))
|
|
130
|
+
|
|
131
|
+
# Iterate over URIs, expanding wildcards, and setting the CORS on each.
|
|
132
|
+
some_matched = False
|
|
133
|
+
for uri_str in uri_args:
|
|
134
|
+
for blr in self.WildcardIterator(uri_str):
|
|
135
|
+
uri = blr.GetUri()
|
|
136
|
+
if not uri.names_bucket():
|
|
137
|
+
raise CommandException('URI %s must name a bucket for the %s command'
|
|
138
|
+
% (str(uri), self.command_name))
|
|
139
|
+
some_matched = True
|
|
140
|
+
print 'Setting CORS on %s...' % uri
|
|
141
|
+
uri.set_cors(cors_obj, False, self.headers)
|
|
142
|
+
if not some_matched:
|
|
143
|
+
raise CommandException('No URIs matched')
|
|
144
|
+
|
|
145
|
+
return 0
|
|
Binary file
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# Copyright 2011 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.command import Command
|
|
16
|
+
from gslib.command import COMMAND_NAME
|
|
17
|
+
from gslib.command import COMMAND_NAME_ALIASES
|
|
18
|
+
from gslib.command import CONFIG_REQUIRED
|
|
19
|
+
from gslib.command import FILE_URIS_OK
|
|
20
|
+
from gslib.command import MAX_ARGS
|
|
21
|
+
from gslib.command import MIN_ARGS
|
|
22
|
+
from gslib.command import PROVIDER_URIS_OK
|
|
23
|
+
from gslib.command import SUPPORTED_SUB_ARGS
|
|
24
|
+
from gslib.command import URIS_START_ARG
|
|
25
|
+
from gslib.exception import CommandException
|
|
26
|
+
from gslib.help_provider import HELP_NAME
|
|
27
|
+
from gslib.help_provider import HELP_NAME_ALIASES
|
|
28
|
+
from gslib.help_provider import HELP_ONE_LINE_SUMMARY
|
|
29
|
+
from gslib.help_provider import HELP_TEXT
|
|
30
|
+
from gslib.help_provider import HelpType
|
|
31
|
+
from gslib.help_provider import HELP_TYPE
|
|
32
|
+
from gslib.util import NO_MAX
|
|
33
|
+
|
|
34
|
+
_detailed_help_text = ("""
|
|
35
|
+
<B>SYNOPSIS</B>
|
|
36
|
+
gsutil setdefacl file-or-canned_acl_name uri...
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
<B>DESCRIPTION</B>
|
|
40
|
+
|
|
41
|
+
The setdefacl command sets default object ACLs for the specified buckets. If
|
|
42
|
+
you specify a default object ACL for a certain bucket, Google Cloud Storage
|
|
43
|
+
applies the default object ACL to all new objects uploaded to that bucket.
|
|
44
|
+
|
|
45
|
+
Similar to the setacl command, the file-or-canned_acl_name names either a
|
|
46
|
+
canned ACL or the path to a file that contains ACL XML. (See "gsutil
|
|
47
|
+
help setacl" for examples of editing and setting ACLs via the
|
|
48
|
+
getacl/setacl commands.)
|
|
49
|
+
|
|
50
|
+
If you don't set a default object ACL on a bucket, the bucket's default
|
|
51
|
+
object ACL will be project-private.
|
|
52
|
+
|
|
53
|
+
Setting a default object ACL on a bucket provides a convenient way
|
|
54
|
+
to ensure newly uploaded objects have a specific ACL, and avoids the
|
|
55
|
+
need to back after the fact and set ACLs on a large number of objects
|
|
56
|
+
for which you forgot to set the ACL at object upload time (which can
|
|
57
|
+
happen if you don't set a default object ACL on a bucket, and get the
|
|
58
|
+
default project-private ACL).
|
|
59
|
+
""")
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class SetDefAclCommand(Command):
|
|
63
|
+
"""Implementation of gsutil setdefacl command."""
|
|
64
|
+
|
|
65
|
+
# Command specification (processed by parent class).
|
|
66
|
+
command_spec = {
|
|
67
|
+
# Name of command.
|
|
68
|
+
COMMAND_NAME : 'setdefacl',
|
|
69
|
+
# List of command name aliases.
|
|
70
|
+
COMMAND_NAME_ALIASES : [],
|
|
71
|
+
# Min number of args required by this command.
|
|
72
|
+
MIN_ARGS : 2,
|
|
73
|
+
# Max number of args required by this command, or NO_MAX.
|
|
74
|
+
MAX_ARGS : NO_MAX,
|
|
75
|
+
# Getopt-style string specifying acceptable sub args.
|
|
76
|
+
SUPPORTED_SUB_ARGS : '',
|
|
77
|
+
# True if file URIs acceptable for this command.
|
|
78
|
+
FILE_URIS_OK : False,
|
|
79
|
+
# True if provider-only URIs acceptable for this command.
|
|
80
|
+
PROVIDER_URIS_OK : False,
|
|
81
|
+
# Index in args of first URI arg.
|
|
82
|
+
URIS_START_ARG : 1,
|
|
83
|
+
# True if must configure gsutil before running command.
|
|
84
|
+
CONFIG_REQUIRED : True,
|
|
85
|
+
}
|
|
86
|
+
help_spec = {
|
|
87
|
+
# Name of command or auxiliary help info for which this help applies.
|
|
88
|
+
HELP_NAME : 'setdefacl',
|
|
89
|
+
# List of help name aliases.
|
|
90
|
+
HELP_NAME_ALIASES : ['default acl'],
|
|
91
|
+
# Type of help:
|
|
92
|
+
HELP_TYPE : HelpType.COMMAND_HELP,
|
|
93
|
+
# One line summary of this help.
|
|
94
|
+
HELP_ONE_LINE_SUMMARY : 'Set default ACL on buckets',
|
|
95
|
+
# The full help text.
|
|
96
|
+
HELP_TEXT : _detailed_help_text,
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
# Command entry point.
|
|
100
|
+
def RunCommand(self):
|
|
101
|
+
if not self.suri_builder.StorageUri(self.args[-1]).names_bucket():
|
|
102
|
+
raise CommandException('URI must name a bucket for the %s command' %
|
|
103
|
+
self.command_name)
|
|
104
|
+
self.SetAclCommandHelper()
|
|
105
|
+
return 0
|
|
Binary file
|
|
@@ -0,0 +1,428 @@
|
|
|
1
|
+
# Copyright 2012 Google Inc. All Rights Reserved.
|
|
2
|
+
#coding=utf8
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
import boto
|
|
17
|
+
import csv
|
|
18
|
+
import random
|
|
19
|
+
import StringIO
|
|
20
|
+
import time
|
|
21
|
+
|
|
22
|
+
from boto.exception import GSResponseError
|
|
23
|
+
from boto.s3.key import Key
|
|
24
|
+
from gslib.command import COMMAND_NAME
|
|
25
|
+
from gslib.command import COMMAND_NAME_ALIASES
|
|
26
|
+
from gslib.command import CONFIG_REQUIRED
|
|
27
|
+
from gslib.command import Command
|
|
28
|
+
from gslib.command import FILE_URIS_OK
|
|
29
|
+
from gslib.command import MAX_ARGS
|
|
30
|
+
from gslib.command import MIN_ARGS
|
|
31
|
+
from gslib.command import PROVIDER_URIS_OK
|
|
32
|
+
from gslib.command import SUPPORTED_SUB_ARGS
|
|
33
|
+
from gslib.command import URIS_START_ARG
|
|
34
|
+
from gslib.exception import CommandException
|
|
35
|
+
from gslib.help_provider import HELP_NAME
|
|
36
|
+
from gslib.help_provider import HELP_NAME_ALIASES
|
|
37
|
+
from gslib.help_provider import HELP_ONE_LINE_SUMMARY
|
|
38
|
+
from gslib.help_provider import HELP_TEXT
|
|
39
|
+
from gslib.help_provider import HELP_TYPE
|
|
40
|
+
from gslib.help_provider import HelpType
|
|
41
|
+
from gslib.name_expansion import NameExpansionIterator
|
|
42
|
+
from gslib.util import NO_MAX
|
|
43
|
+
|
|
44
|
+
_detailed_help_text = ("""
|
|
45
|
+
<B>SYNOPSIS</B>
|
|
46
|
+
gsutil setmeta [-n] -h [header:value|header] ... uri...
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
<B>DESCRIPTION</B>
|
|
50
|
+
The gsutil setmeta command allows you to set or remove the metadata on one
|
|
51
|
+
or more objects. It takes one or more header arguments followed by one or
|
|
52
|
+
more URIs, where each header argument is in one of two forms:
|
|
53
|
+
|
|
54
|
+
- if you specify header:value, it will set the given header on all
|
|
55
|
+
named objects.
|
|
56
|
+
|
|
57
|
+
- if you specify header (with no value), it will remove the given header
|
|
58
|
+
from all named objects.
|
|
59
|
+
|
|
60
|
+
For example, the following command would set the Content-Type and
|
|
61
|
+
Cache-Control and remove the Content-Disposition on the specified objects:
|
|
62
|
+
|
|
63
|
+
gsutil setmeta -h "Content-Type:text/html" \\
|
|
64
|
+
-h "Cache-Control:public, max-age=3600" \\
|
|
65
|
+
-h "Content-Disposition" gs://bucket/*.html
|
|
66
|
+
|
|
67
|
+
If you have a large number of objects to update you might want to use the
|
|
68
|
+
gsutil -m option, to perform a parallel (multi-threaded/multi-processing)
|
|
69
|
+
update:
|
|
70
|
+
|
|
71
|
+
gsutil -m setmeta -h "Content-Type:text/html" \\
|
|
72
|
+
-h "Cache-Control:public, max-age=3600" \\
|
|
73
|
+
-h "Content-Disposition" gs://bucket/*.html
|
|
74
|
+
|
|
75
|
+
See "gsutil help metadata" for details about how you can set metadata
|
|
76
|
+
while uploading objects, what metadata fields can be set and the meaning of
|
|
77
|
+
these fields, use of custom metadata, and how to view currently set metadata.
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
<B>OPERATION COST</B>
|
|
81
|
+
This command uses four operations per URI (one to read the ACL, one to read
|
|
82
|
+
the current metadata, one to set the new metadata, and one to set the ACL).
|
|
83
|
+
|
|
84
|
+
For cases where you want all objects to have the same ACL you can avoid half
|
|
85
|
+
these operations by setting a default ACL on the bucket(s) containing the
|
|
86
|
+
named objects, and using the setmeta -n option. See "help gsutil setdefacl".
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
<B>OPTIONS</B>
|
|
90
|
+
-h Specifies a header:value to be added, or header to be removed,
|
|
91
|
+
from each named object.
|
|
92
|
+
-n Causes the operations for reading and writing the ACL to be
|
|
93
|
+
skipped. This halves the number of operations performed per
|
|
94
|
+
request, improving the speed and reducing the cost of performing
|
|
95
|
+
the operations. This option makes sense for cases where you want
|
|
96
|
+
all objects to have the same ACL, for which you have set a default
|
|
97
|
+
ACL on the bucket(s) containing the objects. See "help gsutil
|
|
98
|
+
setdefacl".
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
<B>OLDER SYNTAX (DEPRECATED)</B>
|
|
102
|
+
The first version of the setmeta command used more complicated syntax
|
|
103
|
+
(described below). gsutil still supports this syntax, to avoid breaking
|
|
104
|
+
existing customer uses, but it is now deprecated and will eventually
|
|
105
|
+
be removed.
|
|
106
|
+
|
|
107
|
+
With this older syntax, the setmeta command accepts a single metadata
|
|
108
|
+
argument in one of two forms:
|
|
109
|
+
|
|
110
|
+
gsutil setmeta [-n] header:value uri...
|
|
111
|
+
|
|
112
|
+
or
|
|
113
|
+
|
|
114
|
+
gsutil setmeta [-n] '"header:value","-header",...' uri...
|
|
115
|
+
|
|
116
|
+
The first form allows you to specify a single header name and value to
|
|
117
|
+
set. For example, the following command would set the Content-Type and
|
|
118
|
+
Cache-Control and remove the Content-Disposition on the specified objects:
|
|
119
|
+
|
|
120
|
+
gsutil setmeta -h "Content-Type:text/html" \\
|
|
121
|
+
-h "Cache-Control:public, max-age=3600" \\
|
|
122
|
+
-h "Content-Disposition" gs://bucket/*.html
|
|
123
|
+
|
|
124
|
+
This form only works if the header name and value don't contain double
|
|
125
|
+
quotes or commas, and only works for setting the header value (not for
|
|
126
|
+
removing it).
|
|
127
|
+
|
|
128
|
+
The more general form of the first argument allows both setting and removing
|
|
129
|
+
multiple fields, without any of the content restrictions noted above. For
|
|
130
|
+
this variant the first argument is a CSV-formatted list of headers to add
|
|
131
|
+
or remove. Getting the CSV-formatted list to be passed correctly into gsutil
|
|
132
|
+
requires different syntax on Linux or MacOS than it does on Windows.
|
|
133
|
+
|
|
134
|
+
On Linux or MacOS you need to surround the entire argument in single quotes
|
|
135
|
+
to avoid having the shell interpret/strip out the double-quotes in the CSV
|
|
136
|
+
data. For example, the following command would set the Content-Type and
|
|
137
|
+
Cache-Control and remove the Content-Disposition on the specified objects:
|
|
138
|
+
|
|
139
|
+
gsutil setmeta '"Content-Type:text/html","Cache-Control:public, max-age=3600","-Content-Disposition"' gs://bucket/*.html
|
|
140
|
+
|
|
141
|
+
To pass CSV data on Windows you need two sets of double quotes around
|
|
142
|
+
each header/value pair, and one set of double quotes around the entire
|
|
143
|
+
expression. For example, the following command would set the Content-Type
|
|
144
|
+
and Cache-Control and remove the Content-Disposition on the specified objects:
|
|
145
|
+
|
|
146
|
+
gsutil setmeta "\""Content-Type:text/html"",""Cache-Control:public, max-age=3600"",""-Content-Disposition""\" gs://bucket/*.html
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
<B>WARNING ABOUT USING SETMETA WITH VERSIONING ENABLED</B>
|
|
150
|
+
|
|
151
|
+
Note that if you use the gsutil setmeta command on an object in a bucket
|
|
152
|
+
with versioning enabled (see 'gsutil help versioning'), it will create
|
|
153
|
+
a new object version (and thus, you will get charged for the space required
|
|
154
|
+
for holding the additional version).
|
|
155
|
+
""")
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
class SetMetaCommand(Command):
|
|
159
|
+
"""Implementation of gsutil setmeta command."""
|
|
160
|
+
|
|
161
|
+
# Command specification (processed by parent class).
|
|
162
|
+
command_spec = {
|
|
163
|
+
# Name of command.
|
|
164
|
+
COMMAND_NAME : 'setmeta',
|
|
165
|
+
# List of command name aliases.
|
|
166
|
+
COMMAND_NAME_ALIASES : ['setheader'],
|
|
167
|
+
# Min number of args required by this command.
|
|
168
|
+
MIN_ARGS : 1,
|
|
169
|
+
# Max number of args required by this command, or NO_MAX.
|
|
170
|
+
MAX_ARGS : NO_MAX,
|
|
171
|
+
# Getopt-style string specifying acceptable sub args.
|
|
172
|
+
SUPPORTED_SUB_ARGS : 'h:n',
|
|
173
|
+
# True if file URIs acceptable for this command.
|
|
174
|
+
FILE_URIS_OK : False,
|
|
175
|
+
# True if provider-only URIs acceptable for this command.
|
|
176
|
+
PROVIDER_URIS_OK : False,
|
|
177
|
+
# Index in args of first URI arg.
|
|
178
|
+
URIS_START_ARG : 1,
|
|
179
|
+
# True if must configure gsutil before running command.
|
|
180
|
+
CONFIG_REQUIRED : True,
|
|
181
|
+
}
|
|
182
|
+
help_spec = {
|
|
183
|
+
# Name of command or auxiliary help info for which this help applies.
|
|
184
|
+
HELP_NAME : 'setmeta',
|
|
185
|
+
# List of help name aliases.
|
|
186
|
+
HELP_NAME_ALIASES : ['setheader'],
|
|
187
|
+
# Type of help:
|
|
188
|
+
HELP_TYPE : HelpType.COMMAND_HELP,
|
|
189
|
+
# One line summary of this help.
|
|
190
|
+
HELP_ONE_LINE_SUMMARY : 'Set metadata on already uploaded objects',
|
|
191
|
+
# The full help text.
|
|
192
|
+
HELP_TEXT : _detailed_help_text,
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
# Command entry point.
|
|
196
|
+
def RunCommand(self):
|
|
197
|
+
headers = []
|
|
198
|
+
preserve_acl = True
|
|
199
|
+
if self.sub_opts:
|
|
200
|
+
for o, a in self.sub_opts:
|
|
201
|
+
if o == '-n':
|
|
202
|
+
preserve_acl = False
|
|
203
|
+
elif o == '-h':
|
|
204
|
+
headers.append(a)
|
|
205
|
+
|
|
206
|
+
if headers:
|
|
207
|
+
(metadata_minus, metadata_plus) = self._ParseMetadataHeaders(headers)
|
|
208
|
+
uri_args = self.args
|
|
209
|
+
else:
|
|
210
|
+
(metadata_minus, metadata_plus) = self._ParseMetadataSpec(self.args[0])
|
|
211
|
+
uri_args = self.args[1:]
|
|
212
|
+
|
|
213
|
+
if (len(uri_args) == 1
|
|
214
|
+
and not self.suri_builder.StorageUri(uri_args[0]).names_object()):
|
|
215
|
+
raise CommandException('URI (%s) must name an object' % uri_args[0])
|
|
216
|
+
|
|
217
|
+
# Used to track if any objects' metadata failed to be set.
|
|
218
|
+
self.everything_set_okay = True
|
|
219
|
+
|
|
220
|
+
def _SetMetadataExceptionHandler(e):
|
|
221
|
+
"""Simple exception handler to allow post-completion status."""
|
|
222
|
+
self.THREADED_LOGGER.error(str(e))
|
|
223
|
+
self.everything_set_okay = False
|
|
224
|
+
|
|
225
|
+
def _SetMetadataFunc(name_expansion_result, retry=3):
|
|
226
|
+
exp_src_uri = self.suri_builder.StorageUri(
|
|
227
|
+
name_expansion_result.GetExpandedUriStr())
|
|
228
|
+
self.THREADED_LOGGER.info('Setting metadata on %s...', exp_src_uri)
|
|
229
|
+
|
|
230
|
+
key = exp_src_uri.get_key()
|
|
231
|
+
meta_generation = key.meta_generation
|
|
232
|
+
generation = key.generation
|
|
233
|
+
|
|
234
|
+
headers = {}
|
|
235
|
+
if generation:
|
|
236
|
+
headers['x-goog-if-generation-match'] = generation
|
|
237
|
+
if meta_generation:
|
|
238
|
+
headers['x-goog-if-metageneration-match'] = meta_generation
|
|
239
|
+
|
|
240
|
+
try:
|
|
241
|
+
exp_src_uri.set_metadata(metadata_plus, metadata_minus, preserve_acl,
|
|
242
|
+
headers=headers)
|
|
243
|
+
except GSResponseError as response_error:
|
|
244
|
+
# HTTP error 412 is "Precondition Failed."
|
|
245
|
+
if response_error.status == 412:
|
|
246
|
+
if retry <= 0:
|
|
247
|
+
self.THREADED_LOGGER.error('Exhausted retries. Giving up.')
|
|
248
|
+
raise
|
|
249
|
+
self.THREADED_LOGGER.warn('Collision - %d tries left.', retry)
|
|
250
|
+
time.sleep(random.uniform(0.5, 1.0))
|
|
251
|
+
_SetMetadataFunc(name_expansion_result, retry-1)
|
|
252
|
+
else:
|
|
253
|
+
raise
|
|
254
|
+
|
|
255
|
+
name_expansion_iterator = NameExpansionIterator(
|
|
256
|
+
self.command_name, self.proj_id_handler, self.headers, self.debug,
|
|
257
|
+
self.bucket_storage_uri_class, uri_args, self.recursion_requested,
|
|
258
|
+
self.recursion_requested)
|
|
259
|
+
|
|
260
|
+
# Perform requests in parallel (-m) mode, if requested, using
|
|
261
|
+
# configured number of parallel processes and threads. Otherwise,
|
|
262
|
+
# perform requests with sequential function calls in current process.
|
|
263
|
+
self.Apply(_SetMetadataFunc, name_expansion_iterator,
|
|
264
|
+
_SetMetadataExceptionHandler)
|
|
265
|
+
|
|
266
|
+
if not self.everything_set_okay:
|
|
267
|
+
raise CommandException('Metadata for some objects could not be set.')
|
|
268
|
+
|
|
269
|
+
return 0
|
|
270
|
+
|
|
271
|
+
def _ParseMetadataHeaders(self, headers):
|
|
272
|
+
metadata_minus = set()
|
|
273
|
+
cust_metadata_minus = set()
|
|
274
|
+
metadata_plus = {}
|
|
275
|
+
cust_metadata_plus = {}
|
|
276
|
+
# Build a count of the keys encountered from each plus and minus arg so we
|
|
277
|
+
# can check for dupe field specs.
|
|
278
|
+
num_metadata_plus_elems = 0
|
|
279
|
+
num_cust_metadata_plus_elems = 0
|
|
280
|
+
num_metadata_minus_elems = 0
|
|
281
|
+
num_cust_metadata_minus_elems = 0
|
|
282
|
+
|
|
283
|
+
for md_arg in headers:
|
|
284
|
+
parts = md_arg.split(':')
|
|
285
|
+
if len(parts) not in (1, 2):
|
|
286
|
+
raise CommandException(
|
|
287
|
+
'Invalid argument: must be either header or header:value (%s)' %
|
|
288
|
+
md_arg)
|
|
289
|
+
if len(parts) == 2:
|
|
290
|
+
(header, value) = parts
|
|
291
|
+
else:
|
|
292
|
+
(header, value) = (parts[0], None)
|
|
293
|
+
_InsistAsciiHeader(header)
|
|
294
|
+
# Translate headers to lowercase to match the casing assumed by our
|
|
295
|
+
# sanity-checking operations.
|
|
296
|
+
header = header.lower()
|
|
297
|
+
if value:
|
|
298
|
+
if _IsCustomMeta(header):
|
|
299
|
+
# Allow non-ASCII data for custom metadata fields. Don't unicode
|
|
300
|
+
# encode other fields because that would perturb their content
|
|
301
|
+
# (e.g., adding %2F's into the middle of a Cache-Control value).
|
|
302
|
+
value = unicode(value, 'utf-8')
|
|
303
|
+
cust_metadata_plus[header] = value
|
|
304
|
+
num_cust_metadata_plus_elems += 1
|
|
305
|
+
else:
|
|
306
|
+
metadata_plus[header] = value
|
|
307
|
+
num_metadata_plus_elems += 1
|
|
308
|
+
else:
|
|
309
|
+
if _IsCustomMeta(header):
|
|
310
|
+
cust_metadata_minus.add(header)
|
|
311
|
+
num_cust_metadata_minus_elems += 1
|
|
312
|
+
else:
|
|
313
|
+
metadata_minus.add(header)
|
|
314
|
+
num_metadata_minus_elems += 1
|
|
315
|
+
if (num_metadata_plus_elems != len(metadata_plus)
|
|
316
|
+
or num_cust_metadata_plus_elems != len(cust_metadata_plus)
|
|
317
|
+
or num_metadata_minus_elems != len(metadata_minus)
|
|
318
|
+
or num_cust_metadata_minus_elems != len(cust_metadata_minus)
|
|
319
|
+
or metadata_minus.intersection(set(metadata_plus.keys()))):
|
|
320
|
+
raise CommandException('Each header must appear at most once.')
|
|
321
|
+
other_than_base_fields = (set(metadata_plus.keys())
|
|
322
|
+
.difference(Key.base_user_settable_fields))
|
|
323
|
+
other_than_base_fields.update(
|
|
324
|
+
metadata_minus.difference(Key.base_user_settable_fields))
|
|
325
|
+
for f in other_than_base_fields:
|
|
326
|
+
# This check is overly simple; it would be stronger to check, for each
|
|
327
|
+
# URI argument, whether f.startswith the
|
|
328
|
+
# uri.get_provider().metadata_prefix, but here we just parse the spec
|
|
329
|
+
# once, before processing any of the URIs. This means we will not
|
|
330
|
+
# detect if the user tries to set an x-goog-meta- field on an another
|
|
331
|
+
# provider's object, for example.
|
|
332
|
+
if not _IsCustomMeta(f):
|
|
333
|
+
raise CommandException('Invalid or disallowed header (%s).\n'
|
|
334
|
+
'Only these fields (plus x-goog-meta-* fields)'
|
|
335
|
+
' can be set or unset:\n%s' % (f,
|
|
336
|
+
sorted(list(Key.base_user_settable_fields))))
|
|
337
|
+
metadata_plus.update(cust_metadata_plus)
|
|
338
|
+
metadata_minus.update(cust_metadata_minus)
|
|
339
|
+
return (metadata_minus, metadata_plus)
|
|
340
|
+
|
|
341
|
+
def _ParseMetadataSpec(self, spec):
|
|
342
|
+
self.THREADED_LOGGER.info('WARNING: metadata spec syntax (%s)\nis '
|
|
343
|
+
'deprecated and will eventually be removed.\n'
|
|
344
|
+
'Please see "gsutil help setmeta" for current '
|
|
345
|
+
'syntax' % spec)
|
|
346
|
+
metadata_minus = set()
|
|
347
|
+
cust_metadata_minus = set()
|
|
348
|
+
metadata_plus = {}
|
|
349
|
+
cust_metadata_plus = {}
|
|
350
|
+
# Build a count of the keys encountered from each plus and minus arg so we
|
|
351
|
+
# can check for dupe field specs.
|
|
352
|
+
num_metadata_plus_elems = 0
|
|
353
|
+
num_cust_metadata_plus_elems = 0
|
|
354
|
+
num_metadata_minus_elems = 0
|
|
355
|
+
num_cust_metadata_minus_elems = 0
|
|
356
|
+
|
|
357
|
+
mdf = StringIO.StringIO(spec)
|
|
358
|
+
for md_arg in csv.reader(mdf).next():
|
|
359
|
+
if not md_arg:
|
|
360
|
+
raise CommandException(
|
|
361
|
+
'Invalid empty metadata specification component.')
|
|
362
|
+
if md_arg[0] == '-':
|
|
363
|
+
header = md_arg[1:]
|
|
364
|
+
if header.find(':') != -1:
|
|
365
|
+
raise CommandException('Removal spec may not contain ":" (%s).' %
|
|
366
|
+
header)
|
|
367
|
+
_InsistAsciiHeader(header)
|
|
368
|
+
# Translate headers to lowercase to match the casing required by
|
|
369
|
+
# uri.set_metadata().
|
|
370
|
+
header = header.lower()
|
|
371
|
+
if _IsCustomMeta(header):
|
|
372
|
+
cust_metadata_minus.add(header)
|
|
373
|
+
num_cust_metadata_minus_elems += 1
|
|
374
|
+
else:
|
|
375
|
+
metadata_minus.add(header)
|
|
376
|
+
num_metadata_minus_elems += 1
|
|
377
|
+
else:
|
|
378
|
+
parts = md_arg.split(':', 1)
|
|
379
|
+
if len(parts) != 2:
|
|
380
|
+
raise CommandException(
|
|
381
|
+
'Fields being added must include values (%s).' % md_arg)
|
|
382
|
+
(header, value) = parts
|
|
383
|
+
_InsistAsciiHeader(header)
|
|
384
|
+
header = header.lower()
|
|
385
|
+
if _IsCustomMeta(header):
|
|
386
|
+
# Allow non-ASCII data for custom metadata fields. Don't unicode
|
|
387
|
+
# encode other fields because that would perturb their content
|
|
388
|
+
# (e.g., adding %2F's into the middle of a Cache-Control value).
|
|
389
|
+
value = unicode(value, 'utf-8')
|
|
390
|
+
cust_metadata_plus[header] = value
|
|
391
|
+
num_cust_metadata_plus_elems += 1
|
|
392
|
+
else:
|
|
393
|
+
metadata_plus[header] = value
|
|
394
|
+
num_metadata_plus_elems += 1
|
|
395
|
+
mdf.close()
|
|
396
|
+
if (num_metadata_plus_elems != len(metadata_plus)
|
|
397
|
+
or num_cust_metadata_plus_elems != len(cust_metadata_plus)
|
|
398
|
+
or num_metadata_minus_elems != len(metadata_minus)
|
|
399
|
+
or num_cust_metadata_minus_elems != len(cust_metadata_minus)
|
|
400
|
+
or metadata_minus.intersection(set(metadata_plus.keys()))):
|
|
401
|
+
raise CommandException('Each header must appear at most once.')
|
|
402
|
+
other_than_base_fields = (set(metadata_plus.keys())
|
|
403
|
+
.difference(Key.base_user_settable_fields))
|
|
404
|
+
other_than_base_fields.update(
|
|
405
|
+
metadata_minus.difference(Key.base_user_settable_fields))
|
|
406
|
+
for f in other_than_base_fields:
|
|
407
|
+
# This check is overly simple; it would be stronger to check, for each
|
|
408
|
+
# URI argument, whether f.startswith the
|
|
409
|
+
# uri.get_provider().metadata_prefix, but here we just parse the spec
|
|
410
|
+
# once, before processing any of the URIs. This means we will not
|
|
411
|
+
# detect if the user tries to set an x-goog-meta- field on an another
|
|
412
|
+
# provider's object, for example.
|
|
413
|
+
if not _IsCustomMeta(f):
|
|
414
|
+
raise CommandException('Invalid or disallowed header (%s).\n'
|
|
415
|
+
'Only these fields (plus x-goog-meta-* fields)'
|
|
416
|
+
' can be set or unset:\n%s' % (f,
|
|
417
|
+
sorted(list(Key.base_user_settable_fields))))
|
|
418
|
+
metadata_plus.update(cust_metadata_plus)
|
|
419
|
+
metadata_minus.update(cust_metadata_minus)
|
|
420
|
+
return (metadata_minus, metadata_plus)
|
|
421
|
+
|
|
422
|
+
|
|
423
|
+
def _InsistAsciiHeader(header):
|
|
424
|
+
if not all(ord(c) < 128 for c in header):
|
|
425
|
+
raise CommandException('Invalid non-ASCII header (%s).' % header)
|
|
426
|
+
|
|
427
|
+
def _IsCustomMeta(header):
|
|
428
|
+
return header.startswith('x-goog-meta-') or header.startswith('x-amz-meta-')
|