package org.zstack.simulator.storage.primary;
import org.zstack.header.core.Completion;
import org.zstack.header.core.ReturnValueCompletion;
import org.zstack.header.simulator.SimulatorConstant;
import org.zstack.header.storage.primary.*;
import org.zstack.header.storage.primary.VolumeSnapshotCapability.VolumeSnapshotArrangementType;
import org.zstack.header.volume.VolumeInventory;
import org.zstack.storage.primary.PrimaryStorageBase;
import org.zstack.utils.Utils;
import org.zstack.utils.logging.CLogger;
import org.zstack.utils.path.PathUtils;
public class SimulatorPrimaryStorage extends PrimaryStorageBase {
private static final CLogger logger = Utils.getLogger(SimulatorPrimaryStorage.class);
private static final PathUtils putil = Utils.getPathUtil();
public SimulatorPrimaryStorage(PrimaryStorageVO self) {
super(self);
}
@Override
public void deleteHook() {
logger.debug(String.format("SimulatorPrimaryStorage[uuid:%s] gets deleted", self.getUuid()));
}
@Override
public void changeStateHook(PrimaryStorageStateEvent evt, PrimaryStorageState nextState) {
logger.debug(String.format("SimulatorPrimaryStorage[uuid:%s] changes state from %s to %s", self.getUuid(), self.getState(), nextState));
}
@Override
public void attachHook(String clusterUuid, Completion completion) {
logger.debug(String.format("SimulatorPrimaryStorage[uuid:%s] attached", self.getUuid()));
completion.success();
}
@Override
public void detachHook(String clusterUuid, Completion completion) {
logger.debug(String.format("SimulatorPrimaryStorage[uuid:%s] detached from cluster[uuid:%s]", self.getUuid(), clusterUuid));
completion.success();
}
private VolumeInventory instantiateVolume(VolumeInventory vol) {
String root = self.getUrl();
String path = putil.join(root, PrimaryStorageConstant.VM_FOLDER, vol.getUuid() + ".qcow2");
vol.setInstallPath(path);
return vol;
}
private void handle(InstantiateRootVolumeFromTemplateOnPrimaryStorageMsg msg) {
InstantiateVolumeOnPrimaryStorageReply reply = new InstantiateVolumeOnPrimaryStorageReply();
VolumeInventory vol = instantiateVolume(msg.getVolume());
vol.setFormat(SimulatorConstant.SIMULATOR_VOLUME_FORMAT_STRING);
reply.setVolume(vol);
logger.debug(String.format("Successfully created root volume[uuid:%s] on primary storage[uuid:%s]", msg.getVolume().getUuid(),
msg.getPrimaryStorageUuid()));
bus.reply(msg, reply);
}
@Override
protected void handle(DeleteVolumeOnPrimaryStorageMsg msg) {
DeleteVolumeOnPrimaryStorageReply reply = new DeleteVolumeOnPrimaryStorageReply();
logger.debug(String.format("Successfully deleted volume[uuid:%s] from primary storage[uuid:%s]", msg.getVolume().getUuid(), msg.getUuid()));
bus.reply(msg, reply);
}
@Override
protected void handle(InstantiateVolumeOnPrimaryStorageMsg msg) {
if (msg.getClass() == InstantiateRootVolumeFromTemplateOnPrimaryStorageMsg.class) {
handle((InstantiateRootVolumeFromTemplateOnPrimaryStorageMsg) msg);
} else {
InstantiateVolumeOnPrimaryStorageReply reply = new InstantiateVolumeOnPrimaryStorageReply();
VolumeInventory vol = instantiateVolume(msg.getVolume());
vol.setFormat(SimulatorConstant.SIMULATOR_VOLUME_FORMAT_STRING);
reply.setVolume(vol);
logger.debug(String.format("Successfully created data volume[uuid:%s] on primary storage[uuid:%s]", msg.getVolume().getUuid(),
msg.getPrimaryStorageUuid()));
bus.reply(msg, reply);
}
}
@Override
protected void handle(CreateTemplateFromVolumeOnPrimaryStorageMsg msg) {
bus.dealWithUnknownMessage(msg);
}
@Override
protected void handle(DownloadDataVolumeToPrimaryStorageMsg msg) {
String path = putil.join(self.getUrl(), PrimaryStorageConstant.VM_FOLDER, msg.getVolumeUuid() + ".qcow2");
DownloadDataVolumeToPrimaryStorageReply reply = new DownloadDataVolumeToPrimaryStorageReply();
reply.setInstallPath(path);
bus.reply(msg, reply);
}
@Override
protected void handle(DeleteBitsOnPrimaryStorageMsg msg) {
DeleteBitsOnPrimaryStorageReply reply = new DeleteBitsOnPrimaryStorageReply();
bus.reply(msg, reply);
}
@Override
protected void handle(DownloadIsoToPrimaryStorageMsg msg) {
DownloadIsoToPrimaryStorageReply reply = new DownloadIsoToPrimaryStorageReply();
reply.setInstallPath("/xxx.iso");
bus.reply(msg, reply);
}
@Override
protected void handle(DeleteIsoFromPrimaryStorageMsg msg) {
DeleteIsoFromPrimaryStorageReply reply = new DeleteIsoFromPrimaryStorageReply();
bus.reply(msg, reply);
}
@Override
protected void handle(AskVolumeSnapshotCapabilityMsg msg) {
AskVolumeSnapshotCapabilityReply reply = new AskVolumeSnapshotCapabilityReply();
VolumeSnapshotCapability capability = new VolumeSnapshotCapability();
capability.setArrangementType(VolumeSnapshotArrangementType.CHAIN);
capability.setSupport(true);
reply.setCapability(capability);
bus.reply(msg, reply);
}
@Override
protected void handle(SyncVolumeSizeOnPrimaryStorageMsg msg) {
SyncVolumeSizeOnPrimaryStorageReply reply = new SyncVolumeSizeOnPrimaryStorageReply();
reply.setActualSize(0);
bus.reply(msg, reply);
}
@Override
protected void handle(MergeVolumeSnapshotOnPrimaryStorageMsg msg) {
MergeVolumeSnapshotOnPrimaryStorageReply reply = new MergeVolumeSnapshotOnPrimaryStorageReply();
reply.setSuccess(true);
bus.reply(msg, reply);
}
@Override
protected void handle(DeleteSnapshotOnPrimaryStorageMsg msg) {
DeleteSnapshotOnPrimaryStorageReply reply = new DeleteSnapshotOnPrimaryStorageReply();
reply.setSuccess(true);
bus.reply(msg, reply);
}
@Override
protected void handle(RevertVolumeFromSnapshotOnPrimaryStorageMsg msg) {
RevertVolumeFromSnapshotOnPrimaryStorageReply reply = new RevertVolumeFromSnapshotOnPrimaryStorageReply();
reply.setSuccess(true);
bus.reply(msg, reply);
}
@Override
protected void handle(ReInitRootVolumeFromTemplateOnPrimaryStorageMsg msg) {
ReInitRootVolumeFromTemplateOnPrimaryStorageReply reply = new ReInitRootVolumeFromTemplateOnPrimaryStorageReply();
reply.setSuccess(true);
bus.reply(msg, reply);
}
@Override
protected void connectHook(ConnectParam param, Completion completion) {
completion.success();
}
@Override
protected void pingHook(Completion completion) {
completion.success();
}
@Override
protected void syncPhysicalCapacity(ReturnValueCompletion<PhysicalCapacityUsage> completion) {
PhysicalCapacityUsage usage = new PhysicalCapacityUsage();
usage.availablePhysicalSize = self.getCapacity().getAvailablePhysicalCapacity();
usage.totalPhysicalSize = self.getCapacity().getTotalPhysicalCapacity();
completion.success(usage);
}
}