jenkins-bot has submitted this change and it was merged.

Change subject: Add a gui for creation/deletion of labs proxies.
......................................................................


Add a gui for creation/deletion of labs proxies.

This communicates with the 'Invisible Unicorn' API in front of
yuviproxy.

This patch introduces two new config settings, defining the
region and IP, respectively, of the proxy gateway.

$wgOpenStackManagerProxyServiceRegion = '';     69
$wgOpenStackManagerProxyGateway = '';   70

To make this code active, an endpoint for IU needs to be
configured in keystone with service name 'proxy'.

Change-Id: I9844258ef4fcf1045e02202fd3fe67d14a6ffad5
---
M OpenStackManager.i18n.php
M OpenStackManager.php
M nova/OpenStackNovaController.php
A nova/OpenStackNovaProxy.php
A special/SpecialNovaProxy.php
5 files changed, 547 insertions(+), 0 deletions(-)

Approvals:
  Andrew Bogott: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/OpenStackManager.i18n.php b/OpenStackManager.i18n.php
index 88a7273..aff25a5 100644
--- a/OpenStackManager.i18n.php
+++ b/OpenStackManager.i18n.php
@@ -40,6 +40,7 @@
        'novarole' => 'Manage global roles',
        'novavolume' => 'Manage storage volumes',
        'novasudoer' => 'Manage sudo policies',
+       'novaproxy' => 'Manage instance proxies',
        'novapuppetgroup' => 'Manage Puppet groups',
 
        'openstackmanager-novadomain' => 'Nova domain',
@@ -385,6 +386,21 @@
        'openstackmanager-modifiedsudoer' => 'Successfully modified sudo 
policy.',
        'openstackmanager-nonexistantsudoer' => 'The requested sudo policy does 
not exist.',
 
+       'openstackmanager-proxylist' => 'Instance proxy list',
+       'openstackmanager-createproxy' => 'Create proxy',
+       'openstackmanager-deleteproxy' => 'Delete proxy',
+       'openstackmanager-deleteproxysuccess' => 'Deleted proxy at $1',
+       'openstackmanager-deleteproxyfailed' => 'Failed to delete proxy at $1',
+       'openstackmanager-deleteproxy-confirm' => 'Are you sure you would like 
to delete the proxy at $1?',
+       'openstackmanager-proxyname' => 'DNS hostname',
+       'openstackmanager-proxybackend' => 'Instance',
+       'openstackmanager-proxyport' => 'Instance port',
+       'openstackmanager-novaproxy-frontend' => 'New proxy frontend',
+       'openstackmanager-novaproxy-backend' => 'New proxy backend',
+       'openstackmanager-createproxyfailed' => 'Failed to create new proxy 
$1.',
+       'openstackmanager-createdproxy' => 'Successfully created new proxy $1 
for backend $2.',
+       'openstackmanager-backproxylist' => 'Back to proxy list',
+
        'openstackmanager-novapuppetgroup' => 'Nova Puppet group',
        'openstackmanager-puppetgrouplist' => 'Puppet group list',
        'openstackmanager-puppetallprojects' => 'All projects',
@@ -504,6 +520,7 @@
        'novarole' => '{{doc-special|NovaRole}}',
        'novavolume' => '{{doc-special|NovaVolume}}',
        'novasudoer' => '{{doc-special|NovaSudoer}}',
+       'novaproxy' => '{{doc-special|NovaSudoer}}',
        'novapuppetgroup' => '{{doc-special|NovaPuppetGroup}}',
        'openstackmanager-novadomain' => 'Used as title for the form in 
Special:NovaDomain.',
        'openstackmanager-novainstance' => 'An instance is a virtual machine. 
In this particular case, a clone of an image for a virtual machine. 
[http://docs.openstack.org/diablo/openstack-compute/starter/content/Introduction-d1e2084.html
 More on OpenStack].',
@@ -1364,6 +1381,22 @@
 See also:
 * {{msg-mw|Openstackmanager-modifiedsudoer}}
 * {{msg-mw|Openstackmanager-modifysudoerfailed}}',
