private EnvelopeType _export(Session xenSession, string targetPath, string ovfname, string vmUuid) { EnvelopeType ovfEnv; try { auditLog.DebugFormat("Export: {0}, {1}", ovfname, targetPath); #region GET VM Reference XenRef <VM> vmRef = null; try { vmRef = VM.get_by_uuid(xenSession, vmUuid); } catch { log.WarnFormat("VM not found as uuid: {0}, trying as name-label", vmUuid); vmRef = null; } if (vmRef == null) { try { List <XenRef <VM> > vmRefs = VM.get_by_name_label(xenSession, vmUuid); vmRef = vmRefs[0]; traceLog.DebugFormat("{0} VM(s) found by label {1}", vmRefs.Count, vmUuid); if (vmRefs.Count > 1) { log.WarnFormat("Only exporting FIRST VM with name {0}", vmUuid); } } catch { log.ErrorFormat(Messages.ERROR_VM_NOT_FOUND, vmUuid); throw; } } #endregion VM vm = VM.get_record(xenSession, vmRef); if (vm.power_state != vm_power_state.Halted && vm.power_state != vm_power_state.Suspended) { var message = string.Format(Messages.ERROR_VM_NOT_HALTED, vm.Name()); OnUpdate(new XenOvfTranportEventArgs(XenOvfTranportEventType.ExportProgress, "Export", message)); log.Info(message); throw new Exception(message); } #region CREATE ENVELOPE / ADD VIRTUAL SYSTEM ovfEnv = OVF.CreateEnvelope(ovfname); string vsId = OVF.AddVirtualSystem(ovfEnv, vm.name_label); string vhsId = OVF.AddVirtualHardwareSection(ovfEnv, vsId); #endregion #region TRY TO ID OS XenRef <VM_guest_metrics> vmgmRef = VM.get_guest_metrics(xenSession, vmRef); if (!vmgmRef.opaque_ref.ToUpper().Contains("NULL")) { VM_guest_metrics vmgm = VM_guest_metrics.get_record(xenSession, vmgmRef); //VM_metrics vmm = VM_metrics.get_record(xenSession, VM.get_metrics(xenSession, vmRef)); if (vmgm.os_version != null && vmgm.os_version.Count > 0) { foreach (string key in vmgm.os_version.Keys) { if (key.ToLower().Equals("name")) { ushort osid = ValueMaps.OperatingSystem(vmgm.os_version[key]); if (osid == 0xFFFF) { osid = 1; } // change to OTHER since search failed. string version = OVF.GetContentMessage("SECTION_OPERATINGSYSTEM_INFO"); if (vmgm.os_version.ContainsKey("major") && vmgm.os_version.ContainsKey("minor")) { version = string.Format(OVF.GetContentMessage("SECTION_OPERATINGSYSTEM_VERSION"), vmgm.os_version["major"], vmgm.os_version["minor"]); } string osname = (vmgm.os_version[key].Split(new [] { '|' }))[0]; OVF.UpdateOperatingSystemSection(ovfEnv, vsId, osname, version, osid); break; } } } } #endregion #region ADD VSSD // IS PV'd? for VirtualSystemType identification. string typeformat = @"{0}-{1}-{2}"; string vmtype = string.Format(typeformat, "hvm", "3.0", "unknown"); if (vm.HVM_boot_policy != null && vm.HVM_boot_policy == Properties.Settings.Default.xenBootOptions) { if (!string.IsNullOrEmpty(vm.domarch)) { vmtype = string.Format(typeformat, vm.domarch, "3.0", "unknown"); } } else { if (!string.IsNullOrEmpty(vm.domarch)) { vmtype = string.Format(typeformat, "xen", "3.0", vm.domarch); } else { vmtype = string.Format(typeformat, "xen", "3.0", "unknown"); } } OVF.AddVirtualSystemSettingData(ovfEnv, vsId, vhsId, vm.name_label, OVF.GetContentMessage("VSSD_CAPTION"), vm.name_description, Guid.NewGuid().ToString(), vmtype); #endregion #region ADD CPUS OVF.SetCPUs(ovfEnv, vsId, (ulong)vm.VCPUs_max); #endregion #region ADD MEMORY OVF.SetMemory(ovfEnv, vsId, (ulong)(vm.memory_dynamic_max / MB), "MB"); #endregion #region ADD NETWORKS List <XenRef <VIF> > vifs = VM.get_VIFs(xenSession, vmRef); foreach (XenRef <VIF> vifref in vifs) { VIF vif = VIF.get_record(xenSession, vifref); XenRef <Network> netRef = vif.network; Network net = Network.get_record(xenSession, netRef); // Why is the following call reference using name_label where other references use uuid? OVF.AddNetwork(ovfEnv, vsId, net.uuid, net.name_label, net.name_description, vif.MAC); } #endregion #region SET STARTUP OPTIONS OVF.AddStartupSection(ovfEnv, true, vsId, vm.order, vm.start_delay, vm.shutdown_delay); #endregion #region GET AND EXPORT DISKS using iSCSI List <XenRef <VBD> > vbdlist = VM.get_VBDs(xenSession, vmRef); _vdiRefs.Clear(); int diskIndex = 0; foreach (XenRef <VBD> vbdref in vbdlist) { VBD vbd = VBD.get_record(xenSession, vbdref); if (vbd.type == vbd_type.CD) { string rasdid = OVF.AddCDROM(ovfEnv, vsId, vbd.uuid, OVF.GetContentMessage("RASD_16_CAPTION"), OVF.GetContentMessage("RASD_16_DESCRIPTION")); OVF.SetTargetDeviceInRASD(ovfEnv, vsId, rasdid, vbd.userdevice); } else { try { XenRef <VDI> vdi = VBD.get_VDI(xenSession, vbdref); if (vdi != null && !string.IsNullOrEmpty(vdi.opaque_ref) && !(vdi.opaque_ref.ToLower().Contains("null"))) { _vdiRefs.Add(vdi); VDI lVdi = VDI.get_record(xenSession, vdi); string destinationFilename = Path.Combine(targetPath, string.Format(@"{0}.vhd", lVdi.uuid)); string diskid = Guid.NewGuid().ToString(); string diskName = lVdi.name_label; if (diskName == null) { diskName = string.Format("{0} {1}", OVF.GetContentMessage("RASD_19_CAPTION"), diskIndex); } OVF.AddDisk(ovfEnv, vsId, diskid, Path.GetFileName(destinationFilename), vbd.bootable, diskName, lVdi.name_description, (ulong)lVdi.physical_utilisation, (ulong)lVdi.virtual_size); OVF.SetTargetDeviceInRASD(ovfEnv, vsId, diskid, vbd.userdevice); diskIndex++; } } catch (Exception ex) { log.InfoFormat("Export: VBD Skipped: {0}: {1}", vbdref, ex.Message); } } } #endregion if (!MetaDataOnly) { _copydisks(ovfEnv, ovfname, targetPath); } #region ADD XEN SPECIFICS if (vm.HVM_boot_params != null) { Dictionary <string, string> _params = vm.HVM_boot_params; foreach (string key in _params.Keys) { if (key.ToLower().Equals("order")) { OVF.AddOtherSystemSettingData(ovfEnv, vsId, "HVM_boot_params", _params[key], OVF.GetContentMessage("OTHER_SYSTEM_SETTING_DESCRIPTION_1")); } } } if (!string.IsNullOrEmpty(vm.HVM_boot_policy)) { OVF.AddOtherSystemSettingData(ovfEnv, vsId, "HVM_boot_policy", vm.HVM_boot_policy, OVF.GetContentMessage("OTHER_SYSTEM_SETTING_DESCRIPTION_2")); } if (vm.HVM_shadow_multiplier != 1.0) { OVF.AddOtherSystemSettingData(ovfEnv, vsId, "HVM_shadow_multiplier", Convert.ToString(vm.HVM_shadow_multiplier), OVF.GetContentMessage("OTHER_SYSTEM_SETTING_DESCRIPTION_1")); } if (vm.platform != null) { Dictionary <string, string> platform = vm.platform; StringBuilder sb = new StringBuilder(); foreach (string key in platform.Keys) { sb.AppendFormat(@"{0}={1};", key, platform[key]); } OVF.AddOtherSystemSettingData(ovfEnv, vsId, "platform", sb.ToString(), OVF.GetContentMessage("OTHER_SYSTEM_SETTING_DESCRIPTION_3")); } if (!string.IsNullOrEmpty(vm.PV_args)) { OVF.AddOtherSystemSettingData(ovfEnv, vsId, "PV_args", vm.PV_args, OVF.GetContentMessage("OTHER_SYSTEM_SETTING_DESCRIPTION_1")); } if (!string.IsNullOrEmpty(vm.PV_bootloader)) { OVF.AddOtherSystemSettingData(ovfEnv, vsId, "PV_bootloader", vm.PV_bootloader, OVF.GetContentMessage("OTHER_SYSTEM_SETTING_DESCRIPTION_1")); } if (!string.IsNullOrEmpty(vm.PV_bootloader_args)) { OVF.AddOtherSystemSettingData(ovfEnv, vsId, "PV_bootloader_args", vm.PV_bootloader_args, OVF.GetContentMessage("OTHER_SYSTEM_SETTING_DESCRIPTION_1")); } if (!string.IsNullOrEmpty(vm.PV_kernel)) { OVF.AddOtherSystemSettingData(ovfEnv, vsId, "PV_kernel", vm.PV_kernel, OVF.GetContentMessage("OTHER_SYSTEM_SETTING_DESCRIPTION_1")); } if (!string.IsNullOrEmpty(vm.PV_legacy_args)) { OVF.AddOtherSystemSettingData(ovfEnv, vsId, "PV_legacy_args", vm.PV_legacy_args, OVF.GetContentMessage("OTHER_SYSTEM_SETTING_DESCRIPTION_1")); } if (!string.IsNullOrEmpty(vm.PV_ramdisk)) { OVF.AddOtherSystemSettingData(ovfEnv, vsId, "PV_ramdisk", vm.PV_ramdisk, OVF.GetContentMessage("OTHER_SYSTEM_SETTING_DESCRIPTION_1")); } if (vm.hardware_platform_version >= 0) { OVF.AddOtherSystemSettingData(ovfEnv, vsId, "hardware_platform_version", vm.hardware_platform_version.ToString(), OVF.GetContentMessage("OTHER_SYSTEM_SETTING_DESCRIPTION_1")); } if (vm.HasSriovRecommendation()) { OVF.AddOtherSystemSettingData(ovfEnv, vsId, "allow_network_sriov", bool.TrueString.ToLowerInvariant(), OVF.GetContentMessage("OTHER_SYSTEM_SETTING_DESCRIPTION_1")); } if (vm.has_vendor_device) { //serialise it with a different name to avoid it being deserialised automatically and getting the wrong type OVF.AddOtherSystemSettingData(ovfEnv, vsId, "VM_has_vendor_device", vm.has_vendor_device.ToString(), OVF.GetContentMessage("OTHER_SYSTEM_SETTING_DESCRIPTION_1")); } if (vm.VGPUs.Count != 0) { VGPU vgpu = VGPU.get_record(xenSession, vm.VGPUs[0]); if (vgpu != null) { var vgpuGroup = GPU_group.get_record(xenSession, vgpu.GPU_group); var vgpuType = VGPU_type.get_record(xenSession, vgpu.type); var sb = new StringBuilder(); sb.AppendFormat("GPU_types={{{0}}};", vgpuGroup.GPU_types == null || vgpuGroup.GPU_types.Length < 1 ? "" : string.Join(";", vgpuGroup.GPU_types)); sb.AppendFormat("VGPU_type_vendor_name={0};", vgpuType.vendor_name ?? ""); sb.AppendFormat("VGPU_type_model_name={0};", vgpuType.model_name ?? ""); OVF.AddOtherSystemSettingData(ovfEnv, vsId, "vgpu", sb.ToString(), OVF.GetContentMessage("OTHER_SYSTEM_SETTING_DESCRIPTION_4")); } } string pvsSiteUuid = string.Empty; var allProxies = xenSession.Connection.Cache.PVS_proxies; foreach (var p in allProxies.Where(p => p != null && p.VIF != null)) { var vif = xenSession.Connection.Resolve(p.VIF); if (vif != null) { var vmFromVif = xenSession.Connection.Resolve(vif.VM); if (vmFromVif != null && vmFromVif.uuid == vm.uuid) { var pvsSite = xenSession.Connection.Resolve(p.site); if (pvsSite != null) { pvsSiteUuid = pvsSite.uuid; } break; } } } if (!string.IsNullOrEmpty(pvsSiteUuid)) { var sb = new StringBuilder(); sb.AppendFormat("PVS_SITE={{{0}}};", string.Format("uuid={0}", pvsSiteUuid)); OVF.AddOtherSystemSettingData(ovfEnv, vsId, "pvssite", sb.ToString(), OVF.GetContentMessage("OTHER_SYSTEM_SETTING_DESCRIPTION_5")); } #endregion OVF.FinalizeEnvelope(ovfEnv); } catch (Exception ex) { if (ex is OperationCanceledException) { throw; } log.Error(Messages.ERROR_EXPORT_FAILED); throw new Exception(Messages.ERROR_EXPORT_FAILED, ex); } return(ovfEnv); }
private void insertAEISO(string vmRef, string aeFileName) { HTTPHelper.progressInfo = "获取AE ISO库"; HTTPHelper.progressPercent += 1; SROper srOper = new SROper(); string aeIsoRepoUuid = srOper.getAeISORepoUuid(); XenRef <VBD> cdVBDRef = null; VM vm = VM.get_record(ConnectManager.session, vmRef); List <XenRef <VBD> > vbdRefs = vm.VBDs; foreach (XenRef <VBD> vbdRef in vbdRefs) { VBD vbd = VBD.get_record(ConnectManager.session, vbdRef); if (vbd_type.CD.Equals(vbd.type)) { cdVBDRef = vbdRef; try { VBD.eject(ConnectManager.session, vbdRef); } catch (Exception ex) { log.InfoFormat("设置VBD eject, error=[{0}]", ex.Message); } break; } } if (cdVBDRef == null) { string[] userdevices = VM.get_allowed_VBD_devices(ConnectManager.session, vmRef); if (userdevices != null && userdevices.Length > 0) { VBD vbd = new VBD(); vbd.VM = new XenRef <VM>(vmRef); vbd.type = vbd_type.CD; vbd.mode = vbd_mode.RO; vbd.userdevice = userdevices[0]; vbd.empty = true; cdVBDRef = VBD.create(ConnectManager.session, vbd); log.InfoFormat("WinCenter VM没有虚拟光驱,新建一个VBD成功"); } else { log.InfoFormat("可供使用的VBD标识符列表数为0,不能创建VBD"); } } XenRef <VDI> vdiRef = srOper.getVdiRef(aeIsoRepoUuid, aeFileName); VBD cdVBD = VBD.get_record(ConnectManager.session, cdVBDRef); bool isInsert = VBD.get_allowed_operations(ConnectManager.session, cdVBDRef).Contains(vbd_operations.insert); if (isInsert) { log.InfoFormat("加载AE ISO文件"); VBD.insert(ConnectManager.session, cdVBDRef, vdiRef); HTTPHelper.progressInfo = "加载AE ISO文件"; HTTPHelper.progressPercent += 1; } else { XenRef <VDI> cdVDIRef = cdVBD.VDI; string name = VDI.get_name_label(ConnectManager.session, cdVDIRef); log.InfoFormat("WinCenter VM已插入镜像[{0}],不能插入AE镜像", name); } }
public object vbdcollect(Session session, List <XenRef <VM> > vmRefs) { ArrayList vmc = new ArrayList(); string mydocs = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); int te = 1; string log; string entry; try { foreach (XenRef <VM> vmRef in vmRefs) { VM vm = VM.get_record(session, vmRef); if (!vm.is_a_template && !vm.is_control_domain) { List <XenRef <VBD> > vbdRefs = VBD.get_all(session); vmc.Add("Virtual Machine Name:"); try { vmc.Add(Convert.ToString(vm.name_label)); } catch { vmc.Add("Data not available"); log = mydocs + "\\Halfmode\\HalfmodeConnection.log"; entry = DateTime.Now.ToString("HH:mm:ss") + " VBD Collection Error " + te; writelog.entry(log, entry); te++; } vmc.Add("Number of VBD devices:"); try { vmc.Add(Convert.ToString(vm.VBDs.Count)); } catch { vmc.Add("Data not available"); log = mydocs + "\\Halfmode\\HalfmodeConnection.log"; entry = DateTime.Now.ToString("HH:mm:ss") + " VBD Collection Error " + te; writelog.entry(log, entry); te++; } try { for (int i = 0; i <= vm.VBDs.Count - 1;) { if (vm.VBDs[i].ServerOpaqueRef == "OpaqueRef:NULL") { } else { VBD vbd = VBD.get_record(session, (String)vm.VBDs[i].ServerOpaqueRef); vmc.Add("Device Name:"); try { vmc.Add(Convert.ToString(vbd.device)); } catch { vmc.Add("Data not available"); log = mydocs + "\\Halfmode\\HalfmodeConnection.log"; entry = DateTime.Now.ToString("HH:mm:ss") + " VBD Collection Error " + te; writelog.entry(log, entry); te++; } vmc.Add("Device is currently attached:"); try { vmc.Add(Convert.ToString(vbd.currently_attached)); } catch { vmc.Add("Data not available"); log = mydocs + "\\Halfmode\\HalfmodeConnection.log"; entry = DateTime.Now.ToString("HH:mm:ss") + " VBD Collection Error " + te; writelog.entry(log, entry); te++; } vmc.Add("Device Read/Write Mode:"); try { vmc.Add("Not displayed in demo version"); } catch { vmc.Add("Data not available"); log = mydocs + "\\Halfmode\\HalfmodeConnection.log"; entry = DateTime.Now.ToString("HH:mm:ss") + " VBD Collection Error " + te; writelog.entry(log, entry); te++; } vmc.Add("Device Type:"); try { vmc.Add("Not displayed in demo version"); } catch { vmc.Add("Data not available"); log = mydocs + "\\Halfmode\\HalfmodeConnection.log"; entry = DateTime.Now.ToString("HH:mm:ss") + " VBD Collection Error " + te; writelog.entry(log, entry); te++; } i++; } } } catch { } } te = 1; } log = mydocs + "\\Halfmode\\HalfmodeConnection.log"; entry = DateTime.Now.ToString("HH:mm:ss") + " VBD Collection Finished"; writelog.entry(log, entry); } catch { log = mydocs + "\\Halfmode\\HalfmodeConnection.log"; entry = DateTime.Now.ToString("HH:mm:ss") + " VBD Collection Failed"; writelog.entry(log, entry); } if ((vmc.Count & 2) == 0) { } else { vmc.Add(" "); } return(vmc); }
public object vdicollect(Session session) { ArrayList vmc = new ArrayList(); string mydocs = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); StreamWriter SW; int vd = 1; try { List <XenRef <VM> > vmRefs = VM.get_all(session); List <XenRef <VBD> > vbdRefs = VBD.get_all(session); List <XenRef <VDI> > vdiRefs = VDI.get_all(session); foreach (XenRef <VM> vmRef in vmRefs) { VM vm = VM.get_record(session, vmRef); if (!vm.is_a_template && !vm.is_control_domain) { for (int i = 0; i <= vm.VBDs.Count - 1;) { if (vm.VBDs[i].ServerOpaqueRef == "OpaqueRef:NULL") { } else { // get the info from VDB first. VBD vbd = VBD.get_record(session, (String)vm.VBDs[i].ServerOpaqueRef); if (vbd.VDI.ServerOpaqueRef == "OpaqueRef:NULL") { } else { vmc.Add("Virtual Machine Name:"); try { vmc.Add(Convert.ToString(vm.name_label)); } catch { vmc.Add("Data not available"); SW = File.AppendText(mydocs + "\\Halfmode\\HalfmodeConnection.log"); SW.WriteLine(DateTime.Now.ToString("HH:mm:ss") + " VDI Collection Error " + vd); SW.Close(); vd++; } VDI vdi = VDI.get_record(session, vbd.VDI.ServerOpaqueRef); vmc.Add("Virtual Disk Name:"); try { vmc.Add(Convert.ToString(vdi.name_label)); } catch { vmc.Add("Data not available"); SW = File.AppendText(mydocs + "\\Halfmode\\HalfmodeConnection.log"); SW.WriteLine(DateTime.Now.ToString("HH:mm:ss") + " VDI Collection Error " + vd); SW.Close(); vd++; } vmc.Add("Virtual Description:"); try { vmc.Add(Convert.ToString(vdi.name_description)); } catch { vmc.Add("Data not available"); SW = File.AppendText(mydocs + "\\Halfmode\\HalfmodeConnection.log"); SW.WriteLine(DateTime.Now.ToString("HH:mm:ss") + " VDI Collection Error " + vd); SW.Close(); vd++; } vmc.Add("Virtual Disk Size:"); try { vmc.Add("Not displayed in demo version"); } catch { vmc.Add("Data not available"); SW = File.AppendText(mydocs + "\\Halfmode\\HalfmodeConnection.log"); SW.WriteLine(DateTime.Now.ToString("HH:mm:ss") + " VDI Collection Error " + vd); SW.Close(); vd++; } vmc.Add("Physical Disk Usage:"); try { vmc.Add("Not displayed in demo version"); } catch { vmc.Add("Data not available"); SW = File.AppendText(mydocs + "\\Halfmode\\HalfmodeConnection.log"); SW.WriteLine(DateTime.Now.ToString("HH:mm:ss") + " VDI Collection Error " + vd); SW.Close(); vd++; } SR sr = SR.get_record(session, vdi.SR.ServerOpaqueRef); vmc.Add("Parent Storage Repositry:"); try { vmc.Add(Convert.ToString(sr.name_label)); } catch { vmc.Add("Data not available"); SW = File.AppendText(mydocs + "\\Halfmode\\HalfmodeConnection.log"); SW.WriteLine(DateTime.Now.ToString("HH:mm:ss") + " VDI Collection Error " + vd); SW.Close(); vd++; } vmc.Add("Is VDI read-only:"); try { vmc.Add(Convert.ToString(vdi.read_only)); } catch { vmc.Add("Data not available"); SW = File.AppendText(mydocs + "\\Halfmode\\HalfmodeConnection.log"); SW.WriteLine(DateTime.Now.ToString("HH:mm:ss") + " VDI Collection Error " + vd); SW.Close(); vd++; } vmc.Add("Is VDI Shareable:"); try { vmc.Add("Not displayed in demo version"); } catch { vmc.Add("Data not available"); SW = File.AppendText(mydocs + "\\Halfmode\\HalfmodeConnection.log"); SW.WriteLine(DateTime.Now.ToString("HH:mm:ss") + " VDI Collection Error " + vd); SW.Close(); vd++; } } i++; } } } vd = 1; } SW = File.AppendText(mydocs + "\\Halfmode\\HalfmodeConnection.log"); SW.WriteLine(DateTime.Now.ToString("HH:mm:ss") + " VDI Collection Finished"); SW.Close(); } catch { SW = File.AppendText(mydocs + "\\Halfmode\\HalfmodeConnection.log"); SW.WriteLine(DateTime.Now.ToString("HH:mm:ss") + " VDI Collection Failed"); SW.Close(); } if ((vmc.Count & 2) == 0) { } else { vmc.Add(" "); } return(vmc); }