CA-350411 part 2: Add conditional page control refresh in Import Wizard

Signed-off-by: Konstantina Chremmou <konstantina.chremmou@citrix.com>
This commit is contained in:
Konstantina Chremmou 2021-11-05 21:46:07 +00:00 committed by Danilo Del Busso
parent 355321faea
commit 051c205899
12 changed files with 269 additions and 178 deletions

View File

@ -55,17 +55,17 @@ namespace XenAdmin.Wizards.ImportWizard
/// <summary> /// <summary>
/// Gets the page's title (headline) /// Gets the page's title (headline)
/// </summary> /// </summary>
public override string PageTitle { get { return Messages.IMAGE_DEFINITION_PAGE_TITLE; } } public override string PageTitle => Messages.IMAGE_DEFINITION_PAGE_TITLE;
/// <summary> /// <summary>
/// Gets the page's label in the (left hand side) wizard progress panel /// Gets the page's label in the (left hand side) wizard progress panel
/// </summary> /// </summary>
public override string Text { get { return Messages.IMAGE_DEFINITION_PAGE_TEXT; } } public override string Text => Messages.IMAGE_DEFINITION_PAGE_TEXT;
/// <summary> /// <summary>
/// Gets the value by which the help files section for this page is identified /// Gets the value by which the help files section for this page is identified
/// </summary> /// </summary>
public override string HelpID { get { return "VMConfig"; } } public override string HelpID => "VMConfig";
protected override bool ImplementsIsDirty() protected override bool ImplementsIsDirty()
{ {
@ -99,14 +99,14 @@ namespace XenAdmin.Wizards.ImportWizard
public bool IsWim { internal get; set; } 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 #endregion
#region Private Methods #region Private Methods

View File

@ -141,7 +141,7 @@ namespace XenAdmin.Wizards.ImportWizard
#region Accessors #region Accessors
public EnvelopeType SelectedOvfEnvelope { internal get; set; } public EnvelopeType SelectedOvfEnvelope { private get; set; }
#endregion #endregion

View File

@ -137,7 +137,7 @@ namespace XenAdmin.Wizards.ImportWizard
/// <summary> /// <summary>
/// Package containing the selected OVF appliance. /// Package containing the selected OVF appliance.
/// </summary> /// </summary>
public Package SelectedOvfPackage { internal get; set; } public Package SelectedOvfPackage { private get; set; }
#endregion #endregion

View File

@ -80,7 +80,7 @@ namespace XenAdmin.Wizards.ImportWizard
public EnvelopeType SelectedOvfEnvelope public EnvelopeType SelectedOvfEnvelope
{ {
internal get private get
{ {
return _selectedOvfEnvelope; return _selectedOvfEnvelope;
} }

View File

@ -85,7 +85,7 @@ namespace XenAdmin.Wizards.ImportWizard
return false; return false;
} }
public EnvelopeType SelectedOvfEnvelope { get; set; } public EnvelopeType SelectedOvfEnvelope { private get; set; }
protected override string IntroductionText => Messages.IMPORT_WIZARD_NETWORKING_INTRO; protected override string IntroductionText => Messages.IMPORT_WIZARD_NETWORKING_INTRO;

View File

@ -56,7 +56,7 @@ namespace XenAdmin.Wizards.ImportWizard
return true; return true;
} }
public EnvelopeType SelectedOvfEnvelope { get; set; } public EnvelopeType SelectedOvfEnvelope { private get; set; }
public override StorageResourceContainer ResourceData(string sysId) public override StorageResourceContainer ResourceData(string sysId)
{ {

View File

@ -32,18 +32,18 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using XenAdmin.Actions; using XenAdmin.Actions;
using XenAdmin.Actions.OvfActions; using XenAdmin.Actions.OvfActions;
using XenAdmin.Actions.VMActions;
using XenAdmin.Commands;
using XenAdmin.Controls; using XenAdmin.Controls;
using XenAdmin.Core; using XenAdmin.Core;
using XenAdmin.Mappings; using XenAdmin.Mappings;
using XenAdmin.Network; using XenAdmin.Network;
using XenAdmin.Wizards.GenericPages; using XenAdmin.Wizards.GenericPages;
using XenAPI; using XenAPI;
using System.Linq;
using XenAdmin.Actions.VMActions;
using XenAdmin.Commands;
using XenOvf; using XenOvf;
using XenOvf.Definitions; using XenOvf.Definitions;
using XenOvf.Utilities; using XenOvf.Utilities;
@ -78,7 +78,10 @@ namespace XenAdmin.Wizards.ImportWizard
private ImportType? m_typeOfImport; private ImportType? m_typeOfImport;
private bool m_ignoreAffinitySet; private bool m_ignoreAffinitySet;
private EnvelopeType m_envelopeFromVhd; private EnvelopeType m_envelopeFromVhd;
private IXenConnection TargetConnection { get; set; } private Package _selectedOvfPackage;
private string _selectedImagePath;
private Host _selectedAffinity;
private IXenConnection _targetConnection;
#endregion #endregion
public ImportWizard(IXenConnection con, IXenObject xenObject, string filename, bool ovfModeOnly = false) 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); m_pageXvaStorage.ImportXvaAction.EndWizard(m_pageFinish.StartVmsAutomatically, m_pageXvaNetwork.VIFs);
break; break;
case ImportType.Ovf: case ImportType.Ovf:
new ImportApplianceAction(TargetConnection, new ImportApplianceAction(_targetConnection,
m_pageImportSource.SelectedOvfPackage, m_pageImportSource.SelectedOvfPackage,
m_vmMappings, m_vmMappings,
m_pageSecurity.VerifyManifest, m_pageSecurity.VerifyManifest,
@ -139,7 +142,7 @@ namespace XenAdmin.Wizards.ImportWizard
m_pageFinish.StartVmsAutomatically).RunAsync(); m_pageFinish.StartVmsAutomatically).RunAsync();
break; break;
case ImportType.Vhd: case ImportType.Vhd:
new ImportImageAction(TargetConnection, new ImportImageAction(_targetConnection,
m_envelopeFromVhd, m_envelopeFromVhd,
Path.GetDirectoryName(m_pageImportSource.FilePath), Path.GetDirectoryName(m_pageImportSource.FilePath),
m_vmMappings, m_vmMappings,
@ -171,17 +174,15 @@ namespace XenAdmin.Wizards.ImportWizard
protected override void UpdateWizardContent(XenTabPage page) protected override void UpdateWizardContent(XenTabPage page)
{ {
var type = page.GetType(); var type = page.GetType();
var oldTypeOfImport = m_typeOfImport; //store previous type
if (type == typeof(ImportSourcePage)) if (type == typeof(ImportSourcePage))
{ {
#region ImportSourcePage var oldTypeOfImport = m_typeOfImport; //store previous type
m_typeOfImport = m_pageImportSource.TypeOfImport; m_typeOfImport = m_pageImportSource.TypeOfImport;
var appliancePages = new XenTabPage[] { m_pageEula, m_pageHost, m_pageStorage, m_pageNetwork, m_pageSecurity, m_pageOptions }; 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 imagePages = new XenTabPage[] { m_pageVMconfig, m_pageHost, m_pageStorage, m_pageNetwork, m_pageOptions };
var xvaPages = new XenTabPage[] { m_pageXvaHost, m_pageXvaStorage, m_pageXvaNetwork }; var xvaPages = new XenTabPage[] { m_pageXvaHost, m_pageXvaStorage, m_pageXvaNetwork };
var newVmMappings = m_vmMappings;
switch (m_typeOfImport) switch (m_typeOfImport)
{ {
@ -195,29 +196,27 @@ namespace XenAdmin.Wizards.ImportWizard
RemovePages(xvaPages); RemovePages(xvaPages);
AddAfterPage(m_pageImportSource, appliancePages); AddAfterPage(m_pageImportSource, appliancePages);
} }
var newSelectedOvfPackage = m_pageImportSource.SelectedOvfPackage;
var newSelectedOvfEnvelope = newSelectedOvfPackage.OvfEnvelope;
if (oldTypeOfImport != ImportType.Ovf var oldSelectedOvfPackage = _selectedOvfPackage;
|| m_pageSecurity.SelectedOvfPackage != newSelectedOvfPackage _selectedOvfPackage = m_pageImportSource.SelectedOvfPackage;
|| m_pageEula.SelectedOvfEnvelope != newSelectedOvfEnvelope
|| m_pageHost.SelectedOvfEnvelope != newSelectedOvfEnvelope if (oldTypeOfImport != ImportType.Ovf || oldSelectedOvfPackage != _selectedOvfPackage)
|| m_pageHost.VmMappings != newVmMappings
|| m_pageStorage.SelectedOvfEnvelope != newSelectedOvfEnvelope
|| lunPerVdiMappingPage.SelectedOvfEnvelope != newSelectedOvfEnvelope
|| m_pageHost.SelectedOvfEnvelope != newSelectedOvfEnvelope)
{ {
m_pageEula.SelectedOvfEnvelope = newSelectedOvfEnvelope; m_pageEula.SelectedOvfEnvelope = _selectedOvfPackage.OvfEnvelope;
m_pageSecurity.SelectedOvfPackage = newSelectedOvfPackage; m_pageSecurity.SelectedOvfPackage = _selectedOvfPackage;
CheckDisabledPages(m_pageEula, m_pageSecurity); //decide whether to disable these progress steps 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.SetDefaultTarget(m_pageHost.ChosenItem ?? m_selectedObject);
m_pageHost.VmMappings = newVmMappings; m_pageHost.VmMappings = m_vmMappings;
m_pageStorage.SelectedOvfEnvelope = newSelectedOvfEnvelope; m_pageStorage.SelectedOvfEnvelope = _selectedOvfPackage.OvfEnvelope;
lunPerVdiMappingPage.SelectedOvfEnvelope = newSelectedOvfEnvelope; lunPerVdiMappingPage.SelectedOvfEnvelope = _selectedOvfPackage.OvfEnvelope;
m_pageNetwork.SelectedOvfEnvelope = newSelectedOvfEnvelope; m_pageNetwork.SelectedOvfEnvelope = _selectedOvfPackage.OvfEnvelope;
NotifyNextPagesOfChange(m_pageEula, m_pageHost, m_pageStorage, m_pageNetwork, m_pageSecurity, m_pageOptions); NotifyNextPagesOfChange(m_pageEula, m_pageHost, m_pageStorage, m_pageNetwork, m_pageSecurity, m_pageOptions);
} }
@ -230,19 +229,19 @@ namespace XenAdmin.Wizards.ImportWizard
RemovePages(appliancePages); RemovePages(appliancePages);
RemovePages(xvaPages); RemovePages(xvaPages);
AddAfterPage(m_pageImportSource, imagePages); 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 if (oldTypeOfImport != ImportType.Vhd || oldSelectedImagePath != _selectedImagePath)
|| m_pageVMconfig.IsWim != newIsWim
|| m_pageHost.VmMappings != newVmMappings
|| m_pageHost.SelectedOvfEnvelope != null)
{ {
m_pageVMconfig.IsWim = newIsWim; m_vmMappings.Clear();
m_pageHost.SetDefaultTarget(m_pageHost.ChosenItem ?? m_selectedObject); m_pageVMconfig.IsWim = m_pageImportSource.IsWIM;
m_pageHost.SelectedOvfEnvelope = null;
m_pageHost.VmMappings = newVmMappings;
NotifyNextPagesOfChange(m_pageVMconfig, m_pageHost, m_pageStorage, m_pageNetwork, m_pageOptions); NotifyNextPagesOfChange(m_pageVMconfig, m_pageHost, m_pageStorage, m_pageNetwork, m_pageOptions);
} }
break; break;
@ -260,60 +259,107 @@ namespace XenAdmin.Wizards.ImportWizard
m_pageXvaStorage.FilePath = m_pageImportSource.FilePath; m_pageXvaStorage.FilePath = m_pageImportSource.FilePath;
break; break;
} }
#endregion
} }
else if (type == typeof(ImageVMConfigPage)) else if (type == typeof(ImageVMConfigPage))
{ {
//then use it to create an ovf for the import var newMapping = new VmMapping
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)
{ {
ResetVmMappings(m_envelopeFromVhd); VmNameLabel = m_pageVMconfig.VmName,
NotifyNextPagesOfChange(m_pageHost, m_pageStorage, m_pageNetwork); 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; if (!newMapping.Equals(oldMapping))
m_pageStorage.SelectedOvfEnvelope = m_envelopeFromVhd; {
lunPerVdiMappingPage.SelectedOvfEnvelope = m_envelopeFromVhd; m_envelopeFromVhd = OVF.CreateOvfEnvelope(newMapping.VmNameLabel,
m_pageNetwork.SelectedOvfEnvelope = m_envelopeFromVhd; 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)) else if (type == typeof(ImportSelectHostPage))
{ {
var newConnection = m_pageHost.ChosenItem?.Connection; var oldTargetConnection = _targetConnection;
var newMappings = m_pageHost.VmMappings; _targetConnection = m_pageHost.ChosenItem?.Connection;
var oldVmMappings = m_vmMappings;
m_vmMappings = m_pageHost.VmMappings;
RemovePage(m_pageRbac); if (oldTargetConnection != _targetConnection)
ConfigureRbacPage(TargetConnection); {
RemovePage(m_pageRbac);
ConfigureRbacPage(_targetConnection);
if (m_pageStorage.VmMappings != newMappings RemovePage(m_pageBootOptions);
|| m_pageNetwork.Connection != newConnection if (m_typeOfImport == ImportType.Vhd && BootModesControl.ShowBootModeOptions(_targetConnection))
|| m_pageOptions.Connection != newConnection) 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); 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); string systemId = null;
if (m_typeOfImport == ImportType.Vhd && BootModesControl.ShowBootModeOptions(TargetConnection)) if (m_envelopeFromVhd.Item is VirtualSystem_Type vs)
{ systemId = vs.id;
AddAfterPage(m_pageNetwork, m_pageBootOptions); 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; m_pageStorage.SelectedOvfEnvelope = m_envelopeFromVhd;
TargetConnection = newConnection; lunPerVdiMappingPage.SelectedOvfEnvelope = m_envelopeFromVhd;
m_pageNetwork.SelectedOvfEnvelope = m_envelopeFromVhd;
m_pageStorage.VmMappings = m_vmMappings;
m_pageStorage.Connection = TargetConnection;
m_pageNetwork.Connection = TargetConnection;
m_pageOptions.Connection = TargetConnection;
m_pageBootOptions.Connection = TargetConnection;
} }
else if (type == typeof(ImportSelectStoragePage)) else if (type == typeof(ImportSelectStoragePage))
{ {
@ -339,31 +385,31 @@ namespace XenAdmin.Wizards.ImportWizard
} }
else if (type == typeof(GlobalSelectHost)) else if (type == typeof(GlobalSelectHost))
{ {
var newConnection = m_pageXvaHost.SelectedHost == null ? m_pageXvaHost.SelectedConnection : m_pageXvaHost.SelectedHost.Connection; var oldSelectedAffinity = _selectedAffinity;
var newStorageTargetHost = m_ignoreAffinitySet ? null : m_pageXvaHost.SelectedHost; _selectedAffinity = m_pageXvaHost.SelectedHost;
var newNetworkSelectedHost = m_pageXvaHost.SelectedHost; var oldTargetConnection = _targetConnection;
_targetConnection = _selectedAffinity == null ? m_pageXvaHost.SelectedConnection : _selectedAffinity.Connection;
RemovePage(m_pageRbac); if (oldTargetConnection != _targetConnection)
ConfigureRbacPage(newConnection); {
RemovePage(m_pageRbac);
ConfigureRbacPage(_targetConnection);
}
if (m_pageXvaStorage.MTargetConnection != newConnection m_pageXvaStorage.TargetConnection = _targetConnection;
|| m_pageXvaNetwork.MSelectedConnection != newConnection m_pageXvaStorage.TargetHost = m_ignoreAffinitySet ? null : _selectedAffinity;
|| !m_pageXvaNetwork.MSelectedAffinity.Equals(newNetworkSelectedHost)
|| !m_pageXvaStorage.MTargetHost.Equals(newStorageTargetHost) 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); 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)) else if (type == typeof(StoragePickerPage))
{ {
m_pageFinish.ShowStartVmsGroupBox = m_pageXvaStorage.ImportedVm != null && !m_pageXvaStorage.ImportedVm.is_a_template; 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); 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_VMNAME, m_pageVMconfig.VmName));
temp.Add(new Tuple(Messages.FINISH_PAGE_CPUCOUNT, m_pageVMconfig.CpuCount.ToString())); 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))); 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())); temp.Add(new Tuple(Messages.BOOT_MODE, m_pageBootOptions.SelectedBootMode.StringOf()));
if (m_pageImportSource.IsWIM) if (m_pageImportSource.IsWIM)
@ -609,23 +655,6 @@ namespace XenAdmin.Wizards.ImportWizard
return temp; 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) private bool IsGUID(string expression)
{ {
if (expression != null) if (expression != null)
@ -709,15 +738,15 @@ namespace XenAdmin.Wizards.ImportWizard
private void m_pageXvaStorage_ImportVmCompleted() private void m_pageXvaStorage_ImportVmCompleted()
{ {
Program.Invoke(this, () => Program.Invoke(this, () =>
{ {
if (CurrentStepTabPage.GetType() == typeof(StoragePickerPage)) if (CurrentStepTabPage.GetType() == typeof(StoragePickerPage))
{ {
m_pageFinish.ShowStartVmsGroupBox = m_pageXvaStorage.ImportedVm != null && !m_pageXvaStorage.ImportedVm.is_a_template; 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); NotifyNextPagesOfChange(m_pageXvaNetwork);
NextStep(); NextStep();
} }
}); });
} }
private void ShowXenAppXenDesktopWarning(IXenConnection connection) private void ShowXenAppXenDesktopWarning(IXenConnection connection)

View File

@ -99,7 +99,7 @@ namespace XenAdmin.Wizards.ImportWizard
} }
} }
public EnvelopeType SelectedOvfEnvelope { get; set; } public EnvelopeType SelectedOvfEnvelope { private get; set; }
private StorageResourceContainer ResourceData(string sysId) private StorageResourceContainer ResourceData(string sysId)
{ {

View File

@ -49,9 +49,6 @@ namespace XenAdmin.Wizards.ImportWizard
#region Private fields #region Private fields
private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 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; private bool m_buttonNextEnabled;
#endregion #endregion
@ -108,6 +105,15 @@ namespace XenAdmin.Wizards.ImportWizard
#region Accessors #region Accessors
/// <summary>
/// Should be set before the Affinity is set.
/// </summary>
internal IXenConnection SelectedConnection { get; set; }
internal Host SelectedAffinity { get; set; }
internal VM VM { get; set; }
public List<VIF> VIFs public List<VIF> VIFs
{ {
get get
@ -136,12 +142,6 @@ namespace XenAdmin.Wizards.ImportWizard
#endregion #endregion
public void SetVm(VM vm)
{
m_vm = vm;
}
#region Private methods #region Private methods
private void UpdateControlsEnabledState(bool enabled) private void UpdateControlsEnabledState(bool enabled)
@ -155,7 +155,7 @@ namespace XenAdmin.Wizards.ImportWizard
{ {
NetworkNetworkColumn.Items.Clear(); NetworkNetworkColumn.Items.Clear();
var networks = MSelectedConnection.Cache.Networks.Where(ShowNetwork); var networks = SelectedConnection.Cache.Networks.Where(ShowNetwork);
foreach (XenAPI.Network network in networks) foreach (XenAPI.Network network in networks)
{ {
@ -174,18 +174,18 @@ namespace XenAdmin.Wizards.ImportWizard
m_networkGridView.SuspendLayout(); m_networkGridView.SuspendLayout();
m_networkGridView.Rows.Clear(); 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 // 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) 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 AddVIFRow(new VIF
{ {
Connection = MSelectedConnection, Connection = SelectedConnection,
device = m_networkGridView.Rows.Count.ToString(), device = m_networkGridView.Rows.Count.ToString(),
network = new XenRef<XenAPI.Network>(network.opaque_ref), network = new XenRef<XenAPI.Network>(network.opaque_ref),
MAC = Messages.MAC_AUTOGENERATE 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 // 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) foreach (VIF vif in vifs)
{ {
AddVIFRow(new VIF AddVIFRow(new VIF
{ {
Connection = MSelectedConnection, Connection = SelectedConnection,
device = vif.device, device = vif.device,
network = vif.network, network = vif.network,
MAC = Messages.MAC_AUTOGENERATE MAC = Messages.MAC_AUTOGENERATE
@ -212,7 +212,7 @@ namespace XenAdmin.Wizards.ImportWizard
else else
{ {
//We need to recreate off vm //We need to recreate off vm
var vifs = MSelectedConnection.ResolveAll(m_vm.VIFs); var vifs = SelectedConnection.ResolveAll(VM.VIFs);
foreach (VIF vif in vifs) foreach (VIF vif in vifs)
AddVIFRow(vif); AddVIFRow(vif);
} }
@ -228,7 +228,7 @@ namespace XenAdmin.Wizards.ImportWizard
private XenAPI.Network GetDefaultNetwork() private XenAPI.Network GetDefaultNetwork()
{ {
foreach (XenAPI.Network network in MSelectedConnection.Cache.Networks) foreach (XenAPI.Network network in SelectedConnection.Cache.Networks)
if (ShowNetwork(network)) if (ShowNetwork(network))
return network; return network;
@ -249,13 +249,13 @@ namespace XenAdmin.Wizards.ImportWizard
if (network.IsMember()) if (network.IsMember())
return false; return false;
if (MSelectedAffinity != null && !MSelectedAffinity.CanSeeNetwork(network)) if (SelectedAffinity != null && !SelectedAffinity.CanSeeNetwork(network))
return false; return false;
if (MSelectedAffinity == null && !network.AllHostsCanSeeNetwork()) if (SelectedAffinity == null && !network.AllHostsCanSeeNetwork())
return false; return false;
if (network.IsSriov() && !m_vm.HasSriovRecommendation()) if (network.IsSriov() && !VM.HasSriovRecommendation())
return false; return false;
return true; return true;
@ -264,7 +264,7 @@ namespace XenAdmin.Wizards.ImportWizard
private void AddVIFRow(VIF vif) private void AddVIFRow(VIF vif)
{ {
var row = new VifRow(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(); bool isGuestInstallerNetwork = network != null && network.IsGuestInstallerNetwork();
ToStringWrapper<XenAPI.Network> comboBoxEntry = FindComboBoxEntryForNetwork(network); ToStringWrapper<XenAPI.Network> comboBoxEntry = FindComboBoxEntryForNetwork(network);
@ -332,7 +332,7 @@ namespace XenAdmin.Wizards.ImportWizard
private void m_buttonAddNetwork_Click(object sender, EventArgs e) 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) using (var dlg = new ErrorDialog(FriendlyErrorNames.VIFS_MAX_ALLOWED)
{WindowTitle = FriendlyErrorNames.VIFS_MAX_ALLOWED_TITLE}) {WindowTitle = FriendlyErrorNames.VIFS_MAX_ALLOWED_TITLE})
@ -342,7 +342,7 @@ namespace XenAdmin.Wizards.ImportWizard
return; return;
} }
VIF vif = new VIF {Connection = MSelectedConnection}; VIF vif = new VIF {Connection = SelectedConnection};
int i = 0; int i = 0;
while (true) while (true)

View File

@ -45,9 +45,6 @@ namespace XenAdmin.Wizards.ImportWizard
public partial class StoragePickerPage : XenTabPage public partial class StoragePickerPage : XenTabPage
{ {
#region Private fields #region Private fields
internal Host MTargetHost { set; get; }
internal IXenConnection MTargetConnection { get; set; }
private volatile Task m_importTask; private volatile Task m_importTask;
private bool m_alreadyFoundVM; private bool m_alreadyFoundVM;
private ActionProgressDialog m_actionDialog; private ActionProgressDialog m_actionDialog;
@ -99,8 +96,8 @@ namespace XenAdmin.Wizards.ImportWizard
SetButtonNextEnabled(false); SetButtonNextEnabled(false);
m_buttonPreviousEnabled = false; m_buttonPreviousEnabled = false;
OnPageUpdated(); OnPageUpdated();
ImportXvaAction = new ImportVmAction(MTargetHost == null ? MTargetConnection : MTargetHost.Connection, ImportXvaAction = new ImportVmAction(TargetHost == null ? TargetConnection : TargetHost.Connection,
MTargetHost, FilePath, SR, TargetHost, FilePath, SR,
VMOperationCommand.WarningDialogHAInvalidConfig, VMOperationCommand.StartDiagnosisForm); VMOperationCommand.WarningDialogHAInvalidConfig, VMOperationCommand.StartDiagnosisForm);
ImportXvaAction.Completed += m_importXvaAction_Completed; ImportXvaAction.Completed += m_importXvaAction_Completed;
@ -120,7 +117,7 @@ namespace XenAdmin.Wizards.ImportWizard
public override void PopulatePage() public override void PopulatePage()
{ {
SetButtonNextEnabled(false); SetButtonNextEnabled(false);
m_srPicker.PopulateAsync(SrPicker.SRPickerType.VM, MTargetConnection, MTargetHost, null, null); m_srPicker.PopulateAsync(SrPicker.SRPickerType.VM, TargetConnection, TargetHost, null, null);
IsDirty = true; IsDirty = true;
} }
@ -138,6 +135,10 @@ namespace XenAdmin.Wizards.ImportWizard
#region Accessors #region Accessors
internal IXenConnection TargetConnection { get; set; }
internal Host TargetHost { get; set; }
public ImportVmAction ImportXvaAction { get; private set; } public ImportVmAction ImportXvaAction { get; private set; }
public string FilePath { private get; set; } public string FilePath { private get; set; }
@ -184,12 +185,12 @@ namespace XenAdmin.Wizards.ImportWizard
while (ImportXvaAction.RelatedTask == null) while (ImportXvaAction.RelatedTask == null)
Thread.Sleep(100); Thread.Sleep(100);
while ((m_importTask = MTargetConnection.Resolve(ImportXvaAction.RelatedTask)) == null) while ((m_importTask = TargetConnection.Resolve(ImportXvaAction.RelatedTask)) == null)
Thread.Sleep(100); Thread.Sleep(100);
// We register a XenObjectsUpdated event handler where we check that the import task has the object creation phase marked as "complete"; // 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; // 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); 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, // Should never get here (as we unregister XenObjectsUpdated event handler after we find the vm) but just in case,
// unregister XenObjectsUpdated event handler // unregister XenObjectsUpdated event handler
MTargetConnection.XenObjectsUpdated -= targetConnection_XenObjectsUpdated; TargetConnection.XenObjectsUpdated -= targetConnection_XenObjectsUpdated;
return; return;
} }
foreach (VM vm in MTargetConnection.Cache.VMs) foreach (VM vm in TargetConnection.Cache.VMs)
{ {
if (!vm.other_config.ContainsKey(ImportVmAction.IMPORT_TASK)) if (!vm.other_config.ContainsKey(ImportVmAction.IMPORT_TASK))
continue; continue;
@ -238,7 +239,7 @@ namespace XenAdmin.Wizards.ImportWizard
ImportedVm = vm; ImportedVm = vm;
// We found the VM, unregister XenObjectsUpdated event handler // We found the VM, unregister XenObjectsUpdated event handler
MTargetConnection.XenObjectsUpdated -= targetConnection_XenObjectsUpdated; TargetConnection.XenObjectsUpdated -= targetConnection_XenObjectsUpdated;
// And close the dialog, flick to next page. // And close the dialog, flick to next page.
m_actionDialog.Close(); m_actionDialog.Close();
@ -267,7 +268,7 @@ namespace XenAdmin.Wizards.ImportWizard
if (!(ImportXvaAction.Succeeded) || ImportXvaAction.Cancelled) if (!(ImportXvaAction.Succeeded) || ImportXvaAction.Cancelled)
{ {
// task failed or has been cancelled, unregister XenObjectsUpdated event handler // 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 // Give the user a chance to correct any errors
m_actionDialog = null; m_actionDialog = null;

View File

@ -44,6 +44,11 @@ namespace XenAdmin.Mappings
} }
public string VmNameLabel { get; set; } 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; }
/// <summary> /// <summary>
/// OpaqueRef of the target pool or host /// OpaqueRef of the target pool or host
@ -66,5 +71,26 @@ namespace XenAdmin.Mappings
/// Keyed on the id in the ovf file /// Keyed on the id in the ovf file
/// </summary> /// </summary>
public Dictionary<string, XenAPI.Network> Networks { get; set; } public Dictionary<string, XenAPI.Network> 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();
}
}
} }

View File

@ -1388,7 +1388,7 @@ namespace XenOvf
#region CREATEs #region CREATEs
public static EnvelopeType CreateOvfEnvelope(string vmName, ulong cpuCount, ulong memory, 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) string diskPath, ulong imageLength, string productBrand)
{ {
EnvelopeType env = CreateEnvelope(vmName); 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); AddNetwork(env, systemID, netId, string.Format(Messages.NETWORK_NAME, 0), Messages.OVF_NET_DESCRIPTION, null);
string diskId = Guid.NewGuid().ToString(); 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); AddDisk(env, systemID, diskId, diskPath, true, Messages.OVF_DISK_CAPTION, Messages.OVF_CREATED, imageLength, capacity);
@ -1426,6 +1422,45 @@ namespace XenOvf
return env; 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) public EnvelopeType Create(DiskInfo[] vhdExports, string pathToOvf, string ovfName)
{ {
return Create(vhdExports, pathToOvf, ovfName, LANGUAGE); return Create(vhdExports, pathToOvf, ovfName, LANGUAGE);