← Back to team overview

txaws-dev team mailing list archive

[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>