Blame SOURCES/bz1158566-03-web-UI-multiple-fixes-in-the-dashboard.patch

71541a
From 9830bad113bf07fb65af18e2f2423c27da0180c0 Mon Sep 17 00:00:00 2001
71541a
From: Ondrej Mular <omular@redhat.com>
71541a
Date: Tue, 8 Sep 2015 12:46:50 +0200
71541a
Subject: [PATCH] web UI: multiple fixes in the dashboard
71541a
71541a
- fix no quorum message
71541a
- fix status inconsistency of offline cluster
71541a
- fix status icons
71541a
- cluster status is 'failed' if there is resource with status 'blocked'
71541a
- fix random unselecting of current cluster
71541a
- performance improvements in loading cluster status
71541a
- removed icon that indicates issue in cluster
71541a
- changed status detection of resources
71541a
---
71541a
 pcsd/cluster_entity.rb           | 150 +++++++++++++++--------
71541a
 pcsd/pcs.rb                      | 231 +++++++++++++++++------------------
71541a
 pcsd/public/js/nodes-ember.js    | 122 +++++++++----------
71541a
 pcsd/public/js/pcsd.js           |  24 +++-
71541a
 pcsd/test/test_all_suite.rb      |   1 +
71541a
 pcsd/test/test_cluster_entity.rb | 126 +++++++++++++++----
71541a
 pcsd/test/test_pcs.rb            | 257 +++++++++++++++++++++++++++++++++++++++
71541a
 pcsd/views/_cluster_list.erb     |   6 +-
71541a
 pcsd/views/main.erb              |   2 +-
71541a
 pcsd/views/manage.erb            | 243 ++++++++++++++++++------------------
71541a
 10 files changed, 779 insertions(+), 383 deletions(-)
71541a
 create mode 100644 pcsd/test/test_pcs.rb
71541a
71541a
diff --git a/pcsd/cluster_entity.rb b/pcsd/cluster_entity.rb
71541a
index 4f751b8..b5d2719 100644
71541a
--- a/pcsd/cluster_entity.rb
71541a
+++ b/pcsd/cluster_entity.rb
71541a
@@ -3,6 +3,34 @@ require 'pcs.rb'
71541a
 
71541a
 module ClusterEntity
71541a
 
71541a
+  def self.get_rsc_status(crm_dom)
71541a
+    unless crm_dom
71541a
+      return {}
71541a
+    end
71541a
+    status = {}
71541a
+    crm_dom.elements.each('/crm_mon/resources//resource') { |e|
71541a
+      rsc_id = e.attributes['id'].split(':')[0]
71541a
+      status[rsc_id] ||= []
71541a
+      status[rsc_id] << ClusterEntity::CRMResourceStatus.new(e)
71541a
+    }
71541a
+    return status
71541a
+  end
71541a
+
71541a
+  def self.get_resources_operations(cib_dom)
71541a
+    unless cib_dom
71541a
+      return {}
71541a
+    end
71541a
+    operations = {}
71541a
+    cib_dom.elements.each(
71541a
+      '/cib/status/node_state/lrm/lrm_resources/lrm_resource/lrm_rsc_op'
71541a
+    ) { |e|
71541a
+      rsc_id = e.parent.attributes['id'].split(':')[0]
71541a
+      operations[rsc_id] ||= []
71541a
+      operations[rsc_id] << ClusterEntity::ResourceOperation.new(e)
71541a
+    }
71541a
+    return operations
71541a
+  end
71541a
+
71541a
   def self.obj_to_hash(obj, variables=nil)
71541a
     unless variables
71541a
       variables = obj.instance_variables
71541a
@@ -454,8 +482,9 @@ module ClusterEntity
71541a
     attr_accessor :agentname, :_class, :provider, :type, :stonith,
71541a
                   :instance_attr, :crm_status, :operations
71541a
 
71541a
-    def initialize(primitive_cib_element=nil, crm_dom=nil, parent=nil, cib_dom=nil)
71541a
-      super(primitive_cib_element, crm_dom, parent)
71541a
+    def initialize(primitive_cib_element=nil, rsc_status=nil, parent=nil,
71541a
+        operations=nil)
71541a
+      super(primitive_cib_element, nil, parent)
71541a
       @class_type = 'primitive'
71541a
       @agentname = nil
71541a
       @_class = nil
71541a
@@ -482,18 +511,12 @@ module ClusterEntity
71541a
           )
71541a
         }
71541a
         @stonith = @_class == 'stonith'
71541a
-        if @id and crm_dom
71541a
-          crm_dom.elements.each("//resource[starts-with(@id, \"#{@id}:\")] | "\
71541a
-              + "//resource[@id=\"#{@id}\"]") { |e|
71541a
-            @crm_status << CRMResourceStatus.new(e)
71541a
-          }
71541a
+        if @id and rsc_status
71541a
+          @crm_status = rsc_status[@id] || []
71541a
         end
71541a
 
71541a
         @status = get_status
71541a
-
71541a
-        if cib_dom
71541a
-          load_operations(cib_dom)
71541a
-        end
71541a
+        load_operations(operations)
71541a
       end
71541a
     end
71541a
 
71541a
@@ -525,28 +548,26 @@ module ClusterEntity
71541a
       return status
71541a
     end
71541a
 
71541a
-    def load_operations(cib_dom)
71541a
-      unless @id
71541a
+    def load_operations(operations)
71541a
+      @operations = []
71541a
+      unless operations and @id and operations[@id]
71541a
         return
71541a
       end
71541a
 
71541a
-      @operations = []
71541a
       failed_ops = []
71541a
       message_list = []
