@Override public void beforeStartVmOnKvm(KVMHostInventory host, VmInstanceSpec spec, StartVmCmd cmd) { VolumeInventory root = spec.getDestRootVolume(); if (!root.getInstallPath().startsWith(VolumeTO.FUSIONSTOR)) { return; } cmd.getAddons().put("qemuPath", QEMUPATH); cmd.setRootVolume(convertVolumeToFusionstorIfNeeded(root, cmd.getRootVolume())); List<VolumeTO> dtos = new ArrayList<VolumeTO>(); for (VolumeTO to : cmd.getDataVolumes()) { VolumeInventory dvol = null; for (VolumeInventory vol : spec.getDestDataVolumes()) { if (vol.getUuid().equals(to.getVolumeUuid())) { dvol = vol; break; } } dtos.add(convertVolumeToFusionstorIfNeeded(dvol, to)); } cmd.setDataVolumes(dtos); List<CdRomTO> cdRomTOS = CollectionUtils.transformToList(cmd.getCdRoms(), new Function<CdRomTO, CdRomTO>() { @Override public CdRomTO call(CdRomTO arg) { return convertCdRomToFusionstorIfNeeded(arg); } }); cmd.setCdRoms(cdRomTOS); }
@AsyncThread private void createVm(HttpEntity<String> entity) { StartVmCmd cmd = JSONObjectUtil.toObject(entity.getBody(), StartVmCmd.class); StartVmResponse rsp = new StartVmResponse(); if (config.startVmSuccess) { if (config.startVmFailureChance != 0) { if (Math.random() <= config.startVmFailureChance) { rsp.setError("on purpose"); rsp.setSuccess(false); } } else { logger.debug(String.format("successfully start vm on kvm host, %s", entity.getBody())); synchronized (config) { config.vms.put(cmd.getVmInstanceUuid(), KvmVmState.Running); logger.debug(String.format("current running vm[%s]", config.vms.size())); } config.startVmCmd = cmd; } } else { String err = "fail start vm on purpose"; rsp.setError(err); rsp.setSuccess(false); } replyer.reply(entity, rsp); }
private void startVm(final VmInstanceSpec spec, final NeedReplyMessage msg, final NoErrorCompletion completion) { checkStateAndStatus(); final StartVmCmd cmd = new StartVmCmd(); cmd.setCpuNum(cpuNum); cmd.setSocketNum(socket); cmd.setCpuOnSocket(cpuOnSocket); cmd.setVmName(spec.getVmInventory().getName()); cmd.setVmInstanceUuid(spec.getVmInventory().getUuid()); cmd.setCpuSpeed(spec.getVmInventory().getCpuSpeed()); cmd.setMemory(spec.getVmInventory().getMemorySize()); cmd.setMaxMemory(self.getCapacity().getTotalPhysicalMemory()); cmd.setClock(ImagePlatform.isType(platform, ImagePlatform.Windows, ImagePlatform.WindowsVirtio) ? "localtime" : "utc"); cmd.setVideoType(VmGlobalConfig.VM_VIDEO_TYPE.value(String.class)); cmd.setInstanceOfferingOnlineChange(VmSystemTags.INSTANCEOFFERING_ONLIECHANGE.getTokenByResourceUuid(spec.getVmInventory().getUuid(), VmSystemTags.INSTANCEOFFERING_ONLINECHANGE_TOKEN) != null); cmd.setKvmHiddenState(VmGlobalConfig.KVM_HIDDEN_STATE.value(Boolean.class)); cmd.setSpiceStreamingMode(VmGlobalConfig.VM_SPICE_STREAMING_MODE.value(String.class)); cmd.setEmulateHyperV(VmGlobalConfig.EMULATE_HYPERV.value(Boolean.class)); cmd.setAdditionalQmp(VmGlobalConfig.ADDITIONAL_QMP.value(Boolean.class)); cmd.setApplianceVm(spec.getVmInventory().getType().equals("ApplianceVm")); cmd.setSystemSerialNumber(makeAndSaveVmSystemSerialNumber(spec.getVmInventory().getUuid())); String machineType = VmSystemTags.MACHINE_TYPE.getTokenByResourceUuid(cmd.getVmInstanceUuid(), VmInstanceVO.class, VmSystemTags.MACHINE_TYPE_TOKEN); cmd.setMachineType(StringUtils.isNotEmpty(machineType) ? machineType : "pc"); if (VmMachineType.q35.toString().equals(machineType)) { cmd.setPciePortNums(VmGlobalConfig.PCIE_PORT_NUMS.value(Integer.class)); cmd.setNestedVirtualization(nestedVirtualization);
@Override public void beforeStartVmOnKvm(KVMHostInventory host, VmInstanceSpec spec, StartVmCmd cmd) { cmd.setRootVolume(convertVolumeToCephIfNeeded(spec.getDestRootVolume(), cmd.getRootVolume())); List<VolumeTO> dtos = new ArrayList<VolumeTO>(); for (VolumeTO to : cmd.getDataVolumes()) { VolumeInventory dvol = null; for (VolumeInventory vol : spec.getDestDataVolumes()) { if (vol.getUuid().equals(to.getVolumeUuid())) { dvol = vol; break; } } dtos.add(convertVolumeToCephIfNeeded(dvol, to)); } cmd.setDataVolumes(dtos); List<CdRomTO> cdRomTOS = CollectionUtils.transformToList(cmd.getCdRoms(), new Function<CdRomTO, CdRomTO>() { @Override public CdRomTO call(CdRomTO arg) { return convertCdRomToCephIfNeeded(arg); } }); cmd.setCdRoms(cdRomTOS); CephPrimaryStorageVO cephPrimaryStorageVO = dbf.findByUuid(spec.getDestRootVolume().getPrimaryStorageUuid(), CephPrimaryStorageVO.class); if (cephPrimaryStorageVO != null && !CephSystemTags.NO_CEPHX.hasTag(cephPrimaryStorageVO.getUuid())) { cmd.getAddons().put(CephConstants.CEPH_SCECRET_KEY, cephPrimaryStorageVO.getUserKey()); cmd.getAddons().put(CephConstants.CEPH_SECRECT_UUID, CephSystemTags.KVM_SECRET_UUID.getTokenByResourceUuid(cephPrimaryStorageVO.getUuid(), CephSystemTags.KVM_SECRET_UUID_TOKEN)); } }
@Override public void addAddon(KVMHostInventory host, VmInstanceSpec spec, KVMAgentCommands.StartVmCmd cmd) { if (!spec.getVmInventory().getType().equals(ApplianceVmConstant.APPLIANCE_VM_TYPE)) { return; } KVMAddons.Channel chan = new KVMAddons.Channel(); chan.setSocketPath(makeChannelSocketPath(spec.getVmInventory().getUuid())); chan.setTargetName(String.format("applianceVm.vport")); cmd.getAddons().put(chan.NAME, chan); logger.debug(String.format("make kvm channel device[path:%s, target:%s]", chan.getSocketPath(), chan.getTargetName())); }
private void addons(final VmInstanceSpec spec, StartVmCmd cmd) { KVMAddons.Channel chan = new KVMAddons.Channel(); chan.setSocketPath(makeChannelSocketPath(spec.getVmInventory().getUuid())); chan.setTargetName("org.qemu.guest_agent.0"); cmd.getAddons().put(KVMAddons.Channel.NAME, chan); logger.debug(String.format("make kvm channel device[path:%s, target:%s]", chan.getSocketPath(), chan.getTargetName())); }