From 8462c6d449d415959f950978f4d3df0b97ddfd16 Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Tue, 29 Jul 2025 08:12:36 +0530 Subject: [PATCH] server: prevent vm schedule update failure for time when not changed Fixes #11175 Behaviour introduced in #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 --- .../vm/schedule/VMScheduleManagerImpl.java | 56 +++++++++++-------- 1 file changed, 34 insertions(+), 22 deletions(-) diff --git a/server/src/main/java/org/apache/cloudstack/vm/schedule/VMScheduleManagerImpl.java b/server/src/main/java/org/apache/cloudstack/vm/schedule/VMScheduleManagerImpl.java index 0bb2f94ba7f7..4d1fc4049c9a 100644 --- a/server/src/main/java/org/apache/cloudstack/vm/schedule/VMScheduleManagerImpl.java +++ b/server/src/main/java/org/apache/cloudstack/vm/schedule/VMScheduleManagerImpl.java @@ -18,20 +18,15 @@ */ package org.apache.cloudstack.vm.schedule; -import com.cloud.api.query.MutualExclusiveIdsManagerBase; -import com.cloud.event.ActionEvent; -import com.cloud.event.EventTypes; -import com.cloud.exception.InvalidParameterValueException; -import com.cloud.user.AccountManager; -import com.cloud.utils.DateUtil; -import com.cloud.utils.Pair; -import com.cloud.utils.component.PluggableService; -import com.cloud.utils.db.SearchCriteria; -import com.cloud.utils.db.Transaction; -import com.cloud.utils.db.TransactionCallback; -import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.vm.UserVmManager; -import com.cloud.vm.VirtualMachine; +import java.time.ZonedDateTime; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Objects; +import java.util.TimeZone; + +import javax.inject.Inject; + import org.apache.cloudstack.api.ApiCommandResourceType; import org.apache.cloudstack.api.command.user.vm.CreateVMScheduleCmd; import org.apache.cloudstack.api.command.user.vm.DeleteVMScheduleCmd; @@ -42,17 +37,25 @@ import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.vm.schedule.dao.VMScheduleDao; import org.apache.commons.lang.time.DateUtils; +import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.springframework.scheduling.support.CronExpression; -import javax.inject.Inject; -import java.time.ZonedDateTime; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.Objects; -import java.util.TimeZone; +import com.cloud.api.query.MutualExclusiveIdsManagerBase; +import com.cloud.event.ActionEvent; +import com.cloud.event.EventTypes; +import com.cloud.exception.InvalidParameterValueException; +import com.cloud.user.AccountManager; +import com.cloud.utils.DateUtil; +import com.cloud.utils.Pair; +import com.cloud.utils.component.PluggableService; +import com.cloud.utils.db.SearchCriteria; +import com.cloud.utils.db.Transaction; +import com.cloud.utils.db.TransactionCallback; +import com.cloud.utils.exception.CloudRuntimeException; +import com.cloud.vm.UserVmManager; +import com.cloud.vm.VirtualMachine; public class VMScheduleManagerImpl extends MutualExclusiveIdsManagerBase implements VMScheduleManager, PluggableService { @@ -208,6 +211,9 @@ public VMScheduleResponse updateSchedule(UpdateVMScheduleCmd cmd) { Date cmdStartDate = cmd.getStartDate(); Date cmdEndDate = cmd.getEndDate(); Boolean enabled = cmd.getEnabled(); + final String originalTimeZone = vmSchedule.getTimeZone(); + final Date originalStartDate = vmSchedule.getStartDate(); + final Date originalEndDate = vmSchedule.getEndDate(); TimeZone timeZone; String timeZoneId; @@ -234,7 +240,13 @@ public VMScheduleResponse updateSchedule(UpdateVMScheduleCmd cmd) { startDate = Date.from(DateUtil.getZoneDateTime(cmdStartDate, timeZone.toZoneId()).toInstant()); } - validateStartDateEndDate(Objects.requireNonNullElse(startDate, DateUtils.addMinutes(new Date(), 1)), endDate, timeZone); + if (ObjectUtils.anyNotNull(cmdStartDate, cmdEndDate, cmdTimeZone) && + (!Objects.equals(originalTimeZone, timeZoneId) || + !Objects.equals(originalStartDate, startDate) || + !Objects.equals(originalEndDate, endDate))) { + validateStartDateEndDate(Objects.requireNonNullElse(startDate, DateUtils.addMinutes(new Date(), 1)), + endDate, timeZone); + } if (enabled != null) { vmSchedule.setEnabled(enabled);