Revision ec223efb

b/lib/cmdlib.py
1129 1129
  """Logical unit for querying nodes.
1130 1130

  
1131 1131
  """
1132
  _OP_REQP = ["output_fields"]
1132
  _OP_REQP = ["output_fields", "nodes"]
1133 1133

  
1134 1134
  def CheckPrereq(self):
1135 1135
    """Check prerequisites.
......
1140 1140
    self.dynamic_fields = frozenset(["dtotal", "dfree",
1141 1141
                                     "mtotal", "mnode", "mfree"])
1142 1142

  
1143
    _CheckOutputFields(static=["name", "pinst", "sinst", "pip", "sip"],
1143
    _CheckOutputFields(static=["name", "pinst_cnt", "sinst_cnt",
1144
                               "pinst_list", "sinst_list",
1145
                               "pip", "sip"],
1144 1146
                       dynamic=self.dynamic_fields,
1145 1147
                       selected=self.op.output_fields)
1146 1148

  
1149
    self.wanted_nodes = _GetWantedNodes(self, self.op.nodes)
1147 1150

  
1148 1151
  def Exec(self, feedback_fn):
1149 1152
    """Computes the list of nodes and their attributes.
1150 1153

  
1151 1154
    """
1152
    nodenames = utils.NiceSort(self.cfg.GetNodeList())
1155
    nodenames = self.wanted_nodes
1153 1156
    nodelist = [self.cfg.GetNodeInfo(name) for name in nodenames]
1154 1157

  
1155

  
1156 1158
    # begin data gathering
1157 1159

  
1158 1160
    if self.dynamic_fields.intersection(self.op.output_fields):
......
1173 1175
    else:
1174 1176
      live_data = dict.fromkeys(nodenames, {})
1175 1177

  
1176
    node_to_primary = dict.fromkeys(nodenames, 0)
1177
    node_to_secondary = dict.fromkeys(nodenames, 0)
1178
    node_to_primary = dict([(name, set()) for name in nodenames])
1179
    node_to_secondary = dict([(name, set()) for name in nodenames])
1178 1180

  
1179
    if "pinst" in self.op.output_fields or "sinst" in self.op.output_fields:
1181
    inst_fields = frozenset(("pinst_cnt", "pinst_list",
1182
                             "sinst_cnt", "sinst_list"))
1183
    if inst_fields & frozenset(self.op.output_fields):
1180 1184
      instancelist = self.cfg.GetInstanceList()
1181 1185

  
1182
      for instance in instancelist:
1183
        instanceinfo = self.cfg.GetInstanceInfo(instance)
1184
        node_to_primary[instanceinfo.primary_node] += 1
1185
        for secnode in instanceinfo.secondary_nodes:
1186
          node_to_secondary[secnode] += 1
1186
      for instance_name in instancelist:
1187
        inst = self.cfg.GetInstanceInfo(instance_name)
1188
        if inst.primary_node in node_to_primary:
1189
          node_to_primary[inst.primary_node].add(inst.name)
1190
        for secnode in inst.secondary_nodes:
1191
          if secnode in node_to_secondary:
1192
            node_to_secondary[secnode].add(inst.name)
1187 1193

  
1188 1194
    # end data gathering
1189 1195

  
......
1193 1199
      for field in self.op.output_fields:
1194 1200
        if field == "name":
1195 1201
          val = node.name
1196
        elif field == "pinst":
1197
          val = node_to_primary[node.name]
1198
        elif field == "sinst":
1199
          val = node_to_secondary[node.name]
1202
        elif field == "pinst_list":
1203
          val = list(node_to_primary[node.name])
1204
        elif field == "sinst_list":
1205
          val = list(node_to_secondary[node.name])
1206
        elif field == "pinst_cnt":
1207
          val = len(node_to_primary[node.name])
1208
        elif field == "sinst_cnt":
1209
          val = len(node_to_secondary[node.name])
1200 1210
        elif field == "pip":
1201 1211
          val = node.primary_ip
1202 1212
        elif field == "sip":
1203 1213
          val = node.secondary_ip
1204 1214
        elif field in self.dynamic_fields:
1205
          val = live_data[node.name].get(field, "?")
1215
          val = live_data[node.name].get(field, None)
1206 1216
        else:
1207 1217
          raise errors.ParameterError(field)
1208
        val = str(val)
1209 1218
        node_output.append(val)
1210 1219
      output.append(node_output)
1211 1220

  
b/lib/opcodes.py
113 113
class OpQueryNodes(OpCode):
114 114
  """Compute the list of nodes."""
115 115
  OP_ID = "OP_NODE_QUERY"
116
  __slots__ = ["output_fields"]
116
  __slots__ = ["output_fields", "nodes"]
117 117

  
118 118

  
119 119
class OpQueryNodeData(OpCode):
b/scripts/gnt-node
41 41
  if opts.output is None:
42 42
    selected_fields = ["name", "dtotal", "dfree",
43 43
                       "mtotal", "mnode", "mfree",
44
                       "pinst", "sinst"]
44
                       "pinst_cnt", "sinst_cnt"]
45 45
  else:
46 46
    selected_fields = opts.output.split(",")
47 47

  
48
  op = opcodes.OpQueryNodes(output_fields=selected_fields)
48
  op = opcodes.OpQueryNodes(output_fields=selected_fields, nodes=[])
49 49
  output = SubmitOpCode(op)
50 50

  
51 51
  if not opts.no_headers:
52
    headers = {"name": "Node", "pinst": "Pinst", "sinst": "Sinst",
52
    headers = {"name": "Node", "pinst_cnt": "Pinst", "sinst_cnt": "Sinst",
53
               "pinst_list": "PriInstances", "sinst_list": "SecInstances",
53 54
               "pip": "PrimaryIP", "sip": "SecondaryIP",
54 55
               "dtotal": "DTotal", "dfree": "DFree",
55 56
               "mtotal": "MTotal", "mnode": "MNode", "mfree": "MFree"}
......
61 62
  else:
62 63
    unitfields = None
63 64

  
64
  numfields = ["dtotal", "dfree", "mtotal", "mnode", "mfree", "pinst", "sinst"]
65
  numfields = ["dtotal", "dfree",
66
               "mtotal", "mnode", "mfree",
67
               "pinst_cnt", "sinst_cnt"]
68

  
69
  # change raw values to nicer strings
70
  for row in output:
71
    for idx, field in enumerate(selected_fields):
72
      val = row[idx]
73
      if field == "pinst_list":
74
        val = ",".join(val)
75
      elif field == "sinst_list":
76
        val = ",".join(val)
77
      elif val is None:
78
        val = "?"
79
      row[idx] = str(val)
65 80

  
66 81
  data = GenerateTable(separator=opts.separator, headers=headers,
67 82
                       fields=selected_fields, unitfields=unitfields,

Also available in: Unified diff