package io.cattle.platform.process.instance; import io.cattle.platform.allocator.service.AllocatorService; import io.cattle.platform.core.constants.CommonStatesConstants; import io.cattle.platform.core.constants.InstanceLinkConstants; import io.cattle.platform.core.dao.GenericMapDao; import io.cattle.platform.core.dao.InstanceDao; import io.cattle.platform.core.model.Instance; import io.cattle.platform.core.model.InstanceHostMap; import io.cattle.platform.core.model.InstanceLink; import io.cattle.platform.core.model.Nic; import io.cattle.platform.core.model.Port; import io.cattle.platform.core.model.Volume; 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.engine.process.impl.ProcessCancelException; import io.cattle.platform.process.base.AbstractDefaultProcessHandler; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import javax.inject.Inject; import javax.inject.Named; @Named public class InstanceStop extends AbstractDefaultProcessHandler { @Inject GenericMapDao mapDao; @Inject InstanceDao instanceDao; @Inject AllocatorService allocatorService; @Override public HandlerResult handle(ProcessState state, ProcessInstance process) { final Instance instance = (Instance) state.getResource(); Map<String, Object> result = new ConcurrentHashMap<String, Object>(); compute(instance, state); network(instance); storage(instance); allocatorService.ensureResourcesReleasedForStop(instance); return new HandlerResult(result); } protected void storage(Instance instance) { List<Volume> volumes = getObjectManager().children(instance, Volume.class); for (Volume volume : volumes) { if (volume.getRemoved() == null && !volume.getState().equals(CommonStatesConstants.REMOVED)) { deactivate(volume, null); } } } protected void network(Instance instance) { List<Nic> nics = getObjectManager().children(instance, Nic.class); for (Nic nic : nics) { if (nic.getRemoved() == null && !nic.getState().equals(CommonStatesConstants.REMOVED)) { deactivate(nic, null); } } for (Port port : getObjectManager().children(instance, Port.class)) { if (port.getRemoved() == null && !port.getState().equals(CommonStatesConstants.REMOVED)) { deactivate(port, null); } } for (InstanceLink link : getObjectManager().children(instance, InstanceLink.class, InstanceLinkConstants.FIELD_INSTANCE_ID)) { if (link.getRemoved() == null && !link.getState().equals(CommonStatesConstants.REMOVED)) { deactivate(link, null); } } } protected void compute(Instance instance, ProcessState state) { for (InstanceHostMap map : mapDao.findNonRemoved(InstanceHostMap.class, Instance.class, instance.getId())) { if (map.getRemoved() == null) { try { deactivate(map, state.getData()); } catch (ProcessCancelException e) { /* We ignore requested ihm because that means we allocated the instance but for * whatever reason we never activated it (server crash, message lost, etc). In this * situation we just ignore it. */ if (!CommonStatesConstants.REQUESTED.equals(map.getState())) { throw e; } } } } } }