Andrew Bogott has uploaded a new change for review.
https://gerrit.wikimedia.org/r/49375
Change subject: Add a GUI for managing a project's shared volumes
......................................................................
Add a GUI for managing a project's shared volumes
Change-Id: Ia4be5a207af90645e3e8ddedd3a660d3c10df0bc
---
M OpenStackManager.i18n.php
M OpenStackNovaProject.php
M special/SpecialNovaProject.php
3 files changed, 156 insertions(+), 0 deletions(-)
git pull
ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/OpenStackManager
refs/changes/75/49375/1
diff --git a/OpenStackManager.i18n.php b/OpenStackManager.i18n.php
index 8e3a137..bb85d6d 100644
--- a/OpenStackManager.i18n.php
+++ b/OpenStackManager.i18n.php
@@ -189,6 +189,12 @@
'openstackmanager-removeprojectconfirm' => 'Are you sure you wish to
delete project "$1"?
This action has reprecusions on all VMs.
Do not take this action lightly!',
+ 'openstackmanager-configureproject' => 'Configure project $1',
+ 'openstackmanager-configureproject-sharedhomedirs' => 'Share home
directories across instances',
+ 'openstackmanager-configureproject-sharedstorage' => 'Create shared
project storage',
+ 'openstackmanager-configureproject-volume' => 'Shared storage',
+ 'openstackmanager-configureproject-failed' => 'Failed to change project
settings.',
+ 'openstackmanager-configureproject-success' => 'Project settings
updated.',
'openstackmanager-createproject' => 'Add project',
'openstackmanager-projectname' => 'Project name',
'openstackmanager-members' => 'Members',
@@ -485,6 +491,12 @@
'openstackmanager-addmember' => 'Page title',
'openstackmanager-removemember' => 'Page title',
'openstackmanager-createproject' => 'Page title',
+ 'openstackmanager-configureproject' => 'Page title, $1 is project
name.',
+ 'openstackmanager-configureproject-sharedhomedirs' => 'checkbox label',
+ 'openstackmanager-configureproject-sharedstorage' => 'checkbox label',
+ 'openstackmanager-configureproject-volume' => 'form section title',
+ 'openstackmanager-configureproject-failed' => 'Message when project
configure fails',
+ 'openstackmanager-configureproject-success' => 'Message when project
configure works',
'openstackmanager-projectname' => '{{Identical|Project name}}',
'openstackmanager-members' => '{{Identical|Member}}',
'openstackmanager-member' => '{{Identical|Member}}',
diff --git a/OpenStackNovaProject.php b/OpenStackNovaProject.php
index d5e8994..e035231 100644
--- a/OpenStackNovaProject.php
+++ b/OpenStackNovaProject.php
@@ -156,6 +156,58 @@
}
/**
+ * Return a list of volume settings.
+ *
+ * Volume settings live in ldap in the form
+ *
+ * info: volume=home
+ * info: volume=project
+ *
+ * @return array
+ */
+ function getVolumeSettings() {
+ $volumes = array();
+
+ if ( isset( $this->projectInfo[0]['info'] ) ) {
+ $infos = $this->projectInfo[0]['info'];
+
+ // first member is a count.
+ array_shift( $infos );
+ foreach ( $infos as $info ) {
+ $substrings=explode( '=', $info );
+ if ( ( count( $substrings ) == 2 ) and (
$substrings[0] == 'use_volume' ) ) {
+ array_push( $volumes, $substrings[1] );
+ }
+ }
+ }
+ return $volumes;
+ }
+
+ /**
+ * Set volume settings.
+ *
+ * @param $volumes (e.g. ['home', 'project'])
+ * @return bool
+ *
+ *
+ * @return array
+ */
+ function setVolumeSettings( $volumes ) {
+
+ $values = array();
+ $values['info'] = array();
+ foreach ( $volumes as $volume ) {
+ $values['info'][] = "use_volume=" . $volume;
+ }
+
+ $success = LdapAuthenticationPlugin::ldap_modify(
$wgAuth->ldapconn, $this->projectDN, $values );
+
+ $this->fetchProjectInfo( true );
+
+ return $success;
+ }
+
+ /**
* Returns an array of all member DNs that belong to this project.
*
* @return array
diff --git a/special/SpecialNovaProject.php b/special/SpecialNovaProject.php
index f99805a..c0c9a35 100644
--- a/special/SpecialNovaProject.php
+++ b/special/SpecialNovaProject.php
@@ -34,6 +34,8 @@
$this->addMember();
} elseif ( $action === "deletemember" ) {
$this->deleteMember();
+ } elseif ( $action === "configureproject" ) {
+ $this->configureProject();
} else {
$this->listProjects();
}
@@ -219,6 +221,7 @@
array_push( $actions, $this->createActionLink(
'openstackmanager-deleteproject', array( 'action' => 'delete', 'projectname' =>
$projectName ) ) );
array_push( $actions, $this->createActionLink(
'openstackmanager-addmember', array( 'action' => 'addmember', 'projectname' =>
$projectName ) ) );
array_push( $actions, $this->createActionLink(
'openstackmanager-removemember', array( 'action' => 'deletemember',
'projectname' => $projectName ) ) );
+ array_push( $actions, $this->createActionLink(
'openstackmanager-configure', array( 'action' => 'configureproject',
'projectname' => $projectName ) ) );
$this->pushRawResourceColumn( $projectRow,
$this->createResourceList( $actions ) );
array_push( $projectRows, $projectRow );
return $this->createResourceTable( $headers, $projectRows );
@@ -269,6 +272,58 @@
$projectForm->setSubmitID(
'novaproject-form-createprojectsubmit' );
$projectForm->setSubmitCallback( array( $this,
'tryCreateSubmit' ) );
$projectForm->show();
+ }
+
+ /**
+ * @return bool
+ */
+ function configureProject() {
+ $this->setHeaders();
+ $projectName = $this->getRequest()->getText( 'projectname' );
+ $this->getOutput()->setPagetitle( $this->msg(
'openstackmanager-configureproject', $projectName ) );
+ if ( !$this->userCanExecute( $this->getUser() ) &&
!$this->userLDAP->inProject( $project ) ) {
+ $this->notInProject();
+ return false;
+ }
+ $project = OpenStackNovaProject::getProjectByName( $projectName
);
+
+ $volumes = $project->getVolumeSettings();
+ $defaultHomedirs = in_array("home", $volumes);
+ $defaultProject = in_array("project", $volumes);
+
+ $formInfo = array();
+ $formInfo['homedirs'] = array(
+ 'type' => 'check',
+ 'label-message' =>
'openstackmanager-configureproject-sharedhomedirs',
+ 'default' => $defaultHomedirs,
+ 'section' => 'volume',
+ 'name' => 'sharedhomedirs',
+ );
+ $formInfo['storage'] = array(
+ 'type' => 'check',
+ 'label-message' =>
'openstackmanager-configureproject-sharedstorage',
+ 'default' => $defaultProject,
+ 'section' => 'volume',
+ 'name' => 'sharedstorage',
+ );
+ $formInfo['action'] = array(
+ 'type' => 'hidden',
+ 'default' => 'configureproject',
+ 'name' => 'action',
+ );
+ $formInfo['projectname'] = array(
+ 'type' => 'hidden',
+ 'default' => $projectName,
+ 'name' => 'projectname',
+ );
+
+ $projectForm = new HTMLForm( $formInfo,
'openstackmanager-configureproject' );
+ $projectForm->setTitle( SpecialPage::getTitleFor( 'NovaProject'
) );
+ $projectForm->setSubmitID( 'novaproject-form-configuresubmit' );
+ $projectForm->setSubmitCallback( array( $this,
'tryConfigureProjectSubmit' ) );
+ $projectForm->show();
+
+ return true;
}
/**
@@ -449,4 +504,41 @@
return true;
}
+
+ /**
+ * @param $formData
+ * @param string $entryPoint
+ * @return bool
+ */
+ function tryConfigureProjectSubmit( $formData, $entryPoint = 'internal'
) {
+ $project = OpenStackNovaProject::getProjectByName(
$formData['projectname'] );
+ if ( ! $project ) {
+ $this->getOutput()->addWikiMsg(
'openstackmanager-nonexistentproject' );
+ return true;
+ }
+
+ $vols = array();
+
+ if ( $formData['homedirs'] ) {
+ array_push( $vols, "home" );
+ }
+
+ if ( $formData['storage'] ) {
+ array_push( $vols, "project" );
+ }
+
+ if ( $project->setVolumeSettings($vols) ) {
+ $this->getOutput()->addWikiMsg(
'openstackmanager-configureproject-success' );
+ } else {
+ $this->getOutput()->addWikiMsg(
'openstackmanager-configureproject-failed' );
+ }
+
+ $out .= Linker::link(
+ $this->getTitle(),
+ $this->msg( 'openstackmanager-backprojectlist'
)->escaped()
+ );
+ $this->getOutput()->addHTML( $out );
+
+ return true;
+ }
}
--
To view, visit https://gerrit.wikimedia.org/r/49375
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ia4be5a207af90645e3e8ddedd3a660d3c10df0bc
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