This is an automated email from the ASF dual-hosted git repository.

ofuks pushed a commit to branch bucket-browser-gcp
in repository https://gitbox.apache.org/repos/asf/incubator-dlab.git

commit 5dc1b13e3f41b74e374646bb3e7ba11360e4bb13
Author: Oleh Fuks <olegfuk...@gmail.com>
AuthorDate: Thu Apr 23 15:31:48 2020 +0300

    bucket browser aws
---
 .../src/ssn/templates/ssn.yml                      |   2 +-
 services/provisioning-service/pom.xml              |  16 +++
 .../dlab/backendapi/modules/ProductionModule.java  |  29 ++---
 .../backendapi/modules/ProvisioningDevModule.java  |   9 +-
 .../dlab/backendapi/resources/BucketResource.java  |   8 --
 .../service/impl/aws/BucketServiceAwsImpl.java     | 125 +++++++++++++++++++++
 6 files changed, 164 insertions(+), 25 deletions(-)

diff --git a/infrastructure-provisioning/src/ssn/templates/ssn.yml 
b/infrastructure-provisioning/src/ssn/templates/ssn.yml
index 949ddf9..503116f 100644
--- a/infrastructure-provisioning/src/ssn/templates/ssn.yml
+++ b/infrastructure-provisioning/src/ssn/templates/ssn.yml
@@ -64,7 +64,7 @@ provisioningService:
 
 bucketService:
   jerseyClient:
-    timeout: 5m
+    timeout: 10m
     connectionTimeout: 3s
 
 # Log out user on inactivity
diff --git a/services/provisioning-service/pom.xml 
b/services/provisioning-service/pom.xml
index 78bc19b..2fc22bd 100644
--- a/services/provisioning-service/pom.xml
+++ b/services/provisioning-service/pom.xml
@@ -38,6 +38,13 @@
                 <type>pom</type>
                 <scope>import</scope>
             </dependency>
+            <dependency>
+                <groupId>software.amazon.awssdk</groupId>
+                <artifactId>bom</artifactId>
+                <version>2.11.9</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
         </dependencies>
     </dependencyManagement>
 
@@ -85,6 +92,15 @@
             <artifactId>google-cloud-storage</artifactId>
             <version>1.106.0</version>
         </dependency>
+        <dependency>
+            <groupId>software.amazon.awssdk</groupId>
+            <artifactId>s3</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+            <version>4.5.9</version>
+        </dependency>
 
         <dependency>
             <groupId>commons-io</groupId>
diff --git 
a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/modules/ProductionModule.java
 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/modules/ProductionModule.java
index d01ebc5..6ba8505 100644
--- 
a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/modules/ProductionModule.java
+++ 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/modules/ProductionModule.java
@@ -34,6 +34,7 @@ import 
com.epam.dlab.backendapi.service.RestoreCallbackHandlerService;
 import com.epam.dlab.backendapi.service.impl.CheckInactivityServiceImpl;
 import com.epam.dlab.backendapi.service.impl.ProjectServiceImpl;
 import com.epam.dlab.backendapi.service.impl.RestoreCallbackHandlerServiceImpl;
+import com.epam.dlab.backendapi.service.impl.aws.BucketServiceAwsImpl;
 import com.epam.dlab.backendapi.service.impl.gcp.BucketServiceGcpImpl;
 import com.epam.dlab.cloud.CloudProvider;
 import com.epam.dlab.constants.ServiceConsts;
@@ -67,17 +68,19 @@ public class ProductionModule extends 
ModuleBase<ProvisioningServiceApplicationC
                                                .build(environment, 
ServiceConsts.SECURITY_SERVICE_NAME, ServiceConsts
                                                                
.PROVISIONING_USER_AGENT));
 
