/**
  * Default action
  * @return void
  */
 function listInstances()
 {
     $this->setHeaders();
     $this->getOutput()->addModules('ext.openstack.Instance');
     $projects = OpenStackNovaProject::getProjectsByName($this->userLDAP->getProjects());
     $instanceOut = '';
     $ownedProjects = array();
     $instanceCount = 0;
     foreach ($projects as $project) {
         $projectName = $project->getProjectName();
         $instancesInProject = 0;
         if ($this->userLDAP->inRole('projectadmin', $projectName)) {
             $ownedProjects[] = $projectName;
         }
         $projectactions = array('projectadmin' => array());
         $regions = '';
         $this->userNova->setProject($projectName);
         foreach ($this->userNova->getRegions('compute') as $region) {
             $regionactions = array();
             $thisCount = 0;
             $instances = $this->getInstances($projectName, $region, $thisCount);
             $instancesInProject += $thisCount;
             if ($thisCount > 0) {
                 $regions .= $this->createRegionSection($region, $projectName, $regionactions, $instances);
             }
         }
         if ($instancesInProject) {
             $instanceOut .= $this->createProjectSection($projectName, $projectactions, $regions);
             $instanceCount += $instancesInProject;
         } else {
         }
     }
     $out = '';
     if ($ownedProjects) {
         $this->getOutput()->setPagetitle($this->msg('openstackmanager-ownedprojects', count($ownedProjects)));
         foreach ($ownedProjects as $ownedProject) {
             $projectNameOut = $this->createResourceLink($ownedProject);
             $out .= $projectNameOut . " ";
         }
     } else {
         $this->getOutput()->setPagetitle($this->msg('openstackmanager-noownedprojects'));
     }
     if ($instanceCount) {
         $out .= Html::rawElement('h1', array(), $this->msg('openstackmanager-ownedinstances', $instanceCount)->text());
         $out .= $instanceOut;
     } else {
         $out .= Html::rawElement('h1', array(), $this->msg('openstackmanager-noownedinstances')->text());
     }
     $this->getOutput()->addHTML($out);
 }
 /**
  * @return void
  */
 function listProjects()
 {
     $this->setHeaders();
     $this->getOutput()->setPageTitle($this->msg('openstackmanager-projectlist'));
     $this->getOutput()->addModuleStyles('ext.openstack');
     if ($this->getUser()->isAllowed('listall')) {
         $projects = OpenStackNovaProject::getAllProjects();
         $this->showCreateProject();
     } else {
         $projects = OpenStackNovaProject::getProjectsByName($this->userLDAP->getProjects());
     }
     $this->showProjectFilter($projects);
     $projectfilter = $this->getProjectFilter();
     if (!$projectfilter) {
         $this->getOutput()->addWikiMsg('openstackmanager-setprojectfilter');
         return null;
     }
     $out = '';
     foreach ($projects as $project) {
         $projectName = $project->getProjectName();
         if (!in_array($projectName, $projectfilter)) {
             continue;
         }
         $actions = array();
         $out .= $this->createProjectSection($projectName, $actions, $this->getProject($project));
     }
     $this->getOutput()->addHTML($out);
 }
 /**
  * @return void
  */
 function listVolumes()
 {
     $this->setHeaders();
     $this->getOutput()->addModuleStyles('ext.openstack');
     $this->getOutput()->setPagetitle($this->msg('openstackmanager-volumelist'));
     if ($this->getUser()->isAllowed('listall')) {
         $projects = OpenStackNovaProject::getAllProjects();
     } else {
         $projects = OpenStackNovaProject::getProjectsByName($this->userLDAP->getProjects());
     }
     $this->showProjectFilter($projects);
     $projectfilter = $this->getProjectFilter();
     if (!$projectfilter) {
         $this->getOutput()->addWikiMsg('openstackmanager-setprojectfilter');
         return null;
     }
     $out = '';
     foreach ($projects as $project) {
         $projectName = $project->getProjectName();
         if (!in_array($projectName, $projectfilter)) {
             continue;
         }
         $projectactions = array('projectadmin' => array());
         $regions = '';
         $this->userNova->setProject($projectName);
         foreach ($this->userNova->getRegions('compute') as $region) {
             $regionactions = array('projectadmin' => array($this->createActionLink('openstackmanager-createvolume', array('action' => 'create', 'project' => $projectName, 'region' => $region))));
             $volumes = $this->getVolumes($projectName, $region);
             $regions .= $this->createRegionSection($region, $projectName, $regionactions, $volumes);
         }
         $out .= $this->createProjectSection($projectName, $projectactions, $regions);
     }
     $this->getOutput()->addHTML($out);
 }
 function addKey()
 {
     global $wgOpenStackManagerNovaKeypairStorage;
     $this->setHeaders();
     $this->getOutput()->setPagetitle($this->msg('openstackmanager-addkey'));
     $returnto = $this->getRequest()->getVal('returnto');
     $keyInfo = array();
     if ($wgOpenStackManagerNovaKeypairStorage === 'nova') {
         $projects = $this->userLDAP->getProjects();
         $keyInfo['keyname'] = array('type' => 'text', 'label-message' => 'openstackmanager-novakeyname', 'default' => '', 'name' => 'keyname');
         $project_keys = array();
         foreach ($projects as $project) {
             $project_keys[$project] = $project;
         }
         $keyInfo['project'] = array('type' => 'select', 'options' => $project_keys, 'label-message' => 'openstackmanager-project', 'name' => 'project');
     }
     $keyInfo['key'] = array('type' => 'textarea', 'default' => '', 'label-message' => 'openstackmanager-novapublickey', 'name' => 'key');
     $keyInfo['action'] = array('type' => 'hidden', 'default' => 'add', 'name' => 'action');
     $keyInfo['returnto'] = array('type' => 'hidden', 'default' => $returnto, 'name' => 'returnto');
     $keyForm = new HTMLForm($keyInfo, $this->getContext(), 'openstackmanager-novakey');
     $keyForm->setSubmitID('novakey-form-createkeysubmit');
     $keyForm->setSubmitCallback(array($this, 'tryImportSubmit'));
     $keyForm->show();
 }
 /**
  * @return void
  */
 function listPuppetGroups()
 {
     $this->setHeaders();
     $this->getOutput()->setPagetitle($this->msg('openstackmanager-puppetgrouplist'));
     $this->getOutput()->addModuleStyles('ext.openstack');
     if ($this->getUser()->isAllowed('listall')) {
         $projects = OpenStackNovaProject::getAllProjects();
     } else {
         $projects = OpenStackNovaProject::getProjectsByName($this->userLDAP->getProjects());
     }
     $this->showProjectFilter($projects);
     $projectfilter = $this->getProjectFilter();
     if (!$projectfilter) {
         $this->getOutput()->addWikiMsg('openstackmanager-setprojectfilter');
         return null;
     }
     $out = '';
     foreach ($projects as $project) {
         $projectName = $project->getProjectName();
         if ($projectfilter && !in_array($projectName, $projectfilter)) {
             continue;
         }
         $actions = array('projectadmin' => array());
         $actions['projectadmin'][] = $this->createActionLink('openstackmanager-createpuppetgroup', array('action' => 'create', 'project' => $projectName));
         $out .= $this->createProjectSection($projectName, $actions, $this->getPuppetGroupOutput(OpenStackNovaPuppetGroup::getGroupList($projectName)));
     }
     $action = '';
     $showlinks = $this->userCanExecute($this->getUser());
     if ($showlinks) {
         $action = $this->createActionLink('openstackmanager-createpuppetgroup', array('action' => 'create'));
         $action = Html::rawElement('span', array('id' => 'novaaction'), "[{$action}]");
     }
     $allProjectsMsg = Html::rawElement('span', array('class' => 'mw-customtoggle-allprojects', 'id' => 'novaproject'), $this->msg('openstackmanager-puppetallprojects')->escaped());
     $out .= Html::rawElement('h2', array(), "{$allProjectsMsg} {$action}");
     $groupsOut = $this->getPuppetGroupOutput(OpenStackNovaPuppetGroup::getGroupList(), $showlinks);
     $out .= Html::rawElement('div', array('class' => 'mw-collapsible', 'id' => 'mw-customcollapsible-allprojects'), $groupsOut);
     $this->getOutput()->addHTML($out);
 }
 /**
  * @return void
  */
 function listInstances()
 {
     $this->setHeaders();
     $this->getOutput()->addModuleStyles('ext.openstack');
     $this->getOutput()->setPagetitle(wfMsg('openstackmanager-instancelist'));
     $userProjects = $this->userLDAP->getProjects();
     $out = '';
     $instances = $this->adminNova->getInstances();
     $header = Html::element('th', array(), wfMsg('openstackmanager-instancename'));
     $header .= Html::element('th', array(), wfMsg('openstackmanager-instanceid'));
     $header .= Html::element('th', array(), wfMsg('openstackmanager-instancestate'));
     $header .= Html::element('th', array(), wfMsg('openstackmanager-instancetype'));
     $header .= Html::element('th', array(), wfMsg('openstackmanager-instanceip'));
     $header .= Html::element('th', array(), wfMsg('openstackmanager-instancepublicip'));
     $header .= Html::element('th', array(), wfMsg('openstackmanager-securitygroups'));
     $header .= Html::element('th', array(), wfMsg('openstackmanager-availabilityzone'));
     $header .= Html::element('th', array(), wfMsg('openstackmanager-imageid'));
     $header .= Html::element('th', array(), wfMsg('openstackmanager-launchtime'));
     $header .= Html::element('th', array(), wfMsg('openstackmanager-actions'));
     $projectArr = array();
     /**
      * @var $instance OpenStackNovaInstance
      */
     foreach ($instances as $instance) {
         $project = $instance->getOwner();
         if (!in_array($project, $userProjects)) {
             continue;
         }
         $instanceOut = Html::element('td', array(), $instance->getInstanceName());
         $instanceId = $instance->getInstanceId();
         $instanceId = htmlentities($instanceId);
         $title = Title::newFromText($instanceId, NS_NOVA_RESOURCE);
         $instanceIdLink = Linker::link($title, $instanceId);
         $instanceOut .= Html::rawElement('td', array(), $instanceIdLink);
         $instanceOut .= Html::element('td', array(), $instance->getInstanceState());
         $instanceOut .= Html::element('td', array(), $instance->getInstanceType());
         $privateip = $instance->getInstancePrivateIP();
         $publicip = $instance->getInstancePublicIP();
         $instanceOut .= Html::element('td', array(), $privateip);
         if ($privateip != $publicip) {
             $instanceOut .= Html::element('td', array(), $publicip);
         } else {
             $instanceOut .= Html::element('td', array(), '');
         }
         $groupsOut = '';
         foreach ($instance->getSecurityGroups() as $group) {
             $groupsOut .= Html::element('li', array(), $group);
         }
         $groupsOut = Html::rawElement('ul', array(), $groupsOut);
         $instanceOut .= Html::rawElement('td', array(), $groupsOut);
         $instanceOut .= Html::element('td', array(), $instance->getAvailabilityZone());
         $instanceOut .= Html::element('td', array(), $instance->getImageId());
         $instanceOut .= Html::element('td', array(), $instance->getLaunchTime());
         $actions = '';
         if ($this->userLDAP->inRole('sysadmin', $project)) {
             $msg = wfMsgHtml('openstackmanager-delete');
             $link = Linker::link($this->getTitle(), $msg, array(), array('action' => 'delete', 'project' => $project, 'instanceid' => $instance->getInstanceId()));
             $actions = Html::rawElement('li', array(), $link);
             $msg = wfMsgHtml('openstackmanager-reboot');
             $link = Linker::link($this->getTitle(), $msg, array(), array('action' => 'reboot', 'project' => $project, 'instanceid' => $instance->getInstanceId()));
             $actions .= Html::rawElement('li', array(), $link);
             $msg = wfMsgHtml('openstackmanager-configure');
             $link = Linker::link($this->getTitle(), $msg, array(), array('action' => 'configure', 'project' => $project, 'instanceid' => $instance->getInstanceId()));
             $actions .= Html::rawElement('li', array(), $link);
             $msg = wfMsgHtml('openstackmanager-getconsoleoutput');
             $link = Linker::link($this->getTitle(), $msg, array(), array('action' => 'consoleoutput', 'project' => $project, 'instanceid' => $instance->getInstanceId()));
             $actions .= Html::rawElement('li', array(), $link);
             $actions = Html::rawElement('ul', array(), $actions);
         }
         $instanceOut .= Html::rawElement('td', array(), $actions);
         if (isset($projectArr["{$project}"])) {
             $projectArr["{$project}"] .= Html::rawElement('tr', array(), $instanceOut);
         } else {
             $projectArr["{$project}"] = Html::rawElement('tr', array(), $instanceOut);
         }
     }
     foreach ($userProjects as $project) {
         $action = '';
         if ($this->userLDAP->inRole('sysadmin', $project)) {
             $action = Linker::link($this->getTitle(), wfMsgHtml('openstackmanager-createinstance'), array(), array('action' => 'create', 'project' => $project));
             $action = Html::rawElement('span', array('id' => 'novaaction'), "[{$action}]");
         }
         $projectName = Html::rawElement('span', array('class' => 'mw-customtoggle-' . $project, 'id' => 'novaproject'), $project);
         $out .= Html::rawElement('h2', array(), "{$projectName} {$action}");
         $projectOut = '';
         if (isset($projectArr["{$project}"])) {
             $projectOut .= $header;
             $projectOut .= $projectArr["{$project}"];
             $projectOut = Html::rawElement('table', array('id' => 'novainstancelist', 'class' => 'wikitable sortable'), $projectOut);
         }
         $out .= Html::rawElement('div', array('class' => 'mw-collapsible', 'id' => 'mw-customcollapsible-' . $project), $projectOut);
     }
     $this->getOutput()->addHTML($out);
 }
	/**
	 * @return void
	 */
	function listVolumes() {
		$this->setHeaders();
		$this->getOutput()->setPagetitle( wfMsg( 'openstackmanager-volumelist' ) );

		$userProjects = $this->userLDAP->getProjects();

		$out = '';
		$volumes = $this->adminNova->getVolumes();
		$header = Html::element( 'th', array(), wfMsg( 'openstackmanager-volumename' ) );
		$header .= Html::element( 'th', array(), wfMsg( 'openstackmanager-volumeid' ) );
		$header .= Html::element( 'th', array(), wfMsg( 'openstackmanager-volumedescription' ) );
		$header .= Html::element( 'th', array(), wfMsg( 'openstackmanager-volumestate' ) );
		$header .= Html::element( 'th', array(), wfMsg( 'openstackmanager-volumeattachmentinstance' ) );
		$header .= Html::element( 'th', array(), wfMsg( 'openstackmanager-volumeattachmentdevice' ) );
		$header .= Html::element( 'th', array(), wfMsg( 'openstackmanager-volumeattachmentstatus' ) );
		$header .= Html::element( 'th', array(), wfMsg( 'openstackmanager-volumesize' ) );
		$header .= Html::element( 'th', array(), wfMsg( 'openstackmanager-volumedeleteonvolumedelete' ) );
		$header .= Html::element( 'th', array(), wfMsg( 'openstackmanager-availabilityzone' ) );
		$header .= Html::element( 'th', array(), wfMsg( 'openstackmanager-volumecreationtime' ) );
		$header .= Html::element( 'th', array(), wfMsg( 'openstackmanager-actions' ) );
		$projectArr = array();
		foreach ( $volumes as $volume ) {
			$project = $volume->getOwner();
			if ( ! in_array( $project, $userProjects ) ) {
				continue;
			}
			$volumeOut = Html::element( 'td', array(), $volume->getVolumeName() );
			$volumeId = $volume->getVolumeId();
			$volumeId = htmlentities( $volumeId );
			$title = Title::newFromText( $volumeId, NS_NOVA_RESOURCE );
			$volumeIdLink = Linker::link( $title, $volumeId );
			$volumeOut .= Html::rawElement( 'td', array(), $volumeIdLink );
			$volumeOut .= Html::element( 'td', array(), $volume->getVolumeDescription() );
			$volumeOut .= Html::element( 'td', array(), $volume->getVolumeStatus() );
			$volumeOut .= Html::element( 'td', array(), $volume->getAttachedInstanceId() );
			$volumeOut .= Html::element( 'td', array(), $volume->getAttachedDevice() );
			$volumeOut .= Html::element( 'td', array(), $volume->getAttachmentStatus() );
			$volumeOut .= Html::element( 'td', array(), $volume->getVolumeSize() );
			$volumeOut .= Html::element( 'td', array(), $volume->deleteOnInstanceDeletion() );
			$volumeOut .= Html::element( 'td', array(), $volume->getVolumeAvailabilityZone() );
			$volumeOut .= Html::element( 'td', array(), $volume->getVolumeCreationTime() );
			$msg = wfMsgHtml( 'openstackmanager-delete' );
			$link = Linker::link( $this->getTitle(), $msg, array(),
								  array( 'action' => 'delete',
									   'project' => $project,
									   'volumeid' => $volume->getVolumeId() ) );
			$actions = Html::rawElement( 'li', array(), $link );
			#$msg = wfMsgHtml( 'openstackmanager-rename' );
			#$actions .= Linker::link( $this->getTitle(), $msg, array(),
			#					   array( 'action' => 'rename',
			#							'project' => $project,
			#							'volumeid' => $volume->getVolumeId() ) );
			$msg = wfMsgHtml( 'openstackmanager-attach' );
			$link = Linker::link( $this->getTitle(), $msg, array(),
								   array( 'action' => 'attach',
										'project' => $project,
										'volumeid' => $volume->getVolumeId() ) );
			$actions .= Html::rawElement( 'li', array(), $link );
			$msg = wfMsgHtml( 'openstackmanager-detach' );
			$link = Linker::link( $this->getTitle(), $msg, array(),
								   array( 'action' => 'detach',
										'project' => $project,
										'volumeid' => $volume->getVolumeId() ) );
			$actions .= Html::rawElement( 'li', array(), $link );
			$actions = Html::rawElement( 'ul', array(), $actions );
			$volumeOut .= Html::rawElement( 'td', array(), $actions );
			if ( isset( $projectArr["$project"] ) ) {
				$projectArr["$project"] .= Html::rawElement( 'tr', array(), $volumeOut );
			} else {
				$projectArr["$project"] = Html::rawElement( 'tr', array(), $volumeOut );
			}
		}
		foreach ( $userProjects as $project ) {
			$out .= Html::element( 'h2', array(), $project );
			$out .= Linker::link( $this->getTitle(), wfMsgHtml( 'openstackmanager-createvolume' ), array(),
							   array( 'action' => 'create', 'project' => $project ) );
			if ( isset( $projectArr["$project"] ) ) {
				$projectOut = $header;
				$projectOut .= $projectArr["$project"];
				$out .= Html::rawElement( 'table',
										  array( 'id' => 'novavolumelist', 'class' => 'wikitable sortable collapsible' ), $projectOut );
			}
		}

		$this->getOutput()->addHTML( $out );
	}
 public static function removeUserFromBastionProject($user, &$group)
 {
     global $wgOpenStackManagerRemoveUserFromBastionProjectOnShellDisable;
     global $wgOpenStackManagerRemoveUserFromAllProjectsOnShellDisable;
     global $wgOpenStackManagerBastionProjectName;
     // Check whether after removing the group the user would still
     // have the loginviashell permission.
     foreach ($user->getEffectiveGroups() as $g) {
         // Ignore the group that will be removed.
         if ($g === $group) {
             continue;
         }
         // If the user still has the loginviashell permission, we
         // can immediately return.
         if (User::groupHasPermission($g, 'loginviashell')) {
             return true;
         }
     }
     // At this point we know that the user will not have the
     // loginviashell permission after the group is removed so we
     // can remove him from the bastion projects if the
     // configuration requires that.
     $username = $user->getName();
     if ($wgOpenStackManagerRemoveUserFromAllProjectsOnShellDisable) {
         // Get a users projects
         $userLDAP = new OpenStackNovaUser($username);
         foreach ($userLDAP->getProjects() as $projectName) {
             // Remove the user from the project
             $project = new OpenStackNovaProject($projectName);
             $project->deleteMember($username);
         }
     } elseif ($wgOpenStackManagerRemoveUserFromBastionProjectOnShellDisable) {
         // Remove the user from the bastion project
         $project = new OpenStackNovaProject($wgOpenStackManagerBastionProjectName);
         if (in_array($username, $project->getMembers())) {
             $project->deleteMember($username);
         }
     }
     return true;
 }
