public void ValidatePrivateNodeAddresses() { var ipAddressToNode = new Dictionary <IPAddress, NodeDefinition>(); if (string.IsNullOrEmpty(Network.NodesSubnet)) { throw new HiveDefinitionException($"The [{nameof(HiveDefinition)}.{nameof(HiveDefinition.Network)}.{nameof(NetworkOptions.NodesSubnet)}] property is required."); } if (!NetworkCidr.TryParse(Network.NodesSubnet, out var nodesSubnet)) { throw new HiveDefinitionException($"The [{nameof(HiveDefinition)}.{nameof(HiveDefinition.Network)}.{nameof(NetworkOptions.NodesSubnet)}={Network.NodesSubnet}] property is not valid."); } foreach (var node in SortedNodes.OrderBy(n => n.Name)) { if (string.IsNullOrEmpty(node.PrivateAddress)) { throw new HiveDefinitionException($"Node [{node.Name}] has not been assigned a private IP address."); } if (!IPAddress.TryParse(node.PrivateAddress, out var address)) { throw new HiveDefinitionException($"Node [{node.Name}] has invalid private IP address [{node.PrivateAddress}]."); } if (address == IPAddress.Any) { throw new HiveDefinitionException($"Node [{node.Name}] has not been assigned a private IP address."); } if (ipAddressToNode.TryGetValue(address, out var conflictingNode)) { throw new HiveDefinitionException($"Nodes [{conflictingNode.Name}] and [{node.Name}] have the same IP address [{address}]."); } ipAddressToNode.Add(address, node); } }