-        
bind(RESTService.class).toInstance(configuration.getSelfFactory().build(environment,
 ServiceConsts
-                .SELF_SERVICE_NAME));
-        bind(MetadataHolder.class).to(DockerWarmuper.class);
-        
bind(ICommandExecutor.class).to(CommandExecutor.class).asEagerSingleton();
-        bind(ObjectMapper.class).toInstance(new 
ObjectMapper().configure(JsonParser.Feature.AUTO_CLOSE_SOURCE, true));
-        bind(CallbackHandlerDao.class).to(FileSystemCallbackHandlerDao.class);
-        
bind(RestoreCallbackHandlerService.class).to(RestoreCallbackHandlerServiceImpl.class);
-        
bind(CheckInactivityService.class).to(CheckInactivityServiceImpl.class);
-        bind(ProjectService.class).to(ProjectServiceImpl.class);
-        if (configuration.getCloudProvider() == CloudProvider.GCP) {
-            bind(BucketService.class).to(BucketServiceGcpImpl.class);
-        }
-    }
+               
bind(RESTService.class).toInstance(configuration.getSelfFactory().build(environment,
 ServiceConsts
+                               .SELF_SERVICE_NAME));
+               bind(MetadataHolder.class).to(DockerWarmuper.class);
+               
bind(ICommandExecutor.class).to(CommandExecutor.class).asEagerSingleton();
+               bind(ObjectMapper.class).toInstance(new 
ObjectMapper().configure(JsonParser.Feature.AUTO_CLOSE_SOURCE, true));
+               
bind(CallbackHandlerDao.class).to(FileSystemCallbackHandlerDao.class);
+               
bind(RestoreCallbackHandlerService.class).to(RestoreCallbackHandlerServiceImpl.class);
+               
bind(CheckInactivityService.class).to(CheckInactivityServiceImpl.class);
+               bind(ProjectService.class).to(ProjectServiceImpl.class);
+               if (configuration.getCloudProvider() == CloudProvider.GCP) {
+                       
bind(BucketService.class).to(BucketServiceGcpImpl.class);
+               } else if (configuration.getCloudProvider() == 
CloudProvider.AWS) {
+                       
bind(BucketService.class).to(BucketServiceAwsImpl.class);
+               }
+       }
 }
diff --git 
a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/modules/ProvisioningDevModule.java
 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/modules/ProvisioningDevModule.java
index 43685a6..f4bbed5 100644
--- 
a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/modules/ProvisioningDevModule.java
+++ 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/modules/ProvisioningDevModule.java
@@ -37,6 +37,7 @@ import 
com.epam.dlab.backendapi.service.RestoreCallbackHandlerService;
 import com.epam.dlab.backendapi.service.impl.CheckInactivityServiceImpl;
 import com.epam.dlab.backendapi.service.impl.ProjectServiceImpl;
 import com.epam.dlab.backendapi.service.impl.RestoreCallbackHandlerServiceImpl;
+import com.epam.dlab.backendapi.service.impl.aws.BucketServiceAwsImpl;
 import com.epam.dlab.backendapi.service.impl.gcp.BucketServiceGcpImpl;
 import com.epam.dlab.cloud.CloudProvider;
 import com.epam.dlab.constants.ServiceConsts;
@@ -82,9 +83,11 @@ public class ProvisioningDevModule extends 
ModuleBase<ProvisioningServiceApplica
         
bind(RestoreCallbackHandlerService.class).to(RestoreCallbackHandlerServiceImpl.class);
         
bind(CheckInactivityService.class).to(CheckInactivityServiceImpl.class);
         bind(ProjectService.class).to(ProjectServiceImpl.class);
