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);