Changeset 15613


Ignore:
Timestamp:
01/15/18 01:53:02 (19 months ago)
Author:
swagner
Message:

#2877: Improved groups/slaves treeview of Hive Administrator

  • slaves and slave groups are sorted by name
  • slave state is indicated by different colors
  • number of contained slaves is shown for each group
  • CPU utilization is shown for each calculating slave
  • last heartbeat date is shown for each offline slave
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2877_HiveImprovements/HeuristicLab.Clients.Hive.Administrator/3.3/Views/ResourcesView.cs

    r15583 r15613  
    4848    private const int slaveGroupImageIndex = 1;
    4949    private readonly Color ownedResourceColor = Color.LightGreen;
     50    private readonly Color calculatingColor = Color.DarkGreen;
     51    private readonly Color offlineColor = Color.Red;
    5052    private TS.Task progressTask;
    5153    private bool stopProgressTask;
     
    136138
    137139        //rebuild
    138         TreeNode ungrp = new TreeNode(UngroupedGroupName);
    139         ungrp.ImageIndex = slaveGroupImageIndex;
    140         ungrp.SelectedImageIndex = ungrp.ImageIndex;
    141         var newGroup = new SlaveGroup();
    142         newGroup.Name = UngroupedGroupName;
    143         newGroup.Id = Guid.NewGuid();
    144         newGroup.Description = "Contains slaves which are in no group";
    145         ungrp.Tag = newGroup;
    146 
    147         foreach (Resource g in Content) {
    148           if (g.GetType() == typeof(SlaveGroup)) {
    149             //root node
    150             if (g.ParentResourceId == null) {
    151               TreeNode tn = new TreeNode();
    152               tn.ImageIndex = slaveGroupImageIndex;
    153               tn.SelectedImageIndex = tn.ImageIndex;
    154 
    155               tn.Tag = g;
    156               tn.Text = g.Name;
    157               if (g.OwnerUserId == Access.UserInformation.Instance.User.Id) tn.BackColor = ownedResourceColor;
    158 
    159               BuildSlaveGroupTree(g, tn);
    160               treeSlaveGroup.Nodes.Add(tn);
    161             }
    162           } else if (g.GetType() == typeof(Slave)) {
    163             if (g.ParentResourceId == null) {
    164               var stn = new TreeNode(g.Name);
    165               stn.ImageIndex = slaveImageIndex;
    166               stn.SelectedImageIndex = stn.ImageIndex;
    167               stn.Tag = g;
    168               if (g.OwnerUserId == Access.UserInformation.Instance.User.Id) stn.BackColor = ownedResourceColor;
    169               ungrp.Nodes.Add(stn);
    170             }
    171           }
    172         }
    173         treeSlaveGroup.Nodes.Add(ungrp);
    174       }
    175     }
    176 
    177     private void BuildSlaveGroupTree(Resource g, TreeNode tn) {
    178       foreach (Resource r in Content.Where(s => s.ParentResourceId != null && s.ParentResourceId == g.Id)) {
    179         TreeNode stn = new TreeNode(r.Name);
    180         if (r is Slave) {
    181           stn.ImageIndex = slaveImageIndex;
    182         } else if (r is SlaveGroup) {
    183           stn.ImageIndex = slaveGroupImageIndex;
    184         }
    185         stn.SelectedImageIndex = stn.ImageIndex;
    186         stn.Tag = r;
    187         if (r.OwnerUserId == Access.UserInformation.Instance.User.Id) stn.BackColor = ownedResourceColor;
    188         tn.Nodes.Add(stn);
    189 
    190         BuildSlaveGroupTree(r, stn);
    191       }
     140        var ungroupedSlaves = new SlaveGroup {
     141          Id = Guid.NewGuid(),
     142          Name = UngroupedGroupName,
     143          Description = "Slaves without a group"
     144        };
     145        var ungroupedSlavesCount = 0;
     146        var ungroupedNode = CreateTreeNodeFromResource(ungroupedSlaves);
     147
     148        var parentlessResources = from r in Content
     149                                  where r.ParentResourceId == null
     150                                  orderby r.Name
     151                                  select r;
     152        foreach (Resource r in parentlessResources) {
     153          if (r.GetType() == typeof(SlaveGroup)) {  // root node
     154            var root = CreateTreeNodeFromResource(r);
     155            treeSlaveGroup.Nodes.Add(root);
     156            BuildSlaveGroupTree((SlaveGroup)r, root);
     157          } else if (r.GetType() == typeof(Slave)) {  // ungrouped slaves
     158            ungroupedNode.Nodes.Add(CreateTreeNodeFromResource(r));
     159            ungroupedSlavesCount++;
     160          }
     161        }
     162        if (ungroupedSlavesCount > 0)
     163          ungroupedNode.Text += "   [" + ungroupedSlavesCount.ToString() + "]";
     164        treeSlaveGroup.Nodes.Add(ungroupedNode);
     165      }
     166    }
     167
     168    private void BuildSlaveGroupTree(SlaveGroup group, TreeNode node) {
     169      var childGroups = from r in Content.OfType<SlaveGroup>()
     170                        where r.ParentResourceId == @group.Id
     171                        orderby r.Name
     172                        select r;
     173      foreach (var g in childGroups) {
     174        var childNode = CreateTreeNodeFromResource(g);
     175        node.Nodes.Add(childNode);
     176        BuildSlaveGroupTree(g, childNode);
     177      }
     178
     179      var childSlaves = from r in Content.OfType<Slave>()
     180                        where r.ParentResourceId == @group.Id
     181                        orderby r.Name
     182                        select r;
     183      foreach (var s in childSlaves)
     184        node.Nodes.Add(CreateTreeNodeFromResource(s));
     185      var childSlavesCount = childSlaves.Count();
     186      if (childSlavesCount > 0)
     187        node.Text += "   [" + childSlavesCount.ToString() + "]";
     188    }
     189
     190    private TreeNode CreateTreeNodeFromResource(Resource r) {
     191      var node = new TreeNode();
     192      node.Text = r.Name;
     193
     194      if (r is SlaveGroup) {
     195        node.ImageIndex = slaveGroupImageIndex;
     196      } else if (r is Slave) {
     197        var s = r as Slave;
     198        node.ImageIndex = slaveImageIndex;
     199        if (s.SlaveState == SlaveState.Calculating) {
     200          node.ForeColor = calculatingColor;
     201          node.Text += "   [" + s.CpuUtilization.ToString("N2") + " %]";
     202        } else if (s.SlaveState == SlaveState.Offline) {
     203          node.ForeColor = offlineColor;
     204          if (s.LastHeartbeat.HasValue)
     205            node.Text += "   [" + s.LastHeartbeat?.ToString("g") + "]";
     206        }
     207      }
     208      node.SelectedImageIndex = node.ImageIndex;
     209
     210      if (r.OwnerUserId == Access.UserInformation.Instance.User.Id) node.BackColor = ownedResourceColor;
     211
     212      node.Tag = r;
     213      return node;
    192214    }
    193215
Note: See TracChangeset for help on using the changeset viewer.