/**
	 * @return void
	 */
	function listGlobalRoles() {
		$this->setHeaders();
		$this->getOutput()->setPagetitle( wfMsg( 'openstackmanager-rolelist' ) );

		$out = '';

		$rolesOut = Html::element( 'th', array(), wfMsg( 'openstackmanager-rolename' ) );
		$rolesOut .= Html::element( 'th', array(),  wfMsg( 'openstackmanager-members' ) );
		$rolesOut .= Html::element( 'th', array(), wfMsg( 'openstackmanager-actions' ) );
		$roles = OpenStackNovaRole::getAllGlobalRoles();
		if ( ! $roles ) {
			$rolesOut = '';
		}
		foreach ( $roles as $role ) {
			$roleName = $role->getRoleName();
			$roleOut = Html::element( 'td', array(), $roleName );
			$roleMembers = $role->getMembers();
			$memberOut = '';
			foreach ( $roleMembers as $roleMember ) {
				$memberOut .= Html::element( 'li', array(), $roleMember );
			}
			if ( $memberOut ) {
				$memberOut = Html::rawElement( 'ul', array(), $memberOut );
			}
			$roleOut .= Html::rawElement( 'td', array(), $memberOut );
			$link = Linker::link( $this->getTitle(), wfMsgHtml( 'openstackmanager-addrolemember' ), array(), array( 'action' => 'addmember', 'rolename' => $roleName, 'returnto' => 'Special:NovaRole' ) );
			$actions = Html::rawElement( 'li', array(), $link );
			$link = Linker::link( $this->getTitle(), wfMsgHtml( 'openstackmanager-removerolemember' ), array(), array( 'action' => 'deletemember', 'rolename' => $roleName, 'returnto' => 'Special:NovaRole' ) );
			$actions .= Html::rawElement( 'li', array(), $link );
			$actions = Html::rawElement( 'ul', array(), $actions );
			$roleOut .= Html::rawElement( 'td', array(), $actions );
			$rolesOut .= Html::rawElement( 'tr', array(), $roleOut );
		}
		if ( $rolesOut ) {
			$out .= Html::rawElement( 'table', array( 'class' => 'wikitable sortable collapsible' ), $rolesOut );
		}

		$this->getOutput()->addHTML( $out );
	}