Make a couple of the fake directory handling options configurable and added docs.
This commit is contained in:
parent
bcd189ea5d
commit
a1aadbf822
@ -220,6 +220,28 @@ The main difference is the creation of `$cxt` using PHP's
|
|||||||
take a look at the [PHP documentation](http://us3.php.net/manual/en/book.stream.php)
|
take a look at the [PHP documentation](http://us3.php.net/manual/en/book.stream.php)
|
||||||
for streams.
|
for streams.
|
||||||
|
|
||||||
|
## Stream Wrapper As A File System
|
||||||
|
As it was noted earlier in this tutorial, swift does not support directories.
|
||||||
|
Instead the names of a file can be path like with a separator. For example,
|
||||||
|
`swiftfs://Example/path/to/my_file.txt` has a name of `path/to/my_file.txt`.
|
||||||
|
|
||||||
|
To enable applications to use swift in a more directlry like manner there is a
|
||||||
|
second stream wrapper with a prefix `swiftfs://`. swiftfs stands for swift file
|
||||||
|
system. It works in a similar manner to to the standard stream wrappers with a
|
||||||
|
few key differences:
|
||||||
|
|
||||||
|
- mkdir will return TRUE is no objects start with the directory you are trying
|
||||||
|
to crate. Otherwise it will return FALSE.
|
||||||
|
- rmdir will return FALSE if any objects start with the directory prefix you are
|
||||||
|
trying to remove. rmdir does not allow you to remove directories with files
|
||||||
|
in them.
|
||||||
|
- Running stat on a directory that is a prefix for some objects (e.g.,
|
||||||
|
`swiftfs://Example/path/to/`) will see this is a prefix for a file and treat
|
||||||
|
it as if it were a directory.
|
||||||
|
|
||||||
|
To use this stream wrapper instead of the standard swift one simple replace the
|
||||||
|
usage of `swift://` with `swiftfs://`.
|
||||||
|
|
||||||
## Summary
|
## Summary
|
||||||
|
|
||||||
This tutorial is focused on using stream wrappers to interact with your
|
This tutorial is focused on using stream wrappers to interact with your
|
||||||
|
@ -23,8 +23,45 @@ SOFTWARE.
|
|||||||
* @file
|
* @file
|
||||||
* Contains the stream wrapper for `swiftfs://` URLs.
|
* Contains the stream wrapper for `swiftfs://` URLs.
|
||||||
*
|
*
|
||||||
|
* <b>Note, this stream wrapper is in early testing.</b>
|
||||||
|
*
|
||||||
* The stream wrapper implemented in HPCloud\Storage\ObjectStorage\StreamWrapper
|
* The stream wrapper implemented in HPCloud\Storage\ObjectStorage\StreamWrapper
|
||||||
* only supports the elements of a stream
|
* only supports the elements of a stream that are implemented by object
|
||||||
|
* storage. This is how the PHP documentation states a stream wrapper should be
|
||||||
|
* created. Because some features do not exist, attempting to treat a stream
|
||||||
|
* wrapper as if it were a file system will not entirely work. For example,
|
||||||
|
* while there are not directories objects have pathy names (with / separators).
|
||||||
|
* Directory calls to object storage with the default stream wrappers will not
|
||||||
|
* operate how they would for a file system.
|
||||||
|
*
|
||||||
|
* StreamWrapperFS is an attempt to make a filesystem like stream wrapper.
|
||||||
|
* Hence the protocol is swiftfs standing for swift file system.
|
||||||
|
*
|
||||||
|
* To understand how this stream wrapper works start by first reading the
|
||||||
|
* documentation on the HPCloud::Storage::ObjectStorage::StreamWrapper.
|
||||||
|
*
|
||||||
|
* <b>DIRECTORIES</b>
|
||||||
|
*
|
||||||
|
* Because OpenStack Swift does not support directories the swift:// stream
|
||||||
|
* wrapper does not support them. This stream wrapper attempts to fake them by
|
||||||
|
* faking directory stats, mkdir, and rmdir. By default (see the options below
|
||||||
|
* for how to change these) directories have permissions of 777, timestamps
|
||||||
|
* close to that of the request, and the user and group called by php. We mock
|
||||||
|
* these on the fly though information is stored in the PHP stat cache.
|
||||||
|
*
|
||||||
|
* In addition to the parameters supported by StreamWrapper, the following
|
||||||
|
* parameters may be set either in the stream context or through
|
||||||
|
* HPCloud::Bootstrap::setConfiguration():
|
||||||
|
* - swiftfs_fake_stat_mode: Directories don't exist in swift. When stat() is
|
||||||
|
* is called on a directory we mock the stat information so functions like
|
||||||
|
* is_dir will work. The default file permissions is 0777. Though this
|
||||||
|
* parameter you can pass is a different set of file permissions to use
|
||||||
|
* for these mock stats.
|
||||||
|
* - swiftfs_fake_isdir_true: Directory functions like mkdir and is_dir (stat)
|
||||||
|
* check to see if there are objects with the the passed in directory as a
|
||||||
|
* prefix to see if it already exists. If you want is_dir to always return
|
||||||
|
* true even if it is not an existing prefix set this to TRUE. Defaults to
|
||||||
|
* FALSE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace HPCloud\Storage\ObjectStorage;
|
namespace HPCloud\Storage\ObjectStorage;
|
||||||
@ -55,7 +92,7 @@ class StreamWrapperFS extends StreamWrapper {
|
|||||||
*/
|
*/
|
||||||
public function mkdir($uri, $mode, $options) {
|
public function mkdir($uri, $mode, $options) {
|
||||||
|
|
||||||
return !($this->testDirectoryExists($uri));
|
return ($this->cxt('swiftfs_fake_isdir_true', FALSE) || !($this->testDirectoryExists($uri)));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -85,7 +122,7 @@ class StreamWrapperFS extends StreamWrapper {
|
|||||||
// When FALSE is returned there is no file to stat. So, we attempt to handle
|
// When FALSE is returned there is no file to stat. So, we attempt to handle
|
||||||
// it like a directory.
|
// it like a directory.
|
||||||
else {
|
else {
|
||||||
if ($this->testDirectoryExists($path)) {
|
if ($this->cxt('swiftfs_fake_isdir_true', FALSE) || $this->testDirectoryExists($path)) {
|
||||||
// The directory prefix exists. Fake the directory file permissions.
|
// The directory prefix exists. Fake the directory file permissions.
|
||||||
return $this->fakeStat(TRUE);
|
return $this->fakeStat(TRUE);
|
||||||
}
|
}
|
||||||
@ -159,7 +196,7 @@ class StreamWrapperFS extends StreamWrapper {
|
|||||||
// Set inode type to directory or file.
|
// Set inode type to directory or file.
|
||||||
$type = $dir ? 040000 : 0100000;
|
$type = $dir ? 040000 : 0100000;
|
||||||
// Fake world-readible
|
// Fake world-readible
|
||||||
$mode = $type + 0777;
|
$mode = $type + $this->cxt('swiftfs_fake_stat_mode', 0777);
|
||||||
|
|
||||||
$values = array(
|
$values = array(
|
||||||
'dev' => 0,
|
'dev' => 0,
|
||||||
|
@ -647,5 +647,4 @@ class StreamWrapperFSTest extends \HPCloud\Tests\TestCase {
|
|||||||
$this->assertFalse(rmdir($url, $this->basicSwiftContext()));
|
$this->assertFalse(rmdir($url, $this->basicSwiftContext()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user