harikrishna-patnala commented on code in PR #8251:
URL: https://github.com/apache/cloudstack/pull/8251#discussion_r1990623677


##########
plugins/backup/backroll/src/main/java/org/apache/cloudstack/backup/BackrollBackupProvider.java:
##########
@@ -0,0 +1,436 @@
+// 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 org.apache.cloudstack.backup;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+import javax.inject.Inject;
+
+import org.apache.cloudstack.backup.Backup.Metric;
+import org.apache.cloudstack.backup.backroll.BackrollClient;
+import org.apache.cloudstack.backup.backroll.model.BackrollBackupMetrics;
+import org.apache.cloudstack.backup.backroll.model.BackrollTaskStatus;
+import org.apache.cloudstack.backup.backroll.model.BackrollVmBackup;
+import org.apache.cloudstack.backup.backroll.utils.BackrollApiException;
+import org.apache.cloudstack.backup.backroll.utils.BackrollHttpClientProvider;
+import org.apache.cloudstack.backup.dao.BackupDao;
+import org.apache.cloudstack.framework.config.ConfigKey;
+import org.apache.cloudstack.framework.config.Configurable;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.http.ParseException;
+import org.apache.logging.log4j.Logger;
+import org.joda.time.DateTime;
+
+import com.cloud.utils.Pair;
+import com.cloud.utils.component.AdapterBase;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.vm.VMInstanceVO;
+import com.cloud.vm.VirtualMachine;
+import com.cloud.vm.dao.VMInstanceDao;
+
+public class BackrollBackupProvider extends AdapterBase implements 
BackupProvider, Configurable {
+
+    public static final String BACKUP_IDENTIFIER = "-CSBKP-";
+
+    public ConfigKey<String> BackrollUrlConfigKey = new 
ConfigKey<>("Advanced", String.class,
+    "backup.plugin.backroll.config.url",
+    "http://api.backup.demo.ccc:5050/api/v1";,
+    "Url for backroll plugin.", true, ConfigKey.Scope.Zone);
+
+    public ConfigKey<String> BackrollAppNameConfigKey = new 
ConfigKey<>("Advanced", String.class,
+    "backup.plugin.backroll.config.appname",
+    "backroll-api",
+    "App Name for backroll plugin.", true, ConfigKey.Scope.Zone);
+
+    public ConfigKey<String> BackrollPasswordConfigKey = new 
ConfigKey<>("Advanced", String.class,
+    "backup.plugin.backroll.config.password",
+    "VviX8dALauSyYJMqVYJqf3UyZOpO3joS",
+    "Password for backroll plugin.", true, ConfigKey.Scope.Zone);
+
+    private BackrollClient backrollClient;
+
+    @Inject
+    private BackupDao backupDao;
+    @Inject
+    private VMInstanceDao vmInstanceDao;
+
+    public BackrollBackupProvider(BackupDao backupDao, VMInstanceDao 
vmInstanceDao, BackrollClient client, Logger logger){
+        this.backupDao = backupDao;
+        this.vmInstanceDao = vmInstanceDao;
+        this.backrollClient = client;
+        this.logger = logger;
+    }
+
+    public BackrollBackupProvider(){}
+
+    @Override
+    public String getName() {
+        return "backroll";
+    }
+
+    @Override
+    public String getDescription() {
+        return "Backroll Backup Plugin";
+    }
+
+    @Override
+    public List<BackupOffering> listBackupOfferings(Long zoneId) {
+        logger.debug("Listing backup policies on backroll B&R Plugin");
+        BackrollClient client = getClient(zoneId);
+        try{
+            String urlToRequest = client.getBackupOfferingUrl();
+            logger.info("BackrollProvider: urlToRequest: " + urlToRequest);
+            if (!StringUtils.isEmpty(urlToRequest)){
+                List<BackupOffering> results = new ArrayList<BackupOffering>();
+                // return client.getBackupOfferings(urlToRequest);
+                results = client.getBackupOfferings(urlToRequest);
+                if(results.size()>0) {
+                    logger.info("BackrollProvider: results > 0");
+                } else {
+                    logger.info("BackrollProvider: results <= 0");
+                }
+                return results;
+            }
+        } catch (ParseException | BackrollApiException | IOException e) {
+            logger.info("BackrollProvider: catch erreur: {}", e);
+            throw new CloudRuntimeException("Failed to load backup offerings");
+        }
+        return new ArrayList<BackupOffering>();
+    }
+
+    @Override
+    public boolean isValidProviderOffering(Long zoneId, String uuid) {
+        logger.info("Checking if backup offering exists on the Backroll Backup 
Provider");
+        return true;
+    }
+
+    @Override
+    public boolean assignVMToBackupOffering(VirtualMachine vm, BackupOffering 
backupOffering) {
+        logger.info("Creating VM backup for VM {} from backup offering {}", 
vm.getInstanceName(), backupOffering.getName());
+        if(vm instanceof VMInstanceVO) {
+            ((VMInstanceVO) vm).setBackupExternalId(backupOffering.getUuid());
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public boolean restoreVMFromBackup(VirtualMachine vm, Backup backup) {
+        logger.debug("Restoring vm {} from backup {} on the backroll Backup 
Provider", vm.getUuid(), backup.getUuid());
+        boolean isSuccess;
+        try {
+            isSuccess = 
getClient(vm.getDataCenterId()).restoreVMFromBackup(vm.getUuid(), 
getBackupName(backup));
+        } catch (ParseException | BackrollApiException | IOException e) {
+            throw new CloudRuntimeException("Failed to restore VM from 
Backup");
+        }
+        return isSuccess;
+    }
+
+    @Override
+    public Map<VirtualMachine, Backup.Metric> getBackupMetrics(Long zoneId, 
List<VirtualMachine> vms) {
+        final Map<VirtualMachine, Backup.Metric> metrics = new HashMap<>();
+        if (CollectionUtils.isEmpty(vms)) {
+            logger.warn("Unable to get VM Backup Metrics because the list of 
VMs is empty.");
+            return metrics;
+        }
+
+        List<String> vmUuids = 
vms.stream().filter(Objects::nonNull).map(VirtualMachine::getUuid).collect(Collectors.toList());
+        logger.debug("Get Backup Metrics for VMs: {}.", String.join(", ", 
vmUuids));
+
+        BackrollClient client = getClient(zoneId);
+        for (final VirtualMachine vm : vms) {
+            if (vm == null) {
+                continue;
+            }
+
+            Metric metric;
+            try {
+                metric = client.getVirtualMachineMetrics(vm.getUuid());
+            } catch (BackrollApiException | IOException e) {
+                throw new CloudRuntimeException("Failed to retrieve backup 
metrics");
+            }
+            logger.debug("Metrics for VM [uuid: {}, name: {}] is [backup size: 
{}, data size: {}].", vm.getUuid(),
+                    vm.getInstanceName(), metric.getBackupSize(), 
metric.getDataSize());
+            metrics.put(vm, metric);
+        }
+        return metrics;
+    }
+
+    @Override
+    public boolean removeVMFromBackupOffering(VirtualMachine vm) {
+        return true;
+    }
+
+    @Override
+    public boolean willDeleteBackupsOnOfferingRemoval() {
+        return false;
+    }
+
+    @Override
+    public boolean takeBackup(VirtualMachine vm) {
+        logger.info("Starting backup for VM ID {} on backroll provider", 
vm.getUuid());
+        final BackrollClient client = getClient(vm.getDataCenterId());
+
+        try {
+            String urlToRequest = client.startBackupJob(vm.getUuid());
+            logger.info("BackrollProvider: urlToRequest: " + urlToRequest);
+            String backupJob = urlToRequest.replace("/status/", "");
+            if (!StringUtils.isEmpty(backupJob)) {
+                BackupVO backup = new BackupVO();
+                backup.setVmId(vm.getId());
+                backup.setExternalId(backupJob);
+                backup.setType("INCREMENTAL");
+                backup.setDate(new DateTime().toDate());
+                backup.setSize(0L);
+                backup.setProtectedSize(0L);
+                backup.setStatus(Backup.Status.BackingUp);
+                backup.setBackupOfferingId(vm.getBackupOfferingId());
+                backup.setAccountId(vm.getAccountId());
+                backup.setDomainId(vm.getDomainId());
+                backup.setZoneId(vm.getDataCenterId());
+                Boolean result = backupDao.persist(backup) != null;
+                client.triggerTaskStatus(urlToRequest);
+                syncBackups(vm, null);
+                return result;

Review Comment:
   ```suggestion
                   if (backupDao.persist(backup) != null) {
                       client.triggerTaskStatus(urlToRequest);
                       syncBackups(vm, null);
                       return new Pair<>(true, backup);
                   }
   ```



##########
plugins/backup/backroll/src/main/java/org/apache/cloudstack/backup/BackrollBackupProvider.java:
##########
@@ -0,0 +1,436 @@
+// 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 org.apache.cloudstack.backup;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+import javax.inject.Inject;
+
+import org.apache.cloudstack.backup.Backup.Metric;
+import org.apache.cloudstack.backup.backroll.BackrollClient;
+import org.apache.cloudstack.backup.backroll.model.BackrollBackupMetrics;
+import org.apache.cloudstack.backup.backroll.model.BackrollTaskStatus;
+import org.apache.cloudstack.backup.backroll.model.BackrollVmBackup;
+import org.apache.cloudstack.backup.backroll.utils.BackrollApiException;
+import org.apache.cloudstack.backup.backroll.utils.BackrollHttpClientProvider;
+import org.apache.cloudstack.backup.dao.BackupDao;
+import org.apache.cloudstack.framework.config.ConfigKey;
+import org.apache.cloudstack.framework.config.Configurable;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.http.ParseException;
+import org.apache.logging.log4j.Logger;
+import org.joda.time.DateTime;
+
+import com.cloud.utils.Pair;
+import com.cloud.utils.component.AdapterBase;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.vm.VMInstanceVO;
+import com.cloud.vm.VirtualMachine;
+import com.cloud.vm.dao.VMInstanceDao;
+
+public class BackrollBackupProvider extends AdapterBase implements 
BackupProvider, Configurable {
+
+    public static final String BACKUP_IDENTIFIER = "-CSBKP-";
+
+    public ConfigKey<String> BackrollUrlConfigKey = new 
ConfigKey<>("Advanced", String.class,
+    "backup.plugin.backroll.config.url",
+    "http://api.backup.demo.ccc:5050/api/v1";,
+    "Url for backroll plugin.", true, ConfigKey.Scope.Zone);
+
+    public ConfigKey<String> BackrollAppNameConfigKey = new 
ConfigKey<>("Advanced", String.class,
+    "backup.plugin.backroll.config.appname",
+    "backroll-api",
+    "App Name for backroll plugin.", true, ConfigKey.Scope.Zone);
+
+    public ConfigKey<String> BackrollPasswordConfigKey = new 
ConfigKey<>("Advanced", String.class,
+    "backup.plugin.backroll.config.password",
+    "VviX8dALauSyYJMqVYJqf3UyZOpO3joS",
+    "Password for backroll plugin.", true, ConfigKey.Scope.Zone);
+
+    private BackrollClient backrollClient;
+
+    @Inject
+    private BackupDao backupDao;
+    @Inject
+    private VMInstanceDao vmInstanceDao;
+
+    public BackrollBackupProvider(BackupDao backupDao, VMInstanceDao 
vmInstanceDao, BackrollClient client, Logger logger){
+        this.backupDao = backupDao;
+        this.vmInstanceDao = vmInstanceDao;
+        this.backrollClient = client;
+        this.logger = logger;
+    }
+
+    public BackrollBackupProvider(){}
+
+    @Override
+    public String getName() {
+        return "backroll";
+    }
+
+    @Override
+    public String getDescription() {
+        return "Backroll Backup Plugin";
+    }
+
+    @Override
+    public List<BackupOffering> listBackupOfferings(Long zoneId) {
+        logger.debug("Listing backup policies on backroll B&R Plugin");
+        BackrollClient client = getClient(zoneId);
+        try{
+            String urlToRequest = client.getBackupOfferingUrl();
+            logger.info("BackrollProvider: urlToRequest: " + urlToRequest);
+            if (!StringUtils.isEmpty(urlToRequest)){
+                List<BackupOffering> results = new ArrayList<BackupOffering>();
+                // return client.getBackupOfferings(urlToRequest);
+                results = client.getBackupOfferings(urlToRequest);
+                if(results.size()>0) {
+                    logger.info("BackrollProvider: results > 0");
+                } else {
+                    logger.info("BackrollProvider: results <= 0");
+                }
+                return results;
+            }
+        } catch (ParseException | BackrollApiException | IOException e) {
+            logger.info("BackrollProvider: catch erreur: {}", e);
+            throw new CloudRuntimeException("Failed to load backup offerings");
+        }
+        return new ArrayList<BackupOffering>();
+    }
+
+    @Override
+    public boolean isValidProviderOffering(Long zoneId, String uuid) {
+        logger.info("Checking if backup offering exists on the Backroll Backup 
Provider");
+        return true;
+    }
+
+    @Override
+    public boolean assignVMToBackupOffering(VirtualMachine vm, BackupOffering 
backupOffering) {
+        logger.info("Creating VM backup for VM {} from backup offering {}", 
vm.getInstanceName(), backupOffering.getName());
+        if(vm instanceof VMInstanceVO) {
+            ((VMInstanceVO) vm).setBackupExternalId(backupOffering.getUuid());
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public boolean restoreVMFromBackup(VirtualMachine vm, Backup backup) {
+        logger.debug("Restoring vm {} from backup {} on the backroll Backup 
Provider", vm.getUuid(), backup.getUuid());
+        boolean isSuccess;
+        try {
+            isSuccess = 
getClient(vm.getDataCenterId()).restoreVMFromBackup(vm.getUuid(), 
getBackupName(backup));
+        } catch (ParseException | BackrollApiException | IOException e) {
+            throw new CloudRuntimeException("Failed to restore VM from 
Backup");
+        }
+        return isSuccess;
+    }
+
+    @Override
+    public Map<VirtualMachine, Backup.Metric> getBackupMetrics(Long zoneId, 
List<VirtualMachine> vms) {
+        final Map<VirtualMachine, Backup.Metric> metrics = new HashMap<>();
+        if (CollectionUtils.isEmpty(vms)) {
+            logger.warn("Unable to get VM Backup Metrics because the list of 
VMs is empty.");
+            return metrics;
+        }
+
+        List<String> vmUuids = 
vms.stream().filter(Objects::nonNull).map(VirtualMachine::getUuid).collect(Collectors.toList());
+        logger.debug("Get Backup Metrics for VMs: {}.", String.join(", ", 
vmUuids));
+
+        BackrollClient client = getClient(zoneId);
+        for (final VirtualMachine vm : vms) {
+            if (vm == null) {
+                continue;
+            }
+
+            Metric metric;
+            try {
+                metric = client.getVirtualMachineMetrics(vm.getUuid());
+            } catch (BackrollApiException | IOException e) {
+                throw new CloudRuntimeException("Failed to retrieve backup 
metrics");
+            }
+            logger.debug("Metrics for VM [uuid: {}, name: {}] is [backup size: 
{}, data size: {}].", vm.getUuid(),
+                    vm.getInstanceName(), metric.getBackupSize(), 
metric.getDataSize());
+            metrics.put(vm, metric);
+        }
+        return metrics;
+    }
+
+    @Override
+    public boolean removeVMFromBackupOffering(VirtualMachine vm) {
+        return true;
+    }
+
+    @Override
+    public boolean willDeleteBackupsOnOfferingRemoval() {
+        return false;
+    }
+
+    @Override
+    public boolean takeBackup(VirtualMachine vm) {
+        logger.info("Starting backup for VM ID {} on backroll provider", 
vm.getUuid());
+        final BackrollClient client = getClient(vm.getDataCenterId());
+
+        try {
+            String urlToRequest = client.startBackupJob(vm.getUuid());
+            logger.info("BackrollProvider: urlToRequest: " + urlToRequest);
+            String backupJob = urlToRequest.replace("/status/", "");
+            if (!StringUtils.isEmpty(backupJob)) {
+                BackupVO backup = new BackupVO();
+                backup.setVmId(vm.getId());
+                backup.setExternalId(backupJob);
+                backup.setType("INCREMENTAL");
+                backup.setDate(new DateTime().toDate());
+                backup.setSize(0L);
+                backup.setProtectedSize(0L);
+                backup.setStatus(Backup.Status.BackingUp);
+                backup.setBackupOfferingId(vm.getBackupOfferingId());
+                backup.setAccountId(vm.getAccountId());
+                backup.setDomainId(vm.getDomainId());
+                backup.setZoneId(vm.getDataCenterId());
+                Boolean result = backupDao.persist(backup) != null;
+                client.triggerTaskStatus(urlToRequest);
+                syncBackups(vm, null);
+                return result;
+            }
+        } catch (ParseException | BackrollApiException | IOException e) {
+            logger.debug(e.getMessage());
+            throw new CloudRuntimeException("Failed to take backup");
+        }
+        return false;
+    }
+
+
+    @Override

Review Comment:
   ```suggestion
   
   ```



##########
plugins/backup/backroll/src/main/java/org/apache/cloudstack/backup/BackrollBackupProvider.java:
##########
@@ -0,0 +1,436 @@
+// 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 org.apache.cloudstack.backup;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+import javax.inject.Inject;
+
+import org.apache.cloudstack.backup.Backup.Metric;
+import org.apache.cloudstack.backup.backroll.BackrollClient;
+import org.apache.cloudstack.backup.backroll.model.BackrollBackupMetrics;
+import org.apache.cloudstack.backup.backroll.model.BackrollTaskStatus;
+import org.apache.cloudstack.backup.backroll.model.BackrollVmBackup;
+import org.apache.cloudstack.backup.backroll.utils.BackrollApiException;
+import org.apache.cloudstack.backup.backroll.utils.BackrollHttpClientProvider;
+import org.apache.cloudstack.backup.dao.BackupDao;
+import org.apache.cloudstack.framework.config.ConfigKey;
+import org.apache.cloudstack.framework.config.Configurable;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.http.ParseException;
+import org.apache.logging.log4j.Logger;
+import org.joda.time.DateTime;
+
+import com.cloud.utils.Pair;
+import com.cloud.utils.component.AdapterBase;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.vm.VMInstanceVO;
+import com.cloud.vm.VirtualMachine;
+import com.cloud.vm.dao.VMInstanceDao;
+
+public class BackrollBackupProvider extends AdapterBase implements 
BackupProvider, Configurable {
+
+    public static final String BACKUP_IDENTIFIER = "-CSBKP-";
+
+    public ConfigKey<String> BackrollUrlConfigKey = new 
ConfigKey<>("Advanced", String.class,
+    "backup.plugin.backroll.config.url",
+    "http://api.backup.demo.ccc:5050/api/v1";,
+    "Url for backroll plugin.", true, ConfigKey.Scope.Zone);
+
+    public ConfigKey<String> BackrollAppNameConfigKey = new 
ConfigKey<>("Advanced", String.class,
+    "backup.plugin.backroll.config.appname",
+    "backroll-api",
+    "App Name for backroll plugin.", true, ConfigKey.Scope.Zone);
+
+    public ConfigKey<String> BackrollPasswordConfigKey = new 
ConfigKey<>("Advanced", String.class,
+    "backup.plugin.backroll.config.password",
+    "VviX8dALauSyYJMqVYJqf3UyZOpO3joS",
+    "Password for backroll plugin.", true, ConfigKey.Scope.Zone);
+
+    private BackrollClient backrollClient;
+
+    @Inject
+    private BackupDao backupDao;
+    @Inject
+    private VMInstanceDao vmInstanceDao;
+
+    public BackrollBackupProvider(BackupDao backupDao, VMInstanceDao 
vmInstanceDao, BackrollClient client, Logger logger){
+        this.backupDao = backupDao;
+        this.vmInstanceDao = vmInstanceDao;
+        this.backrollClient = client;
+        this.logger = logger;
+    }
+
+    public BackrollBackupProvider(){}
+
+    @Override
+    public String getName() {
+        return "backroll";
+    }
+
+    @Override
+    public String getDescription() {
+        return "Backroll Backup Plugin";
+    }
+
+    @Override
+    public List<BackupOffering> listBackupOfferings(Long zoneId) {
+        logger.debug("Listing backup policies on backroll B&R Plugin");
+        BackrollClient client = getClient(zoneId);
+        try{
+            String urlToRequest = client.getBackupOfferingUrl();
+            logger.info("BackrollProvider: urlToRequest: " + urlToRequest);
+            if (!StringUtils.isEmpty(urlToRequest)){
+                List<BackupOffering> results = new ArrayList<BackupOffering>();
+                // return client.getBackupOfferings(urlToRequest);
+                results = client.getBackupOfferings(urlToRequest);
+                if(results.size()>0) {
+                    logger.info("BackrollProvider: results > 0");
+                } else {
+                    logger.info("BackrollProvider: results <= 0");
+                }
+                return results;
+            }
+        } catch (ParseException | BackrollApiException | IOException e) {
+            logger.info("BackrollProvider: catch erreur: {}", e);
+            throw new CloudRuntimeException("Failed to load backup offerings");
+        }
+        return new ArrayList<BackupOffering>();
+    }
+
+    @Override
+    public boolean isValidProviderOffering(Long zoneId, String uuid) {
+        logger.info("Checking if backup offering exists on the Backroll Backup 
Provider");
+        return true;
+    }
+
+    @Override
+    public boolean assignVMToBackupOffering(VirtualMachine vm, BackupOffering 
backupOffering) {
+        logger.info("Creating VM backup for VM {} from backup offering {}", 
vm.getInstanceName(), backupOffering.getName());
+        if(vm instanceof VMInstanceVO) {
+            ((VMInstanceVO) vm).setBackupExternalId(backupOffering.getUuid());
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public boolean restoreVMFromBackup(VirtualMachine vm, Backup backup) {
+        logger.debug("Restoring vm {} from backup {} on the backroll Backup 
Provider", vm.getUuid(), backup.getUuid());
+        boolean isSuccess;
+        try {
+            isSuccess = 
getClient(vm.getDataCenterId()).restoreVMFromBackup(vm.getUuid(), 
getBackupName(backup));
+        } catch (ParseException | BackrollApiException | IOException e) {
+            throw new CloudRuntimeException("Failed to restore VM from 
Backup");
+        }
+        return isSuccess;
+    }
+
+    @Override
+    public Map<VirtualMachine, Backup.Metric> getBackupMetrics(Long zoneId, 
List<VirtualMachine> vms) {
+        final Map<VirtualMachine, Backup.Metric> metrics = new HashMap<>();
+        if (CollectionUtils.isEmpty(vms)) {
+            logger.warn("Unable to get VM Backup Metrics because the list of 
VMs is empty.");
+            return metrics;
+        }
+
+        List<String> vmUuids = 
vms.stream().filter(Objects::nonNull).map(VirtualMachine::getUuid).collect(Collectors.toList());
+        logger.debug("Get Backup Metrics for VMs: {}.", String.join(", ", 
vmUuids));
+
+        BackrollClient client = getClient(zoneId);
+        for (final VirtualMachine vm : vms) {
+            if (vm == null) {
+                continue;
+            }
+
+            Metric metric;
+            try {
+                metric = client.getVirtualMachineMetrics(vm.getUuid());
+            } catch (BackrollApiException | IOException e) {
+                throw new CloudRuntimeException("Failed to retrieve backup 
metrics");
+            }
+            logger.debug("Metrics for VM [uuid: {}, name: {}] is [backup size: 
{}, data size: {}].", vm.getUuid(),
+                    vm.getInstanceName(), metric.getBackupSize(), 
metric.getDataSize());
+            metrics.put(vm, metric);
+        }
+        return metrics;
+    }
+
+    @Override
+    public boolean removeVMFromBackupOffering(VirtualMachine vm) {
+        return true;
+    }
+
+    @Override
+    public boolean willDeleteBackupsOnOfferingRemoval() {
+        return false;
+    }
+
+    @Override
+    public boolean takeBackup(VirtualMachine vm) {

Review Comment:
   ```suggestion
       public Pair<Boolean, Backup> takeBackup(VirtualMachine vm) {
   ```



##########
plugins/backup/backroll/src/main/java/org/apache/cloudstack/backup/BackrollBackupProvider.java:
##########
@@ -0,0 +1,436 @@
+// 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 org.apache.cloudstack.backup;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+import javax.inject.Inject;
+
+import org.apache.cloudstack.backup.Backup.Metric;
+import org.apache.cloudstack.backup.backroll.BackrollClient;
+import org.apache.cloudstack.backup.backroll.model.BackrollBackupMetrics;
+import org.apache.cloudstack.backup.backroll.model.BackrollTaskStatus;
+import org.apache.cloudstack.backup.backroll.model.BackrollVmBackup;
+import org.apache.cloudstack.backup.backroll.utils.BackrollApiException;
+import org.apache.cloudstack.backup.backroll.utils.BackrollHttpClientProvider;
+import org.apache.cloudstack.backup.dao.BackupDao;
+import org.apache.cloudstack.framework.config.ConfigKey;
+import org.apache.cloudstack.framework.config.Configurable;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.http.ParseException;
+import org.apache.logging.log4j.Logger;
+import org.joda.time.DateTime;
+
+import com.cloud.utils.Pair;
+import com.cloud.utils.component.AdapterBase;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.vm.VMInstanceVO;
+import com.cloud.vm.VirtualMachine;
+import com.cloud.vm.dao.VMInstanceDao;
+
+public class BackrollBackupProvider extends AdapterBase implements 
BackupProvider, Configurable {
+
+    public static final String BACKUP_IDENTIFIER = "-CSBKP-";
+
+    public ConfigKey<String> BackrollUrlConfigKey = new 
ConfigKey<>("Advanced", String.class,
+    "backup.plugin.backroll.config.url",
+    "http://api.backup.demo.ccc:5050/api/v1";,
+    "Url for backroll plugin.", true, ConfigKey.Scope.Zone);
+
+    public ConfigKey<String> BackrollAppNameConfigKey = new 
ConfigKey<>("Advanced", String.class,
+    "backup.plugin.backroll.config.appname",
+    "backroll-api",
+    "App Name for backroll plugin.", true, ConfigKey.Scope.Zone);
+
+    public ConfigKey<String> BackrollPasswordConfigKey = new 
ConfigKey<>("Advanced", String.class,
+    "backup.plugin.backroll.config.password",
+    "VviX8dALauSyYJMqVYJqf3UyZOpO3joS",
+    "Password for backroll plugin.", true, ConfigKey.Scope.Zone);
+
+    private BackrollClient backrollClient;
+
+    @Inject
+    private BackupDao backupDao;
+    @Inject
+    private VMInstanceDao vmInstanceDao;
+
+    public BackrollBackupProvider(BackupDao backupDao, VMInstanceDao 
vmInstanceDao, BackrollClient client, Logger logger){
+        this.backupDao = backupDao;
+        this.vmInstanceDao = vmInstanceDao;
+        this.backrollClient = client;
+        this.logger = logger;
+    }
+
+    public BackrollBackupProvider(){}
+
+    @Override
+    public String getName() {
+        return "backroll";
+    }
+
+    @Override
+    public String getDescription() {
+        return "Backroll Backup Plugin";
+    }
+
+    @Override
+    public List<BackupOffering> listBackupOfferings(Long zoneId) {
+        logger.debug("Listing backup policies on backroll B&R Plugin");
+        BackrollClient client = getClient(zoneId);
+        try{
+            String urlToRequest = client.getBackupOfferingUrl();
+            logger.info("BackrollProvider: urlToRequest: " + urlToRequest);
+            if (!StringUtils.isEmpty(urlToRequest)){
+                List<BackupOffering> results = new ArrayList<BackupOffering>();
+                // return client.getBackupOfferings(urlToRequest);
+                results = client.getBackupOfferings(urlToRequest);
+                if(results.size()>0) {
+                    logger.info("BackrollProvider: results > 0");
+                } else {
+                    logger.info("BackrollProvider: results <= 0");
+                }
+                return results;
+            }
+        } catch (ParseException | BackrollApiException | IOException e) {
+            logger.info("BackrollProvider: catch erreur: {}", e);
+            throw new CloudRuntimeException("Failed to load backup offerings");
+        }
+        return new ArrayList<BackupOffering>();
+    }
+
+    @Override
+    public boolean isValidProviderOffering(Long zoneId, String uuid) {
+        logger.info("Checking if backup offering exists on the Backroll Backup 
Provider");
+        return true;
+    }
+
+    @Override
+    public boolean assignVMToBackupOffering(VirtualMachine vm, BackupOffering 
backupOffering) {
+        logger.info("Creating VM backup for VM {} from backup offering {}", 
vm.getInstanceName(), backupOffering.getName());
+        if(vm instanceof VMInstanceVO) {
+            ((VMInstanceVO) vm).setBackupExternalId(backupOffering.getUuid());
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public boolean restoreVMFromBackup(VirtualMachine vm, Backup backup) {
+        logger.debug("Restoring vm {} from backup {} on the backroll Backup 
Provider", vm.getUuid(), backup.getUuid());
+        boolean isSuccess;
+        try {
+            isSuccess = 
getClient(vm.getDataCenterId()).restoreVMFromBackup(vm.getUuid(), 
getBackupName(backup));
+        } catch (ParseException | BackrollApiException | IOException e) {
+            throw new CloudRuntimeException("Failed to restore VM from 
Backup");
+        }
+        return isSuccess;
+    }
+
+    @Override
+    public Map<VirtualMachine, Backup.Metric> getBackupMetrics(Long zoneId, 
List<VirtualMachine> vms) {
+        final Map<VirtualMachine, Backup.Metric> metrics = new HashMap<>();
+        if (CollectionUtils.isEmpty(vms)) {
+            logger.warn("Unable to get VM Backup Metrics because the list of 
VMs is empty.");
+            return metrics;
+        }
+
+        List<String> vmUuids = 
vms.stream().filter(Objects::nonNull).map(VirtualMachine::getUuid).collect(Collectors.toList());
+        logger.debug("Get Backup Metrics for VMs: {}.", String.join(", ", 
vmUuids));
+
+        BackrollClient client = getClient(zoneId);
+        for (final VirtualMachine vm : vms) {
+            if (vm == null) {
+                continue;
+            }
+
+            Metric metric;
+            try {
+                metric = client.getVirtualMachineMetrics(vm.getUuid());
+            } catch (BackrollApiException | IOException e) {
+                throw new CloudRuntimeException("Failed to retrieve backup 
metrics");
+            }
+            logger.debug("Metrics for VM [uuid: {}, name: {}] is [backup size: 
{}, data size: {}].", vm.getUuid(),
+                    vm.getInstanceName(), metric.getBackupSize(), 
metric.getDataSize());
+            metrics.put(vm, metric);
+        }
+        return metrics;
+    }
+

Review Comment:
   ```suggestion
       @Override
       public List<Backup.RestorePoint> listRestorePoints(VirtualMachine vm) {
           return null;
       }
   
       @Override
       public Backup createNewBackupEntryForRestorePoint(Backup.RestorePoint 
restorePoint, VirtualMachine vm, Metric metric) {
           return null;
       }
   
   ```



##########
plugins/backup/backroll/src/main/java/org/apache/cloudstack/backup/BackrollBackupProvider.java:
##########
@@ -0,0 +1,436 @@
+// 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 org.apache.cloudstack.backup;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+import javax.inject.Inject;
+
+import org.apache.cloudstack.backup.Backup.Metric;
+import org.apache.cloudstack.backup.backroll.BackrollClient;
+import org.apache.cloudstack.backup.backroll.model.BackrollBackupMetrics;
+import org.apache.cloudstack.backup.backroll.model.BackrollTaskStatus;
+import org.apache.cloudstack.backup.backroll.model.BackrollVmBackup;
+import org.apache.cloudstack.backup.backroll.utils.BackrollApiException;
+import org.apache.cloudstack.backup.backroll.utils.BackrollHttpClientProvider;
+import org.apache.cloudstack.backup.dao.BackupDao;
+import org.apache.cloudstack.framework.config.ConfigKey;
+import org.apache.cloudstack.framework.config.Configurable;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.http.ParseException;
+import org.apache.logging.log4j.Logger;
+import org.joda.time.DateTime;
+
+import com.cloud.utils.Pair;
+import com.cloud.utils.component.AdapterBase;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.vm.VMInstanceVO;
+import com.cloud.vm.VirtualMachine;
+import com.cloud.vm.dao.VMInstanceDao;
+
+public class BackrollBackupProvider extends AdapterBase implements 
BackupProvider, Configurable {
+
+    public static final String BACKUP_IDENTIFIER = "-CSBKP-";
+
+    public ConfigKey<String> BackrollUrlConfigKey = new 
ConfigKey<>("Advanced", String.class,
+    "backup.plugin.backroll.config.url",
+    "http://api.backup.demo.ccc:5050/api/v1";,
+    "Url for backroll plugin.", true, ConfigKey.Scope.Zone);
+
+    public ConfigKey<String> BackrollAppNameConfigKey = new 
ConfigKey<>("Advanced", String.class,
+    "backup.plugin.backroll.config.appname",
+    "backroll-api",
+    "App Name for backroll plugin.", true, ConfigKey.Scope.Zone);
+
+    public ConfigKey<String> BackrollPasswordConfigKey = new 
ConfigKey<>("Advanced", String.class,
+    "backup.plugin.backroll.config.password",
+    "VviX8dALauSyYJMqVYJqf3UyZOpO3joS",
+    "Password for backroll plugin.", true, ConfigKey.Scope.Zone);
+
+    private BackrollClient backrollClient;
+
+    @Inject
+    private BackupDao backupDao;
+    @Inject
+    private VMInstanceDao vmInstanceDao;
+
+    public BackrollBackupProvider(BackupDao backupDao, VMInstanceDao 
vmInstanceDao, BackrollClient client, Logger logger){
+        this.backupDao = backupDao;
+        this.vmInstanceDao = vmInstanceDao;
+        this.backrollClient = client;
+        this.logger = logger;
+    }
+
+    public BackrollBackupProvider(){}
+
+    @Override
+    public String getName() {
+        return "backroll";
+    }
+
+    @Override
+    public String getDescription() {
+        return "Backroll Backup Plugin";
+    }
+
+    @Override
+    public List<BackupOffering> listBackupOfferings(Long zoneId) {
+        logger.debug("Listing backup policies on backroll B&R Plugin");
+        BackrollClient client = getClient(zoneId);
+        try{
+            String urlToRequest = client.getBackupOfferingUrl();
+            logger.info("BackrollProvider: urlToRequest: " + urlToRequest);
+            if (!StringUtils.isEmpty(urlToRequest)){
+                List<BackupOffering> results = new ArrayList<BackupOffering>();
+                // return client.getBackupOfferings(urlToRequest);
+                results = client.getBackupOfferings(urlToRequest);
+                if(results.size()>0) {
+                    logger.info("BackrollProvider: results > 0");
+                } else {
+                    logger.info("BackrollProvider: results <= 0");
+                }
+                return results;
+            }
+        } catch (ParseException | BackrollApiException | IOException e) {
+            logger.info("BackrollProvider: catch erreur: {}", e);
+            throw new CloudRuntimeException("Failed to load backup offerings");
+        }
+        return new ArrayList<BackupOffering>();
+    }
+
+    @Override
+    public boolean isValidProviderOffering(Long zoneId, String uuid) {
+        logger.info("Checking if backup offering exists on the Backroll Backup 
Provider");
+        return true;
+    }
+
+    @Override
+    public boolean assignVMToBackupOffering(VirtualMachine vm, BackupOffering 
backupOffering) {
+        logger.info("Creating VM backup for VM {} from backup offering {}", 
vm.getInstanceName(), backupOffering.getName());
+        if(vm instanceof VMInstanceVO) {
+            ((VMInstanceVO) vm).setBackupExternalId(backupOffering.getUuid());
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public boolean restoreVMFromBackup(VirtualMachine vm, Backup backup) {
+        logger.debug("Restoring vm {} from backup {} on the backroll Backup 
Provider", vm.getUuid(), backup.getUuid());
+        boolean isSuccess;
+        try {
+            isSuccess = 
getClient(vm.getDataCenterId()).restoreVMFromBackup(vm.getUuid(), 
getBackupName(backup));
+        } catch (ParseException | BackrollApiException | IOException e) {
+            throw new CloudRuntimeException("Failed to restore VM from 
Backup");
+        }
+        return isSuccess;
+    }
+
+    @Override
+    public Map<VirtualMachine, Backup.Metric> getBackupMetrics(Long zoneId, 
List<VirtualMachine> vms) {
+        final Map<VirtualMachine, Backup.Metric> metrics = new HashMap<>();
+        if (CollectionUtils.isEmpty(vms)) {
+            logger.warn("Unable to get VM Backup Metrics because the list of 
VMs is empty.");
+            return metrics;
+        }
+
+        List<String> vmUuids = 
vms.stream().filter(Objects::nonNull).map(VirtualMachine::getUuid).collect(Collectors.toList());
+        logger.debug("Get Backup Metrics for VMs: {}.", String.join(", ", 
vmUuids));
+
+        BackrollClient client = getClient(zoneId);
+        for (final VirtualMachine vm : vms) {
+            if (vm == null) {
+                continue;
+            }
+
+            Metric metric;
+            try {
+                metric = client.getVirtualMachineMetrics(vm.getUuid());
+            } catch (BackrollApiException | IOException e) {
+                throw new CloudRuntimeException("Failed to retrieve backup 
metrics");
+            }
+            logger.debug("Metrics for VM [uuid: {}, name: {}] is [backup size: 
{}, data size: {}].", vm.getUuid(),
+                    vm.getInstanceName(), metric.getBackupSize(), 
metric.getDataSize());
+            metrics.put(vm, metric);
+        }
+        return metrics;
+    }
+
+    @Override
+    public boolean removeVMFromBackupOffering(VirtualMachine vm) {
+        return true;
+    }
+
+    @Override
+    public boolean willDeleteBackupsOnOfferingRemoval() {
+        return false;
+    }
+
+    @Override
+    public boolean takeBackup(VirtualMachine vm) {
+        logger.info("Starting backup for VM ID {} on backroll provider", 
vm.getUuid());
+        final BackrollClient client = getClient(vm.getDataCenterId());
+
+        try {
+            String urlToRequest = client.startBackupJob(vm.getUuid());
+            logger.info("BackrollProvider: urlToRequest: " + urlToRequest);
+            String backupJob = urlToRequest.replace("/status/", "");
+            if (!StringUtils.isEmpty(backupJob)) {
+                BackupVO backup = new BackupVO();
+                backup.setVmId(vm.getId());
+                backup.setExternalId(backupJob);
+                backup.setType("INCREMENTAL");
+                backup.setDate(new DateTime().toDate());
+                backup.setSize(0L);
+                backup.setProtectedSize(0L);
+                backup.setStatus(Backup.Status.BackingUp);
+                backup.setBackupOfferingId(vm.getBackupOfferingId());
+                backup.setAccountId(vm.getAccountId());
+                backup.setDomainId(vm.getDomainId());
+                backup.setZoneId(vm.getDataCenterId());
+                Boolean result = backupDao.persist(backup) != null;
+                client.triggerTaskStatus(urlToRequest);
+                syncBackups(vm, null);
+                return result;
+            }
+        } catch (ParseException | BackrollApiException | IOException e) {
+            logger.debug(e.getMessage());
+            throw new CloudRuntimeException("Failed to take backup");
+        }
+        return false;
+    }

Review Comment:
   ```suggestion
           return new Pair<>(false, null);
       }
   ```



##########
plugins/backup/backroll/src/test/java/org/apache/cloudstack/backup/BackrollBackupProviderTest.java:
##########
@@ -0,0 +1,327 @@
+// 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 org.apache.cloudstack.backup;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+import java.util.UUID;
+
+import org.apache.cloudstack.backup.backroll.BackrollClient;
+import org.apache.cloudstack.backup.backroll.utils.BackrollApiException;
+import org.apache.cloudstack.backup.backroll.model.BackrollTaskStatus;
+import org.apache.cloudstack.backup.backroll.model.BackrollVmBackup;
+import org.apache.cloudstack.backup.backroll.model.BackrollBackupMetrics;
+import org.apache.cloudstack.backup.backroll.model.BackrollOffering;
+import org.apache.cloudstack.backup.backroll.model.response.TaskState;
+import org.apache.cloudstack.backup.Backup.Metric;
+import org.apache.cloudstack.backup.dao.BackupDao;
+import org.apache.logging.log4j.Logger;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.Spy;
+
+import com.cloud.utils.Pair;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.vm.VMInstanceVO;
+import com.cloud.vm.dao.VMInstanceDao;
+import com.cloud.vm.VirtualMachine;
+import org.apache.cloudstack.framework.config.ConfigKey;
+
+public class BackrollBackupProviderTest {
+    @Mock
+    BackrollClient clientMock;
+
+    @Spy
+    @InjectMocks
+    BackrollBackupProvider backupProvider;
+
+    @Mock
+    BackrollBackupProvider backupProviderMock;
+
+    @Mock
+    VMInstanceDao vmInstanceDao;
+
+    @Mock
+    private ConfigKey<String> BackrollUrlConfigKey;
+
+    @Mock
+    private ConfigKey<String> BackrollAppNameConfigKey;
+
+    @Mock
+    private ConfigKey<String> BackrollPasswordConfigKey;
+
+    @Mock
+    BackupDao backupDao;
+
+    @Before
+    public void setUp() throws Exception {
+        vmInstanceDao = mock(VMInstanceDao.class);
+        clientMock = mock(BackrollClient.class);
+        backupDao = mock(BackupDao.class);
+        backupProvider = new BackrollBackupProvider(backupDao, vmInstanceDao, 
clientMock, Mockito.mock(Logger.class));
+        backupProvider.BackrollAppNameConfigKey = BackrollAppNameConfigKey;
+        backupProvider.BackrollPasswordConfigKey = BackrollPasswordConfigKey;
+        backupProvider.BackrollUrlConfigKey = BackrollUrlConfigKey;
+    }
+
+    @Test
+    public void listBackupOfferings_Test() throws BackrollApiException, 
IOException{
+        
Mockito.doReturn("dummyUrlToRequest").when(clientMock).getBackupOfferingUrl();
+        Mockito.doReturn(Arrays.asList(new BackrollOffering("dummyName", 
"dummyId"))).when(clientMock).getBackupOfferings(Mockito.anyString());
+        List<BackupOffering> results = backupProvider.listBackupOfferings(2L);
+        assertTrue(results.size() == 1);
+    }
+
+    @Test
+    public void takeBackup_Test() throws BackrollApiException, IOException {
+
+        VMInstanceVO vmInstanceVO = new VMInstanceVO();
+        vmInstanceVO.setInstanceName("test");
+        vmInstanceVO.setDataCenterId(2l);
+        vmInstanceVO.setUuid(UUID.randomUUID().toString());
+        vmInstanceVO.setBackupOfferingId(2L);
+
+        
Mockito.doReturn("/status/f32092e4-3e8a-461b-8733-ed93e23fa782").when(clientMock).startBackupJob(Mockito.anyString());
+        Mockito.doReturn(new 
BackupVO()).when(backupDao).persist(Mockito.any(BackupVO.class));
+        
Mockito.doNothing().when(clientMock).triggerTaskStatus(Mockito.anyString());
+        syncBackups_Test();
+        Boolean result = backupProvider.takeBackup(vmInstanceVO);

Review Comment:
   ```suggestion
           Boolean result = backupProvider.takeBackup(vmInstanceVO).first();
   ```



-- 
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