Revision 20529708
b/lib/masterd/iallocator.py | ||
---|---|---|
543 | 543 |
(node_name, attr, value)) |
544 | 544 |
return value |
545 | 545 |
|
546 |
@staticmethod |
|
547 |
def _ComputeStorageData(node_info, node_name, has_lvm): |
|
548 |
"""Extract storage data from the node info. |
|
549 |
|
|
550 |
@type node_info: see result of RPC call 'node info' |
|
551 |
@param node_info: the node's live information |
|
552 |
@type node_name: string |
|
553 |
@param node_name: the node's name |
|
554 |
@type has_lvm: boolean |
|
555 |
@param has_lvm: whether or not lvm storage info was requested |
|
556 |
@rtype: 4-tuple of integers |
|
557 |
@return: tuple of storage info (total_disk, free_disk, total_spindles, |
|
558 |
free_spindles) |
|
559 |
|
|
560 |
""" |
|
561 |
# TODO: replace this with proper storage reporting |
|
562 |
if has_lvm: |
|
563 |
total_disk = IAllocator._GetAttributeFromNodeData(node_info, node_name, |
|
564 |
"storage_size") |
|
565 |
free_disk = IAllocator._GetAttributeFromNodeData(node_info, node_name, |
|
566 |
"storage_free") |
|
567 |
total_spindles = IAllocator._GetAttributeFromNodeData( |
|
568 |
node_info, node_name, "spindles_total") |
|
569 |
free_spindles = IAllocator._GetAttributeFromNodeData( |
|
570 |
node_info, node_name, "spindles_free") |
|
571 |
else: |
|
572 |
# we didn't even ask the node for VG status, so use zeros |
|
573 |
total_disk = free_disk = 0 |
|
574 |
total_spindles = free_spindles = 0 |
|
575 |
return (total_disk, free_disk, total_spindles, free_spindles) |
|
576 |
|
|
546 | 577 |
def _ComputeDynamicNodeData(self, node_cfg, node_data, node_iinfo, i_list, |
547 | 578 |
node_results, has_lvm): |
548 | 579 |
"""Compute global node data. |
... | ... | |
583 | 614 |
if iinfo.admin_state == constants.ADMINST_UP: |
584 | 615 |
i_p_up_mem += beinfo[constants.BE_MAXMEM] |
585 | 616 |
|
586 |
# TODO: replace this with proper storage reporting |
|
587 |
if has_lvm: |
|
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") |
|
596 |
else: |
|
597 |
# we didn't even ask the node for VG status, so use zeros |
|
598 |
total_disk = free_disk = 0 |
|
599 |
total_spindles = free_spindles = 0 |
|
617 |
(total_disk, free_disk, total_spindles, free_spindles) = \ |
|
618 |
self._ComputeStorageData(remote_info, ninfo.name, has_lvm) |
|
600 | 619 |
|
601 | 620 |
# compute memory used by instances |
602 | 621 |
pnr_dyn = { |
b/test/py/ganeti.masterd.iallocator_unittest.py | ||
---|---|---|
22 | 22 |
"""Script for testing ganeti.masterd.iallocator""" |
23 | 23 |
|
24 | 24 |
import unittest |
25 |
import mock |
|
25 | 26 |
|
26 | 27 |
from ganeti import compat |
27 | 28 |
from ganeti import constants |
28 | 29 |
from ganeti import errors |
29 | 30 |
from ganeti import objects |
30 | 31 |
from ganeti import ht |
32 |
from ganeti import rpc |
|
31 | 33 |
from ganeti.masterd import iallocator |
32 | 34 |
|
33 | 35 |
import testutils |
... | ... | |
177 | 179 |
else: |
178 | 180 |
self.assertTrue(result["node1"]["offline"]) |
179 | 181 |
|
182 |
class TestProcessStorageInfo(unittest.TestCase): |
|
183 |
|
|
184 |
def setUp(self): |
|
185 |
self.free_storage_file = 23 |
|
186 |
self.total_storage_file = 42 |
|
187 |
self.free_storage_lvm = 69 |
|
188 |
self.total_storage_lvm = 666 |
|
189 |
self.space_info = [{"name": "mynode", |
|
190 |
"type": constants.ST_FILE, |
|
191 |
"storage_free": self.free_storage_file, |
|
192 |
"storage_size": self.total_storage_file}, |
|
193 |
{"name": "mynode", |
|
194 |
"type": constants.ST_LVM_VG, |
|
195 |
"storage_free": self.free_storage_lvm, |
|
196 |
"storage_size": self.total_storage_lvm}, |
|
197 |
{"name": "mynode", |
|
198 |
"type": constants.ST_LVM_PV, |
|
199 |
"storage_free": 33, |
|
200 |
"storage_size": 44}] |
|
201 |
self.node_info = ("123", self.space_info, ({},)) |
|
202 |
|
|
203 |
def testComputeStorageDataLvm(self): |
|
204 |
has_lvm = True |
|
205 |
node_name = "mynode" |
|
206 |
remote_info = rpc.MakeLegacyNodeInfo(self.node_info, |
|
207 |
require_vg_info=has_lvm) |
|
208 |
(total_disk, free_disk, total_spindles, free_spindles) = \ |
|
209 |
iallocator.IAllocator._ComputeStorageData(remote_info, node_name, has_lvm) |
|
210 |
self.assertEqual(self.free_storage_lvm, free_disk) |
|
211 |
self.assertEqual(self.total_storage_lvm, total_disk) |
|
212 |
|
|
213 |
def testComputeStorageDataDefault(self): |
|
214 |
has_lvm = False |
|
215 |
node_name = "mynode" |
|
216 |
remote_info = rpc.MakeLegacyNodeInfo(self.node_info, |
|
217 |
require_vg_info=has_lvm) |
|
218 |
(total_disk, free_disk, total_spindles, free_spindles) = \ |
|
219 |
iallocator.IAllocator._ComputeStorageData(remote_info, node_name, has_lvm) |
|
220 |
# FIXME: right now, iallocator ignores anything else than LVM, adjust |
|
221 |
# this test once that arbitrary storage is supported |
|
222 |
self.assertEqual(0, free_disk) |
|
223 |
self.assertEqual(0, total_disk) |
|
224 |
|
|
180 | 225 |
|
181 | 226 |
if __name__ == "__main__": |
182 | 227 |
testutils.GanetiTestProgram() |
Also available in: Unified diff