package com.sequenceiq.cloudbreak.service.lifetime; import java.time.Duration; import java.util.Map; import java.util.Optional; import javax.inject.Inject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import com.sequenceiq.cloudbreak.api.model.Status; import com.sequenceiq.cloudbreak.cloud.PlatformParametersConsts; import com.sequenceiq.cloudbreak.core.flow2.service.ReactorFlowManager; import com.sequenceiq.cloudbreak.domain.Stack; import com.sequenceiq.cloudbreak.service.account.AccountPreferencesValidationFailed; import com.sequenceiq.cloudbreak.service.account.AccountPreferencesValidator; import com.sequenceiq.cloudbreak.service.stack.StackService; @Service public class ScheduledLifetimeChecker { private static final Logger LOGGER = LoggerFactory.getLogger(ScheduledLifetimeChecker.class); @Inject private StackService stackService; @Inject private AccountPreferencesValidator preferencesValidator; @Inject private ReactorFlowManager flowManager; @Scheduled(fixedRate = 60 * 1000, initialDelay = 60 * 1000) public void validate() { for (Stack stack : stackService.getAllAlive()) { getStackTimeToLive(stack).ifPresent(ttl -> { try { if (Status.DELETE_IN_PROGRESS != stack.getStatus() && stack.getCluster() != null && stack.getCluster().getCreationFinished() != null) { preferencesValidator.validateClusterTimeToLive(stack.getCluster().getCreationFinished(), ttl.toMillis()); } } catch (AccountPreferencesValidationFailed avf) { terminateStack(stack); } }); } } private Optional<Duration> getStackTimeToLive(Stack stack) { Map<String, String> params = stack.getParameters(); return Optional.ofNullable(params.get(PlatformParametersConsts.TTL)).map(s -> Duration.ofMillis(Long.parseLong(s))); } private void terminateStack(Stack stack) { if (!stack.isDeleteCompleted()) { LOGGER.info("Trigger termination of stack: '{}', owner: '{}', account: '{}'.", stack.getName(), stack.getOwner(), stack.getAccount()); flowManager.triggerTermination(stack.getId(), false); } } }