Skip to content

Commit 1978c18

Browse files
author
Fabrício Duarte
committed
Merge branch 'backup-schedules-general-fixes' into '4.20.0.0-scclouds'
Ajustes em fluxos de agendamentos de _backups_ Closes #2935, #3021, #3024, and #3037 See merge request scclouds/scclouds!1294
2 parents f74e2f2 + b953cb9 commit 1978c18

File tree

8 files changed

+58
-76
lines changed

8 files changed

+58
-76
lines changed

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

Lines changed: 9 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -19,28 +19,18 @@
1919

2020
import javax.inject.Inject;
2121

22-
import com.amazonaws.util.CollectionUtils;
2322
import org.apache.cloudstack.acl.RoleType;
2423
import org.apache.cloudstack.api.APICommand;
2524
import org.apache.cloudstack.api.ApiConstants;
26-
import org.apache.cloudstack.api.ApiErrorCode;
2725
import org.apache.cloudstack.api.BaseCmd;
2826
import org.apache.cloudstack.api.Parameter;
29-
import org.apache.cloudstack.api.ServerApiException;
3027
import org.apache.cloudstack.api.response.BackupScheduleResponse;
3128
import org.apache.cloudstack.api.response.ListResponse;
3229
import org.apache.cloudstack.api.response.UserVmResponse;
3330
import org.apache.cloudstack.backup.BackupManager;
3431
import org.apache.cloudstack.backup.BackupSchedule;
3532
import org.apache.cloudstack.context.CallContext;
3633

37-
import com.cloud.exception.ConcurrentOperationException;
38-
import com.cloud.exception.InsufficientCapacityException;
39-
import com.cloud.exception.NetworkRuleConflictException;
40-
import com.cloud.exception.ResourceAllocationException;
41-
import com.cloud.exception.ResourceUnavailableException;
42-
import com.cloud.utils.exception.CloudRuntimeException;
43-
4434
import java.util.ArrayList;
4535
import java.util.List;
4636

