/// <summary> /// Returns a dictionary mapping hive host group names to the list of node /// definitions specifying the nodes within each group. The group name keys /// are case insenstive and the groups returned will include built-in groups /// like <b>all</b>, <b>swarm</b>, <b>managers</b>, <b>worker</b>, <b>pets</b>, /// etc. in addition to any explicit groups specified by <see cref="NodeDefinition.HostGroups"/>. /// </summary> /// <param name="excludeAllGroup">Optionally exclude the built-in <b>all</b> group from the results.</param> /// <returns></returns> public Dictionary <string, List <NodeDefinition> > GetHostGroups(bool excludeAllGroup = false) { var groups = new Dictionary <string, List <NodeDefinition> >(StringComparer.InvariantCultureIgnoreCase); // Add explicit group assignments. Note that we're going to ignore // any explicit assignments to built-in groups to avoid having nodes // appear multiple times in the same group. foreach (var node in this.Nodes) { foreach (var group in node.HostGroups) { if (HiveHostGroups.BuiltIn.Contains(group)) { continue; // Ignore explicit built-in group assignments. } if (!groups.TryGetValue(group, out var groupAssignments)) { groupAssignments = new List <NodeDefinition>(); groups.Add(group, groupAssignments); } groupAssignments.Add(node); } } // Add built-in group assignments. Note that we're going to take care // to ensure that only one instance of a node will be added to any // given group. This could happen if the user explicitly specified // that a node as a member of a built-in group (which should probably // be detected as an error). var members = new List <NodeDefinition>(); // [all] group if (!excludeAllGroup) { members.Clear(); foreach (var node in SortedNodes) { members.Add(node); } groups.Add(HiveHostGroups.All, members); } // [swarm] group members.Clear(); foreach (var node in SortedNodes.Where(n => n.InSwarm)) { members.Add(node); } groups.Add(HiveHostGroups.Swarm, members); // [managers] group members.Clear(); foreach (var node in SortedNodes.Where(n => n.IsManager)) { members.Add(node); } groups.Add(HiveHostGroups.Managers, members); // [workers] group members.Clear(); foreach (var node in SortedNodes.Where(n => n.IsWorker)) { members.Add(node); } groups.Add(HiveHostGroups.Workers, members); // [pets] group members.Clear(); foreach (var node in SortedNodes.Where(n => n.IsPet)) { members.Add(node); } groups.Add(HiveHostGroups.Pets, members); // [ceph] group members.Clear(); foreach (var node in SortedNodes.Where(n => n.Labels.CephMON || n.Labels.CephMDS || n.Labels.CephOSD)) { members.Add(node); } groups.Add(HiveHostGroups.Ceph, members); // [ceph-mon] group members.Clear(); foreach (var node in SortedNodes.Where(n => n.Labels.CephMON)) { members.Add(node); } groups.Add(HiveHostGroups.CephMON, members); // [ceph-mds] group members.Clear(); foreach (var node in SortedNodes.Where(n => n.Labels.CephMDS)) { members.Add(node); } groups.Add(HiveHostGroups.CephMDS, members); // [ceph-osd] group members.Clear(); foreach (var node in SortedNodes.Where(n => n.Labels.CephOSD)) { members.Add(node); } groups.Add(HiveHostGroups.CephOSD, members); // [hivemq] group members.Clear(); foreach (var node in SortedNodes.Where(n => n.Labels.HiveMQ || n.Labels.HiveMQManager)) { members.Add(node); } groups.Add(HiveHostGroups.HiveMQ, members); // [hivemq-managers] group members.Clear(); foreach (var node in SortedNodes.Where(n => n.Labels.HiveMQManager)) { members.Add(node); } groups.Add(HiveHostGroups.HiveMQManagers, members); return(groups); }