Skip to content

Commit d3439ad

Browse files
committed
Save networkIds and diskOfferingIds in backup_details. Create required data volumes before restore.
1 parent 04a2deb commit d3439ad

File tree

15 files changed

+257
-48
lines changed

15 files changed

+257
-48
lines changed

api/src/main/java/com/cloud/offering/DiskOfferingInfo.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,13 @@ public DiskOfferingInfo(DiskOffering diskOffering) {
3131
_diskOffering = diskOffering;
3232
}
3333

34+
public DiskOfferingInfo(DiskOffering diskOffering, Long size, Long minIops, Long maxIops) {
35+
_diskOffering = diskOffering;
36+
_size = size;
37+
_minIops = minIops;
38+
_maxIops = maxIops;
39+
}
40+
3441
public void setDiskOffering(DiskOffering diskOffering) {
3542
_diskOffering = diskOffering;
3643
}

api/src/main/java/com/cloud/storage/VolumeApiService.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import java.util.List;
2323
import java.util.Map;
2424

25+
import com.cloud.offering.DiskOfferingInfo;
2526
import com.cloud.utils.Pair;
2627
import org.apache.cloudstack.api.command.user.volume.AssignVolumeCmd;
2728
import org.apache.cloudstack.api.command.user.volume.AttachVolumeCmd;
@@ -106,6 +107,8 @@ public interface VolumeApiService {
106107

107108
Volume attachVolumeToVM(AttachVolumeCmd command);
108109

110+
boolean createAndAttachVolumes(Long vmId, List<DiskOfferingInfo> diskOfferings, Long totalSize, Long zoneId, Long ownerId) throws ResourceAllocationException;
111+
109112
Volume attachVolumeToVM(Long vmId, Long volumeId, Long deviceId, Boolean allowAttachForSharedFS);
110113

111114
Volume detachVolumeViaDestroyVM(long vmId, long volumeId);

api/src/main/java/org/apache/cloudstack/api/ApiConstants.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,9 @@ public class ApiConstants {
156156
public static final String DISK_IO_WRITE = "diskiowrite";
157157
public static final String DISK_IO_PSTOTAL = "diskiopstotal";
158158
public static final String DISK_SIZE = "disksize";
159+
public static final String DISK_SIZES = "disksizes";
159160
public static final String DISK_SIZE_STRICTNESS = "disksizestrictness";
161+
public static final String DISK_OFFERING_IDS = "diskofferingids";
160162
public static final String DISK_OFFERING_STRICTNESS = "diskofferingstrictness";
161163
public static final String DOWNLOAD_DETAILS = "downloaddetails";
162164
public static final String UTILIZATION = "utilization";

api/src/main/java/org/apache/cloudstack/api/command/user/vm/CreateVMFromBackupCmd.java

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
// under the License.
1717
package org.apache.cloudstack.api.command.user.vm;
1818

19+
import java.util.List;
20+
1921
import javax.inject.Inject;
2022

2123
import org.apache.cloudstack.acl.RoleType;
@@ -27,6 +29,7 @@
2729
import org.apache.cloudstack.api.ServerApiException;
2830
import org.apache.cloudstack.api.command.user.UserCmd;
2931
import org.apache.cloudstack.api.response.BackupResponse;
32+
import org.apache.cloudstack.api.response.DiskOfferingResponse;
3033
import org.apache.cloudstack.api.response.UserVmResponse;
3134
import org.apache.cloudstack.backup.BackupManager;
3235

@@ -54,10 +57,51 @@ public class CreateVMFromBackupCmd extends DeployVMCmd implements UserCmd {
5457
description = "backup ID to create the VM from")
5558
private Long backupId;
5659

60+
@Parameter(name = ApiConstants.DISK_OFFERING_IDS,
61+
type = CommandType.LIST,
62+
collectionType = CommandType.UUID,
63+
entityType = DiskOfferingResponse.class,
64+
description = "list of disk offering ids to be used by the data volumes of the vm.")
65+
private List<Long> diskOfferingIds;
66+
67+
@Parameter(name = ApiConstants.DISK_SIZES,
68+
type = CommandType.LIST,
69+
collectionType = CommandType.LONG,
70+
description = "list of volume sizes to be used by the data volumes of the vm for custom disk offering.")
71+
private List<Long> diskSizes;
72+
73+
@Parameter(name = ApiConstants.MIN_IOPS,
74+
type = CommandType.LIST,
75+
collectionType = CommandType.LONG,
76+
description = "list of minIops to be used by the data volumes of the vm for custom disk offering.")
77+
private List<Long> minIops;
78+
79+
@Parameter(name = ApiConstants.MAX_IOPS,
80+
type = CommandType.LIST,
81+
collectionType = CommandType.LONG,
82+
description = "list of maxIops to be used by the data volumes of the vm for custom disk offering.")
83+
private List<Long> maxIops;
84+
5785
public Long getBackupId() {
5886
return backupId;
5987
}
6088

89+
public List<Long> getDiskOfferingIds() {
90+
return diskOfferingIds;
91+
}
92+
93+
public List<Long> getDiskSizes() {
94+
return diskSizes;
95+
}
96+
97+
public List<Long> getMinIops() {
98+
return minIops;
99+
}
100+
101+
public List<Long> getMaxIops() {
102+
return maxIops;
103+
}
104+
61105
@Override
62106
public void create() {
63107
UserVm vm;
@@ -78,6 +122,7 @@ public void execute () {
78122
try {
79123
vm = _userVmService.restoreVMFromBackup(this);
80124
} catch (Exception e) {
125+
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to create vm due to exception: " + e.getMessage());
81126
}
82127
if (vm != null) {
83128
UserVmResponse response = _responseGenerator.createUserVmResponse(getResponseView(), "virtualmachine", vm).get(0);

api/src/main/java/org/apache/cloudstack/backup/BackupManager.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
package org.apache.cloudstack.backup;
1919

2020
import java.util.List;
21+
import java.util.Map;
2122

2223
import org.apache.cloudstack.api.command.admin.backup.ImportBackupOfferingCmd;
2324
import org.apache.cloudstack.api.command.admin.backup.UpdateBackupOfferingCmd;
@@ -27,10 +28,12 @@
2728
import org.apache.cloudstack.framework.config.ConfigKey;
2829
import org.apache.cloudstack.framework.config.Configurable;
2930

31+
import com.cloud.exception.ResourceAllocationException;
3032
import com.cloud.exception.ResourceUnavailableException;
3133
import com.cloud.utils.Pair;
3234
import com.cloud.utils.component.Manager;
3335
import com.cloud.utils.component.PluggableService;
36+
import com.cloud.vm.VirtualMachine;
3437

3538
/**
3639
* Backup and Recover Manager Interface
@@ -155,4 +158,10 @@ public interface BackupManager extends BackupService, Configurable, PluggableSer
155158
void validateBackupForZone(Long zoneId);
156159

157160
BackupOffering updateBackupOffering(UpdateBackupOfferingCmd updateBackupOfferingCmd);
161+
162+
boolean createDataVolumesForRestore(Long backupId, Long vmId, List<Long> diskOfferingIds, List<Long> diskSizes, List<Long> minIops, List<Long> maxIops) throws ResourceAllocationException;
163+
164+
Map<String, String> getBackupVmDetails(VirtualMachine vm);
165+
166+
Map<String, String> getBackupDiskOfferingDetails(Long vmId);
158167
}

engine/schema/src/main/java/org/apache/cloudstack/backup/BackupVO.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,10 +239,17 @@ public void setDetail(String name, String value) {
239239
this.details.put(name, value);
240240
}
241241

242+
public String getDetail(String name) {
243+
return this.details.get(name);
244+
}
245+
242246
public void setDetails(Map<String, String> details) {
243247
this.details = details;
244248
}
245249

250+
public void addDetails(Map<String, String> details) {
251+
this.details.putAll(details);
252+
}
246253

247254
public Date getRemoved() {
248255
return removed;

engine/schema/src/main/java/org/apache/cloudstack/backup/dao/BackupDaoImpl.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,17 @@ public BackupVO persist(BackupVO backup) {
152152
});
153153
}
154154

155+
@Override
156+
public boolean update(Long id, BackupVO backup) {
157+
return Transaction.execute((TransactionCallback<Boolean>) status -> {
158+
boolean result = super.update(id, backup);
159+
if (result == true) {
160+
saveDetails(backup);
161+
}
162+
return result;
163+
});
164+
}
165+
155166
@Override
156167
public List<Backup> syncBackups(Long zoneId, Long vmId, List<Backup> externalBackups) {
157168
for (Backup backup : externalBackups) {
@@ -226,6 +237,11 @@ public BackupResponse newBackupResponse(Backup backup) {
226237
vmDetails.put(ApiConstants.HYPERVISOR, details.get(ApiConstants.HYPERVISOR));
227238
vmDetails.put(ApiConstants.TEMPLATE_ID, details.get(ApiConstants.TEMPLATE_ID));
228239
vmDetails.put(ApiConstants.SERVICE_OFFERING_ID, details.get(ApiConstants.SERVICE_OFFERING_ID));
240+
vmDetails.put(ApiConstants.NETWORK_IDS, details.get(ApiConstants.NETWORK_IDS));
241+
vmDetails.put(ApiConstants.DISK_OFFERING_IDS, details.get(ApiConstants.DISK_OFFERING_IDS));
242+
vmDetails.put(ApiConstants.DISK_SIZES, details.get(ApiConstants.DISK_SIZES));
243+
vmDetails.put(ApiConstants.MIN_IOPS, details.get(ApiConstants.MIN_IOPS));
244+
vmDetails.put(ApiConstants.MAX_IOPS, details.get(ApiConstants.MAX_IOPS));
229245
response.setVmDetails(vmDetails);
230246
}
231247

plugins/backup/dummy/src/main/java/org/apache/cloudstack/backup/DummyBackupProvider.java

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,12 @@
2424

2525
import javax.inject.Inject;
2626

27-
import com.cloud.offering.ServiceOffering;
2827
import com.cloud.storage.dao.VolumeDao;
2928

30-
import org.apache.cloudstack.api.ApiConstants;
3129
import org.apache.cloudstack.backup.dao.BackupDao;
3230

33-
import com.cloud.template.VirtualMachineTemplate;
3431
import com.cloud.utils.Pair;
3532
import com.cloud.utils.component.AdapterBase;
36-
import com.cloud.utils.db.EntityManager;
3733
import com.cloud.utils.exception.CloudRuntimeException;
3834
import com.cloud.vm.VMInstanceVO;
3935
import com.cloud.vm.VirtualMachine;
@@ -46,7 +42,7 @@ public class DummyBackupProvider extends AdapterBase implements BackupProvider {
4642
@Inject
4743
private VolumeDao volumeDao;
4844
@Inject
49-
private EntityManager entityManager;
45+
private BackupManagerImpl backupManager;
5046

5147
@Override
5248
public String getName() {
@@ -134,14 +130,10 @@ public boolean takeBackup(VirtualMachine vm) {
134130
backup.setDomainId(vm.getDomainId());
135131
backup.setZoneId(vm.getDataCenterId());
136132
backup.setBackedUpVolumes(BackupManagerImpl.createVolumeInfoFromVolumes(volumeDao.findByInstance(vm.getId())));
137-
138-
HashMap<String, String> details = new HashMap<>();
139-
details.put(ApiConstants.HYPERVISOR, vm.getHypervisorType().toString());
140-
ServiceOffering serviceOffering = entityManager.findById(ServiceOffering.class, vm.getServiceOfferingId());
141-
details.put(ApiConstants.SERVICE_OFFERING_ID, serviceOffering.getUuid());
142-
VirtualMachineTemplate template = entityManager.findById(VirtualMachineTemplate.class, vm.getTemplateId());
143-
details.put(ApiConstants.TEMPLATE_ID, template.getUuid());
133+
Map<String, String> details = backupManager.getBackupVmDetails(vm);
144134
backup.setDetails(details);
135+
Map<String, String> diskOfferingDetails = backupManager.getBackupDiskOfferingDetails(vm.getId());
136+
backup.addDetails(diskOfferingDetails);
145137

146138
return backupDao.persist(backup) != null;
147139
}

plugins/backup/nas/src/main/java/org/apache/cloudstack/backup/NASBackupProvider.java

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,22 +25,18 @@
2525
import com.cloud.host.Status;
2626
import com.cloud.host.dao.HostDao;
2727
import com.cloud.hypervisor.Hypervisor;
28-
import com.cloud.offering.ServiceOffering;
2928
import com.cloud.storage.ScopeType;
3029
import com.cloud.storage.StoragePoolHostVO;
3130
import com.cloud.storage.Volume;
3231
import com.cloud.storage.VolumeVO;
3332
import com.cloud.storage.dao.StoragePoolHostDao;
3433
import com.cloud.storage.dao.VolumeDao;
35-
import com.cloud.template.VirtualMachineTemplate;
3634
import com.cloud.utils.Pair;
3735
import com.cloud.utils.component.AdapterBase;
38-
import com.cloud.utils.db.EntityManager;
3936
import com.cloud.utils.exception.CloudRuntimeException;
4037
import com.cloud.vm.VirtualMachine;
4138
import com.cloud.vm.dao.VMInstanceDao;
4239

43-
import org.apache.cloudstack.api.ApiConstants;
4440
import org.apache.cloudstack.backup.dao.BackupDao;
4541
import org.apache.cloudstack.backup.dao.BackupOfferingDao;
4642
import org.apache.cloudstack.backup.dao.BackupRepositoryDao;
@@ -99,7 +95,7 @@ public class NASBackupProvider extends AdapterBase implements BackupProvider, Co
9995
private AgentManager agentManager;
10096

10197
@Inject
102-
private EntityManager entityManager;
98+
BackupManager backupManager;
10399

104100
protected Host getLastVMHypervisorHost(VirtualMachine vm) {
105101
Long hostId = vm.getLastHostId();
@@ -187,6 +183,8 @@ public boolean takeBackup(final VirtualMachine vm) {
187183
backupVO.setSize(answer.getSize());
188184
backupVO.setStatus(Backup.Status.BackedUp);
189185
backupVO.setBackedUpVolumes(BackupManagerImpl.createVolumeInfoFromVolumes(volumeDao.findByInstance(vm.getId())));
186+
Map<String, String> details = backupManager.getBackupDiskOfferingDetails(vm.getId());
187+
backupVO.addDetails(details);
190188
return backupDao.update(backupVO.getId(), backupVO);
191189
} else {
192190
backupVO.setStatus(Backup.Status.Failed);
@@ -213,13 +211,7 @@ private BackupVO createBackupObject(VirtualMachine vm, String backupPath) {
213211
backup.setAccountId(vm.getAccountId());
214212
backup.setDomainId(vm.getDomainId());
215213
backup.setZoneId(vm.getDataCenterId());
216-
217-
HashMap<String, String> details = new HashMap<>();
218-
details.put(ApiConstants.HYPERVISOR, vm.getHypervisorType().toString());
219-
ServiceOffering serviceOffering = entityManager.findById(ServiceOffering.class, vm.getServiceOfferingId());
220-
details.put(ApiConstants.SERVICE_OFFERING_ID, serviceOffering.getUuid());
221-
VirtualMachineTemplate template = entityManager.findById(VirtualMachineTemplate.class, vm.getTemplateId());
222-
details.put(ApiConstants.TEMPLATE_ID, template.getUuid());
214+
Map<String, String> details = backupManager.getBackupVmDetails(vm);
223215
backup.setDetails(details);
224216

225217
return backupDao.persist(backup);

plugins/backup/networker/src/main/java/org/apache/cloudstack/backup/NetworkerBackupProvider.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,9 @@ public class NetworkerBackupProvider extends AdapterBase implements BackupProvid
125125
@Inject
126126
private EntityManager entityManager;
127127

128+
@Inject
129+
BackupManager backupManager;
130+
128131
private static String getUrlDomain(String url) throws URISyntaxException {
129132
URI uri;
130133
try {
@@ -521,6 +524,8 @@ public boolean takeBackup(VirtualMachine vm) {
521524
BackupVO backup = getClient(vm.getDataCenterId()).registerBackupForVm(vm, backupJobStart, saveTime);
522525
if (backup != null) {
523526
backup.setBackedUpVolumes(BackupManagerImpl.createVolumeInfoFromVolumes(volumeDao.findByInstance(vm.getId())));
527+
Map<String, String> details = backupManager.getBackupDiskOfferingDetails(vm.getId());
528+
backup.addDetails(details);
524529
backupDao.persist(backup);
525530
return true;
526531
} else {

0 commit comments

Comments
 (0)