public function execute()
 {
     global $wgOpenStackManagerLDAPUsername;
     global $wgOpenStackManagerServiceGroupPrefix;
     $user = new OpenStackNovaUser($wgOpenStackManagerLDAPUsername);
     $projects = OpenStackNovaProject::getAllProjects();
     $failedSync = false;
     $attempt_count = 0;
     $synced_count = 0;
     $failed_count = 0;
     /**
      * @var $project OpenStackNovaProject
      */
     foreach ($projects as $project) {
         // actually load the project info from ldap
         // (getAllProjects() doesn't do this)
         $project->fetchProjectInfo();
         $projectName = $project->getProjectName();
         $serviceGroups = $project->getServiceGroups();
         foreach ($serviceGroups as $serviceGroup) {
             $fullGroupName = $serviceGroup->getGroupName();
             if (strpos($fullGroupName, $wgOpenStackManagerServiceGroupPrefix, 0) === 0) {
                 $groupName = substr($fullGroupName, strlen($wgOpenStackManagerServiceGroupPrefix));
             } else {
                 $groupName = $fullGroupName;
             }
             $groupMembers = $serviceGroup->getMembers();
             if (empty($groupMembers)) {
                 continue;
             }
             $originalMember = $groupMembers[0];
             $retval = OpenStackNovaServiceGroup::createServiceGroup($groupName, $project, $this->updateMemberName($originalMember, $project));
             $attempt_count++;
             if ($retval) {
                 $this->output("Succeeded copying service group {$groupName} in {$projectName}\n");
                 $synced_count++;
                 foreach ($groupMembers as $member) {
                     if ($member === $originalMember) {
                         continue;
                     }
                     $serviceGroup->addMember($this->updateMemberName($member, $project));
                 }
             } else {
                 $this->output("Failed copying service group {$groupName} in {$projectName}\n");
                 $failedSync = true;
                 $failed_count++;
             }
         }
     }
     $this->output("{$attempt_count} service groups were synced, {$synced_count} changed, {$failed_count} failed.\n");
     $this->output("Done.\n");
     // return true if there were no failed syncs
     return !$failedSync;
 }
 /**
  * Add a service group to this project
  *
  * @param $groupname string
  * @return bool
  */
 function addServiceGroup($groupName, $initialUser)
 {
     global $wgAuth;
     $group = OpenStackNovaServiceGroup::createServiceGroup($groupName, $this, $initialUser);
     if (!$group) {
         $wgAuth->printDebug("Failed to create service group {$groupName}", NONSENSITIVE);
         return false;
     }
     $this->fetchServiceGroups();
     return true;
 }