DaanHoogland commented on code in PR #8251:
URL: https://github.com/apache/cloudstack/pull/8251#discussion_r1883624046


##########
plugins/backup/backroll/src/main/java/org/apache/cloudstack/backup/backroll/BackrollClient.java:
##########
@@ -52,614 +40,189 @@
 import 
org.apache.cloudstack.backup.backroll.model.response.metrics.virtualMachineBackups.VirtualMachineBackupsResponse;
 import 
org.apache.cloudstack.backup.backroll.model.response.policy.BackrollBackupPolicyResponse;
 import 
org.apache.cloudstack.backup.backroll.model.response.policy.BackupPoliciesResponse;
-import org.apache.cloudstack.utils.security.SSLUtils;
+import org.apache.cloudstack.backup.backroll.utils.BackrollApiException;
+import org.apache.cloudstack.backup.backroll.utils.BackrollHttpClientProvider;
 
 import org.apache.commons.lang3.StringUtils;
 
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpHeaders;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpStatus;
-import org.apache.http.ParseException;
-import org.apache.http.client.config.RequestConfig;
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.client.methods.HttpDelete;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.conn.ssl.NoopHostnameVerifier;
-import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
-import org.apache.http.entity.ContentType;
-import org.apache.http.entity.StringEntity;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.impl.client.HttpClientBuilder;
-import org.apache.http.util.EntityUtils;
-
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 
 import org.joda.time.DateTime;
 
 import org.json.JSONException;
 import org.json.JSONObject;
-
-import com.cloud.utils.exception.CloudRuntimeException;
-import com.cloud.utils.nio.TrustAllManager;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.JsonMappingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 
 public class BackrollClient {
 
     private Logger logger = LogManager.getLogger(BackrollClient.class);
 
-    private final URI apiURI;
+    private BackrollHttpClientProvider httpProvider;
 
-    private String backrollToken = null;
-    private String appname = null;
-    private String password = null;
-    private boolean validateCertificate = false;
-    private RequestConfig config = null;
-
-    private int restoreTimeout;
-
-    public BackrollClient(final String url, final String appname, final String 
password,
-            final boolean validateCertificate, final int timeout,
-            final int restoreTimeout)
+    public BackrollClient(BackrollHttpClientProvider httpProvider)
             throws URISyntaxException, NoSuchAlgorithmException, 
KeyManagementException {
-        this.apiURI = new URI(url);
-        this.restoreTimeout = restoreTimeout;
-        this.appname = appname;
-        this.password = password;
-
-        this.config = RequestConfig.custom()
-            .setConnectTimeout(timeout * 1000)
-            .setConnectionRequestTimeout(timeout * 1000)
-            .setSocketTimeout(timeout * 1000)
-            .build();
-    }
-
-    private CloseableHttpClient createHttpClient() throws 
KeyManagementException, NoSuchAlgorithmException {
-        if(!validateCertificate) {
-            SSLContext sslContext = SSLUtils.getSSLContext();
-            sslContext.init(null, new X509TrustManager[] { new 
TrustAllManager() }, new SecureRandom());
-            final SSLConnectionSocketFactory factory = new 
SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE);
-            return HttpClientBuilder.create()
-                .setDefaultRequestConfig(config)
-                .setSSLSocketFactory(factory)
-                .build();
-        } else {
-            return HttpClientBuilder.create()
-                .setDefaultRequestConfig(config)
-                .build();
-        }
-    }
 
-    private void closeConnection(CloseableHttpResponse closeableHttpResponse) 
throws IOException {
-        closeableHttpResponse.close();
+        this.httpProvider = httpProvider;
     }
 
