Skip to content

Commit 2b3b323

Browse files
committed
Secondary storage backup path GUI addition
1 parent 602d9ec commit 2b3b323

14 files changed

Lines changed: 67 additions & 7 deletions

File tree

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ public class ApiConstants {
6161
public static final String BACKUP_AVAILABLE = "backupavailable";
6262
public static final String BACKUP_ID = "backupid";
6363
public static final String BACKUP_LIMIT = "backuplimit";
64+
public static final String BACKUP_PATHS = "backuppaths";
6465
public static final String BACKUP_OFFERING_NAME = "backupofferingname";
6566
public static final String BACKUP_OFFERING_ID = "backupofferingid";
6667
public static final String BACKUP_OFFERING_DETAILS = "backupofferingdetails";

‎api/src/main/java/org/apache/cloudstack/api/command/admin/backup/FinalizeBackupCmd.java‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,9 @@ public void execute() {
7979
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to create Backup");
8080
}
8181

82-
BackupResponse response = backupManager.createBackupResponse(backup, null);
82+
boolean isCallerRootAdmin = _accountService.isRootAdmin(CallContext.current().getCallingAccountId());
83+
84+
BackupResponse response = backupManager.createBackupResponse(backup, null, isCallerRootAdmin);
8385

8486
response.setResponseName(getCommandName());
8587
setResponseObject(response);

‎api/src/main/java/org/apache/cloudstack/api/command/admin/backup/StartBackupCmd.java‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,8 @@ public String getDescription() {
8282
public void execute() {
8383
try {
8484
Backup backup = kvmBackupExportService.startBackup(this);
85-
BackupResponse response = backupManager.createBackupResponse(backup, null);
85+
boolean isCallerRootAdmin = _accountService.isRootAdmin(CallContext.current().getCallingAccountId());
86+
BackupResponse response = backupManager.createBackupResponse(backup, null, isCallerRootAdmin);
8687

8788
response.setResponseName(getCommandName());
8889
setResponseObject(response);

‎api/src/main/java/org/apache/cloudstack/api/command/user/backup/ListBackupsCmd.java‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,12 +148,13 @@ public Boolean getListVmDetails() {
148148
/////////////////////////////////////////////////////
149149

150150
protected void setupResponseBackupList(final List<Backup> backups, final Integer count) {
151+
boolean isCallerRootAdmin = _accountService.isRootAdmin(CallContext.current().getCallingAccountId());
151152
final List<BackupResponse> responses = new ArrayList<>();
152153
for (Backup backup : backups) {
153154
if (backup == null) {
154155
continue;
155156
}
156-
BackupResponse backupResponse = backupManager.createBackupResponse(backup, this.getListVmDetails());
157+
BackupResponse backupResponse = backupManager.createBackupResponse(backup, this.getListVmDetails(), isCallerRootAdmin);
157158
responses.add(backupResponse);
158159
}
159160
final ListResponse<BackupResponse> response = new ListResponse<>();

‎api/src/main/java/org/apache/cloudstack/api/response/BackupResponse.java‎

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,10 @@ public class BackupResponse extends BaseResponse {
9999
@Param(description = "Backup offering name")
100100
private String backupOfferingName;
101101

102+
@SerializedName(ApiConstants.BACKUP_PATHS)
103+
@Param(description = "The backups paths in the secondary storage")
104+
private Map<String, String> backupPaths;
105+
102106
@SerializedName(ApiConstants.ACCOUNT_ID)
103107
@Param(description = "Account id")
104108
private String accountId;
@@ -386,4 +390,13 @@ public void setHostId(String hostId) {
386390
public String getHostId() {
387391
return this.hostId;
388392
}
393+
394+
public Map<String, String> getBackupPaths() {
395+
return backupPaths;
396+
}
397+
398+
public void setBackupPaths(Map<String, String> backupPaths) {
399+
this.backupPaths = backupPaths;
400+
}
401+
389402
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,7 @@ public interface BackupManager extends BackupService, Configurable, PluggableSer
259259

260260
String getBackupNameFromVM(VirtualMachine vm);
261261

262-
BackupResponse createBackupResponse(Backup backup, Boolean listVmDetails);
262+
BackupResponse createBackupResponse(Backup backup, Boolean listVmDetails, boolean isCallerRootAdmin);
263263

264264
Capacity getBackupStorageUsedStats(Long zoneId);
265265

‎engine/schema/src/main/java/org/apache/cloudstack/backup/InternalBackupJoinVO.java‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,9 @@ public class InternalBackupJoinVO {
9898
@Column(name = "volume_id")
9999
private long volumeId;
100100

101+
@Column(name = "volume_name")
102+
private String volumeName;
103+
101104
@Column(name = "isolated")
102105
private Boolean isolated;
103106

@@ -175,6 +178,10 @@ public long getVolumeId() {
175178
return volumeId;
176179
}
177180

181+
public String getVolumeName() {
182+
return volumeName;
183+
}
184+
178185
public Boolean getIsolated() {
179186
return BooleanUtils.isTrue(isolated);
180187
}

‎engine/schema/src/main/resources/META-INF/db/views/cloud.internal_backup_view.sql‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,13 @@ SELECT b.id,
3737
MAX(CASE WHEN bd.name = 'current' THEN bd.value END) current,
3838
COALESCE(MAX(CASE WHEN bd.name = 'isolated' THEN bd.value END), 'false') isolated,
3939
nbpr.volume_id,
40+
v.name as volume_name,
4041
nbsr.path image_store_path
4142
FROM backups b
4243
LEFT JOIN backup_details bd ON b.id = bd.backup_id
4344
LEFT JOIN backup_offering bo ON b.backup_offering_id = bo.id
4445
LEFT JOIN internal_backup_store_ref nbsr ON b.id = nbsr.backup_id
4546
LEFT JOIN internal_backup_pool_ref nbpr ON nbpr.volume_id = nbsr.volume_id
47+
LEFT JOIN volumes v ON v.id = nbsr.volume_id
4648
WHERE bo.provider='kboss'
4749
GROUP BY b.id, nbsr.volume_id;

‎server/src/main/java/org/apache/cloudstack/backup/BackupManagerImpl.java‎

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@
8585
import org.apache.cloudstack.backup.dao.BackupOfferingDao;
8686
import org.apache.cloudstack.backup.dao.BackupOfferingDetailsDao;
8787
import org.apache.cloudstack.backup.dao.BackupScheduleDao;
88+
import org.apache.cloudstack.backup.dao.InternalBackupJoinDao;
8889
import org.apache.cloudstack.context.CallContext;
8990
import org.apache.cloudstack.framework.config.ConfigKey;
9091
import org.apache.cloudstack.framework.jobs.AsyncJobDispatcher;
@@ -255,6 +256,8 @@ public class BackupManagerImpl extends ManagerBase implements BackupManager {
255256
private DomainHelper domainHelper;
256257
@Inject
257258
ReservationDao reservationDao;
259+
@Inject
260+
private InternalBackupJoinDao internalBackupJoinDao;
258261

259262
private AsyncJobDispatcher asyncJobDispatcher;
260263
private Timer backupTimer;
@@ -2595,7 +2598,7 @@ Map<String, String> getDetailsFromBackupDetails(Long backupId) {
25952598
}
25962599

25972600
@Override
2598-
public BackupResponse createBackupResponse(Backup backup, Boolean listVmDetails) {
2601+
public BackupResponse createBackupResponse(Backup backup, Boolean listVmDetails, boolean isCallerRootAdmin) {
25992602
VMInstanceVO vm = vmInstanceDao.findByIdIncludingRemoved(backup.getVmId());
26002603
AccountVO account = accountDao.findByIdIncludingRemoved(backup.getAccountId());
26012604
DomainVO domain = domainDao.findByIdIncludingRemoved(backup.getDomainId());
@@ -2677,6 +2680,17 @@ public BackupResponse createBackupResponse(Backup backup, Boolean listVmDetails)
26772680
response.setToCheckpointId(backup.getToCheckpointId());
26782681
}
26792682

2683+
if (KBOSS_BACKUP_PROVIDER.equals(offering.getProvider()) && isCallerRootAdmin) {
2684+
List<InternalBackupJoinVO> backupJoins = internalBackupJoinDao.listById(backup.getId());
2685+
Map<String, String> backupVolumePaths = new HashMap<>();
2686+
2687+
backupJoins.forEach(b -> {
2688+
backupVolumePaths.put(b.getVolumeName(), b.getImageStorePath());
2689+
});
2690+
2691+
response.setBackupPaths(backupVolumePaths);
2692+
}
2693+
26802694
response.setObjectName("backup");
26812695
return response;
26822696
}

‎server/src/test/java/org/apache/cloudstack/backup/BackupManagerTest.java‎

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
import org.apache.cloudstack.backup.dao.BackupOfferingDao;
6060
import org.apache.cloudstack.backup.dao.BackupOfferingDetailsDao;
6161
import org.apache.cloudstack.backup.dao.BackupScheduleDao;
62+
import org.apache.cloudstack.backup.dao.InternalBackupJoinDao;
6263
import org.apache.cloudstack.context.CallContext;
6364
import org.apache.cloudstack.framework.config.ConfigKey;
6465
import org.apache.cloudstack.framework.config.impl.ConfigDepotImpl;
@@ -196,6 +197,9 @@ public class BackupManagerTest {
196197
@Mock
197198
private AlertManager alertManagerMock;
198199

200+
@Mock
201+
private InternalBackupJoinDao internalBackupJoinDaoMock;
202+
199203
@Mock
200204
private Domain domainMock;
201205

@@ -1713,7 +1717,14 @@ public void testNewBackupResponse() {
17131717

17141718
Mockito.when(backupDetailsDao.listDetailsKeyPairs(backup.getId(), true)).thenReturn(details);
17151719

1716-
BackupResponse response = backupManager.createBackupResponse(backup, true);
1720+
String backupPath = "/backup/path";
1721+
String volumeName = "ROOT";
1722+
InternalBackupJoinVO backupJoin = new InternalBackupJoinVO();
1723+
ReflectionTestUtils.setField(backupJoin, "imageStorePath", backupPath);
1724+
ReflectionTestUtils.setField(backupJoin, "volumeName", volumeName);
1725+
Mockito.when(internalBackupJoinDaoMock.listById(Mockito.anyLong())).thenReturn(Collections.singletonList(backupJoin));
1726+
1727+
BackupResponse response = backupManager.createBackupResponse(backup, true, true);
17171728

17181729
Assert.assertEquals("backup-uuid", response.getId());
17191730
Assert.assertEquals("test-vm", response.getVmName());
@@ -1730,6 +1741,7 @@ public void testNewBackupResponse() {
17301741
"nics=[{\"networkid\":\"network-uuid1\",\"networkname\":\"network1\"}], serviceofferingname=service-offering1, " +
17311742
"templatename=template1, templateid=template-uuid1}", response.getVmDetails().toString());
17321743
Assert.assertEquals(true, response.getVmOfferingRemoved());
1744+
Assert.assertEquals(backupPath, response.getBackupPaths().get(volumeName));
17331745
}
17341746

17351747
@Test

0 commit comments

Comments
 (0)