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,78 @@
|
|
|
1
|
+
# Copyright (c) 2010 Mitch Garnaat http://garnaat.org/
|
|
2
|
+
# Copyright (c) 2010, Eucalyptus Systems, Inc.
|
|
3
|
+
# All rights reserved.
|
|
4
|
+
#
|
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining a
|
|
6
|
+
# copy of this software and associated documentation files (the
|
|
7
|
+
# "Software"), to deal in the Software without restriction, including
|
|
8
|
+
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
|
9
|
+
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
|
10
|
+
# persons to whom the Software is furnished to do so, subject to the fol-
|
|
11
|
+
# lowing conditions:
|
|
12
|
+
#
|
|
13
|
+
# The above copyright notice and this permission notice shall be included
|
|
14
|
+
# in all copies or substantial portions of the Software.
|
|
15
|
+
#
|
|
16
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
17
|
+
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
|
18
|
+
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
|
19
|
+
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
20
|
+
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
21
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
22
|
+
# IN THE SOFTWARE.
|
|
23
|
+
|
|
24
|
+
"""
|
|
25
|
+
Some integration tests for S3 CORS
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
import unittest
|
|
29
|
+
import time
|
|
30
|
+
|
|
31
|
+
from boto.s3.connection import S3Connection
|
|
32
|
+
from boto.exception import S3ResponseError
|
|
33
|
+
from boto.s3.cors import CORSConfiguration
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class S3CORSTest (unittest.TestCase):
|
|
37
|
+
s3 = True
|
|
38
|
+
|
|
39
|
+
def setUp(self):
|
|
40
|
+
self.conn = S3Connection()
|
|
41
|
+
self.bucket_name = 'cors-%d' % int(time.time())
|
|
42
|
+
self.bucket = self.conn.create_bucket(self.bucket_name)
|
|
43
|
+
|
|
44
|
+
def tearDown(self):
|
|
45
|
+
self.bucket.delete()
|
|
46
|
+
|
|
47
|
+
def test_cors(self):
|
|
48
|
+
self.cfg = CORSConfiguration()
|
|
49
|
+
self.cfg.add_rule(['PUT', 'POST', 'DELETE'],
|
|
50
|
+
'http://www.example.com',
|
|
51
|
+
allowed_header='*', max_age_seconds=3000,
|
|
52
|
+
expose_header='x-amz-server-side-encryption',
|
|
53
|
+
id='foobar_rule')
|
|
54
|
+
assert self.bucket.set_cors(self.cfg)
|
|
55
|
+
time.sleep(5)
|
|
56
|
+
cfg = self.bucket.get_cors()
|
|
57
|
+
for i, rule in enumerate(cfg):
|
|
58
|
+
self.assertEqual(rule.id, self.cfg[i].id)
|
|
59
|
+
self.assertEqual(rule.max_age_seconds, self.cfg[i].max_age_seconds)
|
|
60
|
+
methods = zip(rule.allowed_method, self.cfg[i].allowed_method)
|
|
61
|
+
for v1, v2 in methods:
|
|
62
|
+
self.assertEqual(v1, v2)
|
|
63
|
+
origins = zip(rule.allowed_origin, self.cfg[i].allowed_origin)
|
|
64
|
+
for v1, v2 in origins:
|
|
65
|
+
self.assertEqual(v1, v2)
|
|
66
|
+
headers = zip(rule.allowed_header, self.cfg[i].allowed_header)
|
|
67
|
+
for v1, v2 in headers:
|
|
68
|
+
self.assertEqual(v1, v2)
|
|
69
|
+
headers = zip(rule.expose_header, self.cfg[i].expose_header)
|
|
70
|
+
for v1, v2 in headers:
|
|
71
|
+
self.assertEqual(v1, v2)
|
|
72
|
+
self.bucket.delete_cors()
|
|
73
|
+
time.sleep(5)
|
|
74
|
+
try:
|
|
75
|
+
self.bucket.get_cors()
|
|
76
|
+
self.fail('CORS configuration should not be there')
|
|
77
|
+
except S3ResponseError:
|
|
78
|
+
pass
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
# Copyright (c) 2010 Mitch Garnaat http://garnaat.org/
|
|
2
|
+
# Copyright (c) 2010, Eucalyptus Systems, Inc.
|
|
3
|
+
# All rights reserved.
|
|
4
|
+
#
|
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining a
|
|
6
|
+
# copy of this software and associated documentation files (the
|
|
7
|
+
# "Software"), to deal in the Software without restriction, including
|
|
8
|
+
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
|
9
|
+
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
|
10
|
+
# persons to whom the Software is furnished to do so, subject to the fol-
|
|
11
|
+
# lowing conditions:
|
|
12
|
+
#
|
|
13
|
+
# The above copyright notice and this permission notice shall be included
|
|
14
|
+
# in all copies or substantial portions of the Software.
|
|
15
|
+
#
|
|
16
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
17
|
+
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
|
18
|
+
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
|
19
|
+
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
20
|
+
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
21
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
22
|
+
# IN THE SOFTWARE.
|
|
23
|
+
|
|
24
|
+
"""
|
|
25
|
+
Some unit tests for the S3 Encryption
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
import unittest
|
|
29
|
+
import time
|
|
30
|
+
from boto.s3.connection import S3Connection
|
|
31
|
+
from boto.exception import S3ResponseError
|
|
32
|
+
|
|
33
|
+
json_policy = """{
|
|
34
|
+
"Version":"2008-10-17",
|
|
35
|
+
"Id":"PutObjPolicy",
|
|
36
|
+
"Statement":[{
|
|
37
|
+
"Sid":"DenyUnEncryptedObjectUploads",
|
|
38
|
+
"Effect":"Deny",
|
|
39
|
+
"Principal":{
|
|
40
|
+
"AWS":"*"
|
|
41
|
+
},
|
|
42
|
+
"Action":"s3:PutObject",
|
|
43
|
+
"Resource":"arn:aws:s3:::%s/*",
|
|
44
|
+
"Condition":{
|
|
45
|
+
"StringNotEquals":{
|
|
46
|
+
"s3:x-amz-server-side-encryption":"AES256"
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
]
|
|
51
|
+
}"""
|
|
52
|
+
|
|
53
|
+
class S3EncryptionTest (unittest.TestCase):
|
|
54
|
+
s3 = True
|
|
55
|
+
|
|
56
|
+
def test_1_versions(self):
|
|
57
|
+
print '--- running S3Encryption tests ---'
|
|
58
|
+
c = S3Connection()
|
|
59
|
+
# create a new, empty bucket
|
|
60
|
+
bucket_name = 'encryption-%d' % int(time.time())
|
|
61
|
+
bucket = c.create_bucket(bucket_name)
|
|
62
|
+
|
|
63
|
+
# now try a get_bucket call and see if it's really there
|
|
64
|
+
bucket = c.get_bucket(bucket_name)
|
|
65
|
+
|
|
66
|
+
# create an unencrypted key
|
|
67
|
+
k = bucket.new_key('foobar')
|
|
68
|
+
s1 = 'This is unencrypted data'
|
|
69
|
+
s2 = 'This is encrypted data'
|
|
70
|
+
k.set_contents_from_string(s1)
|
|
71
|
+
time.sleep(5)
|
|
72
|
+
|
|
73
|
+
# now get the contents from s3
|
|
74
|
+
o = k.get_contents_as_string()
|
|
75
|
+
|
|
76
|
+
# check to make sure content read from s3 is identical to original
|
|
77
|
+
assert o == s1
|
|
78
|
+
|
|
79
|
+
# now overwrite that same key with encrypted data
|
|
80
|
+
k.set_contents_from_string(s2, encrypt_key=True)
|
|
81
|
+
time.sleep(5)
|
|
82
|
+
|
|
83
|
+
# now retrieve the contents as a string and compare
|
|
84
|
+
o = k.get_contents_as_string()
|
|
85
|
+
assert o == s2
|
|
86
|
+
|
|
87
|
+
# now set bucket policy to require encrypted objects
|
|
88
|
+
bucket.set_policy(json_policy % bucket.name)
|
|
89
|
+
time.sleep(5)
|
|
90
|
+
|
|
91
|
+
# now try to write unencrypted key
|
|
92
|
+
write_failed = False
|
|
93
|
+
try:
|
|
94
|
+
k.set_contents_from_string(s1)
|
|
95
|
+
except S3ResponseError:
|
|
96
|
+
write_failed = True
|
|
97
|
+
|
|
98
|
+
assert write_failed
|
|
99
|
+
|
|
100
|
+
# now try to write unencrypted key
|
|
101
|
+
write_failed = False
|
|
102
|
+
try:
|
|
103
|
+
k.set_contents_from_string(s1, encrypt_key=True)
|
|
104
|
+
except S3ResponseError:
|
|
105
|
+
write_failed = True
|
|
106
|
+
|
|
107
|
+
assert not write_failed
|
|
108
|
+
|
|
109
|
+
# Now do regular delete
|
|
110
|
+
k.delete()
|
|
111
|
+
time.sleep(5)
|
|
112
|
+
|
|
113
|
+
# now delete bucket
|
|
114
|
+
bucket.delete()
|
|
115
|
+
print '--- tests completed ---'
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
# Copyright 2011 Google Inc.
|
|
2
|
+
#
|
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining a
|
|
4
|
+
# copy of this software and associated documentation files (the
|
|
5
|
+
# "Software"), to deal in the Software without restriction, including
|
|
6
|
+
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
|
7
|
+
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
|
8
|
+
# persons to whom the Software is furnished to do so, subject to the fol-
|
|
9
|
+
# lowing conditions:
|
|
10
|
+
#
|
|
11
|
+
# The above copyright notice and this permission notice shall be included
|
|
12
|
+
# in all copies or substantial portions of the Software.
|
|
13
|
+
#
|
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
15
|
+
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
|
16
|
+
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
|
17
|
+
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
18
|
+
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
19
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
20
|
+
# IN THE SOFTWARE.
|
|
21
|
+
|
|
22
|
+
"""
|
|
23
|
+
Tests to validate correct validation of SSL server certificates.
|
|
24
|
+
|
|
25
|
+
Note that this test assumes two external dependencies are available:
|
|
26
|
+
- A http proxy, which by default is assumed to be at host 'cache' and port
|
|
27
|
+
3128. This can be overridden with environment variables PROXY_HOST and
|
|
28
|
+
PROXY_PORT, respectively.
|
|
29
|
+
- An ssl-enabled web server that will return a valid certificate signed by one
|
|
30
|
+
of the bundled CAs, and which can be reached by an alternate hostname that
|
|
31
|
+
does not match the CN in that certificate. By default, this test uses host
|
|
32
|
+
'www' (without fully qualified domain). This can be overridden with
|
|
33
|
+
environment variable INVALID_HOSTNAME_HOST. If no suitable host is already
|
|
34
|
+
available, such a mapping can be established by temporarily adding an IP
|
|
35
|
+
address for, say, www.google.com or www.amazon.com to /etc/hosts.
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
import os
|
|
39
|
+
import ssl
|
|
40
|
+
import unittest
|
|
41
|
+
|
|
42
|
+
from nose.plugins.attrib import attr
|
|
43
|
+
|
|
44
|
+
import boto
|
|
45
|
+
from boto import exception, https_connection
|
|
46
|
+
from boto.gs.connection import GSConnection
|
|
47
|
+
from boto.s3.connection import S3Connection
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
# File 'other_cacerts.txt' contains a valid CA certificate of a CA that is used
|
|
51
|
+
# by neither S3 nor Google Cloud Storage. Validation against this CA cert should
|
|
52
|
+
# result in a certificate error.
|
|
53
|
+
DEFAULT_CA_CERTS_FILE = os.path.join(
|
|
54
|
+
os.path.dirname(os.path.abspath(__file__ )), 'other_cacerts.txt')
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
PROXY_HOST = os.environ.get('PROXY_HOST', 'cache')
|
|
58
|
+
PROXY_PORT = os.environ.get('PROXY_PORT', '3128')
|
|
59
|
+
|
|
60
|
+
# This test assumes that this host returns a certificate signed by one of the
|
|
61
|
+
# trusted CAs, but with a Common Name that won't match host name 'www' (i.e.,
|
|
62
|
+
# the server should return a certificate with CN 'www.<somedomain>.com').
|
|
63
|
+
INVALID_HOSTNAME_HOST = os.environ.get('INVALID_HOSTNAME_HOST', 'www')
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
@attr('notdefault', 'ssl')
|
|
67
|
+
class CertValidationTest(unittest.TestCase):
|
|
68
|
+
def setUp(self):
|
|
69
|
+
# Clear config
|
|
70
|
+
for section in boto.config.sections():
|
|
71
|
+
boto.config.remove_section(section)
|
|
72
|
+
|
|
73
|
+
# Enable https_validate_certificates.
|
|
74
|
+
boto.config.add_section('Boto')
|
|
75
|
+
boto.config.setbool('Boto', 'https_validate_certificates', True)
|
|
76
|
+
|
|
77
|
+
# Set up bogus credentials so that the auth module is willing to go
|
|
78
|
+
# ahead and make a request; the request should fail with a service-level
|
|
79
|
+
# error if it does get to the service (S3 or GS).
|
|
80
|
+
boto.config.add_section('Credentials')
|
|
81
|
+
boto.config.set('Credentials', 'gs_access_key_id', 'xyz')
|
|
82
|
+
boto.config.set('Credentials', 'gs_secret_access_key', 'xyz')
|
|
83
|
+
boto.config.set('Credentials', 'aws_access_key_id', 'xyz')
|
|
84
|
+
boto.config.set('Credentials', 'aws_secret_access_key', 'xyz')
|
|
85
|
+
|
|
86
|
+
def enableProxy(self):
|
|
87
|
+
boto.config.set('Boto', 'proxy', PROXY_HOST)
|
|
88
|
+
boto.config.set('Boto', 'proxy_port', PROXY_PORT)
|
|
89
|
+
|
|
90
|
+
def assertConnectionThrows(self, connection_class, error):
|
|
91
|
+
conn = connection_class()
|
|
92
|
+
self.assertRaises(error, conn.get_all_buckets)
|
|
93
|
+
|
|
94
|
+
def do_test_valid_cert(self):
|
|
95
|
+
# When connecting to actual servers with bundled root certificates, no
|
|
96
|
+
# cert errors should be thrown; instead we will get "invalid
|
|
97
|
+
# credentials" errors since the config used does not contain any
|
|
98
|
+
# credentials.
|
|
99
|
+
self.assertConnectionThrows(S3Connection, exception.S3ResponseError)
|
|
100
|
+
self.assertConnectionThrows(GSConnection, exception.GSResponseError)
|
|
101
|
+
|
|
102
|
+
def test_valid_cert(self):
|
|
103
|
+
self.do_test_valid_cert()
|
|
104
|
+
|
|
105
|
+
def test_valid_cert_with_proxy(self):
|
|
106
|
+
self.enableProxy()
|
|
107
|
+
self.do_test_valid_cert()
|
|
108
|
+
|
|
109
|
+
def do_test_invalid_signature(self):
|
|
110
|
+
boto.config.set('Boto', 'ca_certificates_file', DEFAULT_CA_CERTS_FILE)
|
|
111
|
+
self.assertConnectionThrows(S3Connection, ssl.SSLError)
|
|
112
|
+
self.assertConnectionThrows(GSConnection, ssl.SSLError)
|
|
113
|
+
|
|
114
|
+
def test_invalid_signature(self):
|
|
115
|
+
self.do_test_invalid_signature()
|
|
116
|
+
|
|
117
|
+
def test_invalid_signature_with_proxy(self):
|
|
118
|
+
self.enableProxy()
|
|
119
|
+
self.do_test_invalid_signature()
|
|
120
|
+
|
|
121
|
+
def do_test_invalid_host(self):
|
|
122
|
+
boto.config.set('Credentials', 'gs_host', INVALID_HOSTNAME_HOST)
|
|
123
|
+
boto.config.set('Credentials', 's3_host', INVALID_HOSTNAME_HOST)
|
|
124
|
+
self.assertConnectionThrows(S3Connection, ssl.SSLError)
|
|
125
|
+
self.assertConnectionThrows(GSConnection, ssl.SSLError)
|
|
126
|
+
|
|
127
|
+
def do_test_invalid_host(self):
|
|
128
|
+
boto.config.set('Credentials', 'gs_host', INVALID_HOSTNAME_HOST)
|
|
129
|
+
boto.config.set('Credentials', 's3_host', INVALID_HOSTNAME_HOST)
|
|
130
|
+
self.assertConnectionThrows(
|
|
131
|
+
S3Connection, https_connection.InvalidCertificateException)
|
|
132
|
+
self.assertConnectionThrows(
|
|
133
|
+
GSConnection, https_connection.InvalidCertificateException)
|
|
134
|
+
|
|
135
|
+
def test_invalid_host(self):
|
|
136
|
+
self.do_test_invalid_host()
|
|
137
|
+
|
|
138
|
+
def test_invalid_host_with_proxy(self):
|
|
139
|
+
self.enableProxy()
|
|
140
|
+
self.do_test_invalid_host()
|
|
141
|
+
|
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
# Copyright (c) 2012 Mitch Garnaat http://garnaat.org/
|
|
2
|
+
# All rights reserved.
|
|
3
|
+
#
|
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining a
|
|
5
|
+
# copy of this software and associated documentation files (the
|
|
6
|
+
# "Software"), to deal in the Software without restriction, including
|
|
7
|
+
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
|
8
|
+
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
|
9
|
+
# persons to whom the Software is furnished to do so, subject to the fol-
|
|
10
|
+
# lowing conditions:
|
|
11
|
+
#
|
|
12
|
+
# The above copyright notice and this permission notice shall be included
|
|
13
|
+
# in all copies or substantial portions of the Software.
|
|
14
|
+
#
|
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
16
|
+
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
|
17
|
+
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
|
18
|
+
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
19
|
+
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
21
|
+
# IN THE SOFTWARE.
|
|
22
|
+
|
|
23
|
+
"""
|
|
24
|
+
Some unit tests for S3 Key
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
from tests.unit import unittest
|
|
28
|
+
import time
|
|
29
|
+
import StringIO
|
|
30
|
+
from boto.s3.connection import S3Connection
|
|
31
|
+
from boto.s3.key import Key
|
|
32
|
+
from boto.exception import S3ResponseError
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class S3KeyTest (unittest.TestCase):
|
|
36
|
+
s3 = True
|
|
37
|
+
|
|
38
|
+
def setUp(self):
|
|
39
|
+
self.conn = S3Connection()
|
|
40
|
+
self.bucket_name = 'keytest-%d' % int(time.time())
|
|
41
|
+
self.bucket = self.conn.create_bucket(self.bucket_name)
|
|
42
|
+
|
|
43
|
+
def tearDown(self):
|
|
44
|
+
for key in self.bucket:
|
|
45
|
+
key.delete()
|
|
46
|
+
self.bucket.delete()
|
|
47
|
+
|
|
48
|
+
def test_set_contents_from_file_dataloss(self):
|
|
49
|
+
# Create an empty stringio and write to it.
|
|
50
|
+
content = "abcde"
|
|
51
|
+
sfp = StringIO.StringIO()
|
|
52
|
+
sfp.write(content)
|
|
53
|
+
# Try set_contents_from_file() without rewinding sfp
|
|
54
|
+
k = self.bucket.new_key("k")
|
|
55
|
+
try:
|
|
56
|
+
k.set_contents_from_file(sfp)
|
|
57
|
+
self.fail("forgot to rewind so should fail.")
|
|
58
|
+
except AttributeError:
|
|
59
|
+
pass
|
|
60
|
+
# call with rewind and check if we wrote 5 bytes
|
|
61
|
+
k.set_contents_from_file(sfp, rewind=True)
|
|
62
|
+
self.assertEqual(k.size, 5)
|
|
63
|
+
# check actual contents by getting it.
|
|
64
|
+
kn = self.bucket.new_key("k")
|
|
65
|
+
ks = kn.get_contents_as_string()
|
|
66
|
+
self.assertEqual(ks, content)
|
|
67
|
+
|
|
68
|
+
# finally, try with a 0 length string
|
|
69
|
+
sfp = StringIO.StringIO()
|
|
70
|
+
k = self.bucket.new_key("k")
|
|
71
|
+
k.set_contents_from_file(sfp)
|
|
72
|
+
self.assertEqual(k.size, 0)
|
|
73
|
+
# check actual contents by getting it.
|
|
74
|
+
kn = self.bucket.new_key("k")
|
|
75
|
+
ks = kn.get_contents_as_string()
|
|
76
|
+
self.assertEqual(ks, "")
|
|
77
|
+
|
|
78
|
+
def test_set_contents_as_file(self):
|
|
79
|
+
content="01234567890123456789"
|
|
80
|
+
sfp = StringIO.StringIO(content)
|
|
81
|
+
|
|
82
|
+
# fp is set at 0 for just opened (for read) files.
|
|
83
|
+
# set_contents should write full content to key.
|
|
84
|
+
k = self.bucket.new_key("k")
|
|
85
|
+
k.set_contents_from_file(sfp)
|
|
86
|
+
self.assertEqual(k.size, 20)
|
|
87
|
+
kn = self.bucket.new_key("k")
|
|
88
|
+
ks = kn.get_contents_as_string()
|
|
89
|
+
self.assertEqual(ks, content)
|
|
90
|
+
|
|
91
|
+
# set fp to 5 and set contents. this should
|
|
92
|
+
# set "567890123456789" to the key
|
|
93
|
+
sfp.seek(5)
|
|
94
|
+
k = self.bucket.new_key("k")
|
|
95
|
+
k.set_contents_from_file(sfp)
|
|
96
|
+
self.assertEqual(k.size, 15)
|
|
97
|
+
kn = self.bucket.new_key("k")
|
|
98
|
+
ks = kn.get_contents_as_string()
|
|
99
|
+
self.assertEqual(ks, content[5:])
|
|
100
|
+
|
|
101
|
+
# set fp to 5 and only set 5 bytes. this should
|
|
102
|
+
# write the value "56789" to the key.
|
|
103
|
+
sfp.seek(5)
|
|
104
|
+
k = self.bucket.new_key("k")
|
|
105
|
+
k.set_contents_from_file(sfp, size=5)
|
|
106
|
+
self.assertEqual(k.size, 5)
|
|
107
|
+
self.assertEqual(sfp.tell(), 10)
|
|
108
|
+
kn = self.bucket.new_key("k")
|
|
109
|
+
ks = kn.get_contents_as_string()
|
|
110
|
+
self.assertEqual(ks, content[5:10])
|
|
111
|
+
|
|
112
|
+
def test_set_contents_with_md5(self):
|
|
113
|
+
content="01234567890123456789"
|
|
114
|
+
sfp = StringIO.StringIO(content)
|
|
115
|
+
|
|
116
|
+
# fp is set at 0 for just opened (for read) files.
|
|
117
|
+
# set_contents should write full content to key.
|
|
118
|
+
k = self.bucket.new_key("k")
|
|
119
|
+
good_md5 = k.compute_md5(sfp)
|
|
120
|
+
k.set_contents_from_file(sfp, md5=good_md5)
|
|
121
|
+
kn = self.bucket.new_key("k")
|
|
122
|
+
ks = kn.get_contents_as_string()
|
|
123
|
+
self.assertEqual(ks, content)
|
|
124
|
+
|
|
125
|
+
# set fp to 5 and only set 5 bytes. this should
|
|
126
|
+
# write the value "56789" to the key.
|
|
127
|
+
sfp.seek(5)
|
|
128
|
+
k = self.bucket.new_key("k")
|
|
129
|
+
good_md5 = k.compute_md5(sfp, size=5)
|
|
130
|
+
k.set_contents_from_file(sfp, size=5, md5=good_md5)
|
|
131
|
+
self.assertEqual(sfp.tell(), 10)
|
|
132
|
+
kn = self.bucket.new_key("k")
|
|
133
|
+
ks = kn.get_contents_as_string()
|
|
134
|
+
self.assertEqual(ks, content[5:10])
|
|
135
|
+
|
|
136
|
+
# let's try a wrong md5 by just altering it.
|
|
137
|
+
k = self.bucket.new_key("k")
|
|
138
|
+
sfp.seek(0)
|
|
139
|
+
hexdig, base64 = k.compute_md5(sfp)
|
|
140
|
+
bad_md5 = (hexdig, base64[3:])
|
|
141
|
+
try:
|
|
142
|
+
k.set_contents_from_file(sfp, md5=bad_md5)
|
|
143
|
+
self.fail("should fail with bad md5")
|
|
144
|
+
except S3ResponseError:
|
|
145
|
+
pass
|
|
146
|
+
|
|
147
|
+
def test_get_contents_with_md5(self):
|
|
148
|
+
content="01234567890123456789"
|
|
149
|
+
sfp = StringIO.StringIO(content)
|
|
150
|
+
|
|
151
|
+
k = self.bucket.new_key("k")
|
|
152
|
+
k.set_contents_from_file(sfp)
|
|
153
|
+
kn = self.bucket.new_key("k")
|
|
154
|
+
s = kn.get_contents_as_string()
|
|
155
|
+
self.assertEqual(kn.md5, k.md5)
|
|
156
|
+
self.assertEqual(s, content)
|
|
157
|
+
|
|
158
|
+
def test_file_callback(self):
|
|
159
|
+
def callback(wrote, total):
|
|
160
|
+
self.my_cb_cnt += 1
|
|
161
|
+
self.assertNotEqual(wrote, self.my_cb_last, "called twice with same value")
|
|
162
|
+
self.my_cb_last = wrote
|
|
163
|
+
|
|
164
|
+
# Zero bytes written => 1 call
|
|
165
|
+
self.my_cb_cnt = 0
|
|
166
|
+
self.my_cb_last = None
|
|
167
|
+
k = self.bucket.new_key("k")
|
|
168
|
+
k.BufferSize = 2
|
|
169
|
+
sfp = StringIO.StringIO("")
|
|
170
|
+
k.set_contents_from_file(sfp, cb=callback, num_cb=10)
|
|
171
|
+
self.assertEqual(self.my_cb_cnt, 1)
|
|
172
|
+
self.assertEqual(self.my_cb_last, 0)
|
|
173
|
+
sfp.close()
|
|
174
|
+
|
|
175
|
+
# Read back zero bytes => 1 call
|
|
176
|
+
self.my_cb_cnt = 0
|
|
177
|
+
self.my_cb_last = None
|
|
178
|
+
s = k.get_contents_as_string(cb=callback)
|
|
179
|
+
self.assertEqual(self.my_cb_cnt, 1)
|
|
180
|
+
self.assertEqual(self.my_cb_last, 0)
|
|
181
|
+
|
|
182
|
+
content="01234567890123456789"
|
|
183
|
+
sfp = StringIO.StringIO(content)
|
|
184
|
+
|
|
185
|
+
# expect 2 calls due start/finish
|
|
186
|
+
self.my_cb_cnt = 0
|
|
187
|
+
self.my_cb_last = None
|
|
188
|
+
k = self.bucket.new_key("k")
|
|
189
|
+
k.set_contents_from_file(sfp, cb=callback, num_cb=10)
|
|
190
|
+
self.assertEqual(self.my_cb_cnt, 2)
|
|
191
|
+
self.assertEqual(self.my_cb_last, 20)
|
|
192
|
+
|
|
193
|
+
# Read back all bytes => 2 calls
|
|
194
|
+
self.my_cb_cnt = 0
|
|
195
|
+
self.my_cb_last = None
|
|
196
|
+
s = k.get_contents_as_string(cb=callback)
|
|
197
|
+
self.assertEqual(self.my_cb_cnt, 2)
|
|
198
|
+
self.assertEqual(self.my_cb_last, 20)
|
|
199
|
+
self.assertEqual(s, content)
|
|
200
|
+
|
|
201
|
+
# rewind sfp and try upload again. -1 should call
|
|
202
|
+
# for every read/write so that should make 11 when bs=2
|
|
203
|
+
sfp.seek(0)
|
|
204
|
+
self.my_cb_cnt = 0
|
|
205
|
+
self.my_cb_last = None
|
|
206
|
+
k = self.bucket.new_key("k")
|
|
207
|
+
k.BufferSize = 2
|
|
208
|
+
k.set_contents_from_file(sfp, cb=callback, num_cb=-1)
|
|
209
|
+
self.assertEqual(self.my_cb_cnt, 11)
|
|
210
|
+
self.assertEqual(self.my_cb_last, 20)
|
|
211
|
+
|
|
212
|
+
# Read back all bytes => 11 calls
|
|
213
|
+
self.my_cb_cnt = 0
|
|
214
|
+
self.my_cb_last = None
|
|
215
|
+
s = k.get_contents_as_string(cb=callback, num_cb=-1)
|
|
216
|
+
self.assertEqual(self.my_cb_cnt, 11)
|
|
217
|
+
self.assertEqual(self.my_cb_last, 20)
|
|
218
|
+
self.assertEqual(s, content)
|
|
219
|
+
|
|
220
|
+
# no more than 1 times => 2 times
|
|
221
|
+
# last time always 20 bytes
|
|
222
|
+
sfp.seek(0)
|
|
223
|
+
self.my_cb_cnt = 0
|
|
224
|
+
self.my_cb_last = None
|
|
225
|
+
k = self.bucket.new_key("k")
|
|
226
|
+
k.BufferSize = 2
|
|
227
|
+
k.set_contents_from_file(sfp, cb=callback, num_cb=1)
|
|
228
|
+
self.assertTrue(self.my_cb_cnt <= 2)
|
|
229
|
+
self.assertEqual(self.my_cb_last, 20)
|
|
230
|
+
|
|
231
|
+
# no more than 1 times => 2 times
|
|
232
|
+
self.my_cb_cnt = 0
|
|
233
|
+
self.my_cb_last = None
|
|
234
|
+
s = k.get_contents_as_string(cb=callback, num_cb=1)
|
|
235
|
+
self.assertTrue(self.my_cb_cnt <= 2)
|
|
236
|
+
self.assertEqual(self.my_cb_last, 20)
|
|
237
|
+
self.assertEqual(s, content)
|
|
238
|
+
|
|
239
|
+
# no more than 2 times
|
|
240
|
+
# last time always 20 bytes
|
|
241
|
+
sfp.seek(0)
|
|
242
|
+
self.my_cb_cnt = 0
|
|
243
|
+
self.my_cb_last = None
|
|
244
|
+
k = self.bucket.new_key("k")
|
|
245
|
+
k.BufferSize = 2
|
|
246
|
+
k.set_contents_from_file(sfp, cb=callback, num_cb=2)
|
|
247
|
+
self.assertTrue(self.my_cb_cnt <= 2)
|
|
248
|
+
self.assertEqual(self.my_cb_last, 20)
|
|
249
|
+
|
|
250
|
+
# no more than 2 times
|
|
251
|
+
self.my_cb_cnt = 0
|
|
252
|
+
self.my_cb_last = None
|
|
253
|
+
s = k.get_contents_as_string(cb=callback, num_cb=2)
|
|
254
|
+
self.assertTrue(self.my_cb_cnt <= 2)
|
|
255
|
+
self.assertEqual(self.my_cb_last, 20)
|
|
256
|
+
self.assertEqual(s, content)
|
|
257
|
+
|
|
258
|
+
# no more than 3 times
|
|
259
|
+
# last time always 20 bytes
|
|
260
|
+
sfp.seek(0)
|
|
261
|
+
self.my_cb_cnt = 0
|
|
262
|
+
self.my_cb_last = None
|
|
263
|
+
k = self.bucket.new_key("k")
|
|
264
|
+
k.BufferSize = 2
|
|
265
|
+
k.set_contents_from_file(sfp, cb=callback, num_cb=3)
|
|
266
|
+
self.assertTrue(self.my_cb_cnt <= 3)
|
|
267
|
+
self.assertEqual(self.my_cb_last, 20)
|
|
268
|
+
|
|
269
|
+
# no more than 3 times
|
|
270
|
+
self.my_cb_cnt = 0
|
|
271
|
+
self.my_cb_last = None
|
|
272
|
+
s = k.get_contents_as_string(cb=callback, num_cb=3)
|
|
273
|
+
self.assertTrue(self.my_cb_cnt <= 3)
|
|
274
|
+
self.assertEqual(self.my_cb_last, 20)
|
|
275
|
+
self.assertEqual(s, content)
|
|
276
|
+
|
|
277
|
+
# no more than 4 times
|
|
278
|
+
# last time always 20 bytes
|
|
279
|
+
sfp.seek(0)
|
|
280
|
+
self.my_cb_cnt = 0
|
|
281
|
+
self.my_cb_last = None
|
|
282
|
+
k = self.bucket.new_key("k")
|
|
283
|
+
k.BufferSize = 2
|
|
284
|
+
k.set_contents_from_file(sfp, cb=callback, num_cb=4)
|
|
285
|
+
self.assertTrue(self.my_cb_cnt <= 4)
|
|
286
|
+
self.assertEqual(self.my_cb_last, 20)
|
|
287
|
+
|
|
288
|
+
# no more than 4 times
|
|
289
|
+
self.my_cb_cnt = 0
|
|
290
|
+
self.my_cb_last = None
|
|
291
|
+
s = k.get_contents_as_string(cb=callback, num_cb=4)
|
|
292
|
+
self.assertTrue(self.my_cb_cnt <= 4)
|
|
293
|
+
self.assertEqual(self.my_cb_last, 20)
|
|
294
|
+
self.assertEqual(s, content)
|
|
295
|
+
|
|
296
|
+
# no more than 6 times
|
|
297
|
+
# last time always 20 bytes
|
|
298
|
+
sfp.seek(0)
|
|
299
|
+
self.my_cb_cnt = 0
|
|
300
|
+
self.my_cb_last = None
|
|
301
|
+
k = self.bucket.new_key("k")
|
|
302
|
+
k.BufferSize = 2
|
|
303
|
+
k.set_contents_from_file(sfp, cb=callback, num_cb=6)
|
|
304
|
+
self.assertTrue(self.my_cb_cnt <= 6)
|
|
305
|
+
self.assertEqual(self.my_cb_last, 20)
|
|
306
|
+
|
|
307
|
+
# no more than 6 times
|
|
308
|
+
self.my_cb_cnt = 0
|
|
309
|
+
self.my_cb_last = None
|
|
310
|
+
s = k.get_contents_as_string(cb=callback, num_cb=6)
|
|
311
|
+
self.assertTrue(self.my_cb_cnt <= 6)
|
|
312
|
+
self.assertEqual(self.my_cb_last, 20)
|
|
313
|
+
self.assertEqual(s, content)
|
|
314
|
+
|
|
315
|
+
# no more than 10 times
|
|
316
|
+
# last time always 20 bytes
|
|
317
|
+
sfp.seek(0)
|
|
318
|
+
self.my_cb_cnt = 0
|
|
319
|
+
self.my_cb_last = None
|
|
320
|
+
k = self.bucket.new_key("k")
|
|
321
|
+
k.BufferSize = 2
|
|
322
|
+
k.set_contents_from_file(sfp, cb=callback, num_cb=10)
|
|
323
|
+
self.assertTrue(self.my_cb_cnt <= 10)
|
|
324
|
+
self.assertEqual(self.my_cb_last, 20)
|
|
325
|
+
|
|
326
|
+
# no more than 10 times
|
|
327
|
+
self.my_cb_cnt = 0
|
|
328
|
+
self.my_cb_last = None
|
|
329
|
+
s = k.get_contents_as_string(cb=callback, num_cb=10)
|
|
330
|
+
self.assertTrue(self.my_cb_cnt <= 10)
|
|
331
|
+
self.assertEqual(self.my_cb_last, 20)
|
|
332
|
+
self.assertEqual(s, content)
|
|
333
|
+
|
|
334
|
+
# no more than 1000 times
|
|
335
|
+
# last time always 20 bytes
|
|
336
|
+
sfp.seek(0)
|
|
337
|
+
self.my_cb_cnt = 0
|
|
338
|
+
self.my_cb_last = None
|
|
339
|
+
k = self.bucket.new_key("k")
|
|
340
|
+
k.BufferSize = 2
|
|
341
|
+
k.set_contents_from_file(sfp, cb=callback, num_cb=1000)
|
|
342
|
+
self.assertTrue(self.my_cb_cnt <= 1000)
|
|
343
|
+
self.assertEqual(self.my_cb_last, 20)
|
|
344
|
+
|
|
345
|
+
# no more than 1000 times
|
|
346
|
+
self.my_cb_cnt = 0
|
|
347
|
+
self.my_cb_last = None
|
|
348
|
+
s = k.get_contents_as_string(cb=callback, num_cb=1000)
|
|
349
|
+
self.assertTrue(self.my_cb_cnt <= 1000)
|
|
350
|
+
self.assertEqual(self.my_cb_last, 20)
|
|
351
|
+
self.assertEqual(s, content)
|
|
352
|
+
|
|
353
|
+
def test_website_redirects(self):
|
|
354
|
+
self.bucket.configure_website('index.html')
|
|
355
|
+
key = self.bucket.new_key('redirect-key')
|
|
356
|
+
self.assertTrue(key.set_redirect('http://www.amazon.com/'))
|
|
357
|
+
self.assertEqual(key.get_redirect(), 'http://www.amazon.com/')
|
|
358
|
+
|
|
359
|
+
self.assertTrue(key.set_redirect('http://aws.amazon.com/'))
|
|
360
|
+
self.assertEqual(key.get_redirect(), 'http://aws.amazon.com/')
|
|
361
|
+
|
|
362
|
+
def test_website_redirect_none_configured(self):
|
|
363
|
+
key = self.bucket.new_key('redirect-key')
|
|
364
|
+
key.set_contents_from_string('')
|
|
365
|
+
self.assertEqual(key.get_redirect(), None)
|
|
366
|
+
|
|
367
|
+
def test_website_redirect_with_bad_value(self):
|
|
368
|
+
self.bucket.configure_website('index.html')
|
|
369
|
+
key = self.bucket.new_key('redirect-key')
|
|
370
|
+
with self.assertRaises(key.provider.storage_response_error):
|
|
371
|
+
# Must start with a / or http
|
|
372
|
+
key.set_redirect('ftp://ftp.example.org')
|
|
373
|
+
with self.assertRaises(key.provider.storage_response_error):
|
|
374
|
+
# Must start with a / or http
|
|
375
|
+
key.set_redirect('')
|