package io.cattle.platform.servicediscovery.process; import static io.cattle.platform.core.model.tables.VolumeTable.*; import static io.cattle.platform.core.model.tables.VolumeTemplateTable.*; import io.cattle.platform.core.constants.CommonStatesConstants; import io.cattle.platform.core.constants.ExternalEventConstants; import io.cattle.platform.core.constants.ServiceConstants; import io.cattle.platform.core.model.Stack; import io.cattle.platform.core.model.Volume; import io.cattle.platform.core.model.VolumeTemplate; import io.cattle.platform.engine.handler.HandlerResult; import io.cattle.platform.engine.handler.ProcessPostListener; import io.cattle.platform.engine.process.ProcessInstance; import io.cattle.platform.engine.process.ProcessState; import io.cattle.platform.engine.process.impl.ProcessCancelException; import io.cattle.platform.object.process.StandardProcess; import io.cattle.platform.process.common.handler.AbstractObjectProcessLogic; import io.cattle.platform.process.common.util.ProcessUtils; import io.cattle.platform.util.type.Priority; import java.util.HashMap; import java.util.List; import javax.inject.Named; @Named public class StackRemovePostListener extends AbstractObjectProcessLogic implements ProcessPostListener, Priority { @Override public String[] getProcessNames() { return new String[] { ServiceConstants.PROCESS_STACK_REMOVE }; } @Override public HandlerResult handle(ProcessState state, ProcessInstance process) { Stack stack = (Stack) state.getResource(); removeVolumeTemplates(stack); removeVolumes(stack); return null; } private void removeVolumeTemplates(Stack stack) { List<? extends VolumeTemplate> templates = objectManager.find(VolumeTemplate.class, VOLUME_TEMPLATE.ACCOUNT_ID, stack.getAccountId(), VOLUME_TEMPLATE.REMOVED, null, VOLUME_TEMPLATE.STACK_ID, stack.getId()); for (VolumeTemplate template : templates) { objectProcessManager.scheduleStandardProcessAsync(StandardProcess.REMOVE, template, null); } } private void removeVolumes(Stack stack) { List<? extends Volume> volumes = objectManager.find(Volume.class, VOLUME.ACCOUNT_ID, stack.getAccountId(), VOLUME.REMOVED, null, VOLUME.STACK_ID, stack.getId()); for (Volume volume : volumes) { if (!(volume.getState().equals(CommonStatesConstants.REMOVED) || volume.getState().equals( CommonStatesConstants.REMOVING))) { try { objectProcessManager.scheduleStandardProcessAsync(StandardProcess.REMOVE, volume, null); } catch (ProcessCancelException e) { objectProcessManager.scheduleStandardProcessAsync(StandardProcess.DEACTIVATE, volume, ProcessUtils.chainInData(new HashMap<String, Object>(), ExternalEventConstants.PROC_VOL_DEACTIVATE, ExternalEventConstants.PROC_VOL_REMOVE)); } } } } @Override public int getPriority() { return Priority.DEFAULT; } }