+
+       'openstackmanager-proxylist' => 'Page title in special:novaproxy.  In 
this case proxy is a web proxy that displays a \'backend\' url in 
substitution.',
+       'openstackmanager-createproxy' => 'Page title and link to create a new 
labs instance proxy',
+       'openstackmanager-deleteproxy' => 'Page title and link to delete an 
existing labs instance proxy',
+       'openstackmanager-deleteproxysuccess' => 'Confirmation of proxy 
deletion; $1 is proxy hostname.',
+       'openstackmanager-deleteproxyfailed' => 'Proxy deletion failure 
message; #1 is proxy hostname.',
+       'openstackmanager-deleteproxy-confirm' => 'Confirmation about deletion 
of a labs instance proxy; $1 is proxy hostname.',
+       'openstackmanager-proxyname' => 'Label for a text-field that contains 
the new hostname of a proxy',
+       'openstackmanager-proxybackend' => 'Label for a multiselect that 
selects from a list of labs instances; this is the instance the new proxy 
points to.',
+       'openstackmanager-proxyport' => 'Label for a text field containing the 
port directed to by the proxy.',
+       'openstackmanager-novaproxy-frontend' => 'Label for a section of the 
create proxy form.  This section describes the part of the proxy accessed by 
the public',
+       'openstackmanager-novaproxy-backend' => 'Label for  a section of the 
create proxy form.  Describes the backend that the new proxy will point to.',
+       'openstackmanager-createproxyfailed' => 'Message for failed creation of 
new proxy; $1 is the hostname of the failed new proxy.',
+       'openstackmanager-createdproxy' => 'Confirmation of creation of a new 
proxy.  $1 is frontend hostname, $2 is backend description.',
+       'openstackmanager-backproxylist' => 'Link back to the 
special::novaproxy page.',
+
        'openstackmanager-novapuppetgroup' => 'Used as title for the form in 
Special:NovaPuppetGroup.',
        'openstackmanager-puppetgrouplist' => 'Used as page title in 
Special:NovaPuppetGroup.',
        'openstackmanager-puppetallprojects' => 'Used as 
<code><nowiki><h2></nowiki></code> heading in [[Special:NovaPuppetGroup]].
diff --git a/OpenStackManager.php b/OpenStackManager.php
index 6d67f7d..58930d1 100644
--- a/OpenStackManager.php
+++ b/OpenStackManager.php
@@ -65,6 +65,10 @@
 // %u is username, %p is $wgOpenStackManagerServiceGroupPrefix.
 $wgOpenStackManagerServiceGroupHomedirPattern = '/home/%p%u/';
 
