Commit 2a139bb0 authored by Iustin Pop's avatar Iustin Pop
Browse files

Generalize the replace_secondary mode in iallocator

Currently the replace_secondary mode is too restrictive. This patch
changes this to a general 'relocate' mode where the node(s) to be
changed are specified via a new key in the request dict ('nodes') so
that we can change any of the instance's nodes.

Note that for the relocate mode, len(nodes) == required_nodes, so the
required nodes field is redundant, but it is provided for consistency
with the allocate mode.

Reviewed-by: ultrotter
parent eb0994e7
......@@ -76,7 +76,7 @@ def main():
if req_type == "allocate":
forbidden_nodes = []
inst_data = request
elif req_type == "replace_secondary":
elif req_type == "relocate":
idict = data["instances"][request["name"]]
forbidden_nodes = idict["nodes"]
inst_data = idict
......
......@@ -4877,6 +4877,9 @@ class IAllocator(object):
if instance.disk_template not in constants.DTS_NET_MIRROR:
raise errors.OpPrereqError("Can't relocate non-mirrored instances")
if len(instance.secondary_nodes) != 1:
raise errors.OpPrereqError("Instance has not exactly one secondary node")
self.required_nodes = 1
disk_space = _ComputeDiskSize(instance.disk_template,
......@@ -4884,10 +4887,11 @@ class IAllocator(object):
instance.disks[1].size)
request = {
"type": "replace_secondary",
"type": "relocate",
"name": self.name,
"disk_space_total": disk_space,
"required_nodes": self.required_nodes,
"nodes": list(instance.secondary_nodes),
}
self.in_data["request"] = request
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment