diff --git a/lib/cmdlib.py b/lib/cmdlib.py index 6cdde4e82f6d087d3593ae97c8497ecba97cc77f..6743556a69c50f1a2a82dfe6f065a5e1cfcd47b6 100644 --- a/lib/cmdlib.py +++ b/lib/cmdlib.py @@ -3153,7 +3153,7 @@ class LUCreateInstance(LogicalUnit): HTYPE = constants.HTYPE_INSTANCE _OP_REQP = ["instance_name", "mem_size", "disk_size", "disk_template", "swap_size", "mode", "start", "vcpus", - "wait_for_sync", "ip_check", "mac"] + "wait_for_sync", "ip_check", "mac", "hvparams"] REQ_BGL = False def _ExpandNode(self, node): @@ -3174,10 +3174,7 @@ class LUCreateInstance(LogicalUnit): self.needed_locks = {} # set optional parameters to none if they don't exist - for attr in ["kernel_path", "initrd_path", "pnode", "snode", - "iallocator", "hvm_boot_order", "hvm_acpi", "hvm_pae", - "hvm_cdrom_image_path", "hvm_nic_type", "hvm_disk_type", - "vnc_bind_address", "hypervisor"]: + for attr in ["pnode", "snode", "iallocator", "hypervisor"]: if not hasattr(self.op, attr): setattr(self.op, attr, None) @@ -3202,6 +3199,11 @@ class LUCreateInstance(LogicalUnit): " cluster (%s)" % (self.op.hypervisor, ",".join(enabled_hvs))) + # check hypervisor parameter syntax (locally) + + hv_type = hypervisor.GetHypervisor(self.op.hypervisor) + hv_type.CheckParameterSyntax(self.op.hvparams) + #### instance parameters check # instance name verification @@ -3237,11 +3239,6 @@ class LUCreateInstance(LogicalUnit): raise errors.OpPrereqError("invalid MAC address specified: %s" % self.op.mac) - # boot order verification - if self.op.hvm_boot_order is not None: - if len(self.op.hvm_boot_order.strip("acdn")) != 0: - raise errors.OpPrereqError("invalid boot order specified," - " must be one or more of [acdn]") # file storage checks if (self.op.file_driver and not self.op.file_driver in constants.FILE_DRIVER): @@ -3435,12 +3432,13 @@ class LUCreateInstance(LogicalUnit): " the primary node.") self.secondaries.append(self.op.snode) + nodenames = [pnode.name] + self.secondaries + req_size = _ComputeDiskSize(self.op.disk_template, self.op.disk_size, self.op.swap_size) # Check lv size requirements if req_size is not None: - nodenames = [pnode.name] + self.secondaries nodeinfo = self.rpc.call_node_info(nodenames, self.cfg.GetVGName(), self.op.hypervisor) for node in nodenames: @@ -3457,15 +3455,25 @@ class LUCreateInstance(LogicalUnit): " %d MB available, %d MB required" % (node, info['vg_free'], req_size)) + # hypervisor parameter validation + hvinfo = self.rpc.call_hypervisor_validate_params(nodenames, + self.op.hypervisor, + self.op.hvparams) + for node in nodenames: + info = hvinfo.get(node, None) + if not info or not isinstance(info, (tuple, list)): + raise errors.OpPrereqError("Cannot get current information" + " from node '%s' (%s)" % (node, info)) + if not info[0]: + raise errors.OpPrereqError("Hypervisor parameter validation failed:" + " %s" % info[1]) + # os verification os_obj = self.rpc.call_os_get(pnode.name, self.op.os_type) if not os_obj: raise errors.OpPrereqError("OS '%s' not in supported os list for" " primary node" % self.op.os_type) - if self.op.kernel_path == constants.VALUE_NONE: - raise errors.OpPrereqError("Can't set instance kernel to none") - # bridge check on primary node if not self.rpc.call_bridges_exist(self.pnode.name, [self.op.bridge]): raise errors.OpPrereqError("target bridge '%s' does not exist on" @@ -3478,35 +3486,6 @@ class LUCreateInstance(LogicalUnit): "creating instance %s" % self.op.instance_name, self.op.mem_size, self.op.hypervisor) - # hvm_cdrom_image_path verification - if self.op.hvm_cdrom_image_path is not None: - # FIXME (als): shouldn't these checks happen on the destination node? - if not os.path.isabs(self.op.hvm_cdrom_image_path): - raise errors.OpPrereqError("The path to the HVM CDROM image must" - " be an absolute path or None, not %s" % - self.op.hvm_cdrom_image_path) - if not os.path.isfile(self.op.hvm_cdrom_image_path): - raise errors.OpPrereqError("The HVM CDROM image must either be a" - " regular file or a symlink pointing to" - " an existing regular file, not %s" % - self.op.hvm_cdrom_image_path) - - # vnc_bind_address verification - if self.op.vnc_bind_address is not None: - if not utils.IsValidIP(self.op.vnc_bind_address): - raise errors.OpPrereqError("given VNC bind address '%s' doesn't look" - " like a valid IP address" % - self.op.vnc_bind_address) - - # Xen HVM device type checks - if self.op.hypervisor == constants.HT_XEN_HVM: - if self.op.hvm_nic_type not in constants.HT_HVM_VALID_NIC_TYPES: - raise errors.OpPrereqError("Invalid NIC type %s specified for Xen HVM" - " hypervisor" % self.op.hvm_nic_type) - if self.op.hvm_disk_type not in constants.HT_HVM_VALID_DISK_TYPES: - raise errors.OpPrereqError("Invalid disk type %s specified for Xen HVM" - " hypervisor" % self.op.hvm_disk_type) - if self.op.start: self.instance_status = 'up' else: @@ -3534,8 +3513,8 @@ class LUCreateInstance(LogicalUnit): else: network_port = None - if self.op.vnc_bind_address is None: - self.op.vnc_bind_address = constants.VNC_DEFAULT_BIND_ADDRESS + ##if self.op.vnc_bind_address is None: + ## self.op.vnc_bind_address = constants.VNC_DEFAULT_BIND_ADDRESS # this is needed because os.path.join does not accept None arguments if self.op.file_storage_dir is None: @@ -3565,15 +3544,7 @@ class LUCreateInstance(LogicalUnit): disk_template=self.op.disk_template, status=self.instance_status, network_port=network_port, - kernel_path=self.op.kernel_path, - initrd_path=self.op.initrd_path, - hvm_boot_order=self.op.hvm_boot_order, - hvm_acpi=self.op.hvm_acpi, - hvm_pae=self.op.hvm_pae, - hvm_cdrom_image_path=self.op.hvm_cdrom_image_path, - vnc_bind_address=self.op.vnc_bind_address, - hvm_nic_type=self.op.hvm_nic_type, - hvm_disk_type=self.op.hvm_disk_type, + hvparams=self.op.hvparams, hypervisor=self.op.hypervisor, ) diff --git a/lib/objects.py b/lib/objects.py index 6e6667fb81351d3c076826a29aad88da590b1af9..a4c58d1a7ce5aa975268bde67c942ae5066715fa 100644 --- a/lib/objects.py +++ b/lib/objects.py @@ -514,15 +514,6 @@ class Instance(TaggableObject): "disks", "disk_template", "network_port", - "kernel_path", - "initrd_path", - "hvm_boot_order", - "hvm_acpi", - "hvm_pae", - "hvm_cdrom_image_path", - "hvm_nic_type", - "hvm_disk_type", - "vnc_bind_address", "serial_no", ] diff --git a/lib/opcodes.py b/lib/opcodes.py index 550e408992deb9f81f245a259077eed0167db7cd..8166ca373093bf59d3bc7d2423a3683ee8883cd4 100644 --- a/lib/opcodes.py +++ b/lib/opcodes.py @@ -323,11 +323,9 @@ class OpCreateInstance(OpCode): "disk_template", "snode", "swap_size", "mode", "vcpus", "ip", "bridge", "src_node", "src_path", "start", "wait_for_sync", "ip_check", "mac", - "kernel_path", "initrd_path", "hvm_boot_order", "hvm_acpi", - "hvm_pae", "hvm_cdrom_image_path", "vnc_bind_address", "file_storage_dir", "file_driver", - "iallocator", "hvm_nic_type", "hvm_disk_type", - "hypervisor", + "iallocator", + "hypervisor", "hvparams", "beparams", ] diff --git a/scripts/gnt-instance b/scripts/gnt-instance index 557ae0ce9eba20ea1f28096753968b282c0a0af8..c05bdf579fa0754913d98c345ef461c4f35724df 100755 --- a/scripts/gnt-instance +++ b/scripts/gnt-instance @@ -266,17 +266,22 @@ def AddInstance(opts, args): (pnode, snode) = SplitNodeOption(opts.node) - kernel_path = _TransformPath(opts.kernel_path) - initrd_path = _TransformPath(opts.initrd_path) + hypervisor = None + hvparams = {} + if opts.hypervisor: + hypervisor, hvparams = opts.hypervisor - hvm_acpi = opts.hvm_acpi == _VALUE_TRUE - hvm_pae = opts.hvm_pae == _VALUE_TRUE +## kernel_path = _TransformPath(opts.kernel_path) +## initrd_path = _TransformPath(opts.initrd_path) - if ((opts.hvm_cdrom_image_path is not None) and - (opts.hvm_cdrom_image_path.lower() == constants.VALUE_NONE)): - hvm_cdrom_image_path = None - else: - hvm_cdrom_image_path = opts.hvm_cdrom_image_path +## hvm_acpi = opts.hvm_acpi == _VALUE_TRUE +## hvm_pae = opts.hvm_pae == _VALUE_TRUE + +## if ((opts.hvm_cdrom_image_path is not None) and +## (opts.hvm_cdrom_image_path.lower() == constants.VALUE_NONE)): +## hvm_cdrom_image_path = None +## else: +## hvm_cdrom_image_path = opts.hvm_cdrom_image_path op = opcodes.OpCreateInstance(instance_name=instance, mem_size=opts.mem, disk_size=opts.size, swap_size=opts.swap, @@ -288,17 +293,12 @@ def AddInstance(opts, args): start=opts.start, ip_check=opts.ip_check, wait_for_sync=opts.wait_for_sync, mac=opts.mac, - kernel_path=kernel_path, - initrd_path=initrd_path, + hypervisor=hypervisor, + hvparams=hvparams, iallocator=opts.iallocator, - hvm_boot_order=opts.hvm_boot_order, file_storage_dir=opts.file_storage_dir, file_driver=opts.file_driver, - hvm_acpi=hvm_acpi, hvm_pae=hvm_pae, - hvm_cdrom_image_path=hvm_cdrom_image_path, - vnc_bind_address=opts.vnc_bind_address, - hvm_nic_type=opts.hvm_nic_type, - hvm_disk_type=opts.hvm_disk_type) + ) SubmitOrSend(op, opts) return 0 @@ -918,28 +918,10 @@ add_opts = [ make_option("--iallocator", metavar="<NAME>", help="Select nodes for the instance automatically using the" " <NAME> iallocator plugin", default=None, type="string"), - make_option("--hvm-acpi", dest="hvm_acpi", - help="ACPI support for HVM (true|false)", - metavar="<BOOL>", choices=["true", "false"]), - make_option("--hvm-nic-type", dest="hvm_nic_type", - help="Type of virtual NIC for HVM " - "(rtl8139,ne2k_pci,ne2k_isa,paravirtual)", - metavar="NICTYPE", choices=[constants.HT_HVM_NIC_RTL8139, - constants.HT_HVM_NIC_NE2K_PCI, - constants.HT_HVM_NIC_NE2K_ISA, - constants.HT_HVM_DEV_PARAVIRTUAL], - default=constants.HT_HVM_NIC_RTL8139), - make_option("--hvm-disk-type", dest="hvm_disk_type", - help="Type of virtual disks for HVM (ioemu,paravirtual)", - metavar="DISKTYPE", choices=[constants.HT_HVM_DEV_IOEMU, - constants.HT_HVM_DEV_PARAVIRTUAL], - default=constants.HT_HVM_DEV_IOEMU,), - make_option("--hvm-pae", dest="hvm_pae", - help="PAE support for HVM (true|false)", - metavar="<BOOL>", choices=["true", "false"]), - make_option("--hvm-cdrom-image-path", dest="hvm_cdrom_image_path", - help="CDROM image path for HVM (absolute path or None)", - default=None, type="string", metavar="<CDROMIMAGE>"), + ikv_option("-H", "--hypervisor", dest="hypervisor", + help="Hypervisor and hypervisor options, in the format" + " hypervisor:option=value,option=value,...", default=None, + type="identkeyval"), make_option("--vnc-bind-address", dest="vnc_bind_address", help="bind address for VNC (IP address)", default=None, type="string", metavar="<VNCADDRESS>"),