Пример #1
0
def api_migration_state(request):
    # The user may have different projects across different sites, if they only
    # used a project on a particular site, but not others.
    all_legacy_projects = {}
    legacy_user = None
    for region in list(settings.OPENSTACK_AUTH_REGIONS.keys()):
        keystone = admin_ks_client(region=region)
        ks_legacy_user = get_user(keystone, request.user.username)
        legacy_user = {
            "name": ks_legacy_user.name,
            "migrated_at": getattr(ks_legacy_user, "migrated_at", None),
        }
        all_legacy_projects.update({
            ks_p.charge_code: {
                "name": ks_p.name,
                "charge_code": ks_p.charge_code,
                "migrated_at": getattr(ks_p, "migrated_at", None),
                "migrated_by": getattr(ks_p, "migrated_by", None),
            }
            for ks_p in keystone.projects.list(user=ks_legacy_user,
                                               domain="default")
            if ks_p.charge_code not in all_legacy_projects
            and ks_p.name not in WHITELISTED_PROJECTS
        })
    return JsonResponse({
        "user": legacy_user,
        "projects": list(all_legacy_projects.values())
    })
Пример #2
0
def sync_project_memberships(request, username):
    """Re-sync a user's Keystone project memberships.

    This calls utils.auth.keystone_auth.sync_projects under the hood, which
    will dynamically create missing projects as well.

    Args:
        request (Request): the parent request; used for region detection.
        username (str): the username to sync memberships for.

    Return:
        List[keystone.Project]: a list of Keystone projects the user is a
            member of.
    """
    mapper = ProjectAllocationMapper(request)
    try:
        ks_admin = admin_ks_client(request=request)
        ks_user = get_user(ks_admin, username)

        if not ks_user:
            logger.error((
                "Could not fetch Keystone user for {}, skipping membership syncing"
                .format(username)))
            return

        active_projects = mapper.get_user_projects(username,
                                                   alloc_status=["Active"],
                                                   to_pytas_model=True)

        return sync_projects(ks_admin, ks_user, active_projects)
    except Exception as e:
        logger.error("Could not sync project memberships for %s: %s", username,
                     e)
        return []
Пример #3
0
def get_openstack_data(username, unscoped_token, region):
    current_region = {}
    current_region['name'] = region
    current_region['projects'] = []
    ks_admin = admin_ks_client(region=region)
    ks_user = get_user(ks_admin, username)
    projects = []
    if ks_user:
        projects = ks_admin.projects.list(user=ks_user)
    for project in projects:
        current_project = {}
        current_project['name'] = project.name
        current_project['id'] = project.id
        current_region['projects'].append(current_project)
        try:
            psess = project_scoped_session(unscoped_token=unscoped_token,
                                           project_id=project.id,
                                           region=region)
        except Exception:
            logger.error(
                (f'Failed to authenticate to {region} as user {username}, '
                 'skipping data collection'))
            continue
        try:
            current_project['leases'] = get_lease_info(psess)
        except Exception as err:
            logger.error(
                f'Failed to get leases in {region} for {project.name}: {err}')
        try:
            current_project['servers'] = get_server_info(psess)
        except Exception as err:
            logger.error(
                f'Failed to get active servers in {region} for {project.name}: {err}'
            )
    return current_region
Пример #4
0
def set_ks_project_nickname(chargeCode, nickname):
    for region in list(settings.OPENSTACK_AUTH_REGIONS.keys()):
        ks_admin = admin_ks_client(region=region)
        project_list = ks_admin.projects.list(domain=ks_admin.user_domain_id)
        project = [
            this for this in project_list
            if getattr(this, "charge_code", None) == chargeCode
        ]
        logger.info(
            "Assigning nickname {0} to project with charge code {1} at {2}".
            format(nickname, chargeCode, region))
        if project and project[0]:
            project = project[0]
        ks_admin.projects.update(project, name=nickname)
        logger.info(
            "Successfully assigned nickname {0} to project with charge code {1} at {2}"
            .format(nickname, chargeCode, region))
Пример #5
0
def get_openstack_data(username, region, projects):
    admin_client = admin_ks_client(region)
    admin_sess = admin_session(region)

    current_region = {}
    current_region["name"] = region
    current_region["projects"] = []

    # we know there is only going to be one domain
    domains = list(admin_client.domains.list(name="chameleon"))
    if not domains:
        LOG.error('Didn\'t find the domain "chameleon", skipping this site')
        return current_region
    domain_id = domains[0].id

    ks_users_list = list(
        admin_client.users.list(name=username, domain=domain_id))
    if len(ks_users_list) > 1:
        LOG.warning(
            f"Found {len(ks_users_list)} users for {username}, using the first."
        )
    ks_user = ks_users_list[0]

    all_ks_projects = {
        ks_p.name: ks_p
        for ks_p in admin_client.projects.list(domain=domain_id)
    }
    for project in projects:
        charge_code = project["name"]
        # Project doesn't exist for this region
        if charge_code not in all_ks_projects:
            continue
        ks_project_id = all_ks_projects[charge_code].id
        project_qs = Project.objects.filter(charge_code=charge_code)
        project_list = list(project_qs)
        if len(project_list) > 1:
            raise Exception(
                f"More than one project found with charge code {charge_code}")
        project = project_list[0]

        current_project = {}
        current_project["charge_code"] = project.charge_code
        current_project["id"] = ks_project_id
        current_region["projects"].append(current_project)

        try:
            current_project["leases"] = get_lease_info(admin_sess, ks_user.id,
                                                       ks_project_id)
        except Exception as err:
            current_project["lease_error"] = True
            LOG.error(
                f"Failed to get leases in {region} for {project.title}: {err}")
        try:
            current_project["servers"] = get_server_info(
                admin_sess, ks_project_id)
        except Exception as err:
            current_project["server_error"] = True
            LOG.error(
                f"Failed to get active servers in {region} for {project.title}: {err}"
            )

    return current_region