package io.cattle.platform.servicediscovery.api.action; import io.cattle.platform.api.action.ActionHandler; import io.cattle.platform.core.constants.CommonStatesConstants; import io.cattle.platform.core.constants.ServiceConstants; import io.cattle.platform.core.model.Stack; import io.cattle.platform.core.model.Service; import io.cattle.platform.object.ObjectManager; import io.cattle.platform.object.process.ObjectProcessManager; import io.github.ibuildthecloud.gdapi.exception.ValidationErrorException; import io.github.ibuildthecloud.gdapi.request.ApiRequest; import io.github.ibuildthecloud.gdapi.validation.ValidationErrorCodes; import static io.cattle.platform.core.model.tables.ServiceTable.*; import java.util.Arrays; import java.util.List; import javax.inject.Inject; import javax.inject.Named; @Named public class StackDeactivateServicesActionHandler implements ActionHandler { @Inject ObjectProcessManager objectProcessManager; @Inject ObjectManager objectManager; @Override public String getName() { return ServiceConstants.PROCESS_STACK_DEACTIVATE_SERVICES; } @Override public Object perform(String name, Object obj, ApiRequest request) { if (!(obj instanceof Stack)) { return null; } Stack env = (Stack) obj; List<? extends Service> services = objectManager.find(Service.class, SERVICE.STACK_ID, env.getId(), SERVICE.REMOVED, null); deactivateServices(services); return env; } private void deactivateServices(List<? extends Service> services) { List<String> validStates = Arrays.asList(CommonStatesConstants.ACTIVE, CommonStatesConstants.ACTIVATING, CommonStatesConstants.UPDATING_ACTIVE, CommonStatesConstants.UPDATING_INACTIVE, ServiceConstants.STATE_RESTARTING); List<String> statesToSkip = Arrays.asList(CommonStatesConstants.REMOVED, CommonStatesConstants.REMOVING, CommonStatesConstants.INACTIVE, CommonStatesConstants.DEACTIVATING); for (Service service : services) { if (validStates.contains(service.getState())) { objectProcessManager.scheduleProcessInstance(ServiceConstants.PROCESS_SERVICE_DEACTIVATE, service, null); } else if (statesToSkip.contains(service.getState())) { continue; } else { throw new ValidationErrorException(ValidationErrorCodes.INVALID_STATE, "Service " + service.getName() + " is not in valid state to be deactivated: " + service.getState()); } } } }