Ryan Lane has submitted this change and it was merged.
Change subject: Cache a dict of member ids and names rather than just names.
......................................................................
Cache a dict of member ids and names rather than just names.
Having the ids and names allows for much faster lookup in
SpecialNovaSudoer.
Change-Id: Ifce2f56ce0ded10a6a5c789c64e4aeff20c941ac
---
M nova/OpenStackNovaProject.php
M special/SpecialNovaSudoer.php
2 files changed, 77 insertions(+), 66 deletions(-)
Approvals:
Ryan Lane: Verified; Looks good to me, approved
jenkins-bot: Checked
diff --git a/nova/OpenStackNovaProject.php b/nova/OpenStackNovaProject.php
index e493014..13e7a25 100644
--- a/nova/OpenStackNovaProject.php
+++ b/nova/OpenStackNovaProject.php
@@ -159,22 +159,25 @@
}
/**
- * Return all users who are a member of this project
+ * Fill $this->members.
+ *
+ * $this->members uses the uid as index and the name as value.
*
* @return array
*/
- function getMembers() {
+ function loadMembers() {
global $wgAuth;
global $wgMemc;
global $wgOpenStackManagerLDAPDomain;
- $key = wfMemcKey( 'openstackmanager', 'projectmembers',
$this->projectname );
- $members = $wgMemc->get( $key );
- if ( is_array( $members ) ) {
- return $members;
+ $key = wfMemcKey( 'openstackmanager', 'projectuidsandmembers',
$this->projectname );
+ $this->members = $wgMemc->get( $key );
+
+ if ( is_array( $this->members ) ) {
+ return;
}
- $members = array();
+ $this->members = array();
if ( isset( $this->projectInfo[0]['member'] ) ) {
$memberdns = $this->projectInfo[0]['member'];
// The first element in the member list is the count
@@ -182,24 +185,51 @@
// Shift it off.
array_shift( $memberdns );
foreach ( $memberdns as $memberdn ) {
+ $member = explode( '=', $memberdn );
+ $member = explode( ',', $member[1] );
+ $member = $member[0];
+
$searchattr = $wgAuth->getConf(
'SearchAttribute', $wgOpenStackManagerLDAPDomain );
if ( $searchattr ) {
// We need to look up the search attr
from the user entry
// this is expensive, but must be done.
$userInfo =
$wgAuth->getUserInfoStateless( $memberdn );
- $members[] =
$userInfo[0][$searchattr][0];
+ $this->members[$member] =
$userInfo[0][$searchattr][0];
} else {
- $member = explode( '=', $memberdn );
- $member = explode( ',', $member[1] );
- $member = $member[0];
- $members[] = $member;
+ $this->members[$member] = $member;
}
}
}
- $wgMemc->set( $key, $members, '3600' );
+ $wgMemc->set( $key, $this->members, '3600' );
+ }
- return $members;
+ /**
+ * Return UIDs for users who are a member of this project
+ *
+ * We need this for managing things related to sudoers; generating
+ * the list is expensive and caching it here is a big speedup.
+ *
+ * @return array
+ */
+ function getMemberUIDs() {
+ $this->loadMembers();
+ return array_keys( $this->members );
+ }
+
+ /**
+ * Return all users who are a member of this project
+ *
+ * @return array
+ */
+ function getMembers() {
+ $this->loadMembers();
+ return array_values( $this->members );
+ }
+
+ function memberForUid( $uid ) {
+ $this->loadMembers();
+ return $this->members[$uid];
}
/**
@@ -388,7 +418,7 @@
global $wgAuth;
global $wgMemc;
- $key = wfMemcKey( 'openstackmanager', 'projectmembers',
$this->projectname );
+ $key = wfMemcKey( 'openstackmanager', 'projectuidsandmembers',
$this->projectname );
$wgMemc->delete( $key );
if ( isset( $this->projectInfo[0]['member'] ) ) {
@@ -494,7 +524,7 @@
global $wgAuth;
global $wgMemc;
- $key = wfMemcKey( 'openstackmanager', 'projectmembers',
$this->projectname );
+ $key = wfMemcKey( 'openstackmanager', 'projectuidsandmembers',
$this->projectname );
$wgMemc->delete( $key );
$members = array();
diff --git a/special/SpecialNovaSudoer.php b/special/SpecialNovaSudoer.php
index 941299a..4534644 100644
--- a/special/SpecialNovaSudoer.php
+++ b/special/SpecialNovaSudoer.php
@@ -287,56 +287,40 @@
return true;
}
- function getProjectMemberUids( $project) {
- $projectmembers = $project->getMembers();
- $uids = array();
-
- foreach ( $projectmembers as $projectmember ) {
- $user = new OpenStackNovaUser( $projectmember );
- $uids[] = $user->getUid();
- }
-
- return $uids;
- }
-
function getSudoUsers( $projectName, $sudoer=null ) {
$project = OpenStackNovaProject::getProjectByName( $projectName
);
- $projectmembers = $project->getMembers();
+ $projectuids = $project->getMemberUids();
- array_unshift( $projectmembers, $this->msg(
'openstackmanager-allmembers' )->text() );
$sudomembers = array();
if ( $sudoer ) {
$sudomembers = $sudoer->getSudoerUsers();
}
$user_keys = array();
$user_defaults = array();
- foreach ( $projectmembers as $projectmember ) {
- $projectGroup = "%" .
$project->getProjectGroup()->getProjectGroupName();
+ # Add the 'all project members' option to the top
+ $projectGroup = "%" .
$project->getProjectGroup()->getProjectGroupName();
+ $all_members = $this->msg( 'openstackmanager-allmembers'
)->text();
+ $user_keys[$all_members] = $all_members;
+ if ( in_array( 'ALL', $sudomembers ) || in_array (
$projectGroup, $sudomembers ) ) {
+ $user_defaults[$all_members] = $all_members;
+ }
- if ( $projectmember == $this->msg(
'openstackmanager-allmembers' )->text() ) {
- $userUid = $this->msg(
'openstackmanager-allmembers' )->text();
- if ( in_array( 'ALL', $sudomembers ) ||
in_array ( $projectGroup, $sudomembers ) ) {
- $user_defaults[$projectmember] =
$userUid;
- }
- } else {
- $user = new OpenStackNovaUser( $projectmember );
- $userUid = $user->getUid();
- if ( in_array( $userUid, $sudomembers ) ) {
- $user_defaults[$projectmember] =
$userUid;
- }
- }
+ foreach ( $projectuids as $userUid ) {
+ $projectmember = $project->memberForUid( $userUid );
$user_keys[$projectmember] = $userUid;
+ if ( in_array( $userUid, $sudomembers ) ) {
+ $user_defaults[$projectmember] = $userUid;
+ }
}
return array( 'keys' => $user_keys, 'defaults' =>
$user_defaults );
}
function getSudoRunAsUsers( $projectName, $sudoer=null ) {
$project = OpenStackNovaProject::getProjectByName( $projectName
);
- $projectmembers = $project->getMembers();
+ $projectuids = $project->getMemberUids();
- array_unshift( $projectmembers, $this->msg(
'openstackmanager-allmembers' )->text() );
$runasmembers = array();
if ( $sudoer ) {
$runasmembers = $sudoer->getSudoerRunAsUsers();
@@ -344,24 +328,22 @@
$runas_keys = array();
$runas_defaults = array();
- foreach ( $projectmembers as $projectmember ) {
- $projectGroup = "%" .
$project->getProjectGroup()->getProjectGroupName();
+ # Add the 'all project members' option to the top
+ $projectGroup = "%" .
$project->getProjectGroup()->getProjectGroupName();
+ $all_members = $this->msg( 'openstackmanager-allmembers'
)->text();
+ $runas_keys[$all_members] = $all_members;
+ if ( in_array( 'ALL', $runasmembers ) || in_array (
$projectGroup, $runasmembers ) ) {
+ $runas_defaults[$all_members] = $all_members;
+ }
- if ( $projectmember == $this->msg(
'openstackmanager-allmembers' )->text() ) {
- $userUid = $this->msg(
'openstackmanager-allmembers' )->text();
- if ( in_array( 'ALL', $runasmembers ) ||
in_array ( $projectGroup, $runasmembers ) ) {
- $runas_defaults[$projectmember] =
$userUid;
- }
- } else {
- $user = new OpenStackNovaUser( $projectmember );
- $userUid = $user->getUid();
- if ( in_array( $userUid, $runasmembers ) ) {
- $runas_defaults[$projectmember] =
$userUid;
- }
- }
+ foreach ( $projectuids as $userUid ) {
+ $projectmember = $project->memberForUid( $userUid );
$runas_keys[$projectmember] = $userUid;
+ if ( in_array( $userUid, $runasmembers ) ) {
+ $runas_defaults[$projectmember] = $userUid;
+ }
}
return array( 'keys' => $runas_keys, 'defaults' =>
$runas_defaults );
}
@@ -437,13 +419,12 @@
function makeHumanReadableUserlist( $userList, $project ) {
$HRList = array();
- $projectmembers = $project->getMembers();
+ $projectuids = $project->getMemberUids();
$leftovers = $userList;
- foreach ( $projectmembers as $member ) {
- $user = new OpenStackNovaUser( $member );
- $userIndex = array_search( $user->getUid(), $userList );
+ foreach ( $projectuids as $uid ) {
+ $userIndex = array_search( $uid, $userList );
if ( $userIndex !== false ) {
- $HRList[] = $member;
+ $HRList[] = $project->memberForUid( $uid );
unset( $leftovers[$userIndex] );
}
}
@@ -650,7 +631,7 @@
$projectName = $formData['project'];
$project = OpenStackNovaProject::getProjectByName(
$projectName );
- $projectuids = $this->getProjectMemberUids( $project );
+ $projectuids = $project->getMemberUids();
$projectGroup = "%" .
$project->getProjectGroup()->getProjectGroupName();
$users =
$this->removeALLFromUserKeys($formData['users']);
--
To view, visit https://gerrit.wikimedia.org/r/69155
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: Ifce2f56ce0ded10a6a5c789c64e4aeff20c941ac
Gerrit-PatchSet: 2
Gerrit-Project: mediawiki/extensions/OpenStackManager
Gerrit-Branch: master
Gerrit-Owner: Andrew Bogott <[email protected]>
Gerrit-Reviewer: Ryan Lane <[email protected]>
Gerrit-Reviewer: jenkins-bot
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits