?iť?
Current Path : /home/scgforma/www/cloud/3rdparty/rackspace/php-opencloud/lib/OpenCloud/Common/Service/ |
Current File : /home/scgforma/www/cloud/3rdparty/rackspace/php-opencloud/lib/OpenCloud/Common/Service/Endpoint.php |
<?php /** * Copyright 2012-2014 Rackspace US, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ namespace OpenCloud\Common\Service; use Guzzle\Http\Url; use OpenCloud\OpenStack; use OpenCloud\Common\Http\Message\Formatter; use OpenCloud\Common\Exceptions\UnsupportedVersionError; /** * An endpoint serves as a location which receives and emits API interactions. It will therefore also host * particular API resources. Each endpoint object has different access methods - one receives network connections over * the public Internet, another receives traffic through an internal network. You will be able to access the latter * from a Server, for example, in the same Region - which will incur no bandwidth charges, and be quicker. */ class Endpoint { /** * @var \Guzzle\Http\Url */ private $publicUrl; /** * @var \Guzzle\Http\Url */ private $privateUrl; /** * @var string */ private $region; /** * @param $object * @param string $supportedServiceVersion Service version supported by the SDK * @param OpenCloud\OpenStack $client OpenStack client * @return Endpoint */ public static function factory($object, $supportedServiceVersion, OpenStack $client) { $endpoint = new self(); if (isset($object->publicURL)) { $endpoint->setPublicUrl($endpoint->getVersionedUrl($object->publicURL, $supportedServiceVersion, $client)); } if (isset($object->internalURL)) { $endpoint->setPrivateUrl($endpoint->getVersionedUrl($object->internalURL, $supportedServiceVersion, $client)); } if (isset($object->region)) { $endpoint->setRegion($object->region); } return $endpoint; } /** * @param $publicUrl * @return $this */ public function setPublicUrl(Url $publicUrl) { $this->publicUrl = $publicUrl; return $this; } /** * @return Url */ public function getPublicUrl() { return $this->publicUrl; } /** * @param $privateUrl * @return $this */ public function setPrivateUrl(Url $privateUrl) { $this->privateUrl = $privateUrl; return $this; } /** * @return Url */ public function getPrivateUrl() { return $this->privateUrl; } /** * @param $region * @return $this */ public function setRegion($region) { $this->region = $region; return $this; } /** * @return string */ public function getRegion() { return $this->region; } /** * Returns the endpoint URL with a version in it * * @param string $url Endpoint URL * @param string $supportedServiceVersion Service version supported by the SDK * @param OpenCloud\OpenStack $client OpenStack client * @return Guzzle/Http/Url Endpoint URL with version in it */ private function getVersionedUrl($url, $supportedServiceVersion, OpenStack $client) { $versionRegex = '/\/[vV][0-9][0-9\.]*/'; if (1 === preg_match($versionRegex, $url)) { // URL has version in it; use it as-is return Url::factory($url); } // If there is no version in $url but no $supportedServiceVersion // is specified, just return $url as-is but log a warning if (is_null($supportedServiceVersion)) { $client->getLogger()->warning('Service version supported by SDK not specified. Using versionless service URL as-is, without negotiating version.'); return Url::factory($url); } // Make GET request to URL $response = Formatter::decode($client->get($url)->send()); // Attempt to parse response and determine URL for given $version if (!isset($response->versions) || !is_array($response->versions)) { throw new UnsupportedVersionError('Could not negotiate version with service.'); } foreach ($response->versions as $version) { if (($version->status == 'CURRENT' || $version->status == 'SUPPORTED') && $version->id == $supportedServiceVersion) { foreach ($version->links as $link) { if ($link->rel == 'self') { return Url::factory($link->href); } } } } // If we've reached this point, we could not find a versioned // URL in the response; throw an error throw new UnsupportedVersionError(sprintf( 'SDK supports version %s which is not currently provided by service.', $supportedServiceVersion )); } }