Commit f276c4b5 authored by Iustin Pop's avatar Iustin Pop
Browse files

Read disk template from export info

This patch changes the instance import to read the disk template
automatically from the export info, if the opcode doesn't already
specify a disk template.

To do this, we have a couple of additional changes:

- change from required parameter to optional one for disk_template
- move check for disabled file storage at ./configure time to the
  generic _CheckDiskTemplate checker
- move checks of the disk template from CheckArguments to CheckPrereq
Signed-off-by: default avatarIustin Pop <>
Reviewed-by: default avatarMichael Hanselmann <>
parent c1c31426
......@@ -568,6 +568,9 @@ def _CheckDiskTemplate(template):
msg = ("Invalid disk template name '%s', valid templates are: %s" %
(template, utils.CommaJoin(constants.DISK_TEMPLATES)))
raise errors.OpPrereqError(msg, errors.ECODE_INVAL)
if template == constants.DT_FILE and not constants.ENABLE_FILE_STORAGE:
raise errors.OpPrereqError("File storage disabled at configure time",
def _CheckInstanceDown(lu, instance, reason):
......@@ -5973,7 +5976,7 @@ class LUCreateInstance(LogicalUnit):
HPATH = "instance-add"
_OP_REQP = ["instance_name", "disks", "disk_template",
_OP_REQP = ["instance_name", "disks",
"mode", "start",
"wait_for_sync", "ip_check", "nics",
"hvparams", "beparams"]
......@@ -5984,7 +5987,8 @@ class LUCreateInstance(LogicalUnit):
# set optional parameters to none if they don't exist
for attr in ["pnode", "snode", "iallocator", "hypervisor"]:
for attr in ["pnode", "snode", "iallocator", "hypervisor",
if not hasattr(self.op, attr):
setattr(self.op, attr, None)
......@@ -6003,10 +6007,6 @@ class LUCreateInstance(LogicalUnit):
# TODO: make the ip check more flexible and not depend on the name check
raise errors.OpPrereqError("Cannot do ip checks without a name check",
if (self.op.disk_template == constants.DT_FILE and
not constants.ENABLE_FILE_STORAGE):
raise errors.OpPrereqError("File storage disabled at configure time",
# check disk information: either all adopt, or no adopt
has_adopt = has_no_adopt = False
for disk in self.op.disks:
......@@ -6037,9 +6037,6 @@ class LUCreateInstance(LogicalUnit):
raise errors.OpPrereqError("Invalid instance creation mode '%s'" %
self.op.mode, errors.ECODE_INVAL)
# disk template
# instance name verification
if self.op.name_check:
self.hostname1 = utils.GetHostInfo(self.op.instance_name)
......@@ -6079,6 +6076,9 @@ class LUCreateInstance(LogicalUnit):
raise errors.OpPrereqError("No guest OS specified",
self.op.force_variant = getattr(self.op, "force_variant", False)
if self.op.disk_template is None:
raise errors.OpPrereqError("No disk template specified",
def ExpandNames(self):
"""ExpandNames for CreateInstance.
......@@ -6248,12 +6248,32 @@ class LUCreateInstance(LogicalUnit):
return export_info
def _ReadExportParams(self, einfo):
"""Use export parameters as defaults.
In case the opcode doesn't specify (as in override) some instance
parameters, then try to use them from the export information, if
that declares them.
if self.op.disk_template is None:
if einfo.has_option(constants.INISECT_INS, "disk_template"):
self.op.disk_template = einfo.get(constants.INISECT_INS,
raise errors.OpPrereqError("No disk template specified and the export"
" is missing the disk_template information",
def CheckPrereq(self):
"""Check prerequisites.
if self.op.mode == constants.INSTANCE_IMPORT:
export_info = self._ReadExportInfo()
if (not self.cfg.GetVGName() and
self.op.disk_template not in constants.DTS_NOT_LVM):
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