/** * Handle ?action=configure * @return bool */ function configureInstance() { global $wgOpenStackManagerPuppetOptions; $this->setHeaders(); $region = $this->getRequest()->getText('region'); $instanceosid = $this->getRequest()->getText('instanceid'); $instance = $this->userNova->getInstance($instanceosid); if (!$instance) { $this->getOutput()->addWikiMsg('openstackmanager-nonexistentresource'); return false; } $project = $instance->getProject(); if (!$this->userLDAP->inRole('projectadmin', $project)) { $this->notInRole('projectadmin', $project); return false; } $instanceid = $instance->getInstanceId(); $instancename = $instance->getInstanceName(); $this->getOutput()->setPagetitle($this->msg('openstackmanager-configureinstance', $instanceid, $instancename)); $instanceInfo = array(); $instanceInfo['instanceid'] = array('type' => 'hidden', 'default' => $instanceosid, 'name' => 'instanceid'); $instanceInfo['project'] = array('type' => 'hidden', 'default' => $project, 'name' => 'project'); $instanceInfo['region'] = array('type' => 'hidden', 'default' => $region, 'name' => 'region'); if ($wgOpenStackManagerPuppetOptions['enabled']) { $host = OpenStackNovaHost::getHostByNameAndProject($instancename, $project, $region); if (!$host) { $this->getOutput()->addWikiMsg('openstackmanager-nonexistenthost'); return false; } $puppetinfo = $host->getPuppetConfiguration(); $this->setPuppetInfo($instanceInfo, $puppetinfo); } $instanceInfo['action'] = array('type' => 'hidden', 'default' => 'configure', 'name' => 'action'); $instanceForm = new HTMLForm($instanceInfo, $this->getContext(), 'openstackmanager-novainstance'); $instanceForm->setSubmitID('novainstance-form-configureinstancesubmit'); $instanceForm->setSubmitCallback(array($this, 'tryConfigureSubmit')); $instanceForm->show(); return true; }
function loadHost() { $this->host = OpenStackNovaHost::getHostByNameAndProject($this->getInstanceName(), $this->getProject(), $this->region); }
/** * Add a new host entry from an OpenStackNovaInstance object, an OpenStackNovaDomain object, * and optional puppet information. Returns null if a host already exists, or if * if the host additional fails. This function should be used for adding host entries * for instances (private DNS). * * @static * @param $instance OpenStackNovaInstance * @param $domain OpenStackNovaDomain * @param $puppetinfo * @return OpenStackNovaHost */ static function addHostFromInstance($instance, $domain, $puppetinfo = array()) { global $wgAuth; global $wgOpenStackManagerLDAPInstanceBaseDN, $wgOpenStackManagerPuppetOptions; OpenStackNovaLdapConnection::connect(); $hostname = $instance->getInstanceName(); $instanceid = $instance->getInstanceId(); $instancename = $instance->getInstanceName(); $instanceproject = $instance->getProject(); $project = $instance->getProject(); $tmpip = $instance->getInstancePrivateIPs(); if ($tmpip && isset($tmpip[0])) { $ip = $tmpip[0]; } else { $ip = null; } $domainname = $domain->getFullyQualifiedDomainName(); $region = $domain->getLocation(); $fqdn = $instancename . '.' . $instanceproject . '.' . $domainname; $host = OpenStackNovaHost::getHostByNameAndProject($instancename, $instanceproject, $region); if ($host) { $wgAuth->printDebug("Failed to add host {$hostname} as the DNS entry already exists", NONSENSITIVE); return null; } $hostEntry = array(); $hostEntry['objectclass'][] = 'dcobject'; $hostEntry['objectclass'][] = 'dnsdomain'; $hostEntry['objectclass'][] = 'domainrelatedobject'; $hostEntry['dc'] = $fqdn; # $hostEntry['l'] = $instance->getInstanceAvailabilityZone(); if ($ip) { $hostEntry['arecord'] = $ip; } $hostEntry['associateddomain'][] = $instanceid . '.' . $domainname; $hostEntry['associateddomain'][] = $hostname . '.' . $domainname; $hostEntry['associateddomain'][] = $instanceid . '.' . $project . '.' . $domainname; $hostEntry['associateddomain'][] = $hostname . '.' . $project . '.' . $domainname; $hostEntry['l'] = $domain->getLocation(); if ($wgOpenStackManagerPuppetOptions['enabled']) { $hostEntry['objectclass'][] = 'puppetclient'; foreach ($wgOpenStackManagerPuppetOptions['defaultclasses'] as $class) { $hostEntry['puppetclass'][] = $class; } foreach ($wgOpenStackManagerPuppetOptions['defaultvariables'] as $variable => $value) { $hostEntry['puppetvar'][] = $variable . '=' . $value; } if ($puppetinfo) { if (isset($puppetinfo['classes'])) { foreach ($puppetinfo['classes'] as $class) { $hostEntry['puppetclass'][] = $class; } } if (isset($puppetinfo['variables'])) { foreach ($puppetinfo['variables'] as $variable => $value) { if ($value) { $hostEntry['puppetvar'][] = $variable . '=' . $value; } } } } $hostEntry['puppetvar'][] = 'instanceproject=' . $project; $hostEntry['puppetvar'][] = 'instancename=' . $hostname; } $dn = 'dc=' . $fqdn . ',' . $wgOpenStackManagerLDAPInstanceBaseDN; $success = LdapAuthenticationPlugin::ldap_add($wgAuth->ldapconn, $dn, $hostEntry); if ($success) { $domain->updateSOA(); $wgAuth->printDebug("Successfully added host {$fqdn}", NONSENSITIVE); return OpenStackNovaHost::getHostByInstanceNameAndProject($instancename, $instanceproject, $region); } else { $wgAuth->printDebug("Failed to add host {$fqdn} with dn of {$dn}", NONSENSITIVE); return null; } }
public function execute() { global $wgAuth; global $wgOpenStackManagerLDAPUsername; global $wgOpenStackManagerLDAPUserPassword; if ($this->hasOption('all-instances')) { if ($this->hasOption('region')) { $this->error("--all-instances cannot be used with --region.\n", true); } $instancelist = array(); $user = new OpenStackNovaUser($wgOpenStackManagerLDAPUsername); $userNova = OpenStackNovaController::newFromUser($user); $projects = OpenStackNovaProject::getAllProjects(); $userNova->setProject('bastion'); $userNova->authenticate($wgOpenStackManagerLDAPUsername, $wgOpenStackManagerLDAPUserPassword); $regions = $userNova->getRegions('compute'); foreach ($regions as $region) { foreach ($projects as $project) { $projectName = $project->getProjectName(); $userNova->setProject($projectName); $userNova->setRegion($region); $instances = $userNova->getInstances(); if ($instances) { foreach ($instances as $instance) { $instancelist[] = array($region, $instance->getInstanceName(), $projectName); } } } } } elseif ($this->hasOption('name')) { if (!$this->hasOption('region')) { $this->error("--name requires --region.\n", true); } if (!$this->hasOption('project')) { $this->error("--name requires --project.\n", true); } $instancelist = array(array($this->getOption('region'), $this->getOption('name'), $this->getOption('project'))); } else { $this->error("Must specify either --name or --all-instances.\n", true); } if (!class_exists('OpenStackNovaHost')) { $this->error("Couldn't find OpenStackNovaHost class.\n", true); } OpenStackNovaLdapConnection::connect(); foreach ($instancelist as $instancepair) { list($instanceregion, $instancename, $instanceproject) = $instancepair; $host = OpenStackNovaHost::getHostByNameAndProject($instancename, $instanceproject, $instanceregion); if (!$host) { print "Skipping {$instancename}.{$instanceproject}.{$instanceregion}; not found.\n"; continue; } print "\nFor instance {$instancename} in region {$instanceregion} and project {$instanceproject}:\n\n"; $namefqdn = $instancename . '.' . $instanceproject . '.' . $instanceregion . '.' . 'wmflabs'; $host->addAssociatedDomain($namefqdn); } }