+// For the moment the instance proxy only lives in one place.
+$wgOpenStackManagerProxyServiceRegion = '';
+$wgOpenStackManagerProxyGateway = '';
+
 $wgOpenStackManagerIdRanges = array(
        'service' => array(
                'gid' => array( 'min' => 40000, 'max' => 49999 ),
@@ -152,6 +156,7 @@
 $wgAutoloadClasses['OpenStackNovaServiceGroup'] = $dir . 
'nova/OpenStackNovaServiceGroup.php';
 $wgAutoloadClasses['OpenStackNovaVolume'] = $dir . 
'nova/OpenStackNovaVolume.php';
 $wgAutoloadClasses['OpenStackNovaSudoer'] = $dir . 
'nova/OpenStackNovaSudoer.php';
+$wgAutoloadClasses['OpenStackNovaProxy'] = $dir . 
'nova/OpenStackNovaProxy.php';
 $wgAutoloadClasses['OpenStackNovaArticle'] = $dir . 
'nova/OpenStackNovaArticle.php';
 $wgAutoloadClasses['OpenStackNovaHostJob'] = $dir . 
'nova/OpenStackNovaHostJob.php';
 $wgAutoloadClasses['OpenStackNovaPuppetGroup'] = $dir . 
'nova/OpenStackNovaPuppetGroup.php';
@@ -169,6 +174,7 @@
 $wgAutoloadClasses['SpecialNovaServiceGroup'] = $dir . 
'special/SpecialNovaServiceGroup.php';
 $wgAutoloadClasses['SpecialNovaVolume'] = $dir . 
'special/SpecialNovaVolume.php';
 $wgAutoloadClasses['SpecialNovaSudoer'] = $dir . 
'special/SpecialNovaSudoer.php';
+$wgAutoloadClasses['SpecialNovaProxy'] = $dir . 'special/SpecialNovaProxy.php';
 $wgAutoloadClasses['SpecialNovaPuppetGroup'] = $dir . 
'special/SpecialNovaPuppetGroup.php';
 $wgAutoloadClasses['SpecialNova'] = $dir . 'special/SpecialNova.php';
 $wgAutoloadClasses['ApiNovaInstance'] = $dir . 'api/ApiNovaInstance.php';
@@ -199,6 +205,8 @@
 $wgSpecialPageGroups['NovaVolume'] = 'nova';
 $wgSpecialPages['NovaSudoer'] = 'SpecialNovaSudoer';
 $wgSpecialPageGroups['NovaSudoer'] = 'nova';
+$wgSpecialPages['NovaProxy'] = 'SpecialNovaProxy';
+$wgSpecialPageGroups['NovaProxy'] = 'nova';
 $wgJobClasses['addDNSHostToLDAP'] = 'OpenStackNovaHostJob';
 $wgSpecialPageGroups['NovaPuppetGroup'] = 'nova';
 $wgSpecialPages['NovaPuppetGroup'] = 'SpecialNovaPuppetGroup';
diff --git a/nova/OpenStackNovaController.php b/nova/OpenStackNovaController.php
index 830d418..3e6d606 100644
--- a/nova/OpenStackNovaController.php
+++ b/nova/OpenStackNovaController.php
@@ -155,6 +155,83 @@
                return null;
        }
 
+       function createProxy( $fqdn, $backendHost, $backendPort ) {
+               $data = array( 'domain' => $fqdn, 'backends' => array ( 
$backendHost . ':' . $backendPort ) );
+               $ret = $this->restCall( 'proxy', '/mapping', 'PUT', $data );
+
+               if ( $ret['code'] !== 200 ) {
+                       return null;
+               }
+
+               $proxyObj = new OpenStackNovaProxy( $this->project, $fqdn, 
$backendHost, $backendPort );
+               return $proxyObj;
+       }
+
+       function deleteProxy( $fqdn ) {
+               $ret = $this->restCall( 'proxy', '/mapping/' . $fqdn, 'DELETE' 
);
+
+               if ( $ret['code'] !== 200 ) {
+                       return false;
+               }
+
+               return true;
+       }
+
+       /**
+        * @return array
+        */
+       function getProxiesForProject() {
+               global $wgAuth;
+
+               $proxyarr = array();
+               $ret = $this->restCall( 'proxy', '/mapping', 'GET' );
+               $proxies = self::_get_property( $ret['body'], 'routes' );
+               if ( !$proxies ) {
+                       return $proxyarr;
+               }
+               foreach ( $proxies as $proxy ) {
+                       $domain = self::_get_property( $proxy, 'domain' );
+                       $backends = self::_get_property( $proxy, 'backends' );
+
+                       if ( (count( $backends ) ) > 1 ) {
+                               $wgAuth->printDebug( "Warning!  proxy $domain 
has multiple backends but we only support one backend per proxy.", NONSENSITIVE 
);
+                       }
+                       $backend = $backends[0];
+                       $backendarray = explode(  ':', $backends[0] );
+
+                       if ( strpos( $backend, "http" ) === 0 ) {
+                               if ( ( count( $backendarray ) < 2 ) or ( count( 
$backendarray ) > 3 ) ) {
+                                       $wgAuth->printDebug( "Unable to parse 
backend $backend, discarding.", NONSENSITIVE );
+                               } elseif ( count( $backendarray ) == 2 ) {
+                                       $backendHost = $backend;
+                                       $backendPort = null;
+                               } else {
+                                       $backendHost = $backendarray[0] . ":" . 
$backendarray[1];
+                                       $backendPort = $backendarray[2];
+                               }
+                       } else {
+                               if ( ( count( $backendarray ) < 1 ) or ( count( 
$backendarray ) > 2 ) ) {
+                                       $wgAuth->printDebug( "Unable to parse 
backend $backend, discarding.", NONSENSITIVE );
+                               } elseif ( count( $backendarray ) == 1 ) {
+                                       $backendHost = $backend;
+                                       $backendPort = null;
+                               } else {
+                                       $backendHost = $backendarray[0];
+                                       $backendPort = $backendarray[1];
+                               }
+                       }
+
+                       if ( $backendPort ) {
+                               $proxyObj = new OpenStackNovaProxy( 
$this->project, $domain, $backendHost, $backendPort );
+                       } else {
+                               $proxyObj = new OpenStackNovaProxy( 
$this->project, $domain, $backendHost );
+                       }
+
+                       $proxyarr[] = $proxyObj;
+               }
+               return $proxyarr;
+       }
+
        /**
         * @return array
         */
diff --git a/nova/OpenStackNovaProxy.php b/nova/OpenStackNovaProxy.php
new file mode 100644
index 0000000..4f9bc58
--- /dev/null
+++ b/nova/OpenStackNovaProxy.php
@@ -0,0 +1,45 @@
+<?php
+
+/**
+ * class for nova instance proxies
+ *
+ * @file
+ * @ingroup Extensions
+ */
+
+class OpenStackNovaProxy {
+
+       var $proxyFQDN;
+       var $backendName;
+       var $backendPort;
+
+       /**
+        * @param $sudoername
+        * @param $projectName
+        */
+       function __construct( $projectName, $proxyFQDN, $backendName = "", 
$backendPort = '80' ) {
+               $this->projectName = $projectName;
+               $this->proxyFQDN = $proxyFQDN;
+               $this->backendName = $backendName;
+               $this->backendPort = $backendPort;
+       }
+
+       /**
+        * Return the proxy hostname
+        *
+        * @return string
+        */
+       function getProxyFQDN() {
+               return $this->proxyFQDN;
+       }
+
+       /**
+        * Return the proxy hostname
+        *
+        * @return string
+        */
+       function getBackend() {
+               $backend = $this->backendName . ":" . $this->backendPort;
+               return $backend;
+       }
+}
diff --git a/special/SpecialNovaProxy.php b/special/SpecialNovaProxy.php
new file mode 100644
index 0000000..9016368
--- /dev/null
+++ b/special/SpecialNovaProxy.php
@@ -0,0 +1,384 @@
+<?php
+
+/**
+ * Special page for managing labs instance proxies.
+ *
+ * @file
+ * @ingroup Extensions
+ */
+
+class SpecialNovaProxy extends SpecialNova {
+       var $userLDAP;
+       var $userNova;
+
+       function __construct() {
+               parent::__construct( 'NovaProxy' );
+       }
+
+       function execute( $par ) {
+               global $wgOpenStackManagerProxyServiceRegion;
+               if ( !$this->getUser()->isLoggedIn() ) {
+                       $this->notLoggedIn();
+                       return;
+               }
+               $this->userLDAP = new OpenStackNovaUser();
+               if ( !$this->userLDAP->exists() ) {
+                       $this->noCredentials();
+                       return;
+               }
+               $this->checkTwoFactor();
+
+               $action = $this->getRequest()->getVal( 'action' );
+               $this->projectName = $this->getRequest()->getText( 'project' );
+               $this->project = OpenStackNovaProject::getProjectByName( 
$this->projectName );
+
+               $region = $wgOpenStackManagerProxyServiceRegion;
+               $this->userNova = OpenStackNovaController::newFromUser( 
$this->userLDAP );
+               $this->userNova->setProject( $this->projectName );
+               $this->userNova->setRegion( $region );
+
+               if ( $action === "create" ) {
+                       if ( ! $this->userLDAP->inProject( $this->projectName ) 
) {
+                               $this->notInProject( $this->projectName );
+                               return;
+                       }
+                       $this->createProxy();
+               } elseif ( $action === "delete" ) {
+                       if ( ! $this->userLDAP->inProject( $this->projectName ) 
) {
+                               $this->notInProject( $this->project );
+                               return;
+                       }
+                       $this->deleteProxy();
+               } elseif ( $action === "modify" ) {
+                       if ( ! $this->userLDAP->inProject( $this->projectName ) 
) {
+                               $this->notInProject( $this->project );
+                               return;
+                       }
+                       $this->modifyProxy();
+               } else {
+                       $this->listProxies();
+               }
+       }
+
+       /**
+        * @return bool
+        */
+       function createProxy() {
+               $this->setHeaders();
+               $this->getOutput()->setPagetitle( $this->msg( 
'openstackmanager-createproxy' ) );
+               if ( ! $this->userLDAP->inRole( 'projectadmin', 
$this->projectName ) ) {
+                       $this->notInRole( 'projectadmin', $this->projectName );
+                       return false;
+               }
+               $instance_keys = array();
+               $regions = $this->userNova->getRegions( 'compute' );
+               foreach ( $regions as $region ) {
+                       $this->userNova->setRegion( $region );
+                       $instances = $this->userNova->getInstances();
+                       foreach ( $instances as $instance ) {
+                               if ( $instance->getProject() === 
$this->projectName ) {
+                                       $instancename = 
$instance->getHost()->getFullyQualifiedDisplayName();
+                                       $instance_keys[$instancename] = 
$instancename;
+                               }
+                       }
+               }
+               ksort( $instance_keys );
+
+               $domains = OpenStackNovaDomain::getAllDomains( 'public' );
+               $domain_keys = array();
+               foreach ( $domains as $domain ) {
+                       $domainname = $domain->getDomainName();
+                       $fqdn = $domain->getFullyQualifiedDomainName();
+                       $domain_keys[$fqdn] = $domainname;
+               }
+               ksort( $domain_keys );
+
+               $proxyInfo = array();
+               $proxyInfo['proxyname'] = array(
+                       'type' => 'text',
+                       'label-message' => 'openstackmanager-proxyname',
+                       'default' => '',
+                       'section' => 'frontend',
+                       'name' => 'proxyname',
+               );
+               $proxyInfo['domain'] = array(
+                       'type' => 'select',
+                       'options' => $domain_keys,
+                       'label-message' => 'openstackmanager-dnsdomain',
+                       'section' => 'frontend',
+                       'name' => 'domain',
+               );
+               $proxyInfo['backendhost'] = array(
+                       'type' => 'select',
+                       'label-message' => 'openstackmanager-proxybackend',
+                       'options' => $instance_keys,
+                       'section' => 'backend',
+                       'name' => 'backendhost',
+               );
+               $proxyInfo['backendport'] = array(
+                       'type' => 'text',
+                       'label-message' => 'openstackmanager-proxyport',
+                       'default' => '80',
+                       'section' => 'backend',
+                       'name' => 'backendport',
+               );
+               $proxyInfo['action'] = array(
+                       'type' => 'hidden',
+                       'default' => 'create',
+                       'name' => 'action',
+               );
+               $proxyInfo['project'] = array(
+                       'type' => 'hidden',
+                       'default' => $this->projectName,
+                       'name' => 'project',
+               );
+
+               $proxyForm = new HTMLForm( $proxyInfo, 
'openstackmanager-novaproxy' );
+               $proxyForm->setTitle( SpecialPage::getTitleFor( 'NovaProxy' ) );
+               $proxyForm->setSubmitID( 'novaproxy-form-createproxysubmit' );
+               $proxyForm->setSubmitCallback( array( $this, 'tryCreateSubmit' 
) );
+               $proxyForm->show();
+
+               return true;
+       }
+
+       /**
+        * @return bool
+        */
+       function deleteProxy() {
+               $this->setHeaders();
+               $this->getOutput()->setPagetitle( $this->msg( 
'openstackmanager-deleteproxy' ) );
+               if ( ! $this->userLDAP->inRole( 'projectadmin', 
$this->projectName ) ) {
+                       $this->notInRole( 'projectadmin', $this->projectName );
+                       return false;
+               }
+               $proxyfqdn = $this->getRequest()->getText( 'proxyfqdn' );
+               if ( ! $this->getRequest()->wasPosted() ) {
+                       $this->getOutput()->addWikiMsg( 
'openstackmanager-deleteproxy-confirm', $proxyfqdn );
+               }
+               $proxyInfo = array();
+               $proxyInfo['proxyfqdn'] = array(
+                       'type' => 'hidden',
+                       'default' => $proxyfqdn,
+                       'name' => 'proxyfqdn',
+               );
+               $proxyInfo['project'] = array(
+                       'type' => 'hidden',
+                       'default' => $this->projectName,
+                       'name' => 'project',
+               );
+               $proxyInfo['action'] = array(
+                       'type' => 'hidden',
+                       'default' => 'delete',
+                       'name' => 'action',
+               );
+               $proxyForm = new HTMLForm( $proxyInfo, 
'openstackmanager-novaproxy' );
+               $proxyForm->setTitle( SpecialPage::getTitleFor( 'NovaProxy' ) );
+               $proxyForm->setSubmitID( 'novaproxy-form-deleteproxysubmit' );
+               $proxyForm->setSubmitCallback( array( $this, 'tryDeleteSubmit' 
) );
+               $proxyForm->show();
+
+               return true;
+       }
+
+       /**
+        * @return void
+        */
+       function listProxies() {
+               $this->setHeaders();
+               $this->getOutput()->addModuleStyles( 'ext.openstack' );
+               $this->getOutput()->setPagetitle( $this->msg( 
'openstackmanager-proxylist' ) );
+
+               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;
+                       }
+                       $actions = array( 'projectadmin' => array() );
+                       $actions['projectadmin'][] = $this->createActionLink( 
'openstackmanager-createproxy', array( 'action' => 'create', 'project' => 
$projectName ) );
+                       $out .= $this->createProjectSection( $projectName, 
$actions, $this->getProxies( $projectName ) );
+               }
+
+               $this->getOutput()->addHTML( $out );
+       }
+
+       function getProxies( $projectName ) {
+               $this->userNova->setProject( $projectName );
+               $proxies = $this->userNova->getProxiesForProject();
+               $proxyRows = array();
+               foreach ( $proxies as $proxy ) {
+                       $fqdn = $proxy->getProxyFQDN();
+                       if ( $fqdn ) {
+                               $proxyRow = array();
+                               $this->pushResourceColumn( $proxyRow, $fqdn );
+                               $this->pushResourceColumn( $proxyRow, 
$proxy->getBackend() );
+
+                   $actions = array();
+                   $actions[] = $this->createActionLink( 
'openstackmanager-delete',
+                                                                       array( 
'action' => 'delete', 'proxyfqdn' => $fqdn, 'project' => $projectName ) );
+                   $this->pushRawResourceColumn( $proxyRow, 
$this->createResourceList( $actions ) );
+
+
+                               $proxyRows[] = $proxyRow;
+                       }
+               }
+               if ( $proxyRows ) {
+                       $headers = array( 'openstackmanager-proxyname', 
'openstackmanager-proxybackend', 'openstackmanager-actions' );
+                       $out = $this->createResourceTable( $headers, $proxyRows 
);
+               } else {
+                       $out = '';
+               }
+
+               return $out;
+       }
+
+       function addHost($hostName, $domain, $ip) {
+               $domain = OpenStackNovaDomain::getDomainByName( $domain );
+               $hostbyip = OpenStackNovaHost::getHostByPublicIP( $ip );
+               $fqdn = $hostName . '.' . 
$domain->getFullyQualifiedDomainName();
+
+               if ( $hostbyip ) {
+                       # We need to add an associateddomain, if the 
associateddomain doesn't already exist
+                       $success = $hostbyip->addAssociatedDomain( $fqdn );
+                       if ( ! $success ) {
+                               return false;
+                       }
+               } else {
+                       # This is a new host entry
+                       $host = OpenStackNovaHost::addPublicHost( $hostName, 
$ip, $domain );
+                       if ( ! $host ) {
+                               return false;
+                       }
+               }
+
+               return true;
+       }
+
+       function deleteHost($fqdn, $ip) {
+               $host = OpenStackNovaHost::getHostByPublicIP( $ip );
+        if ( $host ) {
+                       $records = $host->getAssociatedDomains();
+                               if ( count( $records ) > 1 ) {
+                               # We need to keep the host, but remove the fqdn
+                               $success = $host->deleteAssociatedDomain( $fqdn 
);
+                               if ( $success ) {
+                                       return true;
+                               } else {
+                                       return false;
+                               }
+                       } else {
+                               # We need to remove the host entry
+                               $success = $host->deleteHost();
+                               if ( $success ) {
+                                       return true;
+                               } else {
+                                       return false;
+                               }
+                       }
+               } else {
+                       # No such host!
+                       return false;
+               }
+       }
+
+       /**
+        * @param  $formData
+        * @param string $entryPoint
+        * @return bool
+        */
+       function tryDeleteSubmit( $formData, $entryPoint = 'internal' ) {
+               global $wgOpenStackManagerProxyGateway;
+
+               $outputPage = $this->getOutput();
+               $fqdn = $formData['proxyfqdn'];
+               $goback = '<br />';
+               $goback .= Linker::link(
+                       $this->getTitle(),
+                       $this->msg( 'openstackmanager-backproxylist' 
)->escaped()
+               );
+
+               $success =  $this->userNova->deleteProxy( $fqdn );
+               if ( $success ) {
+                       $success = $this->deleteHost( $fqdn, 
$wgOpenStackManagerProxyGateway );
+                       if ( ! $success ) {
+                               $outputPage->addWikiMsg( 
'openstackmanager-removehostfailed', $fqdn );
+                       }
+               } else {
+                       $outputPage->addWikiMsg( 
'openstackmanager-deleteproxyfailed', $fqdn );
+                       $outputPage->addHTML( $goback );
+                       return true;
+               }
+
+               $outputPage->addWikiMsg( 'openstackmanager-deleteproxysuccess', 
$fqdn );
+               $outputPage->addHTML( $goback );
+
+               return true;
+       }
+
+
+       /**
+        * @param  $formData
+        * @param string $entryPoint
+        * @return bool
+        */
+       function tryCreateSubmit( $formData, $entryPoint = 'internal' ) {
+               global $wgOpenStackManagerProxyGateway;
+               $gatewayIP = $wgOpenStackManagerProxyGateway;
+               $goback = '<br />';
+               $goback .= Linker::link(
+                       $this->getTitle(),
+                       $this->msg( 'openstackmanager-backproxylist' 
)->escaped()
+               );
+
+               $project = $formData['project'];
+               $backendPort = $formData['backendport'];
+               $backendHost = $formData['backendhost'];
+
+               $proxyName = $formData['proxyname'];
+               $proxyDomain = $formData['domain'];
+
+               $domain = OpenStackNovaDomain::getDomainByName( $proxyDomain );
+               $gatewayhostbyip = OpenStackNovaHost::getHostByPublicIP( 
$gatewayIP );
+               $fqdn = $proxyName . '.' . 
$domain->getFullyQualifiedDomainName();
+
+               $outputPage = $this->getOutput();
+
+               $dnsSuccess = $this->addHost( $proxyName, $proxyDomain, 
$gatewayIP );
+               if ( $dnsSuccess ) {
+                       $outputPage->addWikiMsg( 'openstackmanager-addedhost', 
$proxyName, $gatewayIP );
+               } else {
+                       $outputPage->addWikiMsg( 
'openstackmanager-addhostfailed', $proxyName, $gatewayIP );
+                       $outputPage->addHTML( $goback );
+                       return true;
+               }
+
+               # DNS looks good, now we can set up the proxy.
+               $newProxy =  $this->userNova->createProxy( $fqdn, $backendHost, 
$backendPort );
+
+               if ( $newProxy ) {
+                       $outputPage->addWikiMsg( 
'openstackmanager-createdproxy', $fqdn, $backendHost . ":" . $backendPort );
+               } else {
+                       $outputPage->addWikiMsg( 
'openstackmanager-createproxyfailed', $fqdn );
+                       $this->deleteHost( $fqdn, $gatewayIP );
+                       $outputPage->addHTML( $goback );
+                       return true;
+               }
+
+               $outputPage->addHTML( $goback );
+               return true;
+       }
+}

-- 
To view, visit https://gerrit.wikimedia.org/r/88187
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I9844258ef4fcf1045e02202fd3fe67d14a6ffad5
Gerrit-PatchSet: 7
Gerrit-Project: mediawiki/extensions/OpenStackManager
Gerrit-Branch: master
Gerrit-Owner: Andrew Bogott <[email protected]>
Gerrit-Reviewer: Andrew Bogott <[email protected]>
Gerrit-Reviewer: Ryan Lane <[email protected]>
Gerrit-Reviewer: Yuvipanda <[email protected]>
Gerrit-Reviewer: jenkins-bot

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to