-        if (configuration.getCloudProvider() == CloudProvider.GCP) {
-            bind(BucketService.class).to(BucketServiceGcpImpl.class);
-        }
+               if (configuration.getCloudProvider() == CloudProvider.GCP) {
+                       
bind(BucketService.class).to(BucketServiceGcpImpl.class);
+               } else if (configuration.getCloudProvider() == 
CloudProvider.AWS) {
+                       
bind(BucketService.class).to(BucketServiceAwsImpl.class);
+               }
     }
 
        /**
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 7859a0a..a44d21f 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,8 +21,6 @@ package com.epam.dlab.backendapi.resources;
 
 import com.epam.dlab.auth.UserInfo;
 import com.epam.dlab.backendapi.service.BucketService;
-import com.google.cloud.storage.Storage;
-import com.google.cloud.storage.StorageOptions;
 import com.google.inject.Inject;
 import io.dropwizard.auth.Auth;
 import lombok.extern.slf4j.Slf4j;
@@ -92,10 +90,4 @@ public class BucketResource {
         bucketService.deleteObject(bucket, object);
         return Response.ok().build();
     }
-
-    public static void main(String[] args) {
-        Storage storage = StorageOptions.getDefaultInstance().getService();
-        String bucketName = "ofuks-1304-prj1-local-bucket";
-        storage.delete(bucketName, "1.txt");
-    }
 }
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
new file mode 100644
index 0000000..8193fde
--- /dev/null
+++ 
b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/aws/BucketServiceAwsImpl.java
@@ -0,0 +1,125 @@
+/*
+ * 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 com.epam.dlab.backendapi.service.impl.aws;
+
+import com.epam.dlab.backendapi.service.BucketService;
+import com.epam.dlab.dto.bucket.BucketDTO;
+import com.epam.dlab.exceptions.DlabException;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.IOUtils;
+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.GetObjectRequest;
+import software.amazon.awssdk.services.s3.model.ListObjectsRequest;
+import software.amazon.awssdk.services.s3.model.PutObjectRequest;
+import software.amazon.awssdk.services.s3.model.S3Object;
+
+import java.io.InputStream;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Slf4j
+public class BucketServiceAwsImpl implements BucketService {
+
+    @Override
+    public List<BucketDTO> getObjects(String bucket) {
+        try {
+            S3Client s3 = S3Client.create();
+            ListObjectsRequest getRequest = ListObjectsRequest
+                    .builder()
+                    .bucket(bucket)
+                    .build();
+
+            return s3.listObjects(getRequest).contents()
+                    .stream()
+                    .map(o -> toBucketDTO(bucket, o))
+                    .collect(Collectors.toList());
+        } catch (Exception e) {
+            log.error("Cannot retrieve objects from bucket {}. Reason: {}", 
bucket, e.getMessage());
+            throw new DlabException(String.format("Cannot retrieve objects 
from bucket %s. Reason: %s", bucket, e.getMessage()));
+        }
+    }
+
+    @Override
+    public void uploadObject(String bucket, String object, InputStream stream) 
{
+        try {
+            S3Client s3 = S3Client.create();
+            PutObjectRequest uploadRequest = PutObjectRequest
+                    .builder()
+                    .bucket(bucket)
+                    .key(object)
+                    .build();
+            s3.putObject(uploadRequest, 
RequestBody.fromBytes(IOUtils.toByteArray(stream)));
+        } catch (Exception e) {
+            log.error("Cannot upload object {} to bucket {}. Reason: {}", 
object, bucket, e.getMessage());
+            throw new DlabException(String.format("Cannot upload object %s to 
bucket %s. Reason: %s", object, bucket, e.getMessage()));
+        }
+    }
+
+    @Override
+    public byte[] downloadObject(String bucket, String object) {
+        try {
+            S3Client s3 = S3Client.create();
+            GetObjectRequest downloadRequest = GetObjectRequest
+                    .builder()
+                    .bucket(bucket)
+                    .key(object)
+                    .build();
+            return s3.getObject(downloadRequest, 
ResponseTransformer.toBytes()).asByteArray();
+        } catch (Exception e) {
+            log.error("Cannot download object {} from bucket {}. Reason: {}", 
object, bucket, e.getMessage());
+            throw new DlabException(String.format("Cannot download object %s 
from bucket %s. Reason: %s", object, bucket, e.getMessage()));
+        }
+    }
+
+    @Override
+    public void deleteObject(String bucket, String object) {
+        try {
+            S3Client s3 = S3Client.create();
+            DeleteObjectRequest deleteObjectRequest = DeleteObjectRequest
+                    .builder()
+                    .bucket(bucket)
+                    .key(object)
+                    .build();
+            s3.deleteObject(deleteObjectRequest);
+        } 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()));
+        }
+    }
+
+    private BucketDTO toBucketDTO(String bucket, S3Object s3Object) {
+        final String size = FileUtils.byteCountToDisplaySize(s3Object.size());
+        Date date = Date.from(s3Object.lastModified());
+        SimpleDateFormat formatter = new SimpleDateFormat(DATE_FORMAT);
+        return BucketDTO.builder()
+                .bucket(bucket)
+                .object(s3Object.key())
+                .size(size)
+                .lastModifiedDate(formatter.format(date))
+                .build();
+    }
+}


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

Reply via email to