Added an IdentityServices factory to Bootstrap from Bootstrap config. Calling Bootstrap::identity() will return an IdentityServices object. If the token has expired it will get a new one.
This commit is contained in:
@@ -29,6 +29,9 @@ SOFTWARE.
|
|||||||
|
|
||||||
namespace HPCloud;
|
namespace HPCloud;
|
||||||
|
|
||||||
|
use HPCloud\Services\IdentityServices;
|
||||||
|
use HPCloud\Exception;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Bootstrapping services.
|
* Bootstrapping services.
|
||||||
*
|
*
|
||||||
@@ -128,6 +131,12 @@ class Bootstrap {
|
|||||||
'transport' => '\HPCloud\Transport\CURLTransport',
|
'transport' => '\HPCloud\Transport\CURLTransport',
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An identity services object created from the global settings.
|
||||||
|
* @var [type]
|
||||||
|
*/
|
||||||
|
public static $identity = NULL;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add the autoloader to PHP's autoloader list.
|
* Add the autoloader to PHP's autoloader list.
|
||||||
*
|
*
|
||||||
@@ -313,4 +322,61 @@ class Bootstrap {
|
|||||||
public static function hasConfig($name) {
|
public static function hasConfig($name) {
|
||||||
return isset(self::$config[$name]);
|
return isset(self::$config[$name]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a HPCloud::Services::IdentityService object from the bootstrap config.
|
||||||
|
*
|
||||||
|
* A factory helper function that uses the bootstrap configuration to create
|
||||||
|
* a ready to use HPCloud::Services::IdentityService object.
|
||||||
|
*
|
||||||
|
* @param bool $force
|
||||||
|
* Whether to force the generation of a new object even if one is already
|
||||||
|
* cached.
|
||||||
|
* @retval HPCloud::Services::IdentityService
|
||||||
|
* An authenticated ready to use HPCloud::Services::IdentityService object.
|
||||||
|
* @throws HPCloud::Exception
|
||||||
|
* When the needed configuration to authenticate is not available.
|
||||||
|
*/
|
||||||
|
public static function identity($force = FALSE) {
|
||||||
|
|
||||||
|
// If we already have an identity make sure the token is not expired.
|
||||||
|
$expired = FALSE;
|
||||||
|
if (!is_null(self::$identity)) {
|
||||||
|
// Make sure the token we have is not expired.
|
||||||
|
$tokenDetails = self::$identity->tokenDetails();
|
||||||
|
$tokenExpires = new \DateTime($tokenDetails['expires']);
|
||||||
|
$currentDateTime = new \DateTime('now');
|
||||||
|
if ($currentDateTime > $tokenExpires) {
|
||||||
|
$expired = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_null(self::$identity) || $expired || $force) {
|
||||||
|
|
||||||
|
// Make sure we have an endpoint to use
|
||||||
|
if (!self::hasConfig('endpoint')) {
|
||||||
|
throw new Exception('Unable to authenticate. No endpoint supplied.');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if we have a username/password
|
||||||
|
if (self::hasConfig('username') && self::hasConfig('password')) {
|
||||||
|
$is = new IdentityServices(self::config('endpoint'));
|
||||||
|
$is->authenticateAsUser(self::config('username'), self::config('password'), self::config('tenantid', NULL));
|
||||||
|
self::$identity = $is;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Otherwise we go with access/secret keys
|
||||||
|
elseif (self::hasConfig('account') && self::hasConfig('key')) {
|
||||||
|
$is = new IdentityServices(self::config('endpoint'));
|
||||||
|
$is->authenticateAsAccount(self::config('account'), self::config('key'), self::config('tenantid', NULL));
|
||||||
|
self::$identity = $is;
|
||||||
|
}
|
||||||
|
|
||||||
|
else {
|
||||||
|
throw new Exception('Unable to authenticate. No account credentials supplied.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return self::$identity;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ require_once 'src/HPCloud/Bootstrap.php';
|
|||||||
require_once 'test/TestCase.php';
|
require_once 'test/TestCase.php';
|
||||||
|
|
||||||
use \HPCloud\Services\IdentityServices;
|
use \HPCloud\Services\IdentityServices;
|
||||||
|
use \HPCloud\Bootstrap;
|
||||||
|
|
||||||
|
|
||||||
class IdentityServicesTest extends \HPCloud\Tests\TestCase {
|
class IdentityServicesTest extends \HPCloud\Tests\TestCase {
|
||||||
@@ -335,4 +336,44 @@ class IdentityServicesTest extends \HPCloud\Tests\TestCase {
|
|||||||
$this->assertEquals(1, count($catalog));
|
$this->assertEquals(1, count($catalog));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test the bootstrap identity factory.
|
||||||
|
* @depends testAuthenticateAsAccount
|
||||||
|
* @depends testAuthenticateAsUser
|
||||||
|
*/
|
||||||
|
function testBootstrap() {
|
||||||
|
|
||||||
|
// Test authenticating as a user.
|
||||||
|
$settings = array(
|
||||||
|
'username' => self::conf('hpcloud.identity.username'),
|
||||||
|
'password' => self::conf('hpcloud.identity.password'),
|
||||||
|
'endpoint' => self::conf('hpcloud.identity.url'),
|
||||||
|
'tenantid' => self::conf('hpcloud.identity.tenantId'),
|
||||||
|
);
|
||||||
|
Bootstrap::setConfiguration($settings);
|
||||||
|
|
||||||
|
$is = Bootstrap::identity(TRUE);
|
||||||
|
$this->assertInstanceOf('\HPCloud\Services\IdentityServices', $is);
|
||||||
|
|
||||||
|
// Test authenticating as an account.
|
||||||
|
$settings = array(
|
||||||
|
'account' => self::conf('hpcloud.identity.account'),
|
||||||
|
'key' => self::conf('hpcloud.identity.secret'),
|
||||||
|
'endpoint' => self::conf('hpcloud.identity.url'),
|
||||||
|
'tenantid' => self::conf('hpcloud.identity.tenantId'),
|
||||||
|
);
|
||||||
|
Bootstrap::setConfiguration($settings);
|
||||||
|
|
||||||
|
$is = Bootstrap::identity(TRUE);
|
||||||
|
$this->assertInstanceOf('\HPCloud\Services\IdentityServices', $is);
|
||||||
|
|
||||||
|
// Test getting a second instance from the cache.
|
||||||
|
$is2 = Bootstrap::identity();
|
||||||
|
$this->assertEquals($is, $is2);
|
||||||
|
|
||||||
|
// Test that forcing a refresh does so.
|
||||||
|
$is2 = Bootstrap::identity(TRUE);
|
||||||
|
$this->assertNotEquals($is, $is2);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user