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

Reply via email to