Ejemplo n.º 1
0
def set_user(user, name=None, project=None, password=None, project_doamin=None,
             email=None, description=None,
             enable=None, fail_ok=False, auth_info=Tenant.get('admin'),
             con_ssh=None):
    LOG.info("Updating {}...".format(user))
    arg = ''
    optional_args = {
        'name': name,
        'project': project,
        'password': password,
        'project-domain': project_doamin,
        'email': email,
        'description': description,
    }
    for key, val in optional_args.items():
        if val is not None:
            arg += "--{} '{}' ".format(key, val)

    if enable is not None:
        arg += '--{} '.format('enable' if enable else 'disable')

    if not arg.strip():
        raise ValueError(
            "Please specify the param(s) and value(s) to change to")

    arg += user

    code, output = cli.openstack('user set', arg, ssh_client=con_ssh, timeout=120,
                                 fail_ok=fail_ok, auth_info=auth_info)

    if code > 0:
        return 1, output

    if name or project or password:
        tenant_dictname = user
        if auth_info and auth_info.get('platform'):
            tenant_dictname += '_platform'
        Tenant.update(tenant_dictname, username=name, password=password,
                      tenant=project)

    if password and user == 'admin':
        from consts.proj_vars import ProjVar
        if ProjVar.get_var('REGION') != 'RegionOne':
            LOG.info(
                "Run openstack_update_admin_password on secondary region "
                "after admin password change")
            if not con_ssh:
                con_ssh = ControllerClient.get_active_controller()
            with con_ssh.login_as_root(timeout=30) as con_ssh:
                con_ssh.exec_cmd(
                    "echo 'y' | openstack_update_admin_password '{}'".format(
                        password))

    msg = 'User {} updated successfully'.format(user)
    LOG.info(msg)
    return 0, output
Ejemplo n.º 2
0
def set_current_user_password(original_password, new_password, fail_ok=False,
                              auth_info=None, con_ssh=None):
    """
    Set password for current user
    Args:
        original_password:
        new_password:
        fail_ok:
        auth_info:
        con_ssh:

    Returns (tuple):

    """
    args = "--password '{}' --original-password '{}'".format(new_password, original_password)
    code, output = cli.openstack('user password set', args, ssh_client=con_ssh,
                                 auth_info=auth_info, fail_ok=fail_ok)
    if code > 0:
        return 1, output

    if not auth_info:
        auth_info = Tenant.get_primary()

    user = auth_info['user']
    tenant_dictname = user
    if auth_info.get('platform'):
        tenant_dictname += '_platform'
    Tenant.update(tenant_dictname, password=new_password)

    if user == 'admin':
        from consts.proj_vars import ProjVar
        if ProjVar.get_var('REGION') != 'RegionOne':
            LOG.info(
                "Run openstack_update_admin_password on secondary region "
                "after admin password change")
            if not con_ssh:
                con_ssh = ControllerClient.get_active_controller()
            with con_ssh.login_as_root(timeout=30) as con_ssh:
                con_ssh.exec_cmd(
                    "echo 'y' | openstack_update_admin_password '{}'".format(new_password))

    msg = 'User {} password successfully updated from {} to {}'.format(user, original_password,
                                                                       new_password)
    LOG.info(msg)
    return 0, output
