/**
  * @param string            $name
  * @param string            $code_name
  * @param string            $description
  * @return IOpenStackComponent
  */
 public function buildOpenStackComponent($name, $code_name, $description)
 {
     $component = new OpenStackComponent();
     $component->setName($name);
     $component->setCodeName($code_name);
     $component->setDescription($description);
     return $component;
 }
    public function updateCMSFields(FieldList $fields)
    {
        Requirements::javascript('marketplace/code/ui/admin/js/openstack.release.supported.api.version.admin.ui.js');
        $fields->removeByName('ApiVersionID');
        $versions = OpenStackApiVersion::get()->map('ID', 'Version');
        $ddl = new DropdownField('ApiVersionID', 'API Version', $versions);
        $ddl->addExtraClass('ddl-api-version-id');
        $ddl->setEmptyString('--Select An API Version --');
        $fields->insertAfter($ddl, 'OpenStackComponentID');
        $versions = array();
        foreach (OpenStackComponent::get()->filter('SupportsVersioning', true) as $component) {
            foreach ($component->getVersions() as $version) {
                if (!array_key_exists(intval($component->getIdentifier()), $versions)) {
                    $versions[intval($component->getIdentifier())] = array();
                }
                array_push($versions[intval($component->getIdentifier())], array('value' => intval($version->getIdentifier()), 'text' => $version->getVersion()));
            }
        }
        $json_data = json_encode($versions);
        $script = <<<JS
\t\t<script>
\t\tvar versions = {$json_data};
\t\t</script>
JS;
        $fields->add(new LiteralField('js_data', $script));
        $fields->removeByName('OpenStackComponentID');
        //kludge; get parent id from url....
        $url = preg_split('/\\//', $_REQUEST['url']);
        $release_id = (int) $url[8];
        //components
        $components = OpenStackComponent::get()->filter('SupportsVersioning', true)->innerJoin('OpenStackRelease_OpenStackComponents', "OpenStackRelease_OpenStackComponents.OpenStackComponentID = OpenStackComponent.ID AND OpenStackReleaseID = {$release_id} ");
        $components_source = array();
        foreach ($components as $comp) {
            $components_source[$comp->ID] = sprintf('%s (%s)', $comp->Name, $comp->CodeName);
        }
        $ddl = new DropdownField('OpenStackComponentID', 'OpenStack Component', $components_source);
        $ddl->setEmptyString('--Select A OS Component--');
        $ddl->addExtraClass('ddl-os-component-id');
        $fields->insertBefore($ddl, 'ApiVersionID');
        $fields->insertAfter(new TextField("ReleaseVersion", "Release Version"), 'ReleaseID');
        $fields->insertAfter(new LiteralField('ReleaseVersionTitle', '<p>You could get this data from <a href="http://docs.openstack.org/releases" target="_blank">http://docs.openstack.org/releases</a></p>'), 'ReleaseVersion');
        return $fields;
    }
 private function processProjects()
 {
     $url = "https://raw.githubusercontent.com/openstack/governance/master/reference/projects.yaml";
     $response = null;
     try {
         $response = $this->client->get($url);
     } catch (Exception $ex) {
         echo $ex->getMessage() . PHP_EOL;
         SS_Log::log($ex->getMessage(), SS_Log::WARN);
     }
     if (is_null($response)) {
         return;
     }
     if ($response->getStatusCode() != 200) {
         return;
     }
     $body = $response->getBody();
     if (is_null($body)) {
         return;
     }
     $content = $body->getContents();
     if (empty($content)) {
         return;
     }
     try {
         $projects = Spyc::YAMLLoadString($content);
         foreach ($projects as $project_name => $info) {
             $component = OpenStackComponent::get()->filter('CodeName', ucfirst($project_name))->first();
             if (is_null($component)) {
                 $component = OpenStackComponent::get()->filter('Name', ucfirst($project_name))->first();
             }
             echo sprintf('processing component %s', $project_name) . PHP_EOL;
             if (is_null($component)) {
                 echo sprintf('component %s not found!', $project_name) . PHP_EOL;
                 continue;
             }
             $ptl = isset($info['ptl']) ? $info['ptl'] : null;
             $wiki = isset($info['url']) ? $info['url'] : null;
             $tags = isset($info['tags']) ? $info['tags'] : [];
             $ptl_member = null;
             if (!empty($ptl)) {
                 if (is_array($ptl) && isset($ptl['name'])) {
                     $ptl_names = preg_split("/\\s/", $ptl['name']);
                     $fname = $ptl_names[0];
                     $lname = $ptl_names[1];
                 } else {
                     $ptl_names = preg_split("/\\s/", $ptl);
                     $fname = $ptl_names[0];
                     $lname = $ptl_names[1];
                 }
                 $email = isset($ptl['email']) ? trim($ptl['email']) : null;
                 echo sprintf('PTL %s %s (%s)', $fname, $lname, $email) . PHP_EOL;
                 if (!empty($email)) {
                     $ptl_member = Member::get()->filter(array('Email' => $email))->first();
                 }
                 if (is_null($ptl_member)) {
                     $ptl_member = Member::get()->filter(array('FirstName' => $fname, 'Surname' => $lname))->first();
                 }
             }
             $team_diverse_affiliation = false;
             $is_service = false;
             $has_stable_branches = false;
             $tc_approved_release = false;
             $release_milestones = false;
             $release_intermediary = false;
             $release_independent = false;
             $starter_kit = false;
             $vulnerability_managed = false;
             $follows_standard_deprecation = false;
             $supports_upgrade = false;
             $supports_rolling_upgrade = false;
             foreach ($tags as $tag) {
                 if ($tag === "team:diverse-affiliation") {
                     $team_diverse_affiliation = true;
                 }
             }
             $deliverables = isset($info['deliverables']) ? $info['deliverables'] : array();
             $service_info = isset($deliverables[$project_name]) ? $deliverables[$project_name] : array();
             $service_tags = isset($service_info['tags']) ? $service_info['tags'] : array();
             foreach ($service_tags as $tag) {
                 if ($tag === "type:service") {
                     $is_service = true;
                 }
                 if ($tag === "stable:follows-policy") {
                     $has_stable_branches = true;
                 }
                 if ($tag === "release:cycle-with-milestones") {
                     $release_milestones = true;
                 }
                 if ($tag === "release:cycle-with-intermediary") {
                     $release_intermediary = true;
                 }
                 if ($tag === "release:independent") {
                     $release_independent = true;
                 }
                 if ($tag === "tc-approved-release") {
                     $tc_approved_release = true;
                 }
                 if ($tag === "starter-kit:compute") {
                     $starter_kit = true;
                 }
                 if ($tag === "vulnerability:managed") {
                     $vulnerability_managed = true;
                 }
                 if ($tag === "assert:follows-standard-deprecation") {
                     $follows_standard_deprecation = true;
                 }
                 if ($tag === "assert:supports-upgrade") {
                     $supports_upgrade = true;
                 }
                 if ($tag === "assert:supports-rolling-upgrade") {
                     $supports_rolling_upgrade = true;
                 }
             }
             $component->HasStableBranches = $has_stable_branches;
             $component->WikiUrl = $wiki;
             $component->TCApprovedRelease = $tc_approved_release;
             $component->ReleaseMileStones = $release_milestones;
             $component->ReleaseCycleWithIntermediary = $release_intermediary;
             $component->ReleaseIndependent = $release_independent;
             $component->HasTeamDiversity = $team_diverse_affiliation;
             $component->IncludedComputeStarterKit = $starter_kit;
             $component->VulnerabilityManaged = $vulnerability_managed;
             $component->FollowsStandardDeprecation = $follows_standard_deprecation;
             $component->SupportsUpgrade = $supports_upgrade;
             $component->SupportsRollingUpgrade = $supports_rolling_upgrade;
             if (!is_null($ptl_member)) {
                 echo sprintf('setting PTL %s %s (%s) to Component %s', $ptl_member->FirstName, $ptl_member->Surname, $ptl_member->Email, $component->Name) . PHP_EOL;
                 $component->LatestReleasePTLID = $ptl_member->ID;
             }
             $component->write();
         }
     } catch (Exception $ex) {
         echo $ex->getMessage() . PHP_EOL;
         SS_Log::log($ex->getMessage(), SS_Log::ERR);
         return;
     }
 }
 private function processProjects()
 {
     $url = "https://raw.githubusercontent.com/openstack/governance/master/reference/projects.yaml";
     $client = new HttpClient();
     try {
         $response = $client->get($url);
     } catch (HttpException $ex) {
         return;
     }
     if (is_null($response)) {
         return;
     }
     if ($response->getStatusCode() != 200) {
         return;
     }
     $body = $response->getBody();
     if (is_null($body)) {
         return;
     }
     $content = $body->getContents();
     if (empty($content)) {
         return;
     }
     $yaml = new Parser();
     try {
         $projects = $yaml->parse($content);
         foreach ($projects as $project_name => $info) {
             $component = OpenStackComponent::get()->filter('CodeName', ucfirst($project_name))->first();
             if (is_null($component)) {
                 continue;
             }
             $ptl = isset($info['ptl']) ? $info['ptl'] : null;
             $wiki = isset($info['url']) ? $info['url'] : null;
             $tags = isset($info['tags']) ? $info['tags'] : array();
             $ptl_member = null;
             if (!empty($ptl)) {
                 if (is_array($ptl) && isset($ptl['name'])) {
                     $ptl_names = preg_split("/\\s/", $ptl['name']);
                     $fname = $ptl_names[0];
                     $lname = $ptl_names[1];
                 } else {
                     $ptl_names = preg_split("/\\s/", $ptl);
                     $fname = $ptl_names[0];
                     $lname = $ptl_names[1];
                 }
                 $ptl_member = Member::get()->filter(array('FirstName' => $fname, 'Surname' => $lname))->first();
             }
             $team_diverse_affiliation = false;
             $is_service = false;
             $has_stable_branches = false;
             $tc_approved_release = false;
             $release_milestones = false;
             $release_intermediary = false;
             $release_independent = false;
             $starter_kit = false;
             $vulnerability_managed = false;
             foreach ($tags as $tag) {
                 if ($tag === "team:diverse-affiliation") {
                     $team_diverse_affiliation = true;
                 }
             }
             $deliverables = isset($info['deliverables']) ? $info['deliverables'] : array();
             $service_info = isset($deliverables[$project_name]) ? $deliverables[$project_name] : array();
             $service_tags = isset($service_info['tags']) ? $service_info['tags'] : array();
             foreach ($service_tags as $tag) {
                 if ($tag === "type:service") {
                     $is_service = true;
                 }
                 if ($tag === "release:has-stable-branches") {
                     $has_stable_branches = true;
                 }
                 if ($tag === "release:cycle-with-milestones") {
                     $release_milestones = true;
                 }
                 if ($tag === "release:cycle-with-intermediary") {
                     $release_intermediary = true;
                 }
                 if ($tag === "release:independent") {
                     $release_independent = true;
                 }
                 if ($tag === "tc-approved-release") {
                     $tc_approved_release = true;
                 }
                 if ($tag === "starter-kit:compute") {
                     $starter_kit = true;
                 }
                 if ($tag === "vulnerability:managed") {
                     $vulnerability_managed = true;
                 }
             }
             if (!$is_service) {
                 continue;
             }
             $component->HasStableBranches = $has_stable_branches;
             $component->WikiUrl = $wiki;
             $component->TCApprovedRelease = $tc_approved_release;
             $component->ReleaseMileStones = $release_milestones;
             $component->ReleaseCycleWithIntermediary = $release_intermediary;
             $component->ReleaseIndependent = $release_independent;
             $component->HasTeamDiversity = $team_diverse_affiliation;
             $component->IncludedComputeStarterKit = $starter_kit;
             $component->VulnerabilityManaged = $vulnerability_managed;
             if (!is_null($ptl_member)) {
                 $component->LatestReleasePTLID = $ptl_member->ID;
             }
             $component->write();
         }
     } catch (ParseException $e) {
         return;
     }
 }