Example #9
0
 /**
  * @return void
  */
 function listKeys()
 {
     global $wgOpenStackManagerNovaKeypairStorage;
     $this->setHeaders();
     $this->getOutput()->setPagetitle(wfMsg('openstackmanager-keylist'));
     $this->getOutput()->addModuleStyles('ext.openstack');
     $keyInfo = array();
     if ($wgOpenStackManagerNovaKeypairStorage == 'nova') {
         $projects = $this->userLDAP->getProjects();
         $keyInfo['keyname'] = array('type' => 'text', 'label-message' => 'openstackmanager-novakeyname', 'default' => '', 'section' => 'key', 'name' => 'keyname');
         $project_keys = array();
         foreach ($projects as $project) {
             $project_keys["{$project}"] = $project;
         }
         $keyInfo['project'] = array('type' => 'select', 'options' => $project_keys, 'label-message' => 'openstackmanager-project', 'name' => 'project');
     }
     $keyInfo['key'] = array('type' => 'textarea', 'section' => 'key', 'default' => '', 'label-message' => 'openstackmanager-novapublickey', 'name' => 'key');
     $keyForm = new SpecialNovaKeyForm($keyInfo, 'openstackmanager-novakey');
     $keyForm->setTitle(SpecialPage::getTitleFor('NovaKey'));
     $keyForm->setSubmitID('novakey-form-createkeysubmit');
     $keyForm->setSubmitCallback(array($this, 'tryImportSubmit'));
     $keyForm->show();
     $out = '';
     if ($wgOpenStackManagerNovaKeypairStorage == 'nova') {
         foreach ($projects as $project) {
             $userCredentials = $this->userLDAP->getCredentials();
             $this->userNova = new OpenStackNovaController($userCredentials, $project);
             $keypairs = $this->userNova->getKeypairs();
             if (!$keypairs) {
                 continue;
             }
             $out .= Html::element('h2', array(), $project);
             $projectOut = Html::element('th', array(), wfMsg('openstackmanager-name'));
             $projectOut .= Html::element('th', array(), wfMsg('openstackmanager-fingerprint'));
             foreach ($keypairs as $keypair) {
                 $keyOut = Html::element('td', array('class' => 'Nova_col'), $keypair->getKeyName());
                 $keyOut .= Html::element('td', array(), $keypair->getKeyFingerprint());
                 $projectOut .= Html::rawElement('tr', array(), $keyOut);
             }
             $out .= Html::rawElement('table', array('id' => 'novakeylist', 'class' => 'wikitable sortable collapsible'), $projectOut);
         }
     } elseif ($wgOpenStackManagerNovaKeypairStorage == 'ldap') {
         $keypairs = $this->userLDAP->getKeypairs();
         $keysOut = '';
         $keysOut .= Html::element('th', array(), wfMsg('openstackmanager-keys'));
         $keysOut .= Html::element('th', array(), wfMsg('openstackmanager-actions'));
         foreach ($keypairs as $hash => $key) {
             $keyOut = Html::element('td', array('class' => 'Nova_col'), $key);
             $msg = wfMsgHtml('openstackmanager-delete');
             $link = Linker::link($this->getTitle(), $msg, array(), array('action' => 'delete', 'hash' => $hash));
             $action = Html::rawElement('li', array(), $link);
             $action = Html::rawElement('ul', array(), $action);
             $keyOut .= Html::rawElement('td', array(), $action);
             $keysOut .= Html::rawElement('tr', array(), $keyOut);
         }
         $out .= Html::rawElement('table', array('id' => 'novakeylist', 'class' => 'wikitable'), $keysOut);
     } else {
         $this->getOutput()->addWikiMsg('openstackmanager-invalidkeypair');
     }
     $this->getOutput()->addHTML($out);
 }
	/**
	 * @return bool
	 */
	function listAddresses() {
		$this->setHeaders();
		$this->getOutput()->addModuleStyles( 'ext.openstack' );
		$this->getOutput()->setPagetitle( wfMsg( 'openstackmanager-addresslist' ) );

		$userProjects = $this->userLDAP->getProjects();
		$out = '';

		$header = Html::element( 'th', array(), wfMsg( 'openstackmanager-address' ) );
		$header .= Html::element( 'th', array(), wfMsg( 'openstackmanager-instanceid' ) );
		$header .= Html::element( 'th', array(), wfMsg( 'openstackmanager-instancename' ) );
		$header .= Html::element( 'th', array(), wfMsg( 'openstackmanager-hostnames' ) );
		$header .= Html::element( 'th', array(), wfMsg( 'openstackmanager-actions' ) );
		$addresses = $this->adminNova->getAddresses();
		$projectArr = array();
		foreach ( $addresses as $address ) {
			$ip = $address->getPublicIP();
			$instanceid = $address->getInstanceId();
			$project = $address->getProject();
			$addressOut = Html::element( 'td', array(), $ip );
			if ( $instanceid ) {
				$addressOut .= Html::element( 'td', array(), $instanceid );
				$instance = $this->adminNova->getInstance( $instanceid );
				$instancename = $instance->getInstanceName();
				$addressOut .= Html::element( 'td', array(), $instancename );
			} else {
				$addressOut .= Html::element( 'td', array(), '' );
				$addressOut .= Html::element( 'td', array(), '' );
			}
			$hosts = OpenStackNovaHost::getHostsByIP( $ip );
			if ( $hosts ) {
				$hostsOut = '';
				$msg = wfMsgHtml( 'openstackmanager-removehost-action' );
				foreach ( $hosts as $host ) {
					$domain = $host->getDomain();
					$fqdns = $host->getAssociatedDomains();
					foreach ( $fqdns as $fqdn ) {
						$hostname = explode( '.', $fqdn );
						$hostname = $hostname[0];
						$link = Linker::link( $this->getTitle(), $msg, array(),
								   array( 'action' => 'removehost', 'ip' => $ip, 'project' => $project, 'domain' => $domain->getDomainName(), 'hostname' => $hostname ) );
						$hostOut = htmlentities( $fqdn ) . ' ' . $link;
						$hostsOut .= Html::rawElement( 'li', array(), $hostOut );
					}
				}
				$hostsOut = Html::rawElement( 'ul', array(), $hostsOut );
				$addressOut .= Html::rawElement( 'td', array(), $hostsOut );
			} else {
				$addressOut .= Html::element( 'td', array(), '' );
			}
			$actions = '';
			if ( $instanceid ) {
				$msg = wfMsgHtml( 'openstackmanager-reassociateaddress' );
			} else {
				$msg = wfMsgHtml( 'openstackmanager-releaseaddress' );
				$link = Linker::link( $this->getTitle(), $msg, array(),
						   array( 'action' => 'release', 'ip' => $ip, 'project' => $project ) );
				$actions = Html::rawElement( 'li', array(), $link );
				$msg = wfMsgHtml( 'openstackmanager-associateaddress' );
			}
			$link = Linker::link( $this->getTitle(), $msg, array(),
					   array( 'action' => 'associate', 'ip' => $ip, 'project' => $project ) );
			$actions .= Html::rawElement( 'li', array(), $link );
			if ( $instanceid ) {
				$msg = wfMsgHtml( 'openstackmanager-disassociateaddress' );
				$link = Linker::link( $this->getTitle(), $msg, array(),
						   array( 'action' => 'disassociate', 'ip' => $ip, 'project' => $project ) );
				$actions .= Html::rawElement( 'li', array(), $link );
			}
			$msg = wfMsgHtml( 'openstackmanager-addhost' );
			$link = Linker::link( $this->getTitle(), $msg, array(),
					   array( 'action' => 'addhost', 'ip' => $ip, 'project' => $project ) );
			$actions .= Html::rawElement( 'li', array(), $link );
			$actions = Html::rawElement( 'ul', array(), $actions );
			$addressOut .= Html::rawElement( 'td', array(), $actions );
			if ( isset( $projectArr["$project"] ) ) {
				$projectArr["$project"] .= Html::rawElement( 'tr', array(), $addressOut );
			} else {
				$projectArr["$project"] = Html::rawElement( 'tr', array(), $addressOut );
			}
		}
		foreach ( $userProjects as $project ) {
			$action = Linker::link( $this->getTitle(), wfMsgHtml( 'openstackmanager-allocateaddress' ), array(), array( 'action' => 'allocate', 'project' => $project ) );
			$action = Html::rawElement( 'span', array( 'id' => 'novaaction' ), "[$action]" );
			$projectName = Html::rawElement( 'span', array( 'class' => 'mw-customtoggle-' . $project, 'id' => 'novaproject' ), $project );
			$out .= Html::rawElement( 'h2', array(), "$projectName $action" );
			$projectOut = '';
			if ( isset( $projectArr["$project"] ) ) {
				$projectOut = $header;
				$projectOut .= $projectArr["$project"];
				$projectOut = Html::rawElement( 'table',
							  array( 'id' => 'novainstancelist', 'class' => 'wikitable sortable collapsible' ), $projectOut );
			}
			$out .= Html::rawElement( 'div', array( 'class' => 'mw-collapsible', 'id' => 'mw-customcollapsible-' . $project ), $projectOut );
		}
		$this->getOutput()->addHTML( $out );

		return true;
	}
 /**
  * @return bool
  */
 function listSecurityGroups()
 {
     $this->setHeaders();
     $this->getOutput()->addModuleStyles('ext.openstack');
     $this->getOutput()->setPagetitle(wfMsg('openstackmanager-securitygrouplist'));
     $userProjects = $this->userLDAP->getProjects();
     $out = '';
     $groupheader = Html::element('th', array(), wfMsg('openstackmanager-securitygroupname'));
     $groupheader .= Html::element('th', array(), wfMsg('openstackmanager-securitygroupdescription'));
     $groupheader .= Html::element('th', array(), wfMsg('openstackmanager-securitygrouprule'));
     $groupheader .= Html::element('th', array(), wfMsg('openstackmanager-actions'));
     $ruleheader = Html::element('th', array(), wfMsg('openstackmanager-securitygrouprule-fromport'));
     $ruleheader .= Html::element('th', array(), wfMsg('openstackmanager-securitygrouprule-toport'));
     $ruleheader .= Html::element('th', array(), wfMsg('openstackmanager-securitygrouprule-protocol'));
     $ruleheader .= Html::element('th', array(), wfMsg('openstackmanager-securitygrouprule-ipranges'));
     $ruleheader .= Html::element('th', array(), wfMsg('openstackmanager-securitygrouprule-groups'));
     $ruleheader .= Html::element('th', array(), wfMsg('openstackmanager-actions'));
     $projectArr = array();
     $securityGroups = $this->adminNova->getSecurityGroups();
     foreach ($securityGroups as $group) {
         $project = $group->getOwner();
         if (!in_array($project, $userProjects)) {
             continue;
         }
         $groupname = $group->getGroupName();
         $groupOut = Html::element('td', array(), $groupname);
         $groupOut .= Html::element('td', array(), $group->getGroupDescription());
         # Add rules
         $rules = $group->getRules();
         if ($rules) {
             $rulesOut = $ruleheader;
             foreach ($rules as $rule) {
                 $fromport = $rule->getFromPort();
                 $toport = $rule->getToPort();
                 $ipprotocol = $rule->getIPProtocol();
                 $ruleOut = Html::element('td', array(), $fromport);
                 $ruleOut .= Html::element('td', array(), $toport);
                 $ruleOut .= Html::element('td', array(), $ipprotocol);
                 $ranges = $rule->getIPRanges();
                 if ($ranges) {
                     $rangesOut = '';
                     foreach ($ranges as $range) {
                         $rangesOut .= Html::element('li', array(), $range);
                     }
                     $rangesOut = Html::rawElement('ul', array(), $rangesOut);
                     $ruleOut .= Html::rawElement('td', array(), $rangesOut);
                 } else {
                     $ruleOut .= Html::rawElement('td', array(), '');
                 }
                 $sourcegroups = $rule->getGroups();
                 $groupinfo = array();
                 if ($sourcegroups) {
                     $sourcegroupsOut = '';
                     foreach ($sourcegroups as $sourcegroup) {
                         $groupinfo[] = $sourcegroup['groupname'] . ':' . $sourcegroup['project'];
                         $sourcegroupinfo = $sourcegroup['groupname'] . ' (' . $sourcegroup['project'] . ')';
                         $sourcegroupsOut .= Html::element('li', array(), $sourcegroupinfo);
                     }
                     $sourcegroupsOut = Html::rawElement('ul', array(), $sourcegroupsOut);
                     $ruleOut .= Html::rawElement('td', array(), $sourcegroupsOut);
                 } else {
                     $ruleOut .= Html::rawElement('td', array(), '');
                 }
                 $actions = '';
                 if ($this->userLDAP->inRole('netadmin', $project)) {
                     $msg = wfMsgHtml('openstackmanager-removerule-action');
                     $args = array('action' => 'removerule', 'project' => $project, 'groupname' => $groupname, 'fromport' => $fromport, 'toport' => $toport, 'protocol' => $ipprotocol, 'ranges' => implode(',', $ranges), 'groups' => implode(',', $groupinfo));
                     $link = Linker::link($this->getTitle(), $msg, array(), $args);
                     $actions = Html::rawElement('li', array(), $link);
                     $actions = Html::rawElement('ul', array(), $actions);
                 }
                 $ruleOut .= Html::rawElement('td', array(), $actions);
                 $rulesOut .= Html::rawElement('tr', array(), $ruleOut);
             }
             $rulesOut = Html::rawElement('table', array('id' => 'novasecuritygrouplist', 'class' => 'wikitable sortable collapsible'), $rulesOut);
             $groupOut .= Html::rawElement('td', array(), $rulesOut);
         } else {
             $groupOut .= Html::rawElement('td', array(), '');
         }
         $actions = '';
         if ($this->userLDAP->inRole('netadmin', $project)) {
             $msg = wfMsgHtml('openstackmanager-delete');
             $link = Linker::link($this->getTitle(), $msg, array(), array('action' => 'delete', 'project' => $project, 'groupname' => $group->getGroupName()));
             $actions = Html::rawElement('li', array(), $link);
             #$msg = wfMsgHtml( 'openstackmanager-configure' );
             #$link = Linker::link( $this->getTitle(), $msg, array(),
             #					   array( 'action' => 'configure',
             #							'project' => $project,
             #							'groupname' => $group->getGroupName() ) );
             #$actions .= Html::rawElement( 'li', array(), $link );
             $msg = wfMsgHtml('openstackmanager-addrule-action');
             $link = Linker::link($this->getTitle(), $msg, array(), array('action' => 'addrule', 'project' => $project, 'groupname' => $group->getGroupName()));
             $actions .= Html::rawElement('li', array(), $link);
             $actions = Html::rawElement('ul', array(), $actions);
         }
         $groupOut .= Html::rawElement('td', array(), $actions);
         if (isset($projectArr["{$project}"])) {
             $projectArr["{$project}"] .= Html::rawElement('tr', array(), $groupOut);
         } else {
             $projectArr["{$project}"] = Html::rawElement('tr', array(), $groupOut);
         }
     }
     foreach ($userProjects as $project) {
         $action = '';
         if ($this->userLDAP->inRole('netadmin', $project)) {
             $action = Linker::link($this->getTitle(), wfMsgHtml('openstackmanager-createnewsecuritygroup'), array(), array('action' => 'create', 'project' => $project));
             $action = Html::rawElement('span', array('id' => 'novaaction'), "[{$action}]");
         }
         $projectName = Html::rawElement('span', array('class' => 'mw-customtoggle-' . $project, 'id' => 'novaproject'), $project);
         $out .= Html::rawElement('h2', array(), "{$projectName} {$action}");
         if (isset($projectArr["{$project}"])) {
             $projectOut = $groupheader;
             $projectOut .= $projectArr["{$project}"];
             $projectOut = Html::rawElement('table', array('id' => 'novainstancelist', 'class' => 'wikitable sortable'), $projectOut);
         }
         $out .= Html::rawElement('div', array('class' => 'mw-collapsible', 'id' => 'mw-customcollapsible-' . $project), $projectOut);
     }
     $this->getOutput()->addHTML($out);
     return true;
 }