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,82 @@
|
|
|
1
|
+
.. _security_groups:
|
|
2
|
+
|
|
3
|
+
===================
|
|
4
|
+
EC2 Security Groups
|
|
5
|
+
===================
|
|
6
|
+
|
|
7
|
+
Amazon defines a security group as:
|
|
8
|
+
|
|
9
|
+
"A security group is a named collection of access rules. These access rules
|
|
10
|
+
specify which ingress, i.e. incoming, network traffic should be delivered
|
|
11
|
+
to your instance."
|
|
12
|
+
|
|
13
|
+
To get a listing of all currently defined security groups::
|
|
14
|
+
|
|
15
|
+
>>> rs = conn.get_all_security_groups()
|
|
16
|
+
>>> print rs
|
|
17
|
+
[SecurityGroup:appserver, SecurityGroup:default, SecurityGroup:vnc, SecurityGroup:webserver]
|
|
18
|
+
|
|
19
|
+
Each security group can have an arbitrary number of rules which represent
|
|
20
|
+
different network ports which are being enabled. To find the rules for a
|
|
21
|
+
particular security group, use the rules attribute::
|
|
22
|
+
|
|
23
|
+
>>> sg = rs[1]
|
|
24
|
+
>>> sg.name
|
|
25
|
+
u'default'
|
|
26
|
+
>>> sg.rules
|
|
27
|
+
[IPPermissions:tcp(0-65535),
|
|
28
|
+
IPPermissions:udp(0-65535),
|
|
29
|
+
IPPermissions:icmp(-1--1),
|
|
30
|
+
IPPermissions:tcp(22-22),
|
|
31
|
+
IPPermissions:tcp(80-80)]
|
|
32
|
+
|
|
33
|
+
In addition to listing the available security groups you can also create
|
|
34
|
+
a new security group. I'll follow through the "Three Tier Web Service"
|
|
35
|
+
example included in the EC2 Developer's Guide for an example of how to
|
|
36
|
+
create security groups and add rules to them.
|
|
37
|
+
|
|
38
|
+
First, let's create a group for our Apache web servers that allows HTTP
|
|
39
|
+
access to the world::
|
|
40
|
+
|
|
41
|
+
>>> web = conn.create_security_group('apache', 'Our Apache Group')
|
|
42
|
+
>>> web
|
|
43
|
+
SecurityGroup:apache
|
|
44
|
+
>>> web.authorize('tcp', 80, 80, '0.0.0.0/0')
|
|
45
|
+
True
|
|
46
|
+
|
|
47
|
+
The first argument is the ip protocol which can be one of; tcp, udp or icmp.
|
|
48
|
+
The second argument is the FromPort or the beginning port in the range, the
|
|
49
|
+
third argument is the ToPort or the ending port in the range and the last
|
|
50
|
+
argument is the CIDR IP range to authorize access to.
|
|
51
|
+
|
|
52
|
+
Next we create another group for the app servers::
|
|
53
|
+
|
|
54
|
+
>>> app = conn.create_security_group('appserver', 'The application tier')
|
|
55
|
+
|
|
56
|
+
We then want to grant access between the web server group and the app
|
|
57
|
+
server group. So, rather than specifying an IP address as we did in the
|
|
58
|
+
last example, this time we will specify another SecurityGroup object.:
|
|
59
|
+
|
|
60
|
+
>>> app.authorize(src_group=web)
|
|
61
|
+
True
|
|
62
|
+
|
|
63
|
+
Now, to verify that the web group now has access to the app servers, we want to
|
|
64
|
+
temporarily allow SSH access to the web servers from our computer. Let's
|
|
65
|
+
say that our IP address is 192.168.1.130 as it is in the EC2 Developer
|
|
66
|
+
Guide. To enable that access::
|
|
67
|
+
|
|
68
|
+
>>> web.authorize(ip_protocol='tcp', from_port=22, to_port=22, cidr_ip='192.168.1.130/32')
|
|
69
|
+
True
|
|
70
|
+
|
|
71
|
+
Now that this access is authorized, we could ssh into an instance running in
|
|
72
|
+
the web group and then try to telnet to specific ports on servers in the
|
|
73
|
+
appserver group, as shown in the EC2 Developer's Guide. When this testing is
|
|
74
|
+
complete, we would want to revoke SSH access to the web server group, like this::
|
|
75
|
+
|
|
76
|
+
>>> web.rules
|
|
77
|
+
[IPPermissions:tcp(80-80),
|
|
78
|
+
IPPermissions:tcp(22-22)]
|
|
79
|
+
>>> web.revoke('tcp', 22, 22, cidr_ip='192.168.1.130/32')
|
|
80
|
+
True
|
|
81
|
+
>>> web.rules
|
|
82
|
+
[IPPermissions:tcp(80-80)]
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
.. ses_tut:
|
|
2
|
+
|
|
3
|
+
=============================
|
|
4
|
+
Simple Email Service Tutorial
|
|
5
|
+
=============================
|
|
6
|
+
|
|
7
|
+
This tutorial focuses on the boto interface to AWS' `Simple Email Service (SES) <ses>`_.
|
|
8
|
+
This tutorial assumes that you have boto already downloaded and installed.
|
|
9
|
+
|
|
10
|
+
.. _SES: http://aws.amazon.com/ses/
|
|
11
|
+
|
|
12
|
+
Creating a Connection
|
|
13
|
+
---------------------
|
|
14
|
+
|
|
15
|
+
The first step in accessing SES is to create a connection to the service.
|
|
16
|
+
To do so, the most straight forward way is the following::
|
|
17
|
+
|
|
18
|
+
>>> import boto
|
|
19
|
+
>>> conn = boto.connect_ses(
|
|
20
|
+
aws_access_key_id='<YOUR_AWS_KEY_ID>',
|
|
21
|
+
aws_secret_access_key='<YOUR_AWS_SECRET_KEY>')
|
|
22
|
+
>>> conn
|
|
23
|
+
SESConnection:email.us-east-1.amazonaws.com
|
|
24
|
+
|
|
25
|
+
Bear in mind that if you have your credentials in boto config in your home
|
|
26
|
+
directory, the two keyword arguments in the call above are not needed. More
|
|
27
|
+
details on configuration can be fond in :doc:`boto_config_tut`.
|
|
28
|
+
|
|
29
|
+
The :py:func:`boto.connect_ses` functions returns a
|
|
30
|
+
:py:class:`boto.ses.connection.SESConnection` instance, which is a the boto API
|
|
31
|
+
for working with SES.
|
|
32
|
+
|
|
33
|
+
Notes on Sending
|
|
34
|
+
----------------
|
|
35
|
+
|
|
36
|
+
It is important to keep in mind that while emails appear to come "from" the
|
|
37
|
+
address that you specify via Reply-To, the sending is done through Amazon.
|
|
38
|
+
Some clients do pick up on this disparity, and leave a note on emails.
|
|
39
|
+
|
|
40
|
+
Verifying a Sender Email Address
|
|
41
|
+
--------------------------------
|
|
42
|
+
|
|
43
|
+
Before you can send email "from" an address, you must prove that you have
|
|
44
|
+
access to the account. When you send a validation request, an email is sent
|
|
45
|
+
to the address with a link in it. Clicking on the link validates the address
|
|
46
|
+
and adds it to your SES account. Here's how to send the validation email::
|
|
47
|
+
|
|
48
|
+
>>> conn.verify_email_address('some@address.com')
|
|
49
|
+
{
|
|
50
|
+
'VerifyEmailAddressResponse': {
|
|
51
|
+
'ResponseMetadata': {
|
|
52
|
+
'RequestId': '4a974fd5-56c2-11e1-ad4c-c1f08c91d554'
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
After a short amount of time, you'll find an email with the validation
|
|
58
|
+
link inside. Click it, and this address may be used to send emails.
|
|
59
|
+
|
|
60
|
+
Listing Verified Addresses
|
|
61
|
+
--------------------------
|
|
62
|
+
|
|
63
|
+
If you'd like to list the addresses that are currently verified on your
|
|
64
|
+
SES account, use
|
|
65
|
+
:py:meth:`list_verified_email_addresses <boto.ses.connection.SESConnection.list_verified_email_addresses>`::
|
|
66
|
+
|
|
67
|
+
>>> conn.list_verified_email_addresses()
|
|
68
|
+
{
|
|
69
|
+
'ListVerifiedEmailAddressesResponse': {
|
|
70
|
+
'ListVerifiedEmailAddressesResult': {
|
|
71
|
+
'VerifiedEmailAddresses': [
|
|
72
|
+
'some@address.com',
|
|
73
|
+
'another@address.com'
|
|
74
|
+
]
|
|
75
|
+
},
|
|
76
|
+
'ResponseMetadata': {
|
|
77
|
+
'RequestId': '2ab45c18-56c3-11e1-be66-ffd2a4549d70'
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
Deleting a Verified Address
|
|
83
|
+
---------------------------
|
|
84
|
+
|
|
85
|
+
In the event that you'd like to remove an email address from your account,
|
|
86
|
+
use
|
|
87
|
+
:py:meth:`delete_verified_email_address <boto.ses.connection.SESConnection.delete_verified_email_address>`::
|
|
88
|
+
|
|
89
|
+
>>> conn.delete_verified_email_address('another@address.com')
|
|
90
|
+
|
|
91
|
+
Sending an Email
|
|
92
|
+
----------------
|
|
93
|
+
|
|
94
|
+
Sending an email is done via
|
|
95
|
+
:py:meth:`send_email <boto.ses.connection.SESConnection.send_email>`::
|
|
96
|
+
|
|
97
|
+
>>> conn.send_email(
|
|
98
|
+
'some@address.com',
|
|
99
|
+
'Your subject',
|
|
100
|
+
'Body here',
|
|
101
|
+
['recipient-address-1@gmail.com'])
|
|
102
|
+
{
|
|
103
|
+
'SendEmailResponse': {
|
|
104
|
+
'ResponseMetadata': {
|
|
105
|
+
'RequestId': '4743c2b7-56c3-11e1-bccd-c99bd68002fd'
|
|
106
|
+
},
|
|
107
|
+
'SendEmailResult': {
|
|
108
|
+
'MessageId': '000001357a177192-7b894025-147a-4705-8455-7c880b0c8270-000000'
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
If you're wanting to send a multipart MIME email, see the reference for
|
|
114
|
+
:py:meth:`send_raw_email <boto.ses.connection.SESConnection.send_raw_email>`,
|
|
115
|
+
which is a bit more of a low-level alternative.
|
|
116
|
+
|
|
117
|
+
Checking your Send Quota
|
|
118
|
+
------------------------
|
|
119
|
+
|
|
120
|
+
Staying within your quota is critical, since the upper limit is a hard cap.
|
|
121
|
+
Once you have hit your quota, no further email may be sent until enough
|
|
122
|
+
time elapses to where your 24 hour email count (rolling continuously) is
|
|
123
|
+
within acceptable ranges. Use
|
|
124
|
+
:py:meth:`get_send_quota <boto.ses.connection.SESConnection.get_send_quota>`::
|
|
125
|
+
|
|
126
|
+
>>> conn.get_send_quota()
|
|
127
|
+
{
|
|
128
|
+
'GetSendQuotaResponse': {
|
|
129
|
+
'GetSendQuotaResult': {
|
|
130
|
+
'Max24HourSend': '100000.0',
|
|
131
|
+
'SentLast24Hours': '181.0',
|
|
132
|
+
'MaxSendRate': '28.0'
|
|
133
|
+
},
|
|
134
|
+
'ResponseMetadata': {
|
|
135
|
+
'RequestId': u'8a629245-56c4-11e1-9c53-9d5f4d2cc8d3'
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
Checking your Send Statistics
|
|
141
|
+
-----------------------------
|
|
142
|
+
|
|
143
|
+
In order to fight spammers and ensure quality mail is being sent from SES,
|
|
144
|
+
Amazon tracks bounces, rejections, and complaints. This is done via
|
|
145
|
+
:py:meth:`get_send_statistics <boto.ses.connection.SESConnection.get_send_statistics>`.
|
|
146
|
+
Please be warned that the output is extremely verbose, to the point
|
|
147
|
+
where we'll just show a short excerpt here::
|
|
148
|
+
|
|
149
|
+
>>> conn.get_send_statistics()
|
|
150
|
+
{
|
|
151
|
+
'GetSendStatisticsResponse': {
|
|
152
|
+
'GetSendStatisticsResult': {
|
|
153
|
+
'SendDataPoints': [
|
|
154
|
+
{
|
|
155
|
+
'Complaints': '0',
|
|
156
|
+
'Timestamp': '2012-02-13T05:02:00Z',
|
|
157
|
+
'DeliveryAttempts': '8',
|
|
158
|
+
'Bounces': '0',
|
|
159
|
+
'Rejects': '0'
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
'Complaints': '0',
|
|
163
|
+
'Timestamp': '2012-02-13T05:17:00Z',
|
|
164
|
+
'DeliveryAttempts': '12',
|
|
165
|
+
'Bounces': '0',
|
|
166
|
+
'Rejects': '0'
|
|
167
|
+
}
|
|
168
|
+
]
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
.. simpledb_tut:
|
|
2
|
+
|
|
3
|
+
============================================
|
|
4
|
+
An Introduction to boto's SimpleDB interface
|
|
5
|
+
============================================
|
|
6
|
+
This tutorial focuses on the boto interface to AWS' SimpleDB_. This tutorial
|
|
7
|
+
assumes that you have boto already downloaded and installed.
|
|
8
|
+
|
|
9
|
+
.. _SimpleDB: http://aws.amazon.com/simpledb/
|
|
10
|
+
|
|
11
|
+
Creating a Connection
|
|
12
|
+
---------------------
|
|
13
|
+
The first step in accessing SimpleDB is to create a connection to the service.
|
|
14
|
+
To do so, the most straight forward way is the following::
|
|
15
|
+
|
|
16
|
+
>>> import boto
|
|
17
|
+
>>> conn = boto.connect_sdb(aws_access_key_id='<YOUR_AWS_KEY_ID>',aws_secret_access_key='<YOUR_AWS_SECRET_KEY>')
|
|
18
|
+
>>> conn
|
|
19
|
+
SDBConnection:sdb.amazonaws.com
|
|
20
|
+
>>>
|
|
21
|
+
|
|
22
|
+
Bear in mind that if you have your credentials in boto config in your home
|
|
23
|
+
directory, the two keyword arguments in the call above are not needed. Also
|
|
24
|
+
important to note is that just as any other AWS service, SimpleDB is
|
|
25
|
+
region-specific and as such you might want to specify which region to connect
|
|
26
|
+
to, by default, it'll connect to the US-EAST-1 region.
|
|
27
|
+
|
|
28
|
+
Creating Domains
|
|
29
|
+
----------------
|
|
30
|
+
Arguably, once you have your connection established, you'll want to create one or more dmains.
|
|
31
|
+
Creating new domains is a fairly straight forward operation. To do so, you can proceed as follows::
|
|
32
|
+
|
|
33
|
+
>>> conn.create_domain('test-domain')
|
|
34
|
+
Domain:test-domain
|
|
35
|
+
>>>
|
|
36
|
+
>>> conn.create_domain('test-domain-2')
|
|
37
|
+
Domain:test-domain
|
|
38
|
+
>>>
|
|
39
|
+
|
|
40
|
+
Please note that SimpleDB, unlike its newest sibling DynamoDB, is truly and completely schema-less.
|
|
41
|
+
Thus, there's no need specify domain keys or ranges.
|
|
42
|
+
|
|
43
|
+
Listing All Domains
|
|
44
|
+
-------------------
|
|
45
|
+
Unlike DynamoDB or other database systems, SimpleDB uses the concept of 'domains' instead of tables.
|
|
46
|
+
So, to list all your domains for your account in a region, you can simply do as follows::
|
|
47
|
+
|
|
48
|
+
>>> domains = conn.get_all_domains()
|
|
49
|
+
>>> domains
|
|
50
|
+
[Domain:test-domain, Domain:test-domain-2]
|
|
51
|
+
>>>
|
|
52
|
+
|
|
53
|
+
The get_all_domains() method returns a :py:class:`boto.resultset.ResultSet` containing
|
|
54
|
+
all :py:class:`boto.sdb.domain.Domain` objects associated with
|
|
55
|
+
this connection's Access Key ID for that region.
|
|
56
|
+
|
|
57
|
+
Retrieving a Domain (by name)
|
|
58
|
+
-----------------------------
|
|
59
|
+
If you wish to retrieve a specific domain whose name is known, you can do so as follows::
|
|
60
|
+
|
|
61
|
+
>>> dom = conn.get_domain('test-domain')
|
|
62
|
+
>>> dom
|
|
63
|
+
Domain:test-domain
|
|
64
|
+
>>>
|
|
65
|
+
|
|
66
|
+
The get_domain call has an optional validate parameter, which defaults to True. This will make sure to raise
|
|
67
|
+
an exception if the domain you are looking for doesn't exist. If you set it to false, it will return a
|
|
68
|
+
:py:class:`Domain <boto.sdb.domain.Domain>` object blindly regardless of its existence.
|
|
69
|
+
|
|
70
|
+
Getting Domain Metadata
|
|
71
|
+
------------------------
|
|
72
|
+
There are times when you might want to know your domains' machine usage, aprox. item count and other such data.
|
|
73
|
+
To this end, boto offers a simple and convenient way to do so as shown below::
|
|
74
|
+
|
|
75
|
+
>>> domain_meta = conn.domain_metadata(dom)
|
|
76
|
+
>>> domain_meta
|
|
77
|
+
<boto.sdb.domain.DomainMetaData instance at 0x23cd440>
|
|
78
|
+
>>> dir(domain_meta)
|
|
79
|
+
['BoxUsage', 'DomainMetadataResponse', 'DomainMetadataResult', 'RequestId', 'ResponseMetadata',
|
|
80
|
+
'__doc__', '__init__', '__module__', 'attr_name_count', 'attr_names_size', 'attr_value_count', 'attr_values_size',
|
|
81
|
+
'domain', 'endElement', 'item_count', 'item_names_size', 'startElement', 'timestamp']
|
|
82
|
+
>>> domain_meta.item_count
|
|
83
|
+
0
|
|
84
|
+
>>>
|
|
85
|
+
|
|
86
|
+
Please bear in mind that while in the example above we used a previously retrieved domain object as the parameter, you
|
|
87
|
+
can retrieve the domain metadata via its name (string).
|
|
88
|
+
|
|
89
|
+
Adding Items (and attributes)
|
|
90
|
+
-----------------------------
|
|
91
|
+
Once you have your domain setup, presumably, you'll want to start adding items to it.
|
|
92
|
+
In its most straight forward form, you need to provide a name for the item -- think of it
|
|
93
|
+
as a record id -- and a collection of the attributes you want to store in the item (often a Dictionary-like object).
|
|
94
|
+
So, adding an item to a domain looks as follows::
|
|
95
|
+
|
|
96
|
+
>>> item_name = 'ABC_123'
|
|
97
|
+
>>> item_attrs = {'Artist': 'The Jackson 5', 'Genera':'Pop'}
|
|
98
|
+
>>> dom.put_attributes(item_name, item_attrs)
|
|
99
|
+
True
|
|
100
|
+
>>>
|
|
101
|
+
|
|
102
|
+
Now let's check if it worked::
|
|
103
|
+
|
|
104
|
+
>>> domain_meta = conn.domain_metadata(dom)
|
|
105
|
+
>>> domain_meta.item_count
|
|
106
|
+
1
|
|
107
|
+
>>>
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
Batch Adding Items (and attributes)
|
|
111
|
+
-----------------------------------
|
|
112
|
+
You can also add a number of items at the same time in a similar fashion. All you have to provide to the batch_put_attributes() method
|
|
113
|
+
is a Dictionary-like object with your items and their respective attributes, as follows::
|
|
114
|
+
|
|
115
|
+
>>> items = {'item1':{'attr1':'val1'},'item2':{'attr2':'val2'}}
|
|
116
|
+
>>> dom.batch_put_attributes(items)
|
|
117
|
+
True
|
|
118
|
+
>>>
|
|
119
|
+
|
|
120
|
+
Now, let's check the item count once again::
|
|
121
|
+
|
|
122
|
+
>>> domain_meta = conn.domain_metadata(dom)
|
|
123
|
+
>>> domain_meta.item_count
|
|
124
|
+
3
|
|
125
|
+
>>>
|
|
126
|
+
|
|
127
|
+
A few words of warning: both batch_put_attributes() and put_item(), by default, will overwrite the values of the attributes if both
|
|
128
|
+
the item and attribute already exist. If the item exists, but not the attributes, it will append the new attributes to the
|
|
129
|
+
attribute list of that item. If you do not wish these methods to behave in that manner, simply supply them with a 'replace=False'
|
|
130
|
+
parameter.
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
Retrieving Items
|
|
134
|
+
-----------------
|
|
135
|
+
To retrieve an item along with its attributes is a fairly straight forward operation and can be accomplished as follows::
|
|
136
|
+
|
|
137
|
+
>>> dom.get_item('item1')
|
|
138
|
+
{u'attr1': u'val1'}
|
|
139
|
+
>>>
|
|
140
|
+
|
|
141
|
+
Since SimpleDB works in an "eventual consistency" manner, we can also request a forced consistent read (though this will
|
|
142
|
+
invariably adversely affect read performance). The way to accomplish that is as shown below::
|
|
143
|
+
|
|
144
|
+
>>> dom.get_item('item1', consistent_read=True)
|
|
145
|
+
{u'attr1': u'val1'}
|
|
146
|
+
>>>
|
|
147
|
+
|
|
148
|
+
Retrieving One or More Items
|
|
149
|
+
----------------------------
|
|
150
|
+
Another way to retrieve items is through boto's select() method. This method, at the bare minimum, requires a standard SQL select query string
|
|
151
|
+
and you would do something along the lines of::
|
|
152
|
+
|
|
153
|
+
>>> query = 'select * from `test-domain` where attr1="val1"'
|
|
154
|
+
>>> rs = dom.select(query)
|
|
155
|
+
>>> for j in rs:
|
|
156
|
+
... print 'o hai'
|
|
157
|
+
...
|
|
158
|
+
o hai
|
|
159
|
+
>>>
|
|
160
|
+
|
|
161
|
+
This method returns a ResultSet collection you can iterate over.
|
|
162
|
+
|
|
163
|
+
Updating Item Attributes
|
|
164
|
+
------------------------
|
|
165
|
+
The easiest way to modify an item's attributes is by manipulating the item's attributes and then saving those changes. For example::
|
|
166
|
+
|
|
167
|
+
>>> item = dom.get_item('item1')
|
|
168
|
+
>>> item['attr1'] = 'val_changed'
|
|
169
|
+
>>> item.save()
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
Deleting Items (and its attributes)
|
|
173
|
+
-----------------------------------
|
|
174
|
+
Deleting an item is a very simple operation. All you are required to provide is either the name of the item or an item object to the
|
|
175
|
+
delete_item() method, boto will take care of the rest::
|
|
176
|
+
|
|
177
|
+
>>>dom.delete_item(item)
|
|
178
|
+
>>>True
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
Deleting Domains
|
|
183
|
+
-----------------------------------
|
|
184
|
+
To delete a domain and all items under it (i.e. be very careful), you can do it as follows::
|
|
185
|
+
|
|
186
|
+
>>> conn.delete_domain('test-domain')
|
|
187
|
+
True
|
|
188
|
+
>>>
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
.. _sqs_tut:
|
|
2
|
+
|
|
3
|
+
=======================================
|
|
4
|
+
An Introduction to boto's SQS interface
|
|
5
|
+
=======================================
|
|
6
|
+
|
|
7
|
+
This tutorial focuses on the boto interface to the Simple Queue Service
|
|
8
|
+
from Amazon Web Services. This tutorial assumes that you have boto already
|
|
9
|
+
downloaded and installed.
|
|
10
|
+
|
|
11
|
+
Creating a Connection
|
|
12
|
+
---------------------
|
|
13
|
+
The first step in accessing SQS is to create a connection to the service.
|
|
14
|
+
The recommended method of doing this is as follows::
|
|
15
|
+
|
|
16
|
+
>>> import boto.sqs
|
|
17
|
+
>>> conn = boto.sqs.connect_to_region(
|
|
18
|
+
... "us-east-1",
|
|
19
|
+
... aws_access_key_id='<aws access key'>,
|
|
20
|
+
... aws_secret_access_key='<aws secret key>')
|
|
21
|
+
|
|
22
|
+
At this point the variable conn will point to an SQSConnection object in the
|
|
23
|
+
US-EAST-1 region. Bear in mind that just as any other AWS service, SQS is
|
|
24
|
+
region-specific. In this example, the AWS access key and AWS secret key are
|
|
25
|
+
passed in to the method explicitely. Alternatively, you can set the environment
|
|
26
|
+
variables:
|
|
27
|
+
|
|
28
|
+
* ``AWS_ACCESS_KEY_ID`` - Your AWS Access Key ID
|
|
29
|
+
* ``AWS_SECRET_ACCESS_KEY`` - Your AWS Secret Access Key
|
|
30
|
+
|
|
31
|
+
and then simply call::
|
|
32
|
+
|
|
33
|
+
>>> import boto.sqs
|
|
34
|
+
>>> conn = boto.sqs.connect_to_region("us-east-1")
|
|
35
|
+
|
|
36
|
+
In either case, conn will point to an SQSConnection object which we will
|
|
37
|
+
use throughout the remainder of this tutorial.
|
|
38
|
+
|
|
39
|
+
Creating a Queue
|
|
40
|
+
----------------
|
|
41
|
+
Once you have a connection established with SQS, you will probably want to
|
|
42
|
+
create a queue. In its simplest form, that can be accomplished as follows::
|
|
43
|
+
|
|
44
|
+
>>> q = conn.create_queue('myqueue')
|
|
45
|
+
|
|
46
|
+
The create_queue method will create (and return) the requested queue if it does not
|
|
47
|
+
exist or will return the existing queue if it does. There is an
|
|
48
|
+
optional parameter to create_queue called visibility_timeout. This basically
|
|
49
|
+
controls how long a message will remain invisible to other queue readers
|
|
50
|
+
once it has been read (see SQS documentation for more detailed explanation).
|
|
51
|
+
If this is not explicitly specified the queue will be created with whatever
|
|
52
|
+
default value SQS provides (currently 30 seconds). If you would like to
|
|
53
|
+
specify another value, you could do so like this::
|
|
54
|
+
|
|
55
|
+
>>> q = conn.create_queue('myqueue', 120)
|
|
56
|
+
|
|
57
|
+
This would establish a default visibility timeout for this queue of 120
|
|
58
|
+
seconds. As you will see later on, this default value for the queue can
|
|
59
|
+
also be overridden each time a message is read from the queue. If you want
|
|
60
|
+
to check what the default visibility timeout is for a queue::
|
|
61
|
+
|
|
62
|
+
>>> q.get_timeout()
|
|
63
|
+
30
|
|
64
|
+
|
|
65
|
+
Listing all Queues
|
|
66
|
+
------------------
|
|
67
|
+
|
|
68
|
+
To retrieve a list of the queues for your account in the current region::
|
|
69
|
+
|
|
70
|
+
>>> conn.get_all_queues()
|
|
71
|
+
[
|
|
72
|
+
Queue(https://queue.amazonaws.com/411358162645/myqueue),
|
|
73
|
+
Queue(https://queue.amazonaws.com/411358162645/another_queue),
|
|
74
|
+
Queue(https://queue.amazonaws.com/411358162645/another_queue2)
|
|
75
|
+
]
|
|
76
|
+
|
|
77
|
+
This will leave you with a list of all of your :py:class:`boto.sqs.queue.Queue`
|
|
78
|
+
instances. Alternatively, if you wanted to only list the queues that started
|
|
79
|
+
with ``'another'``::
|
|
80
|
+
|
|
81
|
+
>>> conn.get_all_queues(prefix='another')
|
|
82
|
+
[
|
|
83
|
+
Queue(https://queue.amazonaws.com/411358162645/another_queue),
|
|
84
|
+
Queue(https://queue.amazonaws.com/411358162645/another_queue2)
|
|
85
|
+
]
|
|
86
|
+
|
|
87
|
+
Getting a Queue (by name)
|
|
88
|
+
-------------------------
|
|
89
|
+
If you wish to explicitly retrieve an existing queue and the name of the queue is known,
|
|
90
|
+
you can retrieve the queue as follows::
|
|
91
|
+
|
|
92
|
+
>>> my_queue = conn.get_queue('myqueue')
|
|
93
|
+
Queue(https://queue.amazonaws.com/411358162645/myqueue)
|
|
94
|
+
|
|
95
|
+
This leaves you with a single :py:class:`boto.sqs.queue.Queue`, which abstracts
|
|
96
|
+
the SQS Queue named 'myqueue'.
|
|
97
|
+
|
|
98
|
+
Writing Messages
|
|
99
|
+
----------------
|
|
100
|
+
Once you have a queue setup, presumably you will want to write some messages
|
|
101
|
+
to it. SQS doesn't care what kind of information you store in your messages
|
|
102
|
+
or what format you use to store it. As long as the amount of data per
|
|
103
|
+
message is less than or equal to 256Kb, SQS won't complain.
|
|
104
|
+
|
|
105
|
+
So, first we need to create a Message object::
|
|
106
|
+
|
|
107
|
+
>>> from boto.sqs.message import Message
|
|
108
|
+
>>> m = Message()
|
|
109
|
+
>>> m.set_body('This is my first message.')
|
|
110
|
+
>>> status = q.write(m)
|
|
111
|
+
|
|
112
|
+
The write method returns a True if everything went well. If the write
|
|
113
|
+
didn't succeed it will either return a False (meaning SQS simply chose
|
|
114
|
+
not to write the message for some reason) or an exception if there was
|
|
115
|
+
some sort of problem with the request.
|
|
116
|
+
|
|
117
|
+
Writing Messages (Custom Format)
|
|
118
|
+
--------------------------------
|
|
119
|
+
The technique above will work only if you use boto's default Message payload format;
|
|
120
|
+
however, you may have a lot of specific requirements around the format of
|
|
121
|
+
the message data. For example, you may want to store one big string or you might
|
|
122
|
+
want to store something that looks more like RFC822 messages or you might want
|
|
123
|
+
to store a binary payload such as pickled Python objects.
|
|
124
|
+
|
|
125
|
+
The way boto deals with this issue is to define a simple Message object that
|
|
126
|
+
treats the message data as one big string which you can set and get. If that
|
|
127
|
+
Message object meets your needs, you're good to go. However, if you need to
|
|
128
|
+
incorporate different behavior in your message or handle different types of
|
|
129
|
+
data you can create your own Message class. You just need to register that
|
|
130
|
+
class with the boto queue object so that it knows that, when you read a message from the
|
|
131
|
+
queue, it should create one of your message objects rather than the
|
|
132
|
+
default boto Message object. To register your message class, you would::
|
|
133
|
+
|
|
134
|
+
>>> import MyMessage
|
|
135
|
+
>>> q.set_message_class(MyMessage)
|
|
136
|
+
>>> m = MyMessage()
|
|
137
|
+
>>> m.set_body('This is my first message.')
|
|
138
|
+
>>> status = q.write(m)
|
|
139
|
+
|
|
140
|
+
where MyMessage is the class definition for your message class. Your
|
|
141
|
+
message class should subclass the boto Message because there is a small
|
|
142
|
+
bit of Python magic happening in the __setattr__ method of the boto Message
|
|
143
|
+
class.
|
|
144
|
+
|
|
145
|
+
Reading Messages
|
|
146
|
+
----------------
|
|
147
|
+
|
|
148
|
+
So, now we have a message in our queue. How would we go about reading it?
|
|
149
|
+
Here's one way:
|
|
150
|
+
|
|
151
|
+
>>> rs = q.get_messages()
|
|
152
|
+
>>> len(rs)
|
|
153
|
+
1
|
|
154
|
+
>>> m = rs[0]
|
|
155
|
+
>>> m.get_body()
|
|
156
|
+
u'This is my first message'
|
|
157
|
+
|
|
158
|
+
The get_messages method also returns a ResultSet object as described
|
|
159
|
+
above. In addition to the special attributes that we already talked
|
|
160
|
+
about the ResultSet object also contains any results returned by the
|
|
161
|
+
request. To get at the results you can treat the ResultSet as a
|
|
162
|
+
sequence object (e.g. a list). We can check the length (how many results)
|
|
163
|
+
and access particular items within the list using the slice notation
|
|
164
|
+
familiar to Python programmers.
|
|
165
|
+
|
|
166
|
+
At this point, we have read the message from the queue and SQS will make
|
|
167
|
+
sure that this message remains invisible to other readers of the queue
|
|
168
|
+
until the visibility timeout period for the queue expires. If you delete
|
|
169
|
+
the message before the timeout period expires then no one else will ever see
|
|
170
|
+
the message again. However, if you don't delete it (maybe because your reader crashed
|
|
171
|
+
or failed in some way, for example) it will magically reappear in my queue
|
|
172
|
+
for someone else to read. If you aren't happy with the default visibility
|
|
173
|
+
timeout defined for the queue, you can override it when you read a message:
|
|
174
|
+
|
|
175
|
+
>>> q.get_messages(visibility_timeout=60)
|
|
176
|
+
|
|
177
|
+
This means that regardless of what the default visibility timeout is for
|
|
178
|
+
the queue, this message will remain invisible to other readers for 60
|
|
179
|
+
seconds.
|
|
180
|
+
|
|
181
|
+
The get_messages method can also return more than a single message. By
|
|
182
|
+
passing a num_messages parameter (defaults to 1) you can control the maximum
|
|
183
|
+
number of messages that will be returned by the method. To show this
|
|
184
|
+
feature off, first let's load up a few more messages.
|
|
185
|
+
|
|
186
|
+
>>> for i in range(1, 11):
|
|
187
|
+
... m = Message()
|
|
188
|
+
... m.set_body('This is message %d' % i)
|
|
189
|
+
... q.write(m)
|
|
190
|
+
...
|
|
191
|
+
>>> rs = q.get_messages(10)
|
|
192
|
+
>>> len(rs)
|
|
193
|
+
10
|
|
194
|
+
|
|
195
|
+
Don't be alarmed if the length of the result set returned by the get_messages
|
|
196
|
+
call is less than 10. Sometimes it takes some time for new messages to become
|
|
197
|
+
visible in the queue. Give it a minute or two and they will all show up.
|
|
198
|
+
|
|
199
|
+
If you want a slightly simpler way to read messages from a queue, you
|
|
200
|
+
can use the read method. It will either return the message read or
|
|
201
|
+
it will return None if no messages were available. You can also pass
|
|
202
|
+
a visibility_timeout parameter to read, if you desire:
|
|
203
|
+
|
|
204
|
+
>>> m = q.read(60)
|
|
205
|
+
>>> m.get_body()
|
|
206
|
+
u'This is my first message'
|
|
207
|
+
|
|
208
|
+
Deleting Messages and Queues
|
|
209
|
+
----------------------------
|
|
210
|
+
As stated above, messages are never deleted by the queue unless explicitly told to do so.
|
|
211
|
+
To remove a message from a queue:
|
|
212
|
+
|
|
213
|
+
>>> q.delete_message(m)
|
|
214
|
+
[]
|
|
215
|
+
|
|
216
|
+
If I want to delete the entire queue, I would use:
|
|
217
|
+
|
|
218
|
+
>>> conn.delete_queue(q)
|
|
219
|
+
|
|
220
|
+
However, and this is a good safe guard, this won't succeed unless the queue is empty.
|
|
221
|
+
|
|
222
|
+
Additional Information
|
|
223
|
+
----------------------
|
|
224
|
+
The above tutorial covers the basic operations of creating queues, writing messages,
|
|
225
|
+
reading messages, deleting messages, and deleting queues. There are a
|
|
226
|
+
few utility methods in boto that might be useful as well. For example,
|
|
227
|
+
to count the number of messages in a queue:
|
|
228
|
+
|
|
229
|
+
>>> q.count()
|
|
230
|
+
10
|
|
231
|
+
|
|
232
|
+
This can be handy but is command as well as the other two utility methods
|
|
233
|
+
I'll describe in a minute are inefficient and should be used with caution
|
|
234
|
+
on queues with lots of messages (e.g. many hundreds or more). Similarly,
|
|
235
|
+
you can clear (delete) all messages in a queue with:
|
|
236
|
+
|
|
237
|
+
>>> q.clear()
|
|
238
|
+
|
|
239
|
+
Be REAL careful with that one! Finally, if you want to dump all of the
|
|
240
|
+
messages in a queue to a local file:
|
|
241
|
+
|
|
242
|
+
>>> q.dump('messages.txt', sep='\n------------------\n')
|
|
243
|
+
|
|
244
|
+
This will read all of the messages in the queue and write the bodies of
|
|
245
|
+
each of the messages to the file messages.txt. The option sep argument
|
|
246
|
+
is a separator that will be printed between each message body in the file.
|