Revision 0f70b3fb lib/masterd/iallocator.py
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