1 |
1 |
#
|
2 |
2 |
#
|
3 |
3 |
|
4 |
|
# Copyright (C) 2006, 2007, 2008, 2009, 2010 Google Inc.
|
|
4 |
# Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Google Inc.
|
5 |
5 |
#
|
6 |
6 |
# This program is free software; you can redistribute it and/or modify
|
7 |
7 |
# it under the terms of the GNU General Public License as published by
|
... | ... | |
10640 |
10640 |
"enabled_hypervisors": list(cluster_info.enabled_hypervisors),
|
10641 |
10641 |
# we don't have job IDs
|
10642 |
10642 |
}
|
|
10643 |
ninfo = cfg.GetAllNodesInfo()
|
10643 |
10644 |
iinfo = cfg.GetAllInstancesInfo().values()
|
10644 |
10645 |
i_list = [(inst, cluster_info.FillBE(inst)) for inst in iinfo]
|
10645 |
10646 |
|
10646 |
10647 |
# node data
|
10647 |
|
node_list = cfg.GetNodeList()
|
|
10648 |
node_list = [n.name for n in ninfo.values() if n.vm_capable]
|
10648 |
10649 |
|
10649 |
10650 |
if self.mode == constants.IALLOCATOR_MODE_ALLOC:
|
10650 |
10651 |
hypervisor_name = self.hypervisor
|
... | ... | |
10661 |
10662 |
|
10662 |
10663 |
data["nodegroups"] = self._ComputeNodeGroupData(cfg)
|
10663 |
10664 |
|
10664 |
|
data["nodes"] = self._ComputeNodeData(cfg, node_data, node_iinfo, i_list)
|
|
10665 |
config_ndata = self._ComputeBasicNodeData(ninfo)
|
|
10666 |
data["nodes"] = self._ComputeDynamicNodeData(ninfo, node_data, node_iinfo,
|
|
10667 |
i_list, config_ndata)
|
|
10668 |
assert len(data["nodes"]) == len(ninfo), \
|
|
10669 |
"Incomplete node data computed"
|
10665 |
10670 |
|
10666 |
10671 |
data["instances"] = self._ComputeInstanceData(cluster_info, i_list)
|
10667 |
10672 |
|
... | ... | |
10681 |
10686 |
return ng
|
10682 |
10687 |
|
10683 |
10688 |
@staticmethod
|
10684 |
|
def _ComputeNodeData(cfg, node_data, node_iinfo, i_list):
|
|
10689 |
def _ComputeBasicNodeData(node_cfg):
|
10685 |
10690 |
"""Compute global node data.
|
10686 |
10691 |
|
|
10692 |
@rtype: dict
|
|
10693 |
@returns: a dict of name: (node dict, node config)
|
|
10694 |
|
10687 |
10695 |
"""
|
10688 |
10696 |
node_results = {}
|
10689 |
|
for nname, nresult in node_data.items():
|
10690 |
|
# first fill in static (config-based) values
|
10691 |
|
ninfo = cfg.GetNodeInfo(nname)
|
|
10697 |
for ninfo in node_cfg.values():
|
|
10698 |
# fill in static (config-based) values
|
10692 |
10699 |
pnr = {
|
10693 |
10700 |
"tags": list(ninfo.GetTags()),
|
10694 |
10701 |
"primary_ip": ninfo.primary_ip,
|
... | ... | |
10701 |
10708 |
"vm_capable": ninfo.vm_capable,
|
10702 |
10709 |
}
|
10703 |
10710 |
|
|
10711 |
node_results[ninfo.name] = pnr
|
|
10712 |
|
|
10713 |
return node_results
|
|
10714 |
|
|
10715 |
@staticmethod
|
|
10716 |
def _ComputeDynamicNodeData(node_cfg, node_data, node_iinfo, i_list,
|
|
10717 |
node_results):
|
|
10718 |
"""Compute global node data.
|
|
10719 |
|
|
10720 |
@param node_results: the basic node structures as filled from the config
|
|
10721 |
|
|
10722 |
"""
|
|
10723 |
# make a copy of the current dict
|
|
10724 |
node_results = dict(node_results)
|
|
10725 |
for nname, nresult in node_data.items():
|
|
10726 |
assert nname in node_results, "Missing basic data for node %s" % nname
|
|
10727 |
ninfo = node_cfg[nname]
|
|
10728 |
|
10704 |
10729 |
if not (ninfo.offline or ninfo.drained):
|
10705 |
10730 |
nresult.Raise("Can't get data for node %s" % nname)
|
10706 |
10731 |
node_iinfo[nname].Raise("Can't get node instance info from node %s" %
|
... | ... | |
10742 |
10767 |
"i_pri_memory": i_p_mem,
|
10743 |
10768 |
"i_pri_up_memory": i_p_up_mem,
|
10744 |
10769 |
}
|
10745 |
|
pnr.update(pnr_dyn)
|
|
10770 |
pnr_dyn.update(node_results[nname])
|
10746 |
10771 |
|
10747 |
|
node_results[nname] = pnr
|
|
10772 |
node_results[nname] = pnr_dyn
|
10748 |
10773 |
|
10749 |
10774 |
return node_results
|
10750 |
10775 |
|