Andrew Bogott has uploaded a new change for review.
https://gerrit.wikimedia.org/r/88187
Change subject: DRAFT -- add a gui for invisible unicorn
......................................................................
DRAFT -- add a gui for invisible unicorn
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, 550 insertions(+), 0 deletions(-)
git pull
ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/OpenStackManager
refs/changes/87/88187/1
diff --git a/OpenStackManager.i18n.php b/OpenStackManager.i18n.php
index da3c9a3..e8b0025 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,20 @@
'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-novapuppetgroup' => 'Nova Puppet group',
'openstackmanager-puppetgrouplist' => 'Puppet group list',
'openstackmanager-puppetallprojects' => 'All projects',
diff --git a/OpenStackManager.php b/OpenStackManager.php
index 6d67f7d..67275d9 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 = 'pmtpa';
+$wgOpenStackManagerProxyGateway = '10.4.0.214';
+
$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..b684da5
--- /dev/null
+++ b/nova/OpenStackNovaProxy.php
@@ -0,0 +1,81 @@
+<?php
+
+/**
+ * class for nova sudoers
+ *
+ * @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;
+ if ( ! $backendName ) {
+ $this->fetchProxyInfo();
+ } else {
+ $this->backendName = $backendName;
+ $this->backendPort = $backendPort;
+ }
+ }
+
+ function fetchProxyInfo() {
+ global $wgMemc;
+
+ # TODO: Implement rest backend
+ $this->backendName = "fake";
+ $this->backendPort = "80";
+ }
+
+ /**
+ * 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;
+ }
+
+ /**
+ * Get all proxies for a given project
+ *
+ * @param $projectName
+ * @return array of OpenStackNovaProxy
+ */
+ static function getAllProxiesByProject( $projectName ) {
+ $proxyObjList = $this->userNova->getProxies();
+ return $proxyObjList;
+
+ #TODO: implement this for real
+ $proxyList = array();
+ $proxyList[] = "$projectName" . "-fakeproxy1";
+ $proxyList[] = "$projectName" . "-fakeproxy2";
+ $proxyList[] = "$projectName" . "-fakeproxy3";
+
+ $proxyObjList = array();
+ foreach ( $proxyList as $proxy ) {
+ $proxyObjList[] = new OpenStackNovaProxy( $projectName,
$proxy );
+ }
+
+ return $proxyObjList;
+ }
+}
diff --git a/special/SpecialNovaProxy.php b/special/SpecialNovaProxy.php
new file mode 100644
index 0000000..c67fbb2
--- /dev/null
+++ b/special/SpecialNovaProxy.php
@@ -0,0 +1,369 @@
+<?php
+
+/**
+ * todo comment me
+ *
+ * @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();
+ $project = $this->getRequest()->getText( 'project' );
+ $region = $wgOpenStackManagerProxyServiceRegion;
+ $this->userNova = OpenStackNovaController::newFromUser(
$this->userLDAP );
+ $this->userNova->setProject( $project );
+ $this->userNova->setRegion( $region );
+
+ $action = $this->getRequest()->getVal( 'action' );
+ $this->projectName = $this->getRequest()->getText( 'project' );
+ $this->project = OpenStackNovaProject::getProjectByName(
$this->projectName );
+ 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() {
+ $project = $this->getRequest()->getText( 'project' );
+ $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' => $project,
+ '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 ) {
+ // $instanceNames will be output later with no
change of escaping
+ $proxyRow = array();
+ $this->pushRawResourceColumn( $proxyRow, $fqdn
);
+ $this->pushRawResourceColumn( $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'];
+
+ $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 );
+ return false;
+ }
+
+ $outputPage->addWikiMsg( 'openstackmanager-deleteproxysuccess',
$fqdn );
+ return true;
+ }
+
+
+ /**
+ * @param $formData
+ * @param string $entryPoint
+ * @return bool
+ */
+ function tryCreateSubmit( $formData, $entryPoint = 'internal' ) {
+ global $wgOpenStackManagerProxyGateway;
+ $gatewayIP = $wgOpenStackManagerProxyGateway;
+
+ $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 );
+ return false;
+ }
+
+ # 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);
+ return false;
+ }
+
+ return true;
+ }
+}
--
To view, visit https://gerrit.wikimedia.org/r/88187
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I9844258ef4fcf1045e02202fd3fe67d14a6ffad5
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