package io.cattle.platform.process.agent;
import io.cattle.platform.archaius.util.ArchaiusUtil;
import io.cattle.platform.configitem.request.ConfigUpdateRequest;
import io.cattle.platform.configitem.request.util.ConfigUpdateRequestUtils;
import io.cattle.platform.configitem.version.ConfigItemStatusManager;
import io.cattle.platform.core.constants.AgentConstants;
import io.cattle.platform.core.model.Agent;
import io.cattle.platform.engine.handler.AbstractProcessLogic;
import io.cattle.platform.engine.handler.HandlerResult;
import io.cattle.platform.engine.handler.ProcessPostListener;
import io.cattle.platform.engine.handler.ProcessPreListener;
import io.cattle.platform.engine.process.ProcessInstance;
import io.cattle.platform.engine.process.ProcessState;
import io.cattle.platform.json.JsonMapper;
import javax.inject.Inject;
import javax.inject.Named;
import com.netflix.config.DynamicStringListProperty;
@Named
public class AgentScriptsApply extends AbstractProcessLogic implements ProcessPreListener, ProcessPostListener {
private static final DynamicStringListProperty ITEMS = ArchaiusUtil.getList("agent.config.items");
ConfigItemStatusManager statusManager;
JsonMapper jsonMapper;
@Override
public String[] getProcessNames() {
return new String[] { AgentConstants.PROCESS_ACTIVATE, AgentConstants.PROCESS_RECONNECT };
}
@Override
public HandlerResult handle(ProcessState state, ProcessInstance process) {
Agent agent = (Agent) state.getResource();
if (!agent.getManagedConfig()) {
return null;
}
ConfigUpdateRequest request = ConfigUpdateRequestUtils.getRequest(jsonMapper, state, this);
switch (state.getPhase()) {
case PRE_LISTENERS:
request = before(request, agent);
break;
case POST_LISTENERS:
after(request, agent);
break;
default:
}
ConfigUpdateRequestUtils.setRequest(request, state, this);
return null;
}
protected ConfigUpdateRequest before(ConfigUpdateRequest request, Agent agent) {
if (request == null) {
request = ConfigUpdateRequest.forResource(Agent.class, agent.getId());
for (String item : ITEMS.get()) {
request.addItem(item).withIncrement(false).setCheckInSyncOnly(true);
}
}
statusManager.updateConfig(request);
return request;
}
protected void after(ConfigUpdateRequest request, Agent agent) {
if (request == null) {
return;
}
// We don't want to wait anymore, we just assume it will eventually happen in the background
// statusManager.waitFor(request);
}
public ConfigItemStatusManager getStatusManager() {
return statusManager;
}
@Inject
public void setStatusManager(ConfigItemStatusManager statusManager) {
this.statusManager = statusManager;
}
public JsonMapper getJsonMapper() {
return jsonMapper;
}
@Inject
public void setJsonMapper(JsonMapper jsonMapper) {
this.jsonMapper = jsonMapper;
}
}