public void ImpXvaFile() { log.InfoFormat("开始导入WinCenter xva文件:{0}", ConnectManager.FilePath); string vmRef = GetVmRef(applyFile()); if (string.IsNullOrEmpty(vmRef)) { return; } log.InfoFormat("WinCenter xva文件导入完成"); try { log.InfoFormat("导入后的WinCenter VM:[{0}]", vmRef); List <XenRef <VIF> > vifRefs = VM.get_VIFs(ConnectManager.session, vmRef); foreach (XenRef <VIF> vifRef in vifRefs) { log.InfoFormat("删除原有的VIF:[{0}]", vifRef.opaque_ref); VIF.destroy(ConnectManager.session, vifRef); } HTTPHelper.progressInfo = "删除原有VIF"; HTTPHelper.progressPercent += 1; bool isTemplate = VM.get_is_a_template(ConnectManager.session, vmRef); if (isTemplate) { log.InfoFormat("导入的xva是模板,删除VM:[{0}]", vmRef); VM.destroy(ConnectManager.session, vmRef); return; } VIF newVif = ConnectManager.VIF; newVif.VM = new XenRef <VM>(vmRef); XenRef <VIF> newVifRef = VIF.create(ConnectManager.session, newVif); log.InfoFormat("重新创建VIF:[{0}]", newVifRef.opaque_ref); string mac = VIF.get_MAC(ConnectManager.session, newVifRef); log.InfoFormat("新的MAC地址为:[{0}]", mac); string newVifUuid = VIF.get_uuid(ConnectManager.session, newVifRef); log.InfoFormat("新的VIF UUID为:[{0}]", newVifUuid); HTTPHelper.progressInfo = "创建新的VIF"; HTTPHelper.progressPercent += 1; DefaultVMName(ConnectManager.VMName); log.InfoFormat("检查WinCenter VM的名称,VM名称为:{0}", ConnectManager.VMName); VM.set_name_label(ConnectManager.session, vmRef, ConnectManager.VMName); HTTPHelper.progressInfo = "检查VM名称"; HTTPHelper.progressPercent += 1; /** * BUG:AE方式设置IP之后,由于ISO没有弹出,在控制台修改IP重启以后,AE会重新设置ISO配置中的IP * 故不再使用AE这种方式,而是改成在VM启动后使用xenstore-write方式动态修改IP */ //初始化AE //initVmByAe(vmRef, mac); XenRef <Host> hostRef = Host.get_by_uuid(ConnectManager.session, ConnectManager.TargetHost.uuid); log.InfoFormat("设置WinCenter VM的所属主机:[{0}]", ConnectManager.TargetHostName); HTTPHelper.progressInfo = "设置主机"; VM.set_affinity(ConnectManager.session, vmRef, hostRef); HTTPHelper.progressPercent += 1; setAutoPoweron(vmRef); HTTPHelper.progressInfo = "启动VM"; VM.start(ConnectManager.session, vmRef, false, false); Thread.Sleep(2 * 60 * 1000); //休眠2分钟,等待虚拟机启动完成 HTTPHelper.progressPercent += 2; log.InfoFormat("启动WinCenter VM:[{0}]成功", vmRef); //去掉AE方式设置IP,VM启动后使用xenstore-write方式动态设置IP HTTPHelper.progressInfo = "设置网络信息"; setActiveVifIp(newVifUuid); HTTPHelper.progressPercent = 100; log.InfoFormat("设置IP信息成功"); } catch (Exception ex) { log.ErrorFormat("安装失败: {0}", ex.Message); log.ErrorFormat("开始删除WinCenter VM:[{0}]", vmRef); try { vm_power_state power_state = VM.get_power_state(ConnectManager.session, vmRef); if (!vm_power_state.Halted.ToString().Equals(power_state.ToString())) { VM.shutdown(ConnectManager.session, vmRef); } } catch (Exception ex1) { log.ErrorFormat("WinCenter VM关机失败:{0}", ex1.Message); } try { VM.destroy(ConnectManager.session, vmRef); } catch (Exception ex1) { log.ErrorFormat("删除WinCenter VM失败:{0}", ex1.Message); throw ex1; } throw; } }