package io.cattle.platform.systemstack.process; import static io.cattle.platform.core.model.tables.ScheduledUpgradeTable.*; import io.cattle.platform.archaius.util.ArchaiusUtil; import io.cattle.platform.core.constants.AccountConstants; import io.cattle.platform.core.model.Account; import io.cattle.platform.core.model.ScheduledUpgrade; import io.cattle.platform.core.model.Stack; import io.cattle.platform.deferred.util.DeferredUtils; import io.cattle.platform.engine.handler.HandlerResult; import io.cattle.platform.engine.process.ProcessInstance; import io.cattle.platform.engine.process.ProcessState; import io.cattle.platform.object.process.ObjectProcessManager; import io.cattle.platform.object.process.StandardProcess; import io.cattle.platform.object.util.DataAccessor; import io.cattle.platform.process.base.AbstractDefaultProcessHandler; import io.cattle.platform.systemstack.service.UpgradeManager; import java.util.Date; import javax.inject.Inject; import javax.inject.Named; import org.apache.commons.lang3.StringUtils; import com.netflix.config.DynamicLongProperty; @Named public class ScheduledUpgradeCreate extends AbstractDefaultProcessHandler { public static final DynamicLongProperty DEFAULT_DELAY = ArchaiusUtil.getLong("default.schedule.upgrade.delay.minutes"); @Inject UpgradeManager upgradeManager; @Inject ObjectProcessManager processManager; @Override public HandlerResult handle(ProcessState state, ProcessInstance process) { ScheduledUpgrade upgrade = (ScheduledUpgrade)state.getResource(); Stack stack = objectManager.loadResource(Stack.class, upgrade.getStackId()); if (stack.getRemoved() != null) { return new HandlerResult() .withChainProcessName(processManager.getStandardProcessName(StandardProcess.REMOVE, upgrade)); } Account account = objectManager.loadResource(Account.class, upgrade.getAccountId()); Long delay = DataAccessor.fieldLong(account, AccountConstants.FIELD_SCHEDULED_UPGRADE_DELAY); if (delay == null) { delay = DEFAULT_DELAY.get(); } if (delay < 0) { delay = 26280000L; } Long priority = 0L; if (StringUtils.isNotBlank(stack.getExternalId()) && stack.getExternalId().contains(UpgradeManager.METADATA)) { priority = 100L; delay = 0L; } Date runAfter = new Date(upgrade.getCreated().getTime() + delay * 60000); HandlerResult result = new HandlerResult(SCHEDULED_UPGRADE.RUN_AFTER, runAfter, SCHEDULED_UPGRADE.PRIORITY, priority); if (delay == 0L) { DeferredUtils.defer(new Runnable() { @Override public void run() { try { upgradeManager.run(); } catch (Exception e) { } } }); } return result; } }