package org.ovirt.engine.core.vdsbroker;
import java.util.Date;
import javax.inject.Inject;
import org.ovirt.engine.core.common.businessentities.VM;
import org.ovirt.engine.core.common.businessentities.VMStatus;
import org.ovirt.engine.core.common.vdscommands.CreateVDSCommandParameters;
import org.ovirt.engine.core.common.vdscommands.VDSCommandType;
import org.ovirt.engine.core.common.vdscommands.VDSReturnValue;
import org.ovirt.engine.core.dao.VmDao;
import org.ovirt.engine.core.vdsbroker.vdsbroker.VDSGenericException;
public class CreateVDSCommand<P extends CreateVDSCommandParameters> extends ManagingVmCommand<P> {
@Inject
private VmDao vmDao;
public CreateVDSCommand(P parameters) {
super(parameters);
}
@Override
protected void executeVmCommand() {
VM vm = getParameters().getVm();
getVDSReturnValue().setReturnValue(vm.getStatus());
if (!resourceManager.addAsyncRunningVm(vm.getId())) {
log.info("Vm Running failed - vm '{}'({}) already running", vm.getName(), vm.getId());
return;
}
vm.setLastStartTime(new Date());
VDSReturnValue vdsReturnValue = null;
try {
vdsReturnValue = resourceManager.runVdsCommand(VDSCommandType.CreateBroker, getParameters());
if (!vdsReturnValue.getSucceeded()) {
handleCommandResult(vdsReturnValue);
resourceManager.removeAsyncRunningVm(getParameters().getVmId());
return;
}
if (!getParameters().isRunInUnknownStatus()) {
if (!vm.isInitialized()) {
vmDao.saveIsInitialized(vm.getId(), true);
}
vm.setStopReason(null);
vm.setInitialized(true);
vm.setRunOnVds(getParameters().getVdsId());
vmManager.update(vm.getDynamicData());
}
} catch (Exception e) {
log.error("Failed to create VM: {}", e.getMessage());
log.error("Exception", e);
if (vdsReturnValue != null && !vdsReturnValue.getSucceeded()) {
resourceManager.removeAsyncRunningVm(getParameters().getVmId());
}
throw new RuntimeException(e);
}
getVDSReturnValue().setReturnValue(vm.getStatus());
}
private void handleCommandResult(VDSReturnValue vdsReturnValue) {
if (!vdsReturnValue.getSucceeded() && vdsReturnValue.getExceptionObject() != null) {
if (vdsReturnValue.getExceptionObject() instanceof VDSGenericException) {
log.error("VDS::create Failed creating vm '{}' in vds = '{}' error = '{}'",
getParameters().getVm().getName(), getParameters().getVdsId(),
vdsReturnValue.getExceptionString());
getVDSReturnValue().setReturnValue(VMStatus.Down);
getVDSReturnValue().setSucceeded(false);
getVDSReturnValue().setExceptionString(vdsReturnValue.getExceptionString());
getVDSReturnValue().setVdsError(vdsReturnValue.getVdsError());
} else {
throw vdsReturnValue.getExceptionObject();
}
}
}
}