summaryrefslogtreecommitdiffstats
path: root/lib/private/files/objectstore/swift.php
blob: 53367367af0ea93d278127f00806b170e150f31c (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
<?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 OpenCloud\OpenStack;

class Swift extends AbstractObjectStore {

	/**
	 * @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;
			}
		}

		//set the user via parent constructor, also initializes the root of the filecache
		parent::__construct($params);
	}

	/**
	 * @param string $urn Unified Resource Name
	 * @return void
	 * @throws Exception from openstack lib when something goes wrong
	 */
	protected function deleteObject($urn) {
		$object = $this->container->getObject($urn);
		$object->delete();
	}

	/**
	 * @param string $urn Unified Resource Name
	 * @param string $tmpFile
	 * @return void
	 * @throws Exception from openstack lib when something goes wrong
	 */
	protected function getObject($urn, $tmpFile) {
		$object = $this->container->getObject($urn);

		/** @var $objectContent \Guzzle\Http\EntityBody **/
		$objectContent = $object->getContent();

		$objectContent->rewind();
		$stream = $objectContent->getStream();
		file_put_contents($tmpFile, $stream);
	}

	/**
	 * @param string $urn Unified Resource Name
	 * @param string $tmpFile
	 * @return void
	 * @throws Exception from openstack lib when something goes wrong
	 */
	protected function createObject($urn, $tmpFile = null) {
		$fileData = '';
		if ($tmpFile) {
			$fileData = fopen($tmpFile, 'r');
		}

		$this->container->uploadObject($urn, $fileData);
	}

	public function deleteContainer($recursive = false) {
		$this->container->delete($recursive);
	}

}