List backup policy VM mappings and refactor

This commit is contained in:
nvazquez 2018-05-30 22:36:00 -03:00
parent 400f1412fd
commit 979f3947b2
19 changed files with 326 additions and 43 deletions

View File

@ -18,8 +18,10 @@
package org.apache.cloudstack.api;
import org.apache.cloudstack.api.response.BackupPolicyResponse;
import org.apache.cloudstack.api.response.BackupPolicyVMMapResponse;
import org.apache.cloudstack.api.response.BackupResponse;
import org.apache.cloudstack.api.response.ListResponse;
import org.apache.cloudstack.backup.BackupPolicyVMMap;
import org.apache.cloudstack.context.CallContext;
import org.apache.cloudstack.backup.Backup;
import org.apache.cloudstack.backup.BackupPolicy;
@ -59,6 +61,21 @@ public abstract class BaseBackupListCmd extends BaseListCmd {
setResponseObject(response);
}
protected void setupResponseBackupPolicyVMMappings(final List<BackupPolicyVMMap> mappings) {
final ListResponse<BackupPolicyVMMapResponse> response = new ListResponse<>();
final List<BackupPolicyVMMapResponse> responses = new ArrayList<>();
for (BackupPolicyVMMap map : mappings) {
if (map == null) {
continue;
}
BackupPolicyVMMapResponse resp = _responseGenerator.createBackupPolicyVMMappingResponse(map);
responses.add(resp);
}
response.setResponses(responses);
response.setResponseName(getCommandName());
setResponseObject(response);
}
@Override
public long getEntityOwnerId() {
return CallContext.current().getCallingAccount().getId();

View File

@ -35,6 +35,7 @@ import org.apache.cloudstack.api.response.AutoScalePolicyResponse;
import org.apache.cloudstack.api.response.AutoScaleVmGroupResponse;
import org.apache.cloudstack.api.response.AutoScaleVmProfileResponse;
import org.apache.cloudstack.api.response.BackupPolicyResponse;
import org.apache.cloudstack.api.response.BackupPolicyVMMapResponse;
import org.apache.cloudstack.api.response.BackupResponse;
import org.apache.cloudstack.api.response.CapacityResponse;
import org.apache.cloudstack.api.response.ClusterResponse;
@ -119,6 +120,7 @@ import org.apache.cloudstack.api.response.VpcResponse;
import org.apache.cloudstack.api.response.VpnUsersResponse;
import org.apache.cloudstack.api.response.ZoneResponse;
import org.apache.cloudstack.backup.BackupPolicy;
import org.apache.cloudstack.backup.BackupPolicyVMMap;
import org.apache.cloudstack.config.Configuration;
import org.apache.cloudstack.backup.Backup;
import org.apache.cloudstack.network.lb.ApplicationLoadBalancerRule;
@ -470,4 +472,6 @@ public interface ResponseGenerator {
BackupResponse createBackupResponse(Backup backup);
BackupPolicyResponse createBackupPolicyResponse(BackupPolicy policy);
BackupPolicyVMMapResponse createBackupPolicyVMMappingResponse(BackupPolicyVMMap map);
}

View File

@ -51,7 +51,7 @@ public class DeleteBackupPolicyCmd extends BaseCmd {
//////////////// API parameters /////////////////////
////////////////////////////////////////////////////
@Parameter(name = ApiConstants.ID,
@Parameter(name = ApiConstants.BACKUP_POLICY_ID,
type = CommandType.UUID,
entityType = BackupPolicyResponse.class,
required = true,

View File

@ -54,7 +54,7 @@ public class ListBackupPoliciesCmd extends BaseBackupListCmd {
//////////////// API parameters /////////////////////
/////////////////////////////////////////////////////
@Parameter(name = ApiConstants.ID, type = BaseCmd.CommandType.UUID, entityType = BackupPolicyResponse.class,
@Parameter(name = ApiConstants.BACKUP_POLICY_ID, type = BaseCmd.CommandType.UUID, entityType = BackupPolicyResponse.class,
description = "The backup policy ID")
private Long policyId;
@ -93,6 +93,7 @@ public class ListBackupPoliciesCmd extends BaseBackupListCmd {
@Override
public void execute() throws ResourceUnavailableException, ServerApiException, ConcurrentOperationException {
validateParameters();
try {
List<BackupPolicy> backupPolicies = backupManager.listBackupPolicies(zoneId, external, policyId);
setupResponseBackupPolicyList(backupPolicies);
@ -102,4 +103,10 @@ public class ListBackupPoliciesCmd extends BaseBackupListCmd {
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, e.getMessage());
}
}
private void validateParameters() {
if (zoneId == null && policyId == null) {
throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Please provide a zone id or a policy id");
}
}
}

View File

@ -0,0 +1,87 @@
// 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.api.command.user.backup;
import com.cloud.exception.ConcurrentOperationException;
import com.cloud.exception.InsufficientCapacityException;
import com.cloud.exception.NetworkRuleConflictException;
import com.cloud.exception.ResourceAllocationException;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.utils.exception.CloudRuntimeException;
import org.apache.cloudstack.acl.RoleType;
import org.apache.cloudstack.api.APICommand;
import org.apache.cloudstack.api.ApiConstants;
import org.apache.cloudstack.api.ApiErrorCode;
import org.apache.cloudstack.api.BaseBackupListCmd;
import org.apache.cloudstack.api.BaseCmd;
import org.apache.cloudstack.api.Parameter;
import org.apache.cloudstack.api.ServerApiException;
import org.apache.cloudstack.api.response.BackupPolicyResponse;
import org.apache.cloudstack.api.response.ZoneResponse;
import org.apache.cloudstack.backup.BackupManager;
import org.apache.cloudstack.backup.BackupPolicyVMMap;
import javax.inject.Inject;
import java.util.List;
@APICommand(name = ListBackupPoliciesVMsMappingsCmd.APINAME,
description = "Lists VMs mapped to a backup policy",
responseObject = BackupPolicyResponse.class, since = "4.12.0",
authorized = {RoleType.Admin, RoleType.ResourceAdmin, RoleType.DomainAdmin, RoleType.User})
public class ListBackupPoliciesVMsMappingsCmd extends BaseBackupListCmd {
public static final String APINAME = "listBackupPoliciesVirtualMachineMappings";
@Inject
BackupManager backupManager;
/////////////////////////////////////////////////////
//////////////// API parameters /////////////////////
/////////////////////////////////////////////////////
@Parameter(name = ApiConstants.BACKUP_POLICY_ID, type = BaseCmd.CommandType.UUID, entityType = BackupPolicyResponse.class,
description = "The backup policy ID")
private Long policyId;
@Parameter(name = ApiConstants.ZONE_ID, type = BaseCmd.CommandType.UUID, entityType = ZoneResponse.class,
description = "The zone ID")
private Long zoneId;
/////////////////////////////////////////////////////
/////////////// API Implementation///////////////////
/////////////////////////////////////////////////////
@Override
public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException {
try {
List<BackupPolicyVMMap> mappings = backupManager.listBackupPolicyVMMappings(zoneId, policyId);
setupResponseBackupPolicyVMMappings(mappings);
} catch (CloudRuntimeException e) {
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, e.getMessage());
}
}
private void validateParameters() {
if (zoneId == null && policyId == null) {
throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Please provide a zone id or a policy id");
}
}
@Override
public String getCommandName() {
return APINAME.toLowerCase() + RESPONSE_SUFFIX;
}
}

View File

@ -38,11 +38,11 @@ import org.apache.cloudstack.context.CallContext;
import javax.inject.Inject;
@APICommand(name = RemoveVMFromBackupPolicy.APINAME,
@APICommand(name = RemoveVMFromBackupPolicyCmd.APINAME,
description = "Removes a VM from an existing backup policy",
responseObject = SuccessResponse.class, since = "4.12.0",
authorized = {RoleType.Admin, RoleType.ResourceAdmin, RoleType.DomainAdmin, RoleType.User})
public class RemoveVMFromBackupPolicy extends BaseCmd {
public class RemoveVMFromBackupPolicyCmd extends BaseCmd {
public static final String APINAME = "removeVirtualMachineFromBackupPolicy";

View File

@ -0,0 +1,65 @@
// 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.api.response;
import com.cloud.serializer.Param;
import com.google.gson.annotations.SerializedName;
import org.apache.cloudstack.api.ApiConstants;
import org.apache.cloudstack.api.BaseResponse;
import org.apache.cloudstack.api.EntityReference;
import org.apache.cloudstack.backup.BackupPolicyVMMap;
@EntityReference(value = BackupPolicyVMMap.class)
public class BackupPolicyVMMapResponse extends BaseResponse {
@SerializedName(ApiConstants.ZONE_ID)
@Param(description = "zone id")
private String zoneId;
@SerializedName(ApiConstants.BACKUP_POLICY_ID)
@Param(description = "backup policy id")
private String backupPolicyId;
@SerializedName(ApiConstants.VIRTUAL_MACHINE_ID)
@Param(description = "virtual machine id")
private String vmId;
public String getZoneId() {
return zoneId;
}
public void setZoneId(String zoneId) {
this.zoneId = zoneId;
}
public String getBackupPolicyId() {
return backupPolicyId;
}
public void setBackupPolicyId(String backupPolicyId) {
this.backupPolicyId = backupPolicyId;
}
public String getVmId() {
return vmId;
}
public void setVmId(String vmId) {
this.vmId = vmId;
}
}

View File

@ -86,4 +86,9 @@ public interface BackupManager extends BackupService, Configurable, PluggableSer
* Remove a VM from a backup policy
*/
boolean removeVMFromBackupPolicy(Long zoneId, Long policyId, Long vmId);
/**
* Return mappings between backup policy and VMs
*/
List<BackupPolicyVMMap> listBackupPolicyVMMappings(Long zoneId, Long policyId);
}

View File

@ -0,0 +1,10 @@
package org.apache.cloudstack.backup;
import org.apache.cloudstack.api.InternalIdentity;
public interface BackupPolicyVMMap extends InternalIdentity {
long getPolicyId();
long getVmId();
long getZoneId();
}

View File

@ -17,6 +17,7 @@
package org.apache.cloudstack.backup;
import com.cloud.agent.api.to.VolumeTO;
import com.cloud.vm.VirtualMachine;
import java.util.List;
@ -38,12 +39,12 @@ public interface BackupProvider {
* Assign VM to backup policy
* @return true if VM is successfully assigned, false if not
*/
boolean addVMToBackupPolicy(String vmUuid, String policyUuid);
boolean addVMToBackupPolicy(Long zoneId, String policyId, VirtualMachine vm);
/**
* Remove a VM form a backup policy
*/
boolean removeVMFromBackupPolicy(String vmUuid, String policyUuid);
boolean removeVMFromBackupPolicy(Long zoneId, String policyId, VirtualMachine vm);
/**
* Returns the list of existing backup policies on the provider

View File

@ -19,8 +19,6 @@
package org.apache.cloudstack.backup;
import org.apache.cloudstack.api.InternalIdentity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
@ -30,7 +28,7 @@ import javax.persistence.Table;
@Entity
@Table(name = "backup_policy_vm_map")
public class BackupPolicyVMMapVO implements InternalIdentity {
public class BackupPolicyVMMapVO implements BackupPolicyVMMap {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@ -43,12 +41,16 @@ public class BackupPolicyVMMapVO implements InternalIdentity {
@Column(name = "vm_id")
private long vmId;
@Column(name = "zone_id")
private long zoneId;
public BackupPolicyVMMapVO() {
}
public BackupPolicyVMMapVO(long policyId, long vmId) {
public BackupPolicyVMMapVO(long zoneId, long policyId, long vmId) {
this.policyId = policyId;
this.vmId = vmId;
this.zoneId = zoneId;
}
public long getId() {
@ -74,4 +76,12 @@ public class BackupPolicyVMMapVO implements InternalIdentity {
public void setVmId(long vmId) {
this.vmId = vmId;
}
public long getZoneId() {
return zoneId;
}
public void setZoneId(long zoneId) {
this.zoneId = zoneId;
}
}

View File

@ -20,6 +20,8 @@
package org.apache.cloudstack.backup.dao;
import com.cloud.utils.db.GenericDao;
import org.apache.cloudstack.api.response.BackupPolicyVMMapResponse;
import org.apache.cloudstack.backup.BackupPolicyVMMap;
import org.apache.cloudstack.backup.BackupPolicyVMMapVO;
import java.util.List;
@ -28,5 +30,7 @@ public interface BackupPolicyVMMapDao extends GenericDao<BackupPolicyVMMapVO, Lo
BackupPolicyVMMapVO findByVMId(long vmId);
List<BackupPolicyVMMapVO> listByPolicyId(long policyId);
BackupPolicyVMMapVO findByPolicyIdAndVMId(long policyId, long vmId);
List<BackupPolicyVMMapVO> listByPolicyIdAndVMId(long policyId, long vmId);
List<BackupPolicyVMMapVO> listByZoneId(long zoneId);
BackupPolicyVMMapResponse newBackupPolicyVMMappingResponse(BackupPolicyVMMap map);
}

View File

@ -19,20 +19,37 @@
package org.apache.cloudstack.backup.dao;
import com.cloud.dc.DataCenterVO;
import com.cloud.dc.dao.DataCenterDao;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.vm.VMInstanceVO;
import com.cloud.vm.dao.VMInstanceDao;
import org.apache.cloudstack.api.response.BackupPolicyVMMapResponse;
import org.apache.cloudstack.backup.BackupPolicyVMMap;
import org.apache.cloudstack.backup.BackupPolicyVMMapVO;
import org.apache.cloudstack.backup.BackupPolicyVO;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import java.util.List;
@Component
public class BackupPolicyVMMapDaoImpl extends GenericDaoBase<BackupPolicyVMMapVO, Long> implements BackupPolicyVMMapDao {
@Inject
private VMInstanceDao vmInstanceDao;
@Inject
private BackupPolicyDao backupPolicyDao;
@Inject
private DataCenterDao dataCenterDao;
private SearchBuilder<BackupPolicyVMMapVO> mapSearch;
public BackupPolicyVMMapDaoImpl() {
@ -43,6 +60,7 @@ public class BackupPolicyVMMapDaoImpl extends GenericDaoBase<BackupPolicyVMMapVO
mapSearch = createSearchBuilder();
mapSearch.and("vm_id", mapSearch.entity().getVmId(), SearchCriteria.Op.EQ);
mapSearch.and("policy_id", mapSearch.entity().getPolicyId(), SearchCriteria.Op.EQ);
mapSearch.and("zone_id", mapSearch.entity().getZoneId(), SearchCriteria.Op.EQ);
mapSearch.done();
}
@ -68,10 +86,38 @@ public class BackupPolicyVMMapDaoImpl extends GenericDaoBase<BackupPolicyVMMapVO
}
@Override
public BackupPolicyVMMapVO findByPolicyIdAndVMId(long policyId, long vmId) {
public List<BackupPolicyVMMapVO> listByPolicyIdAndVMId(long policyId, long vmId) {
SearchCriteria<BackupPolicyVMMapVO> sc = mapSearch.create();
sc.setParameters("policy_id", policyId);
sc.setParameters("vm_id", vmId);
return findOneBy(sc);
return listBy(sc);
}
@Override
public List<BackupPolicyVMMapVO> listByZoneId(long zoneId) {
SearchCriteria<BackupPolicyVMMapVO> sc = mapSearch.create();
sc.setParameters("zone_id", zoneId);
return listBy(sc);
}
@Override
public BackupPolicyVMMapResponse newBackupPolicyVMMappingResponse(BackupPolicyVMMap map) {
BackupPolicyVO policy = backupPolicyDao.findById(map.getPolicyId());
if (policy == null) {
throw new CloudRuntimeException("Policy " + map.getPolicyId() + " does not exist");
}
VMInstanceVO vm = vmInstanceDao.findById(map.getVmId());
if (vm == null) {
throw new CloudRuntimeException("VM " + map.getVmId() + " does not exist");
}
DataCenterVO zone = dataCenterDao.findById(map.getZoneId());
if (zone == null) {
throw new CloudRuntimeException("Zone " + map.getZoneId() + " does not exist");
}
BackupPolicyVMMapResponse response = new BackupPolicyVMMapResponse();
response.setBackupPolicyId(policy.getUuid());
response.setVmId(vm.getUuid());
response.setZoneId(zone.getUuid());
return response;
}
}

View File

@ -44,16 +44,19 @@ CREATE TABLE IF NOT EXISTS `cloud`.`backup_policy` (
`external_id` varchar(40) NOT NULL COMMENT 'backup policy ID on provider side',
`zone_id` bigint(20) unsigned NOT NULL COMMENT 'zone id',
PRIMARY KEY (`id`),
UNIQUE KEY `uuid` (`uuid`)
UNIQUE KEY `uuid` (`uuid`),
CONSTRAINT `fk_backup_policy__zone_id` FOREIGN KEY (`zone_id`) REFERENCES `data_center` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `cloud`.`backup_policy_vm_map` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`zone_id` bigint(20) unsigned NOT NULL,
`policy_id` bigint(20) unsigned NOT NULL,
`vm_id` bigint(20) unsigned NOT NULL,
PRIMARY KEY (`id`),
CONSTRAINT `fk_backup_policy_vm_map__policy_id` FOREIGN KEY (`policy_id`) REFERENCES `backup_policy` (`id`) ON DELETE CASCADE,
CONSTRAINT `fk_backup_policy_vm_map__vm_id` FOREIGN KEY (`vm_id`) REFERENCES `vm_instance` (`id`) ON DELETE CASCADE
CONSTRAINT `fk_backup_policy_vm_map__vm_id` FOREIGN KEY (`vm_id`) REFERENCES `vm_instance` (`id`) ON DELETE CASCADE,
CONSTRAINT `fk_backup_policy_vm_map__zone_id` FOREIGN KEY (`zone_id`) REFERENCES `data_center` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `cloud`.`backup` (

View File

@ -20,6 +20,7 @@ import com.cloud.agent.api.to.VolumeTO;
import com.cloud.storage.Storage;
import com.cloud.storage.Volume;
import com.cloud.utils.component.AdapterBase;
import com.cloud.vm.VirtualMachine;
import org.apache.log4j.Logger;
import java.util.Arrays;
@ -40,14 +41,14 @@ public class DummyBackupProvider extends AdapterBase implements BackupProvider {
}
@Override
public boolean addVMToBackupPolicy(String vmUuid, String policyUuid) {
s_logger.debug("Assigning VM " + vmUuid + " to backup policy " + policyUuid);
public boolean addVMToBackupPolicy(Long zoneId, String policyId, VirtualMachine vm) {
s_logger.debug("Assigning VM " + vm.getInstanceName() + " to backup policy " + policyId);
return true;
}
@Override
public boolean removeVMFromBackupPolicy(String vmUuid, String policyUuid) {
s_logger.debug("Removing VM " + vmUuid + " to backup policy " + policyUuid);
public boolean removeVMFromBackupPolicy(Long zoneId, String policyId, VirtualMachine vm) {
s_logger.debug("Removing VM " + vm.getInstanceName() + " from backup policy " + policyId);
return true;
}

View File

@ -20,11 +20,10 @@ package org.apache.cloudstack.backup;
import java.net.URISyntaxException;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.cloud.agent.api.to.VolumeTO;
import com.cloud.vm.VirtualMachine;
import org.apache.cloudstack.backup.veeam.VeeamClient;
import org.apache.cloudstack.framework.config.ConfigKey;
import org.apache.cloudstack.framework.config.Configurable;
@ -36,8 +35,6 @@ import com.cloud.utils.exception.CloudRuntimeException;
public class VeeamBackupProvider extends AdapterBase implements BackupProvider, Configurable {
private static final Logger LOG = Logger.getLogger(VeeamBackupProvider.class);
private Map<Long, VeeamClient> zoneClientMap = new HashMap<Long, VeeamClient>();
private ConfigKey<String> VeeamUrl = new ConfigKey<>("Advanced", String.class,
"backup.plugin.veeam.url",
"http://localhost:9399/api/",
@ -62,14 +59,8 @@ public class VeeamBackupProvider extends AdapterBase implements BackupProvider,
private VeeamClient getClient(final Long zoneId) {
try {
if (zoneClientMap.containsKey(zoneId)) {
return zoneClientMap.get(zoneId);
} else {
VeeamClient client = new VeeamClient(VeeamUrl.valueIn(zoneId), VeeamUsername.valueIn(zoneId), VeeamPassword.valueIn(zoneId),
VeeamValidateSSLSecurity.valueIn(zoneId), VeeamApiRequestTimeout.valueIn(zoneId));
zoneClientMap.put(zoneId, client);
return client;
}
return new VeeamClient(VeeamUrl.valueIn(zoneId), VeeamUsername.valueIn(zoneId), VeeamPassword.valueIn(zoneId),
VeeamValidateSSLSecurity.valueIn(zoneId), VeeamApiRequestTimeout.valueIn(zoneId));
} catch (URISyntaxException e) {
throw new CloudRuntimeException("Failed to parse Veeam API URL: " + e.getMessage());
} catch (NoSuchAlgorithmException | KeyManagementException e) {
@ -79,12 +70,15 @@ public class VeeamBackupProvider extends AdapterBase implements BackupProvider,
}
@Override
public boolean addVMToBackupPolicy(String vmUuid, String policyUuid) {
return false;
public boolean addVMToBackupPolicy(Long zoneId, String policyId, VirtualMachine vm) {
String instanceName = vm.getInstanceName();
//TODO: Get vcenter ip
return getClient(zoneId).assignBackupPolicyToVM(policyId, instanceName, "");
}
@Override
public boolean removeVMFromBackupPolicy(String vmUuid, String policyUuid) {
public boolean removeVMFromBackupPolicy(Long zoneId, String policyId, VirtualMachine vm) {
//TODO: Remove VM from backup policy on the client
return false;
}
@ -95,7 +89,7 @@ public class VeeamBackupProvider extends AdapterBase implements BackupProvider,
@Override
public boolean isBackupPolicy(String uuid) {
return false;
return true;
}
@Override

View File

@ -40,6 +40,7 @@ import org.apache.cloudstack.api.ResponseObject.ResponseView;
import org.apache.cloudstack.api.response.AccountResponse;
import org.apache.cloudstack.api.response.AsyncJobResponse;
import org.apache.cloudstack.api.response.BackupPolicyResponse;
import org.apache.cloudstack.api.response.BackupPolicyVMMapResponse;
import org.apache.cloudstack.api.response.BackupResponse;
import org.apache.cloudstack.api.response.DiskOfferingResponse;
import org.apache.cloudstack.api.response.DomainResponse;
@ -64,8 +65,10 @@ import org.apache.cloudstack.api.response.UserVmResponse;
import org.apache.cloudstack.api.response.VolumeResponse;
import org.apache.cloudstack.api.response.ZoneResponse;
import org.apache.cloudstack.backup.BackupPolicy;
import org.apache.cloudstack.backup.BackupPolicyVMMap;
import org.apache.cloudstack.backup.dao.BackupDao;
import org.apache.cloudstack.backup.dao.BackupPolicyDao;
import org.apache.cloudstack.backup.dao.BackupPolicyVMMapDao;
import org.apache.cloudstack.context.CallContext;
import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
import org.apache.cloudstack.engine.orchestration.service.VolumeOrchestrationService;
@ -442,6 +445,7 @@ public class ApiDBUtils {
static VGPUTypesDao s_vgpuTypesDao;
static BackupDao s_backupDao;
static BackupPolicyDao s_backupPolicyDao;
static BackupPolicyVMMapDao s_backupPolicyVMMapDao;
@Inject
private ManagementServer ms;
@ -678,6 +682,8 @@ public class ApiDBUtils {
private BackupDao backupDao;
@Inject
private BackupPolicyDao backupPolicyDao;
@Inject
private BackupPolicyVMMapDao backupPolicyVMMapDao;
@PostConstruct
void init() {
@ -799,6 +805,7 @@ public class ApiDBUtils {
s_vgpuTypesDao = vgpuTypesDao;
s_backupDao = backupDao;
s_backupPolicyDao = backupPolicyDao;
s_backupPolicyVMMapDao = backupPolicyVMMapDao;
}
// ///////////////////////////////////////////////////////////
@ -2022,4 +2029,8 @@ public class ApiDBUtils {
public static BackupPolicyResponse newBackupPolicyResponse(BackupPolicy policy) {
return s_backupPolicyDao.newBackupPolicyResponse(policy);
}
public static BackupPolicyVMMapResponse newBackupPolicyVMMappingResponse(BackupPolicyVMMap map) {
return s_backupPolicyVMMapDao.newBackupPolicyVMMappingResponse(map);
}
}

View File

@ -200,6 +200,7 @@ import org.apache.cloudstack.api.response.AutoScalePolicyResponse;
import org.apache.cloudstack.api.response.AutoScaleVmGroupResponse;
import org.apache.cloudstack.api.response.AutoScaleVmProfileResponse;
import org.apache.cloudstack.api.response.BackupPolicyResponse;
import org.apache.cloudstack.api.response.BackupPolicyVMMapResponse;
import org.apache.cloudstack.api.response.BackupResponse;
import org.apache.cloudstack.api.response.CapabilityResponse;
import org.apache.cloudstack.api.response.CapacityResponse;
@ -292,6 +293,7 @@ import org.apache.cloudstack.api.response.VpcResponse;
import org.apache.cloudstack.api.response.VpnUsersResponse;
import org.apache.cloudstack.api.response.ZoneResponse;
import org.apache.cloudstack.backup.BackupPolicy;
import org.apache.cloudstack.backup.BackupPolicyVMMap;
import org.apache.cloudstack.config.Configuration;
import org.apache.cloudstack.context.CallContext;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
@ -3978,4 +3980,9 @@ public class ApiResponseHelper implements ResponseGenerator {
public BackupPolicyResponse createBackupPolicyResponse(BackupPolicy policy) {
return ApiDBUtils.newBackupPolicyResponse(policy);
}
@Override
public BackupPolicyVMMapResponse createBackupPolicyVMMappingResponse(BackupPolicyVMMap map) {
return ApiDBUtils.newBackupPolicyVMMappingResponse(map);
}
}

View File

@ -39,8 +39,9 @@ import org.apache.cloudstack.api.command.user.backup.AddVMToBackupPolicyCmd;
import org.apache.cloudstack.api.command.admin.backup.ImportBackupPolicyCmd;
import org.apache.cloudstack.api.command.user.backup.ListBackupPoliciesCmd;
import org.apache.cloudstack.api.command.admin.backup.ListBackupProvidersCmd;
import org.apache.cloudstack.api.command.user.backup.ListBackupPoliciesVMsMappingsCmd;
import org.apache.cloudstack.api.command.user.backup.ListBackupsCmd;
import org.apache.cloudstack.api.command.user.backup.RemoveVMFromBackupPolicy;
import org.apache.cloudstack.api.command.user.backup.RemoveVMFromBackupPolicyCmd;
import org.apache.cloudstack.api.command.user.backup.RestoreBackupCmd;
import org.apache.cloudstack.api.command.user.backup.RestoreBackupVolumeCmd;
import org.apache.cloudstack.backup.dao.BackupDao;
@ -109,15 +110,14 @@ public class BackupManagerImpl extends ManagerBase implements BackupManager {
if (policy == null) {
throw new CloudRuntimeException("Policy " + policy + " does not exist");
}
String vmUuid = vmInstanceVO.getUuid();
BackupProvider backupProvider = getBackupProvider(zoneId);
boolean result = backupProvider.addVMToBackupPolicy(vmUuid, policy.getExternalId());
boolean result = backupProvider.addVMToBackupPolicy(zoneId, policy.getExternalId(), vmInstanceVO);
if (result) {
BackupPolicyVMMapVO map = backupPolicyVMMapDao.findByVMId(virtualMachineId);
if (map != null) {
backupPolicyVMMapDao.expunge(map.getId());
}
map = new BackupPolicyVMMapVO(policy.getId(), virtualMachineId);
map = new BackupPolicyVMMapVO(zoneId, policy.getId(), virtualMachineId);
backupPolicyVMMapDao.persist(map);
LOG.debug("Successfully assigned VM " + virtualMachineId + " to backup policy " + policy.getName());
} else {
@ -137,10 +137,13 @@ public class BackupManagerImpl extends ManagerBase implements BackupManager {
throw new CloudRuntimeException("VM " + vmId + " does not exist");
}
BackupProvider backupProvider = getBackupProvider(zoneId);
boolean result = backupProvider.removeVMFromBackupPolicy(vm.getUuid(), policy.getExternalId());
boolean result = backupProvider.removeVMFromBackupPolicy(zoneId, policy.getExternalId(), vm);
if (result) {
BackupPolicyVMMapVO map = backupPolicyVMMapDao.findByPolicyIdAndVMId(policyId, vmId);
backupPolicyVMMapDao.expunge(map.getId());
List<BackupPolicyVMMapVO> map = backupPolicyVMMapDao.listByPolicyIdAndVMId(policyId, vmId);
if (map.size() > 1) {
throw new CloudRuntimeException("More than one mapping between VM " + vmId + " and policy " + policyId);
}
backupPolicyVMMapDao.expunge(map.get(0).getId());
LOG.debug("Successfully removed VM " + vmId + " from backup policy " + policy.getName());
} else {
LOG.debug("Could not remove VM " + vmId + " from backup policy " + policyId);
@ -148,6 +151,13 @@ public class BackupManagerImpl extends ManagerBase implements BackupManager {
return result;
}
@Override
public List<BackupPolicyVMMap> listBackupPolicyVMMappings(Long zoneId, Long policyId) {
return policyId == null ?
new ArrayList<>(backupPolicyVMMapDao.listByZoneId(zoneId)) :
new ArrayList<>(backupPolicyVMMapDao.listByPolicyId(policyId));
}
@Override
public List<Backup> listBackups(Long vmId) {
return backupDao.listByVmId(vmId);
@ -278,11 +288,12 @@ public class BackupManagerImpl extends ManagerBase implements BackupManager {
cmdList.add(ListBackupPoliciesCmd.class);
cmdList.add(ImportBackupPolicyCmd.class);
cmdList.add(AddVMToBackupPolicyCmd.class);
cmdList.add(RemoveVMFromBackupPolicy.class);
cmdList.add(RemoveVMFromBackupPolicyCmd.class);
cmdList.add(DeleteBackupPolicyCmd.class);
cmdList.add(ListBackupsCmd.class);
cmdList.add(RestoreBackupCmd.class);
cmdList.add(RestoreBackupVolumeCmd.class);
cmdList.add(ListBackupPoliciesVMsMappingsCmd.class);
return cmdList;
}