ObjectStorage now has support for listing.
This commit is contained in:
@@ -12,6 +12,8 @@
|
||||
|
||||
namespace HPCloud\Storage;
|
||||
|
||||
use HPCloud\Storage\ObjectStorage\Container;
|
||||
|
||||
/**
|
||||
* Access to ObjectStorage (Swift).
|
||||
*
|
||||
@@ -88,9 +90,11 @@ class ObjectStorage {
|
||||
// X-Trans-Id: tx33f1257e09f64bc58f28e66e0577268a
|
||||
|
||||
|
||||
$token = $res->getHeader('X-Auth-Token');
|
||||
$token = $res->header('X-Auth-Token');
|
||||
$newUrl = $res->header('X-Storage-Url');
|
||||
|
||||
$store = new ObjectStorage($token, $url);
|
||||
|
||||
$store = new ObjectStorage($token, $newUrl);
|
||||
|
||||
return $store;
|
||||
}
|
||||
@@ -122,7 +126,7 @@ class ObjectStorage {
|
||||
* @return string
|
||||
* The authentication token.
|
||||
*/
|
||||
public function getAuthToken() {
|
||||
public function token() {
|
||||
return $this->token;
|
||||
}
|
||||
|
||||
@@ -132,7 +136,55 @@ class ObjectStorage {
|
||||
* @return string
|
||||
* The URL that is the endpoint for this service.
|
||||
*/
|
||||
public function getUrl() {
|
||||
public function url() {
|
||||
return $this->url;
|
||||
}
|
||||
|
||||
public function containers() {
|
||||
|
||||
$url = $this->url() . '?format=json';
|
||||
|
||||
$containers = $this->get($url);
|
||||
|
||||
$containerList = array();
|
||||
foreach ($containers as $container) {
|
||||
$containerList[$container['name']] = Container::newFromJSON($container);
|
||||
}
|
||||
|
||||
return $containerList;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check to see if this container name exists.
|
||||
*
|
||||
* Unless you are working with a huge list of containers, this
|
||||
* operation is as slow as simply fetching the entire container list.
|
||||
*/
|
||||
public function hasContainer($name) {
|
||||
$containers = $this->containers();
|
||||
return isset($containers[$name]);
|
||||
}
|
||||
|
||||
public function createContainer($name) {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Do a GET on Swift.
|
||||
*
|
||||
* This is a convenience method that handles the
|
||||
* most common case of Swift requests.
|
||||
*/
|
||||
protected function get($url, $jsonDecode = TRUE) {
|
||||
$client = \HPCloud\Transport::instance();
|
||||
$headers = array(
|
||||
'X-Auth-Token' => $this->token(),
|
||||
);
|
||||
|
||||
$raw = $client->doRequest($url, 'GET', $headers);
|
||||
if (!$jsonDecode) {
|
||||
return $raw;
|
||||
}
|
||||
return json_decode($raw->content(), TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
90
src/HPCloud/Storage/ObjectStorage/Container.php
Normal file
90
src/HPCloud/Storage/ObjectStorage/Container.php
Normal file
@@ -0,0 +1,90 @@
|
||||
<?php
|
||||
/**
|
||||
* @file
|
||||
*
|
||||
* Contains the class for ObjectStorage Container objects.
|
||||
*/
|
||||
|
||||
namespace HPCloud\Storage\ObjectStorage;
|
||||
|
||||
class Container implements \Countable {
|
||||
|
||||
protected $properties = array();
|
||||
protected $name = NULL;
|
||||
|
||||
protected $count = 0;
|
||||
protected $bytes = 0;
|
||||
|
||||
/**
|
||||
* Create a new Container from JSON data.
|
||||
*
|
||||
* This is used in lieue of a standard constructor when
|
||||
* fetching containers from ObjectStorage.
|
||||
*
|
||||
* @param array $jsonArray
|
||||
* An associative array as returned by json_decode($foo, TRUE);
|
||||
*/
|
||||
public static function newFromJSON($jsonArray) {
|
||||
$container = new Container($jsonArray['name']);
|
||||
|
||||
// Access to count and bytes is basically controlled. This is is to
|
||||
// prevent a local copy of the object from getting out of sync with
|
||||
// the remote copy.
|
||||
if (!empty($jsonArray['count'])) {
|
||||
$container->count = $jsonArray['count'];
|
||||
}
|
||||
|
||||
if (!empty($jsonArray['bytes'])) {
|
||||
$container->bytes = $jsonArray['bytes'];
|
||||
}
|
||||
|
||||
return $container;
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct a new Container.
|
||||
*/
|
||||
public function __construct($name) {
|
||||
$this->name = $name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the name of this container.
|
||||
*
|
||||
* @return string
|
||||
* The name of the container.
|
||||
*/
|
||||
public function name() {
|
||||
return $this->name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the number of bytes in this container.
|
||||
*
|
||||
* @return int
|
||||
* The number of bytes in this container.
|
||||
*/
|
||||
public function bytes() {
|
||||
return $this->bytes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the number of items in this container.
|
||||
*
|
||||
* Since Container implements Countable, the PHP builtin
|
||||
* count() can be used on a Container instance:
|
||||
*
|
||||
* @code
|
||||
* <?php
|
||||
* count($container) === $container->count();
|
||||
* ?>
|
||||
* @endcode
|
||||
*
|
||||
* @return int
|
||||
* The number of items in this container.
|
||||
*/
|
||||
public function count() {
|
||||
return $this->count();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -4,13 +4,64 @@
|
||||
*
|
||||
* Unit tests for ObjectStorage.
|
||||
*/
|
||||
namespace HPCloud\tests\units;
|
||||
namespace HPCloud\Storage\Tests\Units;
|
||||
|
||||
require_once 'mageekguy.atoum.phar';
|
||||
require_once 'src/HPCloud/Bootstrap.php';
|
||||
require_once 'test/TestCase.php';
|
||||
|
||||
use \mageekguy\atoum;
|
||||
|
||||
class ObjectStorage extends atoum\test {
|
||||
class ObjectStorage extends \HPCloud\TestCase {
|
||||
|
||||
protected function auth() {
|
||||
|
||||
static $ostore = NULL;
|
||||
|
||||
if (empty($ostore)) {
|
||||
$user = $this->settings['hpcloud.swift.account'];
|
||||
$key = $this->settings['hpcloud.swift.key'];
|
||||
$url = $this->settings['hpcloud.swift.url'];
|
||||
|
||||
$ostore = \HPCloud\Storage\ObjectStorage::newFromSwiftAuth($user, $key, $url);
|
||||
}
|
||||
|
||||
return $ostore;
|
||||
}
|
||||
|
||||
/**
|
||||
* Canary test.
|
||||
*/
|
||||
public function testSettings() {
|
||||
$this->assert->array($this->settings)->isNotEmpty();
|
||||
}
|
||||
|
||||
/**
|
||||
* Test Swift-based authentication.
|
||||
* */
|
||||
public function testAuthentication() {
|
||||
|
||||
$ostore = $this->auth();
|
||||
|
||||
$this
|
||||
->assert->object($ostore)->isInstanceOf('\HPCloud\Storage\ObjectStorage')
|
||||
->assert->string($ostore->token())->isNotEmpty();
|
||||
}
|
||||
|
||||
/**
|
||||
* Test the process of fetching a list of containers.
|
||||
*
|
||||
* @FIXME This needs to be updated to check an actual container.
|
||||
*/
|
||||
public function testContainers() {
|
||||
$store = $this->auth();
|
||||
$containers = $store->containers();
|
||||
|
||||
$this->assert->array($containers)->isNotEmpty();
|
||||
|
||||
$first = array_shift($containers);
|
||||
|
||||
$this->assert->string($first->name())->isNotEmpty();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user