package com.netflix.priam.agent.tasks; import com.google.common.annotations.VisibleForTesting; import com.netflix.priam.agent.AgentConfiguration; import com.netflix.priam.agent.process.AgentProcessManager; import com.netflix.priam.agent.storage.Storage; import org.codehaus.jettison.json.JSONArray; import org.codehaus.jettison.json.JSONObject; import static com.netflix.priam.agent.tasks.ProcessTaskConstants.*; /** * Recurring task that starts/stops processes */ public class ProcessTask { private final AgentConfiguration configuration; private final AgentProcessManager processManager; private final Storage storage; @VisibleForTesting public static final String ROW_KEY = "priam_agent_commands"; public ProcessTask(AgentConfiguration configuration, AgentProcessManager processManager, Storage storage) { this.configuration = configuration; this.processManager = processManager; this.storage = storage; } public void execute() throws Exception { String ourValue = storage.getValue(configuration, ROW_KEY, configuration.getThisHostName()); if ( ourValue == null ) { return; } JSONArray tab = new JSONArray(ourValue); for ( int i = 0; i < tab.length(); ++i ) { JSONObject commandObject = tab.getJSONObject(i); String command = commandObject.getString(FIELD_COMMAND); String id = commandObject.getString(FIELD_ID); if ( command.equals(COMMAND_START) ) { String name = commandObject.getString(FIELD_NAME); JSONArray argumentsTab = commandObject.getJSONArray(FIELD_ARGUMENTS); String[] arguments = new String[argumentsTab.length()]; for ( int j = 0; j < argumentsTab.length(); ++j ) { arguments[j] = argumentsTab.getString(j); } processManager.startProcess(name, id, arguments); } else if ( command.equals(COMMAND_STOP) ) { processManager.stopProcess(id); } else { throw new RuntimeException("Unsupported command: " + command); } } } }