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()) })
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 []
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
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))
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