示例#1
0
        /// <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);
        }