-    public String startBackupJob(final String jobId) throws 
KeyManagementException, NoSuchAlgorithmException, IOException {
+    public String startBackupJob(final String jobId) throws IOException, 
BackrollApiException {
         logger.info("Trying to start backup for Backroll job: {}", jobId);
         String backupJob = "";
-
-        loginIfAuthenticationFailed();
-
-        try {
-            CloseableHttpResponse response = 
post(String.format("/tasks/singlebackup/%s", jobId), null);
-            String result = okBody(response);
-            BackrollTaskRequestResponse requestResponse = new 
ObjectMapper().readValue(result, BackrollTaskRequestResponse.class);
-            response.close();
-            backupJob = requestResponse.location.replace("/api/v1/status/", 
"");
-        } catch (final Exception e) {
-            logger.error("Failed to start Backroll backup job due to: {}", 
e.getMessage());
-        }
+        BackrollTaskRequestResponse requestResponse = 
httpProvider.post(String.format("/tasks/singlebackup/%s", jobId), null, 
BackrollTaskRequestResponse.class);
+        backupJob = requestResponse.location.replace("/api/v1/status/", "");
         return StringUtils.isEmpty(backupJob) ? null : backupJob;
     }
 
-    public String getBackupOfferingUrl() throws KeyManagementException, 
NoSuchAlgorithmException, IOException {
-        logger.info("Trying to list backroll backup policies");
-
-        loginIfAuthenticationFailed();
+    public String getBackupOfferingUrl() throws IOException, 
BackrollApiException  {
+        logger.info("Trying to get backroll backup policies url");
         String url = "";
-
-        try {
-            CloseableHttpResponse response = get("/backup_policies");
-            String result = okBody(response);
-            logger.info("BackrollClient:getBackupOfferingUrl:result:  " + 
result);
-            //BackrollTaskRequestResponse requestResponse = parse(result);
-            BackrollTaskRequestResponse requestResponse = new 
ObjectMapper().readValue(result, BackrollTaskRequestResponse.class);
-            logger.info("BackrollClient:getBackupOfferingUrl:Apres PArse:  " + 
requestResponse.location);
-            response.close();
-            url = requestResponse.location.replace("/api/v1", "");
-        } catch (final Exception e) {
-            logger.info("Failed to list Backroll jobs due to: {}", 
e.getMessage());
-            logger.error("Failed to list Backroll jobs due to: {}", 
e.getMessage());
-        }
+        BackrollTaskRequestResponse requestResponse = 
httpProvider.get("/backup_policies", BackrollTaskRequestResponse.class);
+        logger.info("BackrollClient:getBackupOfferingUrl:Apres Parse:  " + 
requestResponse.location);
+        url = requestResponse.location.replace("/api/v1", "");
         return StringUtils.isEmpty(url) ? null : url;
     }
 
-    public List<BackupOffering> getBackupOfferings(String idTask) throws 
KeyManagementException, ParseException, NoSuchAlgorithmException, IOException {
+    public List<BackupOffering> getBackupOfferings(String idTask) throws 
BackrollApiException, IOException {
         logger.info("Trying to list backroll backup policies");
-
-        loginIfAuthenticationFailed();
         final List<BackupOffering> policies = new ArrayList<>();
-
-        try {
-            String results = waitGet(idTask);
-            BackupPoliciesResponse backupPoliciesResponse = new 
ObjectMapper().readValue(results, BackupPoliciesResponse.class);
-
-            for (final BackrollBackupPolicyResponse policy : 
backupPoliciesResponse.backupPolicies) {
-                policies.add(new BackrollOffering(policy.name, policy.id));
-            }
-        } catch (final IOException | InterruptedException e) {
-            logger.error("Failed to list Backroll jobs due to: {}", 
e.getMessage());
+        BackupPoliciesResponse backupPoliciesResponse = 
httpProvider.waitGet(idTask, BackupPoliciesResponse.class);
+        logger.info("BackrollClient:getBackupOfferings:Apres Parse:  " + 
backupPoliciesResponse.backupPolicies.get(0).name);
+        for (final BackrollBackupPolicyResponse policy : 
backupPoliciesResponse.backupPolicies) {
+            policies.add(new BackrollOffering(policy.name, policy.id));
         }
+
         return policies;
     }
 
-    public boolean restoreVMFromBackup(final String vmId, final String 
backupName) throws KeyManagementException, ParseException, 
NoSuchAlgorithmException, IOException {
+    public boolean restoreVMFromBackup(final String vmId, final String 
backupName) throws IOException, BackrollApiException  {
         logger.info("Start restore backup with backroll with backup {} for vm 
{}", backupName, vmId);
 
-        loginIfAuthenticationFailed();
         boolean isRestoreOk = false;
 
+        JSONObject jsonBody = new JSONObject();
         try {
-            JSONObject jsonBody = new JSONObject();
-            try {
-                jsonBody.put("virtual_machine_id", vmId);
-                jsonBody.put("backup_name", backupName);
-                jsonBody.put("storage", "");
-                jsonBody.put("mode", "single");
+            jsonBody.put("virtual_machine_id", vmId);
+            jsonBody.put("backup_name", backupName);
+            jsonBody.put("storage", "");
+            jsonBody.put("mode", "single");
 
-            } catch (JSONException e) {
-                logger.error("Backroll Error: {}", e.getMessage());
-            }
-
-            CloseableHttpResponse response = 
post(String.format("/tasks/restore/%s", vmId), jsonBody);
-            String result = okBody(response);
-            BackrollTaskRequestResponse requestResponse = new 
ObjectMapper().readValue(result, BackrollTaskRequestResponse.class);
-            response.close();
-            String urlToRequest = requestResponse.location.replace("/api/v1", 
"");
-            result = waitGet(urlToRequest);
+        } catch (JSONException e) {
+            logger.error("Backroll Error: {}", e.getMessage());
+        }
 
-            if(result.contains("SUCCESS")) {
-                logger.debug("RESTORE SUCCESS");
-                isRestoreOk = true;
-            }
+        BackrollTaskRequestResponse requestResponse = 
httpProvider.post(String.format("/tasks/restore/%s", vmId), jsonBody, 
BackrollTaskRequestResponse.class);
+        String urlToRequest = requestResponse.location.replace("/api/v1", "");
 
-        } catch (final NotOkBodyException e) {
-            return false;
-        } catch (final IOException | InterruptedException e) {
-            logger.error("Ouch! Failed to restore VM with Backroll due to: 
{}", e.getMessage());
-            throw new CloudRuntimeException("Ouch! Failed to restore VM with 
Backroll due to: {}" + e.getMessage());
+        String result = httpProvider.waitGetWithoutParseResponse(urlToRequest);
+        if(result.contains("SUCCESS")) {
+            logger.debug("RESTORE SUCCESS content : " + result);
+            logger.debug("RESTORE SUCCESS");
+            isRestoreOk = true;
         }
+
         return isRestoreOk;
     }
 
-    public BackrollTaskStatus checkBackupTaskStatus(String taskId) throws 
KeyManagementException, ParseException, NoSuchAlgorithmException, IOException {
+    public BackrollTaskStatus checkBackupTaskStatus(String taskId) throws 
IOException, BackrollApiException {
         logger.info("Trying to get backup status for Backroll task: {}", 
taskId);
 
-        loginIfAuthenticationFailed();
-
         BackrollTaskStatus status = new BackrollTaskStatus();
 
-        try {
-
-            String body = okBody(get("/status/" + taskId));
-
-            if (body.contains(TaskState.FAILURE) || 
body.contains(TaskState.PENDING)) {
-                BackrollBackupStatusResponse backupStatusRequestResponse = new 
ObjectMapper().readValue(body, BackrollBackupStatusResponse.class);
-                status.setState(backupStatusRequestResponse.state);
-            } else {
-                BackrollBackupStatusSuccessResponse 
backupStatusSuccessRequestResponse = new ObjectMapper().readValue(body, 
BackrollBackupStatusSuccessResponse.class);
-                status.setState(backupStatusSuccessRequestResponse.state);
-                status.setInfo(backupStatusSuccessRequestResponse.info);
-            }
-
-        } catch (final NotOkBodyException e) {
-            // throw new CloudRuntimeException("Failed to retrieve backups 
status for this
-            // VM via Backroll");
-            logger.error("Failed to retrieve backups status for this VM via 
Backroll");
+        String backupResponse = 
httpProvider.getWithoutParseResponse("/status/" + taskId);
 
-        } catch (final IOException e) {
-            logger.error("Failed to check backups status due to: {}", 
e.getMessage());
+        if (backupResponse.contains(TaskState.FAILURE) || 
backupResponse.contains(TaskState.PENDING)) {
+            BackrollBackupStatusResponse backupStatusRequestResponse = new 
ObjectMapper().readValue(backupResponse, BackrollBackupStatusResponse.class);
+            status.setState(backupStatusRequestResponse.state);
+        } else {
+            BackrollBackupStatusSuccessResponse 
backupStatusSuccessRequestResponse = new 
ObjectMapper().readValue(backupResponse, 
BackrollBackupStatusSuccessResponse.class);
+            status.setState(backupStatusSuccessRequestResponse.state);
+            status.setInfo(backupStatusSuccessRequestResponse.info);
         }
+
         return StringUtils.isEmpty(status.getState()) ? null : status;
     }
 
-    public boolean deleteBackup(final String vmId, final String backupName) 
throws KeyManagementException, NoSuchAlgorithmException, IOException {
+    public boolean deleteBackup(final String vmId, final String backupName) 
throws IOException, BackrollApiException{
         logger.info("Trying to delete backup {} for vm {} using Backroll", 
vmId, backupName);
-
-        loginIfAuthenticationFailed();
-
         boolean isBackupDeleted = false;
 
-        try {
+        BackrollTaskRequestResponse requestResponse =  
httpProvider.delete(String.format("/virtualmachines/%s/backups/%s", vmId, 
backupName), BackrollTaskRequestResponse.class);
+        String urlToRequest = requestResponse.location.replace("/api/v1", "");
+
+        BackrollBackupsFromVMResponse backrollBackupsFromVMResponse = 
httpProvider.waitGet(urlToRequest, BackrollBackupsFromVMResponse.class);
+        logger.debug(backrollBackupsFromVMResponse.state);
+        isBackupDeleted = 
backrollBackupsFromVMResponse.state.equals(TaskState.SUCCESS);
 
-            CloseableHttpResponse response = 
delete(String.format("/virtualmachines/%s/backups/%s", vmId, backupName));
-            String result = okBody(response);
-            BackrollTaskRequestResponse requestResponse = new 
ObjectMapper().readValue(result, BackrollTaskRequestResponse.class);
-            response.close();
-            String urlToRequest = requestResponse.location.replace("/api/v1", 
"");
-
-            result = waitGet(urlToRequest);
-            BackrollBackupsFromVMResponse backrollBackupsFromVMResponse = new 
ObjectMapper().readValue(result, BackrollBackupsFromVMResponse.class);
-            logger.debug(backrollBackupsFromVMResponse.state);
-            isBackupDeleted = 
backrollBackupsFromVMResponse.state.equals(TaskState.SUCCESS);
-        } catch (final NotOkBodyException e) {
-            isBackupDeleted = false;
-        } catch (final Exception e) {
-            isBackupDeleted = false;
-            logger.error("Failed to delete backup using Backroll due to: {}", 
e.getMessage());
-        }
         return isBackupDeleted;
     }
 
-    public Metric getVirtualMachineMetrics(final String vmId) throws 
KeyManagementException, NoSuchAlgorithmException, IOException {
+    public Metric getVirtualMachineMetrics(final String vmId) throws 
IOException, BackrollApiException {
         logger.info("Trying to retrieve virtual machine metric from Backroll 
for vm {}", vmId);
 
-        loginIfAuthenticationFailed();
-
         Metric metric = new Metric(0L, 0L);
 
-        try {
+        BackrollTaskRequestResponse requestResponse = 
httpProvider.get(String.format("/virtualmachines/%s/repository", vmId), 
BackrollTaskRequestResponse.class);
 
-            CloseableHttpResponse response = 
get(String.format("/virtualmachines/%s/repository", vmId));
-            String result = okBody(response);
-            BackrollTaskRequestResponse requestResponse = new 
ObjectMapper().readValue(result, BackrollTaskRequestResponse.class);
-            response.close();
-            String urlToRequest = requestResponse.location.replace("/api/v1", 
"");
-
-            result = waitGet(urlToRequest);
-            BackrollVmMetricsResponse vmMetricsResponse =new 
ObjectMapper().readValue(result, BackrollVmMetricsResponse.class);
-
-            if (vmMetricsResponse != null && 
vmMetricsResponse.state.equals(TaskState.SUCCESS)) {
-                logger.debug("SUCCESS ok");
-                CacheStats stats = null;
-                try {
-                    stats = vmMetricsResponse.infos.cache.stats;
-                } catch (NullPointerException e) {
-                }
-                if (stats != null) {
-                    long size = Long.parseLong(stats.totalSize);
-                    metric = new Metric(size, size);
-                }
+        String urlToRequest = requestResponse.location.replace("/api/v1", "");
+
+        BackrollVmMetricsResponse vmMetricsResponse = 
httpProvider.waitGet(urlToRequest, BackrollVmMetricsResponse.class);
+
+        if (vmMetricsResponse != null && 
vmMetricsResponse.state.equals(TaskState.SUCCESS)) {
+            logger.debug("SUCCESS ok");
+            CacheStats stats = null;
+            try {
+                stats = vmMetricsResponse.infos.cache.stats;
+            } catch (NullPointerException e) {
+            }
+            if (stats != null) {
+                long size = Long.parseLong(stats.totalSize);
+                metric = new Metric(size, size);
             }
-        } catch (final Exception e) {
-            logger.error("Failed to retrieve virtual machine metrics with 
Backroll due to: {}", e.getMessage());
         }
 
         return metric;
     }
 
-    public BackrollBackupMetrics getBackupMetrics(String vmId, String 
backupId) throws KeyManagementException, NoSuchAlgorithmException, IOException {
+    public BackrollBackupMetrics getBackupMetrics(String vmId, String 
backupId) throws IOException, BackrollApiException {
         logger.info("Trying to get backup metrics for VM: {}, and backup: {}", 
vmId, backupId);
 
-        loginIfAuthenticationFailed();
-
         BackrollBackupMetrics metrics = null;
 
-        try {
+        BackrollTaskRequestResponse requestResponse = 
httpProvider.get(String.format("/virtualmachines/%s/backups/%s", vmId, 
backupId), BackrollTaskRequestResponse.class);
 
-            CloseableHttpResponse response = 
get(String.format("/virtualmachines/%s/backups/%s", vmId, backupId));
-            String result = okBody(response);
-            BackrollTaskRequestResponse requestResponse = new 
ObjectMapper().readValue(result, BackrollTaskRequestResponse.class);
-            response.close();
-            String urlToRequest = requestResponse.location.replace("/api/v1", 
"");
+        String urlToRequest = requestResponse.location.replace("/api/v1", "");
 
-            logger.debug(urlToRequest);
+        logger.debug(urlToRequest);
 
-            result = waitGet(urlToRequest);
-            BackrollBackupMetricsResponse metricsResponse = new 
ObjectMapper().readValue(result, BackrollBackupMetricsResponse.class);
-            if (metricsResponse.info != null) {
-                metrics = new 
BackrollBackupMetrics(Long.parseLong(metricsResponse.info.originalSize),
-                        Long.parseLong(metricsResponse.info.deduplicatedSize));
-            }
-        } catch (final NotOkBodyException e) {
-            throw new CloudRuntimeException("Failed to retrieve backups status 
for this VM via Backroll");
-        } catch (final IOException | InterruptedException e) {
-            logger.error("Failed to check backups status due to: {}", 
e.getMessage());
+        BackrollBackupMetricsResponse metricsResponse = 
httpProvider.waitGet(urlToRequest, BackrollBackupMetricsResponse.class);
+        if (metricsResponse.info != null) {
+            metrics = new 
BackrollBackupMetrics(Long.parseLong(metricsResponse.info.originalSize),
+                    Long.parseLong(metricsResponse.info.deduplicatedSize));
         }
         return metrics;
     }
 
-    public List<BackrollVmBackup> getAllBackupsfromVirtualMachine(String vmId) 
{
+    public List<BackrollVmBackup> getAllBackupsfromVirtualMachine(String vmId) 
throws BackrollApiException, IOException {
         logger.info("Trying to retrieve all backups for vm {}", vmId);
 
         List<BackrollVmBackup> backups = new ArrayList<BackrollVmBackup>();
 
-        try {
-
-            CloseableHttpResponse response = 
get(String.format("/virtualmachines/%s/backups", vmId));
-            String result = okBody(response);
-            BackrollTaskRequestResponse requestResponse = new 
ObjectMapper().readValue(result, BackrollTaskRequestResponse.class);
-            response.close();
-            String urlToRequest = requestResponse.location.replace("/api/v1", 
"");
-
-            logger.debug(urlToRequest);
-
-            result = waitGet(urlToRequest);
-            VirtualMachineBackupsResponse virtualMachineBackupsResponse = new 
ObjectMapper().readValue(result, VirtualMachineBackupsResponse.class);
-
-            if (virtualMachineBackupsResponse.state.equals(TaskState.SUCCESS)) 
{
-                if (virtualMachineBackupsResponse.info.archives.size() > 0) {
-                    for (BackupInfos infos : 
virtualMachineBackupsResponse.info.archives) {
-                        var dateStart = new DateTime(infos.start);
-                        backups.add(new BackrollVmBackup(infos.id, infos.name, 
dateStart.toDate()));
-                    }
-                }
-            }
-
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        return backups;
-    }
-
-    private CloseableHttpResponse post(final String path, final JSONObject 
json) throws IOException, KeyManagementException, NoSuchAlgorithmException {
-        CloseableHttpClient httpClient = createHttpClient();
-
-        String xml = null;
-        StringEntity params = null;
-        if (json != null) {
-            logger.debug("JSON {}", json.toString());
-            params = new StringEntity(json.toString(), 
ContentType.APPLICATION_JSON);
-        }
-
-        String url = apiURI.toString() + path;
-        final HttpPost request = new HttpPost(url);
-
-        if (params != null) {
-            request.setEntity(params);
-        }
-
-        request.setHeader(HttpHeaders.AUTHORIZATION, "Bearer " + 
backrollToken);
-        request.setHeader("Content-type", "application/json");
-
-        final CloseableHttpResponse response = httpClient.execute(request);
-
-        logger.debug("Response received in POST request with body {} is: {} 
for URL {}.", xml, response.toString(), url);
-
-        return response;
-    }
-
-    protected CloseableHttpResponse get(String path) throws IOException, 
KeyManagementException, NoSuchAlgorithmException {
-        CloseableHttpClient httpClient = createHttpClient();
-
-        String url = apiURI.toString() + path;
-        logger.debug("Backroll URL {}", url);
-
-        HttpGet request = new HttpGet(url);
-        request.setHeader(HttpHeaders.AUTHORIZATION, "Bearer " + 
backrollToken);
-        request.setHeader("Content-type", "application/json");
-        CloseableHttpResponse  response = httpClient.execute(request);
-        logger.debug("Response received in GET request is: {} for URL: {}.", 
response.toString(), url);
-        return response;
-    }
-
-    protected CloseableHttpResponse delete(String path) throws IOException, 
KeyManagementException, NoSuchAlgorithmException {
-        CloseableHttpClient httpClient = createHttpClient();
-
-        String url = apiURI.toString() + path;
-        final HttpDelete request = new HttpDelete(url);
-        request.setHeader(HttpHeaders.AUTHORIZATION, "Bearer " + 
backrollToken);
-        request.setHeader("Content-type", "application/json");
-        final CloseableHttpResponse response = httpClient.execute(request);
-        logger.debug("Response received in GET request is: {} for URL: {}.", 
response.toString(), url);
-        return response;
-    }
-
-    private boolean isResponseAuthorized(final HttpResponse response) {
-        return response.getStatusLine().getStatusCode() == HttpStatus.SC_OK
-                || response.getStatusLine().getStatusCode() == 
HttpStatus.SC_ACCEPTED;
-    }
-
-    private class NotOkBodyException extends Exception {
-    }
-
-    private String okBody(final CloseableHttpResponse response)
-            throws ParseException, IOException, NotOkBodyException {
-        String result = "";
-        switch (response.getStatusLine().getStatusCode()) {
-            case HttpStatus.SC_OK:
-            case HttpStatus.SC_ACCEPTED:
-                HttpEntity bodyEntity = response.getEntity();
-                try {
-                    result = EntityUtils.toString(bodyEntity);
-                    EntityUtils.consumeQuietly(bodyEntity);
-                    closeConnection(response);
-                    return result;
-                } finally {
-                    EntityUtils.consumeQuietly(bodyEntity);
-                }
-            default:
-                closeConnection(response);
-                throw new NotOkBodyException();
-        }
-    }
-
-    private <T> T parse(final String json)
-            throws JsonMappingException, JsonProcessingException {
-        return new ObjectMapper().readValue(json, new TypeReference<T>() {
-        });
-    }
-
-    private String waitGet(String url)
-            throws IOException, InterruptedException, KeyManagementException, 
ParseException, NoSuchAlgorithmException {
-        // int threshold = 30; // 5 minutes
-        int maxAttempts = 12; // 2 minutes
-
-        for (int attempt = 1; attempt <= maxAttempts; attempt++) {
-            try {
-                String body = okBody(get(url));
-                if (!body.contains(TaskState.PENDING)) {
-                    return body;
-                }
-            } catch (final NotOkBodyException e) {
-                throw new CloudRuntimeException("An error occured with 
Backroll");
-            }
-            TimeUnit.SECONDS.sleep(10);
-        }
-
-        return null;
-    }
-
-    private boolean isAuthenticated() throws KeyManagementException, 
NoSuchAlgorithmException {
-        boolean result = false;
-
-        if(StringUtils.isEmpty(backrollToken)) {
-            return result;
-        }
-
-        try {
-            CloseableHttpResponse response = post("/auth", null);
-            result = isResponseAuthorized(response);
-            EntityUtils.consumeQuietly(response.getEntity());
-            closeConnection(response);
-        } catch (IOException e) {
-            logger.error("Failed to authenticate to Backroll due to: {}", 
e.getMessage());
-        }
-        return result;
-    }
+        BackrollTaskRequestResponse requestResponse = 
httpProvider.get(String.format("/virtualmachines/%s/backups", vmId), 
BackrollTaskRequestResponse.class);
 
-    private void loginIfAuthenticationFailed() throws KeyManagementException, 
NoSuchAlgorithmException, IOException {
-        if (!isAuthenticated()) {
-            login(appname, password);
-        }
-    }
-
-    // private void login(final String appname, final String appsecret) throws 
IOException, KeyManagementException, NoSuchAlgorithmException  {
-    //     logger.info("Backroll client -  start login");
-    //     CloseableHttpClient httpClient = createHttpClient();
-    //     CloseableHttpResponse response = null;
-    //     final HttpPost request = new HttpPost(apiURI.toString() + "/login");
-    //     request.addHeader("content-type", "application/json");
-
-    //     JSONObject jsonBody = new JSONObject();
-    //     StringEntity params;
-
-    //     try {
-    //         jsonBody.put("app_id", appname);
-    //         jsonBody.put("app_secret", appsecret);
-    //         params = new StringEntity(jsonBody.toString());
-    //         request.setEntity(params);
-
-    //         response = httpClient.execute(request);
-
-    //         try {
-    //             HttpEntity body = response.getEntity();
-    //             String bodyStr = EntityUtils.toString(body);
-
-    //             LoginApiResponse loginResponse = new 
ObjectMapper().readValue(bodyStr, LoginApiResponse.class);
-    //             backrollToken = loginResponse.accessToken;
-    //             logger.debug(String.format("Backroll client -  Token : %s", 
backrollToken));
-
-    //             EntityUtils.consumeQuietly(response.getEntity());
-
-    //             if (StringUtils.isEmpty(loginResponse.accessToken)) {
-    //                 throw new CloudRuntimeException("Backroll token is not 
available to perform API requests");
-    //             }
-    //         } catch  (final Exception e) {
-    //             EntityUtils.consumeQuietly(response.getEntity());
-    //             if (response.getStatusLine().getStatusCode() != 
HttpStatus.SC_CREATED) {
-    //                 throw new CloudRuntimeException(
-    //                         "Failed to create and authenticate Backroll 
client, please check the settings.");
-    //             } else {
-    //                 throw new ServerApiException(ApiErrorCode.UNAUTHORIZED,
-    //                         "Backroll API call unauthorized, please ask 
your administrator to fix integration issues.");
-    //             }
-    //         }
-
-    //     } catch (final IOException e) {
-    //         throw new CloudRuntimeException("Failed to authenticate 
Backroll API service due to:" + e.getMessage());
-    //     } catch (JSONException e) {
-    //         e.printStackTrace();
-    //     }
-    //     finally {
-    //         closeConnection(response);
-    //     }
-    //     logger.info("Backroll client -  end login");
-    // }
-
-    private void login(final String appname, final String appsecret) throws 
IOException, KeyManagementException, NoSuchAlgorithmException {
-        logger.debug("Backroll client -  start login");
-
-        CloseableHttpClient httpClient = createHttpClient();
-        CloseableHttpResponse response = null;
-
-        final HttpPost request = new HttpPost(apiURI.toString() + "/login");
-        request.addHeader("content-type", "application/json");
-
-        JSONObject jsonBody = new JSONObject();
-        StringEntity params;
-
-        try {
-            jsonBody.put("app_id", appname);
-            jsonBody.put("app_secret", appsecret);
-            params = new StringEntity(jsonBody.toString());
-            request.setEntity(params);
+        String urlToRequest = requestResponse.location.replace("/api/v1", "");
+        logger.debug(urlToRequest);
+        VirtualMachineBackupsResponse virtualMachineBackupsResponse = 
httpProvider.waitGet(urlToRequest, VirtualMachineBackupsResponse.class);
 
-            response = httpClient.execute(request);
-            try {
-                String toto = okBody(response);
-                ObjectMapper objectMapper = new ObjectMapper();
-                logger.info("BACKROLL:     " + toto);
-                LoginApiResponse loginResponse = objectMapper.readValue(toto, 
LoginApiResponse.class);
-                logger.info("ok");
-                backrollToken = loginResponse.accessToken;
-                logger.debug("Backroll client -  Token : {}", backrollToken);
-
-                if (StringUtils.isEmpty(loginResponse.accessToken)) {
-                    throw new CloudRuntimeException("Backroll token is not 
available to perform API requests");
-                }
-            } catch (final NotOkBodyException e) {
-                if (response.getStatusLine().getStatusCode() != 
HttpStatus.SC_CREATED) {
-                    throw new CloudRuntimeException(
-                            "Failed to create and authenticate Backroll 
client, please check the settings.");
-                } else {
-                    throw new ServerApiException(ApiErrorCode.UNAUTHORIZED,
-                            "Backroll API call unauthorized, please ask your 
administrator to fix integration issues.");
+        if (virtualMachineBackupsResponse.state.equals(TaskState.SUCCESS)) {
+            if (virtualMachineBackupsResponse.info.archives.size() > 0) {
+                for (BackupInfos infos : 
virtualMachineBackupsResponse.info.archives) {
+                    var dateStart = new DateTime(infos.start);
+                    backups.add(new BackrollVmBackup(infos.id, infos.name, 
dateStart.toDate()));
                 }
             }
-        } catch (final IOException e) {
-            throw new CloudRuntimeException("Failed to authenticate Backroll 
API service due to:" + e.getMessage());
-        } catch (JSONException e) {
-            e.printStackTrace();
         }
-        finally {
-            closeConnection(response);
-        }
-        logger.debug("Backroll client -  end login");
-    }
 
-    private List<BackrollBackup> getBackrollBackups(final String vmId) throws 
KeyManagementException, ParseException, NoSuchAlgorithmException {
-        try {
-            logger.info("start to list Backroll backups for vm {}", vmId);
-
-            CloseableHttpResponse response = get("/virtualmachines/" + vmId + 
"/backups");
-            String result = okBody(response);
-            BackrollTaskRequestResponse requestResponse = new 
ObjectMapper().readValue(result, BackrollTaskRequestResponse.class);
-            response.close();
-            String urlToRequest = requestResponse.location.replace("/api/v1", 
"");
-
-            logger.debug(urlToRequest);
-            result = waitGet(urlToRequest);
-            BackrollBackupsFromVMResponse backrollBackupsFromVMResponse = new 
ObjectMapper().readValue(result, BackrollBackupsFromVMResponse.class);
-
-            final List<BackrollBackup> backups = new ArrayList<>();
-            for (final BackrollArchiveResponse archive : 
backrollBackupsFromVMResponse.archives.archives) {
-                backups.add(new BackrollBackup(archive.name));
-                logger.debug(archive.name);
-            }
-            return backups;
-        } catch (final NotOkBodyException e) {
-            throw new CloudRuntimeException("Failed to retrieve backups for 
this VM via Backroll");
-        } catch (final IOException e) {
-            logger.error("Failed to list backup form vm with Backroll due to: 
{}", e);
-        } catch (InterruptedException e) {
-            logger.error("Backroll Error: {}", e);
-        }
-        return new ArrayList<BackrollBackup>();
+        return backups;
     }
 }

Review Comment:
   ```suggestion
   }
   
   ```



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscr...@cloudstack.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


Reply via email to