def GetGenericAddParameters(inst, disk_template, force_mac=None):
    params = ["-B"]
    params.append("%s=%s,%s=%s" %
                  (constants.BE_MINMEM, qa_config.get(constants.BE_MINMEM),
                   constants.BE_MAXMEM, qa_config.get(constants.BE_MAXMEM)))

    if disk_template != constants.DT_DISKLESS:
        for idx, disk in enumerate(qa_config.GetDiskOptions()):
            size = disk.get("size")
            name = disk.get("name")
            diskparams = "%s:size=%s" % (idx, size)
            if name:
                diskparams += ",name=%s" % name
            if qa_config.AreSpindlesSupported():
                spindles = disk.get("spindles")
                if spindles is None:
                    raise qa_error.Error(
                        "'spindles' is a required parameter for disks"
                        " when you enable exclusive storage tests")
                diskparams += ",spindles=%s" % spindles
            params.extend(["--disk", diskparams])

    # Set static MAC address if configured
    if force_mac:
        nic0_mac = force_mac
    else:
        nic0_mac = inst.GetNicMacAddr(0, None)

    if nic0_mac:
        params.extend(["--net", "0:mac=%s" % nic0_mac])

    return params
示例#2
0
def TestInstanceGrowDisk(instance):
    """gnt-instance grow-disk"""
    if instance.disk_template == constants.DT_DISKLESS:
        print qa_utils.FormatInfo("Test not supported for diskless instances")
        return

    name = instance.name
    disks = qa_config.GetDiskOptions()
    all_size = [d.get("size") for d in disks]
    all_grow = [d.get("growth") for d in disks]

    if not all_grow:
        # missing disk sizes but instance grow disk has been enabled,
        # let's set fixed/nomimal growth
        all_grow = ["128M" for _ in all_size]

    for idx, (size, grow) in enumerate(zip(all_size, all_grow)):
        # succeed in grow by amount
        AssertCommand(["gnt-instance", "grow-disk", name, str(idx), grow])
        # fail in grow to the old size
        AssertCommand(
            ["gnt-instance", "grow-disk", "--absolute", name,
             str(idx), size],
            fail=True)
        # succeed to grow to old size + 2 * growth
        int_size = utils.ParseUnit(size)
        int_grow = utils.ParseUnit(grow)
        AssertCommand([
            "gnt-instance", "grow-disk", "--absolute", name,
            str(idx),
            str(int_size + 2 * int_grow)
        ])
示例#3
0
def _GenInstanceAllocationDict(node, instance):
    """Creates an instance allocation dict to be used with the RAPI"""
    instance.SetDiskTemplate(constants.DT_PLAIN)

    disks = [{
        "size": utils.ParseUnit(d.get("size")),
        "name": str(d.get("name"))
    } for d in qa_config.GetDiskOptions()]

    nic0_mac = instance.GetNicMacAddr(0, constants.VALUE_GENERATE)
    nics = [{
        constants.INIC_MAC: nic0_mac,
    }]

    beparams = {
        constants.BE_MAXMEM:
        utils.ParseUnit(qa_config.get(constants.BE_MAXMEM)),
        constants.BE_MINMEM:
        utils.ParseUnit(qa_config.get(constants.BE_MINMEM)),
    }

    return _rapi_client.InstanceAllocation(constants.INSTANCE_CREATE,
                                           instance.name,
                                           constants.DT_PLAIN,
                                           disks,
                                           nics,
                                           os=qa_config.get("os"),
                                           pnode=node.primary,
                                           beparams=beparams)
示例#4
0
def TestClusterBurnin():
    """Burnin"""
    master = qa_config.GetMasterNode()

    options = qa_config.get("options", {})
    disk_template = options.get("burnin-disk-template", constants.DT_DRBD8)
    parallel = options.get("burnin-in-parallel", False)
    check_inst = options.get("burnin-check-instances", False)
    do_rename = options.get("burnin-rename", "")
    do_reboot = options.get("burnin-reboot", True)
    reboot_types = options.get("reboot-types", constants.REBOOT_TYPES)

    # Get as many instances as we need
    instances = []
    try:
        try:
            num = qa_config.get("options", {}).get("burnin-instances", 1)
            for _ in range(0, num):
                instances.append(qa_config.AcquireInstance())
        except qa_error.OutOfInstancesError:
            print "Not enough instances, continuing anyway."

        if len(instances) < 1:
            raise qa_error.Error("Burnin needs at least one instance")

        script = qa_utils.UploadFile(master.primary, "../tools/burnin")
        try:
            disks = qa_config.GetDiskOptions()
            # Run burnin
            cmd = [
                "env",
                "PYTHONPATH=%s" % _constants.VERSIONEDSHAREDIR, script,
                "--os=%s" % qa_config.get("os"),
                "--minmem-size=%s" % qa_config.get(constants.BE_MINMEM),
                "--maxmem-size=%s" % qa_config.get(constants.BE_MAXMEM),
                "--disk-size=%s" % ",".join([d.get("size") for d in disks]),
                "--disk-growth=%s" % ",".join([d.get("growth")
                                               for d in disks]),
                "--disk-template=%s" % disk_template
            ]
            if parallel:
                cmd.append("--parallel")
                cmd.append("--early-release")
            if check_inst:
                cmd.append("--http-check")
            if do_rename:
                cmd.append("--rename=%s" % do_rename)
            if not do_reboot:
                cmd.append("--no-reboot")
            else:
                cmd.append("--reboot-types=%s" % ",".join(reboot_types))
            cmd += [inst.name for inst in instances]
            AssertCommand(cmd)
        finally:
            AssertCommand(["rm", "-f", script])

    finally:
        for inst in instances:
            inst.Release()