Ejemplo n.º 3
0
def setup_testcase_config(testcase_config, lab=None, natbox=None):
    fip_error = 'A valid IPv4 OAM floating IP has to be specified via ' \
                'cmdline option --lab=<oam_floating_ip>, ' \
                'or testcase config file has to be provided via ' \
                '--testcase-config with oam_floating_ip ' \
                'specified under auth_platform section.'
    if not testcase_config:
        if not lab:
            raise ValueError(fip_error)
        return lab, natbox

    testcase_config = os.path.expanduser(testcase_config)
    auth_section = 'auth'
    guest_image_section = 'guest_image'
    guest_networks_section = 'guest_networks'
    guest_keypair_section = 'guest_keypair'
    natbox_section = 'natbox'

    config = configparser.ConfigParser()
    config.read(testcase_config)

    #
    # Update global variables for auth section
    #
    # Update OAM floating IP
    if lab:
        fip = lab.get('floating ip')
        config.set(auth_section, 'oam_floating_ip', fip)
    else:
        fip = config.get(auth_section, 'oam_floating_ip', fallback='').strip()
        lab = get_lab_dict(fip)

    if __get_ip_version(fip) != 4:
        raise ValueError(fip_error)

    # controller-0 oam ip is updated with best effort if a valid IPv4 IP is
    # provided
    if not lab.get('controller-0 ip') and config.get(
            auth_section, 'controller0_oam_ip', fallback='').strip():
        con0_ip = config.get(auth_section, 'controller0_oam_ip').strip()
        if __get_ip_version(con0_ip) == 4:
            lab['controller-0 ip'] = con0_ip
        else:
            LOG.info(
                "controller0_oam_ip specified in testcase config file is not "
                "a valid IPv4 address. Ignore.")

    # Update linux user credentials
    if config.get(auth_section, 'linux_username', fallback='').strip():
        HostLinuxUser.set_user(
            config.get(auth_section, 'linux_username').strip())
    if config.get(auth_section, 'linux_user_password', fallback='').strip():
        HostLinuxUser.set_password(
            config.get(auth_section, 'linux_user_password').strip())

    # Update openstack keystone user credentials
    auth_dict_map = {
        'platform_admin': 'admin_platform',
        'admin': 'admin',
        'test1': 'tenant1',
        'test2': 'tenant2',
    }
    for conf_prefix, dict_name in auth_dict_map.items():
        kwargs = {}
        default_auth = Tenant.get(dict_name)
        conf_user = config.get(auth_section,
                               '{}_username'.format(conf_prefix),
                               fallback='').strip()
        conf_password = config.get(auth_section,
                                   '{}_password'.format(conf_prefix),
                                   fallback='').strip()
        conf_project = config.get(auth_section,
                                  '{}_project_name'.format(conf_prefix),
                                  fallback='').strip()
        conf_domain = config.get(auth_section,
                                 '{}_domain_name'.format(conf_prefix),
                                 fallback='').strip()
        conf_keypair = config.get(auth_section,
                                  '{}_nova_keypair'.format(conf_prefix),
                                  fallback='').strip()
        if conf_user and conf_user != default_auth.get('user'):
            kwargs['username'] = conf_user
        if conf_password and conf_password != default_auth.get('password'):
            kwargs['password'] = conf_password
        if conf_project and conf_project != default_auth.get('tenant'):
            kwargs['tenant'] = conf_project
        if conf_domain and conf_domain != default_auth.get('domain'):
            kwargs['domain'] = conf_domain
        if conf_keypair and conf_keypair != default_auth.get('nova_keypair'):
            kwargs['nova_keypair'] = conf_keypair

        if kwargs:
            Tenant.update(dict_name, **kwargs)

    #
    # Update global variables for natbox section
    #
    natbox_host = config.get(natbox_section, 'natbox_host',
                             fallback='').strip()
    natbox_user = config.get(natbox_section, 'natbox_user',
                             fallback='').strip()
    natbox_password = config.get(natbox_section,
                                 'natbox_password',
                                 fallback='').strip()
    natbox_prompt = config.get(natbox_section, 'natbox_prompt',
                               fallback='').strip()
    if natbox_host and (not natbox or natbox_host != natbox['ip']):
        natbox = get_natbox_dict(natbox_host,
                                 user=natbox_user,
                                 password=natbox_password,
                                 prompt=natbox_prompt)
    #
    # Update global variables for guest_image section
    #
    img_file_dir = config.get(guest_image_section, 'img_file_dir',
                              fallback='').strip()
    glance_image_name = config.get(guest_image_section,
                                   'glance_image_name',
                                   fallback='').strip()
    img_file_name = config.get(guest_image_section,
                               'img_file_name',
                               fallback='').strip()
    img_disk_format = config.get(guest_image_section,
                                 'img_disk_format',
                                 fallback='').strip()
    min_disk_size = config.get(guest_image_section,
                               'min_disk_size',
                               fallback='').strip()
    img_container_format = config.get(guest_image_section,
                                      'img_container_format',
                                      fallback='').strip()
    image_ssh_user = config.get(guest_image_section,
                                'image_ssh_user',
                                fallback='').strip()
    image_ssh_password = config.get(guest_image_section,
                                    'image_ssh_password',
                                    fallback='').strip()

    if img_file_dir and img_file_dir != GuestImages.DEFAULT['image_dir']:
        # Update default image file directory
        img_file_dir = os.path.expanduser(img_file_dir)
        if not os.path.isabs(img_file_dir):
            raise ValueError(
                "Please provide a valid absolute path for img_file_dir "
                "under guest_image section in testcase config file")
        GuestImages.DEFAULT['image_dir'] = img_file_dir

    if glance_image_name and glance_image_name != GuestImages.DEFAULT['guest']:
        # Update default glance image name
        GuestImages.DEFAULT['guest'] = glance_image_name
        if glance_image_name not in GuestImages.IMAGE_FILES:
            # Add guest image info to consts.stx.GuestImages
            if not (img_file_name and img_disk_format and min_disk_size):
                raise ValueError(
                    "img_file_name and img_disk_format under guest_image "
                    "section have to be "
                    "specified in testcase config file")

            img_container_format = img_container_format if \
                img_container_format else 'bare'
            GuestImages.IMAGE_FILES[glance_image_name] = \
                (None, min_disk_size, img_file_name, img_disk_format,
                 img_container_format)

            # Add guest login credentials
            Guest.CREDS[glance_image_name] = {
                'user': image_ssh_user if image_ssh_user else 'root',
                'password': image_ssh_password if image_ssh_password else None,
            }

    #
    # Update global variables for guest_keypair section
    #
    natbox_keypair_dir = config.get(guest_keypair_section,
                                    'natbox_keypair_dir',
                                    fallback='').strip()
    private_key_path = config.get(guest_keypair_section,
                                  'private_key_path',
                                  fallback='').strip()

    if natbox_keypair_dir:
        natbox_keypair_path = os.path.join(
            natbox_keypair_dir, 'keyfile_{}.pem'.format(lab['short_name']))
        ProjVar.set_var(NATBOX_KEYFILE_PATH=natbox_keypair_path)
    if private_key_path:
        ProjVar.set_var(STX_KEYFILE_PATH=private_key_path)

    #
    # Update global variables for guest_networks section
    #
    net_name_patterns = {
        'mgmt':
        config.get(guest_networks_section,
                   'mgmt_net_name_pattern',
                   fallback='').strip(),
        'data':
        config.get(guest_networks_section,
                   'data_net_name_pattern',
                   fallback='').strip(),
        'internal':
        config.get(guest_networks_section,
                   'internal_net_name_pattern',
                   fallback='').strip(),
        'external':
        config.get(guest_networks_section,
                   'external_net_name_pattern',
                   fallback='').strip()
    }

    for net_type, net_name_pattern in net_name_patterns.items():
        if net_name_pattern:
            Networks.set_neutron_net_patterns(
                net_type=net_type, net_name_pattern=net_name_pattern)

    return lab, natbox
