package org.zstack.storage.primary.smp;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.zstack.core.cloudbus.CloudBus;
import org.zstack.core.cloudbus.CloudBusCallBack;
import org.zstack.core.db.DatabaseFacade;
import org.zstack.header.core.workflow.Flow;
import org.zstack.header.core.workflow.FlowTrigger;
import org.zstack.header.core.workflow.NoRollbackFlow;
import org.zstack.header.message.MessageReply;
import org.zstack.header.storage.primary.PrimaryStorageConstant;
import org.zstack.header.storage.primary.PrimaryStorageVO;
import org.zstack.kvm.KVMConstant;
import org.zstack.kvm.KVMHostConnectExtensionPoint;
import org.zstack.kvm.KVMHostConnectedContext;
import javax.persistence.TypedQuery;
import java.util.List;
import java.util.Map;
/**
* Created by xing5 on 2016/3/26.
*/
public class KvmFactory implements HypervisorFactory, KVMHostConnectExtensionPoint {
@Autowired
private DatabaseFacade dbf;
@Autowired
private CloudBus bus;
@Override
public String getHypervisorType() {
return KVMConstant.KVM_HYPERVISOR_TYPE;
}
@Override
public HypervisorBackend getHypervisorBackend(PrimaryStorageVO vo) {
return new KvmBackend(vo);
}
@Transactional(readOnly = true)
private String findLocalStorageUuidByHostUuid(String clusterUuid) {
String sql = "select pri.uuid from PrimaryStorageVO pri, PrimaryStorageClusterRefVO ref where pri.uuid = ref.primaryStorageUuid and ref.clusterUuid = :cuuid and pri.type = :ptype";
TypedQuery<String> q = dbf.getEntityManager().createQuery(sql, String.class);
q.setParameter("cuuid", clusterUuid);
q.setParameter("ptype", SMPConstants.SMP_TYPE);
List<String> ret = q.getResultList();
return ret.isEmpty() ? null : ret.get(0);
}
@Override
public Flow createKvmHostConnectingFlow(final KVMHostConnectedContext context) {
return new NoRollbackFlow() {
String __init__ = "init-smp-primary-storage";
@Override
public void run(final FlowTrigger trigger, Map data) {
String psUuid = findLocalStorageUuidByHostUuid(context.getInventory().getClusterUuid());
if (psUuid == null) {
trigger.next();
return;
}
InitKvmHostMsg msg = new InitKvmHostMsg();
msg.setHypervisorType(context.getInventory().getHypervisorType());
msg.setHostUuid(context.getInventory().getUuid());
msg.setPrimaryStorageUuid(psUuid);
bus.makeTargetServiceIdByResourceUuid(msg, PrimaryStorageConstant.SERVICE_ID, psUuid);
bus.send(msg, new CloudBusCallBack(trigger) {
@Override
public void run(MessageReply reply) {
if (!reply.isSuccess()) {
trigger.fail(reply.getError());
} else {
trigger.next();
}
}
});
}
};
}
}