mirror of
https://github.com/xcp-ng/xenadmin.git
synced 2025-01-20 23:39:51 +01:00
CA-292991: Block host joining cluster with cluster network (bonded/unbonded) unless the interface is defined
Signed-off-by: serenc <seren.corbett@citrix.com>
This commit is contained in:
parent
0bec35629a
commit
118eca3d61
18
XenModel/Messages.Designer.cs
generated
18
XenModel/Messages.Designer.cs
generated
@ -24170,6 +24170,24 @@ namespace XenAdmin {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to This server needs to have an IP address assigned to one (and only one) of the interfaces that will be part of the bonded cluster network..
|
||||||
|
/// </summary>
|
||||||
|
public static string NEWPOOL_IP_COUNT_BOND {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("NEWPOOL_IP_COUNT_BOND", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to This server needs to have one (and only one) IP address on the network that will be used for clustering..
|
||||||
|
/// </summary>
|
||||||
|
public static string NEWPOOL_IP_COUNT_CLUSTER {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("NEWPOOL_IP_COUNT_CLUSTER", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to This server is master of an existing pool.
|
/// Looks up a localized string similar to This server is master of an existing pool.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -8245,6 +8245,12 @@ You should only proceed if you have verified that these settings are correct.</v
|
|||||||
<data name="NEWPOOL_HAS_SHARED_STORAGE" xml:space="preserve">
|
<data name="NEWPOOL_HAS_SHARED_STORAGE" xml:space="preserve">
|
||||||
<value>This server has shared storage</value>
|
<value>This server has shared storage</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="NEWPOOL_IP_COUNT_BOND" xml:space="preserve">
|
||||||
|
<value>This server needs to have an IP address assigned to one (and only one) of the interfaces that will be part of the bonded cluster network.</value>
|
||||||
|
</data>
|
||||||
|
<data name="NEWPOOL_IP_COUNT_CLUSTER" xml:space="preserve">
|
||||||
|
<value>This server needs to have one (and only one) IP address on the network that will be used for clustering.</value>
|
||||||
|
</data>
|
||||||
<data name="NEWPOOL_IS_A_POOL" xml:space="preserve">
|
<data name="NEWPOOL_IS_A_POOL" xml:space="preserve">
|
||||||
<value>This server is master of an existing pool</value>
|
<value>This server is master of an existing pool</value>
|
||||||
</data>
|
</data>
|
||||||
|
@ -34,6 +34,8 @@ using System.Collections.Generic;
|
|||||||
using XenAdmin.Network;
|
using XenAdmin.Network;
|
||||||
using XenAPI;
|
using XenAPI;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Runtime.InteropServices.WindowsRuntime;
|
||||||
|
using XenAdmin.Actions;
|
||||||
|
|
||||||
namespace XenAdmin.Core
|
namespace XenAdmin.Core
|
||||||
{
|
{
|
||||||
@ -71,6 +73,8 @@ namespace XenAdmin.Core
|
|||||||
NonCompatibleManagementInterface,
|
NonCompatibleManagementInterface,
|
||||||
WrongRoleOnMaster,
|
WrongRoleOnMaster,
|
||||||
WrongRoleOnSlave,
|
WrongRoleOnSlave,
|
||||||
|
WrongNumberOfIpsCluster,
|
||||||
|
WrongNumberOfIpsBond,
|
||||||
NotConnected,
|
NotConnected,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -166,6 +170,12 @@ namespace XenAdmin.Core
|
|||||||
if (!Helpers.FeatureForbidden(slaveConnection, Host.RestrictManagementOnVLAN) && !HasCompatibleManagementInterface(slaveConnection))
|
if (!Helpers.FeatureForbidden(slaveConnection, Host.RestrictManagementOnVLAN) && !HasCompatibleManagementInterface(slaveConnection))
|
||||||
return Reason.NonCompatibleManagementInterface;
|
return Reason.NonCompatibleManagementInterface;
|
||||||
|
|
||||||
|
bool clusterHostInBond;
|
||||||
|
if (!HasIpForClusterNetwork(masterConnection, slaveHost, out clusterHostInBond))
|
||||||
|
{
|
||||||
|
return clusterHostInBond ? Reason.WrongNumberOfIpsBond : Reason.WrongNumberOfIpsCluster;
|
||||||
|
}
|
||||||
|
|
||||||
return Reason.Allowed;
|
return Reason.Allowed;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -227,6 +237,10 @@ namespace XenAdmin.Core
|
|||||||
return Messages.NEWPOOL_MASTER_ROLE;
|
return Messages.NEWPOOL_MASTER_ROLE;
|
||||||
case Reason.WrongRoleOnSlave:
|
case Reason.WrongRoleOnSlave:
|
||||||
return Messages.NEWPOOL_SLAVE_ROLE;
|
return Messages.NEWPOOL_SLAVE_ROLE;
|
||||||
|
case Reason.WrongNumberOfIpsCluster:
|
||||||
|
return Messages.NEWPOOL_IP_COUNT_CLUSTER;
|
||||||
|
case Reason.WrongNumberOfIpsBond:
|
||||||
|
return Messages.NEWPOOL_IP_COUNT_BOND;
|
||||||
default:
|
default:
|
||||||
System.Diagnostics.Trace.Assert(false, "Unknown reason");
|
System.Diagnostics.Trace.Assert(false, "Unknown reason");
|
||||||
return "";
|
return "";
|
||||||
@ -673,5 +687,51 @@ namespace XenAdmin.Core
|
|||||||
else
|
else
|
||||||
return slaveConnection.Cache.PIFs.Any(p => !p.physical && p.management && p.VLAN != -1);
|
return slaveConnection.Cache.PIFs.Any(p => !p.physical && p.management && p.VLAN != -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static bool HasIpForClusterNetwork(IXenConnection masterConnection, Host slaveHost, out bool clusterHostInBond)
|
||||||
|
{
|
||||||
|
|
||||||
|
var clusterHost = masterConnection.Cache.Cluster_hosts.FirstOrDefault();
|
||||||
|
|
||||||
|
if (clusterHost == null)
|
||||||
|
{
|
||||||
|
clusterHostInBond = false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
var clusterHostPif = clusterHost.Connection.Resolve(clusterHost.PIF);
|
||||||
|
clusterHostInBond = clusterHostPif.IsBondNIC();
|
||||||
|
|
||||||
|
var pifsWithIPAddress = 0;
|
||||||
|
|
||||||
|
List<string> ids = new List<string>();
|
||||||
|
|
||||||
|
if (clusterHostInBond)
|
||||||
|
{
|
||||||
|
|
||||||
|
List<PIF> slaves = new List<PIF>();
|
||||||
|
|
||||||
|
foreach (Bond bond in masterConnection.ResolveAll(clusterHostPif.bond_master_of))
|
||||||
|
{
|
||||||
|
slaves.AddRange(masterConnection.ResolveAll(bond.slaves));
|
||||||
|
}
|
||||||
|
|
||||||
|
ids.AddRange(slaves.Select(slave => slave.device));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ids.Add(clusterHostPif.device);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (PIF pif in slaveHost.Connection.ResolveAll(slaveHost.PIFs))
|
||||||
|
{
|
||||||
|
if (pif.IsManagementInterface(false) && ids.Contains(pif.device))
|
||||||
|
{
|
||||||
|
pifsWithIPAddress += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return pifsWithIPAddress == 1;
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user