Skip to content

Commit fe120b6

Browse files
authored
server: prevent vm schedule update failure for time when not changed (apache#11314)
Fixes apache#11175 Behaviour introduced in apache#7397 always validates start-end times during update even when they are not changed which leads to failure to enable/disable schedule if the start time has passed. Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com>
1 parent f4802f3 commit fe120b6

File tree

1 file changed

+34
-22
lines changed

1 file changed

+34
-22
lines changed

server/src/main/java/org/apache/cloudstack/vm/schedule/VMScheduleManagerImpl.java

Lines changed: 34 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -18,20 +18,15 @@
1818
*/
1919
package org.apache.cloudstack.vm.schedule;
2020

21-
import com.cloud.api.query.MutualExclusiveIdsManagerBase;
22-
import com.cloud.event.ActionEvent;
23-
import com.cloud.event.EventTypes;
24-
import com.cloud.exception.InvalidParameterValueException;
25-
import com.cloud.user.AccountManager;
26-
import com.cloud.utils.DateUtil;
27-
import com.cloud.utils.Pair;
28-
import com.cloud.utils.component.PluggableService;
29-
import com.cloud.utils.db.SearchCriteria;
30-
import com.cloud.utils.db.Transaction;
31-
import com.cloud.utils.db.TransactionCallback;
32-
import com.cloud.utils.exception.CloudRuntimeException;
33-
import com.cloud.vm.UserVmManager;
34-
import com.cloud.vm.VirtualMachine;
21+
import java.time.ZonedDateTime;
22+
import java.util.ArrayList;
23+
import java.util.Date;
24+
import java.util.List;
25+
import java.util.Objects;
26+
import java.util.TimeZone;
27+
28+
import javax.inject.Inject;
29+
3530
import org.apache.cloudstack.api.ApiCommandResourceType;
3631
import org.apache.cloudstack.api.command.user.vm.CreateVMScheduleCmd;
3732
import org.apache.cloudstack.api.command.user.vm.DeleteVMScheduleCmd;
@@ -42,17 +37,25 @@
4237
import org.apache.cloudstack.context.CallContext;
4338
import org.apache.cloudstack.vm.schedule.dao.VMScheduleDao;
4439
import org.apache.commons.lang.time.DateUtils;
40+
import org.apache.commons.lang3.ObjectUtils;
4541
import org.apache.commons.lang3.StringUtils;
4642
import org.apache.log4j.Logger;
4743
import org.springframework.scheduling.support.CronExpression;
4844

49-
import javax.inject.Inject;
50-
import java.time.ZonedDateTime;
51-
import java.util.ArrayList;
52-
import java.util.Date;
53-
import java.util.List;
54-
import java.util.Objects;
55-
import java.util.TimeZone;
45+
import com.cloud.api.query.MutualExclusiveIdsManagerBase;
46+
import com.cloud.event.ActionEvent;
47+
import com.cloud.event.EventTypes;
48+
import com.cloud.exception.InvalidParameterValueException;
49+
import com.cloud.user.AccountManager;
50+
import com.cloud.utils.DateUtil;
51+
import com.cloud.utils.Pair;
52+
import com.cloud.utils.component.PluggableService;
53+
import com.cloud.utils.db.SearchCriteria;
54+
import com.cloud.utils.db.Transaction;
55+
import com.cloud.utils.db.TransactionCallback;
56+
import com.cloud.utils.exception.CloudRuntimeException;
57+
import com.cloud.vm.UserVmManager;
58+
import com.cloud.vm.VirtualMachine;
5659

5760
public class VMScheduleManagerImpl extends MutualExclusiveIdsManagerBase implements VMScheduleManager, PluggableService {
5861

@@ -208,6 +211,9 @@ public VMScheduleResponse updateSchedule(UpdateVMScheduleCmd cmd) {
208211
Date cmdStartDate = cmd.getStartDate();
209212
Date cmdEndDate = cmd.getEndDate();
210213
Boolean enabled = cmd.getEnabled();
214+
final String originalTimeZone = vmSchedule.getTimeZone();
215+
final Date originalStartDate = vmSchedule.getStartDate();
216+
final Date originalEndDate = vmSchedule.getEndDate();
211217

212218
TimeZone timeZone;
213219
String timeZoneId;
@@ -234,7 +240,13 @@ public VMScheduleResponse updateSchedule(UpdateVMScheduleCmd cmd) {
234240
startDate = Date.from(DateUtil.getZoneDateTime(cmdStartDate, timeZone.toZoneId()).toInstant());
235241
}
236242

237-
validateStartDateEndDate(Objects.requireNonNullElse(startDate, DateUtils.addMinutes(new Date(), 1)), endDate, timeZone);
243+
if (ObjectUtils.anyNotNull(cmdStartDate, cmdEndDate, cmdTimeZone) &&
244+
(!Objects.equals(originalTimeZone, timeZoneId) ||
245+
!Objects.equals(originalStartDate, startDate) ||
246+
!Objects.equals(originalEndDate, endDate))) {
247+
validateStartDateEndDate(Objects.requireNonNullElse(startDate, DateUtils.addMinutes(new Date(), 1)),
248+
endDate, timeZone);
249+
}
238250

239251
if (enabled != null) {
240252
vmSchedule.setEnabled(enabled);

0 commit comments

Comments
 (0)