Andrew Bogott has uploaded a new change for review.
https://gerrit.wikimedia.org/r/268833
Change subject: Attempt to distinguish between project names and project IDs.
......................................................................
Attempt to distinguish between project names and project IDs.
In the keystone future these will not be the same thing.
Bug: T115029
Change-Id: Ie46939a2f8a0a57ed09865acc35d1e33649045cf
---
M OpenStackManager.php
M nova/OpenStackNovaController.php
M nova/OpenStackNovaProject.php
M nova/OpenStackNovaUser.php
M special/SpecialNovaProject.php
M special/SpecialNovaRole.php
6 files changed, 138 insertions(+), 85 deletions(-)
git pull
ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/OpenStackManager
refs/changes/33/268833/1
diff --git a/OpenStackManager.php b/OpenStackManager.php
index cf2d139..c8b24ec 100644
--- a/OpenStackManager.php
+++ b/OpenStackManager.php
@@ -153,6 +153,7 @@
$wgOpenStackManagerRemoveUserFromBastionProjectOnShellDisable = false;
// 'bastion' project name
$wgOpenStackManagerBastionProjectName = 'bastion';
+$wgOpenStackManagerBastionProjectId = 'bastion';
// Base URL for puppet docs. Classname will be appended with s/::/\//g
$wgOpenStackManagerPuppetDocBase = '';
/**
diff --git a/nova/OpenStackNovaController.php b/nova/OpenStackNovaController.php
index a7bbaec..dd9af57 100644
--- a/nova/OpenStackNovaController.php
+++ b/nova/OpenStackNovaController.php
@@ -304,6 +304,19 @@
}
/**
+ * @return string
+ */
+ function getProjectName( $projectid ) {
+ $admintoken = $this->_getAdminToken();
+ $headers = array( "X-Auth-Token: $admintoken" );
+
+ $userarr = array();
+ $ret = $this->restCall( 'identity', "/tenants/$projectid",
'GET', array(), $headers );
+ $tenant = self::_get_property( $ret['body'], 'tenant' );
+ return $tenant->name;
+ }
+
+ /**
* @return array of user ids
*/
function getUsersInProject( $projectid ) {
diff --git a/nova/OpenStackNovaProject.php b/nova/OpenStackNovaProject.php
index d40072a..9d74723 100644
--- a/nova/OpenStackNovaProject.php
+++ b/nova/OpenStackNovaProject.php
@@ -26,8 +26,9 @@
* @param $projectname
* @param bool $load
*/
- function __construct( $projectname, $load=true ) {
- $this->projectname = $projectname;
+ function __construct( $projectid, $load=true ) {
+ $this->projectid = $projectid;
+ $this->projectname = "";
if ( $load ) {
OpenStackNovaLdapConnection::connect();
$this->fetchProjectInfo();
@@ -36,20 +37,24 @@
}
}
- /**
- * This isn't done in the constructor to maintain
- * compatibility with the old ldap Project object
- */
- public function setId( $projectid ) {
- $this->projectid = $projectid;
+ public function setName( $projectname ) {
+ $this->projectname = $projectname;
}
public function getName() {
+ if ( !$this->projectname ) {
+ $this->loadProjectName();
+ }
return $this->projectname;
}
public function getId() {
return $this->projectid;
+ }
+
+ function loadProjectName() {
+ $controller = OpenstackNovaProject::getController();
+ $this->projectname = $controller->getProjectName(
$this->projectid );
}
/**
@@ -62,6 +67,10 @@
if ( $this->loaded and !$refresh ) {
return;
+ }
+
+ if ( !$this->projectname || $refresh ) {
+ $this->loadProjectName();
}
$this->roles = array();
@@ -167,9 +176,8 @@
* @return string
*/
function getProjectName() {
- return $this->projectname;
+ return $this->getName();
}
-
/**
* Returns the corresponding ProjectGroup for this Project.
@@ -307,7 +315,6 @@
global $wgLDAPUserBaseDNs;
$membernames = $this->getMembers();
$memberDNs = array();
- var_dump_pre($wgLDAPUserBaseDNs);
$dnstring = implode(",",$wgLDAPUserBaseDNs);
foreach ($membernames as $member) {
$memberDNs[] = "uid=$member,$dnstring";
@@ -503,21 +510,39 @@
/**
* Return a project by its project name. Returns null if the project
does not exist.
+ * This function is terrible and should be used sparingly
*
* @static
* @param $projectname
* @return null|OpenStackNovaProject
*/
static function getProjectByName( $projectname ) {
- if ( isset( self::$projectCache[ $projectname ] ) ) {
- return self::$projectCache[ $projectname ];
+ $projects = self::getAllProjects();
+ foreach ( $projects as $project ) {
+ if ( $project->getProjectName() == $projectname ) {
+ return $project;
+ }
}
- $project = new OpenStackNovaProject( $projectname );
+ return null;
+ }
+
+ /**
+ * Return a project by its project id. Returns null if the project does
not exist.
+ *
+ * @static
+ * @param $projectname
+ * @return null|OpenStackNovaProject
+ */
+ static function getProjectById( $projectid ) {
+ if ( isset( self::$projectCache[ $projectid ] ) ) {
+ return self::$projectCache[ $projectid ];
+ }
+ $project = new OpenStackNovaProject( $projectid );
if ( $project->projectInfo ) {
if ( count( self::$projectCache ) >=
self::$projectCacheMaxSize ) {
array_shift( self::$projectCache );
}
- self::$projectCache[ $projectname ] = $project;
+ self::$projectCache[ $projectid ] = $project;
return $project;
} else {
return null;
@@ -542,6 +567,17 @@
$projects = array();
foreach ( $projectnames as $projectname ) {
$project = self::getProjectByName( $projectname );
+ if ( $project ) {
+ $projects[] = $project;
+ }
+ }
+ return $projects;
+ }
+
+ static function getProjectsById( $projectids ) {
+ $projects = array();
+ foreach ( $projectids as $projectid ) {
+ $project = self::getProjectById( $projectid );
if ( $project ) {
$projects[] = $project;
}
@@ -579,8 +615,8 @@
$projectHash = $controller->getProjects();
$projects = array();
foreach( $projectHash as $id => $name ) {
- $project = new OpenStackNovaProject( $name, false );
- $project->setId( $id );
+ $project = new OpenStackNovaProject( $id, false );
+ $project->setName( $name );
$projects[] = $project;
}
@@ -650,12 +686,12 @@
}
} else {
$wgAuth->printDebug( "Failed to add project
$projectname", NONSENSITIVE );
- return false;
+ return null;
}
OpenStackNovaProject::createServiceGroupOUs( $projectname );
- return true;
+ return $project;
}
/**
@@ -705,12 +741,12 @@
* @param $projectname String
* @return bool
*/
- static function deleteProject( $projectname ) {
+ static function deleteProject( $projectid ) {
global $wgAuth;
OpenStackNovaLdapConnection::connect();
- $project = new OpenStackNovaProject( $projectname );
+ $project = new OpenStackNovaProject( $projectid );
if ( ! $project ) {
return false;
}
diff --git a/nova/OpenStackNovaUser.php b/nova/OpenStackNovaUser.php
index 94c81fb..7ab064f 100644
--- a/nova/OpenStackNovaUser.php
+++ b/nova/OpenStackNovaUser.php
@@ -623,13 +623,13 @@
}
public static function addUserToBastionProject( $user, &$group ) {
- global $wgOpenStackManagerBastionProjectName;
+ global $wgOpenStackManagerBastionProjectId;
if( User::groupHasPermission( $group, 'loginviashell' ) ) {
// Add the user to the bastion project if not already a
// member.
$username = $user->getName();
- $project = new OpenStackNovaProject(
$wgOpenStackManagerBastionProjectName );
+ $project = new OpenStackNovaProject(
$wgOpenStackManagerBastionProjectId );
if( !in_array( $username, $project->getMembers() ) ) {
$project->addMember( $username );
}
@@ -640,7 +640,7 @@
public static function removeUserFromBastionProject( $user, &$group ) {
global
$wgOpenStackManagerRemoveUserFromBastionProjectOnShellDisable;
global
$wgOpenStackManagerRemoveUserFromAllProjectsOnShellDisable;
- global $wgOpenStackManagerBastionProjectName;
+ global $wgOpenStackManagerBastionProjectId;
// Check whether after removing the group the user would still
// have the loginviashell permission.
@@ -665,14 +665,14 @@
if( $wgOpenStackManagerRemoveUserFromAllProjectsOnShellDisable
) {
// Get a users projects
$userLDAP = new OpenStackNovaUser( $username );
- foreach( $userLDAP->getProjects() as $projectName ) {
+ foreach( $userLDAP->getProjects() as $projectId ) {
// Remove the user from the project
- $project = new OpenStackNovaProject(
$projectName );
+ $project = new OpenStackNovaProject( $projectId
);
$project->deleteMember( $username );
}
} elseif(
$wgOpenStackManagerRemoveUserFromBastionProjectOnShellDisable ) {
// Remove the user from the bastion project
- $project = new OpenStackNovaProject(
$wgOpenStackManagerBastionProjectName );
+ $project = new OpenStackNovaProject(
$wgOpenStackManagerBastionProjectId );
if( in_array( $username, $project->getMembers() ) ) {
$project->deleteMember( $username );
}
diff --git a/special/SpecialNovaProject.php b/special/SpecialNovaProject.php
index 722ee7b..72da07a 100644
--- a/special/SpecialNovaProject.php
+++ b/special/SpecialNovaProject.php
@@ -55,7 +55,7 @@
$this->setHeaders();
$this->getOutput()->setPagetitle( $this->msg(
'openstackmanager-addmember' ) );
- $project = $this->getRequest()->getText( 'projectname' );
+ $project = $this->getRequest()->getText( 'projectid' );
if ( !$this->userCanExecute( $this->getUser() ) &&
!$this->userLDAP->inRole( 'projectadmin', $project ) ) {
$this->notInRole( 'projectadmin', $project );
return false;
@@ -72,10 +72,10 @@
'default' => 'addmember',
'name' => 'action',
);
- $projectInfo['projectname'] = array(
+ $projectInfo['projectid'] = array(
'type' => 'hidden',
'default' => $project,
- 'name' => 'projectname',
+ 'name' => 'projectid',
);
$projectForm = new HTMLForm(
@@ -97,12 +97,12 @@
$this->setHeaders();
$this->getOutput()->setPagetitle( $this->msg(
'openstackmanager-removemember' ) );
- $projectname = $this->getRequest()->getText( 'projectname' );
- if ( !$this->userCanExecute( $this->getUser() ) &&
!$this->userLDAP->inRole( 'projectadmin', $projectname ) ) {
- $this->notInRole( 'projectadmin', $projectname );
+ $projectid = $this->getRequest()->getText( 'projectid' );
+ if ( !$this->userCanExecute( $this->getUser() ) &&
!$this->userLDAP->inRole( 'projectadmin', $projectid ) ) {
+ $this->notInRole( 'projectadmin', $projectid );
return false;
}
- $project = OpenStackNovaProject::getProjectByName( $projectname
);
+ $project = OpenStackNovaProject::getProjectByName( $projectid );
$projectmembers = $project->getMembers();
$member_keys = array();
foreach ( $projectmembers as $projectmember ) {
@@ -120,10 +120,10 @@
'default' => 'deletemember',
'name' => 'action',
);
- $projectInfo['projectname'] = array(
+ $projectInfo['projectid'] = array(
'type' => 'hidden',
- 'default' => $projectname,
- 'name' => 'projectname',
+ 'default' => $projectid,
+ 'name' => 'projectid',
);
$projectForm = new HTMLForm(
@@ -149,15 +149,15 @@
}
$this->getOutput()->setPagetitle( $this->msg(
'openstackmanager-deleteproject' ) );
- $project = $this->getRequest()->getText( 'projectname' );
+ $project = $this->getRequest()->getText( 'projectid' );
if ( ! $this->getRequest()->wasPosted() ) {
$this->getOutput()->addWikiMsg(
'openstackmanager-removeprojectconfirm', $project );
}
$projectInfo = array();
- $projectInfo['projectname'] = array(
+ $projectInfo['projectid'] = array(
'type' => 'hidden',
'default' => $project,
- 'name' => 'projectname',
+ 'name' => 'projectid',
);
$projectInfo['action'] = array(
'type' => 'hidden',
@@ -218,6 +218,7 @@
$projectRow = array();
$this->pushRawResourceColumn( $projectRow,
$this->createResourceList( $project->getMembers() ) );
$roleRows = array();
+ $projectId = $project->getId();
$projectName = $project->getProjectName();
foreach ( $project->getRoles() as $role ) {
$roleRow = array();
@@ -230,11 +231,11 @@
$actions = array();
$specialRoleTitle = Title::newFromText(
'Special:NovaRole' );
$actions[] = $this->createActionLink(
'openstackmanager-addrolemember',
- array( 'action' => 'addmember', 'projectname'
=> $projectName, 'roleid' => $roleId, 'returnto' => 'Special:NovaProject' ),
+ array( 'action' => 'addmember', 'projectid' =>
$projectId, 'roleid' => $roleId, 'returnto' => 'Special:NovaProject' ),
$specialRoleTitle
);
$actions[] = $this->createActionLink(
'openstackmanager-removerolemember',
- array( 'action' => 'deletemember',
'projectname' => $projectName, 'roleid' => $roleId, 'returnto' =>
'Special:NovaProject' ),
+ array( 'action' => 'deletemember', 'projectid'
=> $projectId, 'roleid' => $roleId, 'returnto' => 'Special:NovaProject' ),
$specialRoleTitle
);
$this->pushRawResourceColumn( $roleRow,
$this->createResourceList( $actions ) );
@@ -244,10 +245,10 @@
$this->pushRawResourceColumn( $projectRow,
$this->createResourceTable( $roleheaders, $roleRows ) );
$actions = array();
- $actions[] = $this->createActionLink(
'openstackmanager-deleteproject', array( 'action' => 'delete', 'projectname' =>
$projectName ) );
- $actions[] = $this->createActionLink(
'openstackmanager-addmember', array( 'action' => 'addmember', 'projectname' =>
$projectName ) );
- $actions[] = $this->createActionLink(
'openstackmanager-removemember', array( 'action' => 'deletemember',
'projectname' => $projectName ) );
- $actions[] = $this->createActionLink(
'openstackmanager-displayquotas-action', array( 'action' => 'displayquotas',
'projectname' => $projectName ) );
+ $actions[] = $this->createActionLink(
'openstackmanager-deleteproject', array( 'action' => 'delete', 'projectid' =>
$projectId ) );
+ $actions[] = $this->createActionLink(
'openstackmanager-addmember', array( 'action' => 'addmember', 'projectid' =>
$projectId ) );
+ $actions[] = $this->createActionLink(
'openstackmanager-removemember', array( 'action' => 'deletemember', 'projectid'
=> $projectId ) );
+ $actions[] = $this->createActionLink(
'openstackmanager-displayquotas-action', array( 'action' => 'displayquotas',
'projectid' => $projectId ) );
$hieraTitle = Title::makeTitleSafe( NS_HIERA, $projectName );
@@ -300,14 +301,14 @@
*/
function displayQuotas() {
$this->setHeaders();
- $projectName = $this->getRequest()->getText( 'projectname' );
- $this->getOutput()->setPagetitle( $this->msg(
'openstackmanager-displayquotas', $projectName ) );
- if ( !$this->userCanExecute( $this->getUser() ) &&
!$this->userLDAP->inRole( 'projectadmin', $projectName ) ) {
- $this->notInRole( 'projectadmin', $projectName );
+ $projectId = $this->getRequest()->getText( 'projectid' );
+ $this->getOutput()->setPagetitle( $this->msg(
'openstackmanager-displayquotas', $projectId ) );
+ if ( !$this->userCanExecute( $this->getUser() ) &&
!$this->userLDAP->inRole( 'projectadmin', $projectId ) ) {
+ $this->notInRole( 'projectadmin', $projectId );
return false;
}
# Change the connection to reference this project
- $this->userNova->setProject( $projectName );
+ $this->userNova->setProject( $projectId );
$regions = $this->userNova->getRegions( 'compute' );
foreach ( $regions as $region ) {
$this->userNova->setRegion( $region );
@@ -337,14 +338,14 @@
function tryCreateSubmit( $formData, $entryPoint = 'internal' ) {
global $wgOpenStackManagerDefaultSecurityGroupRules;
- $success = OpenStackNovaProject::createProject(
$formData['projectname'] );
- if ( ! $success ) {
+ $project = OpenStackNovaProject::createProject(
$formData['projectname'] );
+ if ( ! $project ) {
$this->getOutput()->addWikiMsg(
'openstackmanager-createprojectfailed' );
return false;
}
- $project = OpenStackNovaProject::getProjectByName(
$formData['projectname'] );
$username = $this->userLDAP->getUsername();
$project->addMember( $username );
+ $projectId = $project->getId();
$members = explode( ',', $formData['member'] );
foreach ( $members as $member ) {
$project->addMember( $member );
@@ -358,7 +359,7 @@
$role->addMember( $username );
}
# Change the connection to reference this project
- $this->userNova->setProject( $formData['projectname'] );
+ $this->userNova->setProject( $projectId );
$regions = $this->userNova->getRegions( 'compute' );
foreach ( $regions as $region ) {
$this->userNova->setRegion( $region );
@@ -419,9 +420,9 @@
* @return bool
*/
function tryDeleteSubmit( $formData, $entryPoint = 'internal' ) {
- $success = OpenStackNovaProject::deleteProject(
$formData['projectname'] );
+ $success = OpenStackNovaProject::deleteProject(
$formData['projectid'] );
if ( $success ) {
- $project = OpenStackNovaProject::getProjectByName(
$formData['projectname'] );
+ $project = OpenStackNovaProject::getProjectById(
$formData['projectid'] );
$project->deleteArticle();
$this->getOutput()->addWikiMsg(
'openstackmanager-deletedproject' );
} else {
@@ -444,12 +445,13 @@
* @return bool
*/
function tryAddMemberSubmit( $formData, $entryPoint = 'internal' ) {
- $project = new OpenStackNovaProject( $formData['projectname'] );
+ $project = new OpenStackNovaProject( $formData['projectid'] );
+ $projectName = $project->getName();
$members = explode( ',', $formData['member'] );
foreach ( $members as $member ) {
$user = User::newFromName( $member, 'usable' );
if ( !$user ) {
- $this->getOutput()->addWikiMsg(
'openstackmanager-failedtoadd', $formData['member'], $formData['projectname'] );
+ $this->getOutput()->addWikiMsg(
'openstackmanager-failedtoadd', $formData['member'], $projectName );
continue;
}
$success = $project->addMember( $member );
@@ -459,17 +461,17 @@
# successfully been added to a project
$user->addGroup( 'shell' );
}
- $this->getOutput()->addWikiMsg(
'openstackmanager-addedto', $formData['member'], $formData['projectname'] );
+ $this->getOutput()->addWikiMsg(
'openstackmanager-addedto', $formData['member'], $projectName );
if ( class_exists( 'EchoEvent' ) ) {
EchoEvent::create( array(
'type' =>
'osm-projectmembers-add',
- 'title' => Title::newFromText(
$formData['projectname'], NS_NOVA_RESOURCE ),
+ 'title' => Title::newFromText(
$projectName, NS_NOVA_RESOURCE ),
'agent' => $this->getUser(),
'extra' => array( 'userAdded'
=> $user->getId() ),
) );
}
} else {
- $this->getOutput()->addWikiMsg(
'openstackmanager-failedtoadd', $formData['member'], $formData['projectname'] );
+ $this->getOutput()->addWikiMsg(
'openstackmanager-failedtoadd', $formData['member'], $projectName );
}
}
@@ -489,7 +491,8 @@
* @return bool
*/
function tryDeleteMemberSubmit( $formData, $entryPoint = 'internal' ) {
- $project = OpenStackNovaProject::getProjectByName(
$formData['projectname'] );
+ $project = OpenStackNovaProject::getProjectById(
$formData['projectid'] );
+ $projectName = $project->getName();
if ( ! $project ) {
$this->getOutput()->addWikiMsg(
'openstackmanager-nonexistentproject' );
return true;
@@ -497,9 +500,9 @@
foreach ( $formData['members'] as $member ) {
$success = $project->deleteMember( $member );
if ( $success ) {
- $this->getOutput()->addWikiMsg(
'openstackmanager-removedfrom', $member, $formData['projectname'] );
+ $this->getOutput()->addWikiMsg(
'openstackmanager-removedfrom', $member, $projectName );
} else {
- $this->getOutput()->addWikiMsg(
'openstackmanager-failedtoremove', $member, $formData['projectname'] );
+ $this->getOutput()->addWikiMsg(
'openstackmanager-failedtoremove', $member, $projectName );
}
}
$out = '<br />';
diff --git a/special/SpecialNovaRole.php b/special/SpecialNovaRole.php
index a370a4c..22f83a8 100644
--- a/special/SpecialNovaRole.php
+++ b/special/SpecialNovaRole.php
@@ -42,13 +42,13 @@
$roleInfo = array();
$roleid = $this->getRequest()->getText( 'roleid' );
- $projectname = $this->getRequest()->getText( 'projectname' );
- if ( $projectname ) {
- if ( !$this->userCanExecute( $this->getUser() ) &&
!$this->userLDAP->inRole( $roleid, $projectname ) ) {
+ $projectid = $this->getRequest()->getText( 'projectid' );
+ if ( $projectid ) {
+ if ( !$this->userCanExecute( $this->getUser() ) &&
!$this->userLDAP->inRole( $roleid, $projectid ) ) {
$this->displayRestrictionError();
return false;
}
- $project = OpenStackNovaProject::getProjectByName(
$projectname );
+ $project = OpenStackNovaProject::getProjectById(
$projectid );
$projectmembers = $project->getMembers();
natcasesort( $projectmembers );
$role = OpenStackNovaRole::getProjectRoleById( $roleid,
$project );
@@ -83,10 +83,10 @@
'default' => $roleid,
'name' => 'roleid',
);
- $roleInfo['projectname'] = array(
+ $roleInfo['projectid'] = array(
'type' => 'hidden',
- 'default' => $projectname,
- 'name' => 'projectname',
+ 'default' => $projectid,
+ 'name' => 'projectid',
);
$roleInfo['returnto'] = array(
'type' => 'hidden',
@@ -114,13 +114,13 @@
$this->getOutput()->setPagetitle( $this->msg(
'openstackmanager-removerolemember' ) );
$roleid = $this->getRequest()->getText( 'roleid' );
- $projectname = $this->getRequest()->getText( 'projectname' );
- if ( $projectname ) {
- if ( !$this->userCanExecute( $this->getUser() ) &&
!$this->userLDAP->inRole( $roleid, $projectname ) ) {
+ $projectid = $this->getRequest()->getText( 'projectid' );
+ if ( $projectid ) {
+ if ( !$this->userCanExecute( $this->getUser() ) &&
!$this->userLDAP->inRole( $roleid, $projectid ) ) {
$this->displayRestrictionError();
return false;
}
- $project = OpenStackNovaProject::getProjectByName(
$projectname );
+ $project = OpenStackNovaProject::getProjectById(
$projectid );
$projectmembers = $project->getMembers();
natcasesort( $projectmembers );
$role = OpenStackNovaRole::getProjectRoleById( $roleid,
$project );
@@ -156,10 +156,10 @@
'default' => $roleid,
'name' => 'roleid',
);
- $roleInfo['projectname'] = array(
+ $roleInfo['projectid'] = array(
'type' => 'hidden',
- 'default' => $projectname,
- 'name' => 'projectname',
+ 'default' => $projectid,
+ 'name' => 'projectid',
);
$roleInfo['returnto'] = array(
'type' => 'hidden',
@@ -185,9 +185,9 @@
* @return bool
*/
function tryAddMemberSubmit( $formData, $entryPoint = 'internal' ) {
- $projectname = $formData['projectname'];
- if ( $projectname ) {
- $project = OpenStackNovaProject::getProjectByName(
$projectname );
+ $projectid = $formData['projectid'];
+ if ( $projectid ) {
+ $project = OpenStackNovaProject::getProjectById(
$projectid );
if ( ! $project ) {
$this->getOutput()->addWikiMsg(
'openstackmanager-nonexistentproject' );
return true;
@@ -229,9 +229,9 @@
* @return bool
*/
function tryDeleteMemberSubmit( $formData, $entryPoint = 'internal' ) {
- $projectname = $formData['projectname'];
- if ( $projectname ) {
- $project = OpenStackNovaProject::getProjectByName(
$projectname );
+ $projectid = $formData['projectid'];
+ if ( $projectid ) {
+ $project = OpenStackNovaProject::getProjectById(
$projectid );
if ( ! $project ) {
$this->getOutput()->addWikiMsg(
'openstackmanager-nonexistentproject' );
return true;
--
To view, visit https://gerrit.wikimedia.org/r/268833
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ie46939a2f8a0a57ed09865acc35d1e33649045cf
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/OpenStackManager
Gerrit-Branch: master
Gerrit-Owner: Andrew Bogott <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits