package com.sequenceiq.it.spark.salt;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.sequenceiq.cloudbreak.cloud.model.CloudVmMetaDataStatus;
import com.sequenceiq.cloudbreak.cloud.model.InstanceStatus;
import com.sequenceiq.cloudbreak.orchestrator.salt.domain.ApplyResponse;
import com.sequenceiq.cloudbreak.orchestrator.salt.domain.NetworkInterfaceResponse;
import com.sequenceiq.it.spark.ITResponse;
import spark.Request;
import spark.Response;
public class SaltApiRunPostResponse extends ITResponse {
private static final Logger LOGGER = LoggerFactory.getLogger(SaltApiRunPostResponse.class);
private Map<String, CloudVmMetaDataStatus> instanceMap;
private ObjectMapper objectMapper = new ObjectMapper();
public SaltApiRunPostResponse(Map<String, CloudVmMetaDataStatus> instanceMap) {
this.instanceMap = instanceMap;
objectMapper.setVisibility(objectMapper.getVisibilityChecker().withGetterVisibility(JsonAutoDetect.Visibility.NONE));
}
@Override
public Object handle(Request request, Response response) throws Exception {
if (request.body().contains("grains.append")) {
return grainsResponse();
}
if (request.body().contains("grains.remove")) {
return grainsResponse();
}
if (request.body().contains("network.interface_ip")) {
return networkInterfaceIp();
}
if (request.body().contains("saltutil.sync_grains")) {
return saltUtilSyncGrainsResponse();
}
if (request.body().contains("mine.update")) {
return saltUtilSyncGrainsResponse();
}
if (request.body().contains("state.highstate")) {
return stateHighState();
}
if (request.body().contains("jobs.active")) {
return jobsActive();
}
if (request.body().contains("jobs.lookup_jid")) {
return jobsLookupJid();
}
if (request.body().contains("state.apply")) {
return stateApply();
}
if (request.body().contains("key.delete")) {
return "";
}
LOGGER.error("no response for this SALT RUN request: " + request.body());
throw new IllegalStateException("no response for this SALT RUN request: " + request.body());
}
protected Object stateApply() {
return responseFromJsonFile("saltapi/state_apply_response.json");
}
protected Object jobsLookupJid() {
return responseFromJsonFile("saltapi/lookup_jid_response.json");
}
protected Object jobsActive() {
return responseFromJsonFile("saltapi/runningjobs_response.json");
}
protected Object stateHighState() {
return responseFromJsonFile("saltapi/high_state_response.json");
}
protected Object networkInterfaceIp() throws JsonProcessingException {
NetworkInterfaceResponse networkInterfaceResponse = new NetworkInterfaceResponse();
List<Map<String, String>> result = new ArrayList<>();
for (String instanceId : instanceMap.keySet()) {
CloudVmMetaDataStatus cloudVmMetaDataStatus = instanceMap.get(instanceId);
if (InstanceStatus.STARTED == cloudVmMetaDataStatus.getCloudVmInstanceStatus().getStatus()) {
String privateIp = cloudVmMetaDataStatus.getMetaData().getPrivateIp();
Map<String, String> networkHashMap = new HashMap<>();
networkHashMap.put("host-" + privateIp.replace(".", "-"), privateIp);
result.add(networkHashMap);
}
}
networkInterfaceResponse.setResult(result);
return getObjectMapper().writeValueAsString(networkInterfaceResponse);
}
protected Object saltUtilSyncGrainsResponse() throws JsonProcessingException {
ApplyResponse applyResponse = new ApplyResponse();
ArrayList<Map<String, Object>> responseList = new ArrayList<>();
Map<String, Object> hostMap = new HashMap<>();
for (String instance : instanceMap.keySet()) {
CloudVmMetaDataStatus cloudVmMetaDataStatus = instanceMap.get(instance);
if (InstanceStatus.STARTED == cloudVmMetaDataStatus.getCloudVmInstanceStatus().getStatus()) {
String privateIp = cloudVmMetaDataStatus.getMetaData().getPrivateIp();
hostMap.put("host-" + privateIp.replace(".", "-"), privateIp);
}
}
responseList.add(hostMap);
applyResponse.setResult(responseList);
return getObjectMapper().writeValueAsString(applyResponse);
}
protected Object grainsResponse() throws JsonProcessingException {
ApplyResponse applyResponse = new ApplyResponse();
ArrayList<Map<String, Object>> responseList = new ArrayList<>();
Map<String, Object> hostMap = new HashMap<>();
for (String instance : instanceMap.keySet()) {
CloudVmMetaDataStatus cloudVmMetaDataStatus = instanceMap.get(instance);
if (InstanceStatus.STARTED == cloudVmMetaDataStatus.getCloudVmInstanceStatus().getStatus()) {
String privateIp = cloudVmMetaDataStatus.getMetaData().getPrivateIp();
hostMap.put("host-" + privateIp.replace(".", "-"), privateIp);
}
}
responseList.add(hostMap);
applyResponse.setResult(responseList);
return getObjectMapper().writeValueAsString(applyResponse);
}
@Override
public ObjectMapper getObjectMapper() {
return objectMapper;
}
}