Merge pull request #1141 from GaborApatiNagy/CP-18014

CP-18014 + Merge master
This commit is contained in:
mcintyre94 2016-08-26 16:45:08 +01:00 committed by GitHub
commit 9acf3950fd
82 changed files with 5782 additions and 2273 deletions

View File

@ -0,0 +1,92 @@
/* Copyright (c) Citrix Systems Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms,
* with or without modification, are permitted provided
* that the following conditions are met:
*
* * Redistributions of source code must retain the above
* copyright notice, this list of conditions and the
* following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other
* materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
using System;
using System.Collections.Generic;
using System.Text;
using XenAdmin.Network;
using XenAdmin.Core;
using System.Linq;
using XenAPI;
namespace XenAdmin.Actions
{
public class RestoreDismissedUpdatesAction : AsyncAction
{
private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
public RestoreDismissedUpdatesAction(IXenConnection connection)
: base(connection, "restore_dismissed_updates", "restore_dismissed_updates", true)
{
}
protected override void Run()
{
if (!AllowedToRestoreDismissedUpdates())
return;
XenAPI.Pool pool = Helpers.GetPoolOfOne(Connection);
if (pool == null)
return;
Dictionary<string, string> other_config = pool.other_config;
if (other_config.ContainsKey(IgnorePatchAction.IgnorePatchKey))
other_config.Remove(IgnorePatchAction.IgnorePatchKey);
if (other_config.ContainsKey(IgnoreServerAction.LAST_SEEN_SERVER_VERSION_KEY))
other_config.Remove(IgnoreServerAction.LAST_SEEN_SERVER_VERSION_KEY);
XenAPI.Pool.set_other_config(Connection.Session, pool.opaque_ref, other_config);
}
/// <summary>
/// Checks the user has sufficient RBAC privileges to restore dismissed alerts on a given connection
/// </summary>
private bool AllowedToRestoreDismissedUpdates()
{
if (Connection == null || Connection.Session == null)
return false;
if (Connection.Session.IsLocalSuperuser)
return true;
List<Role> rolesAbleToCompleteAction = Role.ValidRoleList("Pool.set_other_config", Connection);
foreach (Role possibleRole in rolesAbleToCompleteAction)
{
if (Connection.Session.Roles.Contains(possibleRole))
return true;
}
return false;
}
}
}

View File

@ -38,7 +38,7 @@ using XenAPI;
namespace XenAdmin.Commands
{
/// <summary>
/// The command for the 'Home Server' subitem which is shown when WLB isn't enabled in the submenu for start-on, resume-on or migrate.
/// The command for the 'Target Server' subitem which is shown when WLB isn't enabled in the submenu for start-on, resume-on or migrate.
/// </summary>
internal class CrossPoolMigrateToHomeCommand : CrossPoolMigrateCommand
{

View File

@ -71,7 +71,7 @@ namespace XenAdmin.Commands
protected override bool CanExecuteCore(SelectedItemCollection selection)
{
return _connection != null && _connection.IsConnected;
return _connection != null && (_connection.IsConnected || _connection.InProgress);
}
/// <summary>

View File

@ -150,7 +150,7 @@ namespace XenAdmin.Commands
DialogResult dr = new InstallToolsWarningDialog(vm.Connection).ShowDialog(Parent);
if (dr == DialogResult.Yes)
{
InstallPVToolsAction installToolsAction = new InstallPVToolsAction( vm, XSToolsSRNotFound, Properties.Settings.Default.ShowHiddenVMs);
var installToolsAction = new InstallPVToolsAction(vm, Properties.Settings.Default.ShowHiddenVMs);
installToolsAction.Completed += InstallToolsActionCompleted;
installToolsAction.RunAsync();
@ -160,18 +160,6 @@ namespace XenAdmin.Commands
return null;
}
private static void XSToolsSRNotFound()
{
Program.Invoke(Program.MainWindow, delegate
{
using (var dlg = new ThreeButtonDialog(
new ThreeButtonDialog.Details(SystemIcons.Error, Messages.XS_TOOLS_SR_NOT_FOUND, Messages.XENCENTER)))
{
dlg.ShowDialog(Program.MainWindow);
}
});
}
/// <summary>
/// Attempts to install tools on several VMs
/// </summary>
@ -225,7 +213,7 @@ namespace XenAdmin.Commands
{
foreach (VM vm in vms)
{
InstallPVToolsAction installToolsAction = new InstallPVToolsAction(vm, XSToolsSRNotFound, Properties.Settings.Default.ShowHiddenVMs);
var installToolsAction = new InstallPVToolsAction(vm, Properties.Settings.Default.ShowHiddenVMs);
if (vms.IndexOf(vm) == 0)
{

View File

@ -379,6 +379,11 @@ namespace XenAdmin.Core
get { return ReadInstalledKey(ADDITIONAL_FEATURES); }
}
public static string CustomUpdatesXmlLocation
{
get { return ReadKey(CUSTOM_UPDATES_XML_LOCATION); }
}
private const string SSL_CERTIFICATES_CHANGED_ONLY = "CHANGED";
private const string SSL_CERTIFICATES_ALL = "ALL";
private const string SSL_CERTIFICATES_KEY = "ForceSSLCertificates";
@ -402,6 +407,7 @@ namespace XenAdmin.Core
private const string HEALTH_CHECK_PRODUCT_KEY = "HealthCheckProductKey";
private const string HIDDEN_FEATURES = "HiddenFeatures";
private const string ADDITIONAL_FEATURES = "AdditionalFeatures";
private const string CUSTOM_UPDATES_XML_LOCATION = "CheckForUpdatesXmlLocationOverride";
}
public enum SSLCertificateTypes { None, Changed, All }

View File

@ -37,7 +37,7 @@ using XenAdmin.Actions;
using XenAPI;
using XenAdmin.Alerts;
using XenAdmin.Network;
using System.Diagnostics;
namespace XenAdmin.Core
{
@ -47,12 +47,13 @@ namespace XenAdmin.Core
public static event Action<bool, string> CheckForUpdatesCompleted;
public static event Action CheckForUpdatesStarted;
public static event Action RestoreDismissedUpdatesStarted;
private static readonly object downloadedUpdatesLock = new object();
private static List<XenServerVersion> XenServerVersionsForAutoCheck = new List<XenServerVersion>();
private static List<XenServerPatch> XenServerPatches = new List<XenServerPatch>();
private static List<XenCenterVersion> XenCenterVersions = new List<XenCenterVersion>();
private static List<XenServerVersion> XenServerVersions = new List<XenServerVersion>();
public static List<XenServerVersion> XenServerVersions = new List<XenServerVersion>();
private static readonly object updateAlertsLock = new object();
private static readonly ChangeableList<Alert> updateAlerts = new ChangeableList<Alert>();
@ -197,10 +198,9 @@ namespace XenAdmin.Core
Properties.Settings.Default.AllowXenCenterUpdates || force,
Properties.Settings.Default.AllowXenServerUpdates || force,
Properties.Settings.Default.AllowPatchesUpdates || force,
Branding.CheckForUpdatesUrl);
{
action.Completed += actionCompleted;
}
Updates.CheckForUpdatesUrl);
action.Completed += actionCompleted;
if (CheckForUpdatesStarted != null)
CheckForUpdatesStarted();
@ -208,7 +208,15 @@ namespace XenAdmin.Core
action.RunAsync();
}
}
public static string CheckForUpdatesUrl
{
get
{
return Registry.CustomUpdatesXmlLocation ?? Branding.CheckForUpdatesUrl;
}
}
private static void actionCompleted(ActionBase sender)
{
Program.AssertOffEventThread();
@ -405,6 +413,229 @@ namespace XenAdmin.Core
return alerts;
}
/// <summary>
/// This method returns the minimal set of patches for a host if this class already has information about them. Otherwise it returns empty list.
/// Calling this function will not initiate a download or update.
/// </summary>
/// <param name="host"></param>
/// <returns></returns>
public static List<XenServerPatch> RecommendedPatchesForHost(Host host)
{
var recommendedPatches = new List<XenServerPatch>();
if (XenServerVersions == null)
return recommendedPatches;
var serverVersions = XenServerVersions.FindAll(version =>
{
if (version.BuildNumber != string.Empty)
return (host.BuildNumberRaw == version.BuildNumber);
return Helpers.HostProductVersionWithOEM(host) == version.VersionAndOEM
|| (version.Oem != null && Helpers.OEMName(host).StartsWith(version.Oem)
&& Helpers.HostProductVersion(host) == version.Version.ToString());
});
if (serverVersions.Count != 0)
{
var minimumPatches = serverVersions[0].MinimalPatches;
if (minimumPatches == null) //unknown
return recommendedPatches;
var appliedPatches = host.AppliedPatches();
recommendedPatches = minimumPatches.FindAll(p => !appliedPatches.Any(ap => string.Equals(ap.uuid, p.Uuid, StringComparison.OrdinalIgnoreCase)));
}
return recommendedPatches;
}
public static UpgradeSequence GetUpgradeSequence(IXenConnection conn)
{
return GetUpgradeSequence(conn, XenServerVersions);
}
public static UpgradeSequence GetUpgradeSequence(IXenConnection conn, List<XenServerVersion> xsVersions)
{
if (xsVersions == null)
return null;
Host master = Helpers.GetMaster(conn);
if (master == null)
return null;
var version = GetCommonServerVersionOfHostsInAConnection(conn, xsVersions);
if (version != null)
{
if (version.MinimalPatches == null)
return null;
var uSeq = new UpgradeSequence();
uSeq.MinimalPatches = version.MinimalPatches;
List<Host> hosts = conn.Cache.Hosts.ToList();
foreach (Host h in hosts)
{
uSeq[h] = GetUpgradeSequenceForHost(h, uSeq.MinimalPatches);
}
return uSeq;
}
else
{
return null;
}
}
/// <summary>
/// Returns a XenServerVersion if all hosts of the pool have the same version
/// Returns null if it is unknown or they don't match
/// </summary>
/// <returns></returns>
private static XenServerVersion GetCommonServerVersionOfHostsInAConnection(IXenConnection connection, List<XenServerVersion> xsVersions)
{
XenServerVersion commonXenServerVersion = null;
if (connection == null)
return null;
List<Host> hosts = connection.Cache.Hosts.ToList();
foreach (Host host in hosts)
{
var hostVersions = xsVersions.FindAll(version =>
{
if (version.BuildNumber != string.Empty)
return (host.BuildNumberRaw == version.BuildNumber);
return Helpers.HostProductVersionWithOEM(host) == version.VersionAndOEM
|| (version.Oem != null && Helpers.OEMName(host).StartsWith(version.Oem)
&& Helpers.HostProductVersion(host) == version.Version.ToString());
});
var foundVersion = hostVersions.FirstOrDefault();
if (foundVersion == null)
{
return null;
}
else
{
if (commonXenServerVersion == null)
{
commonXenServerVersion = foundVersion;
}
else
{
if (commonXenServerVersion != foundVersion)
return null;
}
}
}
return commonXenServerVersion;
}
private static List<XenServerPatch> GetUpgradeSequenceForHost(Host h, List<XenServerPatch> latestPatches)
{
var sequence = new List<XenServerPatch>();
var appliedPatches = h.AppliedPatches();
var neededPatches = new List<XenServerPatch>(latestPatches);
//Iterate through latestPatches once; in each iteration, move the first item from L0 that has its dependencies met to the end of the Update Schedule (US)
for (int ii = 0; ii < neededPatches.Count; ii++)
{
var p = neededPatches[ii];
//checking requirements
if (//not applied yet
!appliedPatches.Any(ap => string.Equals(ap.uuid, p.Uuid, StringComparison.OrdinalIgnoreCase))
// and either no requirements or they are meet
&& (p.RequiredPatches == null
|| p.RequiredPatches.Count == 0
// all requirements met?
|| p.RequiredPatches.All(
rp =>
//sequence already has the required-patch
(sequence.Count != 0 && sequence.Any(useqp => string.Equals(useqp.Uuid, rp, StringComparison.OrdinalIgnoreCase)))
//the required-patch has already been applied
|| (appliedPatches.Count != 0 && appliedPatches.Any(ap => string.Equals(ap.uuid, rp, StringComparison.OrdinalIgnoreCase)))
)
))
{
// this patch can be added to the upgrade sequence now
sequence.Add(p);
// by now the patch has either been added to the upgrade sequence or something already contains it among the installed patches
neededPatches.RemoveAt(ii);
//resetting position - the loop will start on 0. item
ii = -1;
}
}
return sequence;
}
public class UpgradeSequence : Dictionary<Host, List<XenServerPatch>>
{
private IEnumerable<XenServerPatch> AllPatches
{
get
{
foreach (var patches in this.Values)
foreach(var patch in patches)
yield return patch;
}
}
public List<XenServerPatch> UniquePatches
{
get
{
var uniquePatches = new List<XenServerPatch>();
foreach (var mp in MinimalPatches)
{
if (AllPatches.Any(p => p.Uuid == mp.Uuid))
{
uniquePatches.Add(mp);
}
}
return uniquePatches;
}
}
public bool AllHostsUpToDate
{
get
{
if (this.Count == 0)
return false;
foreach (var host in this.Keys)
{
if (this[host].Count > 0)
return false;
}
return true;
}
}
public List<XenServerPatch> MinimalPatches
{
set;
get;
}
}
public static XenServerVersionAlert NewXenServerVersionAlert(List<XenServerVersion> xenServerVersions)
{
@ -473,53 +704,28 @@ namespace XenAdmin.Core
public static void RestoreDismissedUpdates()
{
foreach (IXenConnection _connection in ConnectionsManager.XenConnectionsCopy)
{
if (!AllowedToRestoreDismissedUpdates(_connection))
continue;
var actions = new List<AsyncAction>();
foreach (IXenConnection connection in ConnectionsManager.XenConnectionsCopy)
actions.Add(new RestoreDismissedUpdatesAction(connection));
XenAPI.Pool pool = Helpers.GetPoolOfOne(_connection);
if (pool == null)
continue;
var action = new ParallelAction(Messages.RESTORE_DISMISSED_UPDATES, Messages.RESTORING, Messages.COMPLETED, actions, true, false);
action.Completed += action_Completed;
Dictionary<string, string> other_config = pool.other_config;
if (RestoreDismissedUpdatesStarted != null)
RestoreDismissedUpdatesStarted();
if (other_config.ContainsKey(IgnorePatchAction.IgnorePatchKey))
{
other_config.Remove(IgnorePatchAction.IgnorePatchKey);
}
if (other_config.ContainsKey(IgnoreServerAction.LAST_SEEN_SERVER_VERSION_KEY))
{
other_config.Remove(IgnoreServerAction.LAST_SEEN_SERVER_VERSION_KEY);
}
XenAPI.Pool.set_other_config(_connection.Session, pool.opaque_ref, other_config);
}
Properties.Settings.Default.LatestXenCenterSeen = "";
Settings.TrySaveSettings();
Updates.CheckForUpdates(true);
action.RunAsync();
}
/// <summary>
/// Checks the user has sufficient RBAC privileges to restore dismissed alerts on a given connection
/// </summary>
public static bool AllowedToRestoreDismissedUpdates(IXenConnection c)
private static void action_Completed(ActionBase action)
{
if (c == null || c.Session == null)
return false;
if (c.Session.IsLocalSuperuser)
return true;
List<Role> rolesAbleToCompleteAction = Role.ValidRoleList("Pool.set_other_config", c);
foreach (Role possibleRole in rolesAbleToCompleteAction)
Program.Invoke(Program.MainWindow, () =>
{
if (c.Session.Roles.Contains(possibleRole))
return true;
}
return false;
Properties.Settings.Default.LatestXenCenterSeen = "";
Settings.TrySaveSettings();
CheckForUpdates(true);
});
}
}
}

View File

@ -0,0 +1,93 @@
/* Copyright (c) Citrix Systems Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms,
* with or without modification, are permitted provided
* that the following conditions are met:
*
* * Redistributions of source code must retain the above
* copyright notice, this list of conditions and the
* following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other
* materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
using System;
using XenAPI;
using XenAdmin.Diagnostics.Problems;
using XenAdmin.Core;
using System.IO;
using XenAdmin.Diagnostics.Problems.HostProblem;
using System.Text.RegularExpressions;
using System.Xml;
using System.Collections.Generic;
using XenAdmin.Actions;
using System.Linq;
namespace XenAdmin.Diagnostics.Checks
{
class DiskSpaceForBatchUpdatesCheck : Check
{
private readonly long size = 0;
public DiskSpaceForBatchUpdatesCheck(Host host, long size)
: base(host)
{
this.size = size;
}
protected override Problem RunCheck()
{
if (!Host.IsLive)
return new HostNotLiveWarning(this, Host);
if (!Host.Connection.IsConnected)
throw new EndOfStreamException(Helpers.GetName(Host.Connection));
if (Helpers.CreamOrGreater(Host.Connection))
{
var action = new GetDiskSpaceRequirementsAction(Host, size, true, DiskSpaceRequirements.OperationTypes.autoupdate);
try
{
action.RunExternal(action.Session);
}
catch
{
log.WarnFormat("Could not get disk space requirements");
}
if (action.Succeeded && action.DiskSpaceRequirements.AvailableDiskSpace < size)
return new HostOutOfSpaceProblem(this, Host, null, action.DiskSpaceRequirements);
}
return null;
}
public override string Description
{
get { return Messages.SERVER_SIDE_CHECK_AUTO_MODE_DESCRIPTION; }
}
private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
}
}

View File

@ -53,6 +53,11 @@ namespace XenAdmin.Diagnostics.Checks
private readonly Dictionary<string, LivePatchCode> livePatchCodesByHost;
public PatchPrecheckCheck(Host host, Pool_patch patch)
: this(host, patch, null)
{
}
public PatchPrecheckCheck(Host host, Pool_patch patch, Dictionary<string, LivePatchCode> livePatchCodesByHost)
: base(host)
{

View File

@ -39,7 +39,8 @@ using XenAdmin.Actions.VMActions;
using System.Collections.Generic;
using XenAdmin.Dialogs;
using System.Drawing;
using System;
using System;
using System.Diagnostics;
namespace XenAdmin.Diagnostics.Problems.HostProblem
@ -59,10 +60,22 @@ namespace XenAdmin.Diagnostics.Problems.HostProblem
public override string Description
{
get
{
return string.Format(diskSpaceReq.Operation == DiskSpaceRequirements.OperationTypes.install
? Messages.NOT_ENOUGH_SPACE_MESSAGE_INSTALL
: Messages.NOT_ENOUGH_SPACE_MESSAGE_UPLOAD, Server.Name, patch.Name);
{
switch (diskSpaceReq.Operation)
{
case DiskSpaceRequirements.OperationTypes.install :
return string.Format(Messages.NOT_ENOUGH_SPACE_MESSAGE_INSTALL, Server.Name, patch.Name);
case DiskSpaceRequirements.OperationTypes.upload :
return string.Format(Messages.NOT_ENOUGH_SPACE_MESSAGE_UPLOAD, Server.Name, patch.Name);
case DiskSpaceRequirements.OperationTypes.autoupdate :
return string.Format(Messages.NOT_ENOUGH_SPACE_MESSAGE_AUTO_UPDATE, Server.Name);
default:
Debug.Assert(false);
return string.Empty;
}
}
}

View File

@ -79,7 +79,6 @@ namespace XenAdmin.Dialogs
private VMEnlightenmentEditPage VMEnlightenmentEditPage;
private Page_CloudConfigParameters CloudConfigParametersPage;
private SecurityEditPage SecurityEditPage;
private LivePatchingEditPage LivePatchingEditPage;
#endregion
private IXenObject xenObject, xenObjectBefore, xenObjectCopy;
@ -201,9 +200,6 @@ namespace XenAdmin.Dialogs
if (is_pool_or_standalone && !Helpers.FeatureForbidden(xenObject.Connection, Host.RestrictSslLegacySwitch))
ShowTab(SecurityEditPage = new SecurityEditPage());
if (is_pool_or_standalone && !Helpers.FeatureForbidden(xenObject.Connection, Host.RestrictLivePatching))
ShowTab(LivePatchingEditPage = new LivePatchingEditPage());
if (is_network)
ShowTab(editNetworkPage = new EditNetworkPage());

View File

@ -2706,6 +2706,9 @@
<data name="statusLabel.ImageAlign" type="System.Drawing.ContentAlignment, System.Drawing">
<value>MiddleLeft</value>
</data>
<data name="statusLabel.ImageScaling" type="System.Windows.Forms.ToolStripItemImageScaling, System.Windows.Forms">
<value>None</value>
</data>
<data name="statusLabel.Size" type="System.Drawing.Size, System.Drawing">
<value>883, 22</value>
</data>
@ -3843,4 +3846,4 @@
<data name="&gt;&gt;$this.Type" xml:space="preserve">
<value>System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
</root>
</root>

View File

@ -243,7 +243,7 @@ namespace XenAdmin.SettingsPanels
{
// Create the display label
Label lblKey = new Label();
lblKey.Text = customFieldDefinition.Name;
lblKey.Text = customFieldDefinition.Name.EscapeAmpersands();
lblKey.Margin = new Padding(3, 7, 3, 3);
lblKey.Font = Program.DefaultFont;
lblKey.Width = (int)tableLayoutPanel.ColumnStyles[0].Width;

View File

@ -84,10 +84,7 @@ namespace XenAdmin.SettingsPanels
return;
Host currentAffinity = vm.Connection.Resolve(vm.affinity);
picker.SetAffinity(vm.Connection, currentAffinity,
vm.HasNoDisksAndNoLocalCD
? null
: vm.GetStorageHost(false));
picker.SetAffinity(vm.Connection, currentAffinity, null);
}
public bool ValidToSave

View File

@ -1,88 +0,0 @@
namespace XenAdmin.SettingsPanels
{
partial class LivePatchingEditPage
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(LivePatchingEditPage));
this.radioButtonDisable = new System.Windows.Forms.RadioButton();
this.radioButtonEnable = new System.Windows.Forms.RadioButton();
this.labelRubric = new System.Windows.Forms.Label();
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
this.tableLayoutPanel1.SuspendLayout();
this.SuspendLayout();
//
// radioButtonDisable
//
resources.ApplyResources(this.radioButtonDisable, "radioButtonDisable");
this.radioButtonDisable.Name = "radioButtonDisable";
this.radioButtonDisable.TabStop = true;
this.radioButtonDisable.UseVisualStyleBackColor = true;
//
// radioButtonEnable
//
resources.ApplyResources(this.radioButtonEnable, "radioButtonEnable");
this.radioButtonEnable.Name = "radioButtonEnable";
this.radioButtonEnable.TabStop = true;
this.radioButtonEnable.UseVisualStyleBackColor = true;
//
// labelRubric
//
resources.ApplyResources(this.labelRubric, "labelRubric");
this.labelRubric.BackColor = System.Drawing.Color.Transparent;
this.labelRubric.Name = "labelRubric";
//
// tableLayoutPanel1
//
resources.ApplyResources(this.tableLayoutPanel1, "tableLayoutPanel1");
this.tableLayoutPanel1.Controls.Add(this.labelRubric, 0, 0);
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
//
// LivePatchingEditPage
//
resources.ApplyResources(this, "$this");
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
this.Controls.Add(this.tableLayoutPanel1);
this.Controls.Add(this.radioButtonDisable);
this.Controls.Add(this.radioButtonEnable);
this.Name = "LivePatchingEditPage";
this.tableLayoutPanel1.ResumeLayout(false);
this.tableLayoutPanel1.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.RadioButton radioButtonDisable;
private System.Windows.Forms.RadioButton radioButtonEnable;
private System.Windows.Forms.Label labelRubric;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
}
}

View File

@ -1,121 +0,0 @@
/* Copyright (c) Citrix Systems Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms,
* with or without modification, are permitted provided
* that the following conditions are met:
*
* * Redistributions of source code must retain the above
* copyright notice, this list of conditions and the
* following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other
* materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
using System.Drawing;
using System.Windows.Forms;
using XenAdmin.Actions;
using XenAdmin.Core;
using XenAPI;
namespace XenAdmin.SettingsPanels
{
public partial class LivePatchingEditPage : UserControl, IEditPage
{
private Pool pool;
public LivePatchingEditPage()
{
InitializeComponent();
Text = Messages.LIVE_PATCHING;
}
#region IEditPage Members
public AsyncAction SaveSettings()
{
bool now_enabled = radioButtonEnable.Checked;
string title = null;
string description = null;
if (now_enabled)
{
title = Messages.ACTION_ENABLE_LIVE_PATCHING;
description = Messages.ACTION_ENABLING_LIVE_PATCHING;
}
else
{
title = Messages.ACTION_DISABLE_LIVE_PATCHING;
description = Messages.ACTION_DISABLING_LIVE_PATCHING;
}
return new DelegatedAsyncAction(pool.Connection, title, description, null,
delegate(Session session) { Pool.set_live_patching_disabled(session, pool.opaque_ref, radioButtonDisable.Checked); }, true);
}
public void SetXenObjects(IXenObject orig, IXenObject clone)
{
pool = Helpers.GetPoolOfOne(clone.Connection); // clone could be a pool or a host
if (pool.live_patching_disabled)
{
radioButtonDisable.Checked = true;
}
else
{
radioButtonEnable.Checked = true;
}
}
public bool ValidToSave
{
get { return true; }
}
public void ShowLocalValidationMessages()
{ }
public void Cleanup()
{ }
public bool HasChanged
{
// Server flag is for disabled, so compare to disable radio
get { return pool.live_patching_disabled != radioButtonDisable.Checked; }
}
#endregion
#region VerticalTab Members
public string SubText
{
get { return radioButtonEnable.Checked? Messages.ENABLED : Messages.DISABLED; }
}
public Image Image
{
get { return Properties.Resources._000_Patch_h32bit_16; }
}
#endregion
}
}

View File

@ -1,273 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
<xsd:element msdata:IsDataSet="true" name="root">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element minOccurs="0" name="value" type="xsd:string"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required"/>
<xsd:attribute name="type" type="xsd:string"/>
<xsd:attribute name="mimetype" type="xsd:string"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string"/>
<xsd:attribute name="name" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element minOccurs="0" msdata:Ordinal="1" name="value" type="xsd:string"/>
<xsd:element minOccurs="0" msdata:Ordinal="2" name="comment" type="xsd:string"/>
</xsd:sequence>
<xsd:attribute msdata:Ordinal="1" name="name" type="xsd:string" use="required"/>
<xsd:attribute msdata:Ordinal="3" name="type" type="xsd:string"/>
<xsd:attribute msdata:Ordinal="4" name="mimetype" type="xsd:string"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element minOccurs="0" msdata:Ordinal="1" name="value" type="xsd:string"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
<data name="labelRubric.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Left, Right</value>
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
<data name="labelRubric.Location" type="System.Drawing.Point, System.Drawing">
<value>4, 4</value>
</data>
<data name="labelRubric.Size" type="System.Drawing.Size, System.Drawing">
<value>473, 17</value>
</data>
<assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
<data name="labelRubric.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="labelRubric.Text" xml:space="preserve">
<value>このプールとの通信に使用できるセキュリティ プロトコルを選択します。</value>
</data>
<data name="&gt;&gt;labelRubric.Name" xml:space="preserve">
<value>labelRubric</value>
</data>
<data name="&gt;&gt;labelRubric.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;labelRubric.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;labelRubric.ZOrder" xml:space="preserve">
<value>4</value>
</data>
<data name="radioButtonTLS.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="radioButtonTLS.Location" type="System.Drawing.Point, System.Drawing">
<value>7, 31</value>
</data>
<data name="radioButtonTLS.Size" type="System.Drawing.Size, System.Drawing">
<value>174, 17</value>
</data>
<data name="radioButtonTLS.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="radioButtonTLS.Text" xml:space="preserve">
<value>最大セキュリティ: TLS 1.2 のみ(&amp;M)</value>
</data>
<data name="&gt;&gt;radioButtonTLS.Name" xml:space="preserve">
<value>radioButtonTLS</value>
</data>
<data name="&gt;&gt;radioButtonTLS.Type" xml:space="preserve">
<value>System.Windows.Forms.RadioButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;radioButtonTLS.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;radioButtonTLS.ZOrder" xml:space="preserve">
<value>3</value>
</data>
<data name="radioButtonSSL.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="radioButtonSSL.Location" type="System.Drawing.Point, System.Drawing">
<value>7, 54</value>
</data>
<data name="radioButtonSSL.Size" type="System.Drawing.Size, System.Drawing">
<value>292, 17</value>
</data>
<data name="radioButtonSSL.TabIndex" type="System.Int32, mscorlib">
<value>2</value>
</data>
<data name="radioButtonSSL.Text" xml:space="preserve">
<value>後方互換性: SSL 3.0 および TLS 1.0, 1.1 &amp;&amp; 1.2(&amp;B)</value>
</data>
<data name="&gt;&gt;radioButtonSSL.Name" xml:space="preserve">
<value>radioButtonSSL</value>
</data>
<data name="&gt;&gt;radioButtonSSL.Type" xml:space="preserve">
<value>System.Windows.Forms.RadioButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;radioButtonSSL.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;radioButtonSSL.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<data name="pictureBoxDisruption.Location" type="System.Drawing.Point, System.Drawing">
<value>7, 88</value>
</data>
<data name="pictureBoxDisruption.Size" type="System.Drawing.Size, System.Drawing">
<value>16, 16</value>
</data>
<data name="pictureBoxDisruption.TabIndex" type="System.Int32, mscorlib">
<value>3</value>
</data>
<data name="pictureBoxDisruption.Visible" type="System.Boolean, mscorlib">
<value>False</value>
</data>
<data name="&gt;&gt;pictureBoxDisruption.Name" xml:space="preserve">
<value>pictureBoxDisruption</value>
</data>
<data name="&gt;&gt;pictureBoxDisruption.Type" xml:space="preserve">
<value>System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;pictureBoxDisruption.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;pictureBoxDisruption.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="labelDisruption.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="labelDisruption.Location" type="System.Drawing.Point, System.Drawing">
<value>30, 90</value>
</data>
<data name="labelDisruption.Size" type="System.Drawing.Size, System.Drawing">
<value>363, 13</value>
</data>
<data name="labelDisruption.TabIndex" type="System.Int32, mscorlib">
<value>4</value>
</data>
<data name="labelDisruption.Text" xml:space="preserve">
<value>この設定を変更すると、一時的に [XenServer] にアクセスできなくなります</value>
</data>
<data name="labelDisruption.Visible" type="System.Boolean, mscorlib">
<value>False</value>
</data>
<data name="&gt;&gt;labelDisruption.Name" xml:space="preserve">
<value>labelDisruption</value>
</data>
<data name="&gt;&gt;labelDisruption.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;labelDisruption.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;labelDisruption.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
<value>96, 96</value>
</data>
<data name="$this.Size" type="System.Drawing.Size, System.Drawing">
<value>477, 198</value>
</data>
<data name="&gt;&gt;$this.Name" xml:space="preserve">
<value>SecurityEditPage</value>
</data>
<data name="&gt;&gt;$this.Type" xml:space="preserve">
<value>System.Windows.Forms.UserControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
</root>

View File

@ -1,273 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
<xsd:element msdata:IsDataSet="true" name="root">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element minOccurs="0" name="value" type="xsd:string"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required"/>
<xsd:attribute name="type" type="xsd:string"/>
<xsd:attribute name="mimetype" type="xsd:string"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string"/>
<xsd:attribute name="name" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element minOccurs="0" msdata:Ordinal="1" name="value" type="xsd:string"/>
<xsd:element minOccurs="0" msdata:Ordinal="2" name="comment" type="xsd:string"/>
</xsd:sequence>
<xsd:attribute msdata:Ordinal="1" name="name" type="xsd:string" use="required"/>
<xsd:attribute msdata:Ordinal="3" name="type" type="xsd:string"/>
<xsd:attribute msdata:Ordinal="4" name="mimetype" type="xsd:string"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element minOccurs="0" msdata:Ordinal="1" name="value" type="xsd:string"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
<data name="labelRubric.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Left, Right</value>
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
<data name="labelRubric.Location" type="System.Drawing.Point, System.Drawing">
<value>4, 4</value>
</data>
<data name="labelRubric.Size" type="System.Drawing.Size, System.Drawing">
<value>473, 17</value>
</data>
<assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
<data name="labelRubric.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="labelRubric.Text" xml:space="preserve">
<value>选择与此池进行通信时可以使用的安全协议。</value>
</data>
<data name="&gt;&gt;labelRubric.Name" xml:space="preserve">
<value>labelRubric</value>
</data>
<data name="&gt;&gt;labelRubric.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;labelRubric.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;labelRubric.ZOrder" xml:space="preserve">
<value>4</value>
</data>
<data name="radioButtonTLS.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="radioButtonTLS.Location" type="System.Drawing.Point, System.Drawing">
<value>7, 31</value>
</data>
<data name="radioButtonTLS.Size" type="System.Drawing.Size, System.Drawing">
<value>174, 17</value>
</data>
<data name="radioButtonTLS.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="radioButtonTLS.Text" xml:space="preserve">
<value>最大安全性(&amp;M): 仅限 TLS 1.2</value>
</data>
<data name="&gt;&gt;radioButtonTLS.Name" xml:space="preserve">
<value>radioButtonTLS</value>
</data>
<data name="&gt;&gt;radioButtonTLS.Type" xml:space="preserve">
<value>System.Windows.Forms.RadioButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;radioButtonTLS.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;radioButtonTLS.ZOrder" xml:space="preserve">
<value>3</value>
</data>
<data name="radioButtonSSL.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="radioButtonSSL.Location" type="System.Drawing.Point, System.Drawing">
<value>7, 54</value>
</data>
<data name="radioButtonSSL.Size" type="System.Drawing.Size, System.Drawing">
<value>292, 17</value>
</data>
<data name="radioButtonSSL.TabIndex" type="System.Int32, mscorlib">
<value>2</value>
</data>
<data name="radioButtonSSL.Text" xml:space="preserve">
<value>向后兼容性(&amp;B): SSL 3.0 以及 TLS 1.0、1.1 和 1.2</value>
</data>
<data name="&gt;&gt;radioButtonSSL.Name" xml:space="preserve">
<value>radioButtonSSL</value>
</data>
<data name="&gt;&gt;radioButtonSSL.Type" xml:space="preserve">
<value>System.Windows.Forms.RadioButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;radioButtonSSL.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;radioButtonSSL.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<data name="pictureBoxDisruption.Location" type="System.Drawing.Point, System.Drawing">
<value>7, 88</value>
</data>
<data name="pictureBoxDisruption.Size" type="System.Drawing.Size, System.Drawing">
<value>16, 16</value>
</data>
<data name="pictureBoxDisruption.TabIndex" type="System.Int32, mscorlib">
<value>3</value>
</data>
<data name="pictureBoxDisruption.Visible" type="System.Boolean, mscorlib">
<value>False</value>
</data>
<data name="&gt;&gt;pictureBoxDisruption.Name" xml:space="preserve">
<value>pictureBoxDisruption</value>
</data>
<data name="&gt;&gt;pictureBoxDisruption.Type" xml:space="preserve">
<value>System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;pictureBoxDisruption.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;pictureBoxDisruption.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="labelDisruption.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="labelDisruption.Location" type="System.Drawing.Point, System.Drawing">
<value>30, 90</value>
</data>
<data name="labelDisruption.Size" type="System.Drawing.Size, System.Drawing">
<value>363, 13</value>
</data>
<data name="labelDisruption.TabIndex" type="System.Int32, mscorlib">
<value>4</value>
</data>
<data name="labelDisruption.Text" xml:space="preserve">
<value>更改此设置将导致您暂时失去对 [XenServer] 的访问权限</value>
</data>
<data name="labelDisruption.Visible" type="System.Boolean, mscorlib">
<value>False</value>
</data>
<data name="&gt;&gt;labelDisruption.Name" xml:space="preserve">
<value>labelDisruption</value>
</data>
<data name="&gt;&gt;labelDisruption.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;labelDisruption.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;labelDisruption.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
<value>96, 96</value>
</data>
<data name="$this.Size" type="System.Drawing.Size, System.Drawing">
<value>477, 198</value>
</data>
<data name="&gt;&gt;$this.Name" xml:space="preserve">
<value>SecurityEditPage</value>
</data>
<data name="&gt;&gt;$this.Type" xml:space="preserve">
<value>System.Windows.Forms.UserControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
</root>

View File

@ -32,8 +32,8 @@ namespace XenAdmin.SettingsPanels
this.AlertIntervalLabel = new System.Windows.Forms.Label();
this.AlertIntervalMinutesLabel = new System.Windows.Forms.Label();
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
this.label1 = new System.Windows.Forms.Label();
this.nudAlertInterval = new XenAdmin.SettingsPanels.AlertNumericUpDown();
this.labelRubric = new System.Windows.Forms.Label();
this.panel1 = new System.Windows.Forms.Panel();
this.PhysicalUtilisationGroupBox = new XenAdmin.Controls.DecentGroupBox();
this.physicalUtilisationMinutesLabel = new System.Windows.Forms.Label();
this.nudPhysicalUtilisationDurationThreshold = new XenAdmin.SettingsPanels.AlertNumericUpDown();
@ -90,8 +90,9 @@ namespace XenAdmin.SettingsPanels
this.CPUAlertCheckBox = new XenAdmin.SettingsPanels.AlertCheckBox();
this.CPUUsagePercentLabel = new System.Windows.Forms.Label();
this.CPUDurationThresholdLabel = new System.Windows.Forms.Label();
this.nudAlertInterval = new XenAdmin.SettingsPanels.AlertNumericUpDown();
this.tableLayoutPanel1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.nudAlertInterval)).BeginInit();
this.panel1.SuspendLayout();
this.PhysicalUtilisationGroupBox.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.nudPhysicalUtilisationDurationThreshold)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.nudPhysicalUtilisation)).BeginInit();
@ -113,6 +114,7 @@ namespace XenAdmin.SettingsPanels
this.CpuGroupBox.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.nudCPUUsagePercent)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.nudCPUDurationThreshold)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.nudAlertInterval)).BeginInit();
this.SuspendLayout();
//
// AlertIntervalLabel
@ -128,47 +130,33 @@ namespace XenAdmin.SettingsPanels
// tableLayoutPanel1
//
resources.ApplyResources(this.tableLayoutPanel1, "tableLayoutPanel1");
this.tableLayoutPanel1.Controls.Add(this.PhysicalUtilisationGroupBox, 0, 6);
this.tableLayoutPanel1.Controls.Add(this.Dom0MemoryUsageGroupBox, 0, 5);
this.tableLayoutPanel1.Controls.Add(this.MemoryGroupBox, 0, 3);
this.tableLayoutPanel1.Controls.Add(this.SrGroupBox, 0, 4);
this.tableLayoutPanel1.Controls.Add(this.DiskGroupBox, 0, 2);
this.tableLayoutPanel1.Controls.Add(this.NetGroupBox, 0, 1);
this.tableLayoutPanel1.Controls.Add(this.CpuGroupBox, 0, 0);
this.tableLayoutPanel1.Controls.Add(this.labelRubric, 0, 0);
this.tableLayoutPanel1.Controls.Add(this.PhysicalUtilisationGroupBox, 0, 8);
this.tableLayoutPanel1.Controls.Add(this.Dom0MemoryUsageGroupBox, 0, 7);
this.tableLayoutPanel1.Controls.Add(this.MemoryGroupBox, 0, 5);
this.tableLayoutPanel1.Controls.Add(this.SrGroupBox, 0, 6);
this.tableLayoutPanel1.Controls.Add(this.DiskGroupBox, 0, 4);
this.tableLayoutPanel1.Controls.Add(this.NetGroupBox, 0, 3);
this.tableLayoutPanel1.Controls.Add(this.CpuGroupBox, 0, 2);
this.tableLayoutPanel1.Controls.Add(this.panel1, 0, 1);
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
//
// label1
// labelRubric
//
resources.ApplyResources(this.label1, "label1");
this.label1.Name = "label1";
resources.ApplyResources(this.labelRubric, "labelRubric");
this.labelRubric.Name = "labelRubric";
//
// nudAlertInterval
// panel1
//
this.nudAlertInterval.Increment = new decimal(new int[] {
5,
0,
0,
0});
resources.ApplyResources(this.nudAlertInterval, "nudAlertInterval");
this.nudAlertInterval.Maximum = new decimal(new int[] {
86400,
0,
0,
0});
this.nudAlertInterval.Minimum = new decimal(new int[] {
5,
0,
0,
0});
this.nudAlertInterval.Name = "nudAlertInterval";
this.nudAlertInterval.Value = new decimal(new int[] {
60,
0,
0,
0});
resources.ApplyResources(this.panel1, "panel1");
this.panel1.Controls.Add(this.AlertIntervalLabel);
this.panel1.Controls.Add(this.AlertIntervalMinutesLabel);
this.panel1.Controls.Add(this.nudAlertInterval);
this.panel1.Name = "panel1";
//
// PhysicalUtilisationGroupBox
//
resources.ApplyResources(this.PhysicalUtilisationGroupBox, "PhysicalUtilisationGroupBox");
this.PhysicalUtilisationGroupBox.Controls.Add(this.physicalUtilisationMinutesLabel);
this.PhysicalUtilisationGroupBox.Controls.Add(this.nudPhysicalUtilisationDurationThreshold);
this.PhysicalUtilisationGroupBox.Controls.Add(this.physicalUtilisationPercentLabel);
@ -176,7 +164,6 @@ namespace XenAdmin.SettingsPanels
this.PhysicalUtilisationGroupBox.Controls.Add(this.physicalUtilisationAlertCheckBox);
this.PhysicalUtilisationGroupBox.Controls.Add(this.physicalUtilisationDurationLabel);
this.PhysicalUtilisationGroupBox.Controls.Add(this.physicalUtilisationLabel);
resources.ApplyResources(this.PhysicalUtilisationGroupBox, "PhysicalUtilisationGroupBox");
this.PhysicalUtilisationGroupBox.Name = "PhysicalUtilisationGroupBox";
this.PhysicalUtilisationGroupBox.TabStop = false;
//
@ -249,6 +236,7 @@ namespace XenAdmin.SettingsPanels
//
// Dom0MemoryUsageGroupBox
//
resources.ApplyResources(this.Dom0MemoryUsageGroupBox, "Dom0MemoryUsageGroupBox");
this.Dom0MemoryUsageGroupBox.Controls.Add(this.nudDom0MemUsage);
this.Dom0MemoryUsageGroupBox.Controls.Add(this.Dom0MemoryDurationThresholdLabel);
this.Dom0MemoryUsageGroupBox.Controls.Add(this.nudDom0MemoryDurationThreshold);
@ -256,7 +244,6 @@ namespace XenAdmin.SettingsPanels
this.Dom0MemoryUsageGroupBox.Controls.Add(this.Dom0MemoryAlertCheckBox);
this.Dom0MemoryUsageGroupBox.Controls.Add(this.dom0MemoryMinutesLabel);
this.Dom0MemoryUsageGroupBox.Controls.Add(this.dom0MemoryPercentLabel);
resources.ApplyResources(this.Dom0MemoryUsageGroupBox, "Dom0MemoryUsageGroupBox");
this.Dom0MemoryUsageGroupBox.Name = "Dom0MemoryUsageGroupBox";
this.Dom0MemoryUsageGroupBox.TabStop = false;
//
@ -329,6 +316,7 @@ namespace XenAdmin.SettingsPanels
//
// MemoryGroupBox
//
resources.ApplyResources(this.MemoryGroupBox, "MemoryGroupBox");
this.MemoryGroupBox.Controls.Add(this.memoryMinutesLabel);
this.MemoryGroupBox.Controls.Add(this.nudMemoryDurationThreshold);
this.MemoryGroupBox.Controls.Add(this.memoryUnitsLabel);
@ -336,7 +324,6 @@ namespace XenAdmin.SettingsPanels
this.MemoryGroupBox.Controls.Add(this.MemoryAlertCheckBox);
this.MemoryGroupBox.Controls.Add(this.memoryDurationThresholdLabel);
this.MemoryGroupBox.Controls.Add(this.memoryUsageLabel);
resources.ApplyResources(this.MemoryGroupBox, "MemoryGroupBox");
this.MemoryGroupBox.Name = "MemoryGroupBox";
this.MemoryGroupBox.TabStop = false;
//
@ -414,6 +401,7 @@ namespace XenAdmin.SettingsPanels
//
// SrGroupBox
//
resources.ApplyResources(this.SrGroupBox, "SrGroupBox");
this.SrGroupBox.Controls.Add(this.srMinutesLabel);
this.SrGroupBox.Controls.Add(this.nudSrMinutes);
this.SrGroupBox.Controls.Add(this.srUnitsLabel);
@ -421,7 +409,6 @@ namespace XenAdmin.SettingsPanels
this.SrGroupBox.Controls.Add(this.SrAlertCheckBox);
this.SrGroupBox.Controls.Add(this.SrDurationThresholdLabel);
this.SrGroupBox.Controls.Add(this.SrUsageLabel);
resources.ApplyResources(this.SrGroupBox, "SrGroupBox");
this.SrGroupBox.Name = "SrGroupBox";
this.SrGroupBox.TabStop = false;
//
@ -499,6 +486,7 @@ namespace XenAdmin.SettingsPanels
//
// DiskGroupBox
//
resources.ApplyResources(this.DiskGroupBox, "DiskGroupBox");
this.DiskGroupBox.Controls.Add(this.DiskMinutesLabel);
this.DiskGroupBox.Controls.Add(this.nudDiskDurationThreshold);
this.DiskGroupBox.Controls.Add(this.DiskPercentLabel);
@ -506,7 +494,6 @@ namespace XenAdmin.SettingsPanels
this.DiskGroupBox.Controls.Add(this.DiskAlertCheckBox);
this.DiskGroupBox.Controls.Add(this.DiskDurationThresholdLabel);
this.DiskGroupBox.Controls.Add(this.DiskUsagePercentLabel);
resources.ApplyResources(this.DiskGroupBox, "DiskGroupBox");
this.DiskGroupBox.Name = "DiskGroupBox";
this.DiskGroupBox.TabStop = false;
//
@ -584,6 +571,7 @@ namespace XenAdmin.SettingsPanels
//
// NetGroupBox
//
resources.ApplyResources(this.NetGroupBox, "NetGroupBox");
this.NetGroupBox.Controls.Add(this.NetPercentLabel);
this.NetGroupBox.Controls.Add(this.nudNetUsagePercent);
this.NetGroupBox.Controls.Add(this.NetMinutesLabel);
@ -591,7 +579,6 @@ namespace XenAdmin.SettingsPanels
this.NetGroupBox.Controls.Add(this.NetAlertCheckBox);
this.NetGroupBox.Controls.Add(this.NetDurationThresholdLabel);
this.NetGroupBox.Controls.Add(this.NetUsagePercentLabel);
resources.ApplyResources(this.NetGroupBox, "NetGroupBox");
this.NetGroupBox.Name = "NetGroupBox";
this.NetGroupBox.TabStop = false;
//
@ -664,6 +651,7 @@ namespace XenAdmin.SettingsPanels
//
// CpuGroupBox
//
resources.ApplyResources(this.CpuGroupBox, "CpuGroupBox");
this.CpuGroupBox.Controls.Add(this.cpuPercentLabel);
this.CpuGroupBox.Controls.Add(this.nudCPUUsagePercent);
this.CpuGroupBox.Controls.Add(this.cpuMinutesLabel);
@ -671,7 +659,6 @@ namespace XenAdmin.SettingsPanels
this.CpuGroupBox.Controls.Add(this.CPUAlertCheckBox);
this.CpuGroupBox.Controls.Add(this.CPUUsagePercentLabel);
this.CpuGroupBox.Controls.Add(this.CPUDurationThresholdLabel);
resources.ApplyResources(this.CpuGroupBox, "CpuGroupBox");
this.CpuGroupBox.Name = "CpuGroupBox";
this.CpuGroupBox.TabStop = false;
//
@ -742,18 +729,41 @@ namespace XenAdmin.SettingsPanels
resources.ApplyResources(this.CPUDurationThresholdLabel, "CPUDurationThresholdLabel");
this.CPUDurationThresholdLabel.Name = "CPUDurationThresholdLabel";
//
// nudAlertInterval
//
this.nudAlertInterval.Increment = new decimal(new int[] {
5,
0,
0,
0});
resources.ApplyResources(this.nudAlertInterval, "nudAlertInterval");
this.nudAlertInterval.Maximum = new decimal(new int[] {
86400,
0,
0,
0});
this.nudAlertInterval.Minimum = new decimal(new int[] {
5,
0,
0,
0});
this.nudAlertInterval.Name = "nudAlertInterval";
this.nudAlertInterval.Value = new decimal(new int[] {
60,
0,
0,
0});
//
// PerfmonAlertEditPage
//
resources.ApplyResources(this, "$this");
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
this.Controls.Add(this.label1);
this.Controls.Add(this.AlertIntervalLabel);
this.Controls.Add(this.nudAlertInterval);
this.Controls.Add(this.AlertIntervalMinutesLabel);
this.Controls.Add(this.tableLayoutPanel1);
this.Name = "PerfmonAlertEditPage";
this.tableLayoutPanel1.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.nudAlertInterval)).EndInit();
this.tableLayoutPanel1.PerformLayout();
this.panel1.ResumeLayout(false);
this.panel1.PerformLayout();
this.PhysicalUtilisationGroupBox.ResumeLayout(false);
this.PhysicalUtilisationGroupBox.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.nudPhysicalUtilisationDurationThreshold)).EndInit();
@ -782,6 +792,7 @@ namespace XenAdmin.SettingsPanels
this.CpuGroupBox.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.nudCPUUsagePercent)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.nudCPUDurationThreshold)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.nudAlertInterval)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
@ -833,7 +844,7 @@ namespace XenAdmin.SettingsPanels
private AlertCheckBox SrAlertCheckBox;
private System.Windows.Forms.Label SrDurationThresholdLabel;
private System.Windows.Forms.Label SrUsageLabel;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label labelRubric;
private Controls.DecentGroupBox Dom0MemoryUsageGroupBox;
private AlertNumericUpDown nudDom0MemUsage;
private System.Windows.Forms.Label Dom0MemoryDurationThresholdLabel;
@ -850,5 +861,6 @@ namespace XenAdmin.SettingsPanels
private AlertCheckBox physicalUtilisationAlertCheckBox;
private System.Windows.Forms.Label physicalUtilisationDurationLabel;
private System.Windows.Forms.Label physicalUtilisationLabel;
private System.Windows.Forms.Panel panel1;
}
}

File diff suppressed because it is too large Load Diff

View File

@ -688,6 +688,12 @@ namespace XenAdmin.TabPages
s.AddEntry(FriendlyName("Pool_patch.applied"), hostAppliedPatches(host));
}
var recommendedPatches = RecommendedPatchesForHost(host);
if (!string.IsNullOrEmpty(recommendedPatches))
{
s.AddEntry(FriendlyName("Pool_patch.required-updates"), recommendedPatches);
}
// add supplemental packs
var suppPacks = hostInstalledSuppPacks(host);
if (!string.IsNullOrEmpty(suppPacks))
@ -1625,6 +1631,17 @@ namespace XenAdmin.TabPages
return true;
}
private string RecommendedPatchesForHost(Host host)
{
var result = new List<string>();
var recommendedPatches = Updates.RecommendedPatchesForHost(host);
foreach (var patch in recommendedPatches)
result.Add(patch.Name);
return string.Join(Environment.NewLine, result.ToArray());
}
private string hostAppliedPatches(Host host)
{
List<string> result = new List<string>();

View File

@ -16,6 +16,7 @@
if (disposing)
{
XenAdmin.Core.Updates.DeregisterCollectionChanged(UpdatesCollectionChanged);
XenAdmin.Core.Updates.RestoreDismissedUpdatesStarted -= Updates_RestoreDismissedUpdatesStarted;
XenAdmin.Core.Updates.CheckForUpdatesStarted -= CheckForUpdates_CheckForUpdatesStarted;
XenAdmin.Core.Updates.CheckForUpdatesCompleted -= CheckForUpdates_CheckForUpdatesCompleted;

View File

@ -64,6 +64,7 @@ namespace XenAdmin.TabPages
private List<string> selectedUpdates = new List<string>();
private int checksQueue;
private bool PageWasRefreshed;
private bool CheckForUpdatesInProgress;
public ManageUpdatesPage()
{
@ -74,6 +75,7 @@ namespace XenAdmin.TabPages
dataGridViewUpdates.Sort(ColumnDate, ListSortDirection.Descending);
informationLabel.Click += informationLabel_Click;
Updates.RegisterCollectionChanged(UpdatesCollectionChanged);
Updates.RestoreDismissedUpdatesStarted += Updates_RestoreDismissedUpdatesStarted;
Updates.CheckForUpdatesStarted += CheckForUpdates_CheckForUpdatesStarted;
Updates.CheckForUpdatesCompleted += CheckForUpdates_CheckForUpdatesCompleted;
pictureBox1.Image = SystemIcons.Information.ToBitmap();
@ -94,23 +96,35 @@ namespace XenAdmin.TabPages
private void CheckForUpdates_CheckForUpdatesStarted()
{
Program.Invoke(Program.MainWindow, () =>
{
checksQueue++;
if (checksQueue > 1)
return;
Program.Invoke(Program.MainWindow, StartCheckForUpdates);
}
toolStripButtonRefresh.Enabled = false;
toolStripButtonRestoreDismissed.Enabled = false;
private void Updates_RestoreDismissedUpdatesStarted()
{
Program.Invoke(Program.MainWindow, StartCheckForUpdates);
}
StoreSelectedUpdates();
dataGridViewUpdates.Rows.Clear();
dataGridViewUpdates.Refresh();
private void StartCheckForUpdates()
{
if (CheckForUpdatesInProgress)
return;
spinningTimer.Start();
tableLayoutPanel3.Visible = true;
labelProgress.Text = Messages.AVAILABLE_UPDATES_SEARCHING;
});
CheckForUpdatesInProgress = true;
checksQueue++;
if (checksQueue > 1)
return;
toolStripButtonRefresh.Enabled = false;
toolStripButtonRestoreDismissed.Enabled = false;
StoreSelectedUpdates();
dataGridViewUpdates.Rows.Clear();
dataGridViewUpdates.Refresh();
spinningTimer.Start();
tableLayoutPanel3.Visible = true;
labelProgress.Text = Messages.AVAILABLE_UPDATES_SEARCHING;
}
private void CheckForUpdates_CheckForUpdatesCompleted(bool succeeded, string errorMessage)
@ -145,6 +159,8 @@ namespace XenAdmin.TabPages
? Messages.AVAILABLE_UPDATES_NOT_FOUND
: errorMessage;
}
CheckForUpdatesInProgress = false;
});
}

View File

@ -362,7 +362,7 @@ namespace XenAdmin.TabPages
{
using (ThreeButtonDialog dlog = new ThreeButtonDialog(
new ThreeButtonDialog.Details(SystemIcons.Warning,
string.Format(Messages.DELETE_GRAPH_MESSAGE, GraphList.SelectedGraph.DisplayName),
string.Format(Messages.DELETE_GRAPH_MESSAGE, GraphList.SelectedGraph.DisplayName.EscapeAmpersands()),
Messages.XENCENTER),
ThreeButtonDialog.ButtonYes,
ThreeButtonDialog.ButtonNo))

View File

@ -191,7 +191,7 @@
<value>173, 22</value>
</data>
<data name="editVirtualDiskToolStripMenuItem.Text" xml:space="preserve">
<value>Properties</value>
<value>P&amp;roperties</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="TitleLabel.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">

View File

@ -112,9 +112,9 @@ namespace XenAdmin.Wizards.CrossPoolMigrateWizard
}
}
protected override string HomeServerText { get { return Messages.CPM_WIZARD_DESTINATION_DESTINATION; } }
protected override string TargetServerText { get { return Messages.CPM_WIZARD_DESTINATION_DESTINATION; } }
protected override string HomeServerSelectionIntroText { get { return Messages.CPM_WIZARD_DESTINATION_TABLE_INTRO; } }
protected override string TargetServerSelectionIntroText { get { return Messages.CPM_WIZARD_DESTINATION_TABLE_INTRO; } }
public override DelayLoadingOptionComboBoxItem CreateDelayLoadingOptionComboBoxItem(IXenObject xenItem)
@ -122,7 +122,7 @@ namespace XenAdmin.Wizards.CrossPoolMigrateWizard
return new CrossPoolMigrateDelayLoadingComboBoxItem(xenItem, preSelectedHost, selectedVMs);
}
protected override List<ReasoningFilter> CreateHomeServerFilterList(IEnableableXenObjectComboBoxItem selectedItem)
protected override List<ReasoningFilter> CreateTargetServerFilterList(IEnableableXenObjectComboBoxItem selectedItem)
{
List<ReasoningFilter> filters = new List<ReasoningFilter>{ new ResidentHostIsSameAsSelectionFilter(selectedVMs) };
@ -168,5 +168,13 @@ namespace XenAdmin.Wizards.CrossPoolMigrateWizard
return TemplatesOnly ? Messages.TEMPLATE : Messages.VM;
}
}
protected override string TargetColumnHeaderText
{
get
{
return Messages.TARGET_SERVER;
}
}
}
}

View File

@ -67,10 +67,10 @@
resources.ApplyResources(this.networkComboBox, "networkComboBox");
this.networkComboBox.Name = "networkComboBox";
//
// label3
// blurbText
//
resources.ApplyResources(this.blurbText, "label3");
this.blurbText.Name = "label3";
resources.ApplyResources(this.blurbText, "blurbText");
this.blurbText.Name = "blurbText";
//
// CrossPoolMigrateTransferNetworkPage
//

View File

@ -145,7 +145,7 @@
<value>0, 0, 10, 0</value>
</data>
<data name="label1.Size" type="System.Drawing.Size, System.Drawing">
<value>88, 27</value>
<value>229, 46</value>
</data>
<data name="label1.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
@ -172,10 +172,10 @@
<value>False</value>
</data>
<data name="networkComboBox.Location" type="System.Drawing.Point, System.Drawing">
<value>101, 3</value>
<value>242, 3</value>
</data>
<data name="networkComboBox.Size" type="System.Drawing.Size, System.Drawing">
<value>432, 21</value>
<value>432, 39</value>
</data>
<data name="networkComboBox.TabIndex" type="System.Int32, mscorlib">
<value>11</value>
@ -196,13 +196,13 @@
<value>Top</value>
</data>
<data name="tableLayoutPanel2.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 36</value>
<value>3, 55</value>
</data>
<data name="tableLayoutPanel2.RowCount" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="tableLayoutPanel2.Size" type="System.Drawing.Size, System.Drawing">
<value>608, 27</value>
<value>1529, 46</value>
</data>
<data name="tableLayoutPanel2.TabIndex" type="System.Int32, mscorlib">
<value>2</value>
@ -222,40 +222,40 @@
<data name="tableLayoutPanel2.LayoutSettings" type="System.Windows.Forms.TableLayoutSettings, System.Windows.Forms">
<value>&lt;?xml version="1.0" encoding="utf-16"?&gt;&lt;TableLayoutSettings&gt;&lt;Controls&gt;&lt;Control Name="label1" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;Control Name="networkComboBox" Row="0" RowSpan="1" Column="1" ColumnSpan="1" /&gt;&lt;/Controls&gt;&lt;Columns Styles="AutoSize,0,Percent,100" /&gt;&lt;Rows Styles="AutoSize,100" /&gt;&lt;/TableLayoutSettings&gt;</value>
</data>
<data name="label3.AutoSize" type="System.Boolean, mscorlib">
<data name="blurbText.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="label3.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<data name="blurbText.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value>
</data>
<data name="label3.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<data name="blurbText.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="label3.Location" type="System.Drawing.Point, System.Drawing">
<data name="blurbText.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 0</value>
</data>
<data name="label3.Padding" type="System.Windows.Forms.Padding, System.Windows.Forms">
<data name="blurbText.Padding" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>0, 0, 0, 20</value>
</data>
<data name="label3.Size" type="System.Drawing.Size, System.Drawing">
<value>608, 33</value>
<data name="blurbText.Size" type="System.Drawing.Size, System.Drawing">
<value>1529, 52</value>
</data>
<data name="label3.TabIndex" type="System.Int32, mscorlib">
<data name="blurbText.TabIndex" type="System.Int32, mscorlib">
<value>14</value>
</data>
<data name="label3.Text" xml:space="preserve">
<data name="blurbText.Text" xml:space="preserve">
<value>label3</value>
</data>
<data name="&gt;&gt;label3.Name" xml:space="preserve">
<value>label3</value>
<data name="&gt;&gt;blurbText.Name" xml:space="preserve">
<value>blurbText</value>
</data>
<data name="&gt;&gt;label3.Type" xml:space="preserve">
<data name="&gt;&gt;blurbText.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label3.Parent" xml:space="preserve">
<data name="&gt;&gt;blurbText.Parent" xml:space="preserve">
<value>tableLayoutPanel1</value>
</data>
<data name="&gt;&gt;label3.ZOrder" xml:space="preserve">
<data name="&gt;&gt;blurbText.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="tableLayoutPanel1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
@ -268,7 +268,7 @@
<value>2</value>
</data>
<data name="tableLayoutPanel1.Size" type="System.Drawing.Size, System.Drawing">
<value>614, 332</value>
<value>1535, 830</value>
</data>
<data name="tableLayoutPanel1.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
@ -286,16 +286,19 @@
<value>0</value>
</data>
<data name="tableLayoutPanel1.LayoutSettings" type="System.Windows.Forms.TableLayoutSettings, System.Windows.Forms">
<value>&lt;?xml version="1.0" encoding="utf-16"?&gt;&lt;TableLayoutSettings&gt;&lt;Controls&gt;&lt;Control Name="tableLayoutPanel2" Row="1" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;Control Name="label3" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;/Controls&gt;&lt;Columns Styles="Percent,100" /&gt;&lt;Rows Styles="AutoSize,0,Percent,100" /&gt;&lt;/TableLayoutSettings&gt;</value>
<value>&lt;?xml version="1.0" encoding="utf-16"?&gt;&lt;TableLayoutSettings&gt;&lt;Controls&gt;&lt;Control Name="tableLayoutPanel2" Row="1" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;Control Name="blurbText" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;/Controls&gt;&lt;Columns Styles="Percent,100" /&gt;&lt;Rows Styles="AutoSize,0,Percent,100" /&gt;&lt;/TableLayoutSettings&gt;</value>
</data>
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
<value>96, 96</value>
<value>240, 240</value>
</data>
<data name="$this.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>8, 8, 8, 8</value>
</data>
<data name="$this.Size" type="System.Drawing.Size, System.Drawing">
<value>614, 332</value>
<value>1535, 830</value>
</data>
<data name="$this.Text" xml:space="preserve">
<value>CrossPoolMigrateTransferNetworkPage</value>

View File

@ -419,7 +419,7 @@ namespace XenAdmin.Wizards.CrossPoolMigrateWizard
summary = new VmTitleSummary(summary, pair.Value);
summary = new DestinationPoolSummary(summary, pair.Value, TargetConnection);
summary = new HomeServerSummary(summary, pair.Value, TargetConnection);
summary = new TargetServerSummary(summary, pair.Value, TargetConnection);
summary = new TransferNetworkSummary(summary, m_pageTransferNetwork.NetworkUuid.Value);
summary = new StorageSummary(summary, pair.Value, xenConnection);
summary = new NetworkSummary(summary, pair.Value, xenConnection);

View File

@ -112,16 +112,16 @@
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="mscorlib" name="mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="labelText.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="tableLayoutPanel1.AutoSizeMode" type="System.Windows.Forms.AutoSizeMode, System.Windows.Forms">
<value>GrowAndShrink</value>
</data>
@ -148,7 +148,7 @@
<value>buttonClearAll</value>
</data>
<data name="&gt;&gt;buttonClearAll.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;buttonClearAll.Parent" xml:space="preserve">
<value>tableLayoutPanel1</value>
@ -156,7 +156,7 @@
<data name="&gt;&gt;buttonClearAll.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<metadata name="columnTick.UserAddedColumn" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<metadata name="columnTick.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<data name="columnTick.HeaderText" xml:space="preserve">
@ -165,7 +165,7 @@
<data name="columnTick.Width" type="System.Int32, mscorlib">
<value>5</value>
</data>
<metadata name="columnName.UserAddedColumn" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<metadata name="columnName.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<data name="columnName.HeaderText" xml:space="preserve">
@ -177,7 +177,7 @@
<data name="columnName.Width" type="System.Int32, mscorlib">
<value>115</value>
</data>
<metadata name="columnDesc.UserAddedColumn" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<metadata name="columnDesc.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<data name="columnDesc.HeaderText" xml:space="preserve">
@ -189,7 +189,7 @@
<data name="columnDesc.Width" type="System.Int32, mscorlib">
<value>115</value>
</data>
<metadata name="columnType.UserAddedColumn" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<metadata name="columnType.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<data name="columnType.HeaderText" xml:space="preserve">
@ -201,7 +201,7 @@
<data name="columnType.Width" type="System.Int32, mscorlib">
<value>90</value>
</data>
<metadata name="columnMetadata.UserAddedColumn" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<metadata name="columnMetadata.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<data name="columnMetadata.HeaderText" xml:space="preserve">
@ -268,7 +268,7 @@
<value>5</value>
</data>
<data name="FindSrsButton.Text" xml:space="preserve">
<value>Find &amp;Storage Repositories</value>
<value>Find Storage &amp;Repositories</value>
</data>
<data name="FindSrsButton.TextAlign" type="System.Drawing.ContentAlignment, System.Drawing">
<value>MiddleLeft</value>
@ -280,7 +280,7 @@
<value>FindSrsButton</value>
</data>
<data name="&gt;&gt;FindSrsButton.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;FindSrsButton.Parent" xml:space="preserve">
<value>tableLayoutPanel1</value>
@ -307,7 +307,7 @@
<value>buttonSelectAll</value>
</data>
<data name="&gt;&gt;buttonSelectAll.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;buttonSelectAll.Parent" xml:space="preserve">
<value>tableLayoutPanel1</value>
@ -334,7 +334,7 @@
<value>tableLayoutPanel1</value>
</data>
<data name="&gt;&gt;tableLayoutPanel1.Type" xml:space="preserve">
<value>System.Windows.Forms.TableLayoutPanel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Windows.Forms.TableLayoutPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;tableLayoutPanel1.Parent" xml:space="preserve">
<value>$this</value>
@ -370,7 +370,7 @@
<value>labelText</value>
</data>
<data name="&gt;&gt;labelText.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;labelText.Parent" xml:space="preserve">
<value>tableLayoutPanel1</value>

View File

@ -101,9 +101,10 @@ namespace XenAdmin.Wizards.GenericPages
protected void InitializeText()
{
m_labelIntro.Text = InstructionText;
label1.Text = HomeServerText;
label2.Text = HomeServerSelectionIntroText;
label1.Text = TargetServerText;
label2.Text = TargetServerSelectionIntroText;
m_colVmName.HeaderText = VmColumnHeaderText;
m_colTarget.HeaderText = TargetColumnHeaderText;
}
private IXenObject _chosenItem;
@ -123,9 +124,9 @@ namespace XenAdmin.Wizards.GenericPages
protected abstract string InstructionText { get; }
/// <summary>
/// Text demarking what the label fot the home server drop down should be
/// Text demarking what the label for the target server drop down should be
/// </summary>
protected abstract string HomeServerText { get; }
protected abstract string TargetServerText { get; }
protected virtual string VmColumnHeaderText
{
@ -135,10 +136,19 @@ namespace XenAdmin.Wizards.GenericPages
}
}
protected virtual string TargetColumnHeaderText
{
get
{
return m_colTarget.HeaderText;
}
}
/// <summary>
/// Text above the table containing a list of VMs and concomitant home server
/// </summary>
protected abstract string HomeServerSelectionIntroText { get; }
protected abstract string TargetServerSelectionIntroText { get; }
protected virtual void OnChosenItemChanged()
{}
@ -553,7 +563,7 @@ namespace XenAdmin.Wizards.GenericPages
{
Cursor.Current = Cursors.WaitCursor;
ChosenItem = item == null ? null : item.Item;
Program.Invoke(Program.MainWindow, ()=> PopulateDataGridView(CreateHomeServerFilterList(item)));
Program.Invoke(Program.MainWindow, ()=> PopulateDataGridView(CreateTargetServerFilterList(item)));
}
finally
{
@ -569,7 +579,7 @@ namespace XenAdmin.Wizards.GenericPages
/// </summary>
/// <param name="item">selected item from the host combobox</param>
/// <returns></returns>
protected virtual List<ReasoningFilter> CreateHomeServerFilterList(IEnableableXenObjectComboBoxItem item)
protected virtual List<ReasoningFilter> CreateTargetServerFilterList(IEnableableXenObjectComboBoxItem item)
{
return new List<ReasoningFilter>();
}

View File

@ -112,26 +112,26 @@
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="mscorlib" name="mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="tableLayoutPanel1.ColumnCount" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="m_labelIntro.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="m_labelIntro.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value>
</data>
<data name="m_labelIntro.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="m_labelIntro.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 0</value>
</data>
@ -285,18 +285,18 @@
<data name="&gt;&gt;label2.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<metadata name="m_colVmName.UserAddedColumn" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<data name="m_colVmName.UserAddedColumn" type="System.Boolean, mscorlib">
<value>True</value>
</metadata>
</data>
<data name="m_colVmName.HeaderText" xml:space="preserve">
<value>VM</value>
</data>
<data name="m_colVmName.Width" type="System.Int32, mscorlib">
<value>48</value>
</data>
<metadata name="m_colTarget.UserAddedColumn" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<data name="m_colTarget.UserAddedColumn" type="System.Boolean, mscorlib">
<value>True</value>
</metadata>
</data>
<data name="m_colTarget.HeaderText" xml:space="preserve">
<value>Home Server</value>
</data>
@ -447,9 +447,9 @@
<data name="tableLayoutPanel1.LayoutSettings" type="System.Windows.Forms.TableLayoutSettings, System.Windows.Forms">
<value>&lt;?xml version="1.0" encoding="utf-16"?&gt;&lt;TableLayoutSettings&gt;&lt;Controls&gt;&lt;Control Name="m_labelIntro" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;Control Name="tableLayoutPanel2" Row="1" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;Control Name="label2" Row="2" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;Control Name="m_dataGridView" Row="3" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;Control Name="tableLayoutPanelWarning" Row="4" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;/Controls&gt;&lt;Columns Styles="Percent,100" /&gt;&lt;Rows Styles="AutoSize,0,AutoSize,0,AutoSize,0,Percent,100,AutoSize,0,Absolute,20" /&gt;&lt;/TableLayoutSettings&gt;</value>
</data>
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<data name="$this.Localizable" type="System.Boolean, mscorlib">
<value>True</value>
</metadata>
</data>
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
<value>96, 96</value>
</data>

View File

@ -168,12 +168,12 @@ namespace XenAdmin.Wizards.GenericPages
}
}
public class HomeServerSummary : MappingSummaryDecorator
public class TargetServerSummary : MappingSummaryDecorator
{
private readonly VmMapping mapping;
private readonly IXenConnection connection;
public HomeServerSummary(MappingSummary summary, VmMapping mapping, IXenConnection connection)
public TargetServerSummary(MappingSummary summary, VmMapping mapping, IXenConnection connection)
: base(summary)
{
this.mapping = mapping;
@ -185,7 +185,7 @@ namespace XenAdmin.Wizards.GenericPages
get
{
List<SummaryDetails> decoratedSummary = summary.Details;
decoratedSummary.Add(new SummaryDetails(Messages.CPM_SUMMARY_KEY_HOME_SERVER, ResolveLabel()));
decoratedSummary.Add(new SummaryDetails(Messages.CPM_SUMMARY_KEY_TARGET_SERVER, ResolveLabel()));
return decoratedSummary;
}
}

View File

@ -84,9 +84,9 @@ namespace XenAdmin.Wizards.ImportWizard
protected override string InstructionText { get { return Messages.IMPORT_WIZARD_DESTINATION_INSTRUCTIONS; } }
protected override string HomeServerText { get { return Messages.IMPORT_WIZARD_DESTINATION_DESTINATION; } }
protected override string TargetServerText { get { return Messages.IMPORT_WIZARD_DESTINATION_DESTINATION; } }
protected override string HomeServerSelectionIntroText { get { return Messages.IMPORT_WIZARD_DESTINATION_TABLE_INTRO; } }
protected override string TargetServerSelectionIntroText { get { return Messages.IMPORT_WIZARD_DESTINATION_TABLE_INTRO; } }
protected override void OnChosenItemChanged()
{

View File

@ -55,6 +55,7 @@ namespace XenAdmin.Wizards.PatchingWizard
private readonly PatchingWizard_UploadPage PatchingWizard_UploadPage;
private readonly PatchingWizard_PrecheckPage PatchingWizard_PrecheckPage;
private readonly PatchingWizard_FirstPage PatchingWizard_FirstPage;
private readonly PatchingWizard_AutoUpdatingPage PatchingWizard_AutoUpdatingPage;
public PatchingWizard()
{
@ -67,6 +68,7 @@ namespace XenAdmin.Wizards.PatchingWizard
PatchingWizard_UploadPage = new PatchingWizard_UploadPage();
PatchingWizard_PrecheckPage = new PatchingWizard_PrecheckPage();
PatchingWizard_FirstPage = new PatchingWizard_FirstPage();
PatchingWizard_AutoUpdatingPage = new PatchingWizard_AutoUpdatingPage();
AddPage(PatchingWizard_FirstPage);
AddPage(PatchingWizard_SelectPatchPage);
@ -102,17 +104,36 @@ namespace XenAdmin.Wizards.PatchingWizard
if (prevPageType == typeof(PatchingWizard_SelectPatchPage))
{
var updateType = PatchingWizard_SelectPatchPage.SelectedUpdateType;
var newPatch = PatchingWizard_SelectPatchPage.SelectedNewPatch;
var existPatch = PatchingWizard_SelectPatchPage.SelectedExistingPatch;
var alertPatch = PatchingWizard_SelectPatchPage.SelectedUpdateAlert;
var fileFromDiskAlertPatch = PatchingWizard_SelectPatchPage.FileFromDiskAlert;
var wizardModeAutomatic = PatchingWizard_SelectPatchPage.IsInAutomaticMode;
var updateType = wizardModeAutomatic ? UpdateType.NewRetail : PatchingWizard_SelectPatchPage.SelectedUpdateType;
var newPatch = wizardModeAutomatic ? null : PatchingWizard_SelectPatchPage.SelectedNewPatch;
var existPatch = wizardModeAutomatic ? null : PatchingWizard_SelectPatchPage.SelectedExistingPatch;
var alertPatch = wizardModeAutomatic ? null : PatchingWizard_SelectPatchPage.SelectedUpdateAlert;
var fileFromDiskAlertPatch = wizardModeAutomatic ? null : PatchingWizard_SelectPatchPage.FileFromDiskAlert;
PatchingWizard_SelectServers.IsInAutomaticMode = wizardModeAutomatic;
PatchingWizard_SelectServers.AutoDownloadedXenServerVersions = PatchingWizard_SelectPatchPage.AutoDownloadedXenServerVersions;
PatchingWizard_SelectServers.SelectedUpdateType = updateType;
PatchingWizard_SelectServers.Patch = existPatch;
PatchingWizard_SelectServers.SelectedUpdateAlert = alertPatch;
PatchingWizard_SelectServers.FileFromDiskAlert = fileFromDiskAlertPatch;
RemovePage(PatchingWizard_UploadPage);
RemovePage(PatchingWizard_ModePage);
RemovePage(PatchingWizard_PatchingPage);
RemovePage(PatchingWizard_AutoUpdatingPage);
if (!wizardModeAutomatic)
{
AddAfterPage(PatchingWizard_SelectServers, PatchingWizard_UploadPage);
AddAfterPage(PatchingWizard_PrecheckPage, PatchingWizard_ModePage);
AddAfterPage(PatchingWizard_ModePage, PatchingWizard_PatchingPage);
}
else
{
AddAfterPage(PatchingWizard_PrecheckPage, PatchingWizard_AutoUpdatingPage);
}
PatchingWizard_UploadPage.SelectedUpdateType = updateType;
PatchingWizard_UploadPage.SelectedExistingPatch = existPatch;
PatchingWizard_UploadPage.SelectedNewPatchPath = newPatch;
@ -121,6 +142,7 @@ namespace XenAdmin.Wizards.PatchingWizard
PatchingWizard_ModePage.Patch = existPatch;
PatchingWizard_ModePage.SelectedUpdateAlert = alertPatch;
PatchingWizard_PrecheckPage.IsInAutomaticMode = wizardModeAutomatic;
PatchingWizard_PrecheckPage.Patch = existPatch;
PatchingWizard_PatchingPage.Patch = existPatch;
@ -134,17 +156,21 @@ namespace XenAdmin.Wizards.PatchingWizard
else if (prevPageType == typeof(PatchingWizard_SelectServers))
{
var selectedServers = PatchingWizard_SelectServers.SelectedServers;
var selectedPools = PatchingWizard_SelectServers.SelectedPools;
var selectedMasters = PatchingWizard_SelectServers.SelectedMasters;
PatchingWizard_PrecheckPage.SelectedServers = selectedServers;
PatchingWizard_ModePage.SelectedServers = selectedServers;
PatchingWizard_PatchingPage.SelectedMasters = PatchingWizard_SelectServers.SelectedMasters;
PatchingWizard_PatchingPage.SelectedMasters = selectedMasters;
PatchingWizard_PatchingPage.SelectedServers = selectedServers;
PatchingWizard_PatchingPage.SelectedPools = PatchingWizard_SelectServers.SelectedPools;
PatchingWizard_PatchingPage.SelectedPools = selectedPools;
PatchingWizard_UploadPage.SelectedMasters = PatchingWizard_SelectServers.SelectedMasters;
PatchingWizard_UploadPage.SelectedMasters = selectedMasters;
PatchingWizard_UploadPage.SelectedServers = selectedServers;
PatchingWizard_AutoUpdatingPage.SelectedPools = selectedPools;
}
else if (prevPageType == typeof(PatchingWizard_UploadPage))
{
@ -175,6 +201,7 @@ namespace XenAdmin.Wizards.PatchingWizard
PatchingWizard_PatchingPage.ProblemsResolvedPreCheck = PatchingWizard_PrecheckPage.ProblemsResolvedPreCheck;
PatchingWizard_PatchingPage.LivePatchCodesByHost = PatchingWizard_PrecheckPage.LivePatchCodesByHost;
PatchingWizard_ModePage.LivePatchCodesByHost = PatchingWizard_PrecheckPage.LivePatchCodesByHost;
PatchingWizard_AutoUpdatingPage.ProblemsResolvedPreCheck = PatchingWizard_PrecheckPage.ProblemsResolvedPreCheck;
}
}
@ -290,7 +317,20 @@ namespace XenAdmin.Wizards.PatchingWizard
private void RemoveDownloadedPatches()
{
foreach (string downloadedPatch in PatchingWizard_UploadPage.AllDownloadedPatches.Values)
var isInAutomaticMode = PatchingWizard_SelectPatchPage.IsInAutomaticMode;
List<string> listOfDownloadedFiles = new List<string>();
if (isInAutomaticMode)
{
listOfDownloadedFiles.AddRange(PatchingWizard_AutoUpdatingPage.AllDownloadedPatches.Values);
}
else
{
listOfDownloadedFiles.AddRange(PatchingWizard_UploadPage.AllDownloadedPatches.Values);
}
foreach (string downloadedPatch in listOfDownloadedFiles)
{
try
{

View File

@ -0,0 +1,542 @@
/* Copyright (c) Citrix Systems Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms,
* with or without modification, are permitted provided
* that the following conditions are met:
*
* * Redistributions of source code must retain the above
* copyright notice, this list of conditions and the
* following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other
* materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.IO;
using System.Reflection;
using System.Threading;
using log4net;
using XenAdmin.Controls;
using XenAdmin.Diagnostics.Problems;
using XenAdmin.Dialogs;
using XenAdmin.Wizards.PatchingWizard.PlanActions;
using XenAPI;
using XenAdmin.Actions;
using System.Linq;
using XenAdmin.Core;
using XenAdmin.Network;
using System.Text;
namespace XenAdmin.Wizards.PatchingWizard
{
public partial class PatchingWizard_AutoUpdatingPage : XenTabPage
{
protected static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
public XenAdmin.Core.Updates.UpgradeSequence UpgradeSequences { get; set; }
private bool _thisPageIsCompleted = false;
public List<Problem> ProblemsResolvedPreCheck { private get; set; }
public List<Pool> SelectedPools { private get; set; }
private List<PoolPatchMapping> patchMappings = new List<PoolPatchMapping>();
public Dictionary<XenServerPatch, string> AllDownloadedPatches = new Dictionary<XenServerPatch, string>();
private List<UpdateProgressBackgroundWorker> backgroundWorkers = new List<UpdateProgressBackgroundWorker>();
public PatchingWizard_AutoUpdatingPage()
{
InitializeComponent();
}
public override string Text
{
get
{
return Messages.PATCHINGWIZARD_AUTOUPDATINGPAGE_TEXT;
}
}
public override string PageTitle
{
get
{
return Messages.PATCHINGWIZARD_AUTOUPDATINGPAGE_TITLE;
}
}
public override string HelpID
{
get { return ""; }
}
public override bool EnablePrevious()
{
return false;
}
private bool _nextEnabled;
public override bool EnableNext()
{
return _nextEnabled;
}
private bool _cancelEnabled;
public override bool EnableCancel()
{
return _cancelEnabled;
}
public override void PageCancelled()
{
if (!_thisPageIsCompleted)
{
backgroundWorkers.ForEach(bgw => bgw.CancelAsync());
backgroundWorkers.Clear();
}
base.PageCancelled();
}
public override void PageLeave(PageLoadedDirection direction, ref bool cancel)
{
base.PageLeave(direction, ref cancel);
}
public override void PageLoaded(PageLoadedDirection direction)
{
base.PageLoaded(direction);
if (_thisPageIsCompleted)
{
return;
}
foreach (var pool in SelectedPools)
{
var master = Helpers.GetMaster(pool.Connection);
var planActions = new List<PlanAction>();
var delayedActionsByHost = new Dictionary<Host, List<PlanAction>>();
foreach (var host in pool.Connection.Cache.Hosts)
{
delayedActionsByHost.Add(host, new List<PlanAction>());
}
var hosts = pool.Connection.Cache.Hosts;
var us = Updates.GetUpgradeSequence(pool.Connection);
foreach (var patch in us.UniquePatches)
{
var hostsToApply = us.Where(u => u.Value.Contains(patch)).Select(u => u.Key).ToList();
hostsToApply.Sort();
planActions.Add(new DownloadPatchPlanAction(master.Connection, patch, AllDownloadedPatches));
planActions.Add(new UploadPatchToMasterPlanAction(master.Connection, patch, patchMappings, AllDownloadedPatches));
planActions.Add(new PatchPrechecksOnMultipleHostsInAPoolPlanAction(master.Connection, patch, hostsToApply, patchMappings));
foreach (var host in hostsToApply)
{
planActions.Add(new ApplyXenServerPatchPlanAction(host, patch, patchMappings));
planActions.AddRange(GetMandatoryActionListForPatch(delayedActionsByHost[host], host, patch));
UpdateDelayedAfterPatchGuidanceActionListForHost(delayedActionsByHost[host], host, patch);
}
//clean up master at the end:
planActions.Add(new RemoveUpdateFileFromMasterPlanAction(master, patchMappings, patch));
}//patch
//add all delayed actions to the end of the actions, per host
var delayedActions = new List<PlanAction>();
if (delayedActionsByHost.ContainsKey(master))
{
delayedActions.AddRange(delayedActionsByHost[master]);
}
foreach (var kvp in delayedActionsByHost)
{
if (kvp.Key != master)
{
delayedActions.AddRange(kvp.Value);
}
}
if (planActions.Count > 0)
{
var bgw = new UpdateProgressBackgroundWorker(master, planActions, delayedActions);
backgroundWorkers.Add(bgw);
}
} //foreach in SelectedMasters
foreach (var bgw in backgroundWorkers)
{
bgw.DoWork += new DoWorkEventHandler(WorkerDoWork);
bgw.WorkerReportsProgress = true;
bgw.ProgressChanged += new ProgressChangedEventHandler(WorkerProgressChanged);
bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(WorkerCompleted);
bgw.WorkerSupportsCancellation = true;
bgw.RunWorkerAsync();
}
if (backgroundWorkers.Count == 0)
{
_thisPageIsCompleted = true;
_nextEnabled = true;
OnPageUpdated();
}
}
#region automatic_mode
private List<PlanAction> doneActions = new List<PlanAction>();
private List<PlanAction> inProgressActions = new List<PlanAction>();
private List<PlanAction> errorActions = new List<PlanAction>();
private void WorkerProgressChanged(object sender, ProgressChangedEventArgs e)
{
var actionsWorker = sender as BackgroundWorker;
Program.Invoke(Program.MainWindow, () =>
{
if (!actionsWorker.CancellationPending)
{
PlanAction action = (PlanAction)e.UserState;
if (action != null)
{
if (e.ProgressPercentage == 0)
{
inProgressActions.Add(action);
}
else
{
doneActions.Add(action);
inProgressActions.Remove(action);
progressBar.Value += (int)((float)e.ProgressPercentage / (float)backgroundWorkers.Count); //extend with error handling related numbers
}
}
UpdateStatusTextBox();
}
});
}
private void UpdateStatusTextBox()
{
var sb = new StringBuilder();
foreach (var pa in doneActions)
{
if (pa.Visible)
{
sb.Append(pa);
sb.AppendLine(Messages.DONE);
}
}
foreach (var pa in errorActions)
{
sb.Append(pa);
sb.AppendLine(Messages.ERROR);
}
foreach (var pa in inProgressActions)
{
if (pa.Visible)
{
sb.Append(pa);
sb.AppendLine();
}
}
textBoxLog.Text = sb.ToString();
textBoxLog.SelectionStart = textBoxLog.Text.Length;
textBoxLog.ScrollToCaret();
}
private void WorkerDoWork(object sender, DoWorkEventArgs doWorkEventArgs)
{
var bgw = sender as UpdateProgressBackgroundWorker;
foreach (PlanAction action in bgw.AllActions)
{
try
{
if (bgw.CancellationPending)
{
doWorkEventArgs.Cancel = true;
return;
}
InitializePlanAction(bgw, action);
bgw.ReportProgress(0, action);
action.Run();
Thread.Sleep(1000);
bgw.doneActions.Add(action);
bgw.ReportProgress((int)((1.0 / (double)bgw.AllActions.Count) * 100), action);
}
catch (Exception e)
{
bgw.FailedWithExceptionAction = action;
errorActions.Add(action);
inProgressActions.Remove(action);
log.Error("Failed to carry out plan.", e);
log.Debug(action.Title);
doWorkEventArgs.Result = new Exception(action.Title, e);
bgw.ReportProgress(0);
break;
}
}
}
private static void InitializePlanAction(UpdateProgressBackgroundWorker bgw, PlanAction action)
{
if (action is IAvoidRestartHostsAware)
{
var avoidRestartAction = action as IAvoidRestartHostsAware;
avoidRestartAction.AvoidRestartHosts = bgw.AvoidRestartHosts;
}
}
private void WorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
var bgw = (UpdateProgressBackgroundWorker)sender;
Program.Invoke(Program.MainWindow, () =>
{
if (!e.Cancelled)
{
Exception exception = e.Result as Exception;
if (exception != null)
{
//not showing exceptions in the meantime
}
//if all finished
if (backgroundWorkers.All(w => !w.IsBusy))
{
AllWorkersFinished();
ShowErrors();
_thisPageIsCompleted = true;
_cancelEnabled = false;
_nextEnabled = true;
}
}
});
OnPageUpdated();
}
private void UpdateDelayedAfterPatchGuidanceActionListForHost(List<PlanAction> delayedGuidances, Host host, XenServerPatch patch)
{
List<PlanAction> actions = GetAfterApplyGuidanceActionsForPatch(host, patch);
//if this is a restart, clean delayed list
if (patch.after_apply_guidance == after_apply_guidance.restartHost)
delayedGuidances.Clear();
if (!patch.GuidanceMandatory)
{
//not mandatory, so these actions will have to be run later
//add the ones that are not yet there
foreach (var ap in actions)
if (!delayedGuidances.Any(da => da.GetType() == ap.GetType()))
{
//special rules
//do not add restartXAPI if there is already a restartHost on the list
if (delayedGuidances.Any(da => da is RebootHostPlanAction) && ap is RestartAgentPlanAction)
continue;
delayedGuidances.Add(ap);
}
}
else
{
//remove delayed action of the same kind for this host (because it is mandatory and will run immediately)
delayedGuidances.RemoveAll(dg => actions.Any(ma => ma.GetType() == dg.GetType()));
}
}
private static List<PlanAction> GetAfterApplyGuidanceActionsForPatch(Host host, XenServerPatch patch)
{
List<PlanAction> actions = new List<PlanAction>();
List<XenRef<VM>> runningVMs = RunningVMs(host);
if (patch.after_apply_guidance == after_apply_guidance.restartHost)
{
actions.Add(new EvacuateHostPlanAction(host));
actions.Add(new RebootHostPlanAction(host));
actions.Add(new BringBabiesBackAction(runningVMs, host, false));
}
if (patch.after_apply_guidance == after_apply_guidance.restartXAPI)
{
actions.Add(new RestartAgentPlanAction(host));
}
if (patch.after_apply_guidance == after_apply_guidance.restartHVM)
{
actions.Add(new RebootVMsPlanAction(host, RunningHvmVMs(host)));
}
if (patch.after_apply_guidance == after_apply_guidance.restartPV)
{
actions.Add(new RebootVMsPlanAction(host, RunningPvVMs(host)));
}
return actions;
}
private List<PlanAction> GetMandatoryActionListForPatch(List<PlanAction> delayedGuidances, Host host, XenServerPatch patch)
{
var actions = new List<PlanAction>();
if (!patch.GuidanceMandatory)
return actions;
actions = GetAfterApplyGuidanceActionsForPatch(host, patch);
return actions;
}
private static List<XenRef<VM>> RunningHvmVMs(Host host)
{
List<XenRef<VM>> vms = new List<XenRef<VM>>();
foreach (VM vm in host.Connection.ResolveAll(host.resident_VMs))
{
if (!vm.IsHVM || !vm.is_a_real_vm)
continue;
vms.Add(new XenRef<VM>(vm.opaque_ref));
}
return vms;
}
private static List<XenRef<VM>> RunningPvVMs(Host host)
{
List<XenRef<VM>> vms = new List<XenRef<VM>>();
foreach (VM vm in host.Connection.ResolveAll(host.resident_VMs))
{
if (vm.IsHVM || !vm.is_a_real_vm)
continue;
vms.Add(new XenRef<VM>(vm.opaque_ref));
}
return vms;
}
private static List<XenRef<VM>> RunningVMs(Host host)
{
List<XenRef<VM>> vms = new List<XenRef<VM>>();
foreach (VM vm in host.Connection.ResolveAll(host.resident_VMs))
{
if (!vm.is_a_real_vm)
continue;
vms.Add(new XenRef<VM>(vm.opaque_ref));
}
return vms;
}
#endregion
private void ShowErrors()
{
if (ErrorMessages != null)
{
labelTitle.Text = Messages.PATCHINGWIZARD_AUTOUPDATINGPAGE_FAILED;
labelError.Text = Messages.PATCHINGWIZARD_AUTOUPDATINGPAGE_ERROR;
textBoxLog.Text += ErrorMessages;
log.ErrorFormat("Error message displayed: {0}", labelError.Text);
pictureBox1.Image = SystemIcons.Error.ToBitmap();
panel1.Visible = true;
}
}
private string ErrorMessages
{
get
{
if (errorActions.Count == 0)
return null;
var sb = new StringBuilder();
sb.AppendLine();
sb.AppendLine(errorActions.Count > 1 ? Messages.PATCHINGWIZARD_AUTOUPDATINGPAGE_ERRORS_OCCURRED : Messages.PATCHINGWIZARD_AUTOUPDATINGPAGE_ERROR_OCCURRED);
foreach (var action in errorActions)
{
var exception = action.Error;
if (exception == null)
{
log.ErrorFormat("An action has failed with an empty exception. Action: {0}", action.ToString());
continue;
}
log.Error(exception);
if (exception != null && exception.InnerException != null && exception.InnerException is Failure)
{
var innerEx = exception.InnerException as Failure;
log.Error(innerEx);
sb.AppendLine(innerEx.Message);
}
else
{
sb.AppendLine(exception.Message);
}
}
return sb.ToString();
}
}
private void AllWorkersFinished()
{
labelTitle.Text = Messages.PATCHINGWIZARD_UPDATES_DONE_AUTOMATIC_MODE;
progressBar.Value = 100;
pictureBox1.Image = null;
labelError.Text = Messages.CLOSE_WIZARD_CLICK_FINISH;
}
}
}

View File

@ -0,0 +1,117 @@
namespace XenAdmin.Wizards.PatchingWizard
{
partial class PatchingWizard_AutoUpdatingPage
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PatchingWizard_AutoUpdatingPage));
this.labelTitle = new System.Windows.Forms.Label();
this.textBoxLog = new System.Windows.Forms.TextBox();
this.progressBar = new System.Windows.Forms.ProgressBar();
this.labelError = new System.Windows.Forms.Label();
this.pictureBox1 = new System.Windows.Forms.PictureBox();
this.panel1 = new System.Windows.Forms.TableLayoutPanel();
this.errorLinkLabel = new System.Windows.Forms.LinkLabel();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
this.panel1.SuspendLayout();
this.SuspendLayout();
//
// labelTitle
//
resources.ApplyResources(this.labelTitle, "labelTitle");
this.labelTitle.Name = "labelTitle";
//
// textBoxLog
//
resources.ApplyResources(this.textBoxLog, "textBoxLog");
this.textBoxLog.BackColor = System.Drawing.SystemColors.ControlLightLight;
this.textBoxLog.Name = "textBoxLog";
this.textBoxLog.ReadOnly = true;
//
// progressBar
//
resources.ApplyResources(this.progressBar, "progressBar");
this.progressBar.Name = "progressBar";
//
// labelError
//
resources.ApplyResources(this.labelError, "labelError");
this.labelError.BackColor = System.Drawing.SystemColors.Control;
this.labelError.Name = "labelError";
//
// pictureBox1
//
this.pictureBox1.BackColor = System.Drawing.SystemColors.Control;
resources.ApplyResources(this.pictureBox1, "pictureBox1");
this.pictureBox1.Name = "pictureBox1";
this.pictureBox1.TabStop = false;
//
// panel1
//
resources.ApplyResources(this.panel1, "panel1");
this.panel1.BackColor = System.Drawing.SystemColors.Control;
this.panel1.Controls.Add(this.pictureBox1, 0, 0);
this.panel1.Controls.Add(this.errorLinkLabel, 2, 0);
this.panel1.Controls.Add(this.labelError, 1, 0);
this.panel1.Name = "panel1";
//
// errorLinkLabel
//
resources.ApplyResources(this.errorLinkLabel, "errorLinkLabel");
this.errorLinkLabel.BackColor = System.Drawing.SystemColors.Control;
this.errorLinkLabel.Name = "errorLinkLabel";
this.errorLinkLabel.TabStop = true;
//
// PatchingWizard_AutoUpdatingPage
//
resources.ApplyResources(this, "$this");
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
this.Controls.Add(this.panel1);
this.Controls.Add(this.progressBar);
this.Controls.Add(this.textBoxLog);
this.Controls.Add(this.labelTitle);
this.Name = "PatchingWizard_AutoUpdatingPage";
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
this.panel1.ResumeLayout(false);
this.panel1.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Label labelTitle;
private System.Windows.Forms.TextBox textBoxLog;
private System.Windows.Forms.ProgressBar progressBar;
private System.Windows.Forms.Label labelError;
private System.Windows.Forms.PictureBox pictureBox1;
private System.Windows.Forms.TableLayoutPanel panel1;
private System.Windows.Forms.LinkLabel errorLinkLabel;
}
}

View File

@ -112,159 +112,201 @@
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="radioButtonDisable.AutoSize" type="System.Boolean, mscorlib">
<assembly alias="mscorlib" name="mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="labelTitle.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="radioButtonDisable.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="labelTitle.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 13</value>
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="radioButtonDisable.Location" type="System.Drawing.Point, System.Drawing">
<value>18, 156</value>
<data name="labelTitle.Size" type="System.Drawing.Size, System.Drawing">
<value>96, 17</value>
</data>
<data name="radioButtonDisable.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>8, 8, 8, 8</value>
<data name="labelTitle.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="radioButtonDisable.Size" type="System.Drawing.Size, System.Drawing">
<value>337, 36</value>
<data name="labelTitle.Text" xml:space="preserve">
<value>アップデートのインストール中:</value>
</data>
<data name="radioButtonDisable.TabIndex" type="System.Int32, mscorlib">
<value>4</value>
<data name="&gt;&gt;labelTitle.Name" xml:space="preserve">
<value>labelTitle</value>
</data>
<data name="radioButtonDisable.Text" xml:space="preserve">
<value>&amp;Don't use live patching</value>
<data name="&gt;&gt;labelTitle.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;radioButtonDisable.Name" xml:space="preserve">
<value>radioButtonDisable</value>
</data>
<data name="&gt;&gt;radioButtonDisable.Type" xml:space="preserve">
<value>System.Windows.Forms.RadioButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;radioButtonDisable.Parent" xml:space="preserve">
<data name="&gt;&gt;labelTitle.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;radioButtonDisable.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="radioButtonEnable.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="radioButtonEnable.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="radioButtonEnable.Location" type="System.Drawing.Point, System.Drawing">
<value>18, 104</value>
</data>
<data name="radioButtonEnable.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>8, 8, 8, 8</value>
</data>
<data name="radioButtonEnable.Size" type="System.Drawing.Size, System.Drawing">
<value>457, 36</value>
</data>
<data name="radioButtonEnable.TabIndex" type="System.Int32, mscorlib">
<data name="&gt;&gt;labelTitle.ZOrder" xml:space="preserve">
<value>3</value>
</data>
<data name="radioButtonEnable.Text" xml:space="preserve">
<value>&amp;Use live patching when possible</value>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="textBoxLog.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Left, Right</value>
</data>
<data name="&gt;&gt;radioButtonEnable.Name" xml:space="preserve">
<value>radioButtonEnable</value>
<data name="textBoxLog.Location" type="System.Drawing.Point, System.Drawing">
<value>6, 71</value>
</data>
<data name="&gt;&gt;radioButtonEnable.Type" xml:space="preserve">
<value>System.Windows.Forms.RadioButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<data name="textBoxLog.Multiline" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="&gt;&gt;radioButtonEnable.Parent" xml:space="preserve">
<data name="textBoxLog.ScrollBars" type="System.Windows.Forms.ScrollBars, System.Windows.Forms">
<value>Both</value>
</data>
<data name="textBoxLog.Size" type="System.Drawing.Size, System.Drawing">
<value>502, 230</value>
</data>
<data name="textBoxLog.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="&gt;&gt;textBoxLog.Name" xml:space="preserve">
<value>textBoxLog</value>
</data>
<data name="&gt;&gt;textBoxLog.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;textBoxLog.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;radioButtonEnable.ZOrder" xml:space="preserve">
<data name="&gt;&gt;textBoxLog.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<data name="labelRubric.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
<data name="progressBar.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Left, Right</value>
</data>
<data name="labelRubric.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 0</value>
<data name="progressBar.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="labelRubric.Size" type="System.Drawing.Size, System.Drawing">
<value>1186, 64</value>
<data name="progressBar.Location" type="System.Drawing.Point, System.Drawing">
<value>6, 42</value>
</data>
<data name="labelRubric.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
<data name="progressBar.Size" type="System.Drawing.Size, System.Drawing">
<value>502, 23</value>
</data>
<data name="labelRubric.Text" xml:space="preserve">
<value>Live patching allows some Linux kernel and Xen updates to be installed without rebooting the server. Select whether you wish to use live patches when they are available.</value>
<data name="progressBar.TabIndex" type="System.Int32, mscorlib">
<value>3</value>
</data>
<data name="&gt;&gt;labelRubric.Name" xml:space="preserve">
<value>labelRubric</value>
<data name="&gt;&gt;progressBar.Name" xml:space="preserve">
<value>progressBar</value>
</data>
<data name="&gt;&gt;labelRubric.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<data name="&gt;&gt;progressBar.Type" xml:space="preserve">
<value>System.Windows.Forms.ProgressBar, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;labelRubric.Parent" xml:space="preserve">
<value>tableLayoutPanel1</value>
</data>
<data name="&gt;&gt;labelRubric.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="tableLayoutPanel1.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="tableLayoutPanel1.ColumnCount" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="tableLayoutPanel1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Top</value>
</data>
<data name="tableLayoutPanel1.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 0</value>
</data>
<data name="tableLayoutPanel1.RowCount" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="tableLayoutPanel1.Size" type="System.Drawing.Size, System.Drawing">
<value>1192, 64</value>
</data>
<data name="tableLayoutPanel1.TabIndex" type="System.Int32, mscorlib">
<value>5</value>
</data>
<data name="&gt;&gt;tableLayoutPanel1.Name" xml:space="preserve">
<value>tableLayoutPanel1</value>
</data>
<data name="&gt;&gt;tableLayoutPanel1.Type" xml:space="preserve">
<value>System.Windows.Forms.TableLayoutPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;tableLayoutPanel1.Parent" xml:space="preserve">
<data name="&gt;&gt;progressBar.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;tableLayoutPanel1.ZOrder" xml:space="preserve">
<data name="&gt;&gt;progressBar.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="labelError.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="labelError.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="labelError.Location" type="System.Drawing.Point, System.Drawing">
<value>35, 0</value>
</data>
<data name="labelError.Size" type="System.Drawing.Size, System.Drawing">
<value>31, 17</value>
</data>
<data name="labelError.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="labelError.Text" xml:space="preserve">
<value>エラー</value>
</data>
<data name="&gt;&gt;labelError.Name" xml:space="preserve">
<value>labelError</value>
</data>
<data name="&gt;&gt;labelError.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;labelError.Parent" xml:space="preserve">
<value>panel1</value>
</data>
<data name="&gt;&gt;labelError.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="tableLayoutPanel1.LayoutSettings" type="System.Windows.Forms.TableLayoutSettings, System.Windows.Forms">
<value>&lt;?xml version="1.0" encoding="utf-16"?&gt;&lt;TableLayoutSettings&gt;&lt;Controls&gt;&lt;Control Name="labelRubric" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;/Controls&gt;&lt;Columns Styles="Percent,50,Percent,50" /&gt;&lt;Rows Styles="Percent,50,Percent,50" /&gt;&lt;/TableLayoutSettings&gt;</value>
<data name="panel1.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<data name="pictureBox1.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="pictureBox1.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 0</value>
</data>
<data name="pictureBox1.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>0, 0, 0, 0</value>
</data>
<data name="pictureBox1.Size" type="System.Drawing.Size, System.Drawing">
<value>32, 32</value>
</data>
<data name="pictureBox1.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="&gt;&gt;pictureBox1.Name" xml:space="preserve">
<value>pictureBox1</value>
</data>
<data name="&gt;&gt;pictureBox1.Type" xml:space="preserve">
<value>System.Windows.Forms.PictureBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;pictureBox1.Parent" xml:space="preserve">
<value>panel1</value>
</data>
<data name="&gt;&gt;pictureBox1.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="panel1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Bottom</value>
</data>
<data name="panel1.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 312</value>
</data>
<data name="panel1.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>0, 0, 0, 0</value>
</data>
<data name="panel1.Size" type="System.Drawing.Size, System.Drawing">
<value>511, 32</value>
</data>
<data name="panel1.TabIndex" type="System.Int32, mscorlib">
<value>4</value>
</data>
<data name="panel1.Visible" type="System.Boolean, mscorlib">
<value>False</value>
</data>
<data name="&gt;&gt;panel1.Name" xml:space="preserve">
<value>panel1</value>
</data>
<data name="&gt;&gt;panel1.Type" xml:space="preserve">
<value>System.Windows.Forms.Panel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;panel1.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;panel1.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
<value>240, 240</value>
</data>
<data name="$this.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>8, 8, 8, 8</value>
<value>96, 96</value>
</data>
<data name="$this.Size" type="System.Drawing.Size, System.Drawing">
<value>1192, 495</value>
<value>511, 344</value>
</data>
<data name="&gt;&gt;$this.Name" xml:space="preserve">
<value>LivePatchingEditPage</value>
<value>PatchingWizard_PatchingPage</value>
</data>
<data name="&gt;&gt;$this.Type" xml:space="preserve">
<value>System.Windows.Forms.UserControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>XenAdmin.Controls.XenTabPage, XenCenterMain, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null</value>
</data>
</root>

View File

@ -0,0 +1,363 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="labelTitle.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="labelTitle.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 13</value>
</data>
<data name="labelTitle.Size" type="System.Drawing.Size, System.Drawing">
<value>92, 13</value>
</data>
<data name="labelTitle.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="labelTitle.Text" xml:space="preserve">
<value>Installing updates:</value>
</data>
<data name="&gt;&gt;labelTitle.Name" xml:space="preserve">
<value>labelTitle</value>
</data>
<data name="&gt;&gt;labelTitle.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;labelTitle.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;labelTitle.ZOrder" xml:space="preserve">
<value>3</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="textBoxLog.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Bottom, Left, Right</value>
</data>
<data name="textBoxLog.Location" type="System.Drawing.Point, System.Drawing">
<value>6, 71</value>
</data>
<data name="textBoxLog.Multiline" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="textBoxLog.ScrollBars" type="System.Windows.Forms.ScrollBars, System.Windows.Forms">
<value>Both</value>
</data>
<data name="textBoxLog.Size" type="System.Drawing.Size, System.Drawing">
<value>502, 216</value>
</data>
<data name="textBoxLog.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="&gt;&gt;textBoxLog.Name" xml:space="preserve">
<value>textBoxLog</value>
</data>
<data name="&gt;&gt;textBoxLog.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;textBoxLog.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;textBoxLog.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<data name="progressBar.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Left, Right</value>
</data>
<data name="progressBar.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="progressBar.Location" type="System.Drawing.Point, System.Drawing">
<value>6, 42</value>
</data>
<data name="progressBar.Size" type="System.Drawing.Size, System.Drawing">
<value>502, 23</value>
</data>
<data name="progressBar.TabIndex" type="System.Int32, mscorlib">
<value>3</value>
</data>
<data name="&gt;&gt;progressBar.Name" xml:space="preserve">
<value>progressBar</value>
</data>
<data name="&gt;&gt;progressBar.Type" xml:space="preserve">
<value>System.Windows.Forms.ProgressBar, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;progressBar.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;progressBar.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="labelError.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="labelError.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value>
</data>
<data name="labelError.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="labelError.Location" type="System.Drawing.Point, System.Drawing">
<value>35, 18</value>
</data>
<data name="labelError.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>3, 8, 3, 3</value>
</data>
<data name="labelError.Size" type="System.Drawing.Size, System.Drawing">
<value>407, 21</value>
</data>
<data name="labelError.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="labelError.Text" xml:space="preserve">
<value>Error</value>
</data>
<data name="&gt;&gt;labelError.Name" xml:space="preserve">
<value>labelError</value>
</data>
<data name="&gt;&gt;labelError.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;labelError.Parent" xml:space="preserve">
<value>panel1</value>
</data>
<data name="&gt;&gt;labelError.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<data name="pictureBox1.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="pictureBox1.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 10</value>
</data>
<data name="pictureBox1.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>0, 0, 0, 0</value>
</data>
<data name="pictureBox1.Size" type="System.Drawing.Size, System.Drawing">
<value>32, 32</value>
</data>
<data name="pictureBox1.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="&gt;&gt;pictureBox1.Name" xml:space="preserve">
<value>pictureBox1</value>
</data>
<data name="&gt;&gt;pictureBox1.Type" xml:space="preserve">
<value>System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;pictureBox1.Parent" xml:space="preserve">
<value>panel1</value>
</data>
<data name="&gt;&gt;pictureBox1.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="panel1.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="panel1.ColumnCount" type="System.Int32, mscorlib">
<value>3</value>
</data>
<data name="errorLinkLabel.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="errorLinkLabel.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="errorLinkLabel.Location" type="System.Drawing.Point, System.Drawing">
<value>448, 18</value>
</data>
<data name="errorLinkLabel.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>3, 8, 3, 3</value>
</data>
<data name="errorLinkLabel.Size" type="System.Drawing.Size, System.Drawing">
<value>60, 13</value>
</data>
<data name="errorLinkLabel.TabIndex" type="System.Int32, mscorlib">
<value>3</value>
</data>
<data name="errorLinkLabel.Text" xml:space="preserve">
<value>&amp;More info...</value>
</data>
<data name="errorLinkLabel.Visible" type="System.Boolean, mscorlib">
<value>False</value>
</data>
<data name="&gt;&gt;errorLinkLabel.Name" xml:space="preserve">
<value>errorLinkLabel</value>
</data>
<data name="&gt;&gt;errorLinkLabel.Type" xml:space="preserve">
<value>System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;errorLinkLabel.Parent" xml:space="preserve">
<value>panel1</value>
</data>
<data name="&gt;&gt;errorLinkLabel.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="panel1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Bottom</value>
</data>
<data name="panel1.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 293</value>
</data>
<data name="panel1.Padding" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>0, 10, 0, 0</value>
</data>
<data name="panel1.RowCount" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="panel1.Size" type="System.Drawing.Size, System.Drawing">
<value>511, 42</value>
</data>
<data name="panel1.TabIndex" type="System.Int32, mscorlib">
<value>5</value>
</data>
<data name="panel1.Visible" type="System.Boolean, mscorlib">
<value>False</value>
</data>
<data name="&gt;&gt;panel1.Name" xml:space="preserve">
<value>panel1</value>
</data>
<data name="&gt;&gt;panel1.Type" xml:space="preserve">
<value>System.Windows.Forms.TableLayoutPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;panel1.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;panel1.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="panel1.LayoutSettings" type="System.Windows.Forms.TableLayoutSettings, System.Windows.Forms">
<value>&lt;?xml version="1.0" encoding="utf-16"?&gt;&lt;TableLayoutSettings&gt;&lt;Controls&gt;&lt;Control Name="pictureBox1" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;Control Name="errorLinkLabel" Row="0" RowSpan="1" Column="2" ColumnSpan="1" /&gt;&lt;Control Name="labelError" Row="0" RowSpan="1" Column="1" ColumnSpan="1" /&gt;&lt;/Controls&gt;&lt;Columns Styles="AutoSize,0,Percent,100,AutoSize,0" /&gt;&lt;Rows Styles="Percent,100" /&gt;&lt;/TableLayoutSettings&gt;</value>
</data>
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
<value>96, 96</value>
</data>
<data name="$this.Size" type="System.Drawing.Size, System.Drawing">
<value>511, 335</value>
</data>
<data name="&gt;&gt;$this.Name" xml:space="preserve">
<value>PatchingWizard_AutoUpdatingPage</value>
</data>
<data name="&gt;&gt;$this.Type" xml:space="preserve">
<value>XenAdmin.Controls.XenTabPage, XenCenterMain, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null</value>
</data>
</root>

View File

@ -0,0 +1,312 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="mscorlib" name="mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="labelTitle.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="labelTitle.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 13</value>
</data>
<data name="labelTitle.Size" type="System.Drawing.Size, System.Drawing">
<value>92, 13</value>
</data>
<data name="labelTitle.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="labelTitle.Text" xml:space="preserve">
<value>正在安装更新:</value>
</data>
<data name="&gt;&gt;labelTitle.Name" xml:space="preserve">
<value>labelTitle</value>
</data>
<data name="&gt;&gt;labelTitle.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;labelTitle.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;labelTitle.ZOrder" xml:space="preserve">
<value>3</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="textBoxLog.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Left, Right</value>
</data>
<data name="textBoxLog.Location" type="System.Drawing.Point, System.Drawing">
<value>6, 71</value>
</data>
<data name="textBoxLog.Multiline" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="textBoxLog.ScrollBars" type="System.Windows.Forms.ScrollBars, System.Windows.Forms">
<value>Both</value>
</data>
<data name="textBoxLog.Size" type="System.Drawing.Size, System.Drawing">
<value>502, 230</value>
</data>
<data name="textBoxLog.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="&gt;&gt;textBoxLog.Name" xml:space="preserve">
<value>textBoxLog</value>
</data>
<data name="&gt;&gt;textBoxLog.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;textBoxLog.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;textBoxLog.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<data name="progressBar.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Left, Right</value>
</data>
<data name="progressBar.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="progressBar.Location" type="System.Drawing.Point, System.Drawing">
<value>6, 42</value>
</data>
<data name="progressBar.Size" type="System.Drawing.Size, System.Drawing">
<value>502, 23</value>
</data>
<data name="progressBar.TabIndex" type="System.Int32, mscorlib">
<value>3</value>
</data>
<data name="&gt;&gt;progressBar.Name" xml:space="preserve">
<value>progressBar</value>
</data>
<data name="&gt;&gt;progressBar.Type" xml:space="preserve">
<value>System.Windows.Forms.ProgressBar, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;progressBar.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;progressBar.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="labelError.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="labelError.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="labelError.Location" type="System.Drawing.Point, System.Drawing">
<value>35, 0</value>
</data>
<data name="labelError.Size" type="System.Drawing.Size, System.Drawing">
<value>29, 13</value>
</data>
<data name="labelError.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="labelError.Text" xml:space="preserve">
<value>错误</value>
</data>
<data name="&gt;&gt;labelError.Name" xml:space="preserve">
<value>labelError</value>
</data>
<data name="&gt;&gt;labelError.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;labelError.Parent" xml:space="preserve">
<value>panel1</value>
</data>
<data name="&gt;&gt;labelError.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="panel1.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="pictureBox1.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="pictureBox1.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 0</value>
</data>
<data name="pictureBox1.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>0, 0, 0, 0</value>
</data>
<data name="pictureBox1.Size" type="System.Drawing.Size, System.Drawing">
<value>32, 32</value>
</data>
<data name="pictureBox1.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="&gt;&gt;pictureBox1.Name" xml:space="preserve">
<value>pictureBox1</value>
</data>
<data name="&gt;&gt;pictureBox1.Type" xml:space="preserve">
<value>System.Windows.Forms.PictureBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;pictureBox1.Parent" xml:space="preserve">
<value>panel1</value>
</data>
<data name="&gt;&gt;pictureBox1.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="panel1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Bottom</value>
</data>
<data name="panel1.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 312</value>
</data>
<data name="panel1.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>0, 0, 0, 0</value>
</data>
<data name="panel1.Size" type="System.Drawing.Size, System.Drawing">
<value>511, 32</value>
</data>
<data name="panel1.TabIndex" type="System.Int32, mscorlib">
<value>4</value>
</data>
<data name="panel1.Visible" type="System.Boolean, mscorlib">
<value>False</value>
</data>
<data name="&gt;&gt;panel1.Name" xml:space="preserve">
<value>panel1</value>
</data>
<data name="&gt;&gt;panel1.Type" xml:space="preserve">
<value>System.Windows.Forms.Panel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;panel1.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;panel1.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
<value>96, 96</value>
</data>
<data name="$this.Size" type="System.Drawing.Size, System.Drawing">
<value>511, 344</value>
</data>
<data name="&gt;&gt;$this.Name" xml:space="preserve">
<value>PatchingWizard_PatchingPage</value>
</data>
<data name="&gt;&gt;$this.Type" xml:space="preserve">
<value>XenAdmin.Controls.XenTabPage, XenCenterMain, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null</value>
</data>
</root>

View File

@ -41,9 +41,6 @@ namespace XenAdmin.Wizards.PatchingWizard
this.panel3 = new System.Windows.Forms.Panel();
this.pictureBox4 = new System.Windows.Forms.PictureBox();
this.label4 = new System.Windows.Forms.Label();
this.panel1 = new System.Windows.Forms.Panel();
this.labelDownloadUpdate = new System.Windows.Forms.Label();
this.pictureBox2 = new System.Windows.Forms.PictureBox();
this.tableLayoutPanel1.SuspendLayout();
this.panel4.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pictureBox5)).BeginInit();
@ -51,8 +48,6 @@ namespace XenAdmin.Wizards.PatchingWizard
((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).BeginInit();
this.panel3.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pictureBox4)).BeginInit();
this.panel1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit();
this.SuspendLayout();
//
// label1
@ -71,7 +66,6 @@ namespace XenAdmin.Wizards.PatchingWizard
this.tableLayoutPanel1.Controls.Add(this.panel4, 0, 5);
this.tableLayoutPanel1.Controls.Add(this.panel2, 0, 3);
this.tableLayoutPanel1.Controls.Add(this.panel3, 0, 4);
this.tableLayoutPanel1.Controls.Add(this.panel1, 0, 2);
this.tableLayoutPanel1.Controls.Add(this.label1, 0, 0);
this.tableLayoutPanel1.Controls.Add(this.label2, 0, 1);
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
@ -133,25 +127,6 @@ namespace XenAdmin.Wizards.PatchingWizard
resources.ApplyResources(this.label4, "label4");
this.label4.Name = "label4";
//
// panel1
//
this.panel1.Controls.Add(this.labelDownloadUpdate);
this.panel1.Controls.Add(this.pictureBox2);
resources.ApplyResources(this.panel1, "panel1");
this.panel1.Name = "panel1";
//
// labelDownloadUpdate
//
resources.ApplyResources(this.labelDownloadUpdate, "labelDownloadUpdate");
this.labelDownloadUpdate.Name = "labelDownloadUpdate";
//
// pictureBox2
//
this.pictureBox2.Image = global::XenAdmin.Properties.Resources.homepage_bullet;
resources.ApplyResources(this.pictureBox2, "pictureBox2");
this.pictureBox2.Name = "pictureBox2";
this.pictureBox2.TabStop = false;
//
// PatchingWizard_FirstPage
//
resources.ApplyResources(this, "$this");
@ -166,8 +141,6 @@ namespace XenAdmin.Wizards.PatchingWizard
((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).EndInit();
this.panel3.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.pictureBox4)).EndInit();
this.panel1.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
@ -178,8 +151,6 @@ namespace XenAdmin.Wizards.PatchingWizard
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.PictureBox pictureBox2;
private System.Windows.Forms.Panel panel4;
private System.Windows.Forms.PictureBox pictureBox5;
private System.Windows.Forms.Label label9;
@ -189,7 +160,6 @@ namespace XenAdmin.Wizards.PatchingWizard
private System.Windows.Forms.Panel panel3;
private System.Windows.Forms.PictureBox pictureBox4;
private System.Windows.Forms.Label label4;
private System.Windows.Forms.Label labelDownloadUpdate;
}
}

View File

@ -126,7 +126,7 @@
<value>3, 0</value>
</data>
<data name="label1.Size" type="System.Drawing.Size, System.Drawing">
<value>363, 13</value>
<value>369, 13</value>
</data>
<data name="label1.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
@ -145,7 +145,7 @@
<value>tableLayoutPanel1</value>
</data>
<data name="&gt;&gt;label1.ZOrder" xml:space="preserve">
<value>4</value>
<value>3</value>
</data>
<data name="label2.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
@ -172,7 +172,7 @@
<value>tableLayoutPanel1</value>
</data>
<data name="&gt;&gt;label2.ZOrder" xml:space="preserve">
<value>5</value>
<value>4</value>
</data>
<data name="tableLayoutPanel1.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
@ -245,7 +245,7 @@
<value>Fill</value>
</data>
<data name="panel4.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 183</value>
<value>3, 143</value>
</data>
<data name="panel4.Size" type="System.Drawing.Size, System.Drawing">
<value>594, 34</value>
@ -329,7 +329,7 @@
<value>Fill</value>
</data>
<data name="panel2.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 103</value>
<value>3, 63</value>
</data>
<data name="panel2.Size" type="System.Drawing.Size, System.Drawing">
<value>594, 34</value>
@ -413,7 +413,7 @@
<value>Fill</value>
</data>
<data name="panel3.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 143</value>
<value>3, 103</value>
</data>
<data name="panel3.Size" type="System.Drawing.Size, System.Drawing">
<value>594, 34</value>
@ -433,90 +433,6 @@
<data name="&gt;&gt;panel3.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<data name="labelDownloadUpdate.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Left, Right</value>
</data>
<data name="labelDownloadUpdate.Location" type="System.Drawing.Point, System.Drawing">
<value>17, 0</value>
</data>
<data name="labelDownloadUpdate.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>20, 0, 3, 0</value>
</data>
<data name="labelDownloadUpdate.Padding" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>3, 0, 3, 0</value>
</data>
<data name="labelDownloadUpdate.Size" type="System.Drawing.Size, System.Drawing">
<value>577, 34</value>
</data>
<data name="labelDownloadUpdate.TabIndex" type="System.Int32, mscorlib">
<value>3</value>
</data>
<data name="labelDownloadUpdate.Text" xml:space="preserve">
<value>Download the relevant update and ensure that you can access the update file from your computer.</value>
</data>
<data name="labelDownloadUpdate.TextAlign" type="System.Drawing.ContentAlignment, System.Drawing">
<value>MiddleLeft</value>
</data>
<data name="&gt;&gt;labelDownloadUpdate.Name" xml:space="preserve">
<value>labelDownloadUpdate</value>
</data>
<data name="&gt;&gt;labelDownloadUpdate.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;labelDownloadUpdate.Parent" xml:space="preserve">
<value>panel1</value>
</data>
<data name="&gt;&gt;labelDownloadUpdate.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="pictureBox2.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 15</value>
</data>
<data name="pictureBox2.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>0, 0, 0, 0</value>
</data>
<data name="pictureBox2.Size" type="System.Drawing.Size, System.Drawing">
<value>4, 4</value>
</data>
<data name="pictureBox2.TabIndex" type="System.Int32, mscorlib">
<value>6</value>
</data>
<data name="&gt;&gt;pictureBox2.Name" xml:space="preserve">
<value>pictureBox2</value>
</data>
<data name="&gt;&gt;pictureBox2.Type" xml:space="preserve">
<value>System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;pictureBox2.Parent" xml:space="preserve">
<value>panel1</value>
</data>
<data name="&gt;&gt;pictureBox2.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="panel1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value>
</data>
<data name="panel1.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 63</value>
</data>
<data name="panel1.Size" type="System.Drawing.Size, System.Drawing">
<value>594, 34</value>
</data>
<data name="panel1.TabIndex" type="System.Int32, mscorlib">
<value>7</value>
</data>
<data name="&gt;&gt;panel1.Name" xml:space="preserve">
<value>panel1</value>
</data>
<data name="&gt;&gt;panel1.Type" xml:space="preserve">
<value>System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;panel1.Parent" xml:space="preserve">
<value>tableLayoutPanel1</value>
</data>
<data name="&gt;&gt;panel1.ZOrder" xml:space="preserve">
<value>3</value>
</data>
<data name="tableLayoutPanel1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Top</value>
</data>
@ -527,7 +443,7 @@
<value>6</value>
</data>
<data name="tableLayoutPanel1.Size" type="System.Drawing.Size, System.Drawing">
<value>600, 220</value>
<value>600, 180</value>
</data>
<data name="tableLayoutPanel1.TabIndex" type="System.Int32, mscorlib">
<value>3</value>
@ -545,7 +461,7 @@
<value>0</value>
</data>
<data name="tableLayoutPanel1.LayoutSettings" type="System.Windows.Forms.TableLayoutSettings, System.Windows.Forms">
<value>&lt;?xml version="1.0" encoding="utf-16"?&gt;&lt;TableLayoutSettings&gt;&lt;Controls&gt;&lt;Control Name="panel4" Row="5" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;Control Name="panel2" Row="3" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;Control Name="panel3" Row="4" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;Control Name="panel1" Row="2" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;Control Name="label1" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;Control Name="label2" Row="1" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;/Controls&gt;&lt;Columns Styles="Percent,100" /&gt;&lt;Rows Styles="Absolute,30,Absolute,30,Absolute,40,Absolute,40,Absolute,40,Absolute,40" /&gt;&lt;/TableLayoutSettings&gt;</value>
<value>&lt;?xml version="1.0" encoding="utf-16"?&gt;&lt;TableLayoutSettings&gt;&lt;Controls&gt;&lt;Control Name="panel4" Row="5" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;Control Name="panel2" Row="3" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;Control Name="panel3" Row="4" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;Control Name="label1" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;Control Name="label2" Row="1" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;/Controls&gt;&lt;Columns Styles="Percent,100" /&gt;&lt;Rows Styles="Absolute,30,Absolute,30,AutoSize,40,Absolute,40,Absolute,40,Absolute,40" /&gt;&lt;/TableLayoutSettings&gt;</value>
</data>
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
@ -562,4 +478,4 @@
<data name="&gt;&gt;$this.Type" xml:space="preserve">
<value>XenAdmin.Controls.XenTabPage, XenCenterMain, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null</value>
</data>
</root>
</root>

View File

@ -41,19 +41,21 @@ namespace XenAdmin.Wizards.PatchingWizard
this.buttonReCheckProblems = new System.Windows.Forms.Button();
this.buttonResolveAll = new System.Windows.Forms.Button();
this.progressBar1 = new System.Windows.Forms.ProgressBar();
this.panelErrorsFound = new System.Windows.Forms.Panel();
this.label1 = new System.Windows.Forms.Label();
this.pictureBox1 = new System.Windows.Forms.PictureBox();
this.labelIssues = new System.Windows.Forms.Label();
this.pictureBoxIssues = new System.Windows.Forms.PictureBox();
this.checkBoxViewPrecheckFailuresOnly = new System.Windows.Forms.CheckBox();
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
this.labelProgress = new System.Windows.Forms.Label();
((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit();
this.panelErrorsFound.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBoxIssues)).BeginInit();
this.tableLayoutPanel1.SuspendLayout();
this.SuspendLayout();
//
// labelPrechecksFirstLine
//
resources.ApplyResources(this.labelPrechecksFirstLine, "labelPrechecksFirstLine");
this.labelPrechecksFirstLine.AutoEllipsis = true;
this.tableLayoutPanel1.SetColumnSpan(this.labelPrechecksFirstLine, 4);
this.labelPrechecksFirstLine.Name = "labelPrechecksFirstLine";
//
// dataGridView1
@ -68,6 +70,7 @@ namespace XenAdmin.Wizards.PatchingWizard
this.ColumnState,
this.ColumnDescription,
this.ColumnSolution});
this.tableLayoutPanel1.SetColumnSpan(this.dataGridView1, 4);
dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
dataGridViewCellStyle2.BackColor = System.Drawing.SystemColors.Window;
dataGridViewCellStyle2.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
@ -79,9 +82,9 @@ namespace XenAdmin.Wizards.PatchingWizard
this.dataGridView1.HideSelection = true;
this.dataGridView1.Name = "dataGridView1";
this.dataGridView1.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.RowHeaderSelect;
this.dataGridView1.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView1_CellContentClick);
this.dataGridView1.CellMouseMove += new System.Windows.Forms.DataGridViewCellMouseEventHandler(this.dataGridView1_CellMouseMove);
this.dataGridView1.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.dataGridView1_KeyPress);
this.dataGridView1.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView1_CellContentClick);
//
// ColumnState
//
@ -124,52 +127,65 @@ namespace XenAdmin.Wizards.PatchingWizard
//
// progressBar1
//
this.tableLayoutPanel1.SetColumnSpan(this.progressBar1, 4);
resources.ApplyResources(this.progressBar1, "progressBar1");
this.progressBar1.Name = "progressBar1";
//
// panelErrorsFound
// labelIssues
//
resources.ApplyResources(this.panelErrorsFound, "panelErrorsFound");
this.panelErrorsFound.Controls.Add(this.label1);
this.panelErrorsFound.Controls.Add(this.pictureBox1);
this.panelErrorsFound.Name = "panelErrorsFound";
this.labelIssues.AutoEllipsis = true;
this.tableLayoutPanel1.SetColumnSpan(this.labelIssues, 3);
resources.ApplyResources(this.labelIssues, "labelIssues");
this.labelIssues.Name = "labelIssues";
//
// label1
// pictureBoxIssues
//
resources.ApplyResources(this.label1, "label1");
this.label1.AutoEllipsis = true;
this.label1.Name = "label1";
//
// pictureBox1
//
resources.ApplyResources(this.pictureBox1, "pictureBox1");
this.pictureBox1.Image = global::XenAdmin.Properties.Resources._000_Abort_h32bit_16;
this.pictureBox1.Name = "pictureBox1";
this.pictureBox1.TabStop = false;
this.pictureBoxIssues.Image = global::XenAdmin.Properties.Resources._000_Abort_h32bit_16;
resources.ApplyResources(this.pictureBoxIssues, "pictureBoxIssues");
this.pictureBoxIssues.Name = "pictureBoxIssues";
this.pictureBoxIssues.TabStop = false;
//
// checkBoxViewPrecheckFailuresOnly
//
resources.ApplyResources(this.checkBoxViewPrecheckFailuresOnly, "checkBoxViewPrecheckFailuresOnly");
this.checkBoxViewPrecheckFailuresOnly.Checked = true;
this.checkBoxViewPrecheckFailuresOnly.CheckState = System.Windows.Forms.CheckState.Checked;
this.tableLayoutPanel1.SetColumnSpan(this.checkBoxViewPrecheckFailuresOnly, 2);
this.checkBoxViewPrecheckFailuresOnly.Name = "checkBoxViewPrecheckFailuresOnly";
this.checkBoxViewPrecheckFailuresOnly.UseVisualStyleBackColor = true;
this.checkBoxViewPrecheckFailuresOnly.CheckedChanged += new System.EventHandler(this.checkBox1_CheckedChanged);
//
// tableLayoutPanel1
//
resources.ApplyResources(this.tableLayoutPanel1, "tableLayoutPanel1");
this.tableLayoutPanel1.Controls.Add(this.labelPrechecksFirstLine, 0, 0);
this.tableLayoutPanel1.Controls.Add(this.dataGridView1, 0, 1);
this.tableLayoutPanel1.Controls.Add(this.labelProgress, 0, 3);
this.tableLayoutPanel1.Controls.Add(this.buttonResolveAll, 3, 2);
this.tableLayoutPanel1.Controls.Add(this.checkBoxViewPrecheckFailuresOnly, 0, 2);
this.tableLayoutPanel1.Controls.Add(this.buttonReCheckProblems, 2, 2);
this.tableLayoutPanel1.Controls.Add(this.pictureBoxIssues, 0, 4);
this.tableLayoutPanel1.Controls.Add(this.progressBar1, 0, 5);
this.tableLayoutPanel1.Controls.Add(this.labelIssues, 1, 4);
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
//
// labelProgress
//
this.labelProgress.AutoEllipsis = true;
this.tableLayoutPanel1.SetColumnSpan(this.labelProgress, 4);
resources.ApplyResources(this.labelProgress, "labelProgress");
this.labelProgress.Name = "labelProgress";
//
// PatchingWizard_PrecheckPage
//
this.Controls.Add(this.checkBoxViewPrecheckFailuresOnly);
this.Controls.Add(this.panelErrorsFound);
this.Controls.Add(this.progressBar1);
this.Controls.Add(this.buttonResolveAll);
this.Controls.Add(this.buttonReCheckProblems);
this.Controls.Add(this.dataGridView1);
this.Controls.Add(this.labelPrechecksFirstLine);
this.Controls.Add(this.tableLayoutPanel1);
resources.ApplyResources(this, "$this");
this.Name = "PatchingWizard_PrecheckPage";
((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit();
this.panelErrorsFound.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBoxIssues)).EndInit();
this.tableLayoutPanel1.ResumeLayout(false);
this.tableLayoutPanel1.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
@ -180,13 +196,14 @@ namespace XenAdmin.Wizards.PatchingWizard
private System.Windows.Forms.Button buttonReCheckProblems;
private System.Windows.Forms.Button buttonResolveAll;
private System.Windows.Forms.ProgressBar progressBar1;
private System.Windows.Forms.Panel panelErrorsFound;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.PictureBox pictureBox1;
private System.Windows.Forms.Label labelIssues;
private System.Windows.Forms.PictureBox pictureBoxIssues;
private System.Windows.Forms.CheckBox checkBoxViewPrecheckFailuresOnly;
private System.Windows.Forms.DataGridViewImageColumn ColumnState;
private System.Windows.Forms.DataGridViewTextBoxColumn ColumnDescription;
private System.Windows.Forms.DataGridViewTextBoxColumn ColumnSolution;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
private System.Windows.Forms.Label labelProgress;
}
}

View File

@ -55,6 +55,8 @@ namespace XenAdmin.Wizards.PatchingWizard
private BackgroundWorker _worker = null;
public List<Host> SelectedServers = new List<Host>();
public List<Problem> ProblemsResolvedPreCheck = new List<Problem>();
public bool IsInAutomaticMode { get; set; }
private AsyncAction resolvePrechecksAction = null;
protected List<Pool> SelectedPools
{
@ -68,7 +70,6 @@ namespace XenAdmin.Wizards.PatchingWizard
{
InitializeComponent();
dataGridView1.BackgroundColor = dataGridView1.DefaultCellStyle.BackColor;
checkBoxViewPrecheckFailuresOnly.Checked = true;
}
public override string PageTitle
@ -92,11 +93,6 @@ namespace XenAdmin.Wizards.PatchingWizard
get { return "UpdatePrechecks"; }
}
public override bool EnablePrevious()
{
return _worker != null && !_worker.IsBusy;
}
void Connection_ConnectionStateChanged(object sender, EventArgs e)
{
Program.Invoke(Program.MainWindow, RefreshRechecks);
@ -127,9 +123,17 @@ namespace XenAdmin.Wizards.PatchingWizard
if (direction == PageLoadedDirection.Back)
return;
labelPrechecksFirstLine.Text = Patch != null
? string.Format(Messages.PATCHINGWIZARD_PRECHECKPAGE_FIRSTLINE, Patch.Name)
: Messages.PATCHINGWIZARD_PRECHECKPAGE_FIRSTLINE_NO_PATCH_NAME;
if (IsInAutomaticMode)
{
labelPrechecksFirstLine.Text = Messages.PATCHINGWIZARD_PRECHECKPAGE_FIRSTLINE_AUTOMATIC_MODE;
}
else
{
labelPrechecksFirstLine.Text = Patch != null
? string.Format(Messages.PATCHINGWIZARD_PRECHECKPAGE_FIRSTLINE, Patch.Name)
: Messages.PATCHINGWIZARD_PRECHECKPAGE_FIRSTLINE_NO_PATCH_NAME;
}
RefreshRechecks();
}
catch (Exception e)
@ -141,7 +145,7 @@ namespace XenAdmin.Wizards.PatchingWizard
protected void RefreshRechecks()
{
buttonResolveAll.Enabled = buttonReCheckProblems.Enabled = false;
buttonResolveAll.Enabled = buttonReCheckProblems.Enabled = checkBoxViewPrecheckFailuresOnly.Enabled = false;
_worker = null;
_worker = new BackgroundWorker();
_worker.DoWork += new DoWorkEventHandler(worker_DoWork);
@ -157,6 +161,7 @@ namespace XenAdmin.Wizards.PatchingWizard
if (!e.Cancelled)
OnPageUpdated();
progressBar1.Value = 100;
labelProgress.Text = string.Empty;
bool showResolveAllButton = false;
foreach (PreCheckGridRow row in dataGridView1.Rows)
@ -179,7 +184,7 @@ namespace XenAdmin.Wizards.PatchingWizard
}
buttonResolveAll.Enabled = showResolveAllButton;
buttonReCheckProblems.Enabled = true;
buttonReCheckProblems.Enabled = checkBoxViewPrecheckFailuresOnly.Enabled = true;
}
private void AddRowToGridView(DataGridViewRow row)
@ -214,6 +219,16 @@ namespace XenAdmin.Wizards.PatchingWizard
catch (Exception) { }
}
private bool IsCheckInProgress
{
get { return _worker != null && _worker.IsBusy; }
}
private bool IsResolveActionInProgress
{
get { return resolvePrechecksAction != null && !resolvePrechecksAction.IsCompleted; }
}
private List<PreCheckHostRow> ExecuteCheck(Check check)
{
var rows = new List<PreCheckHostRow>();
@ -259,6 +274,7 @@ namespace XenAdmin.Wizards.PatchingWizard
{
dataGridView1.Rows.Clear();
progressBar1.Value = 0;
labelProgress.Text = Messages.PATCHING_WIZARD_RUNNING_PRECHECKS;
});
Pool_patch patch = e.Argument as Pool_patch;
@ -365,6 +381,29 @@ namespace XenAdmin.Wizards.PatchingWizard
}
}
if (IsInAutomaticMode)
{
checks.Add(new KeyValuePair<string, List<Check>>(Messages.PATCHINGWIZARD_PRECHECKPAGE_CHECKING_DISK_SPACE, new List<Check>()));
checkGroup = checks[checks.Count - 1].Value;
foreach (Pool pool in SelectedPools)
{
var us = Updates.GetUpgradeSequence(pool.Connection);
foreach (Host host in us.Keys)
{
checkGroup.Add(
new DiskSpaceForBatchUpdatesCheck(
host,
host.IsMaster()
? us[host].Sum(p => p.InstallationSize) + us.Values.SelectMany(a => a).Max(p => p.InstallationSize) // master: all updates on master + largest update in pool
: us[host].Sum(p => p.InstallationSize) + us[host].Max(p => p.InstallationSize) // non-master: all updates on this host + largest on this host
));
}
}
}
return checks;
}
@ -381,6 +420,8 @@ namespace XenAdmin.Wizards.PatchingWizard
DeregisterEventHandlers();
if (_worker != null)
_worker.CancelAsync();
if (resolvePrechecksAction != null && !resolvePrechecksAction.IsCompleted)
resolvePrechecksAction.Cancel();
}
public override void PageLeave(PageLoadedDirection direction, ref bool cancel)
@ -395,6 +436,11 @@ namespace XenAdmin.Wizards.PatchingWizard
base.PageLeave(direction, ref cancel);
}
public override bool EnablePrevious()
{
return !IsCheckInProgress && !IsResolveActionInProgress;
}
public override bool EnableNext()
{
bool problemsFound = false;
@ -406,21 +452,18 @@ namespace XenAdmin.Wizards.PatchingWizard
problemsFound = true;
break;
}
}
bool result = _worker != null && !_worker.IsBusy && !problemsFound;
panelErrorsFound.Visible = problemsFound;
return result;
UpdateControls(problemsFound);
return !IsCheckInProgress && !IsResolveActionInProgress && !problemsFound;
}
public UpdateType SelectedUpdateType { private get; set; }
public Pool_patch Patch { private get; set; }
public List<Pool_patch> NewUploadedPatches { private get; set; }
internal enum PreCheckResult { OK, Warning, Failed }
private abstract class PreCheckGridRow : DataGridViewRow
private abstract class PreCheckGridRow : XenAdmin.Controls.DataGridViewEx.DataGridViewExRow
{
protected DataGridViewImageCell _iconCell = new DataGridViewImageCell();
protected DataGridViewTextBoxCell _descriptionCell = new DataGridViewTextBoxCell();
@ -508,8 +551,20 @@ namespace XenAdmin.Wizards.PatchingWizard
if (Problem is ProblemWithInformationUrl)
_solutionCell.Value = (Problem as ProblemWithInformationUrl).LinkText;
_solutionCell.Style.Font = new Font(Program.DefaultFont, FontStyle.Underline);
_solutionCell.Style.ForeColor = Color.Blue;
UpdateSolutionCellStyle();
}
private void UpdateSolutionCellStyle()
{
if (_solutionCell == null)
return;
if (Enabled)
{
_solutionCell.Style.Font = new Font(Program.DefaultFont, FontStyle.Underline);
_solutionCell.Style.ForeColor = Color.Blue;
}
else
_solutionCell.Style = DefaultCellStyle;
}
public Problem Problem
@ -543,14 +598,24 @@ namespace XenAdmin.Wizards.PatchingWizard
return (_problem != null ? _problem.GetHashCode() : 0);
}
public override bool Enabled
{
get
{
return base.Enabled;
}
set
{
base.Enabled = value;
UpdateSolutionCellStyle();
}
}
}
private ActionProgressDialog _progressDialog = null;
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
PreCheckHostRow preCheckHostRow = dataGridView1.Rows[e.RowIndex] as PreCheckHostRow;
if (preCheckHostRow != null && e.ColumnIndex == 2)
if (preCheckHostRow != null && preCheckHostRow.Enabled && e.ColumnIndex == 2)
{
ExecuteSolution(preCheckHostRow);
}
@ -563,7 +628,7 @@ namespace XenAdmin.Wizards.PatchingWizard
PreCheckHostRow preCheckHostRow = dataGridView1.CurrentCell.OwningRow as PreCheckHostRow;
int columnIndex = dataGridView1.CurrentCell.ColumnIndex;
if (preCheckHostRow != null && columnIndex == 2)
if (preCheckHostRow != null && preCheckHostRow.Enabled && columnIndex == 2)
ExecuteSolution(preCheckHostRow);
}
}
@ -571,13 +636,20 @@ namespace XenAdmin.Wizards.PatchingWizard
private void ExecuteSolution(PreCheckHostRow preCheckHostRow)
{
bool cancelled;
AsyncAction action = preCheckHostRow.Problem.SolveImmediately(out cancelled);
resolvePrechecksAction = preCheckHostRow.Problem.SolveImmediately(out cancelled);
if (action != null)
if (resolvePrechecksAction != null)
{
action.Completed += action_Completed;
_progressDialog = new ActionProgressDialog(action, ProgressBarStyle.Blocks);
_progressDialog.ShowDialog(this);
// disable all problems
foreach (DataGridViewRow row in dataGridView1.Rows)
{
PreCheckHostRow preCheckRow = row as PreCheckHostRow;
if (preCheckRow != null && preCheckRow.Problem != null)
{
preCheckRow.Enabled = false;
}
}
StartResolvePrechecksAction();
}
else
{
@ -596,13 +668,6 @@ namespace XenAdmin.Wizards.PatchingWizard
}
}
private void action_Completed(ActionBase sender)
{
Thread.Sleep(1000);
Program.Invoke(Program.MainWindow, RefreshRechecks);
}
private void buttonReCheckProblems_Click(object sender, EventArgs e)
{
RefreshRechecks();
@ -618,17 +683,69 @@ namespace XenAdmin.Wizards.PatchingWizard
{
bool cancelled;
AsyncAction action = preCheckHostRow.Problem.SolveImmediately(out cancelled);
if (action != null)
{
preCheckHostRow.Enabled = false;
actions.Add(action);
}
}
}
var multipleAction = new ParallelAction(Messages.PATCHINGWIZARD_PRECHECKPAGE_RESOLVING_ALL, Messages.PATCHINGWIZARD_PRECHECKPAGE_RESOLVING_ALL, Messages.COMPLETED, actions, true, false);
_progressDialog = new ActionProgressDialog(multipleAction, ProgressBarStyle.Blocks);
_progressDialog.ShowDialog(this);
Program.Invoke(Program.MainWindow, RefreshRechecks);
resolvePrechecksAction = new ParallelAction(Messages.PATCHINGWIZARD_PRECHECKPAGE_RESOLVING_ALL, Messages.PATCHINGWIZARD_PRECHECKPAGE_RESOLVING_ALL, Messages.COMPLETED, actions, true, false);
StartResolvePrechecksAction();
}
private void resolvePrecheckAction_Changed(object sender)
{
var action = sender as AsyncAction;
if (action == null)
return;
Program.Invoke(this, () => UpdateActionProgress(action));
}
private void resolvePrecheckAction_Completed(object sender)
{
var action = sender as AsyncAction;
if (action == null)
return;
action.Changed -= resolvePrecheckAction_Changed;
action.Completed -= resolvePrecheckAction_Completed;
Program.Invoke(this, () =>
{
UpdateControls();
RefreshRechecks();
});
}
private void StartResolvePrechecksAction()
{
if (resolvePrechecksAction == null)
return;
resolvePrechecksAction.Changed += resolvePrecheckAction_Changed;
resolvePrechecksAction.Completed += resolvePrecheckAction_Completed;
resolvePrechecksAction.RunAsync();
UpdateActionProgress(resolvePrechecksAction);
UpdateControls();
OnPageUpdated();
}
private void UpdateActionProgress(AsyncAction action)
{
progressBar1.Value = action == null ? 0 : action.PercentComplete;
labelProgress.Text = action == null ? string.Empty : action.Description;
}
private void UpdateControls(bool problemsFound = false)
{
bool actionInProgress = IsResolveActionInProgress;
bool checkInProgress = IsCheckInProgress;
buttonResolveAll.Enabled = buttonReCheckProblems.Enabled = checkBoxViewPrecheckFailuresOnly.Enabled = !actionInProgress && !checkInProgress;
labelProgress.Visible = actionInProgress || checkInProgress || !problemsFound;
pictureBoxIssues.Visible = labelIssues.Visible = problemsFound && !actionInProgress && !checkInProgress;
}
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
RefreshRechecks();
@ -637,10 +754,8 @@ namespace XenAdmin.Wizards.PatchingWizard
private void dataGridView1_CellMouseMove(object sender, DataGridViewCellMouseEventArgs e)
{
PreCheckHostRow preCheckHostRow = dataGridView1.Rows[e.RowIndex] as PreCheckHostRow;
if (preCheckHostRow != null && e.ColumnIndex == 2 && !string.IsNullOrEmpty(preCheckHostRow.Solution))
{
if (preCheckHostRow != null && preCheckHostRow.Enabled && e.ColumnIndex == 2 && !string.IsNullOrEmpty(preCheckHostRow.Solution))
Cursor = Cursors.Hand;
}
else
Cursor = Cursors.Arrow;
}

View File

@ -112,45 +112,23 @@
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="labelPrechecksFirstLine.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Left, Right</value>
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="labelPrechecksFirstLine.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 0</value>
</data>
<data name="labelPrechecksFirstLine.Size" type="System.Drawing.Size, System.Drawing">
<value>558, 31</value>
</data>
<assembly alias="mscorlib" name="mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="labelPrechecksFirstLine.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="labelPrechecksFirstLine.Text" xml:space="preserve">
<value>Update pre-checks are performed to verify that the update "{0}" can be applied to the servers.</value>
</data>
<data name="&gt;&gt;labelPrechecksFirstLine.Name" xml:space="preserve">
<value>labelPrechecksFirstLine</value>
</data>
<data name="&gt;&gt;labelPrechecksFirstLine.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;labelPrechecksFirstLine.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;labelPrechecksFirstLine.ZOrder" xml:space="preserve">
<value>6</value>
<assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="tableLayoutPanel1.ColumnCount" type="System.Int32, mscorlib">
<value>4</value>
</data>
<data name="dataGridView1.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Bottom, Left, Right</value>
</data>
<metadata name="ColumnState.UserAddedColumn" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<metadata name="ColumnState.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<data name="ColumnState.HeaderText" xml:space="preserve">
@ -162,13 +140,13 @@
<data name="ColumnState.Width" type="System.Int32, mscorlib">
<value>20</value>
</data>
<metadata name="ColumnDescription.UserAddedColumn" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<metadata name="ColumnDescription.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<data name="ColumnDescription.HeaderText" xml:space="preserve">
<value />
</data>
<metadata name="ColumnSolution.UserAddedColumn" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<metadata name="ColumnSolution.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<data name="ColumnSolution.HeaderText" xml:space="preserve">
@ -180,11 +158,12 @@
<data name="ColumnSolution.Width" type="System.Int32, mscorlib">
<value>80</value>
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="dataGridView1.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 63</value>
<value>3, 34</value>
</data>
<data name="dataGridView1.Size" type="System.Drawing.Size, System.Drawing">
<value>561, 269</value>
<value>564, 268</value>
</data>
<data name="dataGridView1.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
@ -196,43 +175,49 @@
<value>XenAdmin.Controls.DataGridViewEx.DataGridViewEx, XenCenterMain, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null</value>
</data>
<data name="&gt;&gt;dataGridView1.Parent" xml:space="preserve">
<value>$this</value>
<value>tableLayoutPanel1</value>
</data>
<data name="&gt;&gt;dataGridView1.ZOrder" xml:space="preserve">
<value>5</value>
<value>1</value>
</data>
<data name="buttonReCheckProblems.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Right</value>
<data name="labelProgress.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value>
</data>
<data name="buttonReCheckProblems.Location" type="System.Drawing.Point, System.Drawing">
<value>382, 338</value>
<data name="labelProgress.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="buttonReCheckProblems.Size" type="System.Drawing.Size, System.Drawing">
<value>85, 23</value>
<data name="labelProgress.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 334</value>
</data>
<data name="buttonReCheckProblems.TabIndex" type="System.Int32, mscorlib">
<data name="labelProgress.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>0, 0, 0, 0</value>
</data>
<data name="labelProgress.Size" type="System.Drawing.Size, System.Drawing">
<value>570, 22</value>
</data>
<data name="labelProgress.TabIndex" type="System.Int32, mscorlib">
<value>2</value>
</data>
<data name="buttonReCheckProblems.Text" xml:space="preserve">
<value>&amp;Check Again</value>
<data name="labelProgress.TextAlign" type="System.Drawing.ContentAlignment, System.Drawing">
<value>MiddleLeft</value>
</data>
<data name="&gt;&gt;buttonReCheckProblems.Name" xml:space="preserve">
<value>buttonReCheckProblems</value>
<data name="&gt;&gt;labelProgress.Name" xml:space="preserve">
<value>labelProgress</value>
</data>
<data name="&gt;&gt;buttonReCheckProblems.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<data name="&gt;&gt;labelProgress.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;buttonReCheckProblems.Parent" xml:space="preserve">
<value>$this</value>
<data name="&gt;&gt;labelProgress.Parent" xml:space="preserve">
<value>tableLayoutPanel1</value>
</data>
<data name="&gt;&gt;buttonReCheckProblems.ZOrder" xml:space="preserve">
<value>4</value>
<data name="&gt;&gt;labelProgress.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<data name="buttonResolveAll.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Right</value>
</data>
<data name="buttonResolveAll.Location" type="System.Drawing.Point, System.Drawing">
<value>473, 338</value>
<value>482, 308</value>
</data>
<data name="buttonResolveAll.Size" type="System.Drawing.Size, System.Drawing">
<value>85, 23</value>
@ -247,122 +232,14 @@
<value>buttonResolveAll</value>
</data>
<data name="&gt;&gt;buttonResolveAll.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;buttonResolveAll.Parent" xml:space="preserve">
<value>$this</value>
<value>tableLayoutPanel1</value>
</data>
<data name="&gt;&gt;buttonResolveAll.ZOrder" xml:space="preserve">
<value>3</value>
</data>
<data name="progressBar1.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Left, Right</value>
</data>
<data name="progressBar1.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 34</value>
</data>
<data name="progressBar1.Size" type="System.Drawing.Size, System.Drawing">
<value>561, 23</value>
</data>
<data name="progressBar1.TabIndex" type="System.Int32, mscorlib">
<value>4</value>
</data>
<data name="&gt;&gt;progressBar1.Name" xml:space="preserve">
<value>progressBar1</value>
</data>
<data name="&gt;&gt;progressBar1.Type" xml:space="preserve">
<value>System.Windows.Forms.ProgressBar, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;progressBar1.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;progressBar1.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<data name="panelErrorsFound.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
</data>
<data name="label1.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Bottom, Left</value>
</data>
<data name="label1.Location" type="System.Drawing.Point, System.Drawing">
<value>25, 0</value>
</data>
<data name="label1.Size" type="System.Drawing.Size, System.Drawing">
<value>364, 23</value>
</data>
<data name="label1.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="label1.Text" xml:space="preserve">
<value>You need to resolve the issues found before you can continue.</value>
</data>
<data name="label1.TextAlign" type="System.Drawing.ContentAlignment, System.Drawing">
<value>MiddleLeft</value>
</data>
<data name="&gt;&gt;label1.Name" xml:space="preserve">
<value>label1</value>
</data>
<data name="&gt;&gt;label1.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label1.Parent" xml:space="preserve">
<value>panelErrorsFound</value>
</data>
<data name="&gt;&gt;label1.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="pictureBox1.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Bottom, Left</value>
</data>
<data name="pictureBox1.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 0</value>
</data>
<data name="pictureBox1.Padding" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>3, 3, 0, 0</value>
</data>
<data name="pictureBox1.Size" type="System.Drawing.Size, System.Drawing">
<value>25, 23</value>
</data>
<data name="pictureBox1.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="&gt;&gt;pictureBox1.Name" xml:space="preserve">
<value>pictureBox1</value>
</data>
<data name="&gt;&gt;pictureBox1.Type" xml:space="preserve">
<value>System.Windows.Forms.PictureBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;pictureBox1.Parent" xml:space="preserve">
<value>panelErrorsFound</value>
</data>
<data name="&gt;&gt;pictureBox1.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="panelErrorsFound.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 361</value>
</data>
<data name="panelErrorsFound.Size" type="System.Drawing.Size, System.Drawing">
<value>389, 23</value>
</data>
<data name="panelErrorsFound.TabIndex" type="System.Int32, mscorlib">
<value>5</value>
</data>
<data name="panelErrorsFound.Visible" type="System.Boolean, mscorlib">
<value>False</value>
</data>
<data name="&gt;&gt;panelErrorsFound.Name" xml:space="preserve">
<value>panelErrorsFound</value>
</data>
<data name="&gt;&gt;panelErrorsFound.Type" xml:space="preserve">
<value>System.Windows.Forms.Panel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;panelErrorsFound.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;panelErrorsFound.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="checkBoxViewPrecheckFailuresOnly.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
</data>
@ -370,7 +247,7 @@
<value>True</value>
</data>
<data name="checkBoxViewPrecheckFailuresOnly.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 342</value>
<value>3, 314</value>
</data>
<data name="checkBoxViewPrecheckFailuresOnly.Size" type="System.Drawing.Size, System.Drawing">
<value>154, 17</value>
@ -385,40 +262,205 @@
<value>checkBoxViewPrecheckFailuresOnly</value>
</data>
<data name="&gt;&gt;checkBoxViewPrecheckFailuresOnly.Type" xml:space="preserve">
<value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;checkBoxViewPrecheckFailuresOnly.Parent" xml:space="preserve">
<value>$this</value>
<value>tableLayoutPanel1</value>
</data>
<data name="&gt;&gt;checkBoxViewPrecheckFailuresOnly.ZOrder" xml:space="preserve">
<value>4</value>
</data>
<data name="buttonReCheckProblems.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Right</value>
</data>
<data name="buttonReCheckProblems.Location" type="System.Drawing.Point, System.Drawing">
<value>391, 308</value>
</data>
<data name="buttonReCheckProblems.Size" type="System.Drawing.Size, System.Drawing">
<value>85, 23</value>
</data>
<data name="buttonReCheckProblems.TabIndex" type="System.Int32, mscorlib">
<value>2</value>
</data>
<data name="buttonReCheckProblems.Text" xml:space="preserve">
<value>&amp;Check Again</value>
</data>
<data name="&gt;&gt;buttonReCheckProblems.Name" xml:space="preserve">
<value>buttonReCheckProblems</value>
</data>
<data name="&gt;&gt;buttonReCheckProblems.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;buttonReCheckProblems.Parent" xml:space="preserve">
<value>tableLayoutPanel1</value>
</data>
<data name="&gt;&gt;buttonReCheckProblems.ZOrder" xml:space="preserve">
<value>5</value>
</data>
<data name="pictureBoxIssues.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 359</value>
</data>
<data name="pictureBoxIssues.Size" type="System.Drawing.Size, System.Drawing">
<value>16, 16</value>
</data>
<data name="pictureBoxIssues.SizeMode" type="System.Windows.Forms.PictureBoxSizeMode, System.Windows.Forms">
<value>AutoSize</value>
</data>
<data name="pictureBoxIssues.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="&gt;&gt;pictureBoxIssues.Name" xml:space="preserve">
<value>pictureBoxIssues</value>
</data>
<data name="&gt;&gt;pictureBoxIssues.Type" xml:space="preserve">
<value>System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;pictureBoxIssues.Parent" xml:space="preserve">
<value>tableLayoutPanel1</value>
</data>
<data name="&gt;&gt;pictureBoxIssues.ZOrder" xml:space="preserve">
<value>6</value>
</data>
<data name="progressBar1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Top</value>
</data>
<data name="progressBar1.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="progressBar1.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 381</value>
</data>
<data name="progressBar1.Size" type="System.Drawing.Size, System.Drawing">
<value>564, 16</value>
</data>
<data name="progressBar1.TabIndex" type="System.Int32, mscorlib">
<value>4</value>
</data>
<data name="&gt;&gt;progressBar1.Name" xml:space="preserve">
<value>progressBar1</value>
</data>
<data name="&gt;&gt;progressBar1.Type" xml:space="preserve">
<value>System.Windows.Forms.ProgressBar, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;progressBar1.Parent" xml:space="preserve">
<value>tableLayoutPanel1</value>
</data>
<data name="&gt;&gt;progressBar1.ZOrder" xml:space="preserve">
<value>7</value>
</data>
<data name="labelIssues.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value>
</data>
<data name="labelIssues.Location" type="System.Drawing.Point, System.Drawing">
<value>22, 356</value>
</data>
<data name="labelIssues.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>0, 0, 0, 0</value>
</data>
<data name="labelIssues.Size" type="System.Drawing.Size, System.Drawing">
<value>548, 22</value>
</data>
<data name="labelIssues.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<data name="labelIssues.Text" xml:space="preserve">
<value>You need to resolve the issues found before you can continue.</value>
</data>
<data name="labelIssues.TextAlign" type="System.Drawing.ContentAlignment, System.Drawing">
<value>MiddleLeft</value>
</data>
<data name="&gt;&gt;labelIssues.Name" xml:space="preserve">
<value>labelIssues</value>
</data>
<data name="&gt;&gt;labelIssues.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;labelIssues.Parent" xml:space="preserve">
<value>tableLayoutPanel1</value>
</data>
<data name="&gt;&gt;labelIssues.ZOrder" xml:space="preserve">
<value>8</value>
</data>
<data name="tableLayoutPanel1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value>
</data>
<data name="tableLayoutPanel1.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 0</value>
</data>
<data name="tableLayoutPanel1.RowCount" type="System.Int32, mscorlib">
<value>6</value>
</data>
<data name="tableLayoutPanel1.Size" type="System.Drawing.Size, System.Drawing">
<value>570, 400</value>
</data>
<data name="tableLayoutPanel1.TabIndex" type="System.Int32, mscorlib">
<value>7</value>
</data>
<data name="&gt;&gt;tableLayoutPanel1.Name" xml:space="preserve">
<value>tableLayoutPanel1</value>
</data>
<data name="&gt;&gt;tableLayoutPanel1.Type" xml:space="preserve">
<value>System.Windows.Forms.TableLayoutPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;tableLayoutPanel1.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;tableLayoutPanel1.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="tableLayoutPanel1.LayoutSettings" type="System.Windows.Forms.TableLayoutSettings, System.Windows.Forms">
<value>&lt;?xml version="1.0" encoding="utf-16"?&gt;&lt;TableLayoutSettings&gt;&lt;Controls&gt;&lt;Control Name="labelPrechecksFirstLine" Row="0" RowSpan="1" Column="0" ColumnSpan="4" /&gt;&lt;Control Name="dataGridView1" Row="1" RowSpan="1" Column="0" ColumnSpan="4" /&gt;&lt;Control Name="labelProgress" Row="3" RowSpan="1" Column="0" ColumnSpan="4" /&gt;&lt;Control Name="buttonResolveAll" Row="2" RowSpan="1" Column="3" ColumnSpan="1" /&gt;&lt;Control Name="checkBoxViewPrecheckFailuresOnly" Row="2" RowSpan="1" Column="0" ColumnSpan="2" /&gt;&lt;Control Name="buttonReCheckProblems" Row="2" RowSpan="1" Column="2" ColumnSpan="1" /&gt;&lt;Control Name="pictureBoxIssues" Row="4" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;Control Name="progressBar1" Row="5" RowSpan="1" Column="0" ColumnSpan="4" /&gt;&lt;Control Name="labelIssues" Row="4" RowSpan="1" Column="1" ColumnSpan="3" /&gt;&lt;/Controls&gt;&lt;Columns Styles="AutoSize,0,Percent,100,AutoSize,0,AutoSize,0" /&gt;&lt;Rows Styles="AutoSize,0,Percent,100,AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0,Absolute,20" /&gt;&lt;/TableLayoutSettings&gt;</value>
</data>
<data name="labelPrechecksFirstLine.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 0</value>
</data>
<data name="labelPrechecksFirstLine.Size" type="System.Drawing.Size, System.Drawing">
<value>564, 31</value>
</data>
<data name="labelPrechecksFirstLine.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="labelPrechecksFirstLine.Text" xml:space="preserve">
<value>Update pre-checks are performed to verify that the update "{0}" can be applied to the servers.</value>
</data>
<data name="&gt;&gt;labelPrechecksFirstLine.Name" xml:space="preserve">
<value>labelPrechecksFirstLine</value>
</data>
<data name="&gt;&gt;labelPrechecksFirstLine.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;labelPrechecksFirstLine.Parent" xml:space="preserve">
<value>tableLayoutPanel1</value>
</data>
<data name="&gt;&gt;labelPrechecksFirstLine.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<data name="$this.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>0, 0, 0, 0</value>
</data>
<data name="$this.Size" type="System.Drawing.Size, System.Drawing">
<value>561, 384</value>
<value>570, 400</value>
</data>
<data name="&gt;&gt;ColumnState.Name" xml:space="preserve">
<value>ColumnState</value>
</data>
<data name="&gt;&gt;ColumnState.Type" xml:space="preserve">
<value>System.Windows.Forms.DataGridViewImageColumn, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Windows.Forms.DataGridViewImageColumn, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;ColumnDescription.Name" xml:space="preserve">
<value>ColumnDescription</value>
</data>
<data name="&gt;&gt;ColumnDescription.Type" xml:space="preserve">
<value>System.Windows.Forms.DataGridViewTextBoxColumn, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Windows.Forms.DataGridViewTextBoxColumn, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;ColumnSolution.Name" xml:space="preserve">
<value>ColumnSolution</value>
</data>
<data name="&gt;&gt;ColumnSolution.Type" xml:space="preserve">
<value>System.Windows.Forms.DataGridViewTextBoxColumn, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Windows.Forms.DataGridViewTextBoxColumn, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;$this.Name" xml:space="preserve">
<value>PatchingWizard_PrecheckPage</value>

View File

@ -33,57 +33,99 @@ namespace XenAdmin.Wizards.PatchingWizard
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PatchingWizard_SelectPatchPage));
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle4 = new System.Windows.Forms.DataGridViewCellStyle();
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle5 = new System.Windows.Forms.DataGridViewCellStyle();
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle6 = new System.Windows.Forms.DataGridViewCellStyle();
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle();
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle();
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle3 = new System.Windows.Forms.DataGridViewCellStyle();
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
this.automaticOptionLabel = new System.Windows.Forms.Label();
this.labelWithoutAutomatic = new System.Windows.Forms.Label();
this.labelWithAutomatic = new System.Windows.Forms.Label();
this.AutomaticRadioButton = new System.Windows.Forms.RadioButton();
this.automaticOptionLabel = new System.Windows.Forms.Label();
this.downloadUpdateRadioButton = new System.Windows.Forms.RadioButton();
this.RefreshListButton = new System.Windows.Forms.Button();
this.RestoreDismUpdatesButton = new System.Windows.Forms.Button();
this.selectFromDiskRadioButton = new System.Windows.Forms.RadioButton();
this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel();
this.label2 = new System.Windows.Forms.Label();
this.fileNameTextBox = new System.Windows.Forms.TextBox();
this.BrowseButton = new System.Windows.Forms.Button();
this.selectFromDiskRadioButton = new System.Windows.Forms.RadioButton();
this.downloadUpdateRadioButton = new System.Windows.Forms.RadioButton();
this.label3 = new System.Windows.Forms.Label();
this.panel1 = new System.Windows.Forms.Panel();
this.tableLayoutPanelSpinner = new System.Windows.Forms.TableLayoutPanel();
this.pictureBox1 = new System.Windows.Forms.PictureBox();
this.label1 = new System.Windows.Forms.Label();
this.dataGridViewPatches = new XenAdmin.Controls.DataGridViewEx.DataGridViewEx();
this.ColumnUpdate = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.ColumnDescription = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.ColumnDate = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.webPageColumn = new System.Windows.Forms.DataGridViewLinkColumn();
this.RefreshListButton = new System.Windows.Forms.Button();
this.tableLayoutPanel1.SuspendLayout();
this.tableLayoutPanel2.SuspendLayout();
this.panel1.SuspendLayout();
this.tableLayoutPanelSpinner.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.dataGridViewPatches)).BeginInit();
this.SuspendLayout();
//
// tableLayoutPanel1
//
resources.ApplyResources(this.tableLayoutPanel1, "tableLayoutPanel1");
this.tableLayoutPanel1.Controls.Add(this.automaticOptionLabel, 0, 3);
this.tableLayoutPanel1.Controls.Add(this.labelWithoutAutomatic, 0, 1);
this.tableLayoutPanel1.Controls.Add(this.labelWithAutomatic, 0, 0);
this.tableLayoutPanel1.Controls.Add(this.AutomaticRadioButton, 0, 2);
this.tableLayoutPanel1.Controls.Add(this.RestoreDismUpdatesButton, 1, 5);
this.tableLayoutPanel1.Controls.Add(this.label2, 0, 7);
this.tableLayoutPanel1.Controls.Add(this.fileNameTextBox, 1, 7);
this.tableLayoutPanel1.Controls.Add(this.BrowseButton, 2, 7);
this.tableLayoutPanel1.Controls.Add(this.selectFromDiskRadioButton, 1, 6);
this.tableLayoutPanel1.Controls.Add(this.automaticOptionLabel, 1, 3);
this.tableLayoutPanel1.Controls.Add(this.downloadUpdateRadioButton, 0, 4);
this.tableLayoutPanel1.Controls.Add(this.label3, 0, 0);
this.tableLayoutPanel1.Controls.Add(this.dataGridViewPatches, 0, 4);
this.tableLayoutPanel1.Controls.Add(this.RefreshListButton, 0, 5);
this.tableLayoutPanel1.Controls.Add(this.RefreshListButton, 1, 6);
this.tableLayoutPanel1.Controls.Add(this.RestoreDismUpdatesButton, 2, 6);
this.tableLayoutPanel1.Controls.Add(this.selectFromDiskRadioButton, 0, 7);
this.tableLayoutPanel1.Controls.Add(this.tableLayoutPanel2, 1, 8);
this.tableLayoutPanel1.Controls.Add(this.panel1, 1, 5);
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
//
// automaticOptionLabel
// labelWithoutAutomatic
//
resources.ApplyResources(this.automaticOptionLabel, "automaticOptionLabel");
this.tableLayoutPanel1.SetColumnSpan(this.automaticOptionLabel, 3);
this.automaticOptionLabel.Name = "automaticOptionLabel";
resources.ApplyResources(this.labelWithoutAutomatic, "labelWithoutAutomatic");
this.tableLayoutPanel1.SetColumnSpan(this.labelWithoutAutomatic, 3);
this.labelWithoutAutomatic.Name = "labelWithoutAutomatic";
//
// labelWithAutomatic
//
resources.ApplyResources(this.labelWithAutomatic, "labelWithAutomatic");
this.tableLayoutPanel1.SetColumnSpan(this.labelWithAutomatic, 3);
this.labelWithAutomatic.Name = "labelWithAutomatic";
//
// AutomaticRadioButton
//
resources.ApplyResources(this.AutomaticRadioButton, "AutomaticRadioButton");
this.AutomaticRadioButton.Checked = true;
this.tableLayoutPanel1.SetColumnSpan(this.AutomaticRadioButton, 3);
this.AutomaticRadioButton.Name = "AutomaticRadioButton";
this.AutomaticRadioButton.TabStop = true;
this.AutomaticRadioButton.UseVisualStyleBackColor = true;
this.AutomaticRadioButton.CheckedChanged += new System.EventHandler(this.AutomaticRadioButton_CheckedChanged);
this.AutomaticRadioButton.TabStopChanged += new System.EventHandler(this.AutomaticRadioButton_TabStopChanged);
//
// automaticOptionLabel
//
resources.ApplyResources(this.automaticOptionLabel, "automaticOptionLabel");
this.tableLayoutPanel1.SetColumnSpan(this.automaticOptionLabel, 2);
this.automaticOptionLabel.Name = "automaticOptionLabel";
//
// downloadUpdateRadioButton
//
resources.ApplyResources(this.downloadUpdateRadioButton, "downloadUpdateRadioButton");
this.tableLayoutPanel1.SetColumnSpan(this.downloadUpdateRadioButton, 3);
this.downloadUpdateRadioButton.Name = "downloadUpdateRadioButton";
this.downloadUpdateRadioButton.UseVisualStyleBackColor = true;
this.downloadUpdateRadioButton.CheckedChanged += new System.EventHandler(this.downloadUpdateRadioButton_CheckedChanged);
this.downloadUpdateRadioButton.TabStopChanged += new System.EventHandler(this.downloadUpdateRadioButton_TabStopChanged);
//
// RefreshListButton
//
resources.ApplyResources(this.RefreshListButton, "RefreshListButton");
this.RefreshListButton.Name = "RefreshListButton";
this.RefreshListButton.UseVisualStyleBackColor = true;
this.RefreshListButton.Click += new System.EventHandler(this.RefreshListButton_Click);
//
// RestoreDismUpdatesButton
//
@ -92,6 +134,24 @@ namespace XenAdmin.Wizards.PatchingWizard
this.RestoreDismUpdatesButton.UseVisualStyleBackColor = true;
this.RestoreDismUpdatesButton.Click += new System.EventHandler(this.RestoreDismUpdatesButton_Click);
//
// selectFromDiskRadioButton
//
resources.ApplyResources(this.selectFromDiskRadioButton, "selectFromDiskRadioButton");
this.tableLayoutPanel1.SetColumnSpan(this.selectFromDiskRadioButton, 3);
this.selectFromDiskRadioButton.Name = "selectFromDiskRadioButton";
this.selectFromDiskRadioButton.UseVisualStyleBackColor = true;
this.selectFromDiskRadioButton.CheckedChanged += new System.EventHandler(this.selectFromDiskRadioButton_CheckedChanged);
this.selectFromDiskRadioButton.TabStopChanged += new System.EventHandler(this.selectFromDiskRadioButton_TabStopChanged);
//
// tableLayoutPanel2
//
resources.ApplyResources(this.tableLayoutPanel2, "tableLayoutPanel2");
this.tableLayoutPanel1.SetColumnSpan(this.tableLayoutPanel2, 2);
this.tableLayoutPanel2.Controls.Add(this.label2, 0, 0);
this.tableLayoutPanel2.Controls.Add(this.fileNameTextBox, 1, 0);
this.tableLayoutPanel2.Controls.Add(this.BrowseButton, 2, 0);
this.tableLayoutPanel2.Name = "tableLayoutPanel2";
//
// label2
//
resources.ApplyResources(this.label2, "label2");
@ -111,55 +171,70 @@ namespace XenAdmin.Wizards.PatchingWizard
this.BrowseButton.UseVisualStyleBackColor = true;
this.BrowseButton.Click += new System.EventHandler(this.BrowseButton_Click);
//
// selectFromDiskRadioButton
// panel1
//
resources.ApplyResources(this.selectFromDiskRadioButton, "selectFromDiskRadioButton");
this.tableLayoutPanel1.SetColumnSpan(this.selectFromDiskRadioButton, 4);
this.selectFromDiskRadioButton.Name = "selectFromDiskRadioButton";
this.selectFromDiskRadioButton.UseVisualStyleBackColor = true;
this.selectFromDiskRadioButton.CheckedChanged += new System.EventHandler(this.selectFromDiskRadioButton_CheckedChanged);
this.tableLayoutPanel1.SetColumnSpan(this.panel1, 2);
this.panel1.Controls.Add(this.tableLayoutPanelSpinner);
this.panel1.Controls.Add(this.dataGridViewPatches);
resources.ApplyResources(this.panel1, "panel1");
this.panel1.Name = "panel1";
//
// downloadUpdateRadioButton
// tableLayoutPanelSpinner
//
resources.ApplyResources(this.downloadUpdateRadioButton, "downloadUpdateRadioButton");
this.downloadUpdateRadioButton.Checked = true;
this.tableLayoutPanel1.SetColumnSpan(this.downloadUpdateRadioButton, 3);
this.downloadUpdateRadioButton.Name = "downloadUpdateRadioButton";
this.downloadUpdateRadioButton.TabStop = true;
this.downloadUpdateRadioButton.UseVisualStyleBackColor = true;
resources.ApplyResources(this.tableLayoutPanelSpinner, "tableLayoutPanelSpinner");
this.tableLayoutPanelSpinner.BackColor = System.Drawing.SystemColors.Window;
this.tableLayoutPanelSpinner.Controls.Add(this.pictureBox1, 0, 0);
this.tableLayoutPanelSpinner.Controls.Add(this.label1, 1, 0);
this.tableLayoutPanelSpinner.Name = "tableLayoutPanelSpinner";
//
// label3
// pictureBox1
//
resources.ApplyResources(this.label3, "label3");
this.tableLayoutPanel1.SetColumnSpan(this.label3, 3);
this.label3.Name = "label3";
this.pictureBox1.BackColor = System.Drawing.SystemColors.Window;
this.pictureBox1.Image = global::XenAdmin.Properties.Resources.ajax_loader;
resources.ApplyResources(this.pictureBox1, "pictureBox1");
this.pictureBox1.Name = "pictureBox1";
this.pictureBox1.TabStop = false;
//
// label1
//
resources.ApplyResources(this.label1, "label1");
this.label1.BackColor = System.Drawing.SystemColors.Window;
this.label1.Name = "label1";
//
// dataGridViewPatches
//
this.dataGridViewPatches.AllowUserToResizeColumns = false;
this.dataGridViewPatches.AutoSizeRowsMode = System.Windows.Forms.DataGridViewAutoSizeRowsMode.AllCells;
this.dataGridViewPatches.BackgroundColor = System.Drawing.SystemColors.Window;
this.dataGridViewPatches.CellBorderStyle = System.Windows.Forms.DataGridViewCellBorderStyle.Raised;
this.dataGridViewPatches.CellBorderStyle = System.Windows.Forms.DataGridViewCellBorderStyle.None;
this.dataGridViewPatches.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.dataGridViewPatches.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
this.ColumnUpdate,
this.ColumnDescription,
this.ColumnDate,
this.webPageColumn});
this.tableLayoutPanel1.SetColumnSpan(this.dataGridViewPatches, 3);
dataGridViewCellStyle4.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
dataGridViewCellStyle4.BackColor = System.Drawing.SystemColors.Window;
dataGridViewCellStyle4.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
dataGridViewCellStyle4.ForeColor = System.Drawing.SystemColors.ControlText;
dataGridViewCellStyle4.SelectionBackColor = System.Drawing.SystemColors.Window;
dataGridViewCellStyle4.SelectionForeColor = System.Drawing.SystemColors.ControlText;
dataGridViewCellStyle4.WrapMode = System.Windows.Forms.DataGridViewTriState.False;
this.dataGridViewPatches.DefaultCellStyle = dataGridViewCellStyle4;
resources.ApplyResources(this.dataGridViewPatches, "dataGridViewPatches");
this.dataGridViewPatches.HideSelection = true;
this.dataGridViewPatches.Name = "dataGridViewPatches";
this.dataGridViewPatches.ReadOnly = true;
dataGridViewCellStyle4.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
dataGridViewCellStyle4.BackColor = System.Drawing.SystemColors.Control;
dataGridViewCellStyle4.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
dataGridViewCellStyle4.ForeColor = System.Drawing.SystemColors.WindowText;
dataGridViewCellStyle4.SelectionBackColor = System.Drawing.SystemColors.Highlight;
dataGridViewCellStyle4.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
dataGridViewCellStyle4.WrapMode = System.Windows.Forms.DataGridViewTriState.False;
this.dataGridViewPatches.RowHeadersDefaultCellStyle = dataGridViewCellStyle4;
dataGridViewCellStyle5.WrapMode = System.Windows.Forms.DataGridViewTriState.True;
this.dataGridViewPatches.RowsDefaultCellStyle = dataGridViewCellStyle5;
dataGridViewCellStyle5.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
dataGridViewCellStyle5.BackColor = System.Drawing.SystemColors.Control;
dataGridViewCellStyle5.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
dataGridViewCellStyle5.ForeColor = System.Drawing.SystemColors.WindowText;
dataGridViewCellStyle5.SelectionBackColor = System.Drawing.SystemColors.Highlight;
dataGridViewCellStyle5.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
dataGridViewCellStyle5.WrapMode = System.Windows.Forms.DataGridViewTriState.False;
this.dataGridViewPatches.RowHeadersDefaultCellStyle = dataGridViewCellStyle5;
dataGridViewCellStyle6.WrapMode = System.Windows.Forms.DataGridViewTriState.True;
this.dataGridViewPatches.RowsDefaultCellStyle = dataGridViewCellStyle6;
this.dataGridViewPatches.RowTemplate.Resizable = System.Windows.Forms.DataGridViewTriState.True;
this.dataGridViewPatches.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridViewPatches_CellContentClick);
this.dataGridViewPatches.CellMouseClick += new System.Windows.Forms.DataGridViewCellMouseEventHandler(this.dataGridViewPatches_CellMouseClick);
@ -210,13 +285,6 @@ namespace XenAdmin.Wizards.PatchingWizard
this.webPageColumn.ReadOnly = true;
this.webPageColumn.Resizable = System.Windows.Forms.DataGridViewTriState.True;
//
// RefreshListButton
//
resources.ApplyResources(this.RefreshListButton, "RefreshListButton");
this.RefreshListButton.Name = "RefreshListButton";
this.RefreshListButton.UseVisualStyleBackColor = true;
this.RefreshListButton.Click += new System.EventHandler(this.RefreshListButton_Click);
//
// PatchingWizard_SelectPatchPage
//
resources.ApplyResources(this, "$this");
@ -225,6 +293,13 @@ namespace XenAdmin.Wizards.PatchingWizard
this.Name = "PatchingWizard_SelectPatchPage";
this.tableLayoutPanel1.ResumeLayout(false);
this.tableLayoutPanel1.PerformLayout();
this.tableLayoutPanel2.ResumeLayout(false);
this.tableLayoutPanel2.PerformLayout();
this.panel1.ResumeLayout(false);
this.panel1.PerformLayout();
this.tableLayoutPanelSpinner.ResumeLayout(false);
this.tableLayoutPanelSpinner.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.dataGridViewPatches)).EndInit();
this.ResumeLayout(false);
@ -240,7 +315,7 @@ namespace XenAdmin.Wizards.PatchingWizard
private System.Windows.Forms.RadioButton selectFromDiskRadioButton;
private System.Windows.Forms.Button RefreshListButton;
private System.Windows.Forms.RadioButton downloadUpdateRadioButton;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Label labelWithAutomatic;
private System.Windows.Forms.Button RestoreDismUpdatesButton;
private System.Windows.Forms.DataGridViewTextBoxColumn ColumnUpdate;
private System.Windows.Forms.DataGridViewTextBoxColumn ColumnDescription;
@ -248,5 +323,11 @@ namespace XenAdmin.Wizards.PatchingWizard
private System.Windows.Forms.DataGridViewLinkColumn webPageColumn;
private System.Windows.Forms.Label automaticOptionLabel;
private System.Windows.Forms.RadioButton AutomaticRadioButton;
private System.Windows.Forms.Label labelWithoutAutomatic;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2;
private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanelSpinner;
private System.Windows.Forms.PictureBox pictureBox1;
private System.Windows.Forms.Label label1;
}
}

View File

@ -36,7 +36,6 @@ using System.Windows.Forms;
using XenAdmin.Controls;
using XenAdmin.Controls.DataGridViewEx;
using XenAdmin.Core;
using XenAdmin.Network;
using XenAdmin.Properties;
using XenAPI;
using System.ComponentModel;
@ -44,6 +43,8 @@ using System.IO;
using XenAdmin.Dialogs;
using System.Drawing;
using XenAdmin.Alerts;
using System.Linq;
using XenAdmin.Actions;
namespace XenAdmin.Wizards.PatchingWizard
@ -57,31 +58,51 @@ namespace XenAdmin.Wizards.PatchingWizard
public PatchingWizard_SelectPatchPage()
{
InitializeComponent();
PopulatePatchesBox();
tableLayoutPanelSpinner.Visible = false;
labelWithAutomatic.Visible = automaticOptionLabel.Visible = AutomaticRadioButton.Visible = false;
downloadUpdateRadioButton.Checked = true;
dataGridViewPatches.Sort(ColumnDate, ListSortDirection.Descending);
}
private void CheckForUpdates_CheckForUpdatesStarted()
{
Program.Invoke(Program.MainWindow, () =>
{
dataGridViewPatches.Focus();
RestoreDismUpdatesButton.Enabled = false;
RefreshListButton.Enabled = false;
});
Program.Invoke(Program.MainWindow, StartCheckForUpdates);
}
private void Updates_RestoreDismissedUpdatesStarted()
{
Program.Invoke(Program.MainWindow, StartCheckForUpdates);
}
private void StartCheckForUpdates()
{
if (CheckForUpdatesInProgress)
return;
CheckForUpdatesInProgress = true;
dataGridViewPatches.Rows.Clear();
dataGridViewPatches.Focus();
tableLayoutPanelSpinner.Visible = true;
RestoreDismUpdatesButton.Enabled = false;
RefreshListButton.Enabled = false;
OnPageUpdated();
}
private void CheckForUpdates_CheckForUpdatesCompleted(bool succeeded, string errorMessage)
{
Program.Invoke(Program.MainWindow, delegate
{
PopulatePatchesBox();
tableLayoutPanelSpinner.Visible = false;
if (!IsInAutomaticMode)
{
PopulatePatchesBox();
}
RefreshListButton.Enabled = true;
RestoreDismUpdatesButton.Enabled = true;
CheckForUpdatesInProgress = false;
OnPageUpdated();
RestoreDismUpdatesButton.Enabled = true;
});
}
@ -121,59 +142,94 @@ namespace XenAdmin.Wizards.PatchingWizard
public override void PageLoaded(PageLoadedDirection direction)
{
base.PageLoaded(direction);
RefreshListButton.Enabled = true;
Updates.CheckForUpdatesStarted += CheckForUpdates_CheckForUpdatesStarted;
Updates.CheckForUpdatesCompleted += CheckForUpdates_CheckForUpdatesCompleted;
Updates.RestoreDismissedUpdatesStarted += Updates_RestoreDismissedUpdatesStarted;
if (direction == PageLoadedDirection.Forward)
{
//if any connected host is licensed for automatic updating
bool autoUpdatePossible = ConnectionsManager.XenConnectionsCopy.Any(c => c != null && c.Cache.Hosts.Any(h => !Host.RestrictBatchHotfixApply(h)));
labelWithAutomatic.Visible = automaticOptionLabel.Visible = AutomaticRadioButton.Visible = autoUpdatePossible;
labelWithoutAutomatic.Visible = !autoUpdatePossible;
AutomaticRadioButton.Checked = autoUpdatePossible;
downloadUpdateRadioButton.Checked = !autoUpdatePossible;
PopulatePatchesBox();
UpdateEnablement();
OnPageUpdated();
}
}
public bool IsInAutomaticMode { get { return AutomaticRadioButton.Visible && AutomaticRadioButton.Checked; } }
public List<XenServerVersion> AutoDownloadedXenServerVersions { get; private set; }
public override void PageLeave(PageLoadedDirection direction, ref bool cancel)
{
if (direction == PageLoadedDirection.Forward)
{
var fileName = fileNameTextBox.Text;
if (downloadUpdateRadioButton.Checked)
if (!IsInAutomaticMode)
{
SelectedUpdateType = UpdateType.NewRetail;
}
else
{
if (isValidFile())
var fileName = fileNameTextBox.Text;
if (downloadUpdateRadioButton.Checked)
{
if (fileName.EndsWith(UpdateExtension))
SelectedUpdateType = UpdateType.NewRetail;
else if (fileName.EndsWith(".iso"))
SelectedUpdateType = UpdateType.NewSuppPack;
else
SelectedUpdateType = UpdateType.Existing;
SelectedUpdateType = UpdateType.NewRetail;
}
else
{
if (isValidFile())
{
if (fileName.EndsWith(UpdateExtension))
SelectedUpdateType = UpdateType.NewRetail;
else if (fileName.EndsWith(".iso"))
SelectedUpdateType = UpdateType.NewSuppPack;
else
SelectedUpdateType = UpdateType.Existing;
}
}
SelectedUpdateAlert = downloadUpdateRadioButton.Checked
? (XenServerPatchAlert)((PatchGridViewRow)dataGridViewPatches.SelectedRows[0]).UpdateAlert
: null;
FileFromDiskAlert = selectFromDiskRadioButton.Checked
? GetAlertFromFileName(fileName)
: null;
if (SelectedExistingPatch != null && !SelectedExistingPatch.Connection.IsConnected)
{
cancel = true;
PageLeaveCancelled(string.Format(Messages.UPDATES_WIZARD_CANNOT_DOWNLOAD_PATCH,
SelectedExistingPatch.Connection.Name));
}
else if (!string.IsNullOrEmpty(SelectedNewPatch) && !File.Exists(SelectedNewPatch))
{
cancel = true;
PageLeaveCancelled(string.Format(Messages.UPDATES_WIZARD_FILE_NOT_FOUND, SelectedNewPatch));
}
}
SelectedUpdateAlert = downloadUpdateRadioButton.Checked
? (XenServerPatchAlert)((PatchGridViewRow)dataGridViewPatches.SelectedRows[0]).UpdateAlert
: null;
FileFromDiskAlert = selectFromDiskRadioButton.Checked
? GetAlertFromFileName(fileName)
: null;
if (SelectedExistingPatch != null && !SelectedExistingPatch.Connection.IsConnected)
else //In Automatic Mode
{
cancel = true;
PageLeaveCancelled(string.Format(Messages.UPDATES_WIZARD_CANNOT_DOWNLOAD_PATCH,
SelectedExistingPatch.Connection.Name));
}
else if (!string.IsNullOrEmpty(SelectedNewPatch) && !File.Exists(SelectedNewPatch))
{
cancel = true;
PageLeaveCancelled(string.Format(Messages.UPDATES_WIZARD_FILE_NOT_FOUND, SelectedNewPatch));
var downloadUpdatesAction = new DownloadUpdatesXmlAction(false, true, true, Updates.CheckForUpdatesUrl);
using (var dialog = new ActionProgressDialog(downloadUpdatesAction, ProgressBarStyle.Marquee))
dialog.ShowDialog(this.Parent); //Will block until dialog closes, action completed
if (!downloadUpdatesAction.Succeeded)
{
cancel = true;
}
AutoDownloadedXenServerVersions = downloadUpdatesAction.XenServerVersions;
}
}
Updates.CheckForUpdatesCompleted -= CheckForUpdates_CheckForUpdatesCompleted;
if (!cancel) //unsubscribe only if we are really leaving this page
{
Updates.RestoreDismissedUpdatesStarted -= Updates_RestoreDismissedUpdatesStarted;
Updates.CheckForUpdatesStarted -= CheckForUpdates_CheckForUpdatesStarted;
Updates.CheckForUpdatesCompleted -= CheckForUpdates_CheckForUpdatesCompleted;
}
base.PageLeave(direction, ref cancel);
}
@ -231,6 +287,8 @@ namespace XenAdmin.Wizards.PatchingWizard
public override void PageCancelled()
{
Updates.RestoreDismissedUpdatesStarted -= Updates_RestoreDismissedUpdatesStarted;
Updates.CheckForUpdatesStarted -= CheckForUpdates_CheckForUpdatesStarted;
Updates.CheckForUpdatesCompleted -= CheckForUpdates_CheckForUpdatesCompleted;
}
@ -240,6 +298,12 @@ namespace XenAdmin.Wizards.PatchingWizard
{
return false;
}
if (IsInAutomaticMode)
{
return true;
}
if (downloadUpdateRadioButton.Checked)
{
if (dataGridViewPatches.SelectedRows.Count == 1)
@ -261,6 +325,11 @@ namespace XenAdmin.Wizards.PatchingWizard
return false;
}
public override bool EnablePrevious()
{
return !CheckForUpdatesInProgress;
}
private string UpdateExtension
{
get { return "." + Branding.Update; }
@ -272,13 +341,6 @@ namespace XenAdmin.Wizards.PatchingWizard
return !string.IsNullOrEmpty(fileName) && File.Exists(fileName) && (fileName.EndsWith(UpdateExtension) || fileName.EndsWith(".iso"));
}
private void UpdateEnablement()
{
dataGridViewPatches.HideSelection = !downloadUpdateRadioButton.Checked;
OnPageUpdated();
}
private void BrowseButton_Click(object sender, EventArgs e)
{
// Showing this dialog has the (undocumented) side effect of changing the working directory
@ -290,18 +352,19 @@ namespace XenAdmin.Wizards.PatchingWizard
try
{
oldDir = Directory.GetCurrentDirectory();
OpenFileDialog dlg = new OpenFileDialog();
dlg.Multiselect = false;
dlg.ShowReadOnly = false;
dlg.Filter = string.Format(Messages.PATCHINGWIZARD_SELECTPATCHPAGE_UPDATESEXT, Branding.Update);
dlg.FilterIndex = 0;
dlg.CheckFileExists = true;
dlg.ShowHelp = false;
dlg.Title = Messages.PATCHINGWIZARD_SELECTPATCHPAGE_CHOOSE;
if (dlg.ShowDialog(this) == DialogResult.OK && dlg.CheckFileExists)
using (OpenFileDialog dlg = new OpenFileDialog
{
Multiselect = false,
ShowReadOnly = false,
Filter = string.Format(Messages.PATCHINGWIZARD_SELECTPATCHPAGE_UPDATESEXT, Branding.Update),
FilterIndex = 0,
CheckFileExists = true,
ShowHelp = false,
Title = Messages.PATCHINGWIZARD_SELECTPATCHPAGE_CHOOSE
})
{
AddFile(dlg.FileName);
if (dlg.ShowDialog(this) == DialogResult.OK && dlg.CheckFileExists)
AddFile(dlg.FileName);
}
OnPageUpdated();
}
@ -352,15 +415,11 @@ namespace XenAdmin.Wizards.PatchingWizard
}
}
#region DataGridView
private void dataGridViewPatches_SelectionChanged(object sender, EventArgs e)
{
UpdateEnablement();
}
private void fileNameTextBox_TextChanged(object sender, EventArgs e)
{
selectFromDiskRadioButton.Checked = true;
UpdateEnablement();
OnPageUpdated();
}
private void dataGridViewPatches_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
@ -373,24 +432,11 @@ namespace XenAdmin.Wizards.PatchingWizard
return;
PatchGridViewRow row = (PatchGridViewRow)dataGridViewPatches.Rows[e.RowIndex];
row.toggleExpandedState();
UpdateEnablement();
}
private void RefreshListButton_Click(object sender, EventArgs e)
{
CheckForUpdatesInProgress = true;
Updates.CheckForUpdates(true);
PopulatePatchesBox();
}
private void selectFromDiskRadioButton_CheckedChanged(object sender, EventArgs e)
{
UpdateEnablement();
OnPageUpdated();
}
private void dataGridViewPatches_SortCompare(object sender, DataGridViewSortCompareEventArgs e)
{
Alert alert1 = ((PatchGridViewRow)dataGridViewPatches.Rows[e.RowIndex1]).UpdateAlert;
Alert alert2 = ((PatchGridViewRow)dataGridViewPatches.Rows[e.RowIndex2]).UpdateAlert;
@ -408,14 +454,9 @@ namespace XenAdmin.Wizards.PatchingWizard
PopulatePatchesBox();
}
private void fileNameTextBox_Enter(object sender, EventArgs e)
{
selectFromDiskRadioButton.Checked = true;
UpdateEnablement();
}
private void dataGridViewPatches_CellContentClick(object sender, DataGridViewCellEventArgs e)
{ // The click is on a column header
{
// The click is on a column header
if (e.RowIndex == -1)
{
return;
@ -424,14 +465,13 @@ namespace XenAdmin.Wizards.PatchingWizard
if (row != null && e.ColumnIndex == 3)
{
row.UpdateAlert.FixLinkAction();
return;
}
}
private void dataGridViewPatches_Enter(object sender, EventArgs e)
{
downloadUpdateRadioButton.Checked = true;
UpdateEnablement();
OnPageUpdated();
}
private class PatchGridViewRow : DataGridViewExRow, IEquatable<PatchGridViewRow>
@ -559,11 +599,81 @@ namespace XenAdmin.Wizards.PatchingWizard
}
}
#endregion
#region Buttons
private void RestoreDismUpdatesButton_Click(object sender, EventArgs e)
{
Updates.RestoreDismissedUpdates();
}
}
private void RefreshListButton_Click(object sender, EventArgs e)
{
Updates.CheckForUpdates(true);
}
#endregion
#region TextBox
private void fileNameTextBox_Enter(object sender, EventArgs e)
{
selectFromDiskRadioButton.Checked = true;
OnPageUpdated();
}
private void fileNameTextBox_TextChanged(object sender, EventArgs e)
{
selectFromDiskRadioButton.Checked = true;
OnPageUpdated();
}
#endregion
#region RadioButtons
private void AutomaticRadioButton_CheckedChanged(object sender, EventArgs e)
{
OnPageUpdated();
}
private void downloadUpdateRadioButton_CheckedChanged(object sender, EventArgs e)
{
dataGridViewPatches.HideSelection = !downloadUpdateRadioButton.Checked;
if (downloadUpdateRadioButton.Checked)
dataGridViewPatches.Focus();
OnPageUpdated();
}
private void selectFromDiskRadioButton_CheckedChanged(object sender, EventArgs e)
{
OnPageUpdated();
}
private void AutomaticRadioButton_TabStopChanged(object sender, EventArgs e)
{
if (!AutomaticRadioButton.TabStop)
AutomaticRadioButton.TabStop = true;
}
private void downloadUpdateRadioButton_TabStopChanged(object sender, EventArgs e)
{
if (!downloadUpdateRadioButton.TabStop)
downloadUpdateRadioButton.TabStop = true;
}
private void selectFromDiskRadioButton_TabStopChanged(object sender, EventArgs e)
{
if (!selectFromDiskRadioButton.TabStop)
selectFromDiskRadioButton.TabStop = true;
}
#endregion
}
public enum UpdateType { NewRetail, Existing, NewSuppPack}
}
}

View File

@ -121,82 +121,100 @@
<data name="tableLayoutPanel1.ColumnCount" type="System.Int32, mscorlib">
<value>3</value>
</data>
<data name="automaticOptionLabel.AutoSize" type="System.Boolean, mscorlib">
<data name="labelWithoutAutomatic.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="automaticOptionLabel.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<data name="labelWithoutAutomatic.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value>
</data>
<data name="automaticOptionLabel.Enabled" type="System.Boolean, mscorlib">
<value>False</value>
</data>
<data name="automaticOptionLabel.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<data name="labelWithoutAutomatic.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="automaticOptionLabel.Location" type="System.Drawing.Point, System.Drawing">
<value>36, 65</value>
<data name="labelWithoutAutomatic.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 40</value>
</data>
<data name="automaticOptionLabel.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>36, 3, 3, 3</value>
<data name="labelWithoutAutomatic.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>3, 0, 3, 6</value>
</data>
<data name="automaticOptionLabel.Size" type="System.Drawing.Size, System.Drawing">
<value>562, 26</value>
<data name="labelWithoutAutomatic.Size" type="System.Drawing.Size, System.Drawing">
<value>745, 17</value>
</data>
<data name="automaticOptionLabel.TabIndex" type="System.Int32, mscorlib">
<value>11</value>
<data name="labelWithoutAutomatic.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="automaticOptionLabel.Text" xml:space="preserve">
<value>[XenCenter] will &amp;automatically download and install all current updates from [Citrix], usually with only a single reboot at the end.</value>
<data name="labelWithoutAutomatic.Text" xml:space="preserve">
<value>Select an update to be downloaded from [Citrix], or browse your computer for an update or supplemental pack file.</value>
</data>
<data name="automaticOptionLabel.Visible" type="System.Boolean, mscorlib">
<value>False</value>
<data name="&gt;&gt;labelWithoutAutomatic.Name" xml:space="preserve">
<value>labelWithoutAutomatic</value>
</data>
<data name="&gt;&gt;automaticOptionLabel.Name" xml:space="preserve">
<value>automaticOptionLabel</value>
</data>
<data name="&gt;&gt;automaticOptionLabel.Type" xml:space="preserve">
<data name="&gt;&gt;labelWithoutAutomatic.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;automaticOptionLabel.Parent" xml:space="preserve">
<data name="&gt;&gt;labelWithoutAutomatic.Parent" xml:space="preserve">
<value>tableLayoutPanel1</value>
</data>
<data name="&gt;&gt;automaticOptionLabel.ZOrder" xml:space="preserve">
<data name="&gt;&gt;labelWithoutAutomatic.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="AutomaticRadioButton.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Left</value>
<data name="labelWithAutomatic.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="labelWithAutomatic.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value>
</data>
<data name="labelWithAutomatic.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="labelWithAutomatic.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 0</value>
</data>
<data name="labelWithAutomatic.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>3, 0, 3, 6</value>
</data>
<data name="labelWithAutomatic.Size" type="System.Drawing.Size, System.Drawing">
<value>745, 34</value>
</data>
<data name="labelWithAutomatic.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="labelWithAutomatic.Text" xml:space="preserve">
<value>Select Automatic mode or choose an update to be downloaded from [Citrix], or browse your computer for an update or supplemental pack file.</value>
</data>
<data name="&gt;&gt;labelWithAutomatic.Name" xml:space="preserve">
<value>labelWithAutomatic</value>
</data>
<data name="&gt;&gt;labelWithAutomatic.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;labelWithAutomatic.Parent" xml:space="preserve">
<value>tableLayoutPanel1</value>
</data>
<data name="&gt;&gt;labelWithAutomatic.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="AutomaticRadioButton.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="AutomaticRadioButton.Enabled" type="System.Boolean, mscorlib">
<value>False</value>
</data>
<data name="AutomaticRadioButton.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="AutomaticRadioButton.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 42</value>
<value>3, 75</value>
</data>
<data name="AutomaticRadioButton.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>3, 16, 3, 3</value>
</data>
<data name="AutomaticRadioButton.RightToLeft" type="System.Windows.Forms.RightToLeft, System.Windows.Forms">
<value>No</value>
<value>3, 12, 3, 3</value>
</data>
<data name="AutomaticRadioButton.Size" type="System.Drawing.Size, System.Drawing">
<value>72, 17</value>
<value>91, 21</value>
</data>
<data name="AutomaticRadioButton.TabIndex" type="System.Int32, mscorlib">
<value>10</value>
<value>2</value>
</data>
<data name="AutomaticRadioButton.Text" xml:space="preserve">
<value>Automatic</value>
</data>
<data name="AutomaticRadioButton.Visible" type="System.Boolean, mscorlib">
<value>False</value>
<value>&amp;Automatic</value>
</data>
<data name="&gt;&gt;AutomaticRadioButton.Name" xml:space="preserve">
<value>AutomaticRadioButton</value>
@ -208,25 +226,121 @@
<value>tableLayoutPanel1</value>
</data>
<data name="&gt;&gt;AutomaticRadioButton.ZOrder" xml:space="preserve">
<value>1</value>
<value>2</value>
</data>
<data name="RestoreDismUpdatesButton.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Bottom, Left</value>
<data name="automaticOptionLabel.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="automaticOptionLabel.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value>
</data>
<data name="automaticOptionLabel.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="automaticOptionLabel.Location" type="System.Drawing.Point, System.Drawing">
<value>23, 99</value>
</data>
<data name="automaticOptionLabel.Size" type="System.Drawing.Size, System.Drawing">
<value>725, 34</value>
</data>
<data name="automaticOptionLabel.TabIndex" type="System.Int32, mscorlib">
<value>3</value>
</data>
<data name="automaticOptionLabel.Text" xml:space="preserve">
<value>[XenCenter] will automatically download and install all current updates from [Citrix], usually with only a single reboot at the end.</value>
</data>
<data name="&gt;&gt;automaticOptionLabel.Name" xml:space="preserve">
<value>automaticOptionLabel</value>
</data>
<data name="&gt;&gt;automaticOptionLabel.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;automaticOptionLabel.Parent" xml:space="preserve">
<value>tableLayoutPanel1</value>
</data>
<data name="&gt;&gt;automaticOptionLabel.ZOrder" xml:space="preserve">
<value>3</value>
</data>
<data name="downloadUpdateRadioButton.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="downloadUpdateRadioButton.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="downloadUpdateRadioButton.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 145</value>
</data>
<data name="downloadUpdateRadioButton.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>3, 12, 3, 3</value>
</data>
<data name="downloadUpdateRadioButton.Size" type="System.Drawing.Size, System.Drawing">
<value>213, 21</value>
</data>
<data name="downloadUpdateRadioButton.TabIndex" type="System.Int32, mscorlib">
<value>4</value>
</data>
<data name="downloadUpdateRadioButton.Text" xml:space="preserve">
<value>&amp;Download update from [Citrix]</value>
</data>
<data name="&gt;&gt;downloadUpdateRadioButton.Name" xml:space="preserve">
<value>downloadUpdateRadioButton</value>
</data>
<data name="&gt;&gt;downloadUpdateRadioButton.Type" xml:space="preserve">
<value>System.Windows.Forms.RadioButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;downloadUpdateRadioButton.Parent" xml:space="preserve">
<value>tableLayoutPanel1</value>
</data>
<data name="&gt;&gt;downloadUpdateRadioButton.ZOrder" xml:space="preserve">
<value>4</value>
</data>
<data name="RefreshListButton.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="RefreshListButton.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="RefreshListButton.Location" type="System.Drawing.Point, System.Drawing">
<value>23, 429</value>
</data>
<data name="RefreshListButton.Size" type="System.Drawing.Size, System.Drawing">
<value>94, 27</value>
</data>
<data name="RefreshListButton.TabIndex" type="System.Int32, mscorlib">
<value>6</value>
</data>
<data name="RefreshListButton.Text" xml:space="preserve">
<value>&amp;Refresh List</value>
</data>
<data name="&gt;&gt;RefreshListButton.Name" xml:space="preserve">
<value>RefreshListButton</value>
</data>
<data name="&gt;&gt;RefreshListButton.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;RefreshListButton.Parent" xml:space="preserve">
<value>tableLayoutPanel1</value>
</data>
<data name="&gt;&gt;RefreshListButton.ZOrder" xml:space="preserve">
<value>5</value>
</data>
<data name="RestoreDismUpdatesButton.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="RestoreDismUpdatesButton.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="RestoreDismUpdatesButton.Location" type="System.Drawing.Point, System.Drawing">
<value>118, 337</value>
<value>123, 429</value>
</data>
<data name="RestoreDismUpdatesButton.Size" type="System.Drawing.Size, System.Drawing">
<value>178, 23</value>
<value>193, 27</value>
</data>
<data name="RestoreDismUpdatesButton.TabIndex" type="System.Int32, mscorlib">
<value>4</value>
<value>7</value>
</data>
<data name="RestoreDismUpdatesButton.Text" xml:space="preserve">
<value>Restore &amp;Dismissed Updates</value>
<value>Restore Dismissed &amp;Updates</value>
</data>
<data name="&gt;&gt;RestoreDismUpdatesButton.Name" xml:space="preserve">
<value>RestoreDismUpdatesButton</value>
@ -238,101 +352,8 @@
<value>tableLayoutPanel1</value>
</data>
<data name="&gt;&gt;RestoreDismUpdatesButton.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<data name="label2.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Left, Right</value>
</data>
<data name="label2.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="label2.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="label2.Location" type="System.Drawing.Point, System.Drawing">
<value>36, 404</value>
</data>
<data name="label2.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>36, 5, 3, 0</value>
</data>
<data name="label2.Size" type="System.Drawing.Size, System.Drawing">
<value>76, 13</value>
</data>
<data name="label2.TabIndex" type="System.Int32, mscorlib">
<value>6</value>
</data>
<data name="label2.Text" xml:space="preserve">
<value>&amp;Filename:</value>
</data>
<data name="label2.TextAlign" type="System.Drawing.ContentAlignment, System.Drawing">
<value>MiddleLeft</value>
</data>
<data name="&gt;&gt;label2.Name" xml:space="preserve">
<value>label2</value>
</data>
<data name="&gt;&gt;label2.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label2.Parent" xml:space="preserve">
<value>tableLayoutPanel1</value>
</data>
<data name="&gt;&gt;label2.ZOrder" xml:space="preserve">
<value>3</value>
</data>
<data name="fileNameTextBox.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Left, Right</value>
</data>
<data name="fileNameTextBox.Location" type="System.Drawing.Point, System.Drawing">
<value>118, 402</value>
</data>
<data name="fileNameTextBox.Size" type="System.Drawing.Size, System.Drawing">
<value>388, 20</value>
</data>
<data name="fileNameTextBox.TabIndex" type="System.Int32, mscorlib">
<value>7</value>
</data>
<data name="&gt;&gt;fileNameTextBox.Name" xml:space="preserve">
<value>fileNameTextBox</value>
</data>
<data name="&gt;&gt;fileNameTextBox.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;fileNameTextBox.Parent" xml:space="preserve">
<value>tableLayoutPanel1</value>
</data>
<data name="&gt;&gt;fileNameTextBox.ZOrder" xml:space="preserve">
<value>4</value>
</data>
<data name="BrowseButton.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="BrowseButton.Location" type="System.Drawing.Point, System.Drawing">
<value>512, 402</value>
</data>
<data name="BrowseButton.Size" type="System.Drawing.Size, System.Drawing">
<value>70, 22</value>
</data>
<data name="BrowseButton.TabIndex" type="System.Int32, mscorlib">
<value>8</value>
</data>
<data name="BrowseButton.Text" xml:space="preserve">
<value>&amp;Browse...</value>
</data>
<data name="&gt;&gt;BrowseButton.Name" xml:space="preserve">
<value>BrowseButton</value>
</data>
<data name="&gt;&gt;BrowseButton.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;BrowseButton.Parent" xml:space="preserve">
<value>tableLayoutPanel1</value>
</data>
<data name="&gt;&gt;BrowseButton.ZOrder" xml:space="preserve">
<value>5</value>
</data>
<data name="selectFromDiskRadioButton.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
</data>
<data name="selectFromDiskRadioButton.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
@ -340,16 +361,16 @@
<value>NoControl</value>
</data>
<data name="selectFromDiskRadioButton.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 379</value>
<value>3, 471</value>
</data>
<data name="selectFromDiskRadioButton.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>3, 16, 3, 3</value>
<value>3, 12, 3, 3</value>
</data>
<data name="selectFromDiskRadioButton.Size" type="System.Drawing.Size, System.Drawing">
<value>240, 17</value>
<value>316, 21</value>
</data>
<data name="selectFromDiskRadioButton.TabIndex" type="System.Int32, mscorlib">
<value>5</value>
<value>8</value>
</data>
<data name="selectFromDiskRadioButton.Text" xml:space="preserve">
<value>&amp;Select update or supplemental pack from disk</value>
@ -364,80 +385,230 @@
<value>tableLayoutPanel1</value>
</data>
<data name="&gt;&gt;selectFromDiskRadioButton.ZOrder" xml:space="preserve">
<value>6</value>
</data>
<data name="downloadUpdateRadioButton.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Left</value>
</data>
<data name="downloadUpdateRadioButton.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="downloadUpdateRadioButton.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="downloadUpdateRadioButton.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 110</value>
</data>
<data name="downloadUpdateRadioButton.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>3, 16, 3, 3</value>
</data>
<data name="downloadUpdateRadioButton.RightToLeft" type="System.Windows.Forms.RightToLeft, System.Windows.Forms">
<value>No</value>
</data>
<data name="downloadUpdateRadioButton.Size" type="System.Drawing.Size, System.Drawing">
<value>163, 17</value>
</data>
<data name="downloadUpdateRadioButton.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="downloadUpdateRadioButton.Text" xml:space="preserve">
<value>Download &amp;update from [Citrix]</value>
</data>
<data name="&gt;&gt;downloadUpdateRadioButton.Name" xml:space="preserve">
<value>downloadUpdateRadioButton</value>
</data>
<data name="&gt;&gt;downloadUpdateRadioButton.Type" xml:space="preserve">
<value>System.Windows.Forms.RadioButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;downloadUpdateRadioButton.Parent" xml:space="preserve">
<value>tableLayoutPanel1</value>
</data>
<data name="&gt;&gt;downloadUpdateRadioButton.ZOrder" xml:space="preserve">
<value>7</value>
</data>
<data name="label3.AutoSize" type="System.Boolean, mscorlib">
<data name="tableLayoutPanel2.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="label3.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value>
<data name="tableLayoutPanel2.AutoSizeMode" type="System.Windows.Forms.AutoSizeMode, System.Windows.Forms">
<value>GrowAndShrink</value>
</data>
<data name="label3.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<data name="tableLayoutPanel2.ColumnCount" type="System.Int32, mscorlib">
<value>3</value>
</data>
<data name="label2.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Left</value>
</data>
<data name="label2.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="label2.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="label3.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 0</value>
<data name="label2.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 8</value>
</data>
<data name="label3.Size" type="System.Drawing.Size, System.Drawing">
<value>595, 26</value>
<data name="label2.Size" type="System.Drawing.Size, System.Drawing">
<value>69, 17</value>
</data>
<data name="label3.TabIndex" type="System.Int32, mscorlib">
<value>9</value>
<data name="label2.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="label3.Text" xml:space="preserve">
<value>Select an update that you wish to download from [Citrix], or an update or supplemental pack that you have already downloaded to your local disk.</value>
<data name="label2.Text" xml:space="preserve">
<value>&amp;Filename:</value>
</data>
<data name="&gt;&gt;label3.Name" xml:space="preserve">
<value>label3</value>
<data name="label2.TextAlign" type="System.Drawing.ContentAlignment, System.Drawing">
<value>MiddleLeft</value>
</data>
<data name="&gt;&gt;label3.Type" xml:space="preserve">
<data name="&gt;&gt;label2.Name" xml:space="preserve">
<value>label2</value>
</data>
<data name="&gt;&gt;label2.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label3.Parent" xml:space="preserve">
<data name="&gt;&gt;label2.Parent" xml:space="preserve">
<value>tableLayoutPanel2</value>
</data>
<data name="&gt;&gt;label2.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="fileNameTextBox.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Left, Right</value>
</data>
<data name="fileNameTextBox.Location" type="System.Drawing.Point, System.Drawing">
<value>78, 5</value>
</data>
<data name="fileNameTextBox.Size" type="System.Drawing.Size, System.Drawing">
<value>562, 22</value>
</data>
<data name="fileNameTextBox.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="&gt;&gt;fileNameTextBox.Name" xml:space="preserve">
<value>fileNameTextBox</value>
</data>
<data name="&gt;&gt;fileNameTextBox.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;fileNameTextBox.Parent" xml:space="preserve">
<value>tableLayoutPanel2</value>
</data>
<data name="&gt;&gt;fileNameTextBox.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="BrowseButton.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="BrowseButton.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="BrowseButton.Location" type="System.Drawing.Point, System.Drawing">
<value>646, 3</value>
</data>
<data name="BrowseButton.Size" type="System.Drawing.Size, System.Drawing">
<value>76, 27</value>
</data>
<data name="BrowseButton.TabIndex" type="System.Int32, mscorlib">
<value>2</value>
</data>
<data name="BrowseButton.Text" xml:space="preserve">
<value>&amp;Browse...</value>
</data>
<data name="&gt;&gt;BrowseButton.Name" xml:space="preserve">
<value>BrowseButton</value>
</data>
<data name="&gt;&gt;BrowseButton.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;BrowseButton.Parent" xml:space="preserve">
<value>tableLayoutPanel2</value>
</data>
<data name="&gt;&gt;BrowseButton.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<data name="tableLayoutPanel2.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value>
</data>
<data name="tableLayoutPanel2.Location" type="System.Drawing.Point, System.Drawing">
<value>23, 498</value>
</data>
<data name="tableLayoutPanel2.RowCount" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="tableLayoutPanel2.Size" type="System.Drawing.Size, System.Drawing">
<value>725, 33</value>
</data>
<data name="tableLayoutPanel2.TabIndex" type="System.Int32, mscorlib">
<value>9</value>
</data>
<data name="&gt;&gt;tableLayoutPanel2.Name" xml:space="preserve">
<value>tableLayoutPanel2</value>
</data>
<data name="&gt;&gt;tableLayoutPanel2.Type" xml:space="preserve">
<value>System.Windows.Forms.TableLayoutPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;tableLayoutPanel2.Parent" xml:space="preserve">
<value>tableLayoutPanel1</value>
</data>
<data name="&gt;&gt;label3.ZOrder" xml:space="preserve">
<data name="&gt;&gt;tableLayoutPanel2.ZOrder" xml:space="preserve">
<value>8</value>
</data>
<data name="tableLayoutPanel2.LayoutSettings" type="System.Windows.Forms.TableLayoutSettings, System.Windows.Forms">
<value>&lt;?xml version="1.0" encoding="utf-16"?&gt;&lt;TableLayoutSettings&gt;&lt;Controls&gt;&lt;Control Name="label2" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;Control Name="fileNameTextBox" Row="0" RowSpan="1" Column="1" ColumnSpan="1" /&gt;&lt;Control Name="BrowseButton" Row="0" RowSpan="1" Column="2" ColumnSpan="1" /&gt;&lt;/Controls&gt;&lt;Columns Styles="AutoSize,0,Percent,100,AutoSize,0" /&gt;&lt;Rows Styles="AutoSize,0" /&gt;&lt;/TableLayoutSettings&gt;</value>
</data>
<data name="tableLayoutPanelSpinner.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>None</value>
</data>
<data name="tableLayoutPanelSpinner.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="tableLayoutPanelSpinner.AutoSizeMode" type="System.Windows.Forms.AutoSizeMode, System.Windows.Forms">
<value>GrowAndShrink</value>
</data>
<data name="tableLayoutPanelSpinner.ColumnCount" type="System.Int32, mscorlib">
<value>2</value>
</data>
<data name="pictureBox1.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 3</value>
</data>
<data name="pictureBox1.Size" type="System.Drawing.Size, System.Drawing">
<value>16, 16</value>
</data>
<data name="pictureBox1.SizeMode" type="System.Windows.Forms.PictureBoxSizeMode, System.Windows.Forms">
<value>AutoSize</value>
</data>
<data name="pictureBox1.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="&gt;&gt;pictureBox1.Name" xml:space="preserve">
<value>pictureBox1</value>
</data>
<data name="&gt;&gt;pictureBox1.Type" xml:space="preserve">
<value>System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;pictureBox1.Parent" xml:space="preserve">
<value>tableLayoutPanelSpinner</value>
</data>
<data name="&gt;&gt;pictureBox1.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="label1.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Left, Right</value>
</data>
<data name="label1.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="label1.Location" type="System.Drawing.Point, System.Drawing">
<value>25, 2</value>
</data>
<data name="label1.Size" type="System.Drawing.Size, System.Drawing">
<value>154, 17</value>
</data>
<data name="label1.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="label1.Text" xml:space="preserve">
<value>Checking for updates...</value>
</data>
<data name="&gt;&gt;label1.Name" xml:space="preserve">
<value>label1</value>
</data>
<data name="&gt;&gt;label1.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label1.Parent" xml:space="preserve">
<value>tableLayoutPanelSpinner</value>
</data>
<data name="&gt;&gt;label1.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="tableLayoutPanelSpinner.Location" type="System.Drawing.Point, System.Drawing">
<value>253, 112</value>
</data>
<data name="tableLayoutPanelSpinner.RowCount" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="tableLayoutPanelSpinner.Size" type="System.Drawing.Size, System.Drawing">
<value>182, 22</value>
</data>
<data name="tableLayoutPanelSpinner.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="&gt;&gt;tableLayoutPanelSpinner.Name" xml:space="preserve">
<value>tableLayoutPanelSpinner</value>
</data>
<data name="&gt;&gt;tableLayoutPanelSpinner.Type" xml:space="preserve">
<value>System.Windows.Forms.TableLayoutPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;tableLayoutPanelSpinner.Parent" xml:space="preserve">
<value>panel1</value>
</data>
<data name="&gt;&gt;tableLayoutPanelSpinner.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="tableLayoutPanelSpinner.LayoutSettings" type="System.Windows.Forms.TableLayoutSettings, System.Windows.Forms">
<value>&lt;?xml version="1.0" encoding="utf-16"?&gt;&lt;TableLayoutSettings&gt;&lt;Controls&gt;&lt;Control Name="pictureBox1" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;Control Name="label1" Row="0" RowSpan="1" Column="1" ColumnSpan="1" /&gt;&lt;/Controls&gt;&lt;Columns Styles="AutoSize,0,AutoSize,0" /&gt;&lt;Rows Styles="AutoSize,0" /&gt;&lt;/TableLayoutSettings&gt;</value>
</data>
<metadata name="ColumnUpdate.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
@ -448,7 +619,7 @@
<value>50</value>
</data>
<data name="ColumnUpdate.Width" type="System.Int32, mscorlib">
<value>67</value>
<value>83</value>
</data>
<metadata name="ColumnDescription.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
@ -487,19 +658,16 @@
<value>Fill</value>
</data>
<data name="dataGridViewPatches.Location" type="System.Drawing.Point, System.Drawing">
<value>36, 133</value>
</data>
<data name="dataGridViewPatches.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>36, 3, 3, 3</value>
<value>0, 0</value>
</data>
<data name="dataGridViewPatches.ScrollBars" type="System.Windows.Forms.ScrollBars, System.Windows.Forms">
<value>Vertical</value>
</data>
<data name="dataGridViewPatches.Size" type="System.Drawing.Size, System.Drawing">
<value>562, 198</value>
<value>725, 251</value>
</data>
<data name="dataGridViewPatches.TabIndex" type="System.Int32, mscorlib">
<value>2</value>
<value>0</value>
</data>
<data name="&gt;&gt;dataGridViewPatches.Name" xml:space="preserve">
<value>dataGridViewPatches</value>
@ -508,43 +676,34 @@
<value>XenAdmin.Controls.DataGridViewEx.DataGridViewEx, XenCenterMain, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null</value>
</data>
<data name="&gt;&gt;dataGridViewPatches.Parent" xml:space="preserve">
<value>tableLayoutPanel1</value>
<value>panel1</value>
</data>
<data name="&gt;&gt;dataGridViewPatches.ZOrder" xml:space="preserve">
<value>9</value>
<value>1</value>
</data>
<data name="RefreshListButton.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Bottom, Left</value>
<data name="panel1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value>
</data>
<data name="RefreshListButton.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
<data name="panel1.Location" type="System.Drawing.Point, System.Drawing">
<value>23, 172</value>
</data>
<data name="RefreshListButton.Location" type="System.Drawing.Point, System.Drawing">
<value>36, 337</value>
<data name="panel1.Size" type="System.Drawing.Size, System.Drawing">
<value>725, 251</value>
</data>
<data name="RefreshListButton.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>36, 3, 3, 3</value>
<data name="panel1.TabIndex" type="System.Int32, mscorlib">
<value>5</value>
</data>
<data name="RefreshListButton.Size" type="System.Drawing.Size, System.Drawing">
<value>71, 23</value>
<data name="&gt;&gt;panel1.Name" xml:space="preserve">
<value>panel1</value>
</data>
<data name="RefreshListButton.TabIndex" type="System.Int32, mscorlib">
<value>3</value>
<data name="&gt;&gt;panel1.Type" xml:space="preserve">
<value>System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="RefreshListButton.Text" xml:space="preserve">
<value>&amp;Refresh List</value>
</data>
<data name="&gt;&gt;RefreshListButton.Name" xml:space="preserve">
<value>RefreshListButton</value>
</data>
<data name="&gt;&gt;RefreshListButton.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;RefreshListButton.Parent" xml:space="preserve">
<data name="&gt;&gt;panel1.Parent" xml:space="preserve">
<value>tableLayoutPanel1</value>
</data>
<data name="&gt;&gt;RefreshListButton.ZOrder" xml:space="preserve">
<value>10</value>
<data name="&gt;&gt;panel1.ZOrder" xml:space="preserve">
<value>9</value>
</data>
<data name="tableLayoutPanel1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value>
@ -556,10 +715,10 @@
<value>9</value>
</data>
<data name="tableLayoutPanel1.Size" type="System.Drawing.Size, System.Drawing">
<value>601, 427</value>
<value>751, 534</value>
</data>
<data name="tableLayoutPanel1.TabIndex" type="System.Int32, mscorlib">
<value>6</value>
<value>0</value>
</data>
<data name="&gt;&gt;tableLayoutPanel1.Name" xml:space="preserve">
<value>tableLayoutPanel1</value>
@ -574,16 +733,19 @@
<value>0</value>
</data>
<data name="tableLayoutPanel1.LayoutSettings" type="System.Windows.Forms.TableLayoutSettings, System.Windows.Forms">
<value>&lt;?xml version="1.0" encoding="utf-16"?&gt;&lt;TableLayoutSettings&gt;&lt;Controls&gt;&lt;Control Name="automaticOptionLabel" Row="3" RowSpan="1" Column="0" ColumnSpan="3" /&gt;&lt;Control Name="AutomaticRadioButton" Row="2" RowSpan="1" Column="0" ColumnSpan="3" /&gt;&lt;Control Name="RestoreDismUpdatesButton" Row="5" RowSpan="1" Column="1" ColumnSpan="1" /&gt;&lt;Control Name="label2" Row="7" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;Control Name="fileNameTextBox" Row="7" RowSpan="1" Column="1" ColumnSpan="1" /&gt;&lt;Control Name="BrowseButton" Row="7" RowSpan="1" Column="2" ColumnSpan="1" /&gt;&lt;Control Name="selectFromDiskRadioButton" Row="6" RowSpan="1" Column="1" ColumnSpan="4" /&gt;&lt;Control Name="downloadUpdateRadioButton" Row="4" RowSpan="1" Column="0" ColumnSpan="3" /&gt;&lt;Control Name="label3" Row="0" RowSpan="1" Column="0" ColumnSpan="3" /&gt;&lt;Control Name="dataGridViewPatches" Row="4" RowSpan="1" Column="0" ColumnSpan="3" /&gt;&lt;Control Name="RefreshListButton" Row="5" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;/Controls&gt;&lt;Columns Styles="Absolute,115,Percent,100,Absolute,92" /&gt;&lt;Rows Styles="AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0,Percent,100,AutoSize,0,AutoSize,0,AutoSize,0,Absolute,20" /&gt;&lt;/TableLayoutSettings&gt;</value>
<value>&lt;?xml version="1.0" encoding="utf-16"?&gt;&lt;TableLayoutSettings&gt;&lt;Controls&gt;&lt;Control Name="labelWithoutAutomatic" Row="1" RowSpan="1" Column="0" ColumnSpan="3" /&gt;&lt;Control Name="labelWithAutomatic" Row="0" RowSpan="1" Column="0" ColumnSpan="3" /&gt;&lt;Control Name="AutomaticRadioButton" Row="2" RowSpan="1" Column="0" ColumnSpan="3" /&gt;&lt;Control Name="automaticOptionLabel" Row="3" RowSpan="1" Column="1" ColumnSpan="2" /&gt;&lt;Control Name="downloadUpdateRadioButton" Row="4" RowSpan="1" Column="0" ColumnSpan="3" /&gt;&lt;Control Name="RefreshListButton" Row="6" RowSpan="1" Column="1" ColumnSpan="1" /&gt;&lt;Control Name="RestoreDismUpdatesButton" Row="6" RowSpan="1" Column="2" ColumnSpan="1" /&gt;&lt;Control Name="selectFromDiskRadioButton" Row="7" RowSpan="1" Column="0" ColumnSpan="3" /&gt;&lt;Control Name="tableLayoutPanel2" Row="8" RowSpan="1" Column="1" ColumnSpan="2" /&gt;&lt;Control Name="panel1" Row="5" RowSpan="1" Column="1" ColumnSpan="2" /&gt;&lt;/Controls&gt;&lt;Columns Styles="Absolute,20,AutoSize,0,Percent,100,Absolute,20" /&gt;&lt;Rows Styles="AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0,Percent,100,AutoSize,0,AutoSize,0,AutoSize,0" /&gt;&lt;/TableLayoutSettings&gt;</value>
</data>
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
<value>96, 96</value>
<value>120, 120</value>
</data>
<data name="$this.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 4, 4, 4</value>
</data>
<data name="$this.Size" type="System.Drawing.Size, System.Drawing">
<value>601, 427</value>
<value>751, 534</value>
</data>
<data name="&gt;&gt;ColumnUpdate.Name" xml:space="preserve">
<value>ColumnUpdate</value>

View File

@ -41,6 +41,7 @@ using XenAdmin.Network;
using XenAdmin.Properties;
using XenAPI;
using XenAdmin.Alerts;
using System.Linq;
namespace XenAdmin.Wizards.PatchingWizard
{
@ -92,33 +93,66 @@ namespace XenAdmin.Wizards.PatchingWizard
base.PageLoaded(direction);
try
{
label1.Text = IsInAutomaticMode ? Messages.PATCHINGWIZARD_SELECTSERVERPAGGE_RUBRIC_AUTOMATIC_MODE : Messages.PATCHINGWIZARD_SELECTSERVERPAGGE_RUBRIC_DEFAULT;
// catch selected servers, in order to restore selection after the dataGrid is reloaded
List<Host> selectedServers = SelectedServers;
dataGridViewHosts.Rows.Clear();
if (IsInAutomaticMode)
{
//hides expand column
dataGridViewHosts.Columns[0].Visible = false;
}
else
{
dataGridViewHosts.Columns[0].Visible = true;
}
List<IXenConnection> xenConnections = ConnectionsManager.XenConnectionsCopy;
xenConnections.Sort();
foreach (IXenConnection xenConnection in xenConnections)
{
Pool pool = Helpers.GetPool(xenConnection);
bool hasPool = true;
if (pool != null)
if (IsInAutomaticMode)
{
int index = dataGridViewHosts.Rows.Add(new PatchingHostsDataGridViewRow(pool));
if (!xenConnection.IsConnected)
continue;
var pool = Helpers.GetPoolOfOne(xenConnection);
Host master = pool.Connection.Resolve(pool.master);
int index = -1;
if (Helpers.GetPool(xenConnection) != null) //pools
{
index = dataGridViewHosts.Rows.Add(new PatchingHostsDataGridViewRow(pool));
}
else //standalone hosts
{
index = dataGridViewHosts.Rows.Add(new PatchingHostsDataGridViewRow(master, false));
}
EnabledRow(master, SelectedUpdateType, index);
}
else
{
hasPool = false;
Pool pool = Helpers.GetPool(xenConnection);
bool hasPool = pool != null;
if (hasPool)
{
int index = dataGridViewHosts.Rows.Add(new PatchingHostsDataGridViewRow(pool));
Host master = pool.Connection.Resolve(pool.master);
EnabledRow(master, SelectedUpdateType, index);
}
Host[] hosts = xenConnection.Cache.Hosts;
Array.Sort(hosts);
foreach (Host host in hosts)
{
int index = dataGridViewHosts.Rows.Add(new PatchingHostsDataGridViewRow(host, hasPool));
EnabledRow(host, SelectedUpdateType, index);
}
}
Host[] hosts = xenConnection.Cache.Hosts;
Array.Sort(hosts);
foreach (Host host in hosts)
{
int index = dataGridViewHosts.Rows.Add(new PatchingHostsDataGridViewRow(host, hasPool));
EnabledRow(host, SelectedUpdateType, index);
}
}
// restore server selection
@ -131,9 +165,66 @@ namespace XenAdmin.Wizards.PatchingWizard
}
}
public bool IsInAutomaticMode { set; get; }
public List<XenServerVersion> AutoDownloadedXenServerVersions { private get; set; }
private void EnabledRow(Host host, UpdateType type, int index)
{
var row = (PatchingHostsDataGridViewRow)dataGridViewHosts.Rows[index];
if (IsInAutomaticMode)
{
var pool = Helpers.GetPool(host.Connection);
if (pool != null && !pool.IsPoolFullyUpgraded) //partially upgraded pool is not supported
{
row.Enabled = false;
row.Cells[3].ToolTipText = Messages.PATCHINGWIZARD_SELECTSERVERPAGE_AUTO_UPDATE_NOT_SUPPORTED_PARTIALLY_UPGRADED;
return;
}
//check updgrade sequences
Updates.UpgradeSequence us = Updates.GetUpgradeSequence(host.Connection, AutoDownloadedXenServerVersions);
if (us == null) //version not supported
{
row.Enabled = false;
row.Cells[3].ToolTipText = Messages.PATCHINGWIZARD_SELECTSERVERPAGE_AUTO_UPDATE_NOT_SUPPORTED_HOST_VERSION;
return;
}
//unlicensed servers are not enabled
if (Host.RestrictBatchHotfixApply(host))
{
row.Enabled = false;
row.Cells[3].ToolTipText = Messages.PATCHINGWIZARD_SELECTSERVERPAGE_HOST_UNLICENSED_FOR_BATCH_UPDATING;
return;
}
//if there is a host missing from the upgrade sequence
if (host.Connection.Cache.Hosts.Any(h => !us.Keys.Contains(h)))
{
row.Enabled = false;
row.Cells[3].ToolTipText = Messages.PATCHINGWIZARD_SELECTSERVERPAGE_SERVER_NOT_AUTO_UPGRADABLE;
return;
}
//if all hosts are up-to-date
if (us.AllHostsUpToDate)
{
row.Enabled = false;
row.Cells[3].ToolTipText = Messages.PATCHINGWIZARD_SELECTSERVERPAGE_SERVER_UP_TO_DATE;
return;
}
return;
}
List<Host> selectedHosts = null;
if (SelectedUpdateAlert != null)
{
@ -144,8 +235,8 @@ namespace XenAdmin.Wizards.PatchingWizard
selectedHosts = FileFromDiskAlert.DistinctHosts;
}
Pool pool = Helpers.GetPoolOfOne(host.Connection);
if (pool != null && pool.IsPatchingForbidden)
Pool poolOfOne = Helpers.GetPoolOfOne(host.Connection);
if (poolOfOne != null && poolOfOne.IsPatchingForbidden)
{
row.Enabled = false;
row.Cells[3].ToolTipText = Messages.PATCHINGWIZARD_SELECTSERVERPAGE_PATCHING_FORBIDDEN;
@ -342,16 +433,23 @@ namespace XenAdmin.Wizards.PatchingWizard
{
get
{
List<Host> hosts = new List<Host>();
foreach (PatchingHostsDataGridViewRow row in dataGridViewHosts.Rows)
if (IsInAutomaticMode)
{
if (row.Tag is Host)
{
if ((row.HasPool && ((int)row.Cells[POOL_ICON_HOST_CHECKBOX_COL].Value) == CHECKED) || (!row.HasPool && ((int)row.Cells[POOL_CHECKBOX_COL].Value) == CHECKED))
hosts.Add((Host)row.Tag);
}
return SelectedPools.SelectMany(p => p.Connection.Cache.Hosts).ToList();
}
else
{
List<Host> hosts = new List<Host>();
foreach (PatchingHostsDataGridViewRow row in dataGridViewHosts.Rows)
{
if (row.Tag is Host)
{
if ((row.HasPool && ((int)row.Cells[POOL_ICON_HOST_CHECKBOX_COL].Value) == CHECKED) || (!row.HasPool && ((int)row.Cells[POOL_CHECKBOX_COL].Value) == CHECKED))
hosts.Add((Host)row.Tag);
}
}
return hosts;
}
return hosts;
}
}
@ -432,6 +530,10 @@ namespace XenAdmin.Wizards.PatchingWizard
else if ((int)row.Cells[POOL_CHECKBOX_COL].Value != value)
dataGridViewHosts.CheckBoxChange(row.Index, POOL_CHECKBOX_COL);
}
if (IsInAutomaticMode && row.Tag is Pool)
{
dataGridViewHosts.CheckBoxChange(row.Index, POOL_CHECKBOX_COL);
}
}
}

View File

@ -133,8 +133,7 @@
<value>1</value>
</data>
<data name="label1.Text" xml:space="preserve">
<value>Select one or more servers from the list of available servers.
Servers where the selected update cannot be applied appear disabled in this list.</value>
<value>rubric</value>
</data>
<data name="&gt;&gt;label1.Name" xml:space="preserve">
<value>label1</value>

View File

@ -0,0 +1,78 @@
/* Copyright (c) Citrix Systems Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms,
* with or without modification, are permitted provided
* that the following conditions are met:
*
* * Redistributions of source code must retain the above
* copyright notice, this list of conditions and the
* following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other
* materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
using System;
using System.Collections.Generic;
using XenAdmin.Core;
using XenAPI;
namespace XenAdmin.Wizards.PatchingWizard.PlanActions
{
public class ApplyXenServerPatchPlanAction : PlanActionWithSession
{
private readonly Host host;
private readonly XenServerPatch xenServerPatch;
private readonly List<PoolPatchMapping> mappings;
public ApplyXenServerPatchPlanAction(Host host, XenServerPatch xenServerPatch, List<PoolPatchMapping> mappings)
: base(host.Connection, string.Format(Messages.UPDATES_WIZARD_APPLYING_UPDATE, xenServerPatch.Name, host.Name))
{
this.host = host;
this.xenServerPatch = xenServerPatch;
this.mappings = mappings;
}
protected override void RunWithSession(ref Session session)
{
var master = Helpers.GetMaster(host.Connection);
var mapping = mappings.Find(m => m.XenServerPatch.Equals(xenServerPatch)
&& m.MasterHost != null && master != null && m.MasterHost.uuid == master.uuid);
if (mapping != null && mapping.Pool_patch != null)
{
var patchRef = mapping.Pool_patch;
XenRef<Task> task = Pool_patch.async_apply(session, patchRef.opaque_ref, host.opaque_ref);
PollTaskForResultAndDestroy(Connection, ref session, task);
}
else
{
if (xenServerPatch != null && master != null)
log.ErrorFormat("Mapping not found for patch {0} on master {1}", xenServerPatch.Uuid, master.uuid);
throw new Exception("Pool_patch not found.");
}
}
}
}

View File

@ -38,13 +38,14 @@ using XenAPI;
namespace XenAdmin.Wizards.PatchingWizard.PlanActions
{
public class BringBabiesBackAction : PlanActionWithSession
public class BringBabiesBackAction : PlanActionWithSession, IAvoidRestartHostsAware
{
private readonly XenRef<Host> _host;
private readonly Host currentHost;
private readonly List<XenRef<VM>> _vms;
private readonly bool _enableOnly = false;
public List<string> AvoidRestartHosts { private get; set; }
public BringBabiesBackAction(List<XenRef<VM>> vms, Host host,bool enableOnly)
: base(host.Connection, string.Format(Messages.UPDATES_WIZARD_EXITING_MAINTENANCE_MODE,host.Name))
{
@ -53,6 +54,7 @@ namespace XenAdmin.Wizards.PatchingWizard.PlanActions
this._vms = vms;
this._enableOnly = enableOnly;
currentHost = host;
visible = false;
}
protected override Host CurrentHost
@ -62,6 +64,15 @@ namespace XenAdmin.Wizards.PatchingWizard.PlanActions
protected override void RunWithSession(ref Session session)
{
if (Helpers.ElyOrGreater(currentHost) && AvoidRestartHosts != null && AvoidRestartHosts.Contains(currentHost.uuid))
{
log.Debug("Skipped scheduled restart (livepatching succeeded), BringBabiesBackAction is skipped.");
return;
}
visible = true;
Status = Messages.PLAN_ACTION_STATUS_RECONNECTING_STORAGE;
PBD.CheckAndBestEffortPlugPBDsFor(Connection, _vms);

View File

@ -0,0 +1,141 @@
/* Copyright (c) Citrix Systems Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms,
* with or without modification, are permitted provided
* that the following conditions are met:
*
* * Redistributions of source code must retain the above
* copyright notice, this list of conditions and the
* following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other
* materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
using System;
using System.Collections.Generic;
using XenAdmin.Actions;
using XenAdmin.Core;
using XenAPI;
using System.Linq;
using System.IO;
using XenAdmin.Network;
namespace XenAdmin.Wizards.PatchingWizard.PlanActions
{
class DownloadPatchPlanAction : PlanActionWithSession
{
private readonly XenServerPatch patch;
private Dictionary<XenServerPatch, string> AllDownloadedPatches = new Dictionary<XenServerPatch, string>();
private string tempFileName = null;
public DownloadPatchPlanAction(IXenConnection connection, XenServerPatch patch, Dictionary<XenServerPatch, string> allDownloadedPatches)
: base(connection, string.Format(Messages.PATCHINGWIZARD_DOWNLOADUPDATE_ACTION_TITLE_WAITING, patch.Name))
{
this.patch = patch;
this.AllDownloadedPatches = allDownloadedPatches;
}
protected override void RunWithSession(ref Session session)
{
this.visible = false;
lock (patch)
{
this.visible = true;
this._title = string.Format(Messages.PATCHINGWIZARD_DOWNLOADUPDATE_ACTION_TITLE_DOWNLOADING, patch.Name);
if (Cancelling)
return;
//if it has not been already downloaded
if (!AllDownloadedPatches.Any(dp => dp.Key == patch && !string.IsNullOrEmpty(dp.Value))
|| !File.Exists(AllDownloadedPatches[patch]))
{
DownloadFile(ref session);
}
else
{
this.visible = false;
this._title = string.Format(Messages.PATCHINGWIZARD_DOWNLOADUPDATE_ACTION_TITLE_SKIPPING, patch.Name);
}
}
}
private void DownloadFile(ref Session session)
{
string patchUri = patch.PatchUrl;
if (string.IsNullOrEmpty(patchUri))
return;
Uri address = new Uri(patchUri);
tempFileName = Path.GetTempFileName();
var downloadAction = new DownloadAndUnzipXenServerPatchAction(patch.Name, address, tempFileName, Branding.Update);
if (downloadAction != null)
{
downloadAction.Changed += downloadAndUnzipXenServerPatchAction_Changed;
downloadAction.Completed += downloadAndUnzipXenServerPatchAction_Completed;
}
downloadAction.RunExternal(session);
}
private void downloadAndUnzipXenServerPatchAction_Changed(object sender)
{
var action = sender as AsyncAction;
if (action == null)
return;
if (Cancelling)
action.Cancel();
Program.Invoke(Program.MainWindow, () =>
{
//UpdateActionProgress(action);
//flickerFreeListBox1.Refresh();
//OnPageUpdated();
});
}
private void downloadAndUnzipXenServerPatchAction_Completed(ActionBase sender)
{
var action = sender as AsyncAction;
if (action == null)
return;
action.Changed -= downloadAndUnzipXenServerPatchAction_Changed;
action.Completed -= downloadAndUnzipXenServerPatchAction_Completed;
if (action.Succeeded)
{
if (action is DownloadAndUnzipXenServerPatchAction)
{
Host master = Helpers.GetMaster(action.Connection);
AllDownloadedPatches[patch] = (action as DownloadAndUnzipXenServerPatchAction).PatchPath;
}
}
}
}
}

View File

@ -29,22 +29,26 @@
* SUCH DAMAGE.
*/
using System.Collections.Generic;
using XenAdmin.Core;
using XenAPI;
namespace XenAdmin.Wizards.PatchingWizard.PlanActions
{
public class EvacuateHostPlanAction : PlanActionWithSession
public class EvacuateHostPlanAction : PlanActionWithSession, IAvoidRestartHostsAware
{
private readonly XenRef<Host> _host;
private readonly Host currentHost;
public List<string> AvoidRestartHosts { private get; set; }
public EvacuateHostPlanAction(Host host)
: base(host.Connection, string.Format(Messages.PLANACTION_VMS_MIGRATING, host.Name))
{
base.TitlePlan = string.Format(Messages.MIGRATE_VMS_OFF_SERVER, host.Name);
this._host = new XenRef<Host>(host);
currentHost = host;
visible = false;
}
protected override Host CurrentHost
@ -56,6 +60,31 @@ namespace XenAdmin.Wizards.PatchingWizard.PlanActions
{
Host hostObject = TryResolveWithTimeout(_host);
if (Helpers.ElyOrGreater(hostObject))
{
log.DebugFormat("Checking host.patches_requiring_reboot now on '{0}'...", hostObject);
if (hostObject.patches_requiring_reboot.Count > 0)
{
AvoidRestartHosts.Remove(hostObject.uuid);
log.DebugFormat("Restart is needed now (hostObject.patches_requiring_reboot has {0} items in it). Evacuating now. Will restart after.", hostObject.patches_requiring_reboot.Count);
}
else
{
if (!AvoidRestartHosts.Contains(hostObject.uuid))
{
AvoidRestartHosts.Add(hostObject.uuid);
}
log.Debug("Will skip scheduled restart (livepatching succeeded), because hostObject.patches_requiring_reboot is empty.");
return;
}
}
visible = true;
PBD.CheckAndPlugPBDsFor(Connection.ResolveAll(hostObject.resident_VMs));
log.DebugFormat("Disabling host {0}", hostObject.Name);

View File

@ -0,0 +1,12 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace XenAdmin.Wizards.PatchingWizard.PlanActions
{
interface IAvoidRestartHostsAware
{
List<string> AvoidRestartHosts { set; }
}
}

View File

@ -0,0 +1,98 @@
/* Copyright (c) Citrix Systems Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms,
* with or without modification, are permitted provided
* that the following conditions are met:
*
* * Redistributions of source code must retain the above
* copyright notice, this list of conditions and the
* following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other
* materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
using System;
using System.Collections.Generic;
using XenAdmin.Actions;
using XenAdmin.Core;
using XenAPI;
using System.Linq;
using System.IO;
using XenAdmin.Network;
using XenAdmin.Diagnostics.Checks;
using System.Diagnostics;
namespace XenAdmin.Wizards.PatchingWizard.PlanActions
{
class PatchPrechecksOnMultipleHostsInAPoolPlanAction : PlanActionWithSession
{
private readonly XenServerPatch patch;
private readonly List<PoolPatchMapping> mappings;
private List<Host> hosts = null;
public PatchPrechecksOnMultipleHostsInAPoolPlanAction(IXenConnection connection, XenServerPatch patch, List<Host> hosts, List<PoolPatchMapping> mappings)
: base(connection, string.Format("Precheck for {0} in {1}...", patch.Name, connection.Name))
{
this.patch = patch;
this.hosts = hosts;
this.mappings = mappings;
}
protected override void RunWithSession(ref Session session)
{
var master = Helpers.GetMaster(Connection);
var mapping = mappings.Find(m => m.XenServerPatch.Equals(patch) && m.MasterHost != null && master != null && m.MasterHost.uuid == master.uuid);
if (mapping != null && mapping.Pool_patch != null)
{
foreach (var host in hosts)
{
if (Cancelling)
{
throw new CancelledException();
}
try
{
var check = new PatchPrecheckCheck(host, mapping.Pool_patch);
var problems = check.RunAllChecks();
Diagnostics.Problems.Problem problem = null;
if (problems != null && problems.Count > 0)
problem = problems[0];
if (problem != null)
{
throw new Exception(string.Format("{0}: {1}. {2}", host, problem.Title, problem.Description));
}
}
catch (Exception ex)
{
log.Error(string.Format("Precheck failed on host {0}", host.Name), ex);
throw ex;
}
}
}
}
}
}

View File

@ -35,6 +35,7 @@ using System.Threading;
using log4net;
using XenAdmin.Network;
using XenAPI;
using System.Diagnostics;
namespace XenAdmin.Wizards.PatchingWizard.PlanActions
@ -48,7 +49,17 @@ namespace XenAdmin.Wizards.PatchingWizard.PlanActions
public event EventHandler OnActionError;
public event Action<PlanAction, Host> StatusChanged;
public Exception Error;
protected bool Cancelling = false;
protected bool visible = true;
public bool Visible
{
get
{
return visible;
}
}
private string status;
public string Status
{
@ -81,7 +92,7 @@ namespace XenAdmin.Wizards.PatchingWizard.PlanActions
}
}
private string _title;
protected string _title;
public string Title
{
@ -230,6 +241,11 @@ namespace XenAdmin.Wizards.PatchingWizard.PlanActions
{
return this.Title;
}
public virtual void Cancel()
{
Cancelling = true;
}
}
}

View File

@ -0,0 +1,51 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using XenAdmin.Core;
using XenAPI;
namespace XenAdmin.Wizards.PatchingWizard.PlanActions
{
public class PoolPatchMapping
{
public XenServerPatch XenServerPatch { get; private set; }
public Pool_patch Pool_patch { get; private set; }
public Host MasterHost { get; private set; }
public PoolPatchMapping(XenServerPatch xenServerPatch, Pool_patch pool_patch, Host masterHost)
{
if (xenServerPatch == null)
throw new ArgumentNullException("xenServerPatch");
if (pool_patch == null)
throw new ArgumentNullException("pool_patch");
if (masterHost == null)
throw new ArgumentNullException("masterHost");
this.XenServerPatch = xenServerPatch;
this.Pool_patch = pool_patch;
this.MasterHost = masterHost;
}
public override bool Equals(object obj)
{
var that = obj as PoolPatchMapping;
if (that == null)
return false;
return
this.XenServerPatch != null && this.XenServerPatch.Equals(that.XenServerPatch)
&& this.Pool_patch != null && this.Pool_patch.Equals(that.Pool_patch)
&& this.MasterHost != null && that.MasterHost != null & this.MasterHost.uuid == that.MasterHost.uuid;
}
public override int GetHashCode()
{
return XenServerPatch.GetHashCode() ^ Pool_patch.GetHashCode() ^ MasterHost.GetHashCode();
}
}
}

View File

@ -29,25 +29,41 @@
* SUCH DAMAGE.
*/
using System.Collections.Generic;
using XenAdmin.Core;
using XenAdmin.Network;
using XenAPI;
namespace XenAdmin.Wizards.PatchingWizard.PlanActions
{
public class RebootHostPlanAction : RebootPlanAction
public class RebootHostPlanAction : RebootPlanAction, IAvoidRestartHostsAware
{
private readonly Host _host;
public List<string> AvoidRestartHosts { private get; set; }
public RebootHostPlanAction(Host host)
: base(host.Connection, new XenRef<Host>(host.opaque_ref), string.Format(Messages.UPDATES_WIZARD_REBOOTING, host))
{
_host = host;
visible = false;
}
protected override void RunWithSession(ref Session session)
{
if (Helpers.ElyOrGreater(_host))
{
if (AvoidRestartHosts != null && AvoidRestartHosts.Contains(_host.uuid))
{
log.Debug("Skipping scheduled restart (livepatching succeeded). RebootHostPlanAction is skipped.");
return;
}
}
visible = true;
_host.Connection.ExpectDisruption = true;
try
{

View File

@ -106,7 +106,7 @@ namespace XenAdmin.Wizards.PatchingWizard.PlanActions
return agentStartTime;
}
public void Cancel()
public override void Cancel()
{
_cancelled = true;

View File

@ -0,0 +1,87 @@
/* Copyright (c) Citrix Systems Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms,
* with or without modification, are permitted provided
* that the following conditions are met:
*
* * Redistributions of source code must retain the above
* copyright notice, this list of conditions and the
* following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other
* materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
using System.Collections.Generic;
using XenAdmin.Core;
using XenAPI;
using System.Linq;
using System;
namespace XenAdmin.Wizards.PatchingWizard.PlanActions
{
class RemoveUpdateFileFromMasterPlanAction : PlanActionWithSession
{
private readonly List<PoolPatchMapping> patchMappings = new List<PoolPatchMapping>();
private readonly XenServerPatch patch = null;
private readonly Host master = null;
public RemoveUpdateFileFromMasterPlanAction(Host master, List<PoolPatchMapping> patchMappings, XenServerPatch patch)
: base(master.Connection, string.Format(Messages.UPDATES_WIZARD_REMOVING_UPDATES_FROM_POOL, master.Name))
{
this.patchMappings = patchMappings;
this.patch = patch;
this.master = master;
}
protected override void RunWithSession(ref Session session)
{
try
{
Pool_patch poolPatch = null;
var mapping = patchMappings.FirstOrDefault(pm => pm.MasterHost != null && master != null &&
pm.MasterHost.uuid == master.uuid && pm.XenServerPatch.Equals(patch));
if (mapping != null || mapping.Pool_patch != null && mapping.Pool_patch.opaque_ref != null)
{
poolPatch = mapping.Pool_patch;
}
else
{
poolPatch = session.Connection.Cache.Pool_patches.FirstOrDefault(pp => string.Equals(pp.uuid, patch.Uuid, System.StringComparison.InvariantCultureIgnoreCase));
}
if (poolPatch != null && poolPatch.opaque_ref != null )
{
var task = Pool_patch.async_pool_clean(session, mapping.Pool_patch.opaque_ref);
PollTaskForResultAndDestroy(Connection, ref session, task);
patchMappings.Remove(mapping);
}
}
catch (Exception ex)
{
//best effort
log.Error("Failed to remove Pool_patch from the server.", ex);
}
}
}
}

View File

@ -0,0 +1,175 @@
/* Copyright (c) Citrix Systems Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms,
* with or without modification, are permitted provided
* that the following conditions are met:
*
* * Redistributions of source code must retain the above
* copyright notice, this list of conditions and the
* following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other
* materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
using System;
using System.Collections.Generic;
using XenAdmin.Actions;
using XenAdmin.Core;
using XenAPI;
using System.Linq;
using System.IO;
using XenAdmin.Network;
using XenAdmin.Diagnostics.Problems.HostProblem;
namespace XenAdmin.Wizards.PatchingWizard.PlanActions
{
class UploadPatchToMasterPlanAction : PlanActionWithSession
{
private readonly XenServerPatch patch;
private readonly List<PoolPatchMapping> mappings;
private Dictionary<XenServerPatch, string> AllDownloadedPatches = new Dictionary<XenServerPatch, string>();
private string tempFileName = null;
private AsyncAction inProgressAction = null;
public UploadPatchToMasterPlanAction(IXenConnection connection, XenServerPatch patch, List<PoolPatchMapping> mappings, Dictionary<XenServerPatch, string> allDownloadedPatches)
: base(connection, string.Format("Uploading update {0} to {1}...", patch.Name, connection.Name))
{
this.patch = patch;
this.mappings = mappings;
this.AllDownloadedPatches = allDownloadedPatches;
}
protected override void RunWithSession(ref Session session)
{
var path = AllDownloadedPatches[patch];
var poolPatches = new List<Pool_patch>(session.Connection.Cache.Pool_patches);
var conn = session.Connection;
var master = Helpers.GetMaster(conn);
var existingMapping = mappings.Find(m => m.MasterHost != null && master != null &&
m.MasterHost.uuid == master.uuid && m.Pool_patch != null && m.XenServerPatch.Equals(patch));
if (existingMapping == null
|| !poolPatches.Any(p => string.Equals(p.uuid, existingMapping.Pool_patch.uuid, StringComparison.OrdinalIgnoreCase)))
{
//free space check for upload:
try
{
var checkSpaceForUpload = new CheckDiskSpaceForPatchUploadAction(Helpers.GetMaster(conn), path, true);
inProgressAction = checkSpaceForUpload;
checkSpaceForUpload.RunExternal(session);
var uploadPatchAction = new UploadPatchAction(session.Connection, path, true, false);
inProgressAction = uploadPatchAction;
uploadPatchAction.RunExternal(session);
// this has to be run again to refresh poolPatches (to get the recently uploaded one as well)
poolPatches = new List<Pool_patch>(session.Connection.Cache.Pool_patches);
var poolPatch = poolPatches.Find(p => string.Equals(p.uuid, patch.Uuid, StringComparison.OrdinalIgnoreCase));
if (poolPatch == null)
{
log.ErrorFormat("Upload finished successfully, but Pool_patch object has not been found for patch (uuid={0}) on host (uuid={1}).", patch.Uuid, session.Connection);
throw new Exception(Messages.ACTION_UPLOADPATCHTOMASTERPLANACTION_FAILED);
}
var newMapping = new PoolPatchMapping(patch, poolPatch, Helpers.GetMaster(session.Connection));
if (!mappings.Contains(newMapping))
mappings.Add(newMapping);
}
catch (Exception ex)
{
Error = ex;
throw;
}
}
}
private void DownloadFile(ref Session session)
{
string patchUri = patch.PatchUrl;
if (string.IsNullOrEmpty(patchUri))
return;
Uri address = new Uri(patchUri);
tempFileName = Path.GetTempFileName();
var downloadAction = new DownloadAndUnzipXenServerPatchAction(patch.Name, address, tempFileName, Branding.Update);
if (downloadAction != null)
{
downloadAction.Changed += downloadAndUnzipXenServerPatchAction_Changed;
downloadAction.Completed += downloadAndUnzipXenServerPatchAction_Completed;
}
downloadAction.RunExternal(session);
}
private void downloadAndUnzipXenServerPatchAction_Changed(object sender)
{
var action = sender as AsyncAction;
if (action == null)
return;
if (Cancelling)
action.Cancel();
Program.Invoke(Program.MainWindow, () =>
{
//UpdateActionProgress(action);
//flickerFreeListBox1.Refresh();
//OnPageUpdated();
});
}
private void downloadAndUnzipXenServerPatchAction_Completed(ActionBase sender)
{
var action = sender as AsyncAction;
if (action == null)
return;
action.Changed -= downloadAndUnzipXenServerPatchAction_Changed;
action.Completed -= downloadAndUnzipXenServerPatchAction_Completed;
if (action.Succeeded)
{
if (action is DownloadAndUnzipXenServerPatchAction)
{
Host master = Helpers.GetMaster(action.Connection);
AllDownloadedPatches[patch] = (action as DownloadAndUnzipXenServerPatchAction).PatchPath;
}
}
}
public override void Cancel()
{
if (inProgressAction != null)
inProgressAction.Cancel();
base.Cancel();
}
}
}

View File

@ -0,0 +1,80 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using XenAdmin.Wizards.PatchingWizard.PlanActions;
using XenAPI;
namespace XenAdmin.Wizards.PatchingWizard
{
class UpdateProgressBackgroundWorker : BackgroundWorker
{
public List<PlanAction> PlanActions { get; private set; }
public List<PlanAction> DelayedActions { get; private set; }
private Host master;
public List<PlanAction> FinsihedActions = new List<PlanAction>();
public PlanAction FailedWithExceptionAction = null;
public List<PlanAction> doneActions = new List<PlanAction>();
public PlanAction InProgressAction { get; set; }
private readonly List<string> avoidRestartHosts = new List<string>();
/// <summary>
/// This list lists uuids of hosts that does not need to be restarted
/// </summary>
public List<string> AvoidRestartHosts
{
get
{
return avoidRestartHosts;
}
}
public UpdateProgressBackgroundWorker(Host master, List<PlanAction> planActions, List<PlanAction> delayedActions)
{
this.master = master;
this.PlanActions = planActions;
this.DelayedActions = delayedActions;
}
public List<PlanAction> AllActions
{
get
{
return PlanActions.Concat(DelayedActions).ToList();
}
}
public int TotalNumberOfActions
{
get
{
return PlanActions.Count + DelayedActions.Count;
}
}
public int ProgressPercent
{
get
{
return (int)(1.0 / (double)TotalNumberOfActions * (double)(FinsihedActions.Count));
}
}
public new void CancelAsync()
{
if (PlanActions != null)
PlanActions.ForEach(pa =>
{
if (!pa.IsComplete)
pa.Cancel();
});
base.CancelAsync();
}
}
}

View File

@ -0,0 +1,39 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using XenAdmin.Wizards.PatchingWizard.PlanActions;
using XenAPI;
namespace XenAdmin.Wizards.PatchingWizard
{
public class UpgradeProgressDescriptor
{
public List<PlanAction> planActions { get; private set; }
public List<PlanAction> delayedActions { get; private set; }
private Host master;
public float ProgressPercent = 0;
public PlanAction InProgressAction = null;
public PlanAction FailedWithExceptionAction = null;
public List<PlanAction> doneActions = new List<PlanAction>();
public UpgradeProgressDescriptor(Host master, List<PlanAction> planActions, List<PlanAction> delayedActions)
{
this.master = master;
this.planActions = planActions;
this.delayedActions = delayedActions;
}
public int TotalNumberOfActions
{
get
{
return planActions.Count + delayedActions.Count;
}
}
}
}

View File

@ -97,6 +97,7 @@
<Compile Include="Actions\GUIActions\ExportResourceReportAction.cs" />
<Compile Include="Actions\GUIActions\DeleteAllAlertsAction.cs" />
<Compile Include="Actions\GUIActions\ExternalPluginAction.cs" />
<Compile Include="Actions\GUIActions\RestoreDismissedUpdatesAction.cs" />
<Compile Include="Actions\GUIActions\MeddlingAction.cs" />
<Compile Include="Actions\GUIActions\IgnoreServerAction.cs" />
<Compile Include="Actions\GUIActions\IgnorePatchAction.cs" />
@ -211,6 +212,7 @@
<Compile Include="Core\HiddenFeatures.cs" />
<Compile Include="Diagnostics\Checks\AssertCanEvacuateCheck.cs" />
<Compile Include="Diagnostics\Checks\AssertCanEvacuateUpgradeCheck.cs" />
<Compile Include="Diagnostics\Checks\DiskSpaceForBatchUpdatesCheck.cs" />
<Compile Include="Diagnostics\Checks\SafeToUpgradeCheck.cs" />
<Compile Include="Diagnostics\Checks\HostHasUnsupportedStorageLinkSRCheck.cs" />
<Compile Include="Diagnostics\Problems\HostProblem\HostNotSafeToUpgradeWarning.cs" />
@ -293,12 +295,6 @@
<DesignTime>True</DesignTime>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Include="SettingsPanels\LivePatchingEditPage.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="SettingsPanels\LivePatchingEditPage.Designer.cs">
<DependentUpon>LivePatchingEditPage.cs</DependentUpon>
</Compile>
<Compile Include="SettingsPanels\SecurityEditPage.cs">
<SubType>UserControl</SubType>
</Compile>
@ -858,14 +854,31 @@
<DependentUpon>HAPage.cs</DependentUpon>
</Compile>
<Compile Include="Alerts\Types\XenCenterUpdateAlert.cs" />
<Compile Include="Wizards\PatchingWizard\PatchingWizard_AutoUpdatingPage.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Wizards\PatchingWizard\PatchingWizard_AutoUpdatingPage.designer.cs">
<DependentUpon>PatchingWizard_AutoUpdatingPage.cs</DependentUpon>
</Compile>
<Compile Include="Wizards\PatchingWizard\PatchingWizard_UploadPage.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Wizards\PatchingWizard\PatchingWizard_UploadPage.Designer.cs">
<DependentUpon>PatchingWizard_UploadPage.cs</DependentUpon>
</Compile>
<Compile Include="Wizards\PatchingWizard\PlanActions\ApplyXenServerPatchPlanAction.cs" />
<Compile Include="Wizards\PatchingWizard\PlanActions\IAvoidRestartCapable.cs" />
<Compile Include="Wizards\PatchingWizard\PlanActions\PatchPrechecksOnMultipleHostsAction.cs" />
<Compile Include="Wizards\PatchingWizard\PlanActions\DownloadPatchPlanAction.cs" />
<Compile Include="Wizards\PatchingWizard\PlanActions\UploadPatchToMasterPlanAction.cs" />
<Compile Include="Wizards\PatchingWizard\PlanActions\PoolPatchMapping.cs" />
<Compile Include="Wizards\PatchingWizard\PlanActions\RemoveUpdateFilesFromMaster.cs" />
<Compile Include="Wizards\PatchingWizard\PlanActions\RemoveUpdateFile.cs" />
<Compile Include="Wizards\PatchingWizard\PlanActions\InstallSupplementalPackPlanAction.cs" />
<Compile Include="Wizards\PatchingWizard\UpdateProgressBackgroundWorker.cs">
<SubType>Component</SubType>
</Compile>
<Compile Include="Wizards\PatchingWizard\UpgradeProgressDescriptor.cs" />
<Compile Include="XenSearch\TreeNodeGroupAcceptor.cs">
</Compile>
<Compile Include="Dialogs\FolderChangeDialog.cs">
@ -1746,15 +1759,6 @@
<DependentUpon>EditNetworkPage.cs</DependentUpon>
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="SettingsPanels\LivePatchingEditPage.ja.resx">
<DependentUpon>LivePatchingEditPage.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="SettingsPanels\LivePatchingEditPage.resx">
<DependentUpon>LivePatchingEditPage.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="SettingsPanels\LivePatchingEditPage.zh-CN.resx">
<DependentUpon>LivePatchingEditPage.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="SettingsPanels\SecurityEditPage.ja.resx">
<DependentUpon>SecurityEditPage.cs</DependentUpon>
</EmbeddedResource>
@ -2058,6 +2062,16 @@
<SubType>Designer</SubType>
<DependentUpon>PatchingWizard_ModePage.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Wizards\PatchingWizard\PatchingWizard_AutoUpdatingPage.ja.resx">
<DependentUpon>PatchingWizard_AutoUpdatingPage.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Wizards\PatchingWizard\PatchingWizard_AutoUpdatingPage.resx">
<DependentUpon>PatchingWizard_AutoUpdatingPage.cs</DependentUpon>
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="Wizards\PatchingWizard\PatchingWizard_AutoUpdatingPage.zh-CN.resx">
<DependentUpon>PatchingWizard_AutoUpdatingPage.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Wizards\PatchingWizard\PatchingWizard_PatchingPage.resx">
<SubType>Designer</SubType>
<DependentUpon>PatchingWizard_PatchingPage.cs</DependentUpon>

View File

@ -55,7 +55,7 @@ namespace XenAdminTests.UnitTests.AlertTests
[Test]
public void TestAlertWithConnectionAndHosts()
{
XenServerPatch p = new XenServerPatch("uuid", "name", "My description", "guidance", "6.0.1", "http://url", "http://patchUrl", new DateTime(2011, 4, 1).ToString(), "", "");
XenServerPatch p = new XenServerPatch("uuid", "name", "My description", "guidance", string.Empty, "6.0.1", "http://url", "http://patchUrl", new DateTime(2011, 4, 1).ToString(), "", "");
XenServerPatchAlert alert = new XenServerPatchAlert(p);
alert.IncludeConnection(connA.Object);
alert.IncludeConnection(connB.Object);
@ -83,7 +83,7 @@ namespace XenAdminTests.UnitTests.AlertTests
[Test]
public void TestAlertWithHostsAndNoConnection()
{
XenServerPatch p = new XenServerPatch("uuid", "name", "My description", "guidance", "6.0.1", "http://url", "http://patchUrl", new DateTime(2011, 4, 1).ToString(), "1", "");
XenServerPatch p = new XenServerPatch("uuid", "name", "My description", "guidance", string.Empty, "6.0.1", "http://url", "http://patchUrl", new DateTime(2011, 4, 1).ToString(), "1", "");
XenServerPatchAlert alert = new XenServerPatchAlert(p);
alert.IncludeHosts(new List<Host>() { hostA.Object, hostB.Object });
@ -109,7 +109,7 @@ namespace XenAdminTests.UnitTests.AlertTests
[Test]
public void TestAlertWithConnectionAndNoHosts()
{
XenServerPatch p = new XenServerPatch("uuid", "name", "My description", "guidance", "6.0.1", "http://url", "http://patchUrl", new DateTime(2011, 4, 1).ToString(), "0", "");
XenServerPatch p = new XenServerPatch("uuid", "name", "My description", "guidance", string.Empty, "6.0.1", "http://url", "http://patchUrl", new DateTime(2011, 4, 1).ToString(), "0", "");
XenServerPatchAlert alert = new XenServerPatchAlert(p);
alert.IncludeConnection(connA.Object);
alert.IncludeConnection(connB.Object);
@ -136,7 +136,7 @@ namespace XenAdminTests.UnitTests.AlertTests
[Test]
public void TestAlertWithNoConnectionAndNoHosts()
{
XenServerPatch p = new XenServerPatch("uuid", "name", "My description", "guidance", "6.0.1", "http://url", "http://patchUrl", new DateTime(2011, 4, 1).ToString(), "5", "");
XenServerPatch p = new XenServerPatch("uuid", "name", "My description", "guidance", string.Empty, "6.0.1", "http://url", "http://patchUrl", new DateTime(2011, 4, 1).ToString(), "5", "");
XenServerPatchAlert alert = new XenServerPatchAlert(p);
IUnitTestVerifier validator = new VerifyGetters(alert);

View File

@ -55,7 +55,7 @@ namespace XenAdminTests.UnitTests.AlertTests
[Test]
public void TestAlertWithConnectionAndHosts()
{
XenServerVersion ver = new XenServerVersion("1.2.3", "name", true, "http://url", new List<XenServerPatch>(), new DateTime(2011,4,1).ToString(), "123");
XenServerVersion ver = new XenServerVersion("1.2.3", "name", true, "http://url", new List<XenServerPatch>(), new List<XenServerPatch>(), new DateTime(2011, 4, 1).ToString(), "123");
var alert = new XenServerVersionAlert(ver);
alert.IncludeConnection(connA.Object);
alert.IncludeConnection(connB.Object);
@ -83,7 +83,7 @@ namespace XenAdminTests.UnitTests.AlertTests
[Test]
public void TestAlertWithHostsAndNoConnection()
{
XenServerVersion ver = new XenServerVersion("1.2.3", "name", true, "http://url", new List<XenServerPatch>(), new DateTime(2011, 4, 1).ToString(), "123");
XenServerVersion ver = new XenServerVersion("1.2.3", "name", true, "http://url", new List<XenServerPatch>(), new List<XenServerPatch>(), new DateTime(2011, 4, 1).ToString(), "123");
var alert = new XenServerVersionAlert(ver);
alert.IncludeHosts(new List<Host> { hostA.Object, hostB.Object });
@ -109,7 +109,7 @@ namespace XenAdminTests.UnitTests.AlertTests
[Test]
public void TestAlertWithConnectionAndNoHosts()
{
XenServerVersion ver = new XenServerVersion("1.2.3", "name", true, "http://url", new List<XenServerPatch>(), new DateTime(2011, 4, 1).ToString(), "123");
XenServerVersion ver = new XenServerVersion("1.2.3", "name", true, "http://url", new List<XenServerPatch>(), new List<XenServerPatch>(), new DateTime(2011, 4, 1).ToString(), "123");
var alert = new XenServerVersionAlert(ver);
alert.IncludeConnection(connA.Object);
alert.IncludeConnection(connB.Object);
@ -136,7 +136,7 @@ namespace XenAdminTests.UnitTests.AlertTests
[Test]
public void TestAlertWithNoConnectionAndNoHosts()
{
XenServerVersion ver = new XenServerVersion("1.2.3", "name", true, "http://url", new List<XenServerPatch>(), new DateTime(2011, 4, 1).ToString(), "123");
XenServerVersion ver = new XenServerVersion("1.2.3", "name", true, "http://url", new List<XenServerPatch>(), new List<XenServerPatch>(), new DateTime(2011, 4, 1).ToString(), "123");
var alert = new XenServerVersionAlert(ver);
IUnitTestVerifier validator = new VerifyGetters(alert);

View File

@ -0,0 +1,420 @@
/* Copyright (c) Citrix Systems Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms,
* with or without modification, are permitted provided
* that the following conditions are met:
*
* * Redistributions of source code must retain the above
* copyright notice, this list of conditions and the
* following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other
* materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
using System;
using System.Collections.Generic;
using NUnit.Framework;
using XenAdmin.Actions;
using Moq;
using XenAdmin.Core;
using XenAPI;
using System.Linq;
namespace XenAdminTests.UnitTests
{
[TestFixture, Category(TestCategories.Unit)]
public class BatchUpdatesTests
{
private static Mock<Host> GetAMockHost(string productVersion, string buildNumber, List<Pool_patch> applied_patches = null)
{
var id = System.Guid.NewGuid().ToString();
MockObjectManager mom = new MockObjectManager();
mom.CreateNewConnection(id);
Mock<Host> master = mom.NewXenObject<Host>(id);
Mock<Pool> pool = mom.NewXenObject<Pool>(id);
XenRef<Host> masterRef = new XenRef<Host>("master-ref");
pool.Setup(p => p.master).Returns(masterRef);
mom.MockCacheFor(id).Setup(c => c.Resolve(It.IsAny<XenRef<Pool>>())).Returns(pool.Object);
mom.MockConnectionFor(id).Setup(c => c.Resolve(masterRef)).Returns(master.Object);
mom.MockConnectionFor(id).Setup(c => c.Cache.Hosts).Returns(new Host[] { master.Object });
mom.MockConnectionFor(id).Setup(c => c.Cache.Pools).Returns(new Pool[] { pool.Object });
master.Setup(h => h.software_version).Returns(new Dictionary<string, string>());
master.Setup(h => h.ProductVersion).Returns(productVersion);
master.Setup(h => h.AppliedPatches()).Returns(applied_patches ?? new List<Pool_patch>());
master.Setup(h => h.BuildNumberRaw).Returns(buildNumber);
master.Setup(h => h.uuid).Returns(id);
return master;
}
private static List<XenServerVersion> GetAVersionWithGivenNumberOfPatches(int numberOfPatches)
{
var serverVersions = new List<XenServerVersion>();
var version = new XenServerVersion("7.0.0", "XenServer Test 7", true, "", new List<XenServerPatch>(), new List<XenServerPatch>(), DateTime.MinValue.ToString(), "buildNo");
for (int ii = 0; ii < numberOfPatches; ii++)
{
var patch = new XenServerPatch("patch_uuid_" + ii, "patch name " + ii, "patch description" + ii, "", "", "1.0", "", "", "1970-01-01T00:00:00Z", "", "1000");
version.Patches.Add(patch);
version.MinimalPatches.Add(patch);
}
serverVersions.Add(version);
return serverVersions;
}
private static void RemoveANumberOfPatchesPseudoRandomly(List<XenServerPatch> patches, int numberOfPatchesToRemove)
{
int expectedCount = patches.Count - numberOfPatchesToRemove;
var rnd = new Random(777); //pseudo random to be able to repeat this test...
while (patches.Count > expectedCount)
{
patches.RemoveAt(rnd.Next(patches.Count));
}
}
[Test]
public void GetUpgradeSequenceForNullConnection()
{
Assert.AreEqual(XenAdmin.Core.Updates.GetUpgradeSequence(null), null);
}
/// <summary>
/// Version exist
/// No patches in updates
/// Nothing installed on host
/// Result: update sequence has the host, but empty sequence
/// </summary>
[Test]
public void NoPatchesForCurrentVersion()
{
// Arrange
var serverVersions = GetAVersionWithGivenNumberOfPatches(0);
var master = GetAMockHost(serverVersions.First().Oem, serverVersions.First().BuildNumber);
SetXenServerVersionsInUpdates(serverVersions);
// Act
var upgradeSequence = XenAdmin.Core.Updates.GetUpgradeSequence(master.Object.Connection);
// Assert
Assert.NotNull(upgradeSequence);
Assert.AreEqual(1, upgradeSequence.Count);
Assert.NotNull(upgradeSequence.First().Key);
Assert.AreEqual(upgradeSequence.First().Key.uuid, master.Object.uuid);
Assert.NotNull(upgradeSequence.First().Value);
Assert.AreEqual(upgradeSequence.First().Value.Count, 0);
}
/// <summary>
/// Version exist
/// 1 patch in updates. 1 in minimal list.
/// 1 has to be installed on host
/// Result: update sequence has the host, with the one single patch in it
/// </summary>
[Test]
public void OnePatchToBeInstalledForCurrentVersion()
{
// Arrange
var serverVersions = GetAVersionWithGivenNumberOfPatches(1);
var patch = serverVersions.First().Patches[0];
var master = GetAMockHost(serverVersions.First().Oem, serverVersions.First().BuildNumber);
SetXenServerVersionsInUpdates(serverVersions);
// Act
var upgradeSequence = XenAdmin.Core.Updates.GetUpgradeSequence(master.Object.Connection);
// Assert
Assert.NotNull(upgradeSequence);
Assert.AreEqual(1, upgradeSequence.Count);
Assert.NotNull(upgradeSequence.First().Key);
Assert.AreEqual(upgradeSequence.First().Key.uuid, master.Object.uuid);
Assert.NotNull(upgradeSequence.First().Value);
Assert.AreEqual(upgradeSequence.First().Value.Count, 1);
Assert.AreEqual(upgradeSequence.First().Value[0], patch);
}
/// <summary>
/// Version exist
/// 1 patch in updates. 1 in minimal list. But it is applied already on master.
/// 0 has to be installed on host
/// </summary>
[Test]
public void AlreadyInstalledOneFromMinimalForCurrentVersion()
{
// Arrange
var serverVersions = GetAVersionWithGivenNumberOfPatches(1);
var patch = serverVersions.First().Patches[0];
Pool_patch pool_patch = new Pool_patch();
pool_patch.uuid = patch.Uuid;
var master = GetAMockHost(serverVersions.First().Oem, serverVersions.First().BuildNumber, new List<Pool_patch>() { pool_patch });
SetXenServerVersionsInUpdates(serverVersions);
// Act
var upgradeSequence = XenAdmin.Core.Updates.GetUpgradeSequence(master.Object.Connection);
// Assert
Assert.NotNull(upgradeSequence);
Assert.AreEqual(1, upgradeSequence.Count);
Assert.NotNull(upgradeSequence.First().Key);
Assert.AreEqual(upgradeSequence.First().Key.uuid, master.Object.uuid);
Assert.NotNull(upgradeSequence.First().Value);
Assert.AreEqual(upgradeSequence.First().Value.Count, 0);
}
/// <summary>
/// Version exist
/// 100 patch in updates. 100 in minimal list.
/// 100 has to be installed on host
/// Result: update sequence has all the 100 patches in it
/// </summary>
[Test]
public void HundredPatchToBeInstalledForCurrentVersion()
{
// Arrange
var serverVersions = GetAVersionWithGivenNumberOfPatches(100);
var master = GetAMockHost(serverVersions.First().Oem, serverVersions.First().BuildNumber);
SetXenServerVersionsInUpdates(serverVersions);
// Act
var upgradeSequence = XenAdmin.Core.Updates.GetUpgradeSequence(master.Object.Connection);
// Assert
Assert.NotNull(upgradeSequence);
Assert.AreEqual(1, upgradeSequence.Count);
var seqToCheck = upgradeSequence.First();
Assert.NotNull(seqToCheck.Key);
Assert.AreEqual(seqToCheck.Key.uuid, master.Object.uuid);
Assert.NotNull(seqToCheck.Value);
Assert.AreEqual(seqToCheck.Value.Count, 100);
for (int ii = 100; ii < 0; --ii)
Assert.AreEqual(seqToCheck.Value[ii], serverVersions.First().Patches[ii]);
}
/// <summary>
/// Version exist
/// 100 patch in updates. 51 in minimal list.
/// 51 has to be installed on host
/// Result: update sequence has all the 51 patches in it
/// </summary>
[Test]
public void FiftyOnePatchToBeInstalledForCurrentVersion()
{
// Arrange
var serverVersions = GetAVersionWithGivenNumberOfPatches(100);
var master = GetAMockHost(serverVersions.First().Oem, serverVersions.First().BuildNumber);
RemoveANumberOfPatchesPseudoRandomly(serverVersions.First().MinimalPatches, 49);
SetXenServerVersionsInUpdates(serverVersions);
// Act
var upgradeSequence = XenAdmin.Core.Updates.GetUpgradeSequence(master.Object.Connection);
// Assert
Assert.NotNull(upgradeSequence);
Assert.AreEqual(1, upgradeSequence.Count);
var seqToCheck = upgradeSequence.First();
Assert.NotNull(seqToCheck.Key);
Assert.AreEqual(seqToCheck.Key.uuid, master.Object.uuid);
Assert.NotNull(seqToCheck.Value);
Assert.AreEqual(seqToCheck.Value.Count, 51);
foreach (var patch in seqToCheck.Value)
Assert.IsTrue(serverVersions.First().MinimalPatches.Contains(patch));
Assert.False(seqToCheck.Value.Exists(seqpatch => !serverVersions.First().MinimalPatches.Contains(seqpatch)));
}
/// <summary>
/// Version exist
/// 100 patch in updates. 51 in minimal list.
/// 41 has to be installed on host (only 41 of 51, because 10 is already installed from the Minimal list (as well as 5 other))
/// Result: update sequence has all the 41 patches in it and all are from Minimal List and also not installed on the host
/// </summary>
[Test]
public void FourtyOnePatchToBeInstalledForCurrentVersion()
{
// Arrange
var serverVersions = GetAVersionWithGivenNumberOfPatches(100);
RemoveANumberOfPatchesPseudoRandomly(serverVersions.First().MinimalPatches, 49);
var pool_patches = new List<Pool_patch>();
for (int ii = 0; ii < 10; ii++)
{
pool_patches.Add(new Pool_patch() { uuid = serverVersions.First().MinimalPatches[ii].Uuid });
}
var notMinimalPatchesInVersion = serverVersions.First().Patches.Where(p => !serverVersions.First().MinimalPatches.Exists(mp => mp.Uuid == p.Uuid)).ToList();
for (int ii = 0; ii < 5; ii++)
{
pool_patches.Add(new Pool_patch() { uuid = notMinimalPatchesInVersion[ii].Uuid });
}
var master = GetAMockHost(serverVersions.First().Oem, serverVersions.First().BuildNumber, pool_patches);
SetXenServerVersionsInUpdates(serverVersions);
// Act
var upgradeSequence = XenAdmin.Core.Updates.GetUpgradeSequence(master.Object.Connection);
// Assert
Assert.NotNull(upgradeSequence);
Assert.AreEqual(1, upgradeSequence.Count);
var seqToCheck = upgradeSequence.First();
Assert.NotNull(seqToCheck.Key);
Assert.AreEqual(seqToCheck.Key.uuid, master.Object.uuid);
Assert.NotNull(seqToCheck.Value);
Assert.AreEqual(seqToCheck.Value.Count, 41);
foreach (var patch in seqToCheck.Value)
Assert.IsTrue(serverVersions.First().MinimalPatches.Contains(patch) && !pool_patches.Exists(p => p.uuid == patch.Uuid));
Assert.False(seqToCheck.Value.Exists(seqpatch => !serverVersions.First().MinimalPatches.Contains(seqpatch)));
Assert.True(seqToCheck.Value.Exists(seqpatch => !pool_patches.Exists(pp => pp.uuid == seqpatch.Uuid)));
}
/// <summary>
/// Version exist
/// 2 patch in updates. 1 in minimal list.
/// 1 has to be installed on host
/// Result: update sequence has the host, with the one single patch in it
/// </summary>
[Test]
public void OnePatchOutOfTwoToBeInstalledForCurrentVersion()
{
// Arrange
var serverVersions = GetAVersionWithGivenNumberOfPatches(2);
var master = GetAMockHost(serverVersions.First().Oem, serverVersions.First().BuildNumber);
RemoveANumberOfPatchesPseudoRandomly(serverVersions.First().MinimalPatches, 1);
SetXenServerVersionsInUpdates(serverVersions);
// Act
var upgradeSequence = XenAdmin.Core.Updates.GetUpgradeSequence(master.Object.Connection);
// Assert
Assert.NotNull(upgradeSequence);
Assert.AreEqual(1, upgradeSequence.Count);
Assert.NotNull(upgradeSequence.First().Key);
Assert.AreEqual(upgradeSequence.First().Key.uuid, master.Object.uuid);
Assert.NotNull(upgradeSequence.First().Value);
Assert.AreEqual(upgradeSequence.First().Value.Count, 1);
Assert.AreEqual(upgradeSequence.First().Value[0], serverVersions.First().MinimalPatches[0]);
}
/// <summary>
/// Version exist
/// 2 patch in updates. 2 in minimal list.
/// 2 has to be installed on host
/// Result: update sequence has the host, with the one single patch in it
/// </summary>
[Test]
public void TwoPatchToBeInstalleOutOfTwodForCurrentVersion()
{
// Arrange
var serverVersions = GetAVersionWithGivenNumberOfPatches(2);
var master = GetAMockHost(serverVersions.First().Oem, serverVersions.First().BuildNumber);
SetXenServerVersionsInUpdates(serverVersions);
// Act
var upgradeSequence = XenAdmin.Core.Updates.GetUpgradeSequence(master.Object.Connection);
// Assert
Assert.NotNull(upgradeSequence);
Assert.AreEqual(1, upgradeSequence.Count);
Assert.NotNull(upgradeSequence.First().Key);
Assert.AreEqual(upgradeSequence.First().Key.uuid, master.Object.uuid);
Assert.NotNull(upgradeSequence.First().Value);
Assert.AreEqual(upgradeSequence.First().Value.Count, 2);
Assert.AreEqual(upgradeSequence.First().Value[0], serverVersions.First().MinimalPatches[0]);
Assert.AreEqual(upgradeSequence.First().Value[1], serverVersions.First().MinimalPatches[1]);
}
/// <summary>
/// Version does not exist
/// Result: update sequence is null
/// </summary>
[Test]
public void NoInfoForCurrentVersion()
{
// Arrange
var serverVersions = GetAVersionWithGivenNumberOfPatches(200);
var master = GetAMockHost(serverVersions.First().Oem, serverVersions.First().BuildNumber + "to_make_it_not_match");
SetXenServerVersionsInUpdates(serverVersions);
// Act
var upgradeSequence = XenAdmin.Core.Updates.GetUpgradeSequence(master.Object.Connection);
// Assert
Assert.Null(upgradeSequence);
}
/// <summary>
/// Updates is static class, can't be mocked without refactoring - using this method instead
/// </summary>
/// <param name="serverVersions"></param>
private void SetXenServerVersionsInUpdates(List<XenServerVersion> serverVersions)
{
Updates.XenServerVersions = serverVersions;
}
}
}

View File

@ -67,6 +67,7 @@
<ItemGroup>
<Compile Include="HealthCheckTests\CredentialTests.cs" />
<Compile Include="HealthCheckTests\RequestUploadTaskTests.cs" />
<Compile Include="UnitTests\BatchUpdatesTests\BatchUpdatesTests.cs" />
<Compile Include="UnitTests\CPUFeaturesTest.cs" />
<Compile Include="UnitTests\HealthCheckAnalysisProgressTest.cs" />
<Compile Include="UnitTests\SubnetworkMaskValidatorTest.cs" />

View File

@ -37,7 +37,7 @@ using XenAPI;
namespace XenAdmin.Actions
{
public class DestroyHostCrashDumpAction : AsyncAction
public class DestroyHostCrashDumpAction : PureAsyncAction
{
private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

View File

@ -126,6 +126,7 @@ namespace XenAdmin.Actions
protected override void Run()
{
SafeToExit = false;
foreach (Pool_patch patch in patches)
{
foreach (Host host in hosts)

View File

@ -44,7 +44,8 @@ namespace XenAdmin.Actions
private readonly string updateName;
private readonly long updateSize;
private readonly Pool_patch currentPatch;
private readonly Pool_patch currentPatch;
private readonly Actions.DiskSpaceRequirements.OperationTypes operation = Actions.DiskSpaceRequirements.OperationTypes.upload;
public DiskSpaceRequirements DiskSpaceRequirements { get; private set; }
@ -62,7 +63,16 @@ namespace XenAdmin.Actions
/// </summary>
public GetDiskSpaceRequirementsAction(Host host, string path, bool suppressHistory)
: this(host, FileName(path), FileSize(path), suppressHistory)
{ }
{ }
/// <summary>
/// This constructor is used to calculate the disk space when the required space is known only
/// </summary>
public GetDiskSpaceRequirementsAction(Host host, long size, bool suppressHistory, XenAdmin.Actions.DiskSpaceRequirements.OperationTypes operation)
: this(host, null, size, suppressHistory)
{
this.operation = operation;
}
/// <summary>
/// This constructor is used to check disk space for installing or uploading an update of given size
@ -124,21 +134,23 @@ namespace XenAdmin.Actions
}
// get reclaimable disk space (excluding current patch)
long reclaimableDiskSpace = 0;
try
{
var args = new Dictionary<string, string>();
if (currentPatch != null)
args.Add("exclude", currentPatch.uuid);
result = Host.call_plugin(Session, Host.opaque_ref, "disk-space", "get_reclaimable_disk_space", args);
reclaimableDiskSpace = Convert.ToInt64(result);
long reclaimableDiskSpace = 0;
if (availableDiskSpace < requiredDiskSpace)
{
try
{
var args = new Dictionary<string, string>();
if (currentPatch != null)
args.Add("exclude", currentPatch.uuid);
result = Host.call_plugin(Session, Host.opaque_ref, "disk-space", "get_reclaimable_disk_space", args);
reclaimableDiskSpace = Convert.ToInt64(result);
}
catch (Failure failure)
{
log.WarnFormat("Plugin call disk-space.get_reclaimable_disk_space on {0} failed with {1}", Host.Name, failure.Message);
}
}
catch (Failure failure)
{
log.WarnFormat("Plugin call disk-space.get_reclaimable_disk_space on {0} failed with {1}", Host.Name, failure.Message);
}
var operation = Actions.DiskSpaceRequirements.OperationTypes.upload;
DiskSpaceRequirements = new DiskSpaceRequirements(operation, Host, updateName, requiredDiskSpace, availableDiskSpace, reclaimableDiskSpace);
@ -156,7 +168,7 @@ namespace XenAdmin.Actions
public readonly long AvailableDiskSpace;
public readonly long ReclaimableDiskSpace;
public enum OperationTypes { install, upload }
public enum OperationTypes { install, upload, autoupdate }
public DiskSpaceRequirements(OperationTypes operation, Host host, string updateName, long requiredDiskSpace, long availableDiskSpace, long reclaimableDiskSpace)
{
@ -185,6 +197,9 @@ namespace XenAdmin.Actions
case OperationTypes.upload :
sbMessage.AppendFormat(Messages.NOT_ENOUGH_SPACE_MESSAGE_UPLOAD, Host.Name, UpdateName);
break;
case OperationTypes.autoupdate :
sbMessage.AppendFormat(Messages.NOT_ENOUGH_SPACE_MESSAGE_AUTO_UPDATE, Host.Name);
break;
}
sbMessage.AppendLine();

View File

@ -36,6 +36,7 @@ using XenAPI;
using System.IO;
using System.Xml;
using XenAdmin.Core;
using System.Diagnostics;
namespace XenAdmin.Actions
@ -51,6 +52,7 @@ namespace XenAdmin.Actions
private const string ConflictingPatchNode = "conflictingpatch";
private const string RequiredPatchNode = "requiredpatch";
public List<XenCenterVersion> XenCenterVersions { get; private set; }
public List<XenServerVersion> XenServerVersions { get; private set; }
public List<XenServerPatch> XenServerPatches { get; private set; }
@ -72,9 +74,11 @@ namespace XenAdmin.Actions
private readonly bool _checkForPatches;
private readonly string _checkForUpdatesUrl;
public DownloadUpdatesXmlAction(bool checkForXenCenter, bool checkForServerVersion, bool checkForPatches, string checkForUpdatesUrl)
public DownloadUpdatesXmlAction(bool checkForXenCenter, bool checkForServerVersion, bool checkForPatches, string checkForUpdatesUrl = null)
: base(null, "_get_updates", "_get_updates", true)
{
Debug.Assert(checkForUpdatesUrl != null, "Parameter checkForUpdatesUrl should not be null. This class does not default its value anymore.");
XenServerPatches = new List<XenServerPatch>();
XenServerVersions = new List<XenServerVersion>();
XenCenterVersions = new List<XenCenterVersion>();
@ -82,13 +86,9 @@ namespace XenAdmin.Actions
_checkForXenCenter = checkForXenCenter;
_checkForServerVersion = checkForServerVersion;
_checkForPatches = checkForPatches;
_checkForUpdatesUrl = string.IsNullOrEmpty(checkForUpdatesUrl) ? InvisibleMessages.XENSERVER_UPDATE_URL : checkForUpdatesUrl;
_checkForUpdatesUrl = checkForUpdatesUrl;
}
public DownloadUpdatesXmlAction(bool checkForXenCenter, bool checkForServerVersion, bool checkForPatches)
: this(checkForXenCenter, checkForServerVersion, checkForPatches, null)
{ }
protected override void Run()
{
this.Description = Messages.AVAILABLE_UPDATES_SEARCHING;
@ -98,6 +98,7 @@ namespace XenAdmin.Actions
GetXenCenterVersions(xdoc);
GetXenServerPatches(xdoc);
GetXenServerVersions(xdoc);
}
private void GetXenCenterVersions(XmlDocument xdoc)
@ -147,6 +148,7 @@ namespace XenAdmin.Actions
string name = "";
string description = "";
string guidance = "";
string guidance_mandatory = "";
string patchVersion = "";
string url = "";
string patchUrl = "";
@ -164,6 +166,8 @@ namespace XenAdmin.Actions
description = attrib.Value;
else if (attrib.Name == "after-apply-guidance")
guidance = attrib.Value;
else if (attrib.Name == "guidance-mandatory")
guidance_mandatory = attrib.Value;
else if (attrib.Name == "version")
patchVersion = attrib.Value;
else if (attrib.Name == "url")
@ -181,7 +185,7 @@ namespace XenAdmin.Actions
var conflictingPatches = GetPatchDependencies(version, ConflictingPatchesNode, ConflictingPatchNode);
var requiredPatches = GetPatchDependencies(version, RequiredPatchesNode, RequiredPatchNode);
XenServerPatches.Add(new XenServerPatch(uuid, name, description, guidance, patchVersion, url,
XenServerPatches.Add(new XenServerPatch(uuid, name, description, guidance, guidance_mandatory, patchVersion, url,
patchUrl, timestamp, priority, installationSize, conflictingPatches, requiredPatches));
}
}
@ -206,6 +210,7 @@ namespace XenAdmin.Actions
var dependencies = new List<string>();
dependencies.AddRange(from XmlNode node in dependenciesNode.ChildNodes
where node.Attributes != null
from XmlAttribute attrib in node.Attributes
where node.Name == dependencyNodeName && node.Attributes != null && attrib.Name == "uuid"
select attrib.Value);
@ -245,18 +250,38 @@ namespace XenAdmin.Actions
}
List<XenServerPatch> patches = new List<XenServerPatch>();
List<XenServerPatch> minimalPatches = null; //keep it null to indicate that there is no a minimalpatches tag
foreach (XmlNode childnode in version.ChildNodes)
{
if (childnode.Name != "patch")
continue;
XenServerPatch patch = XenServerPatches.Find(item => string.Equals(item.Uuid, childnode.Attributes["uuid"].Value, StringComparison.OrdinalIgnoreCase));
if (patch == null)
continue;
patches.Add(patch);
if (childnode.Name == "minimalpatches")
{
minimalPatches = new List<XenServerPatch>();
foreach (XmlNode minimalpatch in childnode.ChildNodes)
{
if (minimalpatch.Name != "patch")
continue;
XenServerPatch mp = XenServerPatches.Find(p => string.Equals(p.Uuid, minimalpatch.Attributes["uuid"].Value, StringComparison.OrdinalIgnoreCase));
if (mp == null)
continue;
minimalPatches.Add(mp);
}
}
if (childnode.Name == "patch")
{
XenServerPatch patch = XenServerPatches.Find(item => string.Equals(item.Uuid, childnode.Attributes["uuid"].Value, StringComparison.OrdinalIgnoreCase));
if (patch == null)
continue;
patches.Add(patch);
}
}
XenServerVersions.Add(new XenServerVersion(version_oem, name, is_latest, url, patches, timestamp,
XenServerVersions.Add(new XenServerVersion(version_oem, name, is_latest, url, patches, minimalPatches, timestamp,
buildNumber));
}
}
@ -264,10 +289,19 @@ namespace XenAdmin.Actions
protected virtual XmlDocument FetchCheckForUpdatesXml(string location)
{
XmlDocument xdoc;
using (Stream xmlstream = HTTPHelper.GET(new Uri(location), Connection, false, true))
var xdoc = new XmlDocument();
var uri = new Uri(location);
if (uri.IsFile)
{
xdoc = Helpers.LoadXmlDocument(xmlstream);
xdoc.Load(location);
}
else
{
using (Stream xmlstream = HTTPHelper.GET(new Uri(location), Connection, false, true))
{
xdoc = Helpers.LoadXmlDocument(xmlstream);
}
}
return xdoc;
}

View File

@ -31,15 +31,19 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using XenAPI;
namespace XenAdmin.Core
{
[DebuggerDisplay("XenServerPatch (Name={Name}; Uuid={Uuid})")]
public class XenServerPatch : IEquatable<XenServerPatch>
{
private string _uuid;
public readonly string Name;
public readonly string Description;
public readonly string Guidance;
public readonly string Guidance_mandatory;
public readonly Version Version;
public readonly string Url;
public readonly string PatchUrl;
@ -52,13 +56,14 @@ namespace XenAdmin.Core
private const int DEFAULT_PRIORITY = 2;
public XenServerPatch(string uuid, string name, string description, string guidance, string version, string url,
public XenServerPatch(string uuid, string name, string description, string guidance, string guidance_mandatory , string version, string url,
string patchUrl, string timestamp, string priority, string installationSize)
{
_uuid = uuid;
Name = name;
Description = description;
Guidance = guidance;
Guidance_mandatory = guidance_mandatory;
Version = new Version(version);
if (url.StartsWith("/XenServer"))
url = XenServerVersion.UpdateRoot + url;
@ -71,10 +76,11 @@ namespace XenAdmin.Core
InstallationSize = 0;
}
public XenServerPatch(string uuid, string name, string description, string guidance, string version, string url,
public XenServerPatch(string uuid, string name, string description, string guidance, string guidance_mandatory, string version, string url,
string patchUrl, string timestamp, string priority, string installationSize, List<string> conflictingPatches, List<string> requiredPatches)
: this(uuid, name, description, guidance, version, url, patchUrl, timestamp, priority, installationSize)
: this(uuid, name, description, guidance, guidance_mandatory, version, url, patchUrl, timestamp, priority, installationSize)
{
ConflictingPatches = conflictingPatches;
RequiredPatches = requiredPatches;
}
@ -86,7 +92,43 @@ namespace XenAdmin.Core
public bool Equals(XenServerPatch other)
{
if (other == null)
return false;
return string.Equals(Uuid, other.Uuid, StringComparison.OrdinalIgnoreCase);
}
public after_apply_guidance after_apply_guidance
{
get
{
switch (Guidance)
{
case "restartHVM":
return after_apply_guidance.restartHVM;
case "restartPV":
return after_apply_guidance.restartPV;
case "restartHost":
return after_apply_guidance.restartHost;
case "restartXAPI":
return after_apply_guidance.restartXAPI;
default:
return after_apply_guidance.unknown;
}
}
}
public bool GuidanceMandatory
{
get
{
return !string.IsNullOrEmpty(Guidance_mandatory) && this.Guidance_mandatory.ToLowerInvariant().Contains("true");
}
}
}
}

View File

@ -31,9 +31,11 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
namespace XenAdmin.Core
{
[DebuggerDisplay("XenServerVersion (Name={Name}; Patches.Count={Patches.Count}; MinimalPatches.Count={MinimalPatches.Count})")]
public class XenServerVersion
{
public Version Version;
@ -42,11 +44,29 @@ namespace XenAdmin.Core
public string Url;
public string Oem;
public List<XenServerPatch> Patches;
/// <summary>
/// A host of this version is considered up-to-date when it has all the patches in this list installed on it
/// <value>null</value> means that the list is not known (batch updates/automatic updating is not supported)
/// </summary>
public List<XenServerPatch> MinimalPatches;
public DateTime TimeStamp;
public const string UpdateRoot = @"http://updates.xensource.com";
public string BuildNumber;
public XenServerVersion(string version_oem, string name, bool latest, string url, List<XenServerPatch> patches,
/// <summary>
/// Defines metadata for a XenServer version
/// </summary>
/// <param name="version_oem"></param>
/// <param name="name"></param>
/// <param name="latest"></param>
/// <param name="url"></param>
/// <param name="patches"></param>
/// <param name="minimumPatches">can be null (see <paramref name="MinimalPatches"/></param>
/// <param name="timestamp"></param>
/// <param name="buildNumber"></param>
public XenServerVersion(string version_oem, string name, bool latest, string url, List<XenServerPatch> patches, List<XenServerPatch> minimumPatches,
string timestamp, string buildNumber)
{
ParseVersion(version_oem);
@ -56,6 +76,7 @@ namespace XenAdmin.Core
url = UpdateRoot + url;
Url = url;
Patches = patches;
MinimalPatches = minimumPatches;
DateTime.TryParse(timestamp, out TimeStamp);
BuildNumber = buildNumber;
}

View File

@ -30,6 +30,7 @@
*/
using System;
using System.Linq;
using XenAPI;
@ -41,16 +42,15 @@ namespace XenAdmin.Actions
public class InstallPVToolsAction : AsyncAction
{
private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
private readonly Action _xsToolsNotFound;
private readonly bool _searchHiddenIsOs;
public InstallPVToolsAction(VM vm, Action xsToolsNotfound, bool searchHiddenISOs)
public InstallPVToolsAction(VM vm, bool searchHiddenISOs)
: base(vm.Connection, string.Format(Messages.INSTALLTOOLS_TITLE, vm.Name))
{
VM = vm;
_xsToolsNotFound = xsToolsNotfound;
_searchHiddenIsOs = searchHiddenISOs;
#region RBAC Dependencies
#region RBAC Dependencies
foreach (SR sr in VM.Connection.Cache.SRs)
{
if (sr.IsToolsSR && sr.IsBroken())
@ -63,7 +63,7 @@ namespace XenAdmin.Actions
ApiMethodsToRoleCheck.Add("vbd.eject");
ApiMethodsToRoleCheck.Add("vbd.insert");
ApiMethodsToRoleCheck.AddRange(Role.CommonSessionApiList);
#endregion
#endregion
}
protected override void Run()
@ -75,12 +75,12 @@ namespace XenAdmin.Actions
{
try
{
SrRepairAction action = new SrRepairAction(sr.Connection, sr,false);
SrRepairAction action = new SrRepairAction(sr.Connection, sr, false);
action.RunExternal(Session);
}
catch (Failure)
catch (Failure f)
{
_xsToolsNotFound();
throw new Failure(Messages.XS_TOOLS_SR_NOT_FOUND, f);
}
}
@ -98,17 +98,14 @@ namespace XenAdmin.Actions
XenAPI.VBD cdrom = VM.FindVMCDROM();
if (cdrom == null)
{
Description = Messages.INSTALLTOOLS_COULDNOTFIND_CD;
return;
throw new Failure(Messages.INSTALLTOOLS_COULDNOTFIND_CD);
}
// Find the tools ISO...
XenAPI.VDI winIso = findWinISO(_searchHiddenIsOs);
if (winIso == null)
{
// Could not find the windows PV drivers ISO.
Description = Messages.INSTALLTOOLS_COULDNOTFIND_WIN;
return;
throw new Failure(Messages.INSTALLTOOLS_COULDNOTFIND_WIN);
}
Description = Messages.INSTALLTOOLS_STARTING;
@ -122,7 +119,7 @@ namespace XenAdmin.Actions
// Insert the tools ISO...
XenAPI.VBD.insert(Session, cdrom.opaque_ref, winIso.opaque_ref);
// done(ish)...
// done here; installation continues on the VM
Description = Messages.INSTALLTOOLS_DONE;
}
@ -134,11 +131,10 @@ namespace XenAdmin.Actions
{
if (XenAPI.SR.SRTypes.iso.ToString() == sr.content_type)
{
foreach (VDI vdi in Connection.ResolveAllShownXenModelObjects(sr.VDIs, searchHiddenISOs))
{
if (vdi.IsToolsIso)
return vdi;
}
var vdis = Connection.ResolveAllShownXenModelObjects(sr.VDIs, searchHiddenISOs);
var vdi = vdis.FirstOrDefault(v => v.IsToolsIso);
if (vdi != null)
return vdi;
}
}

View File

@ -1,7 +1,7 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
// Runtime Version:4.0.30319.34209
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
@ -2652,6 +2652,15 @@ namespace XenAdmin {
}
}
/// <summary>
/// Looks up a localized string similar to Required Updates.
/// </summary>
public static string Label_Pool_patch_required_updates {
get {
return ResourceManager.GetString("Label-Pool_patch.required-updates", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Disk space allocations.
/// </summary>
@ -4059,7 +4068,7 @@ namespace XenAdmin {
}
/// <summary>
/// Looks up a localized string similar to Pool &apos;{0}&apos; failed to retrieve placement recommendations from WLB for VM &apos;{1}&apos;..
/// Looks up a localized string similar to Pool &apos;{0}&apos; failed to retrieve placement recommendations from WLB for &apos;{1}&apos;..
/// </summary>
public static string Message_body_wlb_consultation_failed {
get {

View File

@ -1859,6 +1859,9 @@
<data name="Label-host.edition-standard" xml:space="preserve">
<value>[Citrix] [XenServer product] Standard Edition</value>
</data>
<data name="Label-Pool_patch.required-updates" xml:space="preserve">
<value>Required Updates</value>
</data>
<data name="Label-SR.SRTypes-nutanix" xml:space="preserve">
<value>Nutanix</value>
</data>

View File

@ -1,7 +1,7 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
// Runtime Version:4.0.30319.34209
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
@ -501,15 +501,6 @@ namespace XenAdmin {
}
}
/// <summary>
/// Looks up a localized string similar to Disable live patching.
/// </summary>
public static string ACTION_DISABLE_LIVE_PATCHING {
get {
return ResourceManager.GetString("ACTION_DISABLE_LIVE_PATCHING", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Disabling .
/// </summary>
@ -528,15 +519,6 @@ namespace XenAdmin {
}
}
/// <summary>
/// Looks up a localized string similar to Disabling live patching for &apos;{0}&apos;.
/// </summary>
public static string ACTION_DISABLING_LIVE_PATCHING {
get {
return ResourceManager.GetString("ACTION_DISABLING_LIVE_PATCHING", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Activated disk....
/// </summary>
@ -825,15 +807,6 @@ namespace XenAdmin {
}
}
/// <summary>
/// Looks up a localized string similar to Enable live patching.
/// </summary>
public static string ACTION_ENABLE_LIVE_PATCHING {
get {
return ResourceManager.GetString("ACTION_ENABLE_LIVE_PATCHING", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Enabling.
/// </summary>
@ -852,15 +825,6 @@ namespace XenAdmin {
}
}
/// <summary>
/// Looks up a localized string similar to Enabling live patching for &apos;{0}&apos;.
/// </summary>
public static string ACTION_ENABLING_LIVE_PATCHING {
get {
return ResourceManager.GetString("ACTION_ENABLING_LIVE_PATCHING", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Export failed due to a block checksum mismatch. Please retry the export..
/// </summary>
@ -2490,6 +2454,15 @@ namespace XenAdmin {
}
}
/// <summary>
/// Looks up a localized string similar to Upload error. The patch was uploaded, but it cannot be found on the host..
/// </summary>
public static string ACTION_UPLOADPATCHTOMASTERPLANACTION_FAILED {
get {
return ResourceManager.GetString("ACTION_UPLOADPATCHTOMASTERPLANACTION_FAILED", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Virtual disk created.
/// </summary>
@ -8607,15 +8580,6 @@ namespace XenAdmin {
}
}
/// <summary>
/// Looks up a localized string similar to Home Server:.
/// </summary>
public static string CPM_SUMMARY_KEY_HOME_SERVER {
get {
return ResourceManager.GetString("CPM_SUMMARY_KEY_HOME_SERVER", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Template:.
/// </summary>
@ -8652,6 +8616,15 @@ namespace XenAdmin {
}
}
/// <summary>
/// Looks up a localized string similar to Target Server:.
/// </summary>
public static string CPM_SUMMARY_KEY_TARGET_SERVER {
get {
return ResourceManager.GetString("CPM_SUMMARY_KEY_TARGET_SERVER", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Migration Network:.
/// </summary>
@ -8779,7 +8752,7 @@ namespace XenAdmin {
}
/// <summary>
/// Looks up a localized string similar to Specify a &amp;home server in the destination pool (optional):.
/// Looks up a localized string similar to Specify a &amp;target server in the destination pool (optional):.
/// </summary>
public static string CPM_WIZARD_DESTINATION_TABLE_INTRO {
get {
@ -24981,6 +24954,15 @@ namespace XenAdmin {
}
}
/// <summary>
/// Looks up a localized string similar to There is not enough space to automatically update &apos;{0}&apos;..
/// </summary>
public static string NOT_ENOUGH_SPACE_MESSAGE_AUTO_UPDATE {
get {
return ResourceManager.GetString("NOT_ENOUGH_SPACE_MESSAGE_AUTO_UPDATE", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Space available: {0}.
/// </summary>
@ -25785,6 +25767,15 @@ namespace XenAdmin {
}
}
/// <summary>
/// Looks up a localized string similar to Running prechecks....
/// </summary>
public static string PATCHING_WIZARD_RUNNING_PRECHECKS {
get {
return ResourceManager.GetString("PATCHING_WIZARD_RUNNING_PRECHECKS", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Unable to resolve this issue:\n{0}\n\nPlease resolve this issue manually and then click Check Again.
///.
@ -25813,6 +25804,60 @@ namespace XenAdmin {
}
}
/// <summary>
/// Looks up a localized string similar to Update process was not completed successfully..
/// </summary>
public static string PATCHINGWIZARD_AUTOUPDATINGPAGE_ERROR {
get {
return ResourceManager.GetString("PATCHINGWIZARD_AUTOUPDATINGPAGE_ERROR", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Following error occurred while automatic upgrade was in progress: .
/// </summary>
public static string PATCHINGWIZARD_AUTOUPDATINGPAGE_ERROR_OCCURRED {
get {
return ResourceManager.GetString("PATCHINGWIZARD_AUTOUPDATINGPAGE_ERROR_OCCURRED", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Following errors occurred while automatic upgrade was in progress:.
/// </summary>
public static string PATCHINGWIZARD_AUTOUPDATINGPAGE_ERRORS_OCCURRED {
get {
return ResourceManager.GetString("PATCHINGWIZARD_AUTOUPDATINGPAGE_ERRORS_OCCURRED", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Update was not completed successfully.
/// </summary>
public static string PATCHINGWIZARD_AUTOUPDATINGPAGE_FAILED {
get {
return ResourceManager.GetString("PATCHINGWIZARD_AUTOUPDATINGPAGE_FAILED", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Upload and Install.
/// </summary>
public static string PATCHINGWIZARD_AUTOUPDATINGPAGE_TEXT {
get {
return ResourceManager.GetString("PATCHINGWIZARD_AUTOUPDATINGPAGE_TEXT", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Automatically uploading and installing updates.
/// </summary>
public static string PATCHINGWIZARD_AUTOUPDATINGPAGE_TITLE {
get {
return ResourceManager.GetString("PATCHINGWIZARD_AUTOUPDATINGPAGE_TITLE", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Clean up....
/// </summary>
@ -25822,6 +25867,33 @@ namespace XenAdmin {
}
}
/// <summary>
/// Looks up a localized string similar to Downloading update {0}....
/// </summary>
public static string PATCHINGWIZARD_DOWNLOADUPDATE_ACTION_TITLE_DOWNLOADING {
get {
return ResourceManager.GetString("PATCHINGWIZARD_DOWNLOADUPDATE_ACTION_TITLE_DOWNLOADING", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Skipping download: Already downloaded update {0}....
/// </summary>
public static string PATCHINGWIZARD_DOWNLOADUPDATE_ACTION_TITLE_SKIPPING {
get {
return ResourceManager.GetString("PATCHINGWIZARD_DOWNLOADUPDATE_ACTION_TITLE_SKIPPING", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Waiting to download update {0}....
/// </summary>
public static string PATCHINGWIZARD_DOWNLOADUPDATE_ACTION_TITLE_WAITING {
get {
return ResourceManager.GetString("PATCHINGWIZARD_DOWNLOADUPDATE_ACTION_TITLE_WAITING", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to No action required.
/// </summary>
@ -26047,6 +26119,15 @@ namespace XenAdmin {
}
}
/// <summary>
/// Looks up a localized string similar to Checking disk space requirements.
/// </summary>
public static string PATCHINGWIZARD_PRECHECKPAGE_CHECKING_DISK_SPACE {
get {
return ResourceManager.GetString("PATCHINGWIZARD_PRECHECKPAGE_CHECKING_DISK_SPACE", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Prechecks failed..
/// </summary>
@ -26065,6 +26146,15 @@ namespace XenAdmin {
}
}
/// <summary>
/// Looks up a localized string similar to Prechecks are performed to verify that the automatic update can proceed..
/// </summary>
public static string PATCHINGWIZARD_PRECHECKPAGE_FIRSTLINE_AUTOMATIC_MODE {
get {
return ResourceManager.GetString("PATCHINGWIZARD_PRECHECKPAGE_FIRSTLINE_AUTOMATIC_MODE", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Update prechecks are performed to verify that the selected update can be applied to the servers..
/// </summary>
@ -26146,6 +26236,24 @@ namespace XenAdmin {
}
}
/// <summary>
/// Looks up a localized string similar to Automatic update is not supported on this [XenServer] version.
/// </summary>
public static string PATCHINGWIZARD_SELECTSERVERPAGE_AUTO_UPDATE_NOT_SUPPORTED_HOST_VERSION {
get {
return ResourceManager.GetString("PATCHINGWIZARD_SELECTSERVERPAGE_AUTO_UPDATE_NOT_SUPPORTED_HOST_VERSION", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Automatic update is not supported on partially upgraded [XenServer] pools.
/// </summary>
public static string PATCHINGWIZARD_SELECTSERVERPAGE_AUTO_UPDATE_NOT_SUPPORTED_PARTIALLY_UPGRADED {
get {
return ResourceManager.GetString("PATCHINGWIZARD_SELECTSERVERPAGE_AUTO_UPDATE_NOT_SUPPORTED_PARTIALLY_UPGRADED", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Cannot install supplemental packs on this [XenServer] version.
/// </summary>
@ -26164,6 +26272,15 @@ namespace XenAdmin {
}
}
/// <summary>
/// Looks up a localized string similar to This server is not licensed for automatic updating.
/// </summary>
public static string PATCHINGWIZARD_SELECTSERVERPAGE_HOST_UNLICENSED_FOR_BATCH_UPDATING {
get {
return ResourceManager.GetString("PATCHINGWIZARD_SELECTSERVERPAGE_HOST_UNLICENSED_FOR_BATCH_UPDATING", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Update already applied.
/// </summary>
@ -26191,6 +26308,24 @@ namespace XenAdmin {
}
}
/// <summary>
/// Looks up a localized string similar to This server cannot be updated automatically.
/// </summary>
public static string PATCHINGWIZARD_SELECTSERVERPAGE_SERVER_NOT_AUTO_UPGRADABLE {
get {
return ResourceManager.GetString("PATCHINGWIZARD_SELECTSERVERPAGE_SERVER_NOT_AUTO_UPGRADABLE", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to This server is already up-to-date.
/// </summary>
public static string PATCHINGWIZARD_SELECTSERVERPAGE_SERVER_UP_TO_DATE {
get {
return ResourceManager.GetString("PATCHINGWIZARD_SELECTSERVERPAGE_SERVER_UP_TO_DATE", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Select Servers.
/// </summary>
@ -26209,6 +26344,35 @@ namespace XenAdmin {
}
}
/// <summary>
/// Looks up a localized string similar to Select one or more pools or standalone hosts that you want to have automatically updated.
///Greyed out servers cannot be updated automatically..
/// </summary>
public static string PATCHINGWIZARD_SELECTSERVERPAGGE_RUBRIC_AUTOMATIC_MODE {
get {
return ResourceManager.GetString("PATCHINGWIZARD_SELECTSERVERPAGGE_RUBRIC_AUTOMATIC_MODE", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Select one or more servers from the list of available servers.
///Servers where the selected update cannot be applied appear disabled in this list..
/// </summary>
public static string PATCHINGWIZARD_SELECTSERVERPAGGE_RUBRIC_DEFAULT {
get {
return ResourceManager.GetString("PATCHINGWIZARD_SELECTSERVERPAGGE_RUBRIC_DEFAULT", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Automatic update has finished..
/// </summary>
public static string PATCHINGWIZARD_UPDATES_DONE_AUTOMATIC_MODE {
get {
return ResourceManager.GetString("PATCHINGWIZARD_UPDATES_DONE_AUTOMATIC_MODE", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to [XenCenter] is now downloading your update and uploading it to the servers specified in the previous step.
///Please wait for these operations to complete, then click Next to continue with the installation..
@ -28360,6 +28524,15 @@ namespace XenAdmin {
}
}
/// <summary>
/// Looks up a localized string similar to Restore dismissed updates.
/// </summary>
public static string RESTORE_DISMISSED_UPDATES {
get {
return ResourceManager.GetString("RESTORE_DISMISSED_UPDATES", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Backup file loaded to server &apos;{0}&apos;. Refer to the &quot;[XenServer product] Administrator&apos;s Guide&quot; for instructions on how to complete the restore procedure..
/// </summary>
@ -28378,6 +28551,15 @@ namespace XenAdmin {
}
}
/// <summary>
/// Looks up a localized string similar to Restoring....
/// </summary>
public static string RESTORING {
get {
return ResourceManager.GetString("RESTORING", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Restoring server &apos;{0}&apos;.
/// </summary>
@ -29277,6 +29459,15 @@ namespace XenAdmin {
}
}
/// <summary>
/// Looks up a localized string similar to Disk space check.
/// </summary>
public static string SERVER_SIDE_CHECK_AUTO_MODE_DESCRIPTION {
get {
return ResourceManager.GetString("SERVER_SIDE_CHECK_AUTO_MODE_DESCRIPTION", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Server side patch check.
/// </summary>
@ -31335,6 +31526,15 @@ namespace XenAdmin {
}
}
/// <summary>
/// Looks up a localized string similar to Target Server.
/// </summary>
public static string TARGET_SERVER {
get {
return ResourceManager.GetString("TARGET_SERVER", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Tell me more ....
/// </summary>
@ -32986,6 +33186,15 @@ namespace XenAdmin {
}
}
/// <summary>
/// Looks up a localized string similar to Removing update files from {0}....
/// </summary>
public static string UPDATES_WIZARD_REMOVING_UPDATES_FROM_POOL {
get {
return ResourceManager.GetString("UPDATES_WIZARD_REMOVING_UPDATES_FROM_POOL", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Click here to repair.
/// </summary>

View File

@ -264,18 +264,12 @@
<data name="ACTION_DETATCHING_MULTIPLE_VDIS_TITLE" xml:space="preserve">
<value>Detaching Multiple Storage Items</value>
</data>
<data name="ACTION_DISABLE_LIVE_PATCHING" xml:space="preserve">
<value>Disable live patching</value>
</data>
<data name="ACTION_DISABLE_VM_ENLIGHTENMENT_DESCRIPTION" xml:space="preserve">
<value>Disabling </value>
</data>
<data name="ACTION_DISABLE_VM_ENLIGHTENMENT_TITLE" xml:space="preserve">
<value>Disable container management on VM '{0}'</value>
</data>
<data name="ACTION_DISABLING_LIVE_PATCHING" xml:space="preserve">
<value>Disabling live patching for '{0}'</value>
</data>
<data name="ACTION_DISK_ACTIVATED" xml:space="preserve">
<value>Activated disk...</value>
</data>
@ -372,18 +366,12 @@
<data name="ACTION_DR_TASK_DESTROY_TITLE" xml:space="preserve">
<value>DR cleanup ({0})</value>
</data>
<data name="ACTION_ENABLE_LIVE_PATCHING" xml:space="preserve">
<value>Enable live patching</value>
</data>
<data name="ACTION_ENABLE_VM_ENLIGHTENMENT_DESCRIPTION" xml:space="preserve">
<value>Enabling</value>
</data>
<data name="ACTION_ENABLE_VM_ENLIGHTENMENT_TITLE" xml:space="preserve">
<value>Enable container management on VM '{0}'</value>
</data>
<data name="ACTION_ENABLING_LIVE_PATCHING" xml:space="preserve">
<value>Enabling live patching for '{0}'</value>
</data>
<data name="ACTION_EXPORT_DESCRIPTION_BLOCK_CHECKSUM_FAILED" xml:space="preserve">
<value>Export failed due to a block checksum mismatch. Please retry the export.</value>
</data>
@ -918,6 +906,9 @@
<data name="ACTION_UPDATE_INTEGRATED_GPU_PASSTHROUGH_TITLE" xml:space="preserve">
<value>Updating integrated GPU passthrough on '{0}'</value>
</data>
<data name="ACTION_UPLOADPATCHTOMASTERPLANACTION_FAILED" xml:space="preserve">
<value>Upload error. The patch was uploaded, but it cannot be found on the host.</value>
</data>
<data name="ACTION_UPLOAD_SERVER_STATUS_REPORT" xml:space="preserve">
<value>Upload server status report to [Citrix] Insight Services</value>
</data>
@ -3122,9 +3113,6 @@ You can only connect to a single [Citrix] [XenServer product] Express Edition se
<data name="CPM_SUMMARY_KEY_DESTINATION" xml:space="preserve">
<value>Destination:</value>
</data>
<data name="CPM_SUMMARY_KEY_HOME_SERVER" xml:space="preserve">
<value>Home Server:</value>
</data>
<data name="CPM_SUMMARY_KEY_MIGRATE_TEMPLATE" xml:space="preserve">
<value>Template:</value>
</data>
@ -3137,6 +3125,9 @@ You can only connect to a single [Citrix] [XenServer product] Express Edition se
<data name="CPM_SUMMARY_KEY_STORAGE" xml:space="preserve">
<value>Storage:</value>
</data>
<data name="CPM_SUMMARY_KEY_TARGET_SERVER" xml:space="preserve">
<value>Target Server:</value>
</data>
<data name="CPM_SUMMARY_KEY_TRANSFER_NETWORK" xml:space="preserve">
<value>Migration Network:</value>
</data>
@ -3177,7 +3168,7 @@ You can only connect to a single [Citrix] [XenServer product] Express Edition se
<value>Select the pool or standalone server where you want to migrate the selected VM to.</value>
</data>
<data name="CPM_WIZARD_DESTINATION_TABLE_INTRO" xml:space="preserve">
<value>Specify a &amp;home server in the destination pool (optional):</value>
<value>Specify a &amp;target server in the destination pool (optional):</value>
</data>
<data name="CPM_WIZARD_DESTINATION_TAB_TITLE" xml:space="preserve">
<value>Destination Pool</value>
@ -8698,6 +8689,9 @@ It is strongly recommended that you Cancel and apply the latest version of the p
<data name="NOT_ENOUGH_SPACE_DESCRIPTION" xml:space="preserve">
<value>This host does not have enough disk space to install this update</value>
</data>
<data name="NOT_ENOUGH_SPACE_MESSAGE_AUTO_UPDATE" xml:space="preserve">
<value>There is not enough space to automatically update '{0}'.</value>
</data>
<data name="NOT_ENOUGH_SPACE_MESSAGE_AVAILABLE_SPACE" xml:space="preserve">
<value>Space available: {0}</value>
</data>
@ -8934,9 +8928,36 @@ However, there is not enough space to perform the repartitioning, so the current
<data name="PASTE" xml:space="preserve">
<value>Paste</value>
</data>
<data name="PATCHINGWIZARD_AUTOUPDATINGPAGE_ERROR" xml:space="preserve">
<value>Update process was not completed successfully.</value>
</data>
<data name="PATCHINGWIZARD_AUTOUPDATINGPAGE_ERRORS_OCCURRED" xml:space="preserve">
<value>Following errors occurred while automatic upgrade was in progress:</value>
</data>
<data name="PATCHINGWIZARD_AUTOUPDATINGPAGE_ERROR_OCCURRED" xml:space="preserve">
<value>Following error occurred while automatic upgrade was in progress: </value>
</data>
<data name="PATCHINGWIZARD_AUTOUPDATINGPAGE_FAILED" xml:space="preserve">
<value>Update was not completed successfully</value>
</data>
<data name="PATCHINGWIZARD_AUTOUPDATINGPAGE_TEXT" xml:space="preserve">
<value>Upload and Install</value>
</data>
<data name="PATCHINGWIZARD_AUTOUPDATINGPAGE_TITLE" xml:space="preserve">
<value>Automatically uploading and installing updates</value>
</data>
<data name="PATCHINGWIZARD_CLEANUP" xml:space="preserve">
<value>Clean up...</value>
</data>
<data name="PATCHINGWIZARD_DOWNLOADUPDATE_ACTION_TITLE_DOWNLOADING" xml:space="preserve">
<value>Downloading update {0}...</value>
</data>
<data name="PATCHINGWIZARD_DOWNLOADUPDATE_ACTION_TITLE_SKIPPING" xml:space="preserve">
<value>Skipping download: Already downloaded update {0}...</value>
</data>
<data name="PATCHINGWIZARD_DOWNLOADUPDATE_ACTION_TITLE_WAITING" xml:space="preserve">
<value>Waiting to download update {0}...</value>
</data>
<data name="PATCHINGWIZARD_MODEPAGE_NOACTION" xml:space="preserve">
<value>No action required</value>
</data>
@ -9012,12 +9033,18 @@ However, there is not enough space to perform the repartitioning, so the current
<data name="PATCHINGWIZARD_PATCHINGPAGE_TITLE" xml:space="preserve">
<value>Install the update</value>
</data>
<data name="PATCHINGWIZARD_PRECHECKPAGE_CHECKING_DISK_SPACE" xml:space="preserve">
<value>Checking disk space requirements</value>
</data>
<data name="PATCHINGWIZARD_PRECHECKPAGE_FAILED" xml:space="preserve">
<value>Prechecks failed.</value>
</data>
<data name="PATCHINGWIZARD_PRECHECKPAGE_FIRSTLINE" xml:space="preserve">
<value>Update prechecks are performed to verify that the update "{0}" can be applied to the servers.</value>
</data>
<data name="PATCHINGWIZARD_PRECHECKPAGE_FIRSTLINE_AUTOMATIC_MODE" xml:space="preserve">
<value>Prechecks are performed to verify that the automatic update can proceed.</value>
</data>
<data name="PATCHINGWIZARD_PRECHECKPAGE_FIRSTLINE_NO_PATCH_NAME" xml:space="preserve">
<value>Update prechecks are performed to verify that the selected update can be applied to the servers.</value>
</data>
@ -9045,12 +9072,21 @@ However, there is not enough space to perform the repartitioning, so the current
<data name="PATCHINGWIZARD_SELECTPATCHPAGE_UPDATESEXT" xml:space="preserve">
<value>[XenServer] Updates and Supplemental Packs (*.{0}, *.iso)|*.{0};*.iso</value>
</data>
<data name="PATCHINGWIZARD_SELECTSERVERPAGE_AUTO_UPDATE_NOT_SUPPORTED_HOST_VERSION" xml:space="preserve">
<value>Automatic update is not supported on this [XenServer] version</value>
</data>
<data name="PATCHINGWIZARD_SELECTSERVERPAGE_AUTO_UPDATE_NOT_SUPPORTED_PARTIALLY_UPGRADED" xml:space="preserve">
<value>Automatic update is not supported on partially upgraded [XenServer] pools</value>
</data>
<data name="PATCHINGWIZARD_SELECTSERVERPAGE_CANNOT_INSTALL_SUPP_PACKS" xml:space="preserve">
<value>Cannot install supplemental packs on this [XenServer] version</value>
</data>
<data name="PATCHINGWIZARD_SELECTSERVERPAGE_HOST_UNLICENSED" xml:space="preserve">
<value>Subscription Advantage required</value>
</data>
<data name="PATCHINGWIZARD_SELECTSERVERPAGE_HOST_UNLICENSED_FOR_BATCH_UPDATING" xml:space="preserve">
<value>This server is not licensed for automatic updating</value>
</data>
<data name="PATCHINGWIZARD_SELECTSERVERPAGE_PATCHING_FORBIDDEN" xml:space="preserve">
<value>You cannot apply updates using [XenCenter].</value>
</data>
@ -9060,12 +9096,29 @@ However, there is not enough space to perform the repartitioning, so the current
<data name="PATCHINGWIZARD_SELECTSERVERPAGE_PATCH_NOT_APPLICABLE" xml:space="preserve">
<value>Update not applicable</value>
</data>
<data name="PATCHINGWIZARD_SELECTSERVERPAGE_SERVER_NOT_AUTO_UPGRADABLE" xml:space="preserve">
<value>This server cannot be updated automatically</value>
</data>
<data name="PATCHINGWIZARD_SELECTSERVERPAGE_SERVER_UP_TO_DATE" xml:space="preserve">
<value>This server is already up-to-date</value>
</data>
<data name="PATCHINGWIZARD_SELECTSERVERPAGE_TEXT" xml:space="preserve">
<value>Select Servers</value>
</data>
<data name="PATCHINGWIZARD_SELECTSERVERPAGE_TITLE" xml:space="preserve">
<value>Select the servers you wish to update</value>
</data>
<data name="PATCHINGWIZARD_SELECTSERVERPAGGE_RUBRIC_AUTOMATIC_MODE" xml:space="preserve">
<value>Select one or more pools or standalone hosts that you want to have automatically updated.
Greyed out servers cannot be updated automatically.</value>
</data>
<data name="PATCHINGWIZARD_SELECTSERVERPAGGE_RUBRIC_DEFAULT" xml:space="preserve">
<value>Select one or more servers from the list of available servers.
Servers where the selected update cannot be applied appear disabled in this list.</value>
</data>
<data name="PATCHINGWIZARD_UPDATES_DONE_AUTOMATIC_MODE" xml:space="preserve">
<value>Automatic update has finished.</value>
</data>
<data name="PATCHINGWIZARD_UPLOADPAGE_MESSAGE_DOWNLOAD_AND_UPLOAD" xml:space="preserve">
<value>[XenCenter] is now downloading your update and uploading it to the servers specified in the previous step.
Please wait for these operations to complete, then click Next to continue with the installation.</value>
@ -9104,6 +9157,9 @@ Please wait for this operation to complete, then click Next to continue with the
<data name="PATCHING_WIZARD_PRECHECK_STATUS" xml:space="preserve">
<value>{0} ...</value>
</data>
<data name="PATCHING_WIZARD_RUNNING_PRECHECKS" xml:space="preserve">
<value>Running prechecks...</value>
</data>
<data name="PATCHING_WIZARD_SOLVE_MANUALLY" xml:space="preserve">
<value>Unable to resolve this issue:\n{0}\n\nPlease resolve this issue manually and then click Check Again.
</value>
@ -9881,12 +9937,18 @@ Click Server Status Report to open the Compile Server Status Report Wizard or cl
<data name="RESOLVED_AS" xml:space="preserve">
<value>Resolved as {0}</value>
</data>
<data name="RESTORE_DISMISSED_UPDATES" xml:space="preserve">
<value>Restore dismissed updates</value>
</data>
<data name="RESTORE_FROM_BACKUP_FINALIZE" xml:space="preserve">
<value>Backup file loaded to server '{0}'. Refer to the "[XenServer product] Administrator's Guide" for instructions on how to complete the restore procedure.</value>
</data>
<data name="RESTORE_HOST" xml:space="preserve">
<value>Restore From Backup...</value>
</data>
<data name="RESTORING" xml:space="preserve">
<value>Restoring...</value>
</data>
<data name="RESTORING_HOST" xml:space="preserve">
<value>Restoring server '{0}'</value>
</data>
@ -10207,6 +10269,9 @@ The master must be upgraded first, so if you skip the master, the rolling pool u
<data name="SERVER_REQUEST_IN_PROGRESS" xml:space="preserve">
<value>A server request is in progress</value>
</data>
<data name="SERVER_SIDE_CHECK_AUTO_MODE_DESCRIPTION" xml:space="preserve">
<value>Disk space check</value>
</data>
<data name="SERVER_SIDE_CHECK_DESCRIPTION" xml:space="preserve">
<value>Server side patch check</value>
</data>
@ -10885,6 +10950,9 @@ Refer to the "[XenServer product] Administrator's Guide" for instructions on how
<data name="TARGET" xml:space="preserve">
<value>Target</value>
</data>
<data name="TARGET_SERVER" xml:space="preserve">
<value>Target Server</value>
</data>
<data name="TELL_ME_MORE" xml:space="preserve">
<value>Tell me more ...</value>
</data>
@ -11408,6 +11476,9 @@ Check your settings and try again.</value>
<data name="UPDATES_WIZARD_REMOVING_UPDATE" xml:space="preserve">
<value>Deleting update installation file {0} from {1}... </value>
</data>
<data name="UPDATES_WIZARD_REMOVING_UPDATES_FROM_POOL" xml:space="preserve">
<value>Removing update files from {0}...</value>
</data>
<data name="UPDATES_WIZARD_REPAIR_SR" xml:space="preserve">
<value>Click here to repair</value>
</data>

View File

@ -1932,10 +1932,7 @@ namespace XenAdmin.Network
public List<VDI> ResolveAllShownXenModelObjects(List<XenRef<VDI>> xenRefs, bool showHiddenObjects)
{
List<VDI> result = ResolveAll(xenRefs);
result.RemoveAll(delegate(VDI vdi)
{
return !vdi.Show(showHiddenObjects);
});
result.RemoveAll(vdi => !vdi.Show(showHiddenObjects));
return result;
}

View File

@ -246,6 +246,16 @@ namespace XenAPI
return h._RestrictHotfixApply;
}
private bool _RestrictBatchHotfixApply
{
get { return BoolKeyPreferTrue(license_params, "restrict_batch_hotfix_apply"); }
}
public static bool RestrictBatchHotfixApply(Host h)
{
return h._RestrictBatchHotfixApply;
}
private bool _RestrictCheckpoint
{
get { return BoolKeyPreferTrue(license_params, "restrict_checkpoint"); }
@ -521,16 +531,6 @@ namespace XenAPI
return h._RestrictSslLegacySwitch;
}
private bool _RestrictLivePatching
{
get { return BoolKeyPreferTrue(license_params, "restrict_live_patching"); }
}
public static bool RestrictLivePatching(Host h)
{
return h._RestrictLivePatching;
}
public bool HasPBDTo(SR sr)
{
foreach (XenRef<PBD> pbd in PBDs)

View File

@ -302,20 +302,15 @@ namespace XenAPI
}
/// <summary>
/// Whether this is a Tools ISO. Finds the old method (by name) as well as
/// the new method (field on the VDI).
/// Whether this is a Tools ISO.
/// The new method is to check the is_tools_iso flag, the old one to check the name_label.
/// </summary>
public bool IsToolsIso
{
get
{
const string ISONameOld = "xswindrivers.iso";
const string ISONameNew = "xs-tools.iso";
return
is_tools_iso ||
ISONameOld.Equals(name_label) ||
ISONameNew.Equals(name_label);
string[] toolIsoNames = {"xswindrivers.iso", "xs-tools.iso", "guest-tools.iso"};
return is_tools_iso || toolIsoNames.Contains(name_label);
}
}