mirror of https://github.com/apache/jclouds.git
Issue 23: added bucket logging
git-svn-id: http://jclouds.googlecode.com/svn/trunk@2548 3d8758e0-26b5-11de-8745-db77d3ebf521
This commit is contained in:
parent
bfd9fa8d53
commit
1e0e63ddd2
|
@ -37,9 +37,12 @@ import javax.ws.rs.Path;
|
||||||
import javax.ws.rs.PathParam;
|
import javax.ws.rs.PathParam;
|
||||||
|
|
||||||
import org.jclouds.aws.s3.binders.BindACLToXMLPayload;
|
import org.jclouds.aws.s3.binders.BindACLToXMLPayload;
|
||||||
|
import org.jclouds.aws.s3.binders.BindBucketLoggingToXmlPayload;
|
||||||
|
import org.jclouds.aws.s3.binders.BindNoBucketLoggingToXmlPayload;
|
||||||
import org.jclouds.aws.s3.binders.BindPayerToXmlPayload;
|
import org.jclouds.aws.s3.binders.BindPayerToXmlPayload;
|
||||||
import org.jclouds.aws.s3.binders.BindS3ObjectToPayload;
|
import org.jclouds.aws.s3.binders.BindS3ObjectToPayload;
|
||||||
import org.jclouds.aws.s3.domain.AccessControlList;
|
import org.jclouds.aws.s3.domain.AccessControlList;
|
||||||
|
import org.jclouds.aws.s3.domain.BucketLogging;
|
||||||
import org.jclouds.aws.s3.domain.BucketMetadata;
|
import org.jclouds.aws.s3.domain.BucketMetadata;
|
||||||
import org.jclouds.aws.s3.domain.ListBucketResponse;
|
import org.jclouds.aws.s3.domain.ListBucketResponse;
|
||||||
import org.jclouds.aws.s3.domain.ObjectMetadata;
|
import org.jclouds.aws.s3.domain.ObjectMetadata;
|
||||||
|
@ -57,6 +60,7 @@ import org.jclouds.aws.s3.options.ListBucketOptions;
|
||||||
import org.jclouds.aws.s3.options.PutBucketOptions;
|
import org.jclouds.aws.s3.options.PutBucketOptions;
|
||||||
import org.jclouds.aws.s3.options.PutObjectOptions;
|
import org.jclouds.aws.s3.options.PutObjectOptions;
|
||||||
import org.jclouds.aws.s3.xml.AccessControlListHandler;
|
import org.jclouds.aws.s3.xml.AccessControlListHandler;
|
||||||
|
import org.jclouds.aws.s3.xml.BucketLoggingHandler;
|
||||||
import org.jclouds.aws.s3.xml.CopyObjectHandler;
|
import org.jclouds.aws.s3.xml.CopyObjectHandler;
|
||||||
import org.jclouds.aws.s3.xml.ListAllMyBucketsHandler;
|
import org.jclouds.aws.s3.xml.ListAllMyBucketsHandler;
|
||||||
import org.jclouds.aws.s3.xml.ListBucketHandler;
|
import org.jclouds.aws.s3.xml.ListBucketHandler;
|
||||||
|
@ -268,4 +272,32 @@ public interface S3AsyncClient {
|
||||||
Future<Boolean> putObjectACL(@HostPrefixParam String bucketName, @PathParam("key") String key,
|
Future<Boolean> putObjectACL(@HostPrefixParam String bucketName, @PathParam("key") String key,
|
||||||
@BinderParam(BindACLToXMLPayload.class) AccessControlList acl);
|
@BinderParam(BindACLToXMLPayload.class) AccessControlList acl);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see S3Client#getBucketLogging
|
||||||
|
*/
|
||||||
|
@GET
|
||||||
|
@QueryParams(keys = "logging")
|
||||||
|
@XMLResponseParser(BucketLoggingHandler.class)
|
||||||
|
@ExceptionParser(ThrowContainerNotFoundOn404.class)
|
||||||
|
@Path("/")
|
||||||
|
Future<BucketLogging> getBucketLogging(@HostPrefixParam String bucketName);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see S3Client#enableBucketLogging
|
||||||
|
*/
|
||||||
|
@PUT
|
||||||
|
@Path("/")
|
||||||
|
@QueryParams(keys = "logging")
|
||||||
|
Future<Void> enableBucketLogging(@HostPrefixParam String bucketName,
|
||||||
|
@BinderParam(BindBucketLoggingToXmlPayload.class) BucketLogging logging);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see S3Client#putBucketLogging
|
||||||
|
*/
|
||||||
|
@PUT
|
||||||
|
@Path("/")
|
||||||
|
@QueryParams(keys = "logging")
|
||||||
|
Future<Void> disableBucketLogging(
|
||||||
|
@BinderParam(BindNoBucketLoggingToXmlPayload.class) @HostPrefixParam String bucketName);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,6 +29,7 @@ import java.util.concurrent.Future;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
import org.jclouds.aws.s3.domain.AccessControlList;
|
import org.jclouds.aws.s3.domain.AccessControlList;
|
||||||
|
import org.jclouds.aws.s3.domain.BucketLogging;
|
||||||
import org.jclouds.aws.s3.domain.BucketMetadata;
|
import org.jclouds.aws.s3.domain.BucketMetadata;
|
||||||
import org.jclouds.aws.s3.domain.ListBucketResponse;
|
import org.jclouds.aws.s3.domain.ListBucketResponse;
|
||||||
import org.jclouds.aws.s3.domain.ObjectMetadata;
|
import org.jclouds.aws.s3.domain.ObjectMetadata;
|
||||||
|
@ -388,4 +389,40 @@ public interface S3Client {
|
||||||
* />
|
* />
|
||||||
*/
|
*/
|
||||||
void setBucketPayer(String bucketName, Payer payer);
|
void setBucketPayer(String bucketName, Payer payer);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inspects the logging status for a bucket.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @param bucketName
|
||||||
|
* the bucket you wish to know the logging status
|
||||||
|
* @return bucketLogging configuration or null, if not configured
|
||||||
|
*
|
||||||
|
* @see <a href= "http://docs.amazonwebservices.com/AmazonS3/latest/index.html?ServerLogs.html"
|
||||||
|
* />
|
||||||
|
*/
|
||||||
|
BucketLogging getBucketLogging(String bucketName);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enables logging for a bucket.
|
||||||
|
*
|
||||||
|
* @param bucketName
|
||||||
|
* the bucket you wish to enable logging for
|
||||||
|
* @param logging
|
||||||
|
* configuration including destination, prefix, and access rules
|
||||||
|
* @see <a href= "http://docs.amazonwebservices.com/AmazonS3/latest/index.html?ServerLogs.html"
|
||||||
|
* />
|
||||||
|
*/
|
||||||
|
void enableBucketLogging(String bucketName, BucketLogging logging);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Disables logging for a bucket.
|
||||||
|
*
|
||||||
|
* @param bucketName
|
||||||
|
* the bucket you wish to disable logging for
|
||||||
|
*
|
||||||
|
* @see <a href= "http://docs.amazonwebservices.com/AmazonS3/latest/index.html?ServerLogs.html"
|
||||||
|
* />
|
||||||
|
*/
|
||||||
|
void disableBucketLogging(String bucketName);
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,6 +42,10 @@ import org.jclouds.util.Utils;
|
||||||
|
|
||||||
import com.jamesmurty.utils.XMLBuilder;
|
import com.jamesmurty.utils.XMLBuilder;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author James Murty
|
||||||
|
*/
|
||||||
public class BindACLToXMLPayload implements Binder {
|
public class BindACLToXMLPayload implements Binder {
|
||||||
|
|
||||||
public void bindToRequest(HttpRequest request, Object payload) {
|
public void bindToRequest(HttpRequest request, Object payload) {
|
||||||
|
|
|
@ -0,0 +1,97 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright (C) 2009 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||||
|
*
|
||||||
|
* ====================================================================
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
* ====================================================================
|
||||||
|
*/
|
||||||
|
package org.jclouds.aws.s3.binders;
|
||||||
|
|
||||||
|
import java.util.Properties;
|
||||||
|
|
||||||
|
import javax.ws.rs.core.HttpHeaders;
|
||||||
|
import javax.ws.rs.core.MediaType;
|
||||||
|
import javax.xml.parsers.FactoryConfigurationError;
|
||||||
|
import javax.xml.parsers.ParserConfigurationException;
|
||||||
|
|
||||||
|
import org.jclouds.aws.s3.domain.BucketLogging;
|
||||||
|
import org.jclouds.aws.s3.domain.AccessControlList.CanonicalUserGrantee;
|
||||||
|
import org.jclouds.aws.s3.domain.AccessControlList.EmailAddressGrantee;
|
||||||
|
import org.jclouds.aws.s3.domain.AccessControlList.Grant;
|
||||||
|
import org.jclouds.aws.s3.domain.AccessControlList.GroupGrantee;
|
||||||
|
import org.jclouds.aws.s3.reference.S3Constants;
|
||||||
|
import org.jclouds.http.HttpRequest;
|
||||||
|
import org.jclouds.rest.Binder;
|
||||||
|
import org.jclouds.util.Utils;
|
||||||
|
|
||||||
|
import com.jamesmurty.utils.XMLBuilder;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
public class BindBucketLoggingToXmlPayload implements Binder {
|
||||||
|
|
||||||
|
public void bindToRequest(HttpRequest request, Object payload) {
|
||||||
|
BucketLogging from = (BucketLogging) payload;
|
||||||
|
Properties outputProperties = new Properties();
|
||||||
|
outputProperties.put(javax.xml.transform.OutputKeys.OMIT_XML_DECLARATION, "yes");
|
||||||
|
try {
|
||||||
|
String stringPayload = generateBuilder(from).asString(outputProperties);
|
||||||
|
request.getHeaders().put(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_XML);
|
||||||
|
request.getHeaders().put(HttpHeaders.CONTENT_LENGTH, stringPayload.getBytes().length + "");
|
||||||
|
request.setPayload(stringPayload);
|
||||||
|
} catch (Exception e) {
|
||||||
|
Utils.rethrowIfRuntime(e);
|
||||||
|
throw new RuntimeException("error transforming bucketLogging: " + from, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected XMLBuilder generateBuilder(BucketLogging bucketLogging)
|
||||||
|
throws ParserConfigurationException, FactoryConfigurationError {
|
||||||
|
XMLBuilder rootBuilder = XMLBuilder.create("BucketLoggingStatus").attr("xmlns",
|
||||||
|
S3Constants.S3_REST_API_XML_NAMESPACE).e("LoggingEnabled");
|
||||||
|
rootBuilder.e("TargetBucket").t(bucketLogging.getTargetBucket());
|
||||||
|
rootBuilder.e("TargetPrefix").t(bucketLogging.getTargetPrefix());
|
||||||
|
XMLBuilder grantsBuilder = rootBuilder.elem("TargetGrants");
|
||||||
|
for (Grant grant : bucketLogging.getTargetGrants()) {
|
||||||
|
XMLBuilder grantBuilder = grantsBuilder.elem("Grant");
|
||||||
|
XMLBuilder granteeBuilder = grantBuilder.elem("Grantee").attr("xmlns:xsi",
|
||||||
|
"http://www.w3.org/2001/XMLSchema-instance");
|
||||||
|
|
||||||
|
if (grant.getGrantee() instanceof GroupGrantee) {
|
||||||
|
granteeBuilder.attr("xsi:type", "Group").elem("URI").text(
|
||||||
|
grant.getGrantee().getIdentifier());
|
||||||
|
} else if (grant.getGrantee() instanceof CanonicalUserGrantee) {
|
||||||
|
CanonicalUserGrantee grantee = (CanonicalUserGrantee) grant.getGrantee();
|
||||||
|
granteeBuilder.attr("xsi:type", "CanonicalUser").elem("ID").text(
|
||||||
|
grantee.getIdentifier()).up();
|
||||||
|
if (grantee.getDisplayName() != null) {
|
||||||
|
granteeBuilder.elem("DisplayName").text(grantee.getDisplayName());
|
||||||
|
}
|
||||||
|
} else if (grant.getGrantee() instanceof EmailAddressGrantee) {
|
||||||
|
granteeBuilder.attr("xsi:type", "AmazonCustomerByEmail").elem("EmailAddress").text(
|
||||||
|
grant.getGrantee().getIdentifier());
|
||||||
|
}
|
||||||
|
grantBuilder.elem("Permission").text(grant.getPermission().toString());
|
||||||
|
}
|
||||||
|
return grantsBuilder;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,45 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright (C) 2009 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||||
|
*
|
||||||
|
* ====================================================================
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
* ====================================================================
|
||||||
|
*/
|
||||||
|
package org.jclouds.aws.s3.binders;
|
||||||
|
|
||||||
|
import javax.ws.rs.core.HttpHeaders;
|
||||||
|
import javax.ws.rs.core.MediaType;
|
||||||
|
|
||||||
|
import org.jclouds.http.HttpRequest;
|
||||||
|
import org.jclouds.rest.Binder;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
public class BindNoBucketLoggingToXmlPayload implements Binder {
|
||||||
|
|
||||||
|
public void bindToRequest(HttpRequest request, Object payload) {
|
||||||
|
String stringPayload = "<BucketLoggingStatus xmlns=\"http://s3.amazonaws.com/doc/2006-03-01/\"/>";
|
||||||
|
request.getHeaders().put(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_XML);
|
||||||
|
request.getHeaders().put(HttpHeaders.CONTENT_LENGTH, stringPayload.getBytes().length + "");
|
||||||
|
request.setPayload(stringPayload);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -302,6 +302,37 @@ public class AccessControlList {
|
||||||
return myGranteeAndPermission.compareTo(otherGranteeAndPermission);
|
return myGranteeAndPermission.compareTo(otherGranteeAndPermission);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
final int prime = 31;
|
||||||
|
int result = 1;
|
||||||
|
result = prime * result + ((grantee == null) ? 0 : grantee.hashCode());
|
||||||
|
result = prime * result + ((permission == null) ? 0 : permission.hashCode());
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (this == obj)
|
||||||
|
return true;
|
||||||
|
if (obj == null)
|
||||||
|
return false;
|
||||||
|
if (getClass() != obj.getClass())
|
||||||
|
return false;
|
||||||
|
Grant other = (Grant) obj;
|
||||||
|
if (grantee == null) {
|
||||||
|
if (other.grantee != null)
|
||||||
|
return false;
|
||||||
|
} else if (!grantee.equals(other.grantee))
|
||||||
|
return false;
|
||||||
|
if (permission == null) {
|
||||||
|
if (other.permission != null)
|
||||||
|
return false;
|
||||||
|
} else if (!permission.equals(other.permission))
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract static class Grantee implements Comparable<Grantee> {
|
public abstract static class Grantee implements Comparable<Grantee> {
|
||||||
|
@ -327,6 +358,31 @@ public class AccessControlList {
|
||||||
public int compareTo(org.jclouds.aws.s3.domain.AccessControlList.Grantee o) {
|
public int compareTo(org.jclouds.aws.s3.domain.AccessControlList.Grantee o) {
|
||||||
return (this == o) ? 0 : getIdentifier().compareTo(o.getIdentifier());
|
return (this == o) ? 0 : getIdentifier().compareTo(o.getIdentifier());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
final int prime = 31;
|
||||||
|
int result = 1;
|
||||||
|
result = prime * result + ((identifier == null) ? 0 : identifier.hashCode());
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (this == obj)
|
||||||
|
return true;
|
||||||
|
if (obj == null)
|
||||||
|
return false;
|
||||||
|
if (getClass() != obj.getClass())
|
||||||
|
return false;
|
||||||
|
Grantee other = (Grantee) obj;
|
||||||
|
if (identifier == null) {
|
||||||
|
if (other.identifier != null)
|
||||||
|
return false;
|
||||||
|
} else if (!identifier.equals(other.identifier))
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class EmailAddressGrantee extends Grantee {
|
public static class EmailAddressGrantee extends Grantee {
|
||||||
|
|
|
@ -0,0 +1,149 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright (C) 2009 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||||
|
*
|
||||||
|
* ====================================================================
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
* ====================================================================
|
||||||
|
*/
|
||||||
|
package org.jclouds.aws.s3.domain;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.jclouds.aws.s3.domain.AccessControlList.Grant;
|
||||||
|
|
||||||
|
import com.google.common.collect.Iterables;
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Each Amazon S3 bucket has an associated XML sub-resource that you can read and write in order to
|
||||||
|
* inspect or change the logging status for that bucket.
|
||||||
|
*
|
||||||
|
* @author Adrian Cole
|
||||||
|
* @see <a href="http://docs.amazonwebservices.com/AmazonS3/latest/index.html?ServerLogs.html"/>
|
||||||
|
*/
|
||||||
|
public class BucketLogging {
|
||||||
|
private final String targetBucket;
|
||||||
|
private final String targetPrefix;
|
||||||
|
private final Set<Grant> targetGrants = Sets.newHashSet();
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param targetBucket
|
||||||
|
* {@link #getTargetBucket}
|
||||||
|
* @param targetPrefix
|
||||||
|
* {@link #getTargetPrefix}
|
||||||
|
* @param targetGrants
|
||||||
|
* {@link #getTargetGrants}
|
||||||
|
*/
|
||||||
|
public BucketLogging(String targetBucket, String targetPrefix, Iterable<Grant> targetGrants) {
|
||||||
|
this.targetBucket = targetBucket;
|
||||||
|
this.targetPrefix = targetPrefix;
|
||||||
|
Iterables.addAll(this.targetGrants, targetGrants);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param targetBucket
|
||||||
|
* {@link #getTargetBucket}
|
||||||
|
* @param targetPrefix
|
||||||
|
* {@link #getTargetPrefix}
|
||||||
|
*/
|
||||||
|
public BucketLogging(String targetBucket, String targetPrefix) {
|
||||||
|
this.targetBucket = targetBucket;
|
||||||
|
this.targetPrefix = targetPrefix;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The bucket owner is automatically granted FULL_CONTROL to all logs delivered to the bucket.
|
||||||
|
* This optional element enables you grant access to others. Any specified TargetGrants are added
|
||||||
|
* to the default ACL. For more information about ACLs, see Access Control Lists.
|
||||||
|
*/
|
||||||
|
public Set<Grant> getTargetGrants() {
|
||||||
|
return targetGrants;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Specifies the bucket where server access logs will be delivered. You can have your logs
|
||||||
|
* delivered to any bucket that you own, including the same bucket that is being logged. You can
|
||||||
|
* also configure multiple buckets to deliver their logs to the same target bucket. In this case
|
||||||
|
* you should choose a different TargetPrefix for each source bucket so that the delivered log
|
||||||
|
* files can be distinguished by key.
|
||||||
|
* <p/>
|
||||||
|
* <h3>Note</h3>
|
||||||
|
*
|
||||||
|
* The source and the target buckets must be in the same location. For more information about
|
||||||
|
* bucket location constraints, see Buckets and Regions
|
||||||
|
*/
|
||||||
|
public String getTargetBucket() {
|
||||||
|
return targetBucket;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This element lets you specify a prefix for the keys that the delivered log files will be
|
||||||
|
* stored under. For information on how the key name for log files is constructed, see Delivery
|
||||||
|
* of Server Access Logs.
|
||||||
|
*/
|
||||||
|
public String getTargetPrefix() {
|
||||||
|
return targetPrefix;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
final int prime = 31;
|
||||||
|
int result = 1;
|
||||||
|
result = prime * result + ((targetBucket == null) ? 0 : targetBucket.hashCode());
|
||||||
|
result = prime * result + ((targetGrants == null) ? 0 : targetGrants.hashCode());
|
||||||
|
result = prime * result + ((targetPrefix == null) ? 0 : targetPrefix.hashCode());
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (this == obj)
|
||||||
|
return true;
|
||||||
|
if (obj == null)
|
||||||
|
return false;
|
||||||
|
if (getClass() != obj.getClass())
|
||||||
|
return false;
|
||||||
|
BucketLogging other = (BucketLogging) obj;
|
||||||
|
if (targetBucket == null) {
|
||||||
|
if (other.targetBucket != null)
|
||||||
|
return false;
|
||||||
|
} else if (!targetBucket.equals(other.targetBucket))
|
||||||
|
return false;
|
||||||
|
if (targetGrants == null) {
|
||||||
|
if (other.targetGrants != null)
|
||||||
|
return false;
|
||||||
|
} else if (!targetGrants.equals(other.targetGrants))
|
||||||
|
return false;
|
||||||
|
if (targetPrefix == null) {
|
||||||
|
if (other.targetPrefix != null)
|
||||||
|
return false;
|
||||||
|
} else if (!targetPrefix.equals(other.targetPrefix))
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "BucketLogging [targetBucket=" + targetBucket + ", targetGrants=" + targetGrants
|
||||||
|
+ ", targetPrefix=" + targetPrefix + "]";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,102 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright (C) 2009 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||||
|
*
|
||||||
|
* ====================================================================
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
* ====================================================================
|
||||||
|
*/
|
||||||
|
package org.jclouds.aws.s3.xml;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.jclouds.aws.s3.domain.BucketLogging;
|
||||||
|
import org.jclouds.aws.s3.domain.AccessControlList.CanonicalUserGrantee;
|
||||||
|
import org.jclouds.aws.s3.domain.AccessControlList.EmailAddressGrantee;
|
||||||
|
import org.jclouds.aws.s3.domain.AccessControlList.Grant;
|
||||||
|
import org.jclouds.aws.s3.domain.AccessControlList.Grantee;
|
||||||
|
import org.jclouds.aws.s3.domain.AccessControlList.GroupGrantee;
|
||||||
|
import org.jclouds.aws.s3.domain.AccessControlList.GroupGranteeURI;
|
||||||
|
import org.jclouds.aws.s3.domain.AccessControlList.Permission;
|
||||||
|
import org.jclouds.http.functions.ParseSax;
|
||||||
|
import org.xml.sax.Attributes;
|
||||||
|
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parses the following XML document:
|
||||||
|
* <p/>
|
||||||
|
* BucketLoggingStatus xmlns="http://s3.amazonaws.com/doc/2006-03-01/"
|
||||||
|
*
|
||||||
|
* @author Adrian Cole
|
||||||
|
* @see <a href="http://docs.amazonwebservices.com/AmazonS3/latest/index.html?ServerLogs.html"/>
|
||||||
|
*/
|
||||||
|
public class BucketLoggingHandler extends ParseSax.HandlerWithResult<BucketLogging> {
|
||||||
|
private Set<Grant> targetGrants = Sets.newHashSet();
|
||||||
|
private StringBuilder currentText = new StringBuilder();
|
||||||
|
|
||||||
|
public BucketLogging getResult() {
|
||||||
|
if (targetBucket == null)
|
||||||
|
return null;
|
||||||
|
return new BucketLogging(targetBucket, targetPrefix, targetGrants);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String currentId;
|
||||||
|
private String currentDisplayName;
|
||||||
|
private String currentGranteeType;
|
||||||
|
private String currentPermission;
|
||||||
|
private Grantee currentGrantee;
|
||||||
|
|
||||||
|
private String targetBucket;
|
||||||
|
private String targetPrefix;
|
||||||
|
|
||||||
|
public void startElement(String uri, String name, String qName, Attributes attrs) {
|
||||||
|
if (qName.equals("Grantee")) {
|
||||||
|
currentGranteeType = attrs.getValue("xsi:type");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void endElement(String uri, String name, String qName) {
|
||||||
|
if (qName.equals("TargetBucket")) {
|
||||||
|
this.targetBucket = currentText.toString().trim();
|
||||||
|
} else if (qName.equals("TargetPrefix")) {
|
||||||
|
this.targetPrefix = currentText.toString().trim();
|
||||||
|
} else if (qName.equals("Grantee")) {
|
||||||
|
if ("AmazonCustomerByEmail".equals(currentGranteeType)) {
|
||||||
|
currentGrantee = new EmailAddressGrantee(currentId);
|
||||||
|
} else if ("CanonicalUser".equals(currentGranteeType)) {
|
||||||
|
currentGrantee = new CanonicalUserGrantee(currentId, currentDisplayName);
|
||||||
|
} else if ("Group".equals(currentGranteeType)) {
|
||||||
|
currentGrantee = new GroupGrantee(GroupGranteeURI.fromURI(currentId));
|
||||||
|
}
|
||||||
|
} else if (qName.equals("Grant")) {
|
||||||
|
targetGrants.add(new Grant(currentGrantee, Permission.valueOf(currentPermission)));
|
||||||
|
} else if (qName.equals("ID") || qName.equals("EmailAddress") || qName.equals("URI")) {
|
||||||
|
currentId = currentText.toString().trim();
|
||||||
|
} else if (qName.equals("DisplayName")) {
|
||||||
|
currentDisplayName = currentText.toString().trim();
|
||||||
|
} else if (qName.equals("Permission")) {
|
||||||
|
currentPermission = currentText.toString().trim();
|
||||||
|
}
|
||||||
|
currentText = new StringBuilder();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void characters(char ch[], int start, int length) {
|
||||||
|
currentText.append(ch, start, length);
|
||||||
|
}
|
||||||
|
}
|
|
@ -33,9 +33,13 @@ import java.net.URI;
|
||||||
import org.jclouds.aws.s3.blobstore.functions.BlobToObject;
|
import org.jclouds.aws.s3.blobstore.functions.BlobToObject;
|
||||||
import org.jclouds.aws.s3.config.S3ObjectModule;
|
import org.jclouds.aws.s3.config.S3ObjectModule;
|
||||||
import org.jclouds.aws.s3.domain.AccessControlList;
|
import org.jclouds.aws.s3.domain.AccessControlList;
|
||||||
|
import org.jclouds.aws.s3.domain.BucketLogging;
|
||||||
import org.jclouds.aws.s3.domain.CannedAccessPolicy;
|
import org.jclouds.aws.s3.domain.CannedAccessPolicy;
|
||||||
import org.jclouds.aws.s3.domain.Payer;
|
import org.jclouds.aws.s3.domain.Payer;
|
||||||
import org.jclouds.aws.s3.domain.S3Object;
|
import org.jclouds.aws.s3.domain.S3Object;
|
||||||
|
import org.jclouds.aws.s3.domain.AccessControlList.EmailAddressGrantee;
|
||||||
|
import org.jclouds.aws.s3.domain.AccessControlList.Grant;
|
||||||
|
import org.jclouds.aws.s3.domain.AccessControlList.Permission;
|
||||||
import org.jclouds.aws.s3.filters.RequestAuthorizeSignature;
|
import org.jclouds.aws.s3.filters.RequestAuthorizeSignature;
|
||||||
import org.jclouds.aws.s3.functions.ParseObjectFromHeadersAndHttpContent;
|
import org.jclouds.aws.s3.functions.ParseObjectFromHeadersAndHttpContent;
|
||||||
import org.jclouds.aws.s3.functions.ParseObjectMetadataFromHeaders;
|
import org.jclouds.aws.s3.functions.ParseObjectMetadataFromHeaders;
|
||||||
|
@ -47,6 +51,7 @@ import org.jclouds.aws.s3.options.PutBucketOptions;
|
||||||
import org.jclouds.aws.s3.options.PutObjectOptions;
|
import org.jclouds.aws.s3.options.PutObjectOptions;
|
||||||
import org.jclouds.aws.s3.reference.S3Constants;
|
import org.jclouds.aws.s3.reference.S3Constants;
|
||||||
import org.jclouds.aws.s3.xml.AccessControlListHandler;
|
import org.jclouds.aws.s3.xml.AccessControlListHandler;
|
||||||
|
import org.jclouds.aws.s3.xml.BucketLoggingHandler;
|
||||||
import org.jclouds.aws.s3.xml.CopyObjectHandler;
|
import org.jclouds.aws.s3.xml.CopyObjectHandler;
|
||||||
import org.jclouds.aws.s3.xml.ListAllMyBucketsHandler;
|
import org.jclouds.aws.s3.xml.ListAllMyBucketsHandler;
|
||||||
import org.jclouds.aws.s3.xml.ListBucketHandler;
|
import org.jclouds.aws.s3.xml.ListBucketHandler;
|
||||||
|
@ -71,9 +76,11 @@ import org.jclouds.rest.RestClientTest;
|
||||||
import org.jclouds.rest.internal.GeneratedHttpRequest;
|
import org.jclouds.rest.internal.GeneratedHttpRequest;
|
||||||
import org.jclouds.rest.internal.RestAnnotationProcessor;
|
import org.jclouds.rest.internal.RestAnnotationProcessor;
|
||||||
import org.jclouds.util.Jsr330;
|
import org.jclouds.util.Jsr330;
|
||||||
|
import org.jclouds.util.Utils;
|
||||||
import org.testng.annotations.BeforeClass;
|
import org.testng.annotations.BeforeClass;
|
||||||
import org.testng.annotations.Test;
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableSet;
|
||||||
import com.google.inject.AbstractModule;
|
import com.google.inject.AbstractModule;
|
||||||
import com.google.inject.Module;
|
import com.google.inject.Module;
|
||||||
import com.google.inject.Provides;
|
import com.google.inject.Provides;
|
||||||
|
@ -407,6 +414,60 @@ public class S3AsyncClientTest extends RestClientTest<S3AsyncClient> {
|
||||||
checkFilters(httpMethod);
|
checkFilters(httpMethod);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testGetBucketLogging() throws SecurityException, NoSuchMethodException, IOException {
|
||||||
|
Method method = S3AsyncClient.class.getMethod("getBucketLogging", String.class);
|
||||||
|
GeneratedHttpRequest<S3AsyncClient> httpMethod = processor.createRequest(method, "bucket");
|
||||||
|
|
||||||
|
assertRequestLineEquals(httpMethod, "GET http://bucket.stub:8080/?logging HTTP/1.1");
|
||||||
|
assertHeadersEqual(httpMethod, "Host: bucket.stub\n");
|
||||||
|
assertPayloadEquals(httpMethod, null);
|
||||||
|
|
||||||
|
assertResponseParserClassEquals(method, httpMethod, ParseSax.class);
|
||||||
|
assertSaxResponseParserClassEquals(method, BucketLoggingHandler.class);
|
||||||
|
assertExceptionParserClassEquals(method, ThrowContainerNotFoundOn404.class);
|
||||||
|
|
||||||
|
checkFilters(httpMethod);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testDisableBucketLogging() throws SecurityException, NoSuchMethodException,
|
||||||
|
IOException {
|
||||||
|
Method method = S3AsyncClient.class.getMethod("disableBucketLogging", String.class);
|
||||||
|
GeneratedHttpRequest<S3AsyncClient> httpMethod = processor.createRequest(method, "bucket");
|
||||||
|
|
||||||
|
assertRequestLineEquals(httpMethod, "PUT http://bucket.stub:8080/?logging HTTP/1.1");
|
||||||
|
assertHeadersEqual(httpMethod,
|
||||||
|
"Content-Length: 70\nContent-Type: text/xml\nHost: bucket.stub\n");
|
||||||
|
assertPayloadEquals(httpMethod,
|
||||||
|
"<BucketLoggingStatus xmlns=\"http://s3.amazonaws.com/doc/2006-03-01/\"/>");
|
||||||
|
|
||||||
|
assertResponseParserClassEquals(method, httpMethod, ReturnVoidIf2xx.class);
|
||||||
|
assertSaxResponseParserClassEquals(method, null);
|
||||||
|
assertExceptionParserClassEquals(method, null);
|
||||||
|
|
||||||
|
checkFilters(httpMethod);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testEnableBucketLoggingOwner() throws SecurityException, NoSuchMethodException,
|
||||||
|
IOException {
|
||||||
|
Method method = S3AsyncClient.class.getMethod("enableBucketLogging", String.class,
|
||||||
|
BucketLogging.class);
|
||||||
|
GeneratedHttpRequest<S3AsyncClient> httpMethod = processor.createRequest(method, "bucket",
|
||||||
|
new BucketLogging("mylogs", "access_log-", ImmutableSet.<Grant> of(new Grant(
|
||||||
|
new EmailAddressGrantee("adrian@jclouds.org"), Permission.FULL_CONTROL))));
|
||||||
|
|
||||||
|
assertRequestLineEquals(httpMethod, "PUT http://bucket.stub:8080/?logging HTTP/1.1");
|
||||||
|
assertHeadersEqual(httpMethod,
|
||||||
|
"Content-Length: 433\nContent-Type: text/xml\nHost: bucket.stub\n");
|
||||||
|
assertPayloadEquals(httpMethod, Utils.toStringAndClose(getClass().getResourceAsStream(
|
||||||
|
"/s3/bucket_logging.xml")));
|
||||||
|
|
||||||
|
assertResponseParserClassEquals(method, httpMethod, ReturnVoidIf2xx.class);
|
||||||
|
assertSaxResponseParserClassEquals(method, null);
|
||||||
|
assertExceptionParserClassEquals(method, null);
|
||||||
|
|
||||||
|
checkFilters(httpMethod);
|
||||||
|
}
|
||||||
|
|
||||||
BlobToObject blobToS3Object;
|
BlobToObject blobToS3Object;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -0,0 +1,48 @@
|
||||||
|
package org.jclouds.aws.s3.binders;
|
||||||
|
|
||||||
|
import static org.testng.Assert.assertEquals;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.URI;
|
||||||
|
|
||||||
|
import javax.ws.rs.core.HttpHeaders;
|
||||||
|
|
||||||
|
import org.jclouds.aws.s3.domain.BucketLogging;
|
||||||
|
import org.jclouds.aws.s3.domain.AccessControlList.EmailAddressGrantee;
|
||||||
|
import org.jclouds.aws.s3.domain.AccessControlList.Grant;
|
||||||
|
import org.jclouds.aws.s3.domain.AccessControlList.Permission;
|
||||||
|
import org.jclouds.http.HttpRequest;
|
||||||
|
import org.jclouds.http.functions.BaseHandlerTest;
|
||||||
|
import org.jclouds.util.Utils;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests behavior of {@code BindBucketLoggingToXmlPayload}
|
||||||
|
*
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
@Test(groups = "unit", testName = "s3.BindBucketLoggingToXmlPayloadTest")
|
||||||
|
public class BindBucketLoggingToXmlPayloadTest extends BaseHandlerTest {
|
||||||
|
|
||||||
|
public void testApplyInputStream() throws IOException {
|
||||||
|
|
||||||
|
BucketLogging bucketLogging = new BucketLogging("mylogs", "access_log-", ImmutableSet
|
||||||
|
.<Grant> of(new Grant(new EmailAddressGrantee("adrian@jclouds.org"),
|
||||||
|
Permission.FULL_CONTROL)));
|
||||||
|
|
||||||
|
String expected = Utils.toStringAndClose(getClass().getResourceAsStream(
|
||||||
|
"/s3/bucket_logging.xml"));
|
||||||
|
|
||||||
|
HttpRequest request = new HttpRequest("GET", URI.create("http://test"));
|
||||||
|
BindBucketLoggingToXmlPayload binder = injector
|
||||||
|
.getInstance(BindBucketLoggingToXmlPayload.class);
|
||||||
|
|
||||||
|
binder.bindToRequest(request, bucketLogging);
|
||||||
|
assertEquals(request.getFirstHeaderOrNull(HttpHeaders.CONTENT_TYPE), "text/xml");
|
||||||
|
assertEquals(request.getFirstHeaderOrNull(HttpHeaders.CONTENT_LENGTH), "433");
|
||||||
|
assertEquals(request.getPayload().getRawContent(), expected);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,35 @@
|
||||||
|
package org.jclouds.aws.s3.binders;
|
||||||
|
|
||||||
|
import static org.testng.Assert.assertEquals;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.URI;
|
||||||
|
|
||||||
|
import javax.ws.rs.core.HttpHeaders;
|
||||||
|
|
||||||
|
import org.jclouds.http.HttpRequest;
|
||||||
|
import org.jclouds.http.functions.BaseHandlerTest;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests behavior of {@code BindNoBucketLoggingToXmlPayload}
|
||||||
|
*
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
@Test(groups = "unit", testName = "s3.BindNoBucketLoggingToXmlPayloadTest")
|
||||||
|
public class BindNoBucketLoggingToXmlPayloadTest extends BaseHandlerTest {
|
||||||
|
|
||||||
|
public void testApplyInputStream() throws IOException {
|
||||||
|
|
||||||
|
HttpRequest request = new HttpRequest("GET", URI.create("http://test"));
|
||||||
|
BindNoBucketLoggingToXmlPayload binder = injector
|
||||||
|
.getInstance(BindNoBucketLoggingToXmlPayload.class);
|
||||||
|
|
||||||
|
binder.bindToRequest(request, null);
|
||||||
|
assertEquals(request.getFirstHeaderOrNull(HttpHeaders.CONTENT_TYPE), "text/xml");
|
||||||
|
assertEquals(request.getFirstHeaderOrNull(HttpHeaders.CONTENT_LENGTH), "70");
|
||||||
|
assertEquals(request.getPayload().getRawContent(),
|
||||||
|
"<BucketLoggingStatus xmlns=\"http://s3.amazonaws.com/doc/2006-03-01/\"/>");
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -43,6 +43,7 @@ import org.jclouds.aws.s3.blobstore.functions.BucketToContainerListOptions;
|
||||||
import org.jclouds.aws.s3.blobstore.functions.ObjectToBlob;
|
import org.jclouds.aws.s3.blobstore.functions.ObjectToBlob;
|
||||||
import org.jclouds.aws.s3.blobstore.functions.ResourceToBucketList;
|
import org.jclouds.aws.s3.blobstore.functions.ResourceToBucketList;
|
||||||
import org.jclouds.aws.s3.domain.AccessControlList;
|
import org.jclouds.aws.s3.domain.AccessControlList;
|
||||||
|
import org.jclouds.aws.s3.domain.BucketLogging;
|
||||||
import org.jclouds.aws.s3.domain.BucketMetadata;
|
import org.jclouds.aws.s3.domain.BucketMetadata;
|
||||||
import org.jclouds.aws.s3.domain.CannedAccessPolicy;
|
import org.jclouds.aws.s3.domain.CannedAccessPolicy;
|
||||||
import org.jclouds.aws.s3.domain.ListBucketResponse;
|
import org.jclouds.aws.s3.domain.ListBucketResponse;
|
||||||
|
@ -363,4 +364,31 @@ public class StubS3AsyncClient implements S3AsyncClient {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Future<Void> disableBucketLogging(String bucketName) {
|
||||||
|
return new FutureBase<Void>() {
|
||||||
|
public Void get() throws InterruptedException, ExecutionException {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Future<Void> enableBucketLogging(String bucketName, BucketLogging logging) {
|
||||||
|
return new FutureBase<Void>() {
|
||||||
|
public Void get() throws InterruptedException, ExecutionException {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Future<BucketLogging> getBucketLogging(String bucketName) {
|
||||||
|
return new FutureBase<BucketLogging>() {
|
||||||
|
public BucketLogging get() throws InterruptedException, ExecutionException {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,7 +30,7 @@ import static org.jclouds.aws.s3.options.ListBucketOptions.Builder.withPrefix;
|
||||||
import static org.jclouds.aws.s3.options.PutBucketOptions.Builder.createIn;
|
import static org.jclouds.aws.s3.options.PutBucketOptions.Builder.createIn;
|
||||||
import static org.jclouds.aws.s3.options.PutBucketOptions.Builder.withBucketAcl;
|
import static org.jclouds.aws.s3.options.PutBucketOptions.Builder.withBucketAcl;
|
||||||
import static org.testng.Assert.assertEquals;
|
import static org.testng.Assert.assertEquals;
|
||||||
import static org.testng.Assert.assertTrue;
|
import static org.testng.Assert.*;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.UnsupportedEncodingException;
|
import java.io.UnsupportedEncodingException;
|
||||||
|
@ -43,6 +43,7 @@ import java.util.concurrent.TimeoutException;
|
||||||
import org.jclouds.aws.s3.S3AsyncClient;
|
import org.jclouds.aws.s3.S3AsyncClient;
|
||||||
import org.jclouds.aws.s3.S3Client;
|
import org.jclouds.aws.s3.S3Client;
|
||||||
import org.jclouds.aws.s3.domain.AccessControlList;
|
import org.jclouds.aws.s3.domain.AccessControlList;
|
||||||
|
import org.jclouds.aws.s3.domain.BucketLogging;
|
||||||
import org.jclouds.aws.s3.domain.BucketMetadata;
|
import org.jclouds.aws.s3.domain.BucketMetadata;
|
||||||
import org.jclouds.aws.s3.domain.CannedAccessPolicy;
|
import org.jclouds.aws.s3.domain.CannedAccessPolicy;
|
||||||
import org.jclouds.aws.s3.domain.ListBucketResponse;
|
import org.jclouds.aws.s3.domain.ListBucketResponse;
|
||||||
|
@ -50,6 +51,7 @@ import org.jclouds.aws.s3.domain.Payer;
|
||||||
import org.jclouds.aws.s3.domain.S3Object;
|
import org.jclouds.aws.s3.domain.S3Object;
|
||||||
import org.jclouds.aws.s3.domain.AccessControlList.CanonicalUserGrantee;
|
import org.jclouds.aws.s3.domain.AccessControlList.CanonicalUserGrantee;
|
||||||
import org.jclouds.aws.s3.domain.AccessControlList.EmailAddressGrantee;
|
import org.jclouds.aws.s3.domain.AccessControlList.EmailAddressGrantee;
|
||||||
|
import org.jclouds.aws.s3.domain.AccessControlList.Grant;
|
||||||
import org.jclouds.aws.s3.domain.AccessControlList.GroupGranteeURI;
|
import org.jclouds.aws.s3.domain.AccessControlList.GroupGranteeURI;
|
||||||
import org.jclouds.aws.s3.domain.AccessControlList.Permission;
|
import org.jclouds.aws.s3.domain.AccessControlList.Permission;
|
||||||
import org.jclouds.aws.s3.domain.BucketMetadata.LocationConstraint;
|
import org.jclouds.aws.s3.domain.BucketMetadata.LocationConstraint;
|
||||||
|
@ -58,6 +60,8 @@ import org.jclouds.blobstore.integration.internal.BaseBlobStoreIntegrationTest;
|
||||||
import org.jclouds.util.Utils;
|
import org.jclouds.util.Utils;
|
||||||
import org.testng.annotations.Test;
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author James Murty
|
* @author James Murty
|
||||||
|
@ -213,6 +217,64 @@ public class BucketsLiveTest extends BaseBlobStoreIntegrationTest<S3AsyncClient,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testBucketLogging() throws Exception {
|
||||||
|
final String bucketName = getContainerName();
|
||||||
|
final String targetBucket = getContainerName();
|
||||||
|
try {
|
||||||
|
assertNull(context.getApi().getBucketLogging(bucketName));
|
||||||
|
|
||||||
|
setupAclForBucketLoggingTarget(targetBucket);
|
||||||
|
final BucketLogging logging = new BucketLogging(targetBucket, "access_log-", ImmutableSet
|
||||||
|
.<Grant> of(new Grant(new EmailAddressGrantee(StubS3AsyncClient.TEST_ACL_EMAIL),
|
||||||
|
Permission.FULL_CONTROL)));
|
||||||
|
|
||||||
|
context.getApi().enableBucketLogging(bucketName, logging);
|
||||||
|
|
||||||
|
assertConsistencyAware(new Runnable() {
|
||||||
|
public void run() {
|
||||||
|
try {
|
||||||
|
BucketLogging newLogging = context.getApi().getBucketLogging(bucketName);
|
||||||
|
AccessControlList acl = new AccessControlList();
|
||||||
|
for (Grant grant : newLogging.getTargetGrants()) { // TODO: add permission
|
||||||
|
// checking features to
|
||||||
|
// bucketlogging
|
||||||
|
acl.addPermission(grant.getGrantee(), grant.getPermission());
|
||||||
|
}
|
||||||
|
// EmailAddressGrantee is replaced by a CanonicalUserGrantee, so we cannot test by
|
||||||
|
// email addr
|
||||||
|
assertTrue(acl.hasPermission(StubS3AsyncClient.TEST_ACL_ID,
|
||||||
|
Permission.FULL_CONTROL), acl.toString());
|
||||||
|
assertEquals(logging.getTargetBucket(), newLogging.getTargetBucket());
|
||||||
|
assertEquals(logging.getTargetPrefix(), newLogging.getTargetPrefix());
|
||||||
|
} catch (Exception e) {
|
||||||
|
Utils.<RuntimeException> rethrowIfRuntimeOrSameType(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
context.getApi().disableBucketLogging(bucketName);
|
||||||
|
assertConsistencyAware(new Runnable() {
|
||||||
|
public void run() {
|
||||||
|
try {
|
||||||
|
assertNull(context.getApi().getBucketLogging(bucketName));
|
||||||
|
} catch (Exception e) {
|
||||||
|
Utils.<RuntimeException> rethrowIfRuntimeOrSameType(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} finally {
|
||||||
|
destroyContainer(bucketName);
|
||||||
|
destroyContainer(targetBucket);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setupAclForBucketLoggingTarget(final String targetBucket) {
|
||||||
|
// http://docs.amazonwebservices.com/AmazonS3/latest/LoggingHowTo.html
|
||||||
|
AccessControlList acl = context.getApi().getBucketACL(targetBucket);
|
||||||
|
acl.addPermission(GroupGranteeURI.LOG_DELIVERY, Permission.WRITE);
|
||||||
|
acl.addPermission(GroupGranteeURI.LOG_DELIVERY, Permission.READ_ACP);
|
||||||
|
assertTrue(context.getApi().putBucketACL(targetBucket, acl));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* using scratch bucketName as we are changing location
|
* using scratch bucketName as we are changing location
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -0,0 +1,61 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright (C) 2009 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||||
|
*
|
||||||
|
* ====================================================================
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
* ====================================================================
|
||||||
|
*/
|
||||||
|
package org.jclouds.aws.s3.xml;
|
||||||
|
|
||||||
|
import static org.testng.Assert.assertEquals;
|
||||||
|
|
||||||
|
import java.io.InputStream;
|
||||||
|
|
||||||
|
import org.jclouds.aws.s3.domain.BucketLogging;
|
||||||
|
import org.jclouds.aws.s3.domain.AccessControlList.EmailAddressGrantee;
|
||||||
|
import org.jclouds.aws.s3.domain.AccessControlList.Grant;
|
||||||
|
import org.jclouds.aws.s3.domain.AccessControlList.Permission;
|
||||||
|
import org.jclouds.http.functions.BaseHandlerTest;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests behavior of {@code BucketLoggingHandler}
|
||||||
|
*
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
@Test(groups = "unit", testName = "ec2.BucketLoggingHandlerTest")
|
||||||
|
public class BucketLoggingHandlerTest extends BaseHandlerTest {
|
||||||
|
public void testApplyInputStream() {
|
||||||
|
InputStream is = getClass().getResourceAsStream("/s3/bucket_logging.xml");
|
||||||
|
|
||||||
|
BucketLogging expected = new BucketLogging("mylogs", "access_log-", ImmutableSet
|
||||||
|
.<Grant> of(new Grant(new EmailAddressGrantee("adrian@jclouds.org"),
|
||||||
|
Permission.FULL_CONTROL)));
|
||||||
|
BucketLoggingHandler handler = injector.getInstance(BucketLoggingHandler.class);
|
||||||
|
BucketLogging result = factory.create(handler).parse(is);
|
||||||
|
|
||||||
|
assertEquals(result.getTargetBucket(), expected.getTargetBucket());
|
||||||
|
assertEquals(result.getTargetGrants(), expected.getTargetGrants());
|
||||||
|
assertEquals(result.getTargetPrefix(), expected.getTargetPrefix());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
<BucketLoggingStatus xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><LoggingEnabled><TargetBucket>mylogs</TargetBucket><TargetPrefix>access_log-</TargetPrefix><TargetGrants><Grant><Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="AmazonCustomerByEmail"><EmailAddress>adrian@jclouds.org</EmailAddress></Grantee><Permission>FULL_CONTROL</Permission></Grant></TargetGrants></LoggingEnabled></BucketLoggingStatus>
|
Loading…
Reference in New Issue