示例#5
0
def TestInstanceDeviceNames(instance):
    if instance.disk_template == constants.DT_DISKLESS:
        print qa_utils.FormatInfo("Test not supported for diskless instances")
        return

    name = instance.name
    for dev_type in ["disk", "net"]:
        if dev_type == "disk":
            options = ",size=512M"
            if qa_config.AreSpindlesSupported():
                options += ",spindles=1"
        else:
            options = ""
        # succeed in adding a device named 'test_device'
        AssertCommand([
            "gnt-instance", "modify",
            "--%s=-1:add,name=test_device%s" % (dev_type, options), name
        ])
        # succeed in removing the 'test_device'
        AssertCommand([
            "gnt-instance", "modify",
            "--%s=test_device:remove" % dev_type, name
        ])
        # fail to add two devices with the same name
        AssertCommand([
            "gnt-instance", "modify",
            "--%s=-1:add,name=test_device%s" % (dev_type, options),
            "--%s=-1:add,name=test_device%s" % (dev_type, options), name
        ],
                      fail=True)
        # fail to add a device with invalid name
        AssertCommand([
            "gnt-instance", "modify",
            "--%s=-1:add,name=2%s" % (dev_type, options), name
        ],
                      fail=True)
    # Rename disks
    disks = qa_config.GetDiskOptions()
    disk_names = [d.get("name") for d in disks]
    for idx, disk_name in enumerate(disk_names):
        # Refer to disk by idx
        AssertCommand([
            "gnt-instance", "modify",
            "--disk=%s:modify,name=renamed" % idx, name
        ])
        # Refer to by name and rename to original name
        AssertCommand([
            "gnt-instance", "modify",
            "--disk=renamed:modify,name=%s" % disk_name, name
        ])
    if len(disks) >= 2:
        # fail in renaming to disks to the same name
        AssertCommand([
            "gnt-instance", "modify", "--disk=0:modify,name=same_name",
            "--disk=1:modify,name=same_name", name
        ],
                      fail=True)
示例#6
0
def TestRapiInstanceAdd(node, use_client):
    """Test adding a new instance via RAPI"""
    if not qa_config.IsTemplateSupported(constants.DT_PLAIN):
        return
    instance = qa_config.AcquireInstance()
    instance.SetDiskTemplate(constants.DT_PLAIN)
    try:
        disks = [{
            "size": utils.ParseUnit(d.get("size")),
            "name": str(d.get("name"))
        } for d in qa_config.GetDiskOptions()]
        nic0_mac = instance.GetNicMacAddr(0, constants.VALUE_GENERATE)
        nics = [{
            constants.INIC_MAC: nic0_mac,
        }]

        beparams = {
            constants.BE_MAXMEM:
            utils.ParseUnit(qa_config.get(constants.BE_MAXMEM)),
            constants.BE_MINMEM:
            utils.ParseUnit(qa_config.get(constants.BE_MINMEM)),
        }

        if use_client:
            job_id = _rapi_client.CreateInstance(constants.INSTANCE_CREATE,
                                                 instance.name,
                                                 constants.DT_PLAIN,
                                                 disks,
                                                 nics,
                                                 os=qa_config.get("os"),
                                                 pnode=node.primary,
                                                 beparams=beparams)
        else:
            body = {
                "__version__": 1,
                "mode": constants.INSTANCE_CREATE,
                "name": instance.name,
                "os_type": qa_config.get("os"),
                "disk_template": constants.DT_PLAIN,
                "pnode": node.primary,
                "beparams": beparams,
                "disks": disks,
                "nics": nics,
            }

            (job_id, ) = _DoTests([
                ("/2/instances", _VerifyReturnsJob, "POST", body),
            ])

        _WaitForRapiJob(job_id)

        return instance
    except:
        instance.Release()
        raise
