You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dlab.apache.org by of...@apache.org on 2020/06/17 10:52:42 UTC

[incubator-dlab] branch develop updated: [DLAB-1876] Fixed bug with creating folders in bucket browser

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 fc2f9af  [DLAB-1876] Fixed bug with creating folders in bucket browser
fc2f9af is described below

commit fc2f9afe50c5abc229072797b1fb9abcf2e37ba2
Author: Oleh Fuks <ol...@gmail.com>
AuthorDate: Wed Jun 17 13:52:24 2020 +0300

    [DLAB-1876] Fixed bug with creating folders in bucket browser
---
 .../com/epam/dlab/dto/bucket/FolderUploadDTO.java} | 31 +++++++++-----------
 .../dlab/backendapi/resources/BucketResource.java  | 11 ++++++++
 .../dlab/backendapi/service/BucketService.java     |  3 ++
 .../service/impl/aws/BucketServiceAwsImpl.java     | 19 +++++++++++++
 .../service/impl/azure/BucketServiceAzureImpl.java |  6 ++++
 .../service/impl/gcp/BucketServiceGcpImpl.java     | 16 +++++++++++
 .../dlab/backendapi/resources/BucketResource.java  | 22 ++++++++++-----
 .../backendapi/resources/dto/FolderUploadDTO.java} | 33 ++++++++++------------
 .../dlab/backendapi/service/BucketService.java     |  4 ++-
 .../backendapi/service/impl/BucketServiceImpl.java | 21 +++++++++++++-
 10 files changed, 121 insertions(+), 45 deletions(-)

diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/BucketService.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/bucket/FolderUploadDTO.java
similarity index 59%
copy from services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/BucketService.java
copy to services/dlab-model/src/main/java/com/epam/dlab/dto/bucket/FolderUploadDTO.java
index c1488e3..453b16f 100644
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/BucketService.java
+++ b/services/dlab-model/src/main/java/com/epam/dlab/dto/bucket/FolderUploadDTO.java
@@ -17,22 +17,17 @@
  * under the License.
  */
 
