Arsene Rei has proposed merging lp:~dreamhosters/txaws/921352-get-bucket-notification-method into lp:txaws.
Requested reviews: txAWS Technical List (txaws-tech) Related bugs: Bug #921350 in txAWS: "S3: Add GET Bucket notification method" https://bugs.launchpad.net/txaws/+bug/921350 For more details, see: https://code.launchpad.net/~dreamhosters/txaws/921352-get-bucket-notification-method/+merge/90521 Add GET Bucket notification functionality -- https://code.launchpad.net/~dreamhosters/txaws/921352-get-bucket-notification-method/+merge/90521 Your team txAWS Technical List is requested to review the proposed merge of lp:~dreamhosters/txaws/921352-get-bucket-notification-method into lp:txaws.
=== modified file 'txaws/s3/client.py' --- txaws/s3/client.py 2012-01-27 07:04:32 +0000 +++ txaws/s3/client.py 2012-01-27 20:16:22 +0000 @@ -22,7 +22,8 @@ from txaws.s3.acls import AccessControlPolicy from txaws.s3.model import ( Bucket, BucketItem, BucketListing, ItemOwner, LifecycleConfiguration, - LifecycleConfigurationRule, RequestPayment, WebsiteConfiguration) + LifecycleConfigurationRule, NotificationConfiguration, RequestPayment, + WebsiteConfiguration) from txaws.s3.exception import S3Error from txaws.service import AWSServiceEndpoint, S3_ENDPOINT from txaws.util import XML, calculate_md5 @@ -231,6 +232,27 @@ return WebsiteConfiguration(index_suffix, error_key) + def get_bucket_notification_config(self, bucket): + """ + Get the notification configuration of a bucket. + + @param bucket: The name of the bucket. + @return: A C{Deferred} that will request the bucket's notification + configuration. + """ + query = self.query_factory( + action='GET', creds=self.creds, endpoint=self.endpoint, + bucket=bucket, object_name='?notification') + return query.submit().addCallback(self._parse_notification_config) + + def _parse_notification_config(self, xml_bytes): + """Parse a C{NotificationConfiguration} XML document.""" + root = XML(xml_bytes) + topic = root.findtext("TopicConfiguration/Topic") + event = root.findtext("TopicConfiguration/Event") + + return NotificationConfiguration(topic, event) + def get_bucket_acl(self, bucket): """ Get the access control policy for a bucket. === modified file 'txaws/s3/model.py' --- txaws/s3/model.py 2012-01-27 07:04:32 +0000 +++ txaws/s3/model.py 2012-01-27 20:16:22 +0000 @@ -81,6 +81,15 @@ self.error_key = error_key +class NotificationConfiguration(object): + """ + A mapping for the data in a bucket notification configuration. + """ + def __init__(self, topic=None, event=None): + self.topic = topic + self.event = event + + class FileChunk(object): """ An Amazon S3 file chunk. === modified file 'txaws/s3/tests/test_client.py' --- txaws/s3/tests/test_client.py 2012-01-27 07:04:32 +0000 +++ txaws/s3/tests/test_client.py 2012-01-27 20:16:22 +0000 @@ -201,7 +201,8 @@ """ L{S3Client.get_bucket_location} creates a L{Query} to get a bucket's location. It parses the returned C{LocationConstraint} XML document - and returns a C{Deferred} that fires with the bucket's region. + and returns a C{Deferred} that requests the bucket's location + constraint. """ class StubQuery(client.Query): @@ -235,7 +236,8 @@ """ L{S3Client.get_bucket_lifecycle} creates a L{Query} to get a bucket's lifecycle. It parses the returned C{LifecycleConfiguration} XML - document and returns a C{Deferred} that fires with the bucket's region. + document and returns a C{Deferred} that requests the bucket's lifecycle + configuration with multiple rules. """ class StubQuery(client.Query): @@ -275,7 +277,8 @@ """ L{S3Client.get_bucket_lifecycle} creates a L{Query} to get a bucket's lifecycle. It parses the returned C{LifecycleConfiguration} XML - document and returns a C{Deferred} that fires with the bucket's region. + document and returns a C{Deferred} that requests the bucket's lifecycle + configuration. """ class StubQuery(client.Query): @@ -314,7 +317,7 @@ L{S3Client.get_bucket_website_config} creates a L{Query} to get a bucket's website configurtion. It parses the returned C{WebsiteConfiguration} XML document and returns a C{Deferred} that - fires with the bucket's region. + requests the bucket's website configuration. """ class StubQuery(client.Query): @@ -351,7 +354,7 @@ L{S3Client.get_bucket_website_config} creates a L{Query} to get a bucket's website configurtion. It parses the returned C{WebsiteConfiguration} XML document and returns a C{Deferred} that - fires with the bucket's region. + requests the bucket's website configuration with the error document. """ class StubQuery(client.Query): @@ -382,6 +385,82 @@ d = s3.get_bucket_website_config("mybucket") return d.addCallback(check_results) + def test_get_bucket_notification_config(self): + """ + L{S3Client.get_bucket_notification_config} creates a L{Query} to get a + bucket's notification configuration. It parses the returned + C{NotificationConfiguration} XML document and returns a C{Deferred} + that requests the bucket's notification configuration. + """ + + class StubQuery(client.Query): + + def __init__(query, action, creds, endpoint, bucket=None, + object_name=None): + super(StubQuery, query).__init__(action=action, creds=creds, + bucket=bucket, + object_name=object_name) + self.assertEquals(action, "GET") + self.assertEqual(creds.access_key, "foo") + self.assertEqual(creds.secret_key, "bar") + self.assertEqual(query.bucket, "mybucket") + self.assertEqual(query.object_name, "?notification") + self.assertEqual(query.data, "") + self.assertEqual(query.metadata, {}) + self.assertEqual(query.amz_headers, {}) + + def submit(query, url_context=None): + return succeed(payload. + sample_s3_get_bucket_notification_result) + + def check_results(notification_config): + self.assertEquals(notification_config.topic, None) + self.assertEquals(notification_config.event, None) + + creds = AWSCredentials("foo", "bar") + s3 = client.S3Client(creds, query_factory=StubQuery) + d = s3.get_bucket_notification_config("mybucket") + return d.addCallback(check_results) + + def test_get_bucket_notification_config_with_topic(self): + """ + L{S3Client.get_bucket_notification_config} creates a L{Query} to get a + bucket's notification configuration. It parses the returned + C{NotificationConfiguration} XML document and returns a C{Deferred} + that requests the bucket's notification configuration with a topic. + """ + + class StubQuery(client.Query): + + def __init__(query, action, creds, endpoint, bucket=None, + object_name=None): + super(StubQuery, query).__init__(action=action, creds=creds, + bucket=bucket, + object_name=object_name) + self.assertEquals(action, "GET") + self.assertEqual(creds.access_key, "foo") + self.assertEqual(creds.secret_key, "bar") + self.assertEqual(query.bucket, "mybucket") + self.assertEqual(query.object_name, "?notification") + self.assertEqual(query.data, "") + self.assertEqual(query.metadata, {}) + self.assertEqual(query.amz_headers, {}) + + def submit(query, url_context=None): + return succeed(payload. + sample_s3_get_bucket_notification_with_topic_result) + + def check_results(notification_config): + self.assertEquals(notification_config.topic, + "arn:aws:sns:us-east-1:123456789012:myTopic") + self.assertEquals(notification_config.event, + "s3:ReducedRedundancyLostObject") + + creds = AWSCredentials("foo", "bar") + s3 = client.S3Client(creds, query_factory=StubQuery) + d = s3.get_bucket_notification_config("mybucket") + return d.addCallback(check_results) + def test_delete_bucket(self): class StubQuery(client.Query): === modified file 'txaws/testing/payload.py' --- txaws/testing/payload.py 2012-01-27 00:50:35 +0000 +++ txaws/testing/payload.py 2012-01-27 20:16:22 +0000 @@ -1060,3 +1060,14 @@ <Suffix>index.html</Suffix> </IndexDocument> </WebsiteConfiguration>""" + +sample_s3_get_bucket_notification_result = """\ +<NotificationConfiguration />""" + +sample_s3_get_bucket_notification_with_topic_result = """\ +<NotificationConfiguration> + <TopicConfiguration> + <Topic>arn:aws:sns:us-east-1:123456789012:myTopic</Topic> + <Event>s3:ReducedRedundancyLostObject</Event> + </TopicConfiguration> +</NotificationConfiguration>"""
_______________________________________________ Mailing list: https://launchpad.net/~txaws-dev Post to : txaws-dev@lists.launchpad.net Unsubscribe : https://launchpad.net/~txaws-dev More help : https://help.launchpad.net/ListHelp