txaws-dev team mailing list archive
-
txaws-dev team
-
Mailing list archive
-
Message #00016
[Merge] lp:~djfroofy/txaws/485533-reqestpayment into lp:txaws
Drew Smathers has proposed merging lp:~djfroofy/txaws/485533-reqestpayment into lp:txaws.
Requested reviews:
txAWS Developers (txaws-dev)
Related bugs:
#485533 Implement S3 requestPayment
https://bugs.launchpad.net/bugs/485533
--
https://code.launchpad.net/~djfroofy/txaws/485533-reqestpayment/+merge/35895
Your team txAWS Developers is requested to review the proposed merge of lp:~djfroofy/txaws/485533-reqestpayment into lp:txaws.
=== modified file 'txaws/s3/client.py'
--- txaws/s3/client.py 2009-11-23 00:55:44 +0000
+++ txaws/s3/client.py 2010-09-17 21:57:56 +0000
@@ -221,6 +221,30 @@
return query.submit()
+ def put_request_payment(self, bucket, payer):
+ """
+ Set request payment configuration on bucket to payer.
+ """
+ data = model.RequestPayment(payer).to_xml()
+ query = self.query_factory(
+ action='PUT', creds=self.creds, endpoint=self.endpoint,
+ bucket=bucket, object_name='?requestPayment', data=data)
+ return query.submit()
+
+ def get_request_payment(self, bucket):
+ """
+ Get the request payment configuration on a bucket.
+ """
+ query = self.query_factory(
+ action='GET', creds=self.creds, endpoint=self.endpoint,
+ bucket=bucket, object_name='?requestPayment')
+ return query.submit().addCallback(self._parse_get_request_payment)
+
+
+ def _parse_get_request_payment(self, xml_bytes):
+ return model.RequestPayment.from_xml(xml_bytes).payer
+
+
class Query(BaseQuery):
"""A query for submission to the S3 service."""
=== modified file 'txaws/s3/model.py'
--- txaws/s3/model.py 2009-11-23 00:55:44 +0000
+++ txaws/s3/model.py 2010-09-17 21:57:56 +0000
@@ -1,3 +1,5 @@
+from txaws.util import XML
+
class Bucket(object):
"""
An Amazon S3 storage bucket.
@@ -49,3 +51,25 @@
S3 returns file chunks, 10 MB at a time, until the entire file is returned.
These chunks need to be assembled once they are all returned.
"""
+
+class RequestPayment(object):
+
+ payer_choices = ('Requester', 'BucketOwner')
+
+ def __init__(self, payer):
+ if payer not in self.payer_choices:
+ raise ValueError('Invalid value for payer: `%s`. Must be one of %s' %
+ (payer, ','.join(self.payer_choices)))
+ self.payer = payer
+
+ def to_xml(self):
+ return ('<RequestPaymentConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">\n'
+ ' <Payer>%s</Payer>\n'
+ '</RequestPaymentConfiguration>' % self.payer)
+
+ @classmethod
+ def from_xml(cls, xml_bytes):
+ root = XML(xml_bytes)
+ return cls(root.findtext('Payer'))
+
+
=== modified file 'txaws/s3/tests/test_client.py'
--- txaws/s3/tests/test_client.py 2009-11-23 00:55:44 +0000
+++ txaws/s3/tests/test_client.py 2010-09-17 21:57:56 +0000
@@ -2,6 +2,7 @@
from txaws.credentials import AWSCredentials
from txaws.s3 import client
+from txaws.s3 import model
from txaws.service import AWSServiceEndpoint
from txaws.testing import payload
from txaws.testing.base import TXAWSTestCase
@@ -196,6 +197,64 @@
s3 = client.S3Client(creds, query_factory=StubQuery)
return s3.delete_bucket("mybucket")
+
+ def test_put_request_payment(self):
+
+ class StubQuery(client.Query):
+
+ def __init__(query, action, creds, endpoint, bucket=None,
+ object_name=None, data=None, content_type=None,
+ metadata=None):
+ super(StubQuery, query).__init__(
+ action=action, creds=creds, bucket=bucket,
+ object_name=object_name, data=data,
+ content_type=content_type, metadata=metadata)
+ self.assertEqual(action, "PUT")
+ self.assertEqual(creds.access_key, "foo")
+ self.assertEqual(creds.secret_key, "bar")
+ self.assertEqual(query.bucket, "mybucket")
+ self.assertEqual(query.object_name, "?requestPayment")
+ self.assertEqual(query.data, ('<RequestPaymentConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">\n'
+ ' <Payer>Requester</Payer>\n'
+ '</RequestPaymentConfiguration>'))
+ self.assertEqual(query.metadata, None)
+
+ def submit(query):
+ return succeed(None)
+
+ creds = AWSCredentials("foo", "bar")
+ s3 = client.S3Client(creds, query_factory=StubQuery)
+ return s3.put_request_payment("mybucket", "Requester")
+
+ def test_data_request_payment(self):
+
+ class StubQuery(client.Query):
+
+ def __init__(query, action, creds, endpoint, bucket=None,
+ object_name=None, data=None, content_type=None,
+ metadata=None):
+ super(StubQuery, query).__init__(
+ action=action, creds=creds, bucket=bucket,
+ object_name=object_name, data=data,
+ content_type=content_type, metadata=metadata)
+ self.assertEqual(action, "GET")
+ self.assertEqual(creds.access_key, "foo")
+ self.assertEqual(creds.secret_key, "bar")
+ self.assertEqual(query.bucket, "mybucket")
+ self.assertEqual(query.object_name, "?requestPayment")
+ self.assertEqual(query.metadata, None)
+
+ def submit(query):
+ return succeed(payload.sample_request_payment)
+
+ def check_request_payment(result):
+ self.assertEquals(result, 'Requester')
+
+ creds = AWSCredentials("foo", "bar")
+ s3 = client.S3Client(creds, query_factory=StubQuery)
+ return s3.get_request_payment("mybucket").addCallback(check_request_payment)
+
+
def test_put_object(self):
class StubQuery(client.Query):
@@ -474,3 +533,10 @@
def test_content_md5(self):
self.assertEqual(calculate_md5("somedata"), "rvr3UC1SmUw7AZV2NqPN0g==")
+
+ def test_request_payment_enum(self):
+ model.RequestPayment('Requester')
+ model.RequestPayment('BucketOwner')
+ self.assertRaises(ValueError, model.RequestPayment, 'Bob')
+
+
=== modified file 'txaws/testing/payload.py'
--- txaws/testing/payload.py 2010-07-20 10:15:48 +0000
+++ txaws/testing/payload.py 2010-09-17 21:57:56 +0000
@@ -878,6 +878,13 @@
</ListBucketResult>
""" % (version.s3_api,)
+
+sample_request_payment = """\
+<?xml version="1.0" encoding="UTF-8"?>
+<RequestPaymentConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
+ <Payer>Requester</Payer>
+</RequestPaymentConfiguration>"""
+
sample_s3_signature_mismatch = """\
<?xml version="1.0" encoding="UTF-8"?>
<Error>