googlecloud 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/googlecloud.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,23 @@
|
|
1
|
+
# Copyright (c) 2006,2007 Mitch Garnaat http://garnaat.org/
|
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
|
+
|
@@ -0,0 +1,97 @@
|
|
1
|
+
# Copyright (C) 2003-2007 Robey Pointer <robey@lag.net>
|
2
|
+
#
|
3
|
+
# This file is part of paramiko.
|
4
|
+
#
|
5
|
+
# Paramiko is free software; you can redistribute it and/or modify it under the
|
6
|
+
# terms of the GNU Lesser General Public License as published by the Free
|
7
|
+
# Software Foundation; either version 2.1 of the License, or (at your option)
|
8
|
+
# any later version.
|
9
|
+
#
|
10
|
+
# Paramiko is distrubuted in the hope that it will be useful, but WITHOUT ANY
|
11
|
+
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
12
|
+
# A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
|
13
|
+
# details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Lesser General Public License
|
16
|
+
# along with Paramiko; if not, write to the Free Software Foundation, Inc.,
|
17
|
+
# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
18
|
+
|
19
|
+
|
20
|
+
import socket
|
21
|
+
import sys
|
22
|
+
|
23
|
+
# windows does not have termios...
|
24
|
+
try:
|
25
|
+
import termios
|
26
|
+
import tty
|
27
|
+
has_termios = True
|
28
|
+
except ImportError:
|
29
|
+
has_termios = False
|
30
|
+
|
31
|
+
|
32
|
+
def interactive_shell(chan):
|
33
|
+
if has_termios:
|
34
|
+
posix_shell(chan)
|
35
|
+
else:
|
36
|
+
windows_shell(chan)
|
37
|
+
|
38
|
+
|
39
|
+
def posix_shell(chan):
|
40
|
+
import select
|
41
|
+
|
42
|
+
oldtty = termios.tcgetattr(sys.stdin)
|
43
|
+
try:
|
44
|
+
tty.setraw(sys.stdin.fileno())
|
45
|
+
tty.setcbreak(sys.stdin.fileno())
|
46
|
+
chan.settimeout(0.0)
|
47
|
+
|
48
|
+
while True:
|
49
|
+
r, w, e = select.select([chan, sys.stdin], [], [])
|
50
|
+
if chan in r:
|
51
|
+
try:
|
52
|
+
x = chan.recv(1024)
|
53
|
+
if len(x) == 0:
|
54
|
+
print '\r\n*** EOF\r\n',
|
55
|
+
break
|
56
|
+
sys.stdout.write(x)
|
57
|
+
sys.stdout.flush()
|
58
|
+
except socket.timeout:
|
59
|
+
pass
|
60
|
+
if sys.stdin in r:
|
61
|
+
x = sys.stdin.read(1)
|
62
|
+
if len(x) == 0:
|
63
|
+
break
|
64
|
+
chan.send(x)
|
65
|
+
|
66
|
+
finally:
|
67
|
+
termios.tcsetattr(sys.stdin, termios.TCSADRAIN, oldtty)
|
68
|
+
|
69
|
+
|
70
|
+
# thanks to Mike Looijmans for this code
|
71
|
+
def windows_shell(chan):
|
72
|
+
import threading
|
73
|
+
|
74
|
+
sys.stdout.write("Line-buffered terminal emulation. Press F6 or ^Z to send EOF.\r\n\r\n")
|
75
|
+
|
76
|
+
def writeall(sock):
|
77
|
+
while True:
|
78
|
+
data = sock.recv(256)
|
79
|
+
if not data:
|
80
|
+
sys.stdout.write('\r\n*** EOF ***\r\n\r\n')
|
81
|
+
sys.stdout.flush()
|
82
|
+
break
|
83
|
+
sys.stdout.write(data)
|
84
|
+
sys.stdout.flush()
|
85
|
+
|
86
|
+
writer = threading.Thread(target=writeall, args=(chan,))
|
87
|
+
writer.start()
|
88
|
+
|
89
|
+
try:
|
90
|
+
while True:
|
91
|
+
d = sys.stdin.read(1)
|
92
|
+
if not d:
|
93
|
+
break
|
94
|
+
chan.send(d)
|
95
|
+
except EOFError:
|
96
|
+
# user hit ^Z or F6
|
97
|
+
pass
|
@@ -0,0 +1,115 @@
|
|
1
|
+
# Copyright (c) 2006,2007 Mitch Garnaat http://garnaat.org/
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining a
|
4
|
+
# copy of this software and associated documentation files (the
|
5
|
+
# "Software"), to deal in the Software without restriction, including
|
6
|
+
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
7
|
+
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
8
|
+
# persons to whom the Software is furnished to do so, subject to the fol-
|
9
|
+
# lowing conditions:
|
10
|
+
#
|
11
|
+
# The above copyright notice and this permission notice shall be included
|
12
|
+
# in all copies or substantial portions of the Software.
|
13
|
+
#
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
15
|
+
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
16
|
+
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
17
|
+
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
18
|
+
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
19
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
20
|
+
# IN THE SOFTWARE.
|
21
|
+
|
22
|
+
import os
|
23
|
+
|
24
|
+
def int_val_fn(v):
|
25
|
+
try:
|
26
|
+
int(v)
|
27
|
+
return True
|
28
|
+
except:
|
29
|
+
return False
|
30
|
+
|
31
|
+
class IObject(object):
|
32
|
+
|
33
|
+
def choose_from_list(self, item_list, search_str='',
|
34
|
+
prompt='Enter Selection'):
|
35
|
+
if not item_list:
|
36
|
+
print 'No Choices Available'
|
37
|
+
return
|
38
|
+
choice = None
|
39
|
+
while not choice:
|
40
|
+
n = 1
|
41
|
+
choices = []
|
42
|
+
for item in item_list:
|
43
|
+
if isinstance(item, basestring):
|
44
|
+
print '[%d] %s' % (n, item)
|
45
|
+
choices.append(item)
|
46
|
+
n += 1
|
47
|
+
else:
|
48
|
+
obj, id, desc = item
|
49
|
+
if desc:
|
50
|
+
if desc.find(search_str) >= 0:
|
51
|
+
print '[%d] %s - %s' % (n, id, desc)
|
52
|
+
choices.append(obj)
|
53
|
+
n += 1
|
54
|
+
else:
|
55
|
+
if id.find(search_str) >= 0:
|
56
|
+
print '[%d] %s' % (n, id)
|
57
|
+
choices.append(obj)
|
58
|
+
n += 1
|
59
|
+
if choices:
|
60
|
+
val = raw_input('%s[1-%d]: ' % (prompt, len(choices)))
|
61
|
+
if val.startswith('/'):
|
62
|
+
search_str = val[1:]
|
63
|
+
else:
|
64
|
+
try:
|
65
|
+
int_val = int(val)
|
66
|
+
if int_val == 0:
|
67
|
+
return None
|
68
|
+
choice = choices[int_val-1]
|
69
|
+
except ValueError:
|
70
|
+
print '%s is not a valid choice' % val
|
71
|
+
except IndexError:
|
72
|
+
print '%s is not within the range[1-%d]' % (val,
|
73
|
+
len(choices))
|
74
|
+
else:
|
75
|
+
print "No objects matched your pattern"
|
76
|
+
search_str = ''
|
77
|
+
return choice
|
78
|
+
|
79
|
+
def get_string(self, prompt, validation_fn=None):
|
80
|
+
okay = False
|
81
|
+
while not okay:
|
82
|
+
val = raw_input('%s: ' % prompt)
|
83
|
+
if validation_fn:
|
84
|
+
okay = validation_fn(val)
|
85
|
+
if not okay:
|
86
|
+
print 'Invalid value: %s' % val
|
87
|
+
else:
|
88
|
+
okay = True
|
89
|
+
return val
|
90
|
+
|
91
|
+
def get_filename(self, prompt):
|
92
|
+
okay = False
|
93
|
+
val = ''
|
94
|
+
while not okay:
|
95
|
+
val = raw_input('%s: %s' % (prompt, val))
|
96
|
+
val = os.path.expanduser(val)
|
97
|
+
if os.path.isfile(val):
|
98
|
+
okay = True
|
99
|
+
elif os.path.isdir(val):
|
100
|
+
path = val
|
101
|
+
val = self.choose_from_list(os.listdir(path))
|
102
|
+
if val:
|
103
|
+
val = os.path.join(path, val)
|
104
|
+
okay = True
|
105
|
+
else:
|
106
|
+
val = ''
|
107
|
+
else:
|
108
|
+
print 'Invalid value: %s' % val
|
109
|
+
val = ''
|
110
|
+
return val
|
111
|
+
|
112
|
+
def get_int(self, prompt):
|
113
|
+
s = self.get_string(prompt, int_val_fn)
|
114
|
+
return int(s)
|
115
|
+
|
@@ -0,0 +1,211 @@
|
|
1
|
+
# Copyright (c) 2006,2007 Mitch Garnaat http://garnaat.org/
|
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
|
+
High-level abstraction of an EC2 order for servers
|
24
|
+
"""
|
25
|
+
|
26
|
+
import boto
|
27
|
+
import boto.ec2
|
28
|
+
from boto.mashups.server import Server, ServerSet
|
29
|
+
from boto.mashups.iobject import IObject
|
30
|
+
from boto.pyami.config import Config
|
31
|
+
from boto.sdb.persist import get_domain, set_domain
|
32
|
+
import time, StringIO
|
33
|
+
|
34
|
+
InstanceTypes = ['m1.small', 'm1.large', 'm1.xlarge', 'c1.medium', 'c1.xlarge']
|
35
|
+
|
36
|
+
class Item(IObject):
|
37
|
+
|
38
|
+
def __init__(self):
|
39
|
+
self.region = None
|
40
|
+
self.name = None
|
41
|
+
self.instance_type = None
|
42
|
+
self.quantity = 0
|
43
|
+
self.zone = None
|
44
|
+
self.ami = None
|
45
|
+
self.groups = []
|
46
|
+
self.key = None
|
47
|
+
self.ec2 = None
|
48
|
+
self.config = None
|
49
|
+
|
50
|
+
def set_userdata(self, key, value):
|
51
|
+
self.userdata[key] = value
|
52
|
+
|
53
|
+
def get_userdata(self, key):
|
54
|
+
return self.userdata[key]
|
55
|
+
|
56
|
+
def set_region(self, region=None):
|
57
|
+
if region:
|
58
|
+
self.region = region
|
59
|
+
else:
|
60
|
+
l = [(r, r.name, r.endpoint) for r in boto.ec2.regions()]
|
61
|
+
self.region = self.choose_from_list(l, prompt='Choose Region')
|
62
|
+
|
63
|
+
def set_name(self, name=None):
|
64
|
+
if name:
|
65
|
+
self.name = name
|
66
|
+
else:
|
67
|
+
self.name = self.get_string('Name')
|
68
|
+
|
69
|
+
def set_instance_type(self, instance_type=None):
|
70
|
+
if instance_type:
|
71
|
+
self.instance_type = instance_type
|
72
|
+
else:
|
73
|
+
self.instance_type = self.choose_from_list(InstanceTypes, 'Instance Type')
|
74
|
+
|
75
|
+
def set_quantity(self, n=0):
|
76
|
+
if n > 0:
|
77
|
+
self.quantity = n
|
78
|
+
else:
|
79
|
+
self.quantity = self.get_int('Quantity')
|
80
|
+
|
81
|
+
def set_zone(self, zone=None):
|
82
|
+
if zone:
|
83
|
+
self.zone = zone
|
84
|
+
else:
|
85
|
+
l = [(z, z.name, z.state) for z in self.ec2.get_all_zones()]
|
86
|
+
self.zone = self.choose_from_list(l, prompt='Choose Availability Zone')
|
87
|
+
|
88
|
+
def set_ami(self, ami=None):
|
89
|
+
if ami:
|
90
|
+
self.ami = ami
|
91
|
+
else:
|
92
|
+
l = [(a, a.id, a.location) for a in self.ec2.get_all_images()]
|
93
|
+
self.ami = self.choose_from_list(l, prompt='Choose AMI')
|
94
|
+
|
95
|
+
def add_group(self, group=None):
|
96
|
+
if group:
|
97
|
+
self.groups.append(group)
|
98
|
+
else:
|
99
|
+
l = [(s, s.name, s.description) for s in self.ec2.get_all_security_groups()]
|
100
|
+
self.groups.append(self.choose_from_list(l, prompt='Choose Security Group'))
|
101
|
+
|
102
|
+
def set_key(self, key=None):
|
103
|
+
if key:
|
104
|
+
self.key = key
|
105
|
+
else:
|
106
|
+
l = [(k, k.name, '') for k in self.ec2.get_all_key_pairs()]
|
107
|
+
self.key = self.choose_from_list(l, prompt='Choose Keypair')
|
108
|
+
|
109
|
+
def update_config(self):
|
110
|
+
if not self.config.has_section('Credentials'):
|
111
|
+
self.config.add_section('Credentials')
|
112
|
+
self.config.set('Credentials', 'aws_access_key_id', self.ec2.aws_access_key_id)
|
113
|
+
self.config.set('Credentials', 'aws_secret_access_key', self.ec2.aws_secret_access_key)
|
114
|
+
if not self.config.has_section('Pyami'):
|
115
|
+
self.config.add_section('Pyami')
|
116
|
+
sdb_domain = get_domain()
|
117
|
+
if sdb_domain:
|
118
|
+
self.config.set('Pyami', 'server_sdb_domain', sdb_domain)
|
119
|
+
self.config.set('Pyami', 'server_sdb_name', self.name)
|
120
|
+
|
121
|
+
def set_config(self, config_path=None):
|
122
|
+
if not config_path:
|
123
|
+
config_path = self.get_filename('Specify Config file')
|
124
|
+
self.config = Config(path=config_path)
|
125
|
+
|
126
|
+
def get_userdata_string(self):
|
127
|
+
s = StringIO.StringIO()
|
128
|
+
self.config.write(s)
|
129
|
+
return s.getvalue()
|
130
|
+
|
131
|
+
def enter(self, **params):
|
132
|
+
self.region = params.get('region', self.region)
|
133
|
+
if not self.region:
|
134
|
+
self.set_region()
|
135
|
+
self.ec2 = self.region.connect()
|
136
|
+
self.name = params.get('name', self.name)
|
137
|
+
if not self.name:
|
138
|
+
self.set_name()
|
139
|
+
self.instance_type = params.get('instance_type', self.instance_type)
|
140
|
+
if not self.instance_type:
|
141
|
+
self.set_instance_type()
|
142
|
+
self.zone = params.get('zone', self.zone)
|
143
|
+
if not self.zone:
|
144
|
+
self.set_zone()
|
145
|
+
self.quantity = params.get('quantity', self.quantity)
|
146
|
+
if not self.quantity:
|
147
|
+
self.set_quantity()
|
148
|
+
self.ami = params.get('ami', self.ami)
|
149
|
+
if not self.ami:
|
150
|
+
self.set_ami()
|
151
|
+
self.groups = params.get('groups', self.groups)
|
152
|
+
if not self.groups:
|
153
|
+
self.add_group()
|
154
|
+
self.key = params.get('key', self.key)
|
155
|
+
if not self.key:
|
156
|
+
self.set_key()
|
157
|
+
self.config = params.get('config', self.config)
|
158
|
+
if not self.config:
|
159
|
+
self.set_config()
|
160
|
+
self.update_config()
|
161
|
+
|
162
|
+
class Order(IObject):
|
163
|
+
|
164
|
+
def __init__(self):
|
165
|
+
self.items = []
|
166
|
+
self.reservation = None
|
167
|
+
|
168
|
+
def add_item(self, **params):
|
169
|
+
item = Item()
|
170
|
+
item.enter(**params)
|
171
|
+
self.items.append(item)
|
172
|
+
|
173
|
+
def display(self):
|
174
|
+
print 'This Order consists of the following items'
|
175
|
+
print
|
176
|
+
print 'QTY\tNAME\tTYPE\nAMI\t\tGroups\t\t\tKeyPair'
|
177
|
+
for item in self.items:
|
178
|
+
print '%s\t%s\t%s\t%s\t%s\t%s' % (item.quantity, item.name, item.instance_type,
|
179
|
+
item.ami.id, item.groups, item.key.name)
|
180
|
+
|
181
|
+
def place(self, block=True):
|
182
|
+
if get_domain() == None:
|
183
|
+
print 'SDB Persistence Domain not set'
|
184
|
+
domain_name = self.get_string('Specify SDB Domain')
|
185
|
+
set_domain(domain_name)
|
186
|
+
s = ServerSet()
|
187
|
+
for item in self.items:
|
188
|
+
r = item.ami.run(min_count=1, max_count=item.quantity,
|
189
|
+
key_name=item.key.name, user_data=item.get_userdata_string(),
|
190
|
+
security_groups=item.groups, instance_type=item.instance_type,
|
191
|
+
placement=item.zone.name)
|
192
|
+
if block:
|
193
|
+
states = [i.state for i in r.instances]
|
194
|
+
if states.count('running') != len(states):
|
195
|
+
print states
|
196
|
+
time.sleep(15)
|
197
|
+
states = [i.update() for i in r.instances]
|
198
|
+
for i in r.instances:
|
199
|
+
server = Server()
|
200
|
+
server.name = item.name
|
201
|
+
server.instance_id = i.id
|
202
|
+
server.reservation = r
|
203
|
+
server.save()
|
204
|
+
s.append(server)
|
205
|
+
if len(s) == 1:
|
206
|
+
return s[0]
|
207
|
+
else:
|
208
|
+
return s
|
209
|
+
|
210
|
+
|
211
|
+
|
@@ -0,0 +1,395 @@
|
|
1
|
+
# Copyright (c) 2006,2007 Mitch Garnaat http://garnaat.org/
|
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
|
+
High-level abstraction of an EC2 server
|
24
|
+
"""
|
25
|
+
import boto
|
26
|
+
import boto.utils
|
27
|
+
from boto.mashups.iobject import IObject
|
28
|
+
from boto.pyami.config import Config, BotoConfigPath
|
29
|
+
from boto.mashups.interactive import interactive_shell
|
30
|
+
from boto.sdb.db.model import Model
|
31
|
+
from boto.sdb.db.property import StringProperty
|
32
|
+
import os
|
33
|
+
import StringIO
|
34
|
+
|
35
|
+
|
36
|
+
class ServerSet(list):
|
37
|
+
|
38
|
+
def __getattr__(self, name):
|
39
|
+
results = []
|
40
|
+
is_callable = False
|
41
|
+
for server in self:
|
42
|
+
try:
|
43
|
+
val = getattr(server, name)
|
44
|
+
if callable(val):
|
45
|
+
is_callable = True
|
46
|
+
results.append(val)
|
47
|
+
except:
|
48
|
+
results.append(None)
|
49
|
+
if is_callable:
|
50
|
+
self.map_list = results
|
51
|
+
return self.map
|
52
|
+
return results
|
53
|
+
|
54
|
+
def map(self, *args):
|
55
|
+
results = []
|
56
|
+
for fn in self.map_list:
|
57
|
+
results.append(fn(*args))
|
58
|
+
return results
|
59
|
+
|
60
|
+
class Server(Model):
|
61
|
+
|
62
|
+
@property
|
63
|
+
def ec2(self):
|
64
|
+
if self._ec2 is None:
|
65
|
+
self._ec2 = boto.connect_ec2()
|
66
|
+
return self._ec2
|
67
|
+
|
68
|
+
@classmethod
|
69
|
+
def Inventory(cls):
|
70
|
+
"""
|
71
|
+
Returns a list of Server instances, one for each Server object
|
72
|
+
persisted in the db
|
73
|
+
"""
|
74
|
+
l = ServerSet()
|
75
|
+
rs = cls.find()
|
76
|
+
for server in rs:
|
77
|
+
l.append(server)
|
78
|
+
return l
|
79
|
+
|
80
|
+
@classmethod
|
81
|
+
def Register(cls, name, instance_id, description=''):
|
82
|
+
s = cls()
|
83
|
+
s.name = name
|
84
|
+
s.instance_id = instance_id
|
85
|
+
s.description = description
|
86
|
+
s.save()
|
87
|
+
return s
|
88
|
+
|
89
|
+
def __init__(self, id=None, **kw):
|
90
|
+
Model.__init__(self, id, **kw)
|
91
|
+
self._reservation = None
|
92
|
+
self._instance = None
|
93
|
+
self._ssh_client = None
|
94
|
+
self._pkey = None
|
95
|
+
self._config = None
|
96
|
+
self._ec2 = None
|
97
|
+
|
98
|
+
name = StringProperty(unique=True, verbose_name="Name")
|
99
|
+
instance_id = StringProperty(verbose_name="Instance ID")
|
100
|
+
config_uri = StringProperty()
|
101
|
+
ami_id = StringProperty(verbose_name="AMI ID")
|
102
|
+
zone = StringProperty(verbose_name="Availability Zone")
|
103
|
+
security_group = StringProperty(verbose_name="Security Group", default="default")
|
104
|
+
key_name = StringProperty(verbose_name="Key Name")
|
105
|
+
elastic_ip = StringProperty(verbose_name="Elastic IP")
|
106
|
+
instance_type = StringProperty(verbose_name="Instance Type")
|
107
|
+
description = StringProperty(verbose_name="Description")
|
108
|
+
log = StringProperty()
|
109
|
+
|
110
|
+
def setReadOnly(self, value):
|
111
|
+
raise AttributeError
|
112
|
+
|
113
|
+
def getInstance(self):
|
114
|
+
if not self._instance:
|
115
|
+
if self.instance_id:
|
116
|
+
try:
|
117
|
+
rs = self.ec2.get_all_instances([self.instance_id])
|
118
|
+
except:
|
119
|
+
return None
|
120
|
+
if len(rs) > 0:
|
121
|
+
self._reservation = rs[0]
|
122
|
+
self._instance = self._reservation.instances[0]
|
123
|
+
return self._instance
|
124
|
+
|
125
|
+
instance = property(getInstance, setReadOnly, None, 'The Instance for the server')
|
126
|
+
|
127
|
+
def getAMI(self):
|
128
|
+
if self.instance:
|
129
|
+
return self.instance.image_id
|
130
|
+
|
131
|
+
ami = property(getAMI, setReadOnly, None, 'The AMI for the server')
|
132
|
+
|
133
|
+
def getStatus(self):
|
134
|
+
if self.instance:
|
135
|
+
self.instance.update()
|
136
|
+
return self.instance.state
|
137
|
+
|
138
|
+
status = property(getStatus, setReadOnly, None,
|
139
|
+
'The status of the server')
|
140
|
+
|
141
|
+
def getHostname(self):
|
142
|
+
if self.instance:
|
143
|
+
return self.instance.public_dns_name
|
144
|
+
|
145
|
+
hostname = property(getHostname, setReadOnly, None,
|
146
|
+
'The public DNS name of the server')
|
147
|
+
|
148
|
+
def getPrivateHostname(self):
|
149
|
+
if self.instance:
|
150
|
+
return self.instance.private_dns_name
|
151
|
+
|
152
|
+
private_hostname = property(getPrivateHostname, setReadOnly, None,
|
153
|
+
'The private DNS name of the server')
|
154
|
+
|
155
|
+
def getLaunchTime(self):
|
156
|
+
if self.instance:
|
157
|
+
return self.instance.launch_time
|
158
|
+
|
159
|
+
launch_time = property(getLaunchTime, setReadOnly, None,
|
160
|
+
'The time the Server was started')
|
161
|
+
|
162
|
+
def getConsoleOutput(self):
|
163
|
+
if self.instance:
|
164
|
+
return self.instance.get_console_output()
|
165
|
+
|
166
|
+
console_output = property(getConsoleOutput, setReadOnly, None,
|
167
|
+
'Retrieve the console output for server')
|
168
|
+
|
169
|
+
def getGroups(self):
|
170
|
+
if self._reservation:
|
171
|
+
return self._reservation.groups
|
172
|
+
else:
|
173
|
+
return None
|
174
|
+
|
175
|
+
groups = property(getGroups, setReadOnly, None,
|
176
|
+
'The Security Groups controlling access to this server')
|
177
|
+
|
178
|
+
def getConfig(self):
|
179
|
+
if not self._config:
|
180
|
+
remote_file = BotoConfigPath
|
181
|
+
local_file = '%s.ini' % self.instance.id
|
182
|
+
self.get_file(remote_file, local_file)
|
183
|
+
self._config = Config(local_file)
|
184
|
+
return self._config
|
185
|
+
|
186
|
+
def setConfig(self, config):
|
187
|
+
local_file = '%s.ini' % self.instance.id
|
188
|
+
fp = open(local_file)
|
189
|
+
config.write(fp)
|
190
|
+
fp.close()
|
191
|
+
self.put_file(local_file, BotoConfigPath)
|
192
|
+
self._config = config
|
193
|
+
|
194
|
+
config = property(getConfig, setConfig, None,
|
195
|
+
'The instance data for this server')
|
196
|
+
|
197
|
+
def set_config(self, config):
|
198
|
+
"""
|
199
|
+
Set SDB based config
|
200
|
+
"""
|
201
|
+
self._config = config
|
202
|
+
self._config.dump_to_sdb("botoConfigs", self.id)
|
203
|
+
|
204
|
+
def load_config(self):
|
205
|
+
self._config = Config(do_load=False)
|
206
|
+
self._config.load_from_sdb("botoConfigs", self.id)
|
207
|
+
|
208
|
+
def stop(self):
|
209
|
+
if self.instance:
|
210
|
+
self.instance.stop()
|
211
|
+
|
212
|
+
def start(self):
|
213
|
+
self.stop()
|
214
|
+
ec2 = boto.connect_ec2()
|
215
|
+
ami = ec2.get_all_images(image_ids = [str(self.ami_id)])[0]
|
216
|
+
groups = ec2.get_all_security_groups(groupnames=[str(self.security_group)])
|
217
|
+
if not self._config:
|
218
|
+
self.load_config()
|
219
|
+
if not self._config.has_section("Credentials"):
|
220
|
+
self._config.add_section("Credentials")
|
221
|
+
self._config.set("Credentials", "aws_access_key_id", ec2.aws_access_key_id)
|
222
|
+
self._config.set("Credentials", "aws_secret_access_key", ec2.aws_secret_access_key)
|
223
|
+
|
224
|
+
if not self._config.has_section("Pyami"):
|
225
|
+
self._config.add_section("Pyami")
|
226
|
+
|
227
|
+
if self._manager.domain:
|
228
|
+
self._config.set('Pyami', 'server_sdb_domain', self._manager.domain.name)
|
229
|
+
self._config.set("Pyami", 'server_sdb_name', self.name)
|
230
|
+
|
231
|
+
cfg = StringIO.StringIO()
|
232
|
+
self._config.write(cfg)
|
233
|
+
cfg = cfg.getvalue()
|
234
|
+
r = ami.run(min_count=1,
|
235
|
+
max_count=1,
|
236
|
+
key_name=self.key_name,
|
237
|
+
security_groups = groups,
|
238
|
+
instance_type = self.instance_type,
|
239
|
+
placement = self.zone,
|
240
|
+
user_data = cfg)
|
241
|
+
i = r.instances[0]
|
242
|
+
self.instance_id = i.id
|
243
|
+
self.put()
|
244
|
+
if self.elastic_ip:
|
245
|
+
ec2.associate_address(self.instance_id, self.elastic_ip)
|
246
|
+
|
247
|
+
def reboot(self):
|
248
|
+
if self.instance:
|
249
|
+
self.instance.reboot()
|
250
|
+
|
251
|
+
def get_ssh_client(self, key_file=None, host_key_file='~/.ssh/known_hosts',
|
252
|
+
uname='root'):
|
253
|
+
import paramiko
|
254
|
+
if not self.instance:
|
255
|
+
print 'No instance yet!'
|
256
|
+
return
|
257
|
+
if not self._ssh_client:
|
258
|
+
if not key_file:
|
259
|
+
iobject = IObject()
|
260
|
+
key_file = iobject.get_filename('Path to OpenSSH Key file')
|
261
|
+
self._pkey = paramiko.RSAKey.from_private_key_file(key_file)
|
262
|
+
self._ssh_client = paramiko.SSHClient()
|
263
|
+
self._ssh_client.load_system_host_keys()
|
264
|
+
self._ssh_client.load_host_keys(os.path.expanduser(host_key_file))
|
265
|
+
self._ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
266
|
+
self._ssh_client.connect(self.instance.public_dns_name,
|
267
|
+
username=uname, pkey=self._pkey)
|
268
|
+
return self._ssh_client
|
269
|
+
|
270
|
+
def get_file(self, remotepath, localpath):
|
271
|
+
ssh_client = self.get_ssh_client()
|
272
|
+
sftp_client = ssh_client.open_sftp()
|
273
|
+
sftp_client.get(remotepath, localpath)
|
274
|
+
|
275
|
+
def put_file(self, localpath, remotepath):
|
276
|
+
ssh_client = self.get_ssh_client()
|
277
|
+
sftp_client = ssh_client.open_sftp()
|
278
|
+
sftp_client.put(localpath, remotepath)
|
279
|
+
|
280
|
+
def listdir(self, remotepath):
|
281
|
+
ssh_client = self.get_ssh_client()
|
282
|
+
sftp_client = ssh_client.open_sftp()
|
283
|
+
return sftp_client.listdir(remotepath)
|
284
|
+
|
285
|
+
def shell(self, key_file=None):
|
286
|
+
ssh_client = self.get_ssh_client(key_file)
|
287
|
+
channel = ssh_client.invoke_shell()
|
288
|
+
interactive_shell(channel)
|
289
|
+
|
290
|
+
def bundle_image(self, prefix, key_file, cert_file, size):
|
291
|
+
print 'bundling image...'
|
292
|
+
print '\tcopying cert and pk over to /mnt directory on server'
|
293
|
+
ssh_client = self.get_ssh_client()
|
294
|
+
sftp_client = ssh_client.open_sftp()
|
295
|
+
path, name = os.path.split(key_file)
|
296
|
+
remote_key_file = '/mnt/%s' % name
|
297
|
+
self.put_file(key_file, remote_key_file)
|
298
|
+
path, name = os.path.split(cert_file)
|
299
|
+
remote_cert_file = '/mnt/%s' % name
|
300
|
+
self.put_file(cert_file, remote_cert_file)
|
301
|
+
print '\tdeleting %s' % BotoConfigPath
|
302
|
+
# delete the metadata.ini file if it exists
|
303
|
+
try:
|
304
|
+
sftp_client.remove(BotoConfigPath)
|
305
|
+
except:
|
306
|
+
pass
|
307
|
+
command = 'sudo ec2-bundle-vol '
|
308
|
+
command += '-c %s -k %s ' % (remote_cert_file, remote_key_file)
|
309
|
+
command += '-u %s ' % self._reservation.owner_id
|
310
|
+
command += '-p %s ' % prefix
|
311
|
+
command += '-s %d ' % size
|
312
|
+
command += '-d /mnt '
|
313
|
+
if self.instance.instance_type == 'm1.small' or self.instance_type == 'c1.medium':
|
314
|
+
command += '-r i386'
|
315
|
+
else:
|
316
|
+
command += '-r x86_64'
|
317
|
+
print '\t%s' % command
|
318
|
+
t = ssh_client.exec_command(command)
|
319
|
+
response = t[1].read()
|
320
|
+
print '\t%s' % response
|
321
|
+
print '\t%s' % t[2].read()
|
322
|
+
print '...complete!'
|
323
|
+
|
324
|
+
def upload_bundle(self, bucket, prefix):
|
325
|
+
print 'uploading bundle...'
|
326
|
+
command = 'ec2-upload-bundle '
|
327
|
+
command += '-m /mnt/%s.manifest.xml ' % prefix
|
328
|
+
command += '-b %s ' % bucket
|
329
|
+
command += '-a %s ' % self.ec2.aws_access_key_id
|
330
|
+
command += '-s %s ' % self.ec2.aws_secret_access_key
|
331
|
+
print '\t%s' % command
|
332
|
+
ssh_client = self.get_ssh_client()
|
333
|
+
t = ssh_client.exec_command(command)
|
334
|
+
response = t[1].read()
|
335
|
+
print '\t%s' % response
|
336
|
+
print '\t%s' % t[2].read()
|
337
|
+
print '...complete!'
|
338
|
+
|
339
|
+
def create_image(self, bucket=None, prefix=None, key_file=None, cert_file=None, size=None):
|
340
|
+
iobject = IObject()
|
341
|
+
if not bucket:
|
342
|
+
bucket = iobject.get_string('Name of S3 bucket')
|
343
|
+
if not prefix:
|
344
|
+
prefix = iobject.get_string('Prefix for AMI file')
|
345
|
+
if not key_file:
|
346
|
+
key_file = iobject.get_filename('Path to RSA private key file')
|
347
|
+
if not cert_file:
|
348
|
+
cert_file = iobject.get_filename('Path to RSA public cert file')
|
349
|
+
if not size:
|
350
|
+
size = iobject.get_int('Size (in MB) of bundled image')
|
351
|
+
self.bundle_image(prefix, key_file, cert_file, size)
|
352
|
+
self.upload_bundle(bucket, prefix)
|
353
|
+
print 'registering image...'
|
354
|
+
self.image_id = self.ec2.register_image('%s/%s.manifest.xml' % (bucket, prefix))
|
355
|
+
return self.image_id
|
356
|
+
|
357
|
+
def attach_volume(self, volume, device="/dev/sdp"):
|
358
|
+
"""
|
359
|
+
Attach an EBS volume to this server
|
360
|
+
|
361
|
+
:param volume: EBS Volume to attach
|
362
|
+
:type volume: boto.ec2.volume.Volume
|
363
|
+
|
364
|
+
:param device: Device to attach to (default to /dev/sdp)
|
365
|
+
:type device: string
|
366
|
+
"""
|
367
|
+
if hasattr(volume, "id"):
|
368
|
+
volume_id = volume.id
|
369
|
+
else:
|
370
|
+
volume_id = volume
|
371
|
+
return self.ec2.attach_volume(volume_id=volume_id, instance_id=self.instance_id, device=device)
|
372
|
+
|
373
|
+
def detach_volume(self, volume):
|
374
|
+
"""
|
375
|
+
Detach an EBS volume from this server
|
376
|
+
|
377
|
+
:param volume: EBS Volume to detach
|
378
|
+
:type volume: boto.ec2.volume.Volume
|
379
|
+
"""
|
380
|
+
if hasattr(volume, "id"):
|
381
|
+
volume_id = volume.id
|
382
|
+
else:
|
383
|
+
volume_id = volume
|
384
|
+
return self.ec2.detach_volume(volume_id=volume_id, instance_id=self.instance_id)
|
385
|
+
|
386
|
+
def install_package(self, package_name):
|
387
|
+
print 'installing %s...' % package_name
|
388
|
+
command = 'yum -y install %s' % package_name
|
389
|
+
print '\t%s' % command
|
390
|
+
ssh_client = self.get_ssh_client()
|
391
|
+
t = ssh_client.exec_command(command)
|
392
|
+
response = t[1].read()
|
393
|
+
print '\t%s' % response
|
394
|
+
print '\t%s' % t[2].read()
|
395
|
+
print '...complete!'
|