/* 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.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using XenAdmin.Wizards.NewNetworkWizard_Pages;
using XenAPI;
using XenAdmin.Core;
using XenAdmin.Actions;
using XenAdmin.Controls;
namespace XenAdmin.Wizards
{
public enum NetworkTypes
{
Internal, // old-style (host-only) private networks
CHIN, // cross-host internal (or private) networks
External,
Bonded
}
public partial class NewNetworkWizard : XenWizardBase
{
private readonly NetWTypeSelect pageNetworkType;
private readonly NetWName pageName;
private readonly NetWDetails pageNetworkDetails;
private readonly NetWBondDetails pageBondDetails;
private readonly NetWChinDetails pageChinDetails;
///
/// May be null.
///
private readonly Pool Pool;
private readonly Host Host;
private NetworkTypes? m_networkType;
///
///
///
///
/// May be null.
/// Never null. In the case of a pool, "host" is set to the master.
public NewNetworkWizard(Network.IXenConnection connection, Pool pool, Host host)
: base(connection)
{
InitializeComponent();
pageNetworkType = new NetWTypeSelect {Banner = Banner};
pageName = new NetWName();
pageNetworkDetails = new NetWDetails();
pageBondDetails = new NetWBondDetails();
pageChinDetails = new NetWChinDetails();
System.Diagnostics.Trace.Assert(host != null);
Pool = pool;
Host = host;
if (Pool != null)
pageBondDetails.SetPool(Pool);
else
pageBondDetails.SetHost(Host);
pageNetworkDetails.Host = host;
pageChinDetails.Host = host;
pageChinDetails.Pool = pool;
AddPage(pageNetworkType);
AddPage(new XenTabPage { Text = "" });
}
protected override void OnShown(EventArgs e)
{
Text = string.Format(Messages.NEWNETWORKWIZARD_TITLE, Helpers.GetName(xenConnection));
base.OnShown(e);
}
protected override void UpdateWizardContent(XenTabPage senderPage)
{
var prevPageType = senderPage.GetType();
if (prevPageType == typeof(NetWTypeSelect))
{
var oldNetworkType = m_networkType;
m_networkType = pageNetworkType.SelectedNetworkType;//value non-null, so safe to cast further below
RemovePagesFrom(1);
if (m_networkType == NetworkTypes.Bonded)
{
AddPage(pageBondDetails);
}
else
{
AddPage(pageName);
pageName.SelectedNetworkType = (NetworkTypes)m_networkType;
if (oldNetworkType != m_networkType)
NotifyNextPagesOfChange(pageName);
if (m_networkType == NetworkTypes.CHIN)
AddPage(pageChinDetails);
else
{
AddPage(pageNetworkDetails);
pageNetworkDetails.SelectedNetworkType = (NetworkTypes)m_networkType;
if (oldNetworkType != m_networkType)
NotifyNextPagesOfChange(pageNetworkDetails);
}
}
}
}
protected override void FinishWizard()
{
NetworkTypes network_type = pageNetworkType.SelectedNetworkType;
if (network_type == NetworkTypes.Bonded)
{
if (!CreateBonded())
{
FinishCanceled();
return;
}
}
else if (network_type == NetworkTypes.CHIN)
{
CreateCHIN();
}
else
{
CreateNonBonded();
}
base.FinishWizard();
}
private bool CreateBonded()
{
BondDetails details = pageBondDetails.Details;
if (details.ShowCreationWarning() == DialogResult.OK)
{
new CreateBondAction(details.Connection, details.BondName, details.BondedPIFs, details.AutoPlug, details.MTU, details.BondMode, details.HashingAlgorithm).RunAsync();
return true;
}
return false;
}
private void CreateCHIN()
{
XenAPI.Network network = PopulateNewNetworkObj();
XenAPI.Network theInterface = pageChinDetails.SelectedInterface;
(new CreateChinAction(xenConnection, network, theInterface)).RunAsync();
}
private void CreateNonBonded()
{
XenAPI.Network network = PopulateNewNetworkObj();
PIF nic = pageNetworkDetails.SelectedHostNic;
long vlan = pageNetworkDetails.VLAN;
NetworkAction action = pageNetworkType.SelectedNetworkType == NetworkTypes.External
? new NetworkAction(xenConnection, network, nic, vlan)
: new NetworkAction(xenConnection, network, true);
action.RunAsync();
}
private XenAPI.Network PopulateNewNetworkObj()
{
XenAPI.Network result = new XenAPI.Network();
result.name_label = pageName.NetworkName;
result.name_description = pageName.NetworkDescription;
result.AutoPlug = (pageNetworkType.SelectedNetworkType == NetworkTypes.CHIN ? pageChinDetails.isAutomaticAddNicToVM : pageNetworkDetails.isAutomaticAddNicToVM);
if (Helpers.CowleyOrGreater(xenConnection))
{
if (pageNetworkType.SelectedNetworkType == NetworkTypes.CHIN)
result.MTU = pageChinDetails.MTU;
else if (pageNetworkDetails.MTU.HasValue) //Custom MTU may not be allowed if we are making a virtual network or something
result.MTU = pageNetworkDetails.MTU.Value;
}
return result;
}
protected override string WizardPaneHelpID()
{
return "NewNetworkWizard";
}
}
}