Ejemplo n.º 4
0
def create_user(name=None, field='name', domain=None, project=None,
                project_domain=None, rtn_exist=None,
                password=None, email=None,
                description=None, enable=None,
                auth_info=Tenant.get('admin'), fail_ok=False, con_ssh=None):
    """
    Create an openstack user
    Args:
        name (str|None):
        field: name or id
        domain:
        project (str|None): default project
        project_domain:
        rtn_exist (bool)
        password:
        email:
        description:
        enable:
        auth_info:
        fail_ok:
        con_ssh:

    Returns (tuple):
        (0, <user>)
        (1, <std_err>)

    """
    if not password:
        password = HostLinuxUser.get_password()

    if not name:
        name = 'user'
        common.get_unique_name(name_str=name)

    LOG.info("Create/Show openstack user {}".format(name))
    arg_dict = {
        'domain': domain,
        'project': project,
        'project-domain': project_domain,
        'password': password,
        'email': email,
        'description': description,
        'enable': True if enable is True else None,
        'disable': True if enable is False else None,
        'or-show': rtn_exist,
    }

    arg_str = '{} {}'.format(common.parse_args(args_dict=arg_dict), name)

    code, output = cli.openstack('user create', arg_str, ssh_client=con_ssh,
                                 fail_ok=fail_ok, auth_info=auth_info)
    if code > 0:
        return 1, output

    table_ = table_parser.table(output)
    username = table_parser.get_value_two_col_table(table_, field='name')
    user = username if field == 'name' else table_parser.get_value_two_col_table(table_,
                                                                                 field=field)

    is_platform = auth_info and auth_info.get('platform')
    keystone = 'platform' if is_platform else 'containerized'
    dictname = user + '_platform' if is_platform else user
    existing_auth = Tenant.get(dictname)
    if existing_auth:
        if existing_auth['user'] != username:
            raise ValueError('Tenant.{} already exists for a different user {}'.format(
                dictname, existing_auth['user']))
        Tenant.update(dictname, username=username, password=password, tenant=project,
                      platform=is_platform)
    else:
        Tenant.add(username=username, tenantname=project, dictname=dictname, password=password,
                   platform=is_platform)
        LOG.info('Tenant.{} for {} keystone user {} is added'.format(dictname, keystone, user))

    LOG.info("{} keystone user {} successfully created/showed".format(keystone, user))
    return 0, user