示例#7
0
def TestInstanceModifyDisks(instance):
    """gnt-instance modify --disk"""
    if not IsDiskSupported(instance):
        print qa_utils.FormatInfo(
            "Instance doesn't support disks, skipping test")
        return

    disk_conf = qa_config.GetDiskOptions()[-1]
    size = disk_conf.get("size")
    name = instance.name
    build_cmd = lambda arg: ["gnt-instance", "modify", "--disk", arg, name]
    if qa_config.AreSpindlesSupported():
        spindles = disk_conf.get("spindles")
        spindles_supported = True
    else:
        # Any number is good for spindles in this case
        spindles = 1
        spindles_supported = False
    AssertCommand(build_cmd("add:size=%s,spindles=%s" % (size, spindles)),
                  fail=not spindles_supported)
    AssertCommand(build_cmd("add:size=%s" % size), fail=spindles_supported)
    # Exactly one of the above commands has succeded, so we need one remove
    AssertCommand(build_cmd("remove"))
示例#8
0
def TestRecreateDisks(instance, inodes, othernodes):
    """gnt-instance recreate-disks

  @param instance: Instance to work on
  @param inodes: List of the current nodes of the instance
  @param othernodes: list/tuple of nodes where to temporarily recreate disks

  """
    options = qa_config.get("options", {})
    use_ialloc = options.get("use-iallocators", True)
    other_seq = ":".join([n.primary for n in othernodes])
    orig_seq = ":".join([n.primary for n in inodes])
    # These fail because the instance is running
    _AssertRecreateDisks(["-n", other_seq], instance, fail=True, destroy=False)
    if use_ialloc:
        _AssertRecreateDisks(["-I", "hail"],
                             instance,
                             fail=True,
                             destroy=False)
    else:
        _AssertRecreateDisks(["-n", other_seq],
                             instance,
                             fail=True,
                             destroy=False)
    AssertCommand(["gnt-instance", "stop", instance.name])
    # Disks exist: this should fail
    _AssertRecreateDisks([], instance, fail=True, destroy=False)
    # Unsupported spindles parameters: fail
    if not qa_config.AreSpindlesSupported():
        _AssertRecreateDisks(["--disk=0:spindles=2"],
                             instance,
                             fail=True,
                             destroy=False)
    # Recreate disks in place
    _AssertRecreateDisks([], instance)
    # Move disks away
    if use_ialloc:
        _AssertRecreateDisks(["-I", "hail"], instance)
        # Move disks somewhere else
        _AssertRecreateDisks(["-I", constants.DEFAULT_IALLOCATOR_SHORTCUT],
                             instance)
    else:
        _AssertRecreateDisks(["-n", other_seq], instance)
    # Move disks back
    _AssertRecreateDisks(["-n", orig_seq], instance)
    # Recreate resized disks
    # One of the two commands fails because either spindles are given when they
    # should not or vice versa
    alldisks = qa_config.GetDiskOptions()
    spindles_supported = qa_config.AreSpindlesSupported()
    disk_opts = _BuildRecreateDisksOpts(enumerate(alldisks), True, True,
                                        spindles_supported)
    _AssertRecreateDisks(disk_opts,
                         instance,
                         destroy=True,
                         fail=not spindles_supported)
    disk_opts = _BuildRecreateDisksOpts(enumerate(alldisks), False, True,
                                        spindles_supported)
    _AssertRecreateDisks(disk_opts,
                         instance,
                         destroy=False,
                         fail=spindles_supported)
    # Recreate the disks one by one (with the original size)
    for (idx, disk) in enumerate(alldisks):
        # Only the first call should destroy all the disk
        destroy = (idx == 0)
        # Again, one of the two commands is expected to fail
        disk_opts = _BuildRecreateDisksOpts([(idx, disk)], True, False,
                                            spindles_supported)
        _AssertRecreateDisks(disk_opts,
                             instance,
                             destroy=destroy,
                             check=False,
                             fail=not spindles_supported)
        disk_opts = _BuildRecreateDisksOpts([(idx, disk)], False, False,
                                            spindles_supported)
        _AssertRecreateDisks(disk_opts,
                             instance,
                             destroy=False,
                             check=False,
                             fail=spindles_supported)
    # This and InstanceCheck decoration check that the disks are working
    AssertCommand(["gnt-instance", "reinstall", "-f", instance.name])
    AssertCommand(["gnt-instance", "start", instance.name])