71541a
-      cib_dom.elements.each("//lrm_resource[@id='#{@id}']/lrm_rsc_op | "\
71541a
-      + "//lrm_resource[starts-with(@id, \"#{@id}:\")]/lrm_rsc_op") { |e|
71541a
-        operation = ResourceOperation.new(e)
71541a
-        @operations << operation
71541a
-        if operation.rc_code != 0
71541a
+      operations[@id].each { |o|
71541a
+        @operations << o
71541a
+        if o.rc_code != 0
71541a
           # 7 == OCF_NOT_RUNNING == The resource is safely stopped.
71541a
-          next if operation.operation == 'monitor' and operation.rc_code == 7
71541a
+          next if o.operation == 'monitor' and o.rc_code == 7
71541a
           # 8 == OCF_RUNNING_MASTER == The resource is running in master mode.
71541a
-          next if 8 == operation.rc_code
71541a
-          failed_ops << operation
71541a
-          message = "Failed to #{operation.operation} #{@id}"
71541a
-          message += " on #{Time.at(operation.last_rc_change).asctime}"
71541a
-          message += " on node #{operation.on_node}" if operation.on_node
71541a
-          message += ": #{operation.exit_reason}" if operation.exit_reason
71541a
+          next if 8 == o.rc_code
71541a
+          failed_ops << o
71541a
+          message = "Failed to #{o.operation} #{@id}"
71541a
+          message += " on #{Time.at(o.last_rc_change).asctime}"
71541a
+          message += " on node #{o.on_node}" if o.on_node
71541a
+          message += ": #{o.exit_reason}" if o.exit_reason
71541a
           message_list << {
71541a
             :message => message
71541a
           }
71541a
@@ -652,26 +673,48 @@ module ClusterEntity
71541a
   class Group < Resource
71541a
     attr_accessor :members
71541a
 
71541a
-    def initialize(group_cib_element=nil, crm_dom=nil, parent=nil, cib_dom=nil)
71541a
-      super(group_cib_element, crm_dom, parent)
71541a
+    def initialize(
71541a
+      group_cib_element=nil, rsc_status=nil, parent=nil, operations=nil
71541a
+    )
71541a
+      super(group_cib_element, nil, parent)
71541a
       @class_type = 'group'
71541a
       @members = []
71541a
       if group_cib_element and group_cib_element.name == 'group'
71541a
         @status = ClusterEntity::ResourceStatus.new(:running)
71541a
         group_cib_element.elements.each('primitive') { |e|
71541a
-          p = Primitive.new(e, crm_dom, self, cib_dom)
71541a
+          p = Primitive.new(e, rsc_status, self, operations)
71541a
           members << p
71541a
-          @status = p.status if @status < p.status
71541a
         }
71541a
+        update_status
71541a
       end
71541a
     end
71541a
 
71541a
     def update_status
71541a
       @status = ClusterEntity::ResourceStatus.new(:running)
71541a
+      first = true
71541a
       @members.each { |p|
71541a
         p.update_status
71541a
-        @status = p.status if @status < p.status
71541a
+        if first
71541a
+          first = false
71541a
+          next
71541a
+        end
71541a
+        if (
71541a
+          p.status == ClusterEntity::ResourceStatus.new(:disabled) or
71541a
+          p.status == ClusterEntity::ResourceStatus.new(:blocked) or
71541a
+          p.status == ClusterEntity::ResourceStatus.new(:failed)
71541a
+        )
71541a
+          @status = ClusterEntity::ResourceStatus.new(:partially_running)
71541a
+        end
71541a
       }
71541a
+      if (@members and @members.length > 0 and
71541a
+        (ClusterEntity::ResourceStatus.new(:running) != @members[0].status and
71541a
+        ClusterEntity::ResourceStatus.new(:unknown) != @members[0].status)
71541a
+      )
71541a
+        @status = @members[0].status
71541a
+      end
71541a
+      if disabled?
71541a
+        @status = ClusterEntity::ResourceStatus.new(:disabled)
71541a
+      end
71541a
     end
71541a
 
71541a
     def to_status(version='1')
71541a
@@ -713,8 +756,9 @@ module ClusterEntity
71541a
   class MultiInstance < Resource
71541a
     attr_accessor :member, :unique, :managed, :failed, :failure_ignored
71541a
 
71541a
-    def initialize(resource_cib_element=nil, crm_dom=nil, parent=nil, cib_dom=nil)
71541a
-      super(resource_cib_element, crm_dom, parent)
71541a
+    def initialize(resource_cib_element=nil, crm_dom=nil, rsc_status=nil,
71541a
+                   parent=nil, operations=nil)
71541a
+      super(resource_cib_element, nil, parent)
71541a
       @member = nil
71541a
       @multi_state = false
71541a
       @unique = false
71541a
@@ -730,15 +774,13 @@ module ClusterEntity
71541a
       )
71541a
         member = resource_cib_element.elements['group | primitive']
71541a
         if member and member.name == 'group'
71541a
-          @member = Group.new(member, crm_dom, self, cib_dom)
71541a
+          @member = Group.new(member, rsc_status, self, operations)
71541a
         elsif member and member.name == 'primitive'
71541a
-          @member = Primitive.new(member, crm_dom, self, cib_dom)
71541a
-        end
71541a
-        if @member
71541a
-          @status = @member.status
71541a
+          @member = Primitive.new(member, rsc_status, self, operations)
71541a
         end
71541a
+        update_status
71541a
         if crm_dom
71541a
-          status = crm_dom.elements["//clone[@id='#{@id}']"]
71541a
+          status = crm_dom.elements["/crm_mon/resources//clone[@id='#{@id}']"]
71541a
           if status
71541a
             @unique = status.attributes['unique'] == 'true'
71541a
             @managed = status.attributes['managed'] == 'true'
71541a
@@ -754,6 +796,9 @@ module ClusterEntity
71541a
         @member.update_status
71541a
         @status = @member.status
71541a
       end
71541a
+      if disabled?
71541a
+        @status = ClusterEntity::ResourceStatus.new(:disabled)
71541a
+      end
71541a
     end
71541a
 
71541a
     def to_status(version='1')
71541a
@@ -776,8 +821,11 @@ module ClusterEntity
71541a
 
71541a
   class Clone < MultiInstance
71541a
 
71541a
-    def initialize(resource_cib_element=nil, crm_dom=nil, parent=nil, cib_dom=nil)
71541a
-      super(resource_cib_element, crm_dom, parent, cib_dom)
71541a
+    def initialize(
71541a
+      resource_cib_element=nil, crm_dom=nil, rsc_status=nil, parent=nil,
71541a
+      operations=nil
71541a
+    )
71541a
+      super(resource_cib_element, crm_dom, rsc_status, parent, operations)
71541a
       @class_type = 'clone'
71541a
     end
71541a
 
71541a
@@ -808,11 +856,12 @@ module ClusterEntity
71541a
   class MasterSlave < MultiInstance
71541a
     attr_accessor :masters, :slaves
71541a
 
71541a
-    def initialize(master_cib_element=nil, crm_dom=nil, parent=nil, cib_dom=nil)
71541a
-      super(master_cib_element, crm_dom, parent, cib_dom)
71541a
+    def initialize(master_cib_element=nil, crm_dom=nil, rsc_status=nil, parent=nil, operations=nil)
71541a
+      super(master_cib_element, crm_dom, rsc_status, parent, operations)
71541a
       @class_type = 'master'
71541a
       @masters = []
71541a
       @slaves = []
71541a
+      update_status
71541a
       if @member
71541a
         if @member.instance_of?(Primitive)
71541a
           primitive_list = [@member]
71541a
@@ -820,15 +869,15 @@ module ClusterEntity
71541a
           primitive_list = @member.members
71541a
         end
71541a
         @masters, @slaves = get_masters_slaves(primitive_list)
71541a
-        if @masters.empty? and !disabled?
71541a
-          @status = ClusterEntity::ResourceStatus.new(:partially_running)
71541a
+        if (@masters.empty? and
71541a
+          @status != ClusterEntity::ResourceStatus.new(:disabled)
71541a
+        )
71541a
           @warning_list << {
71541a
             :message => 'Resource is master/slave but has not been promoted '\
71541a
               + 'to master on any node.',
71541a
             :type => 'no_master'
71541a
           }
71541a
         end
71541a
-        @status = @member.status if @status < @member.status
71541a
       end
71541a
     end
71541a
 
71541a
@@ -857,16 +906,21 @@ module ClusterEntity
71541a
     def update_status
71541a
       if @member
71541a
         @member.update_status
71541a
+        @status = @member.status
71541a
         if @member.instance_of?(Primitive)
71541a
           primitive_list = [@member]
71541a
         else
71541a
           primitive_list = @member.members
71541a
         end
71541a
         @masters, @slaves = get_masters_slaves(primitive_list)
71541a
-        if @masters.empty? and !disabled?
71541a
+        if (@masters.empty? and
71541a
+          @member.status != ClusterEntity::ResourceStatus.new(:disabled)
71541a
+        )
71541a
           @status = ClusterEntity::ResourceStatus.new(:partially_running)
71541a
         end
71541a
-        @status = @member.status if @status < @member.status
71541a
+      end
71541a
+      if disabled?
71541a
+        @status = ClusterEntity::ResourceStatus.new(:disabled)
71541a
       end
71541a
     end
71541a
 
71541a
diff --git a/pcsd/pcs.rb b/pcsd/pcs.rb
71541a
index 87404ac..9a0d145 100644
71541a
--- a/pcsd/pcs.rb
71541a
+++ b/pcsd/pcs.rb
71541a
@@ -15,14 +15,14 @@ require 'resource.rb'
71541a
 require 'cluster_entity.rb'
71541a
 require 'auth.rb'
71541a
 
71541a
-def getAllSettings(session)
71541a
-  stdout, stderr, retval = run_cmd(session, PCS, "property")
71541a
-  stdout.map(&:chomp!)
71541a
-  stdout.map(&:strip!)
71541a
+def getAllSettings(session, cib_dom=nil)
71541a
+  unless cib_dom
71541a
+    cib_dom = get_cib_dom(session)
71541a
+  end
71541a
   stdout2, stderr2, retval2 = run_cmd(session, PENGINE, "metadata")
71541a
   metadata = stdout2.join
71541a
   ret = {}
71541a
-  if retval == 0 and retval2 == 0
71541a
+  if cib_dom and retval2 == 0
71541a
     doc = REXML::Document.new(metadata)
71541a
 
71541a
     default = ""
71541a
@@ -37,8 +37,9 @@ def getAllSettings(session)
71541a
       ret[name] = {"value" => default, "type" => el_type}
71541a
     }
