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 <olegfuk...@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-unsubscr...@dlab.apache.org For additional commands, e-mail: commits-h...@dlab.apache.org