package io.cattle.platform.servicediscovery.process;
import io.cattle.platform.configitem.request.ConfigUpdateRequest;
import io.cattle.platform.configitem.version.ConfigItemStatusManager;
import io.cattle.platform.core.constants.HealthcheckConstants;
import io.cattle.platform.core.constants.InstanceConstants;
import io.cattle.platform.core.dao.InstanceDao;
import io.cattle.platform.core.model.Instance;
import io.cattle.platform.core.model.Service;
import io.cattle.platform.core.model.Stack;
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.process.common.handler.AbstractObjectProcessLogic;
import io.cattle.platform.servicediscovery.service.ServiceDiscoveryService;
import io.cattle.platform.util.type.Priority;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.inject.Inject;
import javax.inject.Named;
@Named
public class StackHealthStateUpdateTrigger extends AbstractObjectProcessLogic implements ProcessPostListener, Priority {
public static final String STACK = "stack-reconcile";
@Inject
InstanceDao instanceDao;
@Inject
ServiceDiscoveryService sdService;
@Inject
ConfigItemStatusManager itemManager;
@Override
public String[] getProcessNames() {
return new String[] { HealthcheckConstants.PROCESS_UPDATE_HEALTHY,
HealthcheckConstants.PROCESS_UPDATE_UNHEALTHY, InstanceConstants.PROCESS_STOP,
InstanceConstants.PROCESS_REMOVE, InstanceConstants.PROCESS_START,
"service.*", "stack.*" };
}
@Override
public HandlerResult handle(ProcessState state, ProcessInstance process) {
List<Service> services = new ArrayList<>();
Set<Long> stackIds = new HashSet<>();
if (state.getResource() instanceof Stack) {
stackIds.add(((Stack) state.getResource()).getId());
}
else if (state.getResource() instanceof Service) {
services.add((Service) state.getResource());
} else if (state.getResource() instanceof Instance) {
services.addAll(instanceDao.findServicesFor((Instance) state.getResource()));
}
for (Service service : services) {
stackIds.add(service.getStackId());
}
for (Long stackId : stackIds) {
ConfigUpdateRequest request = ConfigUpdateRequest.forResource(Stack.class,
stackId);
request.addItem(STACK);
request.withDeferredTrigger(true);
itemManager.updateConfig(request);
}
return null;
}
@Override
public int getPriority() {
return Priority.DEFAULT;
}
}