Revision ec223efb lib/cmdlib.py

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

  

Also available in: Unified diff