Merge 'EvacNode' and 'NodeEvacMode'
[ganeti-local] / lib / masterd / iallocator.py
index 140e76e..e380db6 100644 (file)
@@ -336,7 +336,7 @@ class IAReqNodeEvac(IARequestBase):
   MODE = constants.IALLOCATOR_MODE_NODE_EVAC
   REQ_PARAMS = [
     ("instances", _STRING_LIST),
-    ("evac_mode", ht.TElemOf(constants.IALLOCATOR_NEVAC_MODES)),
+    ("evac_mode", ht.TEvacMode),
     ]
   REQ_RESULT = _NEVAC_RESULT
 
@@ -399,7 +399,7 @@ class IAllocator(object):
 
     self._BuildInputData(req)
 
-  def _ComputerClusterDataNodeInfo(self, node_list, cluster_info,
+  def _ComputeClusterDataNodeInfo(self, node_list, cluster_info,
                                    hypervisor_name):
     """Prepare and execute node info call.
 
@@ -413,11 +413,12 @@ class IAllocator(object):
     @return: the result of the node info RPC call
 
     """
-    es_flags = rpc.GetExclusiveStorageForNodes(self.cfg, node_list)
-    storage_units = utils.storage.GetStorageUnitsOfCluster(
+    storage_units_raw = utils.storage.GetStorageUnitsOfCluster(
         self.cfg, include_spindles=True)
+    storage_units = rpc.PrepareStorageUnitsForNodes(self.cfg, storage_units_raw,
+                                                    node_list)
     hvspecs = [(hypervisor_name, cluster_info.hvparams[hypervisor_name])]
-    return self.rpc.call_node_info(node_list, storage_units, hvspecs, es_flags)
+    return self.rpc.call_node_info(node_list, storage_units, hvspecs)
 
   def _ComputeClusterData(self):
     """Compute the generic allocator input data.
@@ -452,8 +453,8 @@ class IAllocator(object):
       node_whitelist = None
 
     has_lvm = utils.storage.IsLvmEnabled(cluster_info.enabled_disk_templates)
-    node_data = self._ComputerClusterDataNodeInfo(node_list, cluster_info,
-                                                  hypervisor_name)
+    node_data = self._ComputeClusterDataNodeInfo(node_list, cluster_info,
+                                                 hypervisor_name)
 
     node_iinfo = \
       self.rpc.call_all_instances_info(node_list,
@@ -547,11 +548,12 @@ class IAllocator(object):
     return value
 
   @staticmethod
-  def _ComputeStorageDataFromNodeInfo(node_info, node_name, has_lvm):
-    """Extract storage data from node info (_not_ legacy node info).
+  def _ComputeStorageDataFromSpaceInfo(space_info, node_name, has_lvm):
+    """Extract storage data from node info.
 
-    @type node_info: see result of the RPC call node info
-    @param node_info: the result of the RPC call node info
+    @type space_info: see result of the RPC call node info
+    @param space_info: the storage reporting part of the result of the RPC call
+      node info
     @type node_name: string
     @param node_name: the node's name
     @type has_lvm: boolean
@@ -561,7 +563,6 @@ class IAllocator(object):
        free_spindles)
 
     """
-    (_, space_info, _) = node_info
     # TODO: replace this with proper storage reporting
     if has_lvm:
       lvm_vg_info = utils.storage.LookupSpaceInfoByStorageType(
@@ -633,7 +634,7 @@ class IAllocator(object):
         nresult.Raise("Can't get data for node %s" % ninfo.name)
         node_iinfo[nuuid].Raise("Can't get node instance info from node %s" %
                                 ninfo.name)
-        (_, _, (hv_info, )) = nresult.payload
+        (_, space_info, (hv_info, )) = nresult.payload
 
         mem_free = self._GetAttributeFromHypervisorNodeData(hv_info, ninfo.name,
                                                             "memory_free")
@@ -641,8 +642,8 @@ class IAllocator(object):
         (i_p_mem, i_p_up_mem, mem_free) = self._ComputeInstanceMemory(
              i_list, node_iinfo, nuuid, mem_free)
         (total_disk, free_disk, total_spindles, free_spindles) = \
-            self._ComputeStorageDataFromNodeInfo(nresult.payload, ninfo.name,
-                                                 has_lvm)
+            self._ComputeStorageDataFromSpaceInfo(space_info, ninfo.name,
+                                                  has_lvm)
 
         # compute memory used by instances
         pnr_dyn = {
@@ -657,6 +658,8 @@ class IAllocator(object):
           "free_spindles": free_spindles,
           "total_cpus": self._GetAttributeFromHypervisorNodeData(
               hv_info, ninfo.name, "cpu_total"),
+          "reserved_cpus": self._GetAttributeFromHypervisorNodeData(
+            hv_info, ninfo.name, "cpu_dom0"),
           "i_pri_memory": i_p_mem,
           "i_pri_up_memory": i_p_up_mem,
           }