Revision 3eff8ae6

b/lib/cmdlib.py
1219 1219
  EINSTANCEMISSINGDISK = (TINSTANCE, "EINSTANCEMISSINGDISK")
1220 1220
  EINSTANCEFAULTYDISK = (TINSTANCE, "EINSTANCEFAULTYDISK")
1221 1221
  EINSTANCEWRONGNODE = (TINSTANCE, "EINSTANCEWRONGNODE")
1222
  EINSTANCESPLITGROUPS = (TINSTANCE, "EINSTANCESPLITGROUPS")
1222 1223
  ENODEDRBD = (TNODE, "ENODEDRBD")
1223 1224
  ENODEDRBDHELPER = (TNODE, "ENODEDRBDHELPER")
1224 1225
  ENODEFILECHECK = (TNODE, "ENODEFILECHECK")
......
2048 2049
    """Verify integrity of cluster, performing various test on nodes.
2049 2050

  
2050 2051
    """
2052
    # This method has too many local variables. pylint: disable-msg=R0914
2051 2053
    self.bad = False
2052 2054
    _ErrorIf = self._ErrorIf # pylint: disable-msg=C0103
2053 2055
    verbose = self.op.verbose
......
2067 2069
    cluster = self.cfg.GetClusterInfo()
2068 2070
    nodelist = utils.NiceSort(self.cfg.GetNodeList())
2069 2071
    nodeinfo = [self.cfg.GetNodeInfo(nname) for nname in nodelist]
2072
    nodeinfo_byname = dict(zip(nodelist, nodeinfo))
2070 2073
    instancelist = utils.NiceSort(self.cfg.GetInstanceList())
2071 2074
    instanceinfo = dict((iname, self.cfg.GetInstanceInfo(iname))
2072 2075
                        for iname in instancelist)
2076
    groupinfo = self.cfg.GetAllNodeGroupsInfo()
2073 2077
    i_non_redundant = [] # Non redundant instances
2074 2078
    i_non_a_balanced = [] # Non auto-balanced instances
2075 2079
    n_offline = 0 # Count of offline nodes
......
2254 2258
      # FIXME: does not support file-backed instances
2255 2259
      if not inst_config.secondary_nodes:
2256 2260
        i_non_redundant.append(instance)
2261

  
2257 2262
      _ErrorIf(len(inst_config.secondary_nodes) > 1, self.EINSTANCELAYOUT,
2258 2263
               instance, "instance has multiple secondary nodes: %s",
2259 2264
               utils.CommaJoin(inst_config.secondary_nodes),
2260 2265
               code=self.ETYPE_WARNING)
2261 2266

  
2267
      if inst_config.disk_template in constants.DTS_NET_MIRROR:
2268
        pnode = inst_config.primary_node
2269
        instance_nodes = utils.NiceSort(inst_config.all_nodes)
2270
        instance_groups = {}
2271

  
2272
        for node in instance_nodes:
2273
          instance_groups.setdefault(nodeinfo_byname[node].group,
2274
                                     []).append(node)
2275

  
2276
        pretty_list = [
2277
          "%s (group %s)" % (utils.CommaJoin(nodes), groupinfo[group].name)
2278
          # Sort so that we always list the primary node first.
2279
          for group, nodes in sorted(instance_groups.items(),
2280
                                     key=lambda (_, nodes): pnode in nodes,
2281
                                     reverse=True)]
2282

  
2283
        self._ErrorIf(len(instance_groups) > 1, self.EINSTANCESPLITGROUPS,
2284
                      instance, "instance has primary and secondary nodes in"
2285
                      " different groups: %s", utils.CommaJoin(pretty_list),
2286
                      code=self.ETYPE_WARNING)
2287

  
2262 2288
      if not cluster.FillBE(inst_config)[constants.BE_AUTO_BALANCE]:
2263 2289
        i_non_a_balanced.append(instance)
2264 2290

  

Also available in: Unified diff