blob: 505b5be35f29e6e197d982a710769cf190b538f6 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
|
<?php
/**
* @author Jörn Friedrich Dreyer
* @copyright (c) 2014 Jörn Friedrich Dreyer <jfd@owncloud.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
*
* You should have received a copy of the GNU Affero General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OC\Files\ObjectStore;
use Guzzle\Http\Exception\ClientErrorResponseException;
use OCP\Files\ObjectStore\IObjectStore;
use OpenCloud\OpenStack;
class Swift implements IObjectStore {
/**
* @var \OpenCloud\ObjectStore\Service
*/
private $objectStoreService;
/**
* @var \OpenCloud\ObjectStore\Resource\Container
*/
private $container;
public function __construct($params) {
if (!isset($params['username']) || !isset($params['password'])) {
throw new \Exception('Access Key and Secret have to be configured.');
}
if (!isset($params['container'])) {
$params['container'] = 'owncloud';
}
if (!isset($params['autocreate'])) {
// should only be true for tests
$params['autocreate'] = false;
}
$secret = array(
'username' => $params['username'],
'password' => $params['password']
);
if (isset($params['tenantName'])) {
$secret['tenantName'] = $params['tenantName'];
}
if (isset($params['tenantId'])) {
$secret['tenantId'] = $params['tenantId'];
}
// the OpenCloud client library will default to 'cloudFiles' if $serviceName is null
$serviceName = null;
if ($params['serviceName']) {
$serviceName = $params['serviceName'];
}
$client = new OpenStack($params['url'], $secret);
$this->objectStoreService = $client->objectStoreService($serviceName, $params['region']);
try {
$this->container = $this->objectStoreService->getContainer($params['container']);
} catch (ClientErrorResponseException $ex) {
// if the container does not exist and autocreate is true try to create the container on the fly
if (isset($params['autocreate']) && $params['autocreate'] === true) {
$this->container = $this->objectStoreService->createContainer($params['container']);
} else {
throw $ex;
}
}
}
/**
* @return string the container name where objects are stored
*/
public function getStorageId() {
return $this->container->name;
}
/**
* @param string $urn the unified resource name used to identify the object
* @param resource $stream stream with the data to write
* @throws Exception from openstack lib when something goes wrong
*/
public function writeObject($urn, $stream) {
$this->container->uploadObject($urn, $stream);
}
/**
* @param string $urn the unified resource name used to identify the object
* @return resource stream with the read data
* @throws Exception from openstack lib when something goes wrong
*/
public function readObject($urn) {
$object = $this->container->getObject($urn);
// we need to keep a reference to objectContent or
// the stream will be closed before we can do anything with it
/** @var $objectContent \Guzzle\Http\EntityBody * */
$objectContent = $object->getContent();
$objectContent->rewind();
// directly returning the object stream does not work because the GC seems to collect it, so we need a copy
$tmpStream = fopen('php://temp', 'r+');
stream_copy_to_stream($objectContent->getStream(), $tmpStream);
rewind($tmpStream);
return $tmpStream;
}
/**
* @param string $urn Unified Resource Name
* @return void
* @throws Exception from openstack lib when something goes wrong
*/
public function deleteObject($urn) {
$object = $this->container->getObject($urn);
$object->delete();
}
public function deleteContainer($recursive = false) {
$this->container->delete($recursive);
}
}
|