Revision 0f70b3fb

b/lib/masterd/iallocator.py
518 518
    return node_results
519 519

  
520 520
  @staticmethod
521
  def _ComputeDynamicNodeData(node_cfg, node_data, node_iinfo, i_list,
521
  def _GetAttributeFromNodeData(node_data, node_name, attr):
522
    """Helper function to extract an attribute from the node data dictionary.
523

  
524
    @type node_data: dict of strings
525
    @param node_data: result of C{rpc.MakeLegacyNodeInfo}
526
    @type node_name: string
527
    @param node_name: name of the node
528
    @type attr: string
529
    @param attr: key of the attribute in the node_data dictionary
530
    @rtype: integer
531
    @return: the value of the attribute
532
    @raises errors.OpExecError: if key not in dictionary or value not
533
      integer
534

  
535
    """
536
    if attr not in node_data:
537
      raise errors.OpExecError("Node '%s' didn't return attribute"
538
                               " '%s'" % (node_name, attr))
539
    value = node_data[attr]
540
    if not isinstance(value, int):
541
      raise errors.OpExecError("Node '%s' returned invalid value"
542
                               " for '%s': %s" %
543
                               (node_name, attr, value))
544
    return value
545

  
546
  def _ComputeDynamicNodeData(self, node_cfg, node_data, node_iinfo, i_list,
522 547
                              node_results, has_lvm):
523 548
    """Compute global node data.
524 549

  
......
540 565
        remote_info = rpc.MakeLegacyNodeInfo(nresult.payload,
541 566
                                             require_vg_info=has_lvm)
542 567

  
543
        def get_attr(attr):
544
          if attr not in remote_info:
545
            raise errors.OpExecError("Node '%s' didn't return attribute"
546
                                     " '%s'" % (ninfo.name, attr))
547
          value = remote_info[attr]
548
          if not isinstance(value, int):
549
            raise errors.OpExecError("Node '%s' returned invalid value"
550
                                     " for '%s': %s" %
551
                                     (ninfo.name, attr, value))
552
          return value
553

  
554
        mem_free = get_attr("memory_free")
568
        mem_free = self._GetAttributeFromNodeData(remote_info, ninfo.name,
569
                                                  "memory_free")
555 570

  
556 571
        # compute memory used by primary instances
557 572
        i_p_mem = i_p_up_mem = 0
......
570 585

  
571 586
        # TODO: replace this with proper storage reporting
572 587
        if has_lvm:
573
          total_disk = get_attr("storage_size")
574
          free_disk = get_attr("storage_free")
575
          total_spindles = get_attr("spindles_total")
576
          free_spindles = get_attr("spindles_free")
588
          total_disk = self._GetAttributeFromNodeData(remote_info, ninfo.name,
589
                                                      "storage_size")
590
          free_disk = self._GetAttributeFromNodeData(remote_info, ninfo.name,
591
                                                     "storage_free")
592
          total_spindles = self._GetAttributeFromNodeData(
593
              remote_info, ninfo.name, "spindles_total")
594
          free_spindles = self._GetAttributeFromNodeData(
595
              remote_info, ninfo.name, "spindles_free")
577 596
        else:
578 597
          # we didn't even ask the node for VG status, so use zeros
579 598
          total_disk = free_disk = 0
......
581 600

  
582 601
        # compute memory used by instances
583 602
        pnr_dyn = {
584
          "total_memory": get_attr("memory_total"),
585
          "reserved_memory": get_attr("memory_dom0"),
603
          "total_memory": self._GetAttributeFromNodeData(
604
              remote_info, ninfo.name, "memory_total"),
605
          "reserved_memory": self._GetAttributeFromNodeData(
606
              remote_info, ninfo.name, "memory_dom0"),
586 607
          "free_memory": mem_free,
587 608
          "total_disk": total_disk,
588 609
          "free_disk": free_disk,
589 610
          "total_spindles": total_spindles,
590 611
          "free_spindles": free_spindles,
591
          "total_cpus": get_attr("cpu_total"),
612
          "total_cpus": self._GetAttributeFromNodeData(
613
              remote_info, ninfo.name, "cpu_total"),
592 614
          "i_pri_memory": i_p_mem,
593 615
          "i_pri_up_memory": i_p_up_mem,
594 616
          }

Also available in: Unified diff