package com.sequenceiq.cloudbreak.service.account; import java.util.HashMap; import java.util.List; import java.util.Map; 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.core.flow2.service.ReactorFlowManager; import com.sequenceiq.cloudbreak.domain.AccountPreferences; import com.sequenceiq.cloudbreak.domain.Stack; import com.sequenceiq.cloudbreak.service.stack.StackService; @Service public class ScheduledAccountPreferencesValidator { private static final Logger LOGGER = LoggerFactory.getLogger(ScheduledAccountPreferencesValidator.class); private static final String EVERY_HOUR_0MIN_0SEC = "0 0 * * * *"; @Inject private AccountPreferencesService accountPreferencesService; @Inject private StackService stackService; @Inject private AccountPreferencesValidator preferencesValidator; @Inject private ReactorFlowManager flowManager; @Scheduled(cron = EVERY_HOUR_0MIN_0SEC) public void validate() { LOGGER.info("Validate account preferences for all 'running' stack."); Map<String, AccountPreferences> accountPreferences = new HashMap<>(); List<Stack> allAlive = stackService.getAllAlive(); for (Stack stack : allAlive) { AccountPreferences preferences = getAccountPreferences(stack.getAccount(), accountPreferences); try { preferencesValidator.validateClusterTimeToLive(stack.getCreated(), preferences.getClusterTimeToLive()); preferencesValidator.validateUserTimeToLive(stack.getOwner(), preferences); } catch (AccountPreferencesValidationFailed e) { terminateStack(stack); } } } private AccountPreferences getAccountPreferences(String account, Map<String, AccountPreferences> accountPreferences) { if (accountPreferences.containsKey(account)) { return accountPreferences.get(account); } else { AccountPreferences preferences = accountPreferencesService.getByAccount(account); accountPreferences.put(account, preferences); return preferences; } } 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); } } }