/**
  * 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);
     }
 }