示例#1
0
def add_role_to_farm(context: dict,
                     farm: Farm,
                     behavior: str = None,
                     dist: str = None,
                     role: Role = None,
                     role_name: str = None,
                     role_options: tp.List[str] = None,
                     alias: str = None) -> FarmRole:
    behavior = (behavior or CONF.feature.behavior).strip()
    role_name = (role_name or '').strip()
    if role:
        role_id = role.id  #FIXME: Use Role object below
    else:
        role_id = CONF.feature.role_id or context.get(f'{role_name}_id', None)
    if role_options:
        LOG.debug(f'Additional role options: {role_options}')
    if role_id:
        if not isinstance(role_id, int) and not role_id.isdigit():
            raise AssertionError('Role environment variable can\'t be only in digit format')
        LOG.info(f'Get role by id: {role_id}')
        role = IMPL.role.get(role_id)
    else:
        role = get_role_by_behavior(behavior, dist=dist)
    if not role:
        raise NotFound('Role with id or by mask "%s" not found in Scalr' % (
                role_id or behavior))

    # world.wrt(etree.Element('meta', name='role', value=role['name']))
    # world.wrt(etree.Element('meta', name='dist', value=role['dist']))
    previously_added_roles = [r.id for r in farm.roles]

    alias = alias or role['name']
    LOG.info(f'Add role {role["id"]} with alias {alias} to farm')
    role_params = setup_farmrole_params(
        context,
        farm,
        role_options=role_options,
        alias=alias,
        behaviors=behavior)

    farm.add_role(role['id'], options=role_params.to_json())
    time.sleep(5)
    farm.roles.reload()
    added_role = [r for r in farm.roles if r.id not in previously_added_roles]

    if not added_role:
        raise AssertionError(f'Added role "{role["name"]}" not found in farm')
    LOG.debug(f'Save role object with name {added_role[0].alias}')
    context[f'{added_role[0].alias}_role'] = added_role[0]
    context[f'role_params_{added_role[0].id}'] = role_params
    return added_role[0]  #TODO: Scalr return addedFarmRoleIds