71541a
 
71541a
-    stdout.each {|line|
71541a
-      key,val = line.split(': ', 2)
71541a
+    cib_dom.elements.each('/cib/configuration/crm_config//nvpair') { |e|
71541a
+      key = e.attributes['name']
71541a
+      val = e.attributes['value']
71541a
       key.gsub!(/-/,"_")
71541a
       if ret.has_key?(key)
71541a
 	if ret[key]["type"] == "boolean"
71541a
@@ -723,106 +724,92 @@ def get_cluster_name()
71541a
   end
71541a
 end
71541a
 
71541a
-def get_node_attributes(session)
71541a
-  stdout, stderr, retval = run_cmd(session, PCS, "property", "list")
71541a
-  if retval != 0
71541a
-    return {}
71541a
-  end
71541a
-
71541a
-  attrs = {}
71541a
-  found = false
71541a
-  stdout.each { |line|
71541a
-    if not found
71541a
-      if line.strip.start_with?("Node Attributes:")
71541a
-        found = true
71541a
-      end
71541a
-      next
71541a
-    end
71541a
-    if not line.start_with?(" ")
71541a
-      break
71541a
-    end
71541a
-    sline = line.split(":", 2)
71541a
-    nodename = sline[0].strip
71541a
-    attrs[nodename] = []
71541a
-    sline[1].strip.split(" ").each { |attr|
71541a
-      key, val = attr.split("=", 2)
71541a
-      attrs[nodename] << {:key => key, :value => val}
71541a
+def get_node_attributes(session, cib_dom=nil)
71541a
+  unless cib_dom
71541a
+    cib_dom = get_cib_dom(session)
71541a
+    return {} unless cib_dom
71541a
+  end
71541a
+  node_attrs = {}
71541a
+  cib_dom.elements.each(
71541a
+    '/cib/configuration/nodes/node/instance_attributes/nvpair'
71541a
+  ) { |e|
71541a
+    node = e.parent.parent.attributes['uname']
71541a
+    node_attrs[node] ||= []
71541a
+    node_attrs[node] << {
71541a
+      :id => e.attributes['id'],
71541a
+      :key => e.attributes['name'],
71541a
+      :value => e.attributes['value']
71541a
     }
71541a
   }
71541a
-  return attrs
71541a
+  node_attrs.each { |_, val| val.sort_by! { |obj| obj[:key] }}
71541a
+  return node_attrs
71541a
 end
71541a
 
71541a
-def get_fence_levels(session)
71541a
-  stdout, stderr, retval = run_cmd(session, PCS, "stonith", "level")
71541a
-  if retval != 0 or stdout == ""
71541a
-    return {}
71541a
+def get_fence_levels(session, cib_dom=nil)
71541a
+  unless cib_dom
71541a
+    cib_dom = get_cib_dom(session)
71541a
+    return {} unless cib_dom
71541a
   end
71541a
 
71541a
   fence_levels = {}
71541a
-  node = ""
71541a
-  stdout.each {|line|
71541a
-    if line.start_with?(" Node: ")
71541a
-      node = line.split(":",2)[1].strip
71541a
-      next
71541a
-    end
71541a
-    fence_levels[node] ||= []
71541a
-    md = / Level (\S+) - (.*)$/.match(line)
71541a
-    fence_levels[node] << {"level" => md[1], "devices" => md[2]}
71541a
+  cib_dom.elements.each(
71541a
+    '/cib/configuration/fencing-topology/fencing-level'
71541a
+  ) { |e|
71541a
+    target = e.attributes['target']
71541a
+    fence_levels[target] ||= []
71541a
+    fence_levels[target] << {
71541a
+      'level' => e.attributes['index'],
71541a
+      'devices' => e.attributes['devices']
71541a
+    }
71541a
   }
71541a
+  fence_levels.each { |_, val| val.sort_by! { |obj| obj['level'].to_i }}
71541a
   return fence_levels
71541a
 end
71541a
 
71541a
-def get_acls(session)
71541a
-  stdout, stderr, retval = run_cmd(session, PCS, "acl", "show")
71541a
-  if retval != 0 or stdout == ""
71541a
-    return {}
71541a
+def get_acls(session, cib_dom=nil)
71541a
+  unless cib_dom
71541a
+    cib_dom = get_cib_dom(session)
71541a
+    return {} unless cib_dom
71541a
   end
71541a
 
71541a
-  ret_val = {}
71541a
-  state = nil
71541a
-  user = ""
71541a
-  role = ""
71541a
-
71541a
-  stdout.each do |line|
71541a
-    if m = /^User: (.*)$/.match(line)
71541a
-      user = m[1]
71541a
-      state = "user"
71541a
-      ret_val[state] ||= {}
71541a
-      ret_val[state][user] ||= []
71541a
-      next
71541a
-    elsif m = /^Group: (.*)$/.match(line)
71541a
-      user = m[1]
71541a
-      state = "group"
71541a
-      ret_val[state] ||= {}
71541a
-      ret_val[state][user] ||= []
71541a
-      next
71541a
-    elsif m = /^Role: (.*)$/.match(line)
71541a
-      role = m[1]
71541a
-      state = "role"
71541a
-      ret_val[state] ||= {}
71541a
-      ret_val[state][role] ||= {}
71541a
-      next
71541a
-    end
71541a
+  acls = {
71541a
+    'role' => {},
71541a
+    'group' => {},
71541a
+    'user' => {},
71541a
+    'target' => {}
71541a
+  }
71541a
 
71541a
-    case state
71541a
-    when "user", "group"
71541a
-      m = /^  Roles: (.*)$/.match(line)
71541a
-      ret_val[state][user] ||= []
71541a
-      m[1].scan(/\S+/).each {|urole|
71541a
-        ret_val[state][user] << urole
71541a
+  cib_dom.elements.each('/cib/configuration/acls/*') { |e|
71541a
+    type = e.name[4..-1]
71541a
+    if e.name == 'acl_role'
71541a
+      role_id = e.attributes['id']
71541a
+      desc = e.attributes['description']
71541a
+      acls[type][role_id] = {}
71541a
+      acls[type][role_id]['description'] = desc ? desc : ''
71541a
+      acls[type][role_id]['permissions'] = []
71541a
+      e.elements.each('acl_permission') { |p|
71541a
+        p_id = p.attributes['id']
71541a
+        p_kind = p.attributes['kind']
71541a
+        val = ''
71541a
+        if p.attributes['xpath']
71541a
+          val = "xpath #{p.attributes['xpath']}"
71541a
+        elsif p.attributes['reference']
71541a
+          val = "id #{p.attributes['reference']}"
71541a
+        else
71541a
+          next
71541a
+        end
71541a
+        acls[type][role_id]['permissions'] << "#{p_kind} #{val} (#{p_id})"
71541a
+      }
71541a
+    elsif ['acl_target', 'acl_group'].include?(e.name)
71541a
+      id = e.attributes['id']
71541a
+      acls[type][id] = []
71541a
+      e.elements.each('role') { |r|
71541a
+        acls[type][id] << r.attributes['id']
71541a
       }
71541a
-    when "role"
71541a
-      ret_val[state][role] ||= {}
71541a
-      ret_val[state][role]["permissions"] ||= []
71541a
-      ret_val[state][role]["description"] ||= ""
71541a
-      if m = /^  Description: (.*)$/.match(line)
71541a
-        ret_val[state][role]["description"] = m[1]
71541a
-      elsif m = /^  Permission: (.*)$/.match(line)
71541a
-        ret_val[state][role]["permissions"] << m[1]
71541a
-      end
71541a
     end
71541a
-  end
71541a
-  return ret_val
71541a
+  }
71541a
+  acls['user'] = acls['target']
71541a
+  return acls
71541a
 end
71541a
 
71541a
 def enable_cluster(session)
71541a
@@ -1438,7 +1425,7 @@ def cluster_status_from_nodes(session, cluster_nodes, cluster_name)
71541a
         {:version=>'2', :operations=>'1'},
71541a
         true,
71541a
         nil,
71541a
-        6
71541a
+        15
71541a
       )
71541a
       node_map[node] = {}
71541a
       node_map[node].update(overview)
71541a
@@ -1601,10 +1588,10 @@ def cluster_status_from_nodes(session, cluster_nodes, cluster_name)
71541a
     }
71541a
     if status[:status] != 'error'
71541a
       status[:resource_list].each { |resource|
71541a
-        if resource[:status] == 'failed'
71541a
+        if ['failed', 'blocked'].include?(resource[:status])
71541a
           status[:status] = 'error'
71541a
           break
71541a
-        elsif ['blocked', 'partially running'].include?(resource[:status])
71541a
+        elsif ['partially running'].include?(resource[:status])
71541a
           status[:status] = 'warning'
71541a
         end
71541a
       }
71541a
@@ -1634,10 +1621,11 @@ def get_node_status(session, cib_dom)
71541a
       :cluster_settings => {},
71541a
       :need_ring1_address => need_ring1_address?,
71541a
       :is_cman_with_udpu_transport => is_cman_with_udpu_transport?,
71541a
-      :acls => get_acls(session),
71541a
+      :acls => get_acls(session, cib_dom),
71541a
       :username => session[:username],
71541a
-      :fence_levels => get_fence_levels(session),
71541a
-      :node_attr => node_attrs_to_v2(get_node_attributes(session))
71541a
+      :fence_levels => get_fence_levels(session, cib_dom),
71541a
+      :node_attr => node_attrs_to_v2(get_node_attributes(session, cib_dom)),
71541a
+      :known_nodes => []
71541a
   }
71541a
 
71541a
   nodes = get_nodes_status()
71541a
@@ -1654,10 +1642,10 @@ def get_node_status(session, cib_dom)
71541a
 
71541a
   if cib_dom
71541a
     node_status[:groups] = get_resource_groups(cib_dom)
71541a
-    node_status[:constraints] = getAllConstraints(cib_dom.elements['//constraints'])
71541a
+    node_status[:constraints] = getAllConstraints(cib_dom.elements['/cib/configuration/constraints'])
71541a
   end
71541a
 
71541a
-  cluster_settings = getAllSettings(session)
71541a
+  cluster_settings = getAllSettings(session, cib_dom)
71541a
   if not cluster_settings.has_key?('error')
71541a
     node_status[:cluster_settings] = cluster_settings
71541a
   end
71541a
@@ -1670,7 +1658,7 @@ def get_resource_groups(cib_dom)
71541a
     return []
71541a
   end
71541a
   group_list = []
71541a
-  cib_dom.elements.each('cib/configuration/resources//group') do |e|
71541a
+  cib_dom.elements.each('/cib/configuration/resources//group') do |e|
71541a
     group_list << e.attributes['id']
71541a
   end
71541a
   return group_list
71541a
@@ -1682,49 +1670,54 @@ def get_resources(cib_dom, crm_dom=nil, get_operations=false)
71541a
   end
71541a
 
71541a
   resource_list = []
71541a
-  cib = (get_operations) ? cib_dom : nil
71541a
+  operations = (get_operations) ? ClusterEntity::get_resources_operations(cib_dom) : nil
71541a
+  rsc_status = ClusterEntity::get_rsc_status(crm_dom)
71541a
 
71541a
-  cib_dom.elements.each('cib/configuration/resources/primitive') do |e|
71541a
-    resource_list << ClusterEntity::Primitive.new(e, crm_dom, nil, cib)
71541a
+  cib_dom.elements.each('/cib/configuration/resources/primitive') do |e|
71541a
+    resource_list << ClusterEntity::Primitive.new(e, rsc_status, nil, operations)
71541a
   end
71541a
-  cib_dom.elements.each('cib/configuration/resources/group') do |e|
71541a
-    resource_list << ClusterEntity::Group.new(e, crm_dom, nil, cib)
71541a
+  cib_dom.elements.each('/cib/configuration/resources/group') do |e|
71541a
+    resource_list << ClusterEntity::Group.new(e, rsc_status, nil, operations)
71541a
   end
71541a
-  cib_dom.elements.each('cib/configuration/resources/clone') do |e|
71541a
-    resource_list << ClusterEntity::Clone.new(e, crm_dom, nil, cib)
71541a
+  cib_dom.elements.each('/cib/configuration/resources/clone') do |e|
71541a
+    resource_list << ClusterEntity::Clone.new(
71541a
+      e, crm_dom, rsc_status, nil, operations
71541a
+    )
71541a
   end
71541a
-  cib_dom.elements.each('cib/configuration/resources/master') do |e|
71541a
-    resource_list << ClusterEntity::MasterSlave.new(e, crm_dom, nil, cib)
71541a
+  cib_dom.elements.each('/cib/configuration/resources/master') do |e|
71541a
+    resource_list << ClusterEntity::MasterSlave.new(
71541a
+      e, crm_dom, rsc_status, nil, operations
71541a
+    )
71541a
   end
71541a
   return resource_list
71541a
 end
71541a
 
71541a
-def get_resource_by_id(id, cib_dom, crm_dom=nil, get_operations=false)
71541a
+def get_resource_by_id(id, cib_dom, crm_dom=nil, rsc_status=nil, operations=false)
71541a
   unless cib_dom
71541a
     return nil
71541a
   end
71541a
 
71541a
-  e = cib_dom.elements["cib/configuration/resources//*[@id='#{id}']"]
71541a
+  e = cib_dom.elements["/cib/configuration/resources//*[@id='#{id}']"]
71541a
   unless e
71541a
     return nil
71541a
   end
71541a
 
71541a
   if e.parent.name != 'resources' # if resource is in group, clone or master/slave
71541a
-    p = get_resource_by_id(e.parent.attributes['id'], cib_dom, crm_dom, get_operations)
71541a
+    p = get_resource_by_id(
71541a
+      e.parent.attributes['id'], cib_dom, crm_dom, rsc_status, operations
71541a
+    )
71541a
     return p.get_map[id.to_sym]
71541a
   end
71541a
 
71541a
-  cib = (get_operations) ? cib_dom : nil
71541a
-
71541a
   case e.name
71541a
     when 'primitive'
71541a
-      return ClusterEntity::Primitive.new(e, crm_dom, nil, cib)
71541a
+      return ClusterEntity::Primitive.new(e, rsc_status, nil, operations)
71541a
     when 'group'
71541a
-      return ClusterEntity::Group.new(e, crm_dom, nil, cib)
71541a
+      return ClusterEntity::Group.new(e, rsc_status, nil, operations)
71541a
     when 'clone'
71541a
-      return ClusterEntity::Clone.new(e, crm_dom, nil, cib)
71541a
+      return ClusterEntity::Clone.new(e, crm_dom, rsc_status, nil, operations)
71541a
     when 'master'
71541a
-      return ClusterEntity::MasterSlave.new(e, crm_dom, nil, cib)
71541a
+      return ClusterEntity::MasterSlave.new(e, crm_dom, rsc_status, nil, operations)
71541a
     else
71541a
       return nil
71541a
   end
71541a
@@ -1762,7 +1755,7 @@ def node_attrs_to_v2(node_attrs)
71541a
     all_nodes_attr[node] = []
71541a
     attrs.each { |attr|
71541a
       all_nodes_attr[node] << {
71541a
-        :id => nil,
71541a
+        :id => attr[:id],
71541a
         :name => attr[:key],
71541a
         :value => attr[:value]
71541a
       }
71541a
diff --git a/pcsd/public/js/nodes-ember.js b/pcsd/public/js/nodes-ember.js
71541a
index 5fec386..bbeed55 100644
71541a
--- a/pcsd/public/js/nodes-ember.js
71541a
+++ b/pcsd/public/js/nodes-ember.js
71541a
@@ -75,9 +75,9 @@ Pcs = Ember.Application.createWithMixins({
71541a
         timeout: 20000,
71541a
         success: function(data) {
71541a
           Pcs.clusterController.update(data);
71541a
-          Ember.run.next(function() {
71541a
-            correct_visibility_dashboard(Pcs.clusterController.cur_cluster);
71541a
-          });
71541a
+          if (Pcs.clusterController.get('cur_cluster')) {
71541a
+            Pcs.clusterController.update_cur_cluster(Pcs.clusterController.get('cur_cluster').get('name'));
71541a
+          }
71541a
           if (data["not_current_data"]) {
71541a
             self.update();
71541a
           }
71541a
@@ -595,30 +595,20 @@ Pcs.ResourceObj = Ember.Object.extend({
71541a
   }.property("class_type"),
71541a
   res_type: Ember.computed.alias('resource_type'),
71541a
   status_icon: function() {
71541a
-    var icon_class;
71541a
-    switch (this.get('status')) {
71541a
-      case "running":
71541a
-        icon_class = "check";
71541a
-        break;
71541a
-      case "disabled":
71541a
-      case "partially running":
71541a
-        icon_class = "warning";
71541a
-        break;
71541a
-      case "failed":
71541a
-      case "blocked":
71541a
-        icon_class = "error";
71541a
-        break;
71541a
-      default:
71541a
-        icon_class = "x";
71541a
-    }
71541a
+    var icon_class = get_status_icon_class(this.get("status_val"));
71541a
     return "
";
71541a
   }.property("status_val"),
71541a
   status_val: function() {
71541a
-    if (this.get('warning_list').length)
71541a
-      return get_status_value("warning");
71541a
+    var status_val = get_status_value(this.get('status'));
71541a
+    if (this.get('warning_list').length && status_val != get_status_value('disabled'))
71541a
+      status_val = get_status_value("warning");
71541a
     if (this.get('error_list').length)
71541a
-      return get_status_value("error");
71541a
-    return get_status_value(this.status);
71541a
+      status_val = get_status_value("error");
71541a
+    if ((get_status_value(this.get('status')) - status_val) < 0) {
71541a
+      return get_status_value(this.get('status'));
71541a
+    } else {
71541a
+      return status_val;
71541a
+    }
71541a
   }.property('status', 'error_list.@each.message', 'warning_list.@each.message'),
71541a
   status_color: function() {
71541a
     return get_status_color(this.get("status_val"));
71541a
@@ -996,12 +986,17 @@ Pcs.Clusternode = Ember.Object.extend({
71541a
     return this.get('status') == "unknown";
71541a
   }.property("status"),
71541a
   status_val: function() {
71541a
-    if (this.warnings && this.warnings.length)
71541a
-      return get_status_value("warning");
71541a
-    if (this.errors && this.errors.length)
71541a
-      return get_status_value("error");
71541a
-    return get_status_value(this.status);
71541a
-  }.property("status"),
71541a
+    var status_val = get_status_value(this.get('status'));
71541a
+    if (this.get('warning_list').length)
71541a
+      status_val = get_status_value("warning");
71541a
+    if (this.get('error_list').length)
71541a
+      status_val = get_status_value("error");
71541a
+    if ((get_status_value(this.get('status')) - status_val) < 0) {
71541a
+      return get_status_value(this.get('status'));
71541a
+    } else {
71541a
+      return status_val;
71541a
+    }
71541a
+  }.property('status', 'error_list.@each.message', 'warning_list.@each.message'),
71541a
   status_style: function() {
71541a
     var color = get_status_color(this.get("status_val"));
71541a
     return "color: " + color + ((color != "green")? "; font-weight: bold;" : "");
71541a
@@ -1011,8 +1006,8 @@ Pcs.Clusternode = Ember.Object.extend({
71541a
     return ((this.get("status_val") == get_status_value("ok") || this.status == "standby") ? show + "default-hidden" : "");
71541a
   }.property("status_val"),
71541a
   status_icon: function() {
71541a
-    var icon_class = {"-1": "x", 1: "error", 2: "warning", 3: "x", 4: "check"};
71541a
-    return "
";
71541a
+    var icon_class = get_status_icon_class(this.get("status_val"));
71541a
+    return "
";
71541a
   }.property("status_val"),
71541a
   error_list: [],
71541a
   warning_list: [],
71541a
@@ -1158,18 +1153,18 @@ Pcs.Cluster = Ember.Object.extend({
71541a
     return out;
71541a
   }.property("error_list"),
71541a
   status_icon: function() {
71541a
-    var icon_class = {"-1": "x", 1: "error", 2: "warning", 3: "x", 4: "check"};
71541a
-    return "
";
71541a
+    var icon_class = get_status_icon_class(get_status_value(this.get('status')));
71541a
+    return "
";
71541a
   }.property("status"),
71541a
   quorum_show: function() {
71541a
-    if (this.status == "unknown") {
71541a
+    if (this.get('status') == "unknown") {
71541a
       return "(quorate unknown)"
71541a
-    } else if (!this.quorate) {
71541a
+    } else if (!this.get('quorate')) {
71541a
       return "(doesn't have quorum)"
71541a
     } else {
71541a
       return ""
71541a
     }
71541a
-  }.property("status", "quorum"),
71541a
+  }.property("status", "quorate"),
71541a
   nodes: [],
71541a
   nodes_failed: 0,
71541a
   resource_list: [],
71541a
@@ -1270,7 +1265,7 @@ Pcs.Cluster = Ember.Object.extend({
71541a
 
71541a
 Pcs.clusterController = Ember.Object.create({
71541a
   cluster_list: Ember.ArrayController.create({
71541a
-    content: Ember.A(), sortProperties: ['status'],
71541a
+    content: Ember.A(), sortProperties: ['status', 'name'],
71541a
     sortAscending: true,
71541a
     sortFunction: function(a,b){return status_comparator(a,b);}
71541a
   }),
71541a
@@ -1283,26 +1278,25 @@ Pcs.clusterController = Ember.Object.create({
71541a
   num_warning: 0,
71541a
   num_unknown: 0,
71541a
 
71541a
-  update_cur_cluster: function(row) {
71541a
+  update_cur_cluster: function(cluster_name) {
71541a
     var self = this;
71541a
-    var cluster_name = $(row).attr("nodeID");
71541a
-    $("#clusters_list").find("div.arrow").hide();
71541a
-    $(row).find("div.arrow").show();
71541a
+    $("#clusters_list div.arrow").hide();
71541a
+    var selected_cluster = null;
71541a
 
71541a
     $.each(self.get('cluster_list').get('content'), function(key, cluster) {
71541a
       if (cluster.get("name") == cluster_name) {
71541a
-        self.set('cur_cluster', cluster);
71541a
+        selected_cluster = cluster;
71541a
         return false;
71541a
       }
71541a
     });
71541a
-    correct_visibility_dashboard(self.get('cur_cluster'));
71541a
 
71541a
-    $("#node_sub_info").children().each(function (i, val) {
71541a
-      if ($(val).attr("id") == ("cluster_info_" + cluster_name))
71541a
-        $(val).show();
71541a
-      else
71541a
-        $(val).hide();
71541a
-    });
71541a
+    self.set('cur_cluster', selected_cluster);
71541a
+    if (selected_cluster) {
71541a
+      Ember.run.next(function() {
71541a
+        $("#clusters_list tr[nodeID=" + cluster_name + "] div.arrow").show();
71541a
+        correct_visibility_dashboard(self.get('cur_cluster'));
71541a
+      });
71541a
+    }
71541a
   },
71541a
 
71541a
   update: function(data) {
71541a
@@ -1355,21 +1349,6 @@ Pcs.clusterController = Ember.Object.create({
71541a
         });
71541a
       }
71541a
 
71541a
-      switch (cluster.get('status')) {
71541a
-        case "ok":
71541a
-          self.incrementProperty('num_ok');
71541a
-          break;
71541a
-        case "error":
71541a
-          self.incrementProperty('num_error');
71541a
-          break;
71541a
-        case "warning":
71541a
-          self.incrementProperty('num_warning');
71541a
-          break;
71541a
-        default:
71541a
-          self.incrementProperty('num_unknown');
71541a
-          break;
71541a
-      }
71541a
-
71541a
       var nodes_to_auth = [];
71541a
       $.each(cluster.get('warning_list'), function(key, val){
71541a
         if (val.hasOwnProperty("type") && val.type == "nodes_not_authorized"){
71541a
@@ -1398,6 +1377,21 @@ Pcs.clusterController = Ember.Object.create({
71541a
 
71541a
         cluster.set("status", "unknown");
71541a
       }
71541a
+
71541a
+      switch (get_status_value(cluster.get('status'))) {
71541a
+        case get_status_value("ok"):
71541a
+          self.incrementProperty('num_ok');
71541a
+          break;
71541a
+        case get_status_value("error"):
71541a
+          self.incrementProperty('num_error');
71541a
+          break;
71541a
+        case get_status_value("warning"):
71541a
+          self.incrementProperty('num_warning');
71541a
+          break;
71541a
+        default:
71541a
+          self.incrementProperty('num_unknown');
71541a
+          break;
71541a
+      }
71541a
     });
71541a
 
71541a
     var to_remove = [];
71541a
diff --git a/pcsd/public/js/pcsd.js b/pcsd/public/js/pcsd.js
71541a
index e4830a9..cddf14e 100644
71541a
--- a/pcsd/public/js/pcsd.js
71541a
+++ b/pcsd/public/js/pcsd.js
71541a
@@ -1850,10 +1850,10 @@ function get_status_value(status) {
71541a
     standby: 2,
71541a
     "partially running": 2,
71541a
     disabled: 3,
71541a
-    unknown: 3,
71541a
-    ok: 4,
71541a
-    running: 4,
71541a
-    online: 4
71541a
+    unknown: 4,
71541a
+    ok: 5,
71541a
+    running: 5,
71541a
+    online: 5
71541a
   };
71541a
   return ((values.hasOwnProperty(status)) ? values[status] : -1);
71541a
 }
71541a
@@ -1866,11 +1866,25 @@ function status_comparator(a,b) {
71541a
   return valA - valB;
71541a
 }
71541a
 
71541a
+function get_status_icon_class(status_val) {
71541a
+  switch (status_val) {
71541a
+    case get_status_value("error"):
71541a
+      return "error";
71541a
+    case get_status_value("disabled"):
71541a
+    case get_status_value("warning"):
71541a
+      return "warning";
71541a
+    case get_status_value("ok"):
71541a
+      return "check";
71541a
+    default:
71541a
+      return "x";
71541a
+  }
71541a
+}
71541a
+
71541a
 function get_status_color(status_val) {
71541a
   if (status_val == get_status_value("ok")) {
71541a
     return "green";
71541a
   }
71541a
-  else if (status_val == get_status_value("warning") || status_val == get_status_value("unknown")) {
71541a
+  else if (status_val == get_status_value("warning") || status_val == get_status_value("unknown") || status_val == get_status_value('disabled')) {
71541a
     return "orange";
71541a
   }
71541a
   return "red";
71541a
diff --git a/pcsd/views/_cluster_list.erb b/pcsd/views/_cluster_list.erb
71541a
index 9d719e0..90f084e 100644
71541a
--- a/pcsd/views/_cluster_list.erb
71541a
+++ b/pcsd/views/_cluster_list.erb
71541a
@@ -22,7 +22,7 @@
71541a
       {{/if}}
71541a
     
71541a
     {{#each Pcs.clusterController.cluster_list }}
71541a
-    
71541a
+    
71541a
     
71541a
       <input class="node_list_check" type="checkbox" {{bind-attr name="input_name"}} {{bind-attr res_id="name"}}>
71541a
     
71541a
@@ -42,7 +42,7 @@
71541a
       {{else}}
71541a
         {{nodes.length}}
71541a
         {{#if nodes_failed}}
71541a
-        | 
{{nodes_failed}}
71541a
+        | 
{{nodes_failed}}
71541a
         {{/if}}
71541a
       {{/if}}
71541a
     
71541a
@@ -52,7 +52,7 @@
71541a
       {{else}}
71541a
         {{resource_list.length}}
71541a
         {{#if resources_failed}}
71541a
-      | 
{{resources_failed}}
71541a
+      | 
{{resources_failed}}
71541a
         {{/if}}
71541a
       {{/if}}
71541a
     
71541a
diff --git a/pcsd/views/main.erb b/pcsd/views/main.erb
71541a
index bb4e989..b24c74a 100644
71541a
--- a/pcsd/views/main.erb
71541a
+++ b/pcsd/views/main.erb
71541a
@@ -151,7 +151,7 @@
71541a
             <input disabled style="margin-right: 50px;" type="text" {{bind-attr value=resource._id}} size="35" class="text_field">
71541a
           
71541a
           
71541a
-            
71541a
+            {{{resource.status_icon}}}
71541a
           
71541a
           {{{resource.show_status}}}
71541a
         
71541a
diff --git a/pcsd/views/manage.erb b/pcsd/views/manage.erb
71541a
index 79a8637..3620779 100644
71541a
--- a/pcsd/views/manage.erb
71541a
+++ b/pcsd/views/manage.erb
71541a
@@ -42,131 +42,132 @@
71541a
 	
INFORMATION ABOUT CLUSTERS
71541a
       
71541a
       
71541a
-	
Select a cluster to view more detailed cluster information
71541a
-	{{#each Pcs.clusterController.cluster_list}}
71541a
-	  
71541a
-	    
71541a
-	      
71541a
-          
71541a
-            Cluster: 
71541a
-          
71541a
-          
71541a
-            {{#if forbidden}}
71541a
-              {{name}}
71541a
-            {{else}}
71541a
-              {{name}} {{{quorum_show}}}
71541a
+        {{#if Pcs.clusterController.cur_cluster}}
71541a
+        
71541a
+          
71541a
+            
71541a
+              
71541a
+                Cluster: 
71541a
+              
71541a
+              
71541a
+                {{#if Pcs.clusterController.cur_cluster.forbidden}}
71541a
+                  {{Pcs.clusterController.cur_cluster.name}}
71541a
+                {{else}}
71541a
+                  {{Pcs.clusterController.cur_cluster.name}} {{{Pcs.clusterController.cur_cluster.quorum_show}}}
71541a
+                {{/if}}
71541a
+              
71541a
+            
71541a
+            {{#if Pcs.clusterController.cur_cluster.error_list}}
71541a
+              Errors: 
71541a
             {{/if}}
71541a
-          
71541a
-        
71541a
-          {{#if error_list}}
71541a
-          Errors: 
71541a
-          {{/if}}
71541a
-          {{#each error_list}}
71541a
-          {{{message}}}
71541a
-          {{/each}}
71541a
-          {{#if warning_list}}
71541a
-          Warnings: 
71541a
-          {{/if}}
71541a
-          {{#each warning_list}}
71541a
-          {{{message}}}
71541a
-          {{/each}}
71541a
-        
71541a
-        {{#unless forbidden}}
71541a
-        
71541a
-          
71541a
-            
71541a
-              
71541a
-              
71541a
-              Nodes ({{nodes.length}} | {{#if nodes_failed}}issues: {{nodes_failed}}{{else}}OK{{/if}})
71541a
+            {{#each Pcs.clusterController.cur_cluster.error_list}}
71541a
+              {{{message}}}
71541a
+            {{/each}}
71541a
+            {{#if Pcs.clusterController.cur_cluster.warning_list}}
71541a
+              Warnings: 
71541a
+            {{/if}}
71541a
+            {{#each Pcs.clusterController.cur_cluster.warning_list}}
71541a
+              {{{message}}}
71541a
+            {{/each}}
71541a
+          
71541a
+          {{#unless Pcs.clusterController.cur_cluster.forbidden}}
71541a
+          
71541a
+            
71541a
+              
71541a
+                
71541a
+                
71541a
+                Nodes ({{Pcs.clusterController.cur_cluster.nodes.length}} | {{#if Pcs.clusterController.cur_cluster.nodes_failed}}issues: {{Pcs.clusterController.cur_cluster.nodes_failed}}{{else}}OK{{/if}})
71541a
               (displaying {{#if Pcs.clusterController.show_all_nodes}}all{{else}}only issues{{/if}})
71541a
-            
71541a
-          
71541a
-          
71541a
-            
71541a
-              
71541a
-                
71541a
-                  NODE
71541a
-                  STATUS
71541a
-                  QUORUM
71541a
-                
71541a
-                {{#each node in nodes}}
71541a
-                
71541a
-                  {{node.name}}
71541a
-                  {{{node.status_icon}}}{{node.status}}
71541a
-                  {{{node.quorum_show}}}
71541a
-                
71541a
-                {{/each}}
71541a
-              
71541a
-            
71541a
-          
71541a
-        
71541a
-        {{#unless status_unknown}}
71541a
-        
71541a
-          
71541a
-            
71541a
-              
71541a
-              
71541a
-              Resources ({{resource_list.length}} | {{#if resources_failed}}issues: {{resources_failed}}{{else}}OK{{/if}})
71541a
+              
71541a
+            
71541a
+            
71541a
+              
71541a
+                
71541a
+                  
71541a
+                    NODE
71541a
+                    STATUS
71541a
+                    QUORUM
71541a
+                  
71541a
+                  {{#each node in Pcs.clusterController.cur_cluster.nodes}}
71541a
+                  
71541a
+                    {{node.name}}
71541a
+                    {{{node.status_icon}}}{{node.status}}
71541a
+                    {{{node.quorum_show}}}
71541a
+                  
71541a
+                  {{/each}}
71541a
+                
71541a
+              
71541a
+            
71541a
+          
71541a
+          {{#unless Pcs.clusterController.cur_cluster.status_unknown}}
71541a
+          
71541a
+            
71541a
+              
71541a
+                
71541a
+                
71541a
+                Resources ({{Pcs.clusterController.cur_cluster.resource_list.length}} | {{#if Pcs.clusterController.cur_cluster.resources_failed}}issues: {{Pcs.clusterController.cur_cluster.resources_failed}}{{else}}OK{{/if}})
71541a
               (displaying {{#if Pcs.clusterController.show_all_resources}}all{{else}}only issues{{/if}})
71541a
-            
71541a
-          
71541a
-          
71541a
-            
71541a
-              
71541a
-                
71541a
-                  RESOURCE
71541a
-                  STATUS
71541a
-                
71541a
-                {{#each r in resource_list}}
71541a
-                
71541a
-                  {{r.id}}
71541a
-                  {{{r.status_icon}}}{{r.status}}
71541a
-                
71541a
-                {{else}}
71541a
-                
71541a
-                  No resources
71541a
-                  
71541a
-                
71541a
-                {{/each}}
71541a
-              
71541a
-            
71541a
-          
71541a
-        
71541a
-        
71541a
-          
71541a
-            
71541a
-              
71541a
-              
71541a
-              Fence-devices ({{fence_list.length}} | {{#if fence_failed}}issues: {{fence_failed}}{{else}}OK{{/if}})
71541a
+              
71541a
+            
71541a
+            
71541a
+              
71541a
+                
71541a
+                  
71541a
+                    RESOURCE
71541a
+                    STATUS
71541a
+                  
71541a
+                  {{#each r in Pcs.clusterController.cur_cluster.resource_list}}
71541a
+                  
71541a
+                    {{r.id}}
71541a
+                    {{{r.status_icon}}}{{r.status}}
71541a
+                  
71541a
+                  {{else}}
71541a
+                  
71541a
+                    No resources
71541a
+                    
71541a
+                  
71541a
+                  {{/each}}
71541a
+                
71541a
+              
71541a
+            
71541a
+          
71541a
+          
71541a
+            
71541a
+              
71541a
+                
71541a
+                
71541a
+                Fence-devices ({{Pcs.clusterController.cur_cluster.fence_list.length}} | {{#if Pcs.clusterController.cur_cluster.fence_failed}}issues: {{Pcs.clusterController.cur_cluster.fence_failed}}{{else}}OK{{/if}})
71541a
               (displaying {{#if Pcs.clusterController.show_all_fence}}all{{else}}only issues{{/if}})
71541a
-            
71541a
-          
71541a
-          
71541a
-            
71541a
-              
71541a
-                
71541a
-                  FENCE-DEVICE
71541a
-                  STATUS
71541a
-                
71541a
-                {{#each f in fence_list}}
71541a
-                
71541a
-                  {{f.id}}
71541a
-                  {{{f.status_icon}}}{{f.status}}
71541a
-                
71541a
-                {{else}}
71541a
-                
71541a
-                  No fence devices
71541a
-                  
71541a
-                
71541a
-                {{/each}}
71541a
-              
71541a
-            
71541a
-          
71541a
-        
71541a
-        {{/unless}}
71541a
-        {{/unless}}
71541a
-	  
71541a
-	{{/each}}
71541a
+              
71541a
+            
71541a
+            
71541a
+              
71541a
+                
71541a
+                  
71541a
+                    FENCE-DEVICE
71541a
+                    STATUS
71541a
+                  
71541a
+                  {{#each f in Pcs.clusterController.cur_cluster.fence_list}}
71541a
+                  
71541a
+                    {{f.id}}
71541a
+                    {{{f.status_icon}}}{{f.status}}
71541a
+                  
71541a
+                  {{else}}
71541a
+                  
71541a
+                    No fence devices
71541a
+                    
71541a
+                  
71541a
+                  {{/each}}
71541a
+                
71541a
+              
71541a
+            
71541a
+          
71541a
+          {{/unless}}
71541a
+          {{/unless}}
71541a
+        
71541a
+        {{else}}
71541a
+        
Select a cluster to view more detailed cluster information
71541a
+        {{/if}}
71541a
       
71541a
     
71541a
   
71541a
-- 
71541a
1.9.1
71541a