package com.sequenceiq.cloudbreak.core.flow2.stack.termination; import static com.sequenceiq.cloudbreak.api.model.Status.DELETE_IN_PROGRESS; import java.util.Map; import javax.inject.Inject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import com.sequenceiq.cloudbreak.api.model.DetailedStackStatus; import com.sequenceiq.cloudbreak.cloud.event.resource.TerminateStackRequest; import com.sequenceiq.cloudbreak.cloud.event.resource.TerminateStackResult; import com.sequenceiq.cloudbreak.core.flow2.stack.Msg; import com.sequenceiq.cloudbreak.domain.Stack; import com.sequenceiq.cloudbreak.reactor.api.event.stack.TerminationEvent; import com.sequenceiq.cloudbreak.repository.StackUpdater; import com.sequenceiq.cloudbreak.service.events.CloudbreakEventService; import com.sequenceiq.cloudbreak.service.messages.CloudbreakMessagesService; import com.sequenceiq.cloudbreak.service.proxy.ProxyRegistrator; import com.sequenceiq.cloudbreak.service.stack.flow.TerminationService; @Component("StackTerminationAction") public class StackTerminationAction extends AbstractStackTerminationAction<TerminationEvent> { private static final Logger LOGGER = LoggerFactory.getLogger(StackTerminationAction.class); @Inject private StackUpdater stackUpdater; @Inject private CloudbreakMessagesService messagesService; @Inject private CloudbreakEventService cloudbreakEventService; @Inject private TerminationService terminationService; @Inject private ProxyRegistrator proxyRegistrator; public StackTerminationAction() { super(TerminationEvent.class); } @Override protected void doExecute(StackTerminationContext context, TerminationEvent payload, Map<Object, Object> variables) { String name = context.getStack().getName(); proxyRegistrator.remove(name); variables.put("DELETEDEPENDENCIES", payload.getDeleteDependencies()); doExecute(context); } @Override protected TerminateStackRequest createRequest(StackTerminationContext context) { return new TerminateStackRequest<>(context.getCloudContext(), context.getCloudStack(), context.getCloudCredential(), context.getCloudResources()); } protected void doExecute(StackTerminationContext context) { TerminateStackRequest terminateRequest = createRequest(context); Stack stack = context.getStack(); if (stack == null || stack.getCredential() == null) { LOGGER.info("Could not trigger stack event on null", terminateRequest); String statusReason = "Stack or credential not found."; TerminateStackResult terminateStackResult = new TerminateStackResult(statusReason, new IllegalArgumentException(statusReason), terminateRequest); sendEvent(context.getFlowId(), StackTerminationEvent.TERMINATION_FAILED_EVENT.event(), terminateStackResult); } else { stackUpdater.updateStackStatus(stack.getId(), DetailedStackStatus.DELETE_IN_PROGRESS, "Terminating the cluster and its infrastructure."); cloudbreakEventService.fireCloudbreakEvent(context.getStack().getId(), DELETE_IN_PROGRESS.name(), messagesService.getMessage(Msg.STACK_DELETE_IN_PROGRESS.code())); LOGGER.debug("Assembling terminate stack event for stack: {}", stack); LOGGER.info("Triggering terminate stack event: {}", terminateRequest); sendEvent(context.getFlowId(), terminateRequest.selector(), terminateRequest); } } }