-package com.epam.dlab.backendapi.service;
-
-import com.epam.dlab.dto.bucket.BucketDTO;
-
-import javax.servlet.http.HttpServletResponse;
-import java.io.InputStream;
-import java.util.List;
-
-public interface BucketService {
-    String DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss";
-
-    List<BucketDTO> getObjects(String bucket);
-
-    void uploadObject(String bucket, String object, InputStream stream, long fileSize);
-
-    void downloadObject(String bucket, String object, HttpServletResponse resp);
-
-    void deleteObjects(String bucket, List<String> objects);
+package com.epam.dlab.dto.bucket;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.Data;
+import org.hibernate.validator.constraints.NotBlank;
+
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class FolderUploadDTO {
+    @NotBlank(message = "field cannot be empty")
+    private final String bucket;
+    @NotBlank(message = "field cannot be empty")
+    private final String folder;
 }
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 4495f5d..9bcfdbe 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
@@ -22,6 +22,7 @@ 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.epam.dlab.dto.bucket.FolderUploadDTO;
 import com.epam.dlab.exceptions.DlabException;
 import com.google.inject.Inject;
 import io.dropwizard.auth.Auth;
@@ -33,6 +34,7 @@ import org.apache.commons.fileupload.util.Streams;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.GET;
 import javax.ws.rs.POST;
@@ -76,6 +78,15 @@ public class BucketResource {
         return Response.ok().build();
     }
 
+    @POST
+    @Path("/folder/upload")
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response uploadFolder(@Auth UserInfo userInfo, @Valid FolderUploadDTO dto) {
+        bucketService.uploadFolder(userInfo, dto.getBucket(), dto.getFolder());
+        return Response.ok().build();
+    }
+
     @GET
     @Path("/{bucket}/object/{object}/download")
     @Consumes(MediaType.APPLICATION_JSON)
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 c1488e3..f62f391 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
@@ -19,6 +19,7 @@
 
 package com.epam.dlab.backendapi.service;
 
+import com.epam.dlab.auth.UserInfo;
 import com.epam.dlab.dto.bucket.BucketDTO;
 
 import javax.servlet.http.HttpServletResponse;
@@ -32,6 +33,8 @@ public interface BucketService {
 
     void uploadObject(String bucket, String object, InputStream stream, long fileSize);
 
+    void uploadFolder(UserInfo userInfo, String bucket, String folder);
+
     void downloadObject(String bucket, String object, HttpServletResponse resp);
 
     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 347543c..a68914d 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
@@ -19,6 +19,7 @@
 
 package com.epam.dlab.backendapi.service.impl.aws;
 
+import com.epam.dlab.auth.UserInfo;
 import com.epam.dlab.backendapi.service.BucketService;
 import com.epam.dlab.dto.bucket.BucketDTO;
 import com.epam.dlab.exceptions.DlabException;
@@ -83,6 +84,24 @@ public class BucketServiceAwsImpl implements BucketService {
     }
 
     @Override
+    public void uploadFolder(UserInfo userInfo, String bucket, String folder) {
+        log.info("Uploading folder {} to bucket {}", folder, bucket);
+        try {
+            S3Client s3 = S3Client.create();
+            PutObjectRequest uploadRequest = PutObjectRequest
+                    .builder()
+                    .bucket(bucket)
+                    .key(folder)
+                    .build();
+            s3.putObject(uploadRequest, RequestBody.empty());
+        } catch (Exception e) {
+            log.error("Cannot upload folder {} to bucket {}. Reason: {}", folder, bucket, e.getMessage());
+            throw new DlabException(String.format("Cannot upload folder %s to bucket %s. Reason: %s", folder, bucket, e.getMessage()));
+        }
+        log.info("Finished uploading folder {} to bucket {}", folder, bucket);
+    }
+
+    @Override
     public void downloadObject(String bucket, String object, HttpServletResponse resp) {
         log.info("Downloading file {} from bucket {}", object, bucket);
         try (ServletOutputStream outputStream = resp.getOutputStream()) {
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 f35dbc6..56fc71c 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
@@ -24,6 +24,7 @@ import com.azure.storage.blob.BlobContainerClient;
 import com.azure.storage.blob.BlobServiceClient;
 import com.azure.storage.blob.BlobServiceClientBuilder;
 import com.azure.storage.blob.models.BlobItem;
+import com.epam.dlab.auth.UserInfo;
 import com.epam.dlab.backendapi.service.BucketService;
 import com.epam.dlab.dto.bucket.BucketDTO;
 import com.epam.dlab.exceptions.DlabException;
@@ -70,6 +71,11 @@ public class BucketServiceAzureImpl implements BucketService {
     }
 
     @Override
+    public void uploadFolder(UserInfo userInfo, String bucket, String folder) {
+
+    }
+
+    @Override
     public void downloadObject(String bucket, String object, HttpServletResponse resp) {
         log.info("Downloading file {} from bucket {}", object, bucket);
         try (ServletOutputStream outputStream = resp.getOutputStream()) {
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 a245850..591275a 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
@@ -19,6 +19,7 @@
 
 package com.epam.dlab.backendapi.service.impl.gcp;
 
+import com.epam.dlab.auth.UserInfo;
 import com.epam.dlab.backendapi.service.BucketService;
 import com.epam.dlab.dto.bucket.BucketDTO;
 import com.epam.dlab.exceptions.DlabException;
@@ -72,6 +73,21 @@ public class BucketServiceGcpImpl implements BucketService {
     }
 
     @Override
+    public void uploadFolder(UserInfo userInfo, String bucket, String folder) {
+        log.info("Uploading file {} to bucket {}", folder, bucket);
+        try {
+            Storage storage = StorageOptions.getDefaultInstance().getService();
+            BlobId blobId = BlobId.of(bucket, folder);
+            BlobInfo blobInfo = BlobInfo.newBuilder(blobId).build();
+            storage.create(blobInfo);
+        } catch (Exception e) {
+            log.error("Cannot upload folder {} to bucket {}. Reason: {}", folder, bucket, e.getMessage());
+            throw new DlabException(String.format("Cannot upload folder %s to bucket %s. Reason: %s", folder, bucket, e.getMessage()));
+        }
+        log.info("Finished uploading folder {} to bucket {}", folder, bucket);
+    }
+
+    @Override
     public void downloadObject(String bucket, String object, HttpServletResponse resp) {
         log.info("Downloading file {} from bucket {}", object, bucket);
         try (ServletOutputStream outputStream = resp.getOutputStream()) {
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 6ffc7f9..8e943b2 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
@@ -21,6 +21,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.resources.dto.FolderUploadDTO;
 import com.epam.dlab.backendapi.service.BucketService;
 import com.epam.dlab.exceptions.DlabException;
 import com.google.inject.Inject;
@@ -84,6 +85,16 @@ public class BucketResource {
         return Response.ok().build();
     }
 
+    @POST
+    @Path("/folder/upload")
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    @RolesAllowed("/api/bucket/upload")
+    public Response uploadFolder(@Auth UserInfo userInfo, @Valid FolderUploadDTO dto) {
+        bucketService.uploadFolder(userInfo, dto.getBucket(), dto.getFolder(), dto.getEndpoint());
+        return Response.ok().build();
+    }
+
     @GET
     @Path("/{bucket}/object/{object}/endpoint/{endpoint}/download")
     @Consumes(MediaType.APPLICATION_JSON)
@@ -124,18 +135,15 @@ public class BucketResource {
                     if (item.isFormField()) {
                         if (OBJECT_FORM_FIELD.equals(item.getFieldName())) {
                             object = Streams.asString(stream);
-                        }
-                        if (BUCKET_FORM_FIELD.equals(item.getFieldName())) {
+                        } else if (BUCKET_FORM_FIELD.equals(item.getFieldName())) {
                             bucket = Streams.asString(stream);
-                        }
-                        if (ENDPOINT_FORM_FIELD.equals(item.getFieldName())) {
+                        } else if (ENDPOINT_FORM_FIELD.equals(item.getFieldName())) {
                             endpoint = Streams.asString(stream);
-                        }
-                        if (SIZE_FORM_FIELD.equals(item.getFieldName())) {
+                        } else if (SIZE_FORM_FIELD.equals(item.getFieldName())) {
                             fileSize = Long.parseLong(Streams.asString(stream));
                         }
                     } else {
-                        bucketService.uploadObjects(userInfo, bucket, object, endpoint, stream, fileSize);
+                        bucketService.uploadObject(userInfo, bucket, object, endpoint, stream, fileSize);
                     }
                 } catch (Exception e) {
                     log.error("Cannot upload object {} to bucket {}. {}", object, bucket, e.getMessage(), e);
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/BucketService.java b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/FolderUploadDTO.java
similarity index 59%
copy from services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/BucketService.java
copy to services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/FolderUploadDTO.java
index c1488e3..1539118 100644
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/BucketService.java
+++ b/services/self-service/src/main/java/com/epam/dlab/backendapi/resources/dto/FolderUploadDTO.java
@@ -17,22 +17,19 @@
  * under the License.
  */
 
-package com.epam.dlab.backendapi.service;
-
-import com.epam.dlab.dto.bucket.BucketDTO;
-
-import javax.servlet.http.HttpServletResponse;
-import java.io.InputStream;
-import java.util.List;
-
-public interface BucketService {
-    String DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss";
-
-    List<BucketDTO> getObjects(String bucket);
-
-    void uploadObject(String bucket, String object, InputStream stream, long fileSize);
-
-    void downloadObject(String bucket, String object, HttpServletResponse resp);
-
-    void deleteObjects(String bucket, List<String> objects);
+package com.epam.dlab.backendapi.resources.dto;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.Data;
+import org.hibernate.validator.constraints.NotBlank;
+
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class FolderUploadDTO {
+    @NotBlank(message = "field cannot be empty")
+    private final String bucket;
+    @NotBlank(message = "field cannot be empty")
+    private final String folder;
+    @NotBlank(message = "field cannot be empty")
+    private final String endpoint;
 }
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 6e5345b..b1fec76 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
@@ -29,7 +29,9 @@ import java.util.List;
 public interface BucketService {
     List<BucketDTO> getObjects(UserInfo userInfo, String bucket, String endpoint);
 
-    void uploadObjects(UserInfo userInfo, String bucket, String object, String endpoint, InputStream inputStream, long fileSize);
+    void uploadObject(UserInfo userInfo, String bucket, String object, String endpoint, InputStream inputStream, long fileSize);
+
+    void uploadFolder(UserInfo userInfo, String bucket, String folder, String endpoint);
 
     void downloadObject(UserInfo userInfo, String bucket, String object, String endpoint, HttpServletResponse resp);
 
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 d305532..14af1d0 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
@@ -26,6 +26,7 @@ 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.dto.bucket.FolderUploadDTO;
 import com.epam.dlab.exceptions.DlabException;
 import com.epam.dlab.rest.client.RESTService;
 import com.google.inject.Inject;
@@ -54,6 +55,7 @@ import static javax.ws.rs.core.MediaType.APPLICATION_OCTET_STREAM;
 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_UPLOAD_FOLDER = "%sbucket/folder/upload";
     private static final String BUCKET_DOWNLOAD_OBJECT = "%sbucket/%s/object/%s/download";
     private static final String BUCKET_DELETE_OBJECT = "%sbucket/objects/delete";
 
@@ -79,7 +81,7 @@ public class BucketServiceImpl implements BucketService {
     }
 
     @Override
-    public void uploadObjects(UserInfo userInfo, String bucket, String object, String endpoint, InputStream inputStream, long fileSize) {
+    public void uploadObject(UserInfo userInfo, String bucket, String object, String endpoint, InputStream inputStream, long fileSize) {
         log.info("Uploading file {} for user {} to bucket {}", object, userInfo.getName(), bucket);
         try {
             EndpointDTO endpointDTO = endpointService.get(endpoint);
@@ -96,6 +98,23 @@ public class BucketServiceImpl implements BucketService {
     }
 
     @Override
+    public void uploadFolder(UserInfo userInfo, String bucket, String folder, String endpoint) {
+        log.info("Uploading folder {} for user {} to bucket {}", folder, userInfo.getName(), bucket);
+        try {
+            EndpointDTO endpointDTO = endpointService.get(endpoint);
+            FolderUploadDTO dto = new FolderUploadDTO(bucket, folder);
+            Response response = provisioningService.post(String.format(BUCKET_UPLOAD_FOLDER, endpointDTO.getUrl()), userInfo.getAccessToken(), dto, 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 upload folder {} to bucket {} for user {}, endpoint {}. Reason {}", folder, bucket, userInfo.getName(), endpoint, e.getMessage());
+            throw new DlabException(String.format("Cannot upload object %s to bucket %s for user %s, endpoint %s. Reason %s", folder, bucket, userInfo.getName(), endpoint, e.getMessage()));
+        }
+        log.info("Finished uploading folder {} for user {} to bucket {}", folder, userInfo.getName(), bucket);
+    }
+
+    @Override
     public void downloadObject(UserInfo userInfo, String bucket, String object, String endpoint, HttpServletResponse resp) {
         log.info("Downloading file {} for user {} from bucket {}", object, userInfo.getName(), bucket);
         EndpointDTO endpointDTO = endpointService.get(endpoint);


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@dlab.apache.org
For additional commands, e-mail: commits-help@dlab.apache.org