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

Reply via email to