@@ -77,24 +67,16 @@ public Long getVmId() {
7767
/////////////////////////////////////////////////////
7868

7969
@Override
80-
public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException {
81-
try{
82-
List<BackupSchedule> schedules = backupManager.listBackupSchedule(getVmId());
83-
ListResponse<BackupScheduleResponse> response = new ListResponse<>();
84-
List<BackupScheduleResponse> scheduleResponses = new ArrayList<>();
85-
if (!CollectionUtils.isNullOrEmpty(schedules)) {
86-
for (BackupSchedule schedule : schedules) {
87-
scheduleResponses.add(_responseGenerator.createBackupScheduleResponse(schedule));
88-
}
89-
response.setResponses(scheduleResponses, schedules.size());
90-
response.setResponseName(getCommandName());
91-
setResponseObject(response);
92-
} else {
93-
throw new CloudRuntimeException("No backup schedule exists for the VM");
94-
}
95-
} catch (Exception e) {
96-
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, e.getMessage());
70+
public void execute() {
71+
List<BackupSchedule> schedules = backupManager.listBackupSchedules(getVmId());
72+
ListResponse<BackupScheduleResponse> response = new ListResponse<>();
73+
List<BackupScheduleResponse> scheduleResponses = new ArrayList<>();
74+
for (BackupSchedule schedule : schedules) {
75+
scheduleResponses.add(_responseGenerator.createBackupScheduleResponse(schedule));
9776
}
77+
response.setResponses(scheduleResponses, schedules.size());
78+
response.setResponseName(getCommandName());
79+
setResponseObject(response);
9880
}
9981

10082
@Override

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,11 +106,11 @@ public interface BackupManager extends BackupService, Configurable, PluggableSer
106106
BackupSchedule configureBackupSchedule(CreateBackupScheduleCmd cmd);
107107

108108
/**
109-
* Lists VM backup schedule for a VM
110-
* @param vmId
109+
* Lists backup schedules for a VM
110+
* @param vmId ID of the VM from which all backup schedules will be listed
111111
* @return
112112
*/
113-
List<BackupSchedule> listBackupSchedule(Long vmId);
113+
List<BackupSchedule> listBackupSchedules(Long vmId);
114114

115115
/**
116116
* Deletes a VM backup schedule for a VM

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

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,20 +21,14 @@
2121
import java.util.List;
2222

2323
import com.cloud.utils.DateUtil;
24-
import org.apache.cloudstack.api.response.BackupScheduleResponse;
25-
import org.apache.cloudstack.backup.BackupSchedule;
2624
import org.apache.cloudstack.backup.BackupScheduleVO;
2725

2826
import com.cloud.utils.db.GenericDao;
2927

3028
public interface BackupScheduleDao extends GenericDao<BackupScheduleVO, Long> {
31-
BackupScheduleVO findByVM(Long vmId);
32-
3329
List<BackupScheduleVO> listByVM(Long vmId);
3430

3531
BackupScheduleVO findByVMAndIntervalType(Long vmId, DateUtil.IntervalType intervalType);
3632

3733
List<BackupScheduleVO> getSchedulesToExecute(Date currentTimestamp);
38-
39-
BackupScheduleResponse newBackupScheduleResponse(BackupSchedule schedule);
4034
}

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

Lines changed: 16 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -17,21 +17,22 @@
1717

1818
package org.apache.cloudstack.backup.dao;
1919

20+
import java.sql.PreparedStatement;
21+
import java.sql.SQLException;
2022
import java.util.Date;
2123
import java.util.List;
2224

2325
import javax.annotation.PostConstruct;
2426
import javax.inject.Inject;
2527

2628
import com.cloud.utils.DateUtil;
27-
import org.apache.cloudstack.api.response.BackupScheduleResponse;
28-
import org.apache.cloudstack.backup.BackupSchedule;
29+
import com.cloud.utils.db.DB;
30+
import com.cloud.utils.db.TransactionLegacy;
2931
import org.apache.cloudstack.backup.BackupScheduleVO;
3032

3133
import com.cloud.utils.db.GenericDaoBase;
3234
import com.cloud.utils.db.SearchBuilder;
3335
import com.cloud.utils.db.SearchCriteria;
34-
import com.cloud.vm.VMInstanceVO;
3536
import com.cloud.vm.dao.VMInstanceDao;
3637

3738
public class BackupScheduleDaoImpl extends GenericDaoBase<BackupScheduleVO, Long> implements BackupScheduleDao {
@@ -59,13 +60,6 @@ protected void init() {
5960
executableSchedulesSearch.done();
6061
}
6162

62-
@Override
63-
public BackupScheduleVO findByVM(Long vmId) {
64-
SearchCriteria<BackupScheduleVO> sc = backupScheduleSearch.create();
65-
sc.setParameters("vm_id", vmId);
66-
return findOneBy(sc);
67-
}
68-
6963
@Override
7064
public List<BackupScheduleVO> listByVM(Long vmId) {
7165
SearchCriteria<BackupScheduleVO> sc = backupScheduleSearch.create();
@@ -89,18 +83,17 @@ public List<BackupScheduleVO> getSchedulesToExecute(Date currentTimestamp) {
8983
}
9084

9185
@Override
92-
public BackupScheduleResponse newBackupScheduleResponse(BackupSchedule schedule) {
93-
VMInstanceVO vm = vmInstanceDao.findByIdIncludingRemoved(schedule.getVmId());
94-
BackupScheduleResponse response = new BackupScheduleResponse();
95-
response.setId(schedule.getUuid());
96-
response.setVmId(vm.getUuid());
97-
response.setVmName(vm.getHostName());
98-
response.setIntervalType(schedule.getScheduleType());
99-
response.setSchedule(schedule.getSchedule());
100-
response.setTimezone(schedule.getTimezone());
101-
response.setQuiesceVm(schedule.isQuiesceVm());
102-
response.setMaxBackups(schedule.getMaxBackups());
103-
response.setObjectName("backupschedule");
104-
return response;
86+
@DB
87+
public boolean remove(Long id) {
88+
String sql = "UPDATE backups SET backup_schedule_id = NULL WHERE backup_schedule_id = ?";
89+
TransactionLegacy transaction = TransactionLegacy.currentTxn();
90+
try {
91+
PreparedStatement preparedStatement = transaction.prepareAutoCloseStatement(sql);
92+
preparedStatement.setLong(1, id);
93+
preparedStatement.executeUpdate();
94+
return super.remove(id);
95+
} catch (SQLException e) {
96+
return false;
97+
}
10598
}
10699
}

server/src/main/java/com/cloud/api/ApiDBUtils.java

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@
4747
import org.apache.cloudstack.api.response.AsyncJobResponse;
4848
import org.apache.cloudstack.api.response.BackupOfferingResponse;
4949
import org.apache.cloudstack.api.response.BackupResponse;
50-
import org.apache.cloudstack.api.response.BackupScheduleResponse;
5150
import org.apache.cloudstack.api.response.DiskOfferingResponse;
5251
import org.apache.cloudstack.api.response.DomainResponse;
5352
import org.apache.cloudstack.api.response.DomainRouterResponse;
@@ -78,7 +77,6 @@
7877
import org.apache.cloudstack.api.response.ZoneResponse;
7978
import org.apache.cloudstack.backup.Backup;
8079
import org.apache.cloudstack.backup.BackupOffering;
81-
import org.apache.cloudstack.backup.BackupSchedule;
8280
import org.apache.cloudstack.backup.dao.BackupDao;
8381
import org.apache.cloudstack.backup.dao.BackupOfferingDao;
8482
import org.apache.cloudstack.backup.dao.BackupScheduleDao;
@@ -491,7 +489,6 @@ public class ApiDBUtils {
491489
static HostGpuGroupsDao s_hostGpuGroupsDao;
492490
static VGPUTypesDao s_vgpuTypesDao;
493491
static BackupDao s_backupDao;
494-
static BackupScheduleDao s_backupScheduleDao;
495492
static BackupOfferingDao s_backupOfferingDao;
496493
static NicDao s_nicDao;
497494
static ResourceManagerUtil s_resourceManagerUtil;
@@ -900,7 +897,6 @@ void init() {
900897
s_hostGpuGroupsDao = hostGpuGroupsDao;
901898
s_vgpuTypesDao = vgpuTypesDao;
902899
s_backupDao = backupDao;
903-
s_backupScheduleDao = backupScheduleDao;
904900
s_backupOfferingDao = backupOfferingDao;
905901
s_resourceIconDao = resourceIconDao;
906902
s_resourceManagerUtil = resourceManagerUtil;
@@ -2292,10 +2288,6 @@ public static BackupResponse newBackupResponse(Backup backup) {
22922288
return s_backupDao.newBackupResponse(backup);
22932289
}
22942290

2295-
public static BackupScheduleResponse newBackupScheduleResponse(BackupSchedule schedule) {
2296-
return s_backupScheduleDao.newBackupScheduleResponse(schedule);
2297-
}
2298-
22992291
public static BackupOfferingResponse newBackupOfferingResponse(BackupOffering policy) {
23002292
return s_backupOfferingDao.newBackupOfferingResponse(policy);
23012293
}

server/src/main/java/com/cloud/api/ApiResponseHelper.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5029,7 +5029,22 @@ public BackupResponse createBackupResponse(Backup backup) {
50295029

50305030
@Override
50315031
public BackupScheduleResponse createBackupScheduleResponse(BackupSchedule schedule) {
5032-
return ApiDBUtils.newBackupScheduleResponse(schedule);
5032+
BackupScheduleResponse response = new BackupScheduleResponse();
5033+
response.setId(schedule.getUuid());
5034+
response.setIntervalType(schedule.getScheduleType());
5035+
response.setSchedule(schedule.getSchedule());
5036+
response.setTimezone(schedule.getTimezone());
5037+
response.setQuiesceVm(schedule.isQuiesceVm());
5038+
response.setMaxBackups(schedule.getMaxBackups());
5039+
5040+
VMInstanceVO vm = ApiDBUtils.findVMInstanceById(schedule.getVmId());
5041+
if (vm != null) {
5042+
response.setVmId(vm.getUuid());
5043+
response.setVmName(vm.getHostName());
5044+
}
5045+
5046+
response.setObjectName("backupschedule");
5047+
return response;
50335048
}
50345049

50355050
@Override

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -491,7 +491,7 @@ public BackupSchedule configureBackupSchedule(CreateBackupScheduleCmd cmd) {
491491
schedule.setQuiesceVm(quiesceVm);
492492
schedule.setMaxBackups(maxBackups);
493493
backupScheduleDao.update(schedule.getId(), schedule);
494-
return backupScheduleDao.findByVM(vmId);
494+
return backupScheduleDao.findById(schedule.getId());
495495
}
496496

497497
/**
@@ -519,7 +519,7 @@ protected int validateAndGetDefaultBackupRetentionIfRequired(Integer maxBackups,
519519
}
520520

521521
@Override
522-
public List<BackupSchedule> listBackupSchedule(final Long vmId) {
522+
public List<BackupSchedule> listBackupSchedules(final Long vmId) {
523523
final VMInstanceVO vm = findVmById(vmId);
524524
validateForZone(vm.getDataCenterId());
525525
accountManager.checkAccess(CallContext.current().getCallingAccount(), null, true, vm);

ui/src/views/compute/backup/BackupSchedule.vue

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,8 @@
4444
<template v-if="column.key === 'intervaltype'" :name="text">
4545
<label>{{ record.intervaltype }}</label>
4646
</template>
47-
<template v-if="column.key === 'time'" :name="text">
48-
<label class="interval-content">
49-
<span v-if="record.intervaltype==='HOURLY'">{{ record.schedule + ' ' + $t('label.min.past.hour') }}</span>
50-
<span v-else>{{ record.schedule.split(':')[1] + ':' + record.schedule.split(':')[0] }}</span>
51-
</label>
47+
<template v-if="column.key === 'schedule'" :name="text">
48+
<span>{{ parseScheduleTime(record.schedule, record.intervaltype) }}</span>
5249
</template>
5350
<template v-if="column.key === 'interval'" :name="text">
5451
<span v-if="record.intervaltype==='WEEKLY'">
@@ -129,7 +126,8 @@ export default {
129126
},
130127
{
131128
title: this.$t('label.time'),
132-
dataIndex: 'schedule'
129+
dataIndex: 'schedule',
130+
key: 'schedule'
133131
},
134132
{
135133
key: 'interval',
@@ -196,6 +194,14 @@ export default {
196194
},
197195
getTimeZone (timeZone) {
198196
return timeZoneName(timeZone)
197+
},
198+
parseScheduleTime (schedule, intervalType) {
199+
if (intervalType === 'HOURLY') {
200+
return schedule
201+
}
202+
203+
const [minute, hour] = schedule.split(':')
204+
return `${hour}:${minute}`
199205
}
200206
}
201207
}

0 commit comments

Comments
 (0)