This is an automated email from the ASF dual-hosted git repository. ofuks pushed a commit to branch develop in repository https://gitbox.apache.org/repos/asf/incubator-dlab.git
The following commit(s) were added to refs/heads/develop by this push: new e2d32f5 Added support for multiple delete e2d32f5 is described below commit e2d32f599cecf10bf504dbe68a70a45792a758f1 Author: Oleh Fuks <olegfuk...@gmail.com> AuthorDate: Thu May 7 12:52:37 2020 +0300 Added support for multiple delete --- ...BucketDownloadDTO.java => BucketDeleteDTO.java} | 9 ++++--- services/provisioning-service/pom.xml | 2 +- .../dlab/backendapi/resources/BucketResource.java | 12 ++++------ .../dlab/backendapi/service/BucketService.java | 2 +- .../service/impl/aws/BucketServiceAwsImpl.java | 28 +++++++++++++++------- .../service/impl/azure/BucketServiceAzureImpl.java | 2 +- .../service/impl/gcp/BucketServiceGcpImpl.java | 12 ++++++---- .../dlab/backendapi/resources/BucketResource.java | 14 +++++------ .../backendapi/resources/dto/BucketDeleteDTO.java} | 11 ++++++--- .../dlab/backendapi/service/BucketService.java | 2 +- .../backendapi/service/impl/BucketServiceImpl.java | 13 +++++----- 11 files changed, 62 insertions(+), 45 deletions(-) diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/bucket/BucketDownloadDTO.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/bucket/BucketDeleteDTO.java similarity index 82% copy from services/dlab-model/src/main/java/com/epam/dlab/dto/bucket/BucketDownloadDTO.java copy to services/dlab-model/src/main/java/com/epam/dlab/dto/bucket/BucketDeleteDTO.java index b1201e6..0bec33d 100644 --- a/services/dlab-model/src/main/java/com/epam/dlab/dto/bucket/BucketDownloadDTO.java +++ b/services/dlab-model/src/main/java/com/epam/dlab/dto/bucket/BucketDeleteDTO.java @@ -21,13 +21,12 @@ package com.epam.dlab.dto.bucket; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import lombok.Data; -import org.hibernate.validator.constraints.NotBlank; + +import java.util.List; @Data @JsonIgnoreProperties(ignoreUnknown = true) -public class BucketDownloadDTO { - @NotBlank(message = "field cannot be empty") +public class BucketDeleteDTO { private final String bucket; - @NotBlank(message = "field cannot be empty") - private final String object; + private final List<String> objects; } diff --git a/services/provisioning-service/pom.xml b/services/provisioning-service/pom.xml index 9532454..fc01af1 100644 --- a/services/provisioning-service/pom.xml +++ b/services/provisioning-service/pom.xml @@ -41,7 +41,7 @@ <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>bom</artifactId> - <version>2.11.9</version> + <version>2.13.9</version> <type>pom</type> <scope>import</scope> </dependency> diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/BucketResource.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/BucketResource.java index 4e7d53a..28e51b3 100644 --- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/BucketResource.java +++ b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/resources/BucketResource.java @@ -21,13 +21,13 @@ package com.epam.dlab.backendapi.resources; import com.epam.dlab.auth.UserInfo; import com.epam.dlab.backendapi.service.BucketService; +import com.epam.dlab.dto.bucket.BucketDeleteDTO; import com.google.inject.Inject; import io.dropwizard.auth.Auth; import lombok.extern.slf4j.Slf4j; import org.glassfish.jersey.media.multipart.FormDataParam; import javax.ws.rs.Consumes; -import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; @@ -78,14 +78,12 @@ public class BucketResource { return Response.ok(bucketService.downloadObject(bucket, object)).build(); } - @DELETE - @Path("/{bucket}/object/{object}") + @POST + @Path("/objects/delete") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) - public Response uploadObject(@Auth UserInfo userInfo, - @PathParam("bucket") String bucket, - @PathParam("object") String object) { - bucketService.deleteObject(bucket, object); + public Response uploadObject(@Auth UserInfo userInfo, BucketDeleteDTO bucketDeleteDTO) { + bucketService.deleteObjects(bucketDeleteDTO.getBucket(), bucketDeleteDTO.getObjects()); return Response.ok().build(); } } diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/BucketService.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/BucketService.java index 015de22..fed9aef 100644 --- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/BucketService.java +++ b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/BucketService.java @@ -33,5 +33,5 @@ public interface BucketService { byte[] downloadObject(String bucket, String object); - void deleteObject(String bucket, String object); + void deleteObjects(String bucket, List<String> objects); } diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/aws/BucketServiceAwsImpl.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/aws/BucketServiceAwsImpl.java index 8193fde..94755f2 100644 --- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/aws/BucketServiceAwsImpl.java +++ b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/aws/BucketServiceAwsImpl.java @@ -29,9 +29,11 @@ import software.amazon.awssdk.awscore.exception.AwsServiceException; import software.amazon.awssdk.core.sync.RequestBody; import software.amazon.awssdk.core.sync.ResponseTransformer; import software.amazon.awssdk.services.s3.S3Client; -import software.amazon.awssdk.services.s3.model.DeleteObjectRequest; +import software.amazon.awssdk.services.s3.model.Delete; +import software.amazon.awssdk.services.s3.model.DeleteObjectsRequest; import software.amazon.awssdk.services.s3.model.GetObjectRequest; import software.amazon.awssdk.services.s3.model.ListObjectsRequest; +import software.amazon.awssdk.services.s3.model.ObjectIdentifier; import software.amazon.awssdk.services.s3.model.PutObjectRequest; import software.amazon.awssdk.services.s3.model.S3Object; @@ -96,18 +98,28 @@ public class BucketServiceAwsImpl implements BucketService { } @Override - public void deleteObject(String bucket, String object) { + public void deleteObjects(String bucket, List<String> objects) { try { S3Client s3 = S3Client.create(); - DeleteObjectRequest deleteObjectRequest = DeleteObjectRequest - .builder() + List<ObjectIdentifier> objectsToDelete = objects + .stream() + .map(o -> ObjectIdentifier.builder() + .key(o) + .build()) + .collect(Collectors.toList()); + + DeleteObjectsRequest deleteObjectsRequests = DeleteObjectsRequest.builder() .bucket(bucket) - .key(object) + .delete(Delete.builder() + .objects(objectsToDelete) + .build()) .build(); - s3.deleteObject(deleteObjectRequest); + + s3.deleteObjects(deleteObjectsRequests); + } catch (AwsServiceException e) { - log.error("Cannot delete object {} from bucket {}. Reason: {}", object, bucket, e.getMessage()); - throw new DlabException(String.format("Cannot delete object %s from bucket %s. Reason: %s", object, bucket, e.getMessage())); + log.error("Cannot delete objects {} from bucket {}. Reason: {}", objects, bucket, e.getMessage()); + throw new DlabException(String.format("Cannot delete objects %s from bucket %s. Reason: %s", objects, bucket, e.getMessage())); } } diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/azure/BucketServiceAzureImpl.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/azure/BucketServiceAzureImpl.java index 0799b8e..87ac6d4 100644 --- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/azure/BucketServiceAzureImpl.java +++ b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/azure/BucketServiceAzureImpl.java @@ -42,7 +42,7 @@ public class BucketServiceAzureImpl implements BucketService { } @Override - public void deleteObject(String bucket, String object) { + public void deleteObjects(String bucket, List<String> objects) { } } diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/gcp/BucketServiceGcpImpl.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/gcp/BucketServiceGcpImpl.java index 7eedaf5..e01f9ba 100644 --- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/gcp/BucketServiceGcpImpl.java +++ b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/gcp/BucketServiceGcpImpl.java @@ -87,13 +87,17 @@ public class BucketServiceGcpImpl implements BucketService { } @Override - public void deleteObject(String bucket, String object) { + public void deleteObjects(String bucket, List<String> objects) { try { Storage storage = StorageOptions.getDefaultInstance().getService(); - storage.delete(bucket, object); + List<BlobId> blobIds = objects + .stream() + .map(o -> BlobId.of(bucket, o)) + .collect(Collectors.toList()); + storage.delete(blobIds); } catch (Exception e) { - log.error("Cannot delete object {} from bucket {}. Reason: {}", object, bucket, e.getMessage()); - throw new DlabException(String.format("Cannot delete object %s from bucket %s. Reason: %s", object, bucket, e.getMessage())); + log.error("Cannot delete objects {} from bucket {}. Reason: {}", objects, bucket, e.getMessage()); + throw new DlabException(String.format("Cannot delete objects %s from bucket %s. Reason: %s", objects, bucket, e.getMessage())); } } diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/BucketResource.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/BucketResource.java index f21af2b..5f189f8 100644 --- a/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/BucketResource.java +++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/BucketResource.java @@ -20,6 +20,7 @@ package com.epam.dlab.backendapi.resources; import com.epam.dlab.auth.UserInfo; +import com.epam.dlab.backendapi.resources.dto.BucketDeleteDTO; import com.epam.dlab.backendapi.service.BucketService; import com.google.inject.Inject; import io.dropwizard.auth.Auth; @@ -27,8 +28,8 @@ import lombok.extern.slf4j.Slf4j; import org.glassfish.jersey.media.multipart.FormDataParam; import javax.annotation.security.RolesAllowed; +import javax.validation.Valid; import javax.ws.rs.Consumes; -import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; @@ -89,16 +90,13 @@ public class BucketResource { .build(); } - @DELETE - @Path("/{bucket}/object/{object}/endpoint/{endpoint}") + @POST + @Path("/objects/delete") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) @RolesAllowed("/api/bucket/delete") - public Response deleteObject(@Auth UserInfo userInfo, - @PathParam("bucket") String bucket, - @PathParam("object") String object, - @PathParam("endpoint") String endpoint) { - bucketService.deleteObject(userInfo, bucket, object, endpoint); + public Response deleteObject(@Auth UserInfo userInfo, @Valid BucketDeleteDTO bucketDto) { + bucketService.deleteObjects(userInfo, bucketDto.getBucket(), bucketDto.getObjects(), bucketDto.getEndpoint()); return Response.ok().build(); } } diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/bucket/BucketDownloadDTO.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/BucketDeleteDTO.java similarity index 80% rename from services/dlab-model/src/main/java/com/epam/dlab/dto/bucket/BucketDownloadDTO.java rename to services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/BucketDeleteDTO.java index b1201e6..9f12a86 100644 --- a/services/dlab-model/src/main/java/com/epam/dlab/dto/bucket/BucketDownloadDTO.java +++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/BucketDeleteDTO.java @@ -17,17 +17,22 @@ * under the License. */ -package com.epam.dlab.dto.bucket; +package com.epam.dlab.backendapi.resources.dto; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import lombok.Data; import org.hibernate.validator.constraints.NotBlank; +import org.hibernate.validator.constraints.NotEmpty; + +import java.util.List; @Data @JsonIgnoreProperties(ignoreUnknown = true) -public class BucketDownloadDTO { +public class BucketDeleteDTO { @NotBlank(message = "field cannot be empty") private final String bucket; @NotBlank(message = "field cannot be empty") - private final String object; + private final String endpoint; + @NotEmpty(message = "field cannot be empty") + private final List<String> objects; } diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/BucketService.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/BucketService.java index 0377969..3fdba99 100644 --- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/BucketService.java +++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/BucketService.java @@ -32,5 +32,5 @@ public interface BucketService { byte[] downloadObject(UserInfo userInfo, String bucket, String object, String endpoint); - void deleteObject(UserInfo userInfo, String bucket, String object, String endpoint); + void deleteObjects(UserInfo userInfo, String bucket, List<String> objects, String endpoint); } diff --git a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/BucketServiceImpl.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/BucketServiceImpl.java index 06ee456..3cc9413 100644 --- a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/BucketServiceImpl.java +++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/BucketServiceImpl.java @@ -25,6 +25,7 @@ import com.epam.dlab.backendapi.service.BucketService; import com.epam.dlab.backendapi.service.EndpointService; import com.epam.dlab.constants.ServiceConsts; import com.epam.dlab.dto.bucket.BucketDTO; +import com.epam.dlab.dto.bucket.BucketDeleteDTO; import com.epam.dlab.exceptions.DlabException; import com.epam.dlab.rest.client.RESTService; import com.google.inject.Inject; @@ -50,7 +51,7 @@ public class BucketServiceImpl implements BucketService { private static final String BUCKET_GET_OBJECTS = "%sbucket/%s"; private static final String BUCKET_UPLOAD_OBJECT = "%sbucket/upload"; private static final String BUCKET_DOWNLOAD_OBJECT = "%sbucket/%s/object/%s/download"; - private static final String BUCKET_DELETE_OBJECT = "%sbucket/%s/object/%s"; + private static final String BUCKET_DELETE_OBJECT = "%sbucket/objects/delete"; private final EndpointService endpointService; private final RESTService provisioningService; @@ -103,17 +104,17 @@ public class BucketServiceImpl implements BucketService { } @Override - public void deleteObject(UserInfo userInfo, String bucket, String object, String endpoint) { + public void deleteObjects(UserInfo userInfo, String bucket, List<String> objects, String endpoint) { try { EndpointDTO endpointDTO = endpointService.get(endpoint); - Response response = provisioningService.delete(String.format(BUCKET_DELETE_OBJECT, endpointDTO.getUrl(), bucket, encodeObject(object)), userInfo.getAccessToken(), Response.class, - APPLICATION_JSON, APPLICATION_JSON); + BucketDeleteDTO bucketDeleteDTO = new BucketDeleteDTO(bucket, objects); + Response response = provisioningService.post(String.format(BUCKET_DELETE_OBJECT, endpointDTO.getUrl()), userInfo.getAccessToken(), bucketDeleteDTO, Response.class); if (response.getStatus() != HttpStatus.SC_OK) { throw new DlabException(String.format("Something went wrong. Response status is %s ", response.getStatus())); } } catch (Exception e) { - log.error("Cannot delete object {} from bucket {} for user {}, endpoint {}. Reason {}", object, bucket, userInfo.getName(), endpoint, e.getMessage()); - throw new DlabException(String.format("Cannot delete object %s from bucket %s for user %s, endpoint %s. Reason %s", object, bucket, userInfo.getName(), endpoint, e.getMessage())); + log.error("Cannot delete objects {} from bucket {} for user {}, endpoint {}. Reason {}", objects, bucket, userInfo.getName(), endpoint, e.getMessage()); + throw new DlabException(String.format("Cannot delete objects %s from bucket %s for user %s, endpoint %s. Reason %s", objects, bucket, userInfo.getName(), endpoint, e.getMessage())); } } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@dlab.apache.org For additional commands, e-mail: commits-h...@dlab.apache.org