From 051c205899dd2c7f8123e3ea1c446b7da18bbcf6 Mon Sep 17 00:00:00 2001 From: Konstantina Chremmou Date: Fri, 5 Nov 2021 21:46:07 +0000 Subject: [PATCH] CA-350411 part 2: Add conditional page control refresh in Import Wizard Signed-off-by: Konstantina Chremmou --- .../Wizards/ImportWizard/ImageVMConfigPage.cs | 16 +- .../Wizards/ImportWizard/ImportEulaPage.cs | 2 +- .../ImportWizard/ImportSecurityPage.cs | 2 +- .../ImportWizard/ImportSelectHostPage.cs | 2 +- .../ImportWizard/ImportSelectNetworkPage.cs | 2 +- .../ImportWizard/ImportSelectStoragePage.cs | 2 +- XenAdmin/Wizards/ImportWizard/ImportWizard.cs | 271 ++++++++++-------- .../ImportWizard/LunPerVdiImportPage.cs | 2 +- .../Wizards/ImportWizard/NetworkPickerPage.cs | 50 ++-- .../Wizards/ImportWizard/StoragePickerPage.cs | 25 +- XenModel/Mappings/VmMapping.cs | 28 +- XenOvfApi/OVF.cs | 45 ++- 12 files changed, 269 insertions(+), 178 deletions(-) diff --git a/XenAdmin/Wizards/ImportWizard/ImageVMConfigPage.cs b/XenAdmin/Wizards/ImportWizard/ImageVMConfigPage.cs index 70bb08e0b..bfcc9c977 100644 --- a/XenAdmin/Wizards/ImportWizard/ImageVMConfigPage.cs +++ b/XenAdmin/Wizards/ImportWizard/ImageVMConfigPage.cs @@ -55,17 +55,17 @@ namespace XenAdmin.Wizards.ImportWizard /// /// Gets the page's title (headline) /// - public override string PageTitle { get { return Messages.IMAGE_DEFINITION_PAGE_TITLE; } } + public override string PageTitle => Messages.IMAGE_DEFINITION_PAGE_TITLE; /// /// Gets the page's label in the (left hand side) wizard progress panel /// - public override string Text { get { return Messages.IMAGE_DEFINITION_PAGE_TEXT; } } + public override string Text => Messages.IMAGE_DEFINITION_PAGE_TEXT; /// /// Gets the value by which the help files section for this page is identified /// - public override string HelpID { get { return "VMConfig"; } } + public override string HelpID => "VMConfig"; protected override bool ImplementsIsDirty() { @@ -99,14 +99,14 @@ namespace XenAdmin.Wizards.ImportWizard public bool IsWim { internal get; set; } - public string VmName { get { return m_textBoxVMName.Text; } } + public string VmName => m_textBoxVMName.Text; - public ulong CpuCount { get { return (ulong)m_upDownCpuCount.Value; } } + public ulong CpuCount => (ulong)m_upDownCpuCount.Value; - public ulong Memory { get { return (ulong)m_upDownMemory.Value; } } + public ulong Memory => (ulong)m_upDownMemory.Value; + + public ulong AdditionalSpace => m_groupBoxAddSpace.Visible && m_groupBoxAddSpace.Enabled ? (ulong)m_upDownAddSpace.Value * GB : 0; - public ulong AdditionalSpace { get { return m_groupBoxAddSpace.Enabled ? (ulong)m_upDownAddSpace.Value * GB : 0; } } - #endregion #region Private Methods diff --git a/XenAdmin/Wizards/ImportWizard/ImportEulaPage.cs b/XenAdmin/Wizards/ImportWizard/ImportEulaPage.cs index 7cf5d7da1..eb576a959 100644 --- a/XenAdmin/Wizards/ImportWizard/ImportEulaPage.cs +++ b/XenAdmin/Wizards/ImportWizard/ImportEulaPage.cs @@ -141,7 +141,7 @@ namespace XenAdmin.Wizards.ImportWizard #region Accessors - public EnvelopeType SelectedOvfEnvelope { internal get; set; } + public EnvelopeType SelectedOvfEnvelope { private get; set; } #endregion diff --git a/XenAdmin/Wizards/ImportWizard/ImportSecurityPage.cs b/XenAdmin/Wizards/ImportWizard/ImportSecurityPage.cs index ffaabb95f..9d8695ff9 100644 --- a/XenAdmin/Wizards/ImportWizard/ImportSecurityPage.cs +++ b/XenAdmin/Wizards/ImportWizard/ImportSecurityPage.cs @@ -137,7 +137,7 @@ namespace XenAdmin.Wizards.ImportWizard /// /// Package containing the selected OVF appliance. /// - public Package SelectedOvfPackage { internal get; set; } + public Package SelectedOvfPackage { private get; set; } #endregion diff --git a/XenAdmin/Wizards/ImportWizard/ImportSelectHostPage.cs b/XenAdmin/Wizards/ImportWizard/ImportSelectHostPage.cs index 21612b073..e7b8f55d2 100755 --- a/XenAdmin/Wizards/ImportWizard/ImportSelectHostPage.cs +++ b/XenAdmin/Wizards/ImportWizard/ImportSelectHostPage.cs @@ -80,7 +80,7 @@ namespace XenAdmin.Wizards.ImportWizard public EnvelopeType SelectedOvfEnvelope { - internal get + private get { return _selectedOvfEnvelope; } diff --git a/XenAdmin/Wizards/ImportWizard/ImportSelectNetworkPage.cs b/XenAdmin/Wizards/ImportWizard/ImportSelectNetworkPage.cs index 807903505..724463242 100644 --- a/XenAdmin/Wizards/ImportWizard/ImportSelectNetworkPage.cs +++ b/XenAdmin/Wizards/ImportWizard/ImportSelectNetworkPage.cs @@ -85,7 +85,7 @@ namespace XenAdmin.Wizards.ImportWizard return false; } - public EnvelopeType SelectedOvfEnvelope { get; set; } + public EnvelopeType SelectedOvfEnvelope { private get; set; } protected override string IntroductionText => Messages.IMPORT_WIZARD_NETWORKING_INTRO; diff --git a/XenAdmin/Wizards/ImportWizard/ImportSelectStoragePage.cs b/XenAdmin/Wizards/ImportWizard/ImportSelectStoragePage.cs index cbd6732f5..b58f8f434 100644 --- a/XenAdmin/Wizards/ImportWizard/ImportSelectStoragePage.cs +++ b/XenAdmin/Wizards/ImportWizard/ImportSelectStoragePage.cs @@ -56,7 +56,7 @@ namespace XenAdmin.Wizards.ImportWizard return true; } - public EnvelopeType SelectedOvfEnvelope { get; set; } + public EnvelopeType SelectedOvfEnvelope { private get; set; } public override StorageResourceContainer ResourceData(string sysId) { diff --git a/XenAdmin/Wizards/ImportWizard/ImportWizard.cs b/XenAdmin/Wizards/ImportWizard/ImportWizard.cs index e35c6ac97..293cecef0 100644 --- a/XenAdmin/Wizards/ImportWizard/ImportWizard.cs +++ b/XenAdmin/Wizards/ImportWizard/ImportWizard.cs @@ -32,18 +32,18 @@ using System; using System.Collections.Generic; using System.IO; +using System.Linq; using System.Text.RegularExpressions; using XenAdmin.Actions; using XenAdmin.Actions.OvfActions; +using XenAdmin.Actions.VMActions; +using XenAdmin.Commands; using XenAdmin.Controls; using XenAdmin.Core; using XenAdmin.Mappings; using XenAdmin.Network; using XenAdmin.Wizards.GenericPages; using XenAPI; -using System.Linq; -using XenAdmin.Actions.VMActions; -using XenAdmin.Commands; using XenOvf; using XenOvf.Definitions; using XenOvf.Utilities; @@ -78,7 +78,10 @@ namespace XenAdmin.Wizards.ImportWizard private ImportType? m_typeOfImport; private bool m_ignoreAffinitySet; private EnvelopeType m_envelopeFromVhd; - private IXenConnection TargetConnection { get; set; } + private Package _selectedOvfPackage; + private string _selectedImagePath; + private Host _selectedAffinity; + private IXenConnection _targetConnection; #endregion public ImportWizard(IXenConnection con, IXenObject xenObject, string filename, bool ovfModeOnly = false) @@ -128,7 +131,7 @@ namespace XenAdmin.Wizards.ImportWizard m_pageXvaStorage.ImportXvaAction.EndWizard(m_pageFinish.StartVmsAutomatically, m_pageXvaNetwork.VIFs); break; case ImportType.Ovf: - new ImportApplianceAction(TargetConnection, + new ImportApplianceAction(_targetConnection, m_pageImportSource.SelectedOvfPackage, m_vmMappings, m_pageSecurity.VerifyManifest, @@ -139,7 +142,7 @@ namespace XenAdmin.Wizards.ImportWizard m_pageFinish.StartVmsAutomatically).RunAsync(); break; case ImportType.Vhd: - new ImportImageAction(TargetConnection, + new ImportImageAction(_targetConnection, m_envelopeFromVhd, Path.GetDirectoryName(m_pageImportSource.FilePath), m_vmMappings, @@ -171,17 +174,15 @@ namespace XenAdmin.Wizards.ImportWizard protected override void UpdateWizardContent(XenTabPage page) { var type = page.GetType(); - var oldTypeOfImport = m_typeOfImport; //store previous type if (type == typeof(ImportSourcePage)) { - #region ImportSourcePage - + var oldTypeOfImport = m_typeOfImport; //store previous type m_typeOfImport = m_pageImportSource.TypeOfImport; + var appliancePages = new XenTabPage[] { m_pageEula, m_pageHost, m_pageStorage, m_pageNetwork, m_pageSecurity, m_pageOptions }; var imagePages = new XenTabPage[] { m_pageVMconfig, m_pageHost, m_pageStorage, m_pageNetwork, m_pageOptions }; var xvaPages = new XenTabPage[] { m_pageXvaHost, m_pageXvaStorage, m_pageXvaNetwork }; - var newVmMappings = m_vmMappings; switch (m_typeOfImport) { @@ -195,29 +196,27 @@ namespace XenAdmin.Wizards.ImportWizard RemovePages(xvaPages); AddAfterPage(m_pageImportSource, appliancePages); } - var newSelectedOvfPackage = m_pageImportSource.SelectedOvfPackage; - var newSelectedOvfEnvelope = newSelectedOvfPackage.OvfEnvelope; - if (oldTypeOfImport != ImportType.Ovf - || m_pageSecurity.SelectedOvfPackage != newSelectedOvfPackage - || m_pageEula.SelectedOvfEnvelope != newSelectedOvfEnvelope - || m_pageHost.SelectedOvfEnvelope != newSelectedOvfEnvelope - || m_pageHost.VmMappings != newVmMappings - || m_pageStorage.SelectedOvfEnvelope != newSelectedOvfEnvelope - || lunPerVdiMappingPage.SelectedOvfEnvelope != newSelectedOvfEnvelope - || m_pageHost.SelectedOvfEnvelope != newSelectedOvfEnvelope) + var oldSelectedOvfPackage = _selectedOvfPackage; + _selectedOvfPackage = m_pageImportSource.SelectedOvfPackage; + + if (oldTypeOfImport != ImportType.Ovf || oldSelectedOvfPackage != _selectedOvfPackage) { - m_pageEula.SelectedOvfEnvelope = newSelectedOvfEnvelope; - m_pageSecurity.SelectedOvfPackage = newSelectedOvfPackage; - + m_pageEula.SelectedOvfEnvelope = _selectedOvfPackage.OvfEnvelope; + m_pageSecurity.SelectedOvfPackage = _selectedOvfPackage; CheckDisabledPages(m_pageEula, m_pageSecurity); //decide whether to disable these progress steps - ResetVmMappings(newSelectedOvfEnvelope); - m_pageHost.SelectedOvfEnvelope = newSelectedOvfEnvelope; + + m_vmMappings.Clear(); + string[] sysIds = OVF.FindSystemIds(_selectedOvfPackage.OvfEnvelope); + foreach (string sysId in sysIds) + m_vmMappings.Add(sysId, new VmMapping {VmNameLabel = FindVMName(_selectedOvfPackage.OvfEnvelope, sysId)}); + + m_pageHost.SelectedOvfEnvelope = _selectedOvfPackage.OvfEnvelope; m_pageHost.SetDefaultTarget(m_pageHost.ChosenItem ?? m_selectedObject); - m_pageHost.VmMappings = newVmMappings; - m_pageStorage.SelectedOvfEnvelope = newSelectedOvfEnvelope; - lunPerVdiMappingPage.SelectedOvfEnvelope = newSelectedOvfEnvelope; - m_pageNetwork.SelectedOvfEnvelope = newSelectedOvfEnvelope; + m_pageHost.VmMappings = m_vmMappings; + m_pageStorage.SelectedOvfEnvelope = _selectedOvfPackage.OvfEnvelope; + lunPerVdiMappingPage.SelectedOvfEnvelope = _selectedOvfPackage.OvfEnvelope; + m_pageNetwork.SelectedOvfEnvelope = _selectedOvfPackage.OvfEnvelope; NotifyNextPagesOfChange(m_pageEula, m_pageHost, m_pageStorage, m_pageNetwork, m_pageSecurity, m_pageOptions); } @@ -230,19 +229,19 @@ namespace XenAdmin.Wizards.ImportWizard RemovePages(appliancePages); RemovePages(xvaPages); AddAfterPage(m_pageImportSource, imagePages); + + //if _targetConnection=null, i.e. we haven't selected a connection yet, do not add the page + if (_targetConnection != null && BootModesControl.ShowBootModeOptions(_targetConnection)) + AddAfterPage(m_pageNetwork, m_pageBootOptions); } - var newIsWim = m_pageImportSource.IsWIM; + var oldSelectedImagePath = _selectedImagePath; + _selectedImagePath = m_pageImportSource.FilePath; - if (oldTypeOfImport != ImportType.Vhd - || m_pageVMconfig.IsWim != newIsWim - || m_pageHost.VmMappings != newVmMappings - || m_pageHost.SelectedOvfEnvelope != null) + if (oldTypeOfImport != ImportType.Vhd || oldSelectedImagePath != _selectedImagePath) { - m_pageVMconfig.IsWim = newIsWim; - m_pageHost.SetDefaultTarget(m_pageHost.ChosenItem ?? m_selectedObject); - m_pageHost.SelectedOvfEnvelope = null; - m_pageHost.VmMappings = newVmMappings; + m_vmMappings.Clear(); + m_pageVMconfig.IsWim = m_pageImportSource.IsWIM; NotifyNextPagesOfChange(m_pageVMconfig, m_pageHost, m_pageStorage, m_pageNetwork, m_pageOptions); } break; @@ -260,60 +259,107 @@ namespace XenAdmin.Wizards.ImportWizard m_pageXvaStorage.FilePath = m_pageImportSource.FilePath; break; } - - #endregion } else if (type == typeof(ImageVMConfigPage)) { - //then use it to create an ovf for the import - - var newEnvelope = OVF.CreateOvfEnvelope(m_pageVMconfig.VmName, - m_pageVMconfig.CpuCount, m_pageVMconfig.Memory, - m_pageBootOptions.BootParams, m_pageBootOptions.PlatformSettings, - m_pageImportSource.DiskCapacity, m_pageImportSource.IsWIM, m_pageVMconfig.AdditionalSpace, - m_pageImportSource.FilePath, m_pageImportSource.ImageLength, BrandManager.ProductBrand); - - if (newEnvelope != m_envelopeFromVhd) + var newMapping = new VmMapping { - ResetVmMappings(m_envelopeFromVhd); - NotifyNextPagesOfChange(m_pageHost, m_pageStorage, m_pageNetwork); + VmNameLabel = m_pageVMconfig.VmName, + CpuCount = m_pageVMconfig.CpuCount, + Capacity = m_pageImportSource.DiskCapacity + m_pageVMconfig.AdditionalSpace, + Memory = m_pageVMconfig.Memory, + BootParams = m_pageBootOptions.BootParams, + PlatformSettings = m_pageBootOptions.PlatformSettings + }; + + var oldMapping = m_vmMappings.Values.FirstOrDefault(); + if (oldMapping != null) + { + newMapping.XenRef = oldMapping.XenRef; + newMapping.TargetName = oldMapping.TargetName; + newMapping.Storage = oldMapping.Storage; + newMapping.StorageToAttach = oldMapping.StorageToAttach; + newMapping.Networks = oldMapping.Networks; } - m_envelopeFromVhd = newEnvelope; - m_pageStorage.SelectedOvfEnvelope = m_envelopeFromVhd; - lunPerVdiMappingPage.SelectedOvfEnvelope = m_envelopeFromVhd; - m_pageNetwork.SelectedOvfEnvelope = m_envelopeFromVhd; + if (!newMapping.Equals(oldMapping)) + { + m_envelopeFromVhd = OVF.CreateOvfEnvelope(newMapping.VmNameLabel, + newMapping.CpuCount, newMapping.Memory, + newMapping.BootParams, newMapping.PlatformSettings, + newMapping.Capacity, + m_pageImportSource.FilePath, m_pageImportSource.ImageLength, BrandManager.ProductBrand); + + m_vmMappings.Clear(); + var sysId = OVF.FindSystemIds(m_envelopeFromVhd).First(); + m_vmMappings.Add(sysId, newMapping); + + m_pageHost.VmMappings = m_vmMappings; + m_pageHost.SetDefaultTarget(m_pageHost.ChosenItem ?? m_selectedObject); + + m_pageHost.SelectedOvfEnvelope = m_envelopeFromVhd; + m_pageStorage.SelectedOvfEnvelope = m_envelopeFromVhd; + lunPerVdiMappingPage.SelectedOvfEnvelope = m_envelopeFromVhd; + m_pageNetwork.SelectedOvfEnvelope = m_envelopeFromVhd; + + NotifyNextPagesOfChange(m_pageHost, lunPerVdiMappingPage, m_pageStorage, m_pageNetwork); + } } else if (type == typeof(ImportSelectHostPage)) { - var newConnection = m_pageHost.ChosenItem?.Connection; - var newMappings = m_pageHost.VmMappings; + var oldTargetConnection = _targetConnection; + _targetConnection = m_pageHost.ChosenItem?.Connection; + var oldVmMappings = m_vmMappings; + m_vmMappings = m_pageHost.VmMappings; - RemovePage(m_pageRbac); - ConfigureRbacPage(TargetConnection); + if (oldTargetConnection != _targetConnection) + { + RemovePage(m_pageRbac); + ConfigureRbacPage(_targetConnection); - if (m_pageStorage.VmMappings != newMappings - || m_pageNetwork.Connection != newConnection - || m_pageOptions.Connection != newConnection) + RemovePage(m_pageBootOptions); + if (m_typeOfImport == ImportType.Vhd && BootModesControl.ShowBootModeOptions(_targetConnection)) + AddAfterPage(m_pageNetwork, m_pageBootOptions); + } + + m_pageStorage.VmMappings = m_vmMappings; + m_pageStorage.Connection = _targetConnection; + m_pageNetwork.Connection = _targetConnection; + m_pageOptions.Connection = _targetConnection; + m_pageBootOptions.Connection = _targetConnection; + + if (oldTargetConnection != _targetConnection || oldVmMappings != m_vmMappings) NotifyNextPagesOfChange(m_pageStorage, m_pageNetwork, m_pageOptions); + } + else if (type == typeof(ImportBootOptionPage)) + { + var oldMapping = m_vmMappings.Values.First(); - if (m_pageBootOptions.Connection != newConnection && m_typeOfImport != oldTypeOfImport) + if (oldMapping.BootParams != m_pageBootOptions.BootParams || + oldMapping.PlatformSettings != m_pageBootOptions.PlatformSettings) { - RemovePage(m_pageBootOptions); - if (m_typeOfImport == ImportType.Vhd && BootModesControl.ShowBootModeOptions(TargetConnection)) - { - AddAfterPage(m_pageNetwork, m_pageBootOptions); - } + string systemId = null; + if (m_envelopeFromVhd.Item is VirtualSystem_Type vs) + systemId = vs.id; + else if (m_envelopeFromVhd.Item is VirtualSystemCollection_Type vsc) + systemId = vsc.Content.FirstOrDefault()?.id; + + if (oldMapping.BootParams != m_pageBootOptions.BootParams) + { + m_envelopeFromVhd = OVF.UpdateBootParams(m_envelopeFromVhd, systemId, m_pageBootOptions.BootParams); + m_vmMappings.Values.First().BootParams = m_pageBootOptions.BootParams; + } + + if (oldMapping.PlatformSettings != m_pageBootOptions.PlatformSettings) + { + m_envelopeFromVhd = OVF.UpdatePlatform(m_envelopeFromVhd, systemId, m_pageBootOptions.PlatformSettings); + m_vmMappings.Values.First().PlatformSettings = m_pageBootOptions.PlatformSettings; + } } - m_vmMappings = newMappings; - TargetConnection = newConnection; - - m_pageStorage.VmMappings = m_vmMappings; - m_pageStorage.Connection = TargetConnection; - m_pageNetwork.Connection = TargetConnection; - m_pageOptions.Connection = TargetConnection; - m_pageBootOptions.Connection = TargetConnection; + m_pageStorage.SelectedOvfEnvelope = m_envelopeFromVhd; + lunPerVdiMappingPage.SelectedOvfEnvelope = m_envelopeFromVhd; + m_pageNetwork.SelectedOvfEnvelope = m_envelopeFromVhd; } else if (type == typeof(ImportSelectStoragePage)) { @@ -339,31 +385,31 @@ namespace XenAdmin.Wizards.ImportWizard } else if (type == typeof(GlobalSelectHost)) { - var newConnection = m_pageXvaHost.SelectedHost == null ? m_pageXvaHost.SelectedConnection : m_pageXvaHost.SelectedHost.Connection; - var newStorageTargetHost = m_ignoreAffinitySet ? null : m_pageXvaHost.SelectedHost; - var newNetworkSelectedHost = m_pageXvaHost.SelectedHost; + var oldSelectedAffinity = _selectedAffinity; + _selectedAffinity = m_pageXvaHost.SelectedHost; + var oldTargetConnection = _targetConnection; + _targetConnection = _selectedAffinity == null ? m_pageXvaHost.SelectedConnection : _selectedAffinity.Connection; - RemovePage(m_pageRbac); - ConfigureRbacPage(newConnection); + if (oldTargetConnection != _targetConnection) + { + RemovePage(m_pageRbac); + ConfigureRbacPage(_targetConnection); + } - if (m_pageXvaStorage.MTargetConnection != newConnection - || m_pageXvaNetwork.MSelectedConnection != newConnection - || !m_pageXvaNetwork.MSelectedAffinity.Equals(newNetworkSelectedHost) - || !m_pageXvaStorage.MTargetHost.Equals(newStorageTargetHost) - ) + m_pageXvaStorage.TargetConnection = _targetConnection; + m_pageXvaStorage.TargetHost = m_ignoreAffinitySet ? null : _selectedAffinity; + + m_pageXvaNetwork.SelectedConnection = _targetConnection; + m_pageXvaNetwork.SelectedAffinity = _selectedAffinity; + + if (oldTargetConnection != _targetConnection || + oldSelectedAffinity != null && _selectedAffinity != null && oldSelectedAffinity.opaque_ref != _selectedAffinity.opaque_ref) NotifyNextPagesOfChange(m_pageXvaStorage, m_pageXvaNetwork); - - m_pageXvaStorage.MTargetConnection = newConnection; - m_pageXvaStorage.MTargetHost = newStorageTargetHost; - - m_pageXvaNetwork.MSelectedConnection = newConnection; - m_pageXvaNetwork.MSelectedAffinity = m_pageXvaHost.SelectedHost; - } else if (type == typeof(StoragePickerPage)) { m_pageFinish.ShowStartVmsGroupBox = m_pageXvaStorage.ImportedVm != null && !m_pageXvaStorage.ImportedVm.is_a_template; - m_pageXvaNetwork.SetVm(m_pageXvaStorage.ImportedVm); + m_pageXvaNetwork.VM = m_pageXvaStorage.ImportedVm; NotifyNextPagesOfChange(m_pageXvaNetwork); } @@ -567,7 +613,7 @@ namespace XenAdmin.Wizards.ImportWizard temp.Add(new Tuple(Messages.FINISH_PAGE_VMNAME, m_pageVMconfig.VmName)); temp.Add(new Tuple(Messages.FINISH_PAGE_CPUCOUNT, m_pageVMconfig.CpuCount.ToString())); temp.Add(new Tuple(Messages.FINISH_PAGE_MEMORY, string.Format(Messages.VAL_MB, m_pageVMconfig.Memory))); - if (Helpers.NaplesOrGreater(TargetConnection)) + if (Helpers.NaplesOrGreater(_targetConnection)) temp.Add(new Tuple(Messages.BOOT_MODE, m_pageBootOptions.SelectedBootMode.StringOf())); if (m_pageImportSource.IsWIM) @@ -609,23 +655,6 @@ namespace XenAdmin.Wizards.ImportWizard return temp; } - private void ResetVmMappings(EnvelopeType ovfEnvelope) - { - string[] sysIds = OVF.FindSystemIds(ovfEnvelope); - m_vmMappings.Clear(); - - foreach (string sysId in sysIds) - { - var vmMap = new VmMapping - { - VmNameLabel = (m_typeOfImport == ImportType.Ovf) - ? FindVMName(ovfEnvelope, sysId) - : m_pageVMconfig.VmName //it should only iterate once - }; - m_vmMappings.Add(sysId, vmMap); - } - } - private bool IsGUID(string expression) { if (expression != null) @@ -709,15 +738,15 @@ namespace XenAdmin.Wizards.ImportWizard private void m_pageXvaStorage_ImportVmCompleted() { Program.Invoke(this, () => - { - if (CurrentStepTabPage.GetType() == typeof(StoragePickerPage)) - { - m_pageFinish.ShowStartVmsGroupBox = m_pageXvaStorage.ImportedVm != null && !m_pageXvaStorage.ImportedVm.is_a_template; - m_pageXvaNetwork.SetVm(m_pageXvaStorage.ImportedVm); - NotifyNextPagesOfChange(m_pageXvaNetwork); - NextStep(); - } - }); + { + if (CurrentStepTabPage.GetType() == typeof(StoragePickerPage)) + { + m_pageFinish.ShowStartVmsGroupBox = m_pageXvaStorage.ImportedVm != null && !m_pageXvaStorage.ImportedVm.is_a_template; + m_pageXvaNetwork.VM = m_pageXvaStorage.ImportedVm; + NotifyNextPagesOfChange(m_pageXvaNetwork); + NextStep(); + } + }); } private void ShowXenAppXenDesktopWarning(IXenConnection connection) diff --git a/XenAdmin/Wizards/ImportWizard/LunPerVdiImportPage.cs b/XenAdmin/Wizards/ImportWizard/LunPerVdiImportPage.cs index f8c570d74..db036272f 100644 --- a/XenAdmin/Wizards/ImportWizard/LunPerVdiImportPage.cs +++ b/XenAdmin/Wizards/ImportWizard/LunPerVdiImportPage.cs @@ -99,7 +99,7 @@ namespace XenAdmin.Wizards.ImportWizard } } - public EnvelopeType SelectedOvfEnvelope { get; set; } + public EnvelopeType SelectedOvfEnvelope { private get; set; } private StorageResourceContainer ResourceData(string sysId) { diff --git a/XenAdmin/Wizards/ImportWizard/NetworkPickerPage.cs b/XenAdmin/Wizards/ImportWizard/NetworkPickerPage.cs index 6b36caeba..c3a90ed3a 100644 --- a/XenAdmin/Wizards/ImportWizard/NetworkPickerPage.cs +++ b/XenAdmin/Wizards/ImportWizard/NetworkPickerPage.cs @@ -49,9 +49,6 @@ namespace XenAdmin.Wizards.ImportWizard #region Private fields private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); - internal IXenConnection MSelectedConnection { get; set; } - internal Host MSelectedAffinity { get; set; } - private VM m_vm; private bool m_buttonNextEnabled; #endregion @@ -108,6 +105,15 @@ namespace XenAdmin.Wizards.ImportWizard #region Accessors + /// + /// Should be set before the Affinity is set. + /// + internal IXenConnection SelectedConnection { get; set; } + + internal Host SelectedAffinity { get; set; } + + internal VM VM { get; set; } + public List VIFs { get @@ -136,12 +142,6 @@ namespace XenAdmin.Wizards.ImportWizard #endregion - - public void SetVm(VM vm) - { - m_vm = vm; - } - #region Private methods private void UpdateControlsEnabledState(bool enabled) @@ -155,7 +155,7 @@ namespace XenAdmin.Wizards.ImportWizard { NetworkNetworkColumn.Items.Clear(); - var networks = MSelectedConnection.Cache.Networks.Where(ShowNetwork); + var networks = SelectedConnection.Cache.Networks.Where(ShowNetwork); foreach (XenAPI.Network network in networks) { @@ -174,18 +174,18 @@ namespace XenAdmin.Wizards.ImportWizard m_networkGridView.SuspendLayout(); m_networkGridView.Rows.Clear(); - if (m_vm.is_a_template && m_vm.VIFs.Count < 1) + if (VM.is_a_template && VM.VIFs.Count < 1) { // We need to automatically generate VIFs for Networks marked AutoPlug=true - var networks = MSelectedConnection.Cache.Networks; + var networks = SelectedConnection.Cache.Networks; foreach (XenAPI.Network network in networks) { - if (m_networkGridView.Rows.Count < m_vm.MaxVIFsAllowed() && ShowNetwork(network) && network.GetAutoPlug()) + if (m_networkGridView.Rows.Count < VM.MaxVIFsAllowed() && ShowNetwork(network) && network.GetAutoPlug()) { AddVIFRow(new VIF { - Connection = MSelectedConnection, + Connection = SelectedConnection, device = m_networkGridView.Rows.Count.ToString(), network = new XenRef(network.opaque_ref), MAC = Messages.MAC_AUTOGENERATE @@ -193,16 +193,16 @@ namespace XenAdmin.Wizards.ImportWizard } } } - else if (m_vm.is_a_template) + else if (VM.is_a_template) { // We need to create off the _vmTemplate - var vifs = MSelectedConnection.ResolveAll(m_vm.VIFs); + var vifs = SelectedConnection.ResolveAll(VM.VIFs); foreach (VIF vif in vifs) { AddVIFRow(new VIF { - Connection = MSelectedConnection, + Connection = SelectedConnection, device = vif.device, network = vif.network, MAC = Messages.MAC_AUTOGENERATE @@ -212,7 +212,7 @@ namespace XenAdmin.Wizards.ImportWizard else { //We need to recreate off vm - var vifs = MSelectedConnection.ResolveAll(m_vm.VIFs); + var vifs = SelectedConnection.ResolveAll(VM.VIFs); foreach (VIF vif in vifs) AddVIFRow(vif); } @@ -228,7 +228,7 @@ namespace XenAdmin.Wizards.ImportWizard private XenAPI.Network GetDefaultNetwork() { - foreach (XenAPI.Network network in MSelectedConnection.Cache.Networks) + foreach (XenAPI.Network network in SelectedConnection.Cache.Networks) if (ShowNetwork(network)) return network; @@ -249,13 +249,13 @@ namespace XenAdmin.Wizards.ImportWizard if (network.IsMember()) return false; - if (MSelectedAffinity != null && !MSelectedAffinity.CanSeeNetwork(network)) + if (SelectedAffinity != null && !SelectedAffinity.CanSeeNetwork(network)) return false; - if (MSelectedAffinity == null && !network.AllHostsCanSeeNetwork()) + if (SelectedAffinity == null && !network.AllHostsCanSeeNetwork()) return false; - if (network.IsSriov() && !m_vm.HasSriovRecommendation()) + if (network.IsSriov() && !VM.HasSriovRecommendation()) return false; return true; @@ -264,7 +264,7 @@ namespace XenAdmin.Wizards.ImportWizard private void AddVIFRow(VIF vif) { var row = new VifRow(vif); - XenAPI.Network network = MSelectedConnection.Resolve(vif.network); + XenAPI.Network network = SelectedConnection.Resolve(vif.network); bool isGuestInstallerNetwork = network != null && network.IsGuestInstallerNetwork(); ToStringWrapper comboBoxEntry = FindComboBoxEntryForNetwork(network); @@ -332,7 +332,7 @@ namespace XenAdmin.Wizards.ImportWizard private void m_buttonAddNetwork_Click(object sender, EventArgs e) { - if (m_networkGridView.Rows.Count >= m_vm.MaxVIFsAllowed()) + if (m_networkGridView.Rows.Count >= VM.MaxVIFsAllowed()) { using (var dlg = new ErrorDialog(FriendlyErrorNames.VIFS_MAX_ALLOWED) {WindowTitle = FriendlyErrorNames.VIFS_MAX_ALLOWED_TITLE}) @@ -342,7 +342,7 @@ namespace XenAdmin.Wizards.ImportWizard return; } - VIF vif = new VIF {Connection = MSelectedConnection}; + VIF vif = new VIF {Connection = SelectedConnection}; int i = 0; while (true) diff --git a/XenAdmin/Wizards/ImportWizard/StoragePickerPage.cs b/XenAdmin/Wizards/ImportWizard/StoragePickerPage.cs index ae57f26c6..615036d25 100644 --- a/XenAdmin/Wizards/ImportWizard/StoragePickerPage.cs +++ b/XenAdmin/Wizards/ImportWizard/StoragePickerPage.cs @@ -45,9 +45,6 @@ namespace XenAdmin.Wizards.ImportWizard public partial class StoragePickerPage : XenTabPage { #region Private fields - - internal Host MTargetHost { set; get; } - internal IXenConnection MTargetConnection { get; set; } private volatile Task m_importTask; private bool m_alreadyFoundVM; private ActionProgressDialog m_actionDialog; @@ -99,8 +96,8 @@ namespace XenAdmin.Wizards.ImportWizard SetButtonNextEnabled(false); m_buttonPreviousEnabled = false; OnPageUpdated(); - ImportXvaAction = new ImportVmAction(MTargetHost == null ? MTargetConnection : MTargetHost.Connection, - MTargetHost, FilePath, SR, + ImportXvaAction = new ImportVmAction(TargetHost == null ? TargetConnection : TargetHost.Connection, + TargetHost, FilePath, SR, VMOperationCommand.WarningDialogHAInvalidConfig, VMOperationCommand.StartDiagnosisForm); ImportXvaAction.Completed += m_importXvaAction_Completed; @@ -120,7 +117,7 @@ namespace XenAdmin.Wizards.ImportWizard public override void PopulatePage() { SetButtonNextEnabled(false); - m_srPicker.PopulateAsync(SrPicker.SRPickerType.VM, MTargetConnection, MTargetHost, null, null); + m_srPicker.PopulateAsync(SrPicker.SRPickerType.VM, TargetConnection, TargetHost, null, null); IsDirty = true; } @@ -138,6 +135,10 @@ namespace XenAdmin.Wizards.ImportWizard #region Accessors + internal IXenConnection TargetConnection { get; set; } + + internal Host TargetHost { get; set; } + public ImportVmAction ImportXvaAction { get; private set; } public string FilePath { private get; set; } @@ -184,12 +185,12 @@ namespace XenAdmin.Wizards.ImportWizard while (ImportXvaAction.RelatedTask == null) Thread.Sleep(100); - while ((m_importTask = MTargetConnection.Resolve(ImportXvaAction.RelatedTask)) == null) + while ((m_importTask = TargetConnection.Resolve(ImportXvaAction.RelatedTask)) == null) Thread.Sleep(100); // We register a XenObjectsUpdated event handler where we check that the import task has the object creation phase marked as "complete"; // Once the object creation is complete, we look for the vm; When we found the vm we unregister this event handler; - MTargetConnection.XenObjectsUpdated += targetConnection_XenObjectsUpdated; + TargetConnection.XenObjectsUpdated += targetConnection_XenObjectsUpdated; Program.Invoke(this, CheckTask); } @@ -221,11 +222,11 @@ namespace XenAdmin.Wizards.ImportWizard { // Should never get here (as we unregister XenObjectsUpdated event handler after we find the vm) but just in case, // unregister XenObjectsUpdated event handler - MTargetConnection.XenObjectsUpdated -= targetConnection_XenObjectsUpdated; + TargetConnection.XenObjectsUpdated -= targetConnection_XenObjectsUpdated; return; } - foreach (VM vm in MTargetConnection.Cache.VMs) + foreach (VM vm in TargetConnection.Cache.VMs) { if (!vm.other_config.ContainsKey(ImportVmAction.IMPORT_TASK)) continue; @@ -238,7 +239,7 @@ namespace XenAdmin.Wizards.ImportWizard ImportedVm = vm; // We found the VM, unregister XenObjectsUpdated event handler - MTargetConnection.XenObjectsUpdated -= targetConnection_XenObjectsUpdated; + TargetConnection.XenObjectsUpdated -= targetConnection_XenObjectsUpdated; // And close the dialog, flick to next page. m_actionDialog.Close(); @@ -267,7 +268,7 @@ namespace XenAdmin.Wizards.ImportWizard if (!(ImportXvaAction.Succeeded) || ImportXvaAction.Cancelled) { // task failed or has been cancelled, unregister XenObjectsUpdated event handler - MTargetConnection.XenObjectsUpdated -= targetConnection_XenObjectsUpdated; + TargetConnection.XenObjectsUpdated -= targetConnection_XenObjectsUpdated; // Give the user a chance to correct any errors m_actionDialog = null; diff --git a/XenModel/Mappings/VmMapping.cs b/XenModel/Mappings/VmMapping.cs index a7c85a665..0696f002e 100644 --- a/XenModel/Mappings/VmMapping.cs +++ b/XenModel/Mappings/VmMapping.cs @@ -44,6 +44,11 @@ namespace XenAdmin.Mappings } public string VmNameLabel { get; set; } + public ulong Capacity { get; set; } + public ulong CpuCount { get; set; } + public ulong Memory { get; set; } + public string BootParams { get; set; } + public string PlatformSettings { get; set; } /// /// OpaqueRef of the target pool or host @@ -66,5 +71,26 @@ namespace XenAdmin.Mappings /// Keyed on the id in the ovf file /// public Dictionary Networks { get; set; } - } + + public override bool Equals(object obj) + { + return obj is VmMapping other && + VmNameLabel == other.VmNameLabel && + Capacity == other.Capacity && + CpuCount == other.CpuCount && + Memory == other.Memory && + BootParams == other.BootParams && + PlatformSettings == other.PlatformSettings && + XenRef == other.XenRef && + TargetName == other.TargetName && + Storage == other.Storage && + StorageToAttach == other.StorageToAttach && + Networks == other.Networks; + } + + public override int GetHashCode() + { + return base.GetHashCode(); + } + } } diff --git a/XenOvfApi/OVF.cs b/XenOvfApi/OVF.cs index 3cd2c657b..310dd4fbf 100644 --- a/XenOvfApi/OVF.cs +++ b/XenOvfApi/OVF.cs @@ -1388,7 +1388,7 @@ namespace XenOvf #region CREATEs public static EnvelopeType CreateOvfEnvelope(string vmName, ulong cpuCount, ulong memory, - string bootParams, string platformSettings, ulong diskCapacity, bool isWim, ulong additionalSpace, + string bootParams, string platformSettings, ulong capacity, string diskPath, ulong imageLength, string productBrand) { EnvelopeType env = CreateEnvelope(vmName); @@ -1415,10 +1415,6 @@ namespace XenOvf AddNetwork(env, systemID, netId, string.Format(Messages.NETWORK_NAME, 0), Messages.OVF_NET_DESCRIPTION, null); string diskId = Guid.NewGuid().ToString(); - ulong capacity = diskCapacity; - - if (isWim) - capacity += additionalSpace; AddDisk(env, systemID, diskId, diskPath, true, Messages.OVF_DISK_CAPTION, Messages.OVF_CREATED, imageLength, capacity); @@ -1426,6 +1422,45 @@ namespace XenOvf return env; } + public static EnvelopeType UpdateBootParams(EnvelopeType env, string systemID, string bootParams) + { + return UpdateOtherSystemSettingsData(env, systemID, "HVM_boot_params", "order=dc;" + bootParams); + } + + public static EnvelopeType UpdatePlatform(EnvelopeType env, string systemID, string platformSettings) + { + return UpdateOtherSystemSettingsData(env, systemID, "platform", "nx=true;acpi=true;apic=true;pae=true;stdvga=0;" + platformSettings); + } + + private static EnvelopeType UpdateOtherSystemSettingsData(EnvelopeType env, string systemID, string setting, string value) + { + VirtualHardwareSection_Type[] vhsArray = FindVirtualHardwareSection(env, systemID); + VirtualHardwareSection_Type foundVhs = null; + + foreach (VirtualHardwareSection_Type vhs in vhsArray) + { + if (vhs.System?.VirtualSystemType == null) + continue; + + var vst = vhs.System.VirtualSystemType.Value; + if (string.IsNullOrEmpty(vst) || !vst.ToLower().StartsWith("xen") && !vst.ToLower().StartsWith("hvm")) + continue; + + foundVhs = vhs; + break; + } + + if (foundVhs == null) + return env; + + var config = foundVhs.VirtualSystemOtherConfigurationData.FirstOrDefault(d => d.Name == setting); + if (config == null) + return env; + + config.Value = new cimString(value); + return env; + } + public EnvelopeType Create(DiskInfo[] vhdExports, string pathToOvf, string ovfName) { return Create(vhdExports, pathToOvf, ovfName, LANGUAGE);