mirror of
https://github.com/xcp-ng/xenadmin.git
synced 2024-12-24 19:29:51 +01:00
170 lines
6.9 KiB
C#
170 lines
6.9 KiB
C#
|
/* 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.Linq;
|
|||
|
using System.Windows.Forms;
|
|||
|
using XenAdmin.Commands;
|
|||
|
using XenAdmin.Core;
|
|||
|
using XenAPI;
|
|||
|
|
|||
|
namespace XenAdmin.Dialogs
|
|||
|
{
|
|||
|
public partial class AssignLicenseDialog : XenDialogBase
|
|||
|
{
|
|||
|
private readonly List<IXenObject> xos;
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Initializes a new instance of the <see cref="AssignLicenseDialog"/> class.
|
|||
|
/// </summary>
|
|||
|
/// <param name="hosts">The hosts for which the licensing is to be applied.</param>
|
|||
|
public AssignLicenseDialog(IEnumerable<IXenObject> xos, String firstHost, String firstPort)
|
|||
|
{
|
|||
|
Util.ThrowIfEnumerableParameterNullOrEmpty(xos, "XenObjects");
|
|||
|
this.xos = new List<IXenObject>(xos);
|
|||
|
InitializeComponent();
|
|||
|
licenseServerNameTextBox.TextChanged += licenseServerPortTextBox_TextChanged;
|
|||
|
licenseServerPortTextBox.TextChanged += licenseServerNameTextBox_TextChanged;
|
|||
|
SetOptionsForClearwaterAndNewer();
|
|||
|
UpdateButtonEnablement();
|
|||
|
|
|||
|
// if all the hosts have the same license server details then populate the textboxes.
|
|||
|
List<Host> hosts = CreateHostsList();
|
|||
|
|
|||
|
if (hosts[0].license_server.ContainsKey("address") && hosts[0].license_server.ContainsKey("port") &&
|
|||
|
hosts[0].license_server["address"] != "localhost")
|
|||
|
{
|
|||
|
if (hosts.TrueForAll(delegate(Host h)
|
|||
|
{
|
|||
|
return h.license_server.ContainsKey("address") &&
|
|||
|
h.license_server.ContainsKey("port") &&
|
|||
|
h.license_server["address"] == hosts[0].license_server["address"] &&
|
|||
|
h.license_server["port"] == hosts[0].license_server["port"];
|
|||
|
}))
|
|||
|
{
|
|||
|
licenseServerPortTextBox.Text = hosts[0].license_server["port"];
|
|||
|
licenseServerNameTextBox.Text = hosts[0].license_server["address"];
|
|||
|
}
|
|||
|
}
|
|||
|
else if ((!String.IsNullOrEmpty(firstHost)) && (!String.IsNullOrEmpty(firstPort)))
|
|||
|
{
|
|||
|
licenseServerPortTextBox.Text = firstPort;
|
|||
|
licenseServerNameTextBox.Text = firstHost;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private List<Host> CreateHostsList()
|
|||
|
{
|
|||
|
List<Host> hosts = new List<Host>();
|
|||
|
foreach (IXenObject xenObject in xos)
|
|||
|
{
|
|||
|
if(xenObject is Pool)
|
|||
|
{
|
|||
|
Pool pool = xenObject as Pool;
|
|||
|
hosts.Add(xenObject.Connection.Resolve(pool.master));
|
|||
|
}
|
|||
|
if(xenObject is Host)
|
|||
|
hosts.Add(xenObject as Host);
|
|||
|
}
|
|||
|
return hosts;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Not all license types apply for post-clearwater hosts. Hide them to declutter the UI
|
|||
|
/// </summary>
|
|||
|
private void SetOptionsForClearwaterAndNewer()
|
|||
|
{
|
|||
|
if(xos.TrueForAll(x=> Helpers.ClearwaterOrGreater(x.Connection)))
|
|||
|
{
|
|||
|
platinumRadioButton.Visible = false;
|
|||
|
enterpriseRadioButton.Visible = false;
|
|||
|
advancedRadioButton.Visible = false;
|
|||
|
perSocketRadioButton.Text = String.Format(Messages.PERSOCKET_LICENSES_X_REQUIRED,
|
|||
|
xos.Sum(x => x.Connection.Cache.Hosts.Sum(h=>h.CpuSockets)));
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
perSocketRadioButton.Visible = false;
|
|||
|
advancedRadioButton.Checked = true;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private Host.Edition GetCheckedEdition()
|
|||
|
{
|
|||
|
if (xenDesktopEnterpriseRadioButton.Checked)
|
|||
|
return xos.TrueForAll(x=>Helpers.ClearwaterOrGreater(x.Connection)) ? Host.Edition.XenDesktop : Host.Edition.EnterpriseXD;
|
|||
|
|
|||
|
if (platinumRadioButton.Checked)
|
|||
|
return Host.Edition.Platinum;
|
|||
|
|
|||
|
if (enterpriseRadioButton.Checked)
|
|||
|
return Host.Edition.Enterprise;
|
|||
|
|
|||
|
if(advancedRadioButton.Checked)
|
|||
|
return Host.Edition.Advanced;
|
|||
|
|
|||
|
return Host.Edition.PerSocket;
|
|||
|
}
|
|||
|
|
|||
|
private void okButton_Click(object sender, EventArgs e)
|
|||
|
{
|
|||
|
|
|||
|
ApplyLicenseEditionCommand command = new ApplyLicenseEditionCommand(Program.MainWindow.CommandInterface, xos, GetCheckedEdition(), licenseServerNameTextBox.Text, licenseServerPortTextBox.Text, this);
|
|||
|
|
|||
|
command.Succedded += delegate
|
|||
|
{
|
|||
|
Program.Invoke(this, () =>
|
|||
|
{
|
|||
|
DialogResult = DialogResult.OK;
|
|||
|
Close();
|
|||
|
});
|
|||
|
};
|
|||
|
command.Execute();
|
|||
|
}
|
|||
|
|
|||
|
private void licenseServerPortTextBox_TextChanged(object sender, EventArgs e)
|
|||
|
{
|
|||
|
UpdateButtonEnablement();
|
|||
|
}
|
|||
|
|
|||
|
private void licenseServerNameTextBox_TextChanged(object sender, EventArgs e)
|
|||
|
{
|
|||
|
UpdateButtonEnablement();
|
|||
|
}
|
|||
|
|
|||
|
private void UpdateButtonEnablement()
|
|||
|
{
|
|||
|
okButton.Enabled = licenseServerPortTextBox.Text.Length > 0 && licenseServerNameTextBox.Text.Length > 0 && Util.IsValidPort(licenseServerPortTextBox.Text);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|