blob: ac1859a302d34d6c45e552a6c82a82749f03c158 [file] [log] [blame]
dwalleck5d734432012-10-04 01:11:47 -05001# vim: tabstop=4 shiftwidth=4 softtabstop=4
2
3# Copyright 2012 OpenStack, LLC
4# All Rights Reserved.
5#
6# Licensed under the Apache License, Version 2.0 (the "License"); you may
7# not use this file except in compliance with the License. You may obtain
8# a copy of the License at
9#
10# http://www.apache.org/licenses/LICENSE-2.0
11#
12# Unless required by applicable law or agreed to in writing, software
13# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
14# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
15# License for the specific language governing permissions and limitations
16# under the License.
17
ravikumar-venkatesane43b77a2013-01-09 07:27:13 +000018from hashlib import sha1
19import hmac
harika-vakadi1a9ad612012-12-14 19:12:08 +053020import httplib2
Attila Fazekas85d03632013-02-12 08:54:58 +010021from urlparse import urlparse
22
dwalleck5d734432012-10-04 01:11:47 -050023from tempest.common.rest_client import RestClient
harika-vakadi6ab397b2012-12-20 12:16:17 +053024from tempest import exceptions
dwalleck5d734432012-10-04 01:11:47 -050025
26
27class ObjectClient(RestClient):
28 def __init__(self, config, username, password, auth_url, tenant_name=None):
29 super(ObjectClient, self).__init__(config, username, password,
30 auth_url, tenant_name)
31
32 self.service = self.config.object_storage.catalog_type
33
34 def create_object(self, container, object_name, data):
Sean Daguef237ccb2013-01-04 15:19:14 -050035 """Create storage object."""
dwalleck5d734432012-10-04 01:11:47 -050036
37 url = "%s/%s" % (str(container), str(object_name))
38 resp, body = self.put(url, data, self.headers)
39 return resp, body
40
41 def update_object(self, container, object_name, data):
Sean Daguef237ccb2013-01-04 15:19:14 -050042 """Upload data to replace current storage object."""
Attila Fazekasfa756cb2013-02-12 10:52:42 +010043 return self.create_object(container, object_name, data)
dwalleck5d734432012-10-04 01:11:47 -050044
45 def delete_object(self, container, object_name):
Sean Daguef237ccb2013-01-04 15:19:14 -050046 """Delete storage object."""
dwalleck5d734432012-10-04 01:11:47 -050047 url = "%s/%s" % (str(container), str(object_name))
48 resp, body = self.delete(url)
49 return resp, body
50
51 def update_object_metadata(self, container, object_name, metadata,
52 metadata_prefix='X-Object-Meta-'):
Sean Daguef237ccb2013-01-04 15:19:14 -050053 """Add, remove, or change X-Object-Meta metadata for storage object."""
dwalleck5d734432012-10-04 01:11:47 -050054
55 headers = {}
56 for key in metadata:
57 headers["%s%s" % (str(metadata_prefix), str(key))] = metadata[key]
58
59 url = "%s/%s" % (str(container), str(object_name))
60 resp, body = self.post(url, None, headers=headers)
61 return resp, body
62
63 def list_object_metadata(self, container, object_name):
Sean Daguef237ccb2013-01-04 15:19:14 -050064 """List all storage object X-Object-Meta- metadata."""
dwalleck5d734432012-10-04 01:11:47 -050065
66 url = "%s/%s" % (str(container), str(object_name))
67 resp, body = self.head(url)
68 return resp, body
Larisa Ustalov6c3c7802012-11-05 12:25:19 +020069
70 def get_object(self, container, object_name):
71 """Retrieve object's data."""
72
73 url = "{0}/{1}".format(container, object_name)
74 resp, body = self.get(url)
75 return resp, body
76
rajalakshmi-ganesan925e2392012-11-30 19:17:24 +053077 def copy_object_in_same_container(self, container, src_object_name,
78 dest_object_name, metadata=None):
Sean Daguef237ccb2013-01-04 15:19:14 -050079 """Copy storage object's data to the new object using PUT."""
Larisa Ustalov6c3c7802012-11-05 12:25:19 +020080
81 url = "{0}/{1}".format(container, dest_object_name)
82 headers = {}
83 headers['X-Copy-From'] = "%s/%s" % (str(container),
84 str(src_object_name))
85 headers['content-length'] = '0'
86 if metadata:
87 for key in metadata:
88 headers[str(key)] = metadata[key]
89
90 resp, body = self.put(url, None, headers=headers)
91 return resp, body
92
rajalakshmi-ganesan925e2392012-11-30 19:17:24 +053093 def copy_object_across_containers(self, src_container, src_object_name,
94 dst_container, dst_object_name,
95 metadata=None):
Sean Daguef237ccb2013-01-04 15:19:14 -050096 """Copy storage object's data to the new object using PUT."""
rajalakshmi-ganesan925e2392012-11-30 19:17:24 +053097
98 url = "{0}/{1}".format(dst_container, dst_object_name)
99 headers = {}
100 headers['X-Copy-From'] = "%s/%s" % (str(src_container),
101 str(src_object_name))
102 headers['content-length'] = '0'
103 if metadata:
104 for key in metadata:
105 headers[str(key)] = metadata[key]
106
107 resp, body = self.put(url, None, headers=headers)
108 return resp, body
109
Larisa Ustalov6c3c7802012-11-05 12:25:19 +0200110 def copy_object_2d_way(self, container, src_object_name, dest_object_name,
111 metadata=None):
Sean Daguef237ccb2013-01-04 15:19:14 -0500112 """Copy storage object's data to the new object using COPY."""
Larisa Ustalov6c3c7802012-11-05 12:25:19 +0200113
114 url = "{0}/{1}".format(container, src_object_name)
115 headers = {}
116 headers['Destination'] = "%s/%s" % (str(container),
117 str(dest_object_name))
118 if metadata:
119 for key in metadata:
120 headers[str(key)] = metadata[key]
121
122 resp, body = self.copy(url, headers=headers)
123 return resp, body
harika-vakadi1a9ad612012-12-14 19:12:08 +0530124
ravikumar-venkatesane43b77a2013-01-09 07:27:13 +0000125 def get_object_using_temp_url(self, container, object_name, expires, key):
126 """Retrieve object's data using temp URL."""
127
128 self._set_auth()
129 method = 'GET'
130 path = "%s/%s/%s" % (urlparse(self.base_url).path, container,
131 object_name)
132 hmac_body = '%s\n%s\n%s' % (method, expires, path)
133 sig = hmac.new(key, hmac_body, sha1).hexdigest()
134
135 url = "%s/%s?temp_url_sig=%s&temp_url_expires=%s" % (container,
136 object_name,
137 sig, expires)
138
139 resp, body = self.get(url)
Pavel Sedlák492e83a2013-01-22 11:03:11 +0100140 return resp, body
harika-vakadi7cfc5182013-01-16 13:59:25 +0530141
142 def create_object_segments(self, container, object_name, segment, data):
143 """Creates object segments."""
144 url = "{0}/{1}/{2}".format(container, object_name, segment)
145 resp, body = self.put(url, data, self.headers)
ravikumar-venkatesane43b77a2013-01-09 07:27:13 +0000146 return resp, body
147
harika-vakadi1a9ad612012-12-14 19:12:08 +0530148
149class ObjectClientCustomizedHeader(RestClient):
150
151 def __init__(self, config, username, password, auth_url, tenant_name=None):
152 super(ObjectClientCustomizedHeader, self).__init__(config, username,
153 password, auth_url,
154 tenant_name)
155 #Overwrites json-specific header encoding in RestClient
156 self.service = self.config.object_storage.catalog_type
157 self.format = 'json'
158
159 def request(self, method, url, headers=None, body=None, wait=None):
160 """A simple HTTP request interface."""
Jay Pipescd8eaec2013-01-16 21:03:48 -0500161 dscv = self.config.identity.disable_ssl_certificate_validation
162 self.http_obj = httplib2.Http(disable_ssl_certificate_validation=dscv)
harika-vakadi1a9ad612012-12-14 19:12:08 +0530163 if headers is None:
164 headers = {}
165 if self.base_url is None:
166 self._set_auth()
167
168 req_url = "%s/%s" % (self.base_url, url)
Attila Fazekas11d2a772013-01-29 17:46:52 +0100169 self._log_request(method, req_url, headers, body)
harika-vakadi1a9ad612012-12-14 19:12:08 +0530170 resp, resp_body = self.http_obj.request(req_url, method,
171 headers=headers, body=body)
Attila Fazekas11d2a772013-01-29 17:46:52 +0100172 self._log_response(resp, resp_body)
harika-vakadi6ab397b2012-12-20 12:16:17 +0530173 if resp.status == 401 or resp.status == 403:
harika-vakadi6ab397b2012-12-20 12:16:17 +0530174 raise exceptions.Unauthorized()
175
harika-vakadi1a9ad612012-12-14 19:12:08 +0530176 return resp, resp_body
177
178 def get_object(self, container, object_name, metadata=None):
179 """Retrieve object's data."""
180 headers = {}
181 if metadata:
182 for key in metadata:
183 headers[str(key)] = metadata[key]
184
185 url = "{0}/{1}".format(container, object_name)
186 resp, body = self.get(url, headers=headers)
187 return resp, body
harika-vakadi6ab397b2012-12-20 12:16:17 +0530188
189 def create_object(self, container, object_name, data, metadata=None):
Sean Daguef237ccb2013-01-04 15:19:14 -0500190 """Create storage object."""
harika-vakadi6ab397b2012-12-20 12:16:17 +0530191
192 headers = {}
193 if metadata:
194 for key in metadata:
195 headers[str(key)] = metadata[key]
196
197 url = "%s/%s" % (str(container), str(object_name))
198 resp, body = self.put(url, data, headers=headers)
199 return resp, body
200
harika-vakadi2daed0a2013-01-01 20:51:39 +0530201 def delete_object(self, container, object_name, metadata=None):
Sean Daguef237ccb2013-01-04 15:19:14 -0500202 """Delete storage object."""
harika-vakadi6ab397b2012-12-20 12:16:17 +0530203
harika-vakadi2daed0a2013-01-01 20:51:39 +0530204 headers = {}
205 if metadata:
206 for key in metadata:
207 headers[str(key)] = metadata[key]
208
harika-vakadi6ab397b2012-12-20 12:16:17 +0530209 url = "%s/%s" % (str(container), str(object_name))
harika-vakadi2daed0a2013-01-01 20:51:39 +0530210 resp, body = self.delete(url, headers=headers)
harika-vakadi6ab397b2012-12-20 12:16:17 +0530211 return resp, body