package org.zstack.storage.primary.smp;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.zstack.header.rest.RESTConstant;
import org.zstack.header.rest.RESTFacade;
import org.zstack.storage.primary.smp.KvmBackend.*;
import org.zstack.utils.gson.JSONObjectUtil;
/**
* Created by xing5 on 2016/3/27.
*/
@Controller
public class SMPPrimaryStorageSimulator {
@Autowired
private RESTFacade restf;
@Autowired
private SMPPrimaryStorageSimulatorConfig config;
public void reply(HttpEntity<String> entity, Object rsp) {
String taskUuid = entity.getHeaders().getFirst(RESTConstant.TASK_UUID);
String callbackUrl = entity.getHeaders().getFirst(RESTConstant.CALLBACK_URL);
String rspBody = JSONObjectUtil.toJsonString(rsp);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.setContentLength(rspBody.length());
headers.set(RESTConstant.TASK_UUID, taskUuid);
HttpEntity<String> rreq = new HttpEntity<String>(rspBody, headers);
restf.getRESTTemplate().exchange(callbackUrl, HttpMethod.POST, rreq, String.class);
}
@RequestMapping(value=KvmBackend.CONNECT_PATH, method= RequestMethod.POST)
public @ResponseBody
String connect(HttpEntity<String> entity) {
ConnectCmd cmd = JSONObjectUtil.toObject(entity.getBody(), ConnectCmd.class);
config.connectCmds.add(cmd);
AgentRsp rsp = new AgentRsp();
rsp.totalCapacity = config.totalCapacity;
rsp.availableCapacity = config.availableCapcacity;
reply(entity, rsp);
return null;
}
@RequestMapping(value=KvmBackend.CREATE_VOLUME_FROM_CACHE_PATH, method= RequestMethod.POST)
public @ResponseBody
String createRootVolume(HttpEntity<String> entity) {
CreateVolumeFromCacheCmd cmd = JSONObjectUtil.toObject(entity.getBody(), CreateVolumeFromCacheCmd.class);
config.createVolumeFromCacheCmds.add(cmd);
reply(entity, new AgentRsp());
return null;
}
@RequestMapping(value=KvmBackend.DELETE_BITS_PATH, method= RequestMethod.POST)
public @ResponseBody
String deleteBits(HttpEntity<String> entity) {
DeleteBitsCmd cmd = JSONObjectUtil.toObject(entity.getBody(), DeleteBitsCmd.class);
config.deleteBitsCmds.add(cmd);
reply(entity, new AgentRsp());
return null;
}
@RequestMapping(value=KvmBackend.CREATE_TEMPLATE_FROM_VOLUME_PATH, method= RequestMethod.POST)
public @ResponseBody
String createTemplateFromVolume(HttpEntity<String> entity) {
CreateTemplateFromVolumeCmd cmd = JSONObjectUtil.toObject(entity.getBody(), CreateTemplateFromVolumeCmd.class);
config.createTemplateFromVolumeCmds.add(cmd);
reply(entity, new AgentRsp());
return null;
}
@RequestMapping(value=KvmBackend.UPLOAD_BITS_TO_SFTP_BACKUPSTORAGE_PATH, method= RequestMethod.POST)
public @ResponseBody
String uploadBitsToSftp(HttpEntity<String> entity) {
SftpUploadBitsCmd cmd = JSONObjectUtil.toObject(entity.getBody(), SftpUploadBitsCmd.class);
config.uploadBitsCmds.add(cmd);
reply(entity, new AgentRsp());
return null;
}
@RequestMapping(value=KvmBackend.DOWNLOAD_BITS_FROM_SFTP_BACKUPSTORAGE_PATH, method= RequestMethod.POST)
public @ResponseBody
String downloadBitsFromSftp(HttpEntity<String> entity) {
SftpDownloadBitsCmd cmd = JSONObjectUtil.toObject(entity.getBody(), SftpDownloadBitsCmd.class);
config.downloadBitsCmds.add(cmd);
reply(entity, new AgentRsp());
return null;
}
@RequestMapping(value=KvmBackend.REVERT_VOLUME_FROM_SNAPSHOT_PATH, method= RequestMethod.POST)
public @ResponseBody
String revertVolume(HttpEntity<String> entity) {
RevertVolumeFromSnapshotCmd cmd = JSONObjectUtil.toObject(entity.getBody(), RevertVolumeFromSnapshotCmd.class);
config.revertVolumeFromSnapshotCmds.add(cmd);
RevertVolumeFromSnapshotRsp rsp = new RevertVolumeFromSnapshotRsp();
rsp.newVolumeInstallPath = "new_path";
reply(entity, rsp);
return null;
}
@RequestMapping(value=KvmBackend.MERGE_SNAPSHOT_PATH, method= RequestMethod.POST)
public @ResponseBody
String mergeSnapshot(HttpEntity<String> entity) {
MergeSnapshotCmd cmd = JSONObjectUtil.toObject(entity.getBody(), MergeSnapshotCmd.class);
config.mergeSnapshotCmds.add(cmd);
MergeSnapshotRsp rsp = new MergeSnapshotRsp();
Long size = config.mergeSnapshotCmdSize.get(cmd.volumeUuid);
rsp.size = size == null ? 0 : size;
Long asize = config.mergeSnapshotCmdActualSize.get(cmd.volumeUuid);
rsp.actualSize = asize == null ? 0 : asize;
reply(entity, rsp);
return null;
}
@RequestMapping(value=KvmBackend.GET_VOLUME_SIZE_PATH, method= RequestMethod.POST)
public @ResponseBody
String getVolumeSize(HttpEntity<String> entity) {
GetVolumeSizeCmd cmd = JSONObjectUtil.toObject(entity.getBody(), GetVolumeSizeCmd.class);
config.getVolumeSizeCmds.add(cmd);
GetVolumeSizeRsp rsp = new GetVolumeSizeRsp();
Long asize = config.getVolumeSizeCmdActualSize.get(cmd.volumeUuid);
rsp.actualSize = asize == null ? 0 : asize;
Long size = config.getVolumeSizeCmdSize.get(cmd.volumeUuid);
rsp.size = size == null ? 0 : size;
reply(entity, rsp);
return null;
}
@RequestMapping(value=KvmBackend.OFFLINE_MERGE_SNAPSHOT_PATH, method= RequestMethod.POST)
public @ResponseBody
String offlineMerge(HttpEntity<String> entity) {
OfflineMergeSnapshotCmd cmd = JSONObjectUtil.toObject(entity.getBody(), OfflineMergeSnapshotCmd.class);
config.offlineMergeSnapshotCmds.add(cmd);
reply(entity, new AgentRsp());
return null;
}
@RequestMapping(value=KvmBackend.CREATE_EMPTY_VOLUME_PATH, method= RequestMethod.POST)
public @ResponseBody
String createEmptyVolume(HttpEntity<String> entity) {
CreateEmptyVolumeCmd cmd = JSONObjectUtil.toObject(entity.getBody(), CreateEmptyVolumeCmd.class);
config.createEmptyVolumeCmds.add(cmd);
reply(entity, new AgentRsp());
return null;
}
@RequestMapping(value=KvmBackend.CHECK_BITS_PATH, method= RequestMethod.POST)
public @ResponseBody
String checkBits(HttpEntity<String> entity) {
CheckBitsCmd cmd = JSONObjectUtil.toObject(entity.getBody(), CheckBitsCmd.class);
config.checkBitsCmds.add(cmd);
CheckBitsRsp rsp = new CheckBitsRsp();
rsp.existing = true;
reply(entity, rsp);
return null;
}
}