/* 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.Windows.Forms;
using XenAPI;
using XenAdmin.Core;
using XenAdmin.Network;
using XenAdmin.Controls;
using XenAdmin.Dialogs;
using System.Drawing;
namespace XenAdmin.Wizards.NewVMWizard
{
public partial class Page_Networking : XenTabPage
{
///
/// This value is then the lowest possible upper bound for the number of networks on a new vm created from a default template. We only do this for default templates, as custom templates can be tweaked (install tools) for higher values. (See CA-31800)
///
private static int MAX_NETWORKS_FOR_DEFAULT_TEMPLATES = 4;
private VM Template;
private string VmName;
public Page_Networking()
{
InitializeComponent();
}
public override string Text
{
get { return Messages.NEWVMWIZARD_NETWORKINGPAGE_NAME; }
}
public override string PageTitle
{
get { return Messages.NEWVMWIZARD_NETWORKINGPAGE_TITLE; }
}
public override string HelpID
{
get { return "Networking"; }
}
public override bool EnableNext()
{
return true;
}
public override void PageLoaded(PageLoadedDirection direction)
{
base.PageLoaded(direction);
VM template = SelectedTemplate;
string vmName = SelectedName;
if (Template == template && VmName == vmName)
return;
Template = template;
VmName = vmName;
panelDefaultTemplateInfo.Visible = Template.DefaultTemplate;
BoxTitle.Text = string.Format(Messages.NEWVMWIZARD_NETWORKINGPAGE_VIFSON, VmName);//CA-56794 Helpers.TrimStringIfRequired(VmName, 50));
LoadNetworks();
if (NetworksGridView.Rows.Count > 0)
NetworksGridView.Rows[0].Selected = true;
UpdateEnablement();
NetworksGridView.Select();
}
public VM SelectedTemplate { private get; set; }
public string SelectedName { private get; set; }
private void UpdateEnablement()
{
// limiting the number of Vifs allowed to 4 on creation for default templates
if (NetworksGridView.Rows.Count > Template.MaxVIFsAllowed)
{
toolTipContainerAddButton.SetToolTip(Messages.TOOLTIP_MAX_NETWORKS_FROM_TEMPLATE);
AddButton.Enabled = false;
}
else if (Template.DefaultTemplate && NetworksGridView.Rows.Count >= MAX_NETWORKS_FOR_DEFAULT_TEMPLATES)
{
toolTipContainerAddButton.SetToolTip(string.Format(Messages.TOOLTIP_MAX_NETWORKS_FROM_DEFAULT_TEMPLATE, MAX_NETWORKS_FOR_DEFAULT_TEMPLATES));
AddButton.Enabled = false;
}
else
{
AddButton.Enabled = true;
toolTipContainerAddButton.RemoveAll();
}
PropertiesButton.Enabled = NetworksGridView.SelectedRows.Count > 0;
DeleteButton.Enabled = NetworksGridView.SelectedRows.Count > 0;
OnPageUpdated();
}
private void LoadNetworks()
{
NetworksGridView.Rows.Clear();
if (Template.DefaultTemplate)
{
// we add all default networks
List networks = new List(Connection.Cache.Networks);
networks.Sort();
foreach (XenAPI.Network network in networks)
{
if (!network.AutoPlug || !network.Show(Properties.Settings.Default.ShowHiddenVMs) || network.IsSlave)
continue;
if (NetworksGridView.Rows.Count < MAX_NETWORKS_FOR_DEFAULT_TEMPLATES)
NetworksGridView.Rows.Add(new NetworkListViewItem(Connection, network, NetworksGridView.Rows.Count));
else
break;
}
}
else
{
// we add all the templates networks
List vifs = Connection.ResolveAll(Template.VIFs);
vifs.Sort();
foreach (VIF vif in vifs)
NetworksGridView.Rows.Add(new NetworkListViewItem(Connection, vif, NetworksGridView.Rows.Count, false));
}
}
private void AddButton_Click(object sender, EventArgs e)
{
VIFDialog dialog = new VIFDialog(Connection, null, NetworksGridView.Rows.Count);
if (dialog.ShowDialog() != DialogResult.OK)
return;
NetworksGridView.Rows.Add(new NetworkListViewItem(Connection, dialog.NewVif(), NetworksGridView.Rows.Count, true));
UpdateEnablement();
}
private void DeleteButton_Click(object sender, EventArgs e)
{
if (NetworksGridView.SelectedRows.Count <= 0)
return;
NetworksGridView.Rows.Remove(NetworksGridView.SelectedRows[0]);
UpdateEnablement();
}
private void PropertiesButton_Click(object sender, EventArgs e)
{
if (NetworksGridView.SelectedRows.Count <= 0)
return;
NetworkListViewItem selectedItem = ((NetworkListViewItem)NetworksGridView.SelectedRows[0]);
VIFDialog dialog = new VIFDialog(Connection, selectedItem.Vif, selectedItem.Index);
if (dialog.ShowDialog() != DialogResult.OK)
return;
selectedItem.Vif = dialog.NewVif();
selectedItem.UpdateDetails();
UpdateEnablement();
}
public override List> PageSummary
{
get
{
List> sum = new List>();
int i = 0;
foreach (VIF v in SelectedVifs)
{
sum.Add(new KeyValuePair(string.Format(Messages.NEWVMWIZARD_NETWORKINGPAGE_VIF, i), v.NetworkName()));
i++;
}
return sum;
}
}
public List SelectedVifs
{
get
{
List vifs = new List();
foreach (NetworkListViewItem vif in NetworksGridView.Rows)
{
vifs.Add(vif.Vif);
}
return vifs;
}
}
}
public class NetworkListViewItem : DataGridViewRow
{
public VIF Vif;
private DataGridViewImageCell ImageCell;
private DataGridViewTextBoxCell MacCell;
private DataGridViewTextBoxCell NetworkCell;
public NetworkListViewItem(IXenConnection connection, VIF vif, int index, bool keepMac)
{
Vif = new VIF();
Vif.Connection = connection;
Vif.device = vif.device;
Vif.MAC = keepMac ? vif.MAC : "";
Vif.network = vif.network;
Vif.qos_algorithm_type = vif.qos_algorithm_type;
Vif.qos_algorithm_params = vif.qos_algorithm_params;
CreateCells();
}
public NetworkListViewItem(IXenConnection connection, XenAPI.Network network, int index)
{
Vif = new VIF();
Vif.Connection = connection;
Vif.device = index.ToString();
Vif.network = new XenRef(network.opaque_ref);
CreateCells();
}
private void CreateCells()
{
ImageCell = new DataGridViewImageCell(false);
ImageCell.ValueType = typeof (Image);
MacCell = new DataGridViewTextBoxCell();
NetworkCell = new DataGridViewTextBoxCell();
Cells.AddRange(new DataGridViewCell[] { ImageCell, MacCell, NetworkCell });
UpdateDetails();
}
public void UpdateDetails()
{
ImageCell.Value = Properties.Resources._000_Network_h32bit_16;
MacCell.Value = string.IsNullOrEmpty(Vif.MAC) ? Messages.NEWVMWIZARD_NETWORKINGPAGE_AUTOGEN : Vif.MAC;
NetworkCell.Value = Helpers.GetName(Vif.Connection.Resolve(Vif.network));
}
}
}