X-Git-Url: https://code.grnet.gr/git/ganeti-local/blobdiff_plain/9f88b0e8ba8ce29aff6099e0a63377de30692610..691e95632e9c675f2fc17fed558fb016691c0db7:/lib/cmdlib.py diff --git a/lib/cmdlib.py b/lib/cmdlib.py index 4d91dd8..b857e39 100644 --- a/lib/cmdlib.py +++ b/lib/cmdlib.py @@ -5988,7 +5988,7 @@ class LUCreateInstance(LogicalUnit): """ # set optional parameters to none if they don't exist for attr in ["pnode", "snode", "iallocator", "hypervisor", - "disk_template"]: + "disk_template", "identify_defaults"]: if not hasattr(self.op, attr): setattr(self.op, attr, None) @@ -6256,6 +6256,8 @@ class LUCreateInstance(LogicalUnit): that declares them. """ + self.op.os_type = einfo.get(constants.INISECT_EXP, "os") + 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, @@ -6265,6 +6267,30 @@ class LUCreateInstance(LogicalUnit): " is missing the disk_template information", errors.ECODE_INVAL) + if not self.op.disks: + if einfo.has_option(constants.INISECT_INS, "disk_count"): + disks = [] + # TODO: import the disk iv_name too + for idx in range(einfo.getint(constants.INISECT_INS, "disk_count")): + disk_sz = einfo.getint(constants.INISECT_INS, "disk%d_size" % idx) + disks.append({"size": disk_sz}) + self.op.disks = disks + else: + raise errors.OpPrereqError("No disk info specified and the export" + " is missing the disk information", + errors.ECODE_INVAL) + + if (not self.op.nics and + einfo.has_option(constants.INISECT_INS, "nic_count")): + nics = [] + for idx in range(einfo.getint(constants.INISECT_INS, "nic_count")): + ndict = {} + for name in list(constants.NICS_PARAMETERS) + ["ip", "mac"]: + v = einfo.get(constants.INISECT_INS, "nic%d_%s" % (idx, name)) + ndict[name] = v + nics.append(ndict) + self.op.nics = nics + if (self.op.hypervisor is None and einfo.has_option(constants.INISECT_INS, "hypervisor")): self.op.hypervisor = einfo.get(constants.INISECT_INS, "hypervisor") @@ -6275,6 +6301,39 @@ class LUCreateInstance(LogicalUnit): if name not in self.op.hvparams: self.op.hvparams[name] = value + if einfo.has_section(constants.INISECT_BEP): + # use the parameters, without overriding + for name, value in einfo.items(constants.INISECT_BEP): + if name not in self.op.beparams: + self.op.beparams[name] = value + else: + # try to read the parameters old style, from the main section + for name in constants.BES_PARAMETERS: + if (name not in self.op.beparams and + einfo.has_option(constants.INISECT_INS, name)): + self.op.beparams[name] = einfo.get(constants.INISECT_INS, name) + + def _RevertToDefaults(self, cluster): + """Revert the instance parameters to the default values. + + """ + # hvparams + hv_defs = cluster.GetHVDefaults(self.op.hypervisor, self.op.os_type) + for name in self.op.hvparams.keys(): + if name in hv_defs and hv_defs[name] == self.op.hvparams[name]: + del self.op.hvparams[name] + # beparams + be_defs = cluster.beparams.get(constants.PP_DEFAULT, {}) + for name in self.op.beparams.keys(): + if name in be_defs and be_defs[name] == self.op.beparams[name]: + del self.op.beparams[name] + # nic params + nic_defs = cluster.nicparams.get(constants.PP_DEFAULT, {}) + for nic in self.op.nics: + for name in constants.NICS_PARAMETERS: + if name in nic and name in nic_defs and nic[name] == nic_defs[name]: + del nic[name] + def CheckPrereq(self): """Check prerequisites. @@ -6303,7 +6362,8 @@ class LUCreateInstance(LogicalUnit): # check hypervisor parameter syntax (locally) utils.ForceDictType(self.op.hvparams, constants.HVS_PARAMETER_TYPES) - filled_hvp = objects.FillDict(cluster.hvparams[self.op.hypervisor], + filled_hvp = objects.FillDict(cluster.GetHVDefaults(self.op.hypervisor, + self.op.os_type), self.op.hvparams) hv_type = hypervisor.GetHypervisor(self.op.hypervisor) hv_type.CheckParameterSyntax(filled_hvp) @@ -6316,6 +6376,11 @@ class LUCreateInstance(LogicalUnit): self.be_full = objects.FillDict(cluster.beparams[constants.PP_DEFAULT], self.op.beparams) + # now that hvp/bep are in final format, let's reset to defaults, + # if told to do so + if self.op.identify_defaults: + self._RevertToDefaults(cluster) + # NIC buildup self.nics = [] for idx, nic in enumerate(self.op.nics): @@ -6418,7 +6483,6 @@ class LUCreateInstance(LogicalUnit): (instance_disks, export_disks), errors.ECODE_INVAL) - self.op.os_type = export_info.get(constants.INISECT_EXP, 'os') disk_images = [] for idx in range(export_disks): option = 'disk%d_dump' % idx