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