示例#1
0
def test_bd_should_be_not_smaller_than_ami():
    ami = mock.MagicMock()
    ami.root_device_type = "ebs"
    ami.root_device_name = "/dev/xvda"
    ami.block_device_mapping["/dev/xvda"].size = 20
    ami.virtualization_type = "pv"
    device_map = {
        "/dev/xvda": {
            "delete_on_termination": True,
            "skip_resize": True,
            "size": 10,
            "volume_type": "gp2",
            "instance_dev": "/dev/xvda1"
        }
    }
    with pytest.raises(AssertionError):
        create_block_device_mapping(ami, device_map)
示例#2
0
def test_ephemeral_name():
    ami = mock.Mock()
    ami.root_device_type = "instance-store"
    device_map = {
        "/dev/sdb": {
            "ephemeral_name": "ephemeral0",
            "instance_dev": "/dev/xvdb",
            "skip_resize": True,
            "delete_on_termination": False
        }
    }
    bdm = create_block_device_mapping(ami, device_map)
    _, bd = bdm.popitem()
    assert bd.ephemeral_name == "ephemeral0"
示例#3
0
def test_bd_delete_on_termination():
    ami = mock.MagicMock()
    ami.root_device_type = "ebs"
    ami.root_device_name = "/dev/xvda"
    ami.block_device_mapping["/dev/xvda"].size = 20
    ami.virtualization_type = "hvm"
    device_map = {
        "/dev/xvda": {
            "skip_resize": True,
            "size": 30,  # will be ignored
            "volume_type": "gp2",
            "instance_dev": "/dev/xvda1"
        }
    }
    bdm = create_block_device_mapping(ami, device_map)
    _, bd = bdm.popitem()
    assert bd.delete_on_termination
示例#4
0
def test_no_ebs_on_instance_store():
    ami = mock.Mock()
    ami.root_device_type = "instance-store"
    device_map = {
        "/dev/xvda": {
            "delete_on_termination": True,
            "skip_resize": True,
            "volume_type": "gp2",
            "instance_dev": "/dev/xvda1"
        },
        "/dev/sdb": {
            "ephemeral_name": "ephemeral0",
            "instance_dev": "/dev/xvdb",
            "skip_resize": True,
            "delete_on_termination": False
        }
    }
    bdm = create_block_device_mapping(ami, device_map)
    first_disk_name, _ = bdm.popitem()
    assert len(bdm) == 0
    assert first_disk_name == "/dev/sdb"
def do_request_instance(region, moz_instance_type, price, ami, instance_config,
                        instance_type, availability_zone, slaveset, is_spot,
                        all_instances, dryrun):
    name = get_available_slave_name(region,
                                    moz_instance_type,
                                    slaveset,
                                    is_spot=is_spot,
                                    all_instances=all_instances)
    if not name:
        log.debug("No slave name available for %s, %s, %s" %
                  (region, moz_instance_type, slaveset))
        return False

    subnet_id = get_avail_subnet(region, instance_config[region]["subnet_ids"],
                                 availability_zone)
    if not subnet_id:
        log.debug("No free IP available for %s in %s", moz_instance_type,
                  availability_zone)
        return False

    fqdn = "{}.{}".format(name, instance_config[region]["domain"])
    if is_spot:
        log.debug("Spot request for %s (%s)", fqdn, price)
    else:
        log.debug("Starting %s", fqdn)

    if dryrun:
        log.info("Dry run. skipping")
        return True

    spec = NetworkInterfaceSpecification(
        associate_public_ip_address=True,
        subnet_id=subnet_id,
        delete_on_termination=True,
        groups=instance_config[region].get("security_group_ids"))
    nc = NetworkInterfaceCollection(spec)

    user_data = user_data_from_template(moz_instance_type, fqdn, region)
    bdm = create_block_device_mapping(ami,
                                      instance_config[region]['device_map'])
    if is_spot:
        rv = do_request_spot_instance(
            region, price, ami.id, instance_type,
            instance_config[region]["ssh_key"], user_data, bdm, nc,
            instance_config[region].get("instance_profile_name"),
            moz_instance_type, name, fqdn)
    else:
        rv = do_request_ondemand_instance(
            region, price, ami.id, instance_type,
            instance_config[region]["ssh_key"], user_data, bdm, nc,
            instance_config[region].get("instance_profile_name"),
            moz_instance_type, name, fqdn)
    if rv:
        template_values = dict(
            region=region,
            moz_instance_type=moz_instance_type,
            instance_type=instance_type.replace(".", "-"),
            life_cycle_type="spot" if is_spot else "ondemand",
            virtualization=ami.virtualization_type,
            root_device_type=ami.root_device_type,
            jacuzzi_type=jacuzzi_suffix(slaveset),
        )
        name = "started.{region}.{moz_instance_type}.{instance_type}" \
            ".{life_cycle_type}.{virtualization}.{root_device_type}" \
            ".{jacuzzi_type}"
        gr_log.add(name.format(**template_values), 1, collect=True)
    return rv
def do_request_instance(region, moz_instance_type, price, ami, instance_config,
                        instance_type, availability_zone, is_spot,
                        all_instances, dryrun):
    name = get_available_slave_name(region, moz_instance_type,
                                    is_spot=is_spot,
                                    all_instances=all_instances)
    if not name:
        log.debug("No slave name available for %s, %s",
                  region, moz_instance_type)
        return False

    subnet_id = get_avail_subnet(region, instance_config[region]["subnet_ids"],
                                 availability_zone)
    if not subnet_id:
        log.debug("No free IP available for %s in %s", moz_instance_type,
                  availability_zone)
        return False

    fqdn = "{}.{}".format(name, instance_config[region]["domain"])
    if is_spot:
        log.debug("Spot request for %s (%s)", fqdn, price)
    else:
        log.debug("Starting %s", fqdn)

    if dryrun:
        log.info("Dry run. skipping")
        return True

    spec = NetworkInterfaceSpecification(
        associate_public_ip_address=True, subnet_id=subnet_id,
        delete_on_termination=True,
        groups=instance_config[region].get("security_group_ids"))
    nc = NetworkInterfaceCollection(spec)

    user_data = user_data_from_template(moz_instance_type, {
        "moz_instance_type": moz_instance_type,
        "hostname": name,
        "domain": instance_config[region]["domain"],
        "fqdn": fqdn,
        "region_dns_atom": get_region_dns_atom(region),
        "puppet_server": "",  # intentionally empty
        "password": ""  # intentionally empty
    })

    bdm = create_block_device_mapping(
        ami, instance_config[region]['device_map'])
    if is_spot:
        rv = do_request_spot_instance(
            region, price, ami.id, instance_type,
            instance_config[region]["ssh_key"], user_data, bdm, nc,
            instance_config[region].get("instance_profile_name"),
            moz_instance_type, name, fqdn)
    else:
        rv = do_request_ondemand_instance(
            region, price, ami.id, instance_type,
            instance_config[region]["ssh_key"], user_data, bdm, nc,
            instance_config[region].get("instance_profile_name"),
            moz_instance_type, name, fqdn)
    if rv:
        template_values = dict(
            region=region,
            moz_instance_type=moz_instance_type,
            instance_type=instance_type.replace(".", "-"),
            life_cycle_type="spot" if is_spot else "ondemand",
            virtualization=ami.virtualization_type,
            root_device_type=ami.root_device_type,
        )
        name = "started.{region}.{moz_instance_type}.{instance_type}" \
            ".{life_cycle_type}.{virtualization}.{root_device_type}"
        gr_log.add(name.format(**template_values), 1, collect=True)
    return rv