package org.zstack.compute.vm;
import org.springframework.beans.factory.annotation.Autowire;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Configurable;
import org.zstack.core.cloudbus.CloudBus;
import org.zstack.core.cloudbus.CloudBusCallBack;
import org.zstack.header.core.workflow.FlowTrigger;
import org.zstack.header.core.workflow.NoRollbackFlow;
import org.zstack.header.message.MessageReply;
import org.zstack.header.vm.VmInstanceConstant;
import org.zstack.header.vm.VmInstanceSpec;
import org.zstack.header.volume.ExpungeVolumeMsg;
import org.zstack.header.volume.VolumeConstant;
import org.zstack.utils.Utils;
import org.zstack.utils.logging.CLogger;
import java.util.Map;
/**
* Created by frank on 11/27/2015.
*/
@Configurable(preConstruction = true, autowire = Autowire.BY_TYPE)
public class VmExpungeRootVolumeFlow extends NoRollbackFlow {
private static final CLogger logger = Utils.getLogger(VmExpungeRootVolumeFlow.class);
@Autowired
protected CloudBus bus;
@Override
public void run(FlowTrigger trigger, Map data) {
final VmInstanceSpec spec = (VmInstanceSpec) data.get(VmInstanceConstant.Params.VmInstanceSpec.toString());
if (spec.getVmInventory().getRootVolumeUuid() == null) {
// the vm is in an intermediate state that has no root volume
trigger.next();
return;
}
new VmExpungeRootVolumeValidator().validate(spec.getVmInventory().getUuid(), spec.getVmInventory().getRootVolumeUuid());
ExpungeVolumeMsg msg = new ExpungeVolumeMsg();
msg.setVolumeUuid(spec.getVmInventory().getRootVolumeUuid());
bus.makeTargetServiceIdByResourceUuid(msg, VolumeConstant.SERVICE_ID, msg.getVolumeUuid());
bus.send(msg, new CloudBusCallBack(trigger) {
@Override
public void run(MessageReply reply) {
if (!reply.isSuccess()) {
logger.warn(String.format("failed to expunge the root volume[uuid:%s] of the vm[uuid:%s, name:%s], %s",
spec.getVmInventory().getRootVolumeUuid(), spec.getVmInventory().getUuid(),
spec.getVmInventory().getName(), reply.getError()));
trigger.fail(reply.getError());
return;
}
trigger.next();
}
});
}
}