35 |
35 |
# or implied, of GRNET S.A.
|
36 |
36 |
|
37 |
37 |
from collections import defaultdict
|
38 |
|
from urllib import quote
|
|
38 |
from urllib import quote, unquote
|
39 |
39 |
from functools import partial
|
40 |
40 |
|
41 |
41 |
from pithos.api.test import (PithosAPITest, pithos_settings,
|
... | ... | |
60 |
60 |
|
61 |
61 |
|
62 |
62 |
class ObjectHead(PithosAPITest):
|
63 |
|
def setUp(self):
|
|
63 |
def test_get_object_meta(self):
|
64 |
64 |
cname = self.create_container()[0]
|
65 |
65 |
oname, odata = self.upload_object(cname)[:-1]
|
66 |
66 |
|
67 |
|
url = join_urls(self.pithos_path, cname, oname)
|
|
67 |
url = join_urls(self.pithos_path, self.user, cname, oname)
|
|
68 |
r = self.head(url)
|
|
69 |
|
|
70 |
mandatory = ['Etag',
|
|
71 |
'Content-Length',
|
|
72 |
'Content-Type',
|
|
73 |
'Last-Modified',
|
|
74 |
'X-Object-Hash',
|
|
75 |
'X-Object-UUID',
|
|
76 |
'X-Object-Version',
|
|
77 |
'X-Object-Version-Timestamp',
|
|
78 |
'X-Object-Modified-By']
|
|
79 |
for i in mandatory:
|
|
80 |
self.assertTrue(i in r)
|
|
81 |
|
|
82 |
r = self.post(url, content_type='',
|
|
83 |
HTTP_CONTENT_ENCODING='gzip',
|
|
84 |
HTTP_CONTENT_DISPOSITION=(
|
|
85 |
'attachment; filename="%s"' % oname))
|
|
86 |
self.assertEqual(r.status_code, 202)
|
|
87 |
|
68 |
88 |
r = self.head(url)
|
69 |
|
map(lambda i: self.assertTrue(i in r),
|
70 |
|
['Etag',
|
71 |
|
'Content-Length',
|
72 |
|
'Content-Type',
|
73 |
|
'Last-Modified',
|
74 |
|
'Content-Encoding',
|
75 |
|
'Content-Disposition',
|
76 |
|
'X-Object-Hash',
|
77 |
|
'X-Object-UUID',
|
78 |
|
'X-Object-Version',
|
79 |
|
'X-Object-Version-Timestamp',
|
80 |
|
'X-Object-Modified-By',
|
81 |
|
'X-Object-Manifest'])
|
|
89 |
for i in mandatory:
|
|
90 |
self.assertTrue(i in r)
|
|
91 |
self.assertTrue('Content-Encoding' in r)
|
|
92 |
self.assertEqual(r['Content-Encoding'], 'gzip')
|
|
93 |
self.assertTrue('Content-Disposition' in r)
|
|
94 |
self.assertEqual(unquote(r['Content-Disposition']),
|
|
95 |
'attachment; filename="%s"' % oname)
|
|
96 |
|
|
97 |
prefix = 'myobject/'
|
|
98 |
data = ''
|
|
99 |
for i in range(random.randint(2, 10)):
|
|
100 |
part = '%s%d' % (prefix, i)
|
|
101 |
data += self.upload_object(cname, oname=part)[1]
|
|
102 |
|
|
103 |
manifest = '%s/%s' % (cname, prefix)
|
|
104 |
oname = get_random_name()
|
|
105 |
url = join_urls(self.pithos_path, self.user, cname, oname)
|
|
106 |
r = self.put(url, data='', HTTP_X_OBJECT_MANIFEST=manifest)
|
|
107 |
self.assertEqual(r.status_code, 201)
|
|
108 |
|
|
109 |
r = self.head(url)
|
|
110 |
for i in mandatory:
|
|
111 |
self.assertTrue(i in r)
|
|
112 |
self.assertTrue('X-Object-Manifest' in r)
|
|
113 |
self.assertEqual(r['X-Object-Manifest'], manifest)
|
82 |
114 |
|
83 |
115 |
|
84 |
116 |
class ObjectGet(PithosAPITest):
|
... | ... | |
702 |
734 |
self.assertEqual(r.content, data)
|
703 |
735 |
|
704 |
736 |
|
705 |
|
class ObjectCopy(PithosAPITest):
|
|
737 |
class ObjectPutCopy(PithosAPITest):
|
706 |
738 |
def setUp(self):
|
707 |
739 |
PithosAPITest.setUp(self)
|
708 |
740 |
self.container = 'c1'
|
... | ... | |
761 |
793 |
self.assertTrue('X-Object-Hash' in r)
|
762 |
794 |
self.assertEqual(r['X-Object-Hash'], self.etag)
|
763 |
795 |
|
|
796 |
def test_copy_from_other_account(self):
|
|
797 |
cname = 'c2'
|
|
798 |
self.create_container(cname, user='chuck')
|
|
799 |
self.create_container(cname, user='alice')
|
|
800 |
|
|
801 |
# share object for read with alice
|
|
802 |
url = join_urls(self.pithos_path, self.user, self.container,
|
|
803 |
self.object)
|
|
804 |
r = self.post(url, content_type='', HTTP_CONTENT_RANGE='bytes */*',
|
|
805 |
HTTP_X_OBJECT_SHARING='read=alice')
|
|
806 |
self.assertEqual(r.status_code, 202)
|
|
807 |
|
|
808 |
# assert not allowed for chuck
|
|
809 |
oname = get_random_name()
|
|
810 |
url = join_urls(self.pithos_path, 'chuck', cname, oname)
|
|
811 |
r = self.put(url, data='', user='chuck',
|
|
812 |
HTTP_X_OBJECT_META_TEST='testcopy',
|
|
813 |
HTTP_X_COPY_FROM='/%s/%s' % (
|
|
814 |
self.container, self.object),
|
|
815 |
HTTP_X_SOURCE_ACCOUNT='user')
|
|
816 |
|
|
817 |
self.assertEqual(r.status_code, 403)
|
|
818 |
|
|
819 |
# assert copy success for alice
|
|
820 |
url = join_urls(self.pithos_path, 'alice', cname, oname)
|
|
821 |
r = self.put(url, data='', user='alice',
|
|
822 |
HTTP_X_OBJECT_META_TEST='testcopy',
|
|
823 |
HTTP_X_COPY_FROM='/%s/%s' % (
|
|
824 |
self.container, self.object),
|
|
825 |
HTTP_X_SOURCE_ACCOUNT='user')
|
|
826 |
self.assertEqual(r.status_code, 201)
|
|
827 |
|
|
828 |
# assert access the new object
|
|
829 |
r = self.head(url, user='alice')
|
|
830 |
self.assertEqual(r.status_code, 200)
|
|
831 |
self.assertTrue('X-Object-Meta-Test' in r)
|
|
832 |
self.assertEqual(r['X-Object-Meta-Test'], 'testcopy')
|
|
833 |
|
|
834 |
# assert etag is the same
|
|
835 |
self.assertTrue('X-Object-Hash' in r)
|
|
836 |
self.assertEqual(r['X-Object-Hash'], self.etag)
|
|
837 |
|
|
838 |
# share object for write
|
|
839 |
url = join_urls(self.pithos_path, self.user, self.container,
|
|
840 |
self.object)
|
|
841 |
r = self.post(url, content_type='', HTTP_CONTENT_RANGE='bytes */*',
|
|
842 |
HTTP_X_OBJECT_SHARING='write=dan')
|
|
843 |
self.assertEqual(r.status_code, 202)
|
|
844 |
|
|
845 |
# assert not allowed copy for alice
|
|
846 |
url = join_urls(self.pithos_path, 'alice', cname, oname)
|
|
847 |
r = self.put(url, data='', user='alice',
|
|
848 |
HTTP_X_OBJECT_META_TEST='testcopy',
|
|
849 |
HTTP_X_COPY_FROM='/%s/%s' % (
|
|
850 |
self.container, self.object),
|
|
851 |
HTTP_X_SOURCE_ACCOUNT='user')
|
|
852 |
self.assertEqual(r.status_code, 403)
|
|
853 |
|
|
854 |
# assert allowed copy for dan
|
|
855 |
self.create_container(cname, user='dan')
|
|
856 |
url = join_urls(self.pithos_path, 'dan', cname, oname)
|
|
857 |
r = self.put(url, data='', user='dan',
|
|
858 |
HTTP_X_OBJECT_META_TEST='testcopy',
|
|
859 |
HTTP_X_COPY_FROM='/%s/%s' % (
|
|
860 |
self.container, self.object),
|
|
861 |
HTTP_X_SOURCE_ACCOUNT='user')
|
|
862 |
self.assertEqual(r.status_code, 201)
|
|
863 |
|
|
864 |
# assert access the new object
|
|
865 |
r = self.head(url, user='dan')
|
|
866 |
self.assertEqual(r.status_code, 200)
|
|
867 |
self.assertTrue('X-Object-Meta-Test' in r)
|
|
868 |
self.assertEqual(r['X-Object-Meta-Test'], 'testcopy')
|
|
869 |
|
|
870 |
# assert etag is the same
|
|
871 |
self.assertTrue('X-Object-Hash' in r)
|
|
872 |
self.assertEqual(r['X-Object-Hash'], self.etag)
|
|
873 |
|
|
874 |
# assert source object still exists
|
|
875 |
url = join_urls(self.pithos_path, self.user, self.container,
|
|
876 |
self.object)
|
|
877 |
r = self.head(url)
|
|
878 |
self.assertEqual(r.status_code, 200)
|
|
879 |
# assert etag is the same
|
|
880 |
self.assertTrue('X-Object-Hash' in r)
|
|
881 |
self.assertEqual(r['X-Object-Hash'], self.etag)
|
|
882 |
|
|
883 |
r = self.get(url)
|
|
884 |
self.assertEqual(r.status_code, 200)
|
|
885 |
# assert etag is the same
|
|
886 |
self.assertTrue('X-Object-Hash' in r)
|
|
887 |
self.assertEqual(r['X-Object-Hash'], self.etag)
|
|
888 |
|
764 |
889 |
def test_copy_invalid(self):
|
765 |
890 |
# copy from non-existent object
|
766 |
891 |
oname = get_random_name()
|
... | ... | |
822 |
947 |
self.assertEqual(r.status_code, 404)
|
823 |
948 |
|
824 |
949 |
|
825 |
|
class ObjectMove(PithosAPITest):
|
|
950 |
class ObjectPutMove(PithosAPITest):
|
826 |
951 |
def setUp(self):
|
827 |
952 |
PithosAPITest.setUp(self)
|
828 |
953 |
self.container = 'c1'
|
... | ... | |
901 |
1026 |
r = self.head(url)
|
902 |
1027 |
self.assertEqual(r.status_code, 404)
|
903 |
1028 |
|
|
1029 |
def test_move_from_other_account(self):
|
|
1030 |
cname = 'c2'
|
|
1031 |
self.create_container(cname, user='chuck')
|
|
1032 |
self.create_container(cname, user='alice')
|
|
1033 |
|
|
1034 |
# share object for read with alice
|
|
1035 |
url = join_urls(self.pithos_path, self.user, self.container,
|
|
1036 |
self.object)
|
|
1037 |
r = self.post(url, content_type='', HTTP_CONTENT_RANGE='bytes */*',
|
|
1038 |
HTTP_X_OBJECT_SHARING='read=alice')
|
|
1039 |
self.assertEqual(r.status_code, 202)
|
|
1040 |
|
|
1041 |
# assert not allowed move for chuck
|
|
1042 |
oname = get_random_name()
|
|
1043 |
url = join_urls(self.pithos_path, 'chuck', cname, oname)
|
|
1044 |
r = self.put(url, data='', user='chuck',
|
|
1045 |
HTTP_X_OBJECT_META_TEST='testcopy',
|
|
1046 |
HTTP_X_MOVE_FROM='/%s/%s' % (
|
|
1047 |
self.container, self.object),
|
|
1048 |
HTTP_X_SOURCE_ACCOUNT='user')
|
|
1049 |
|
|
1050 |
self.assertEqual(r.status_code, 403)
|
|
1051 |
|
|
1052 |
# assert no new object was created
|
|
1053 |
r = self.head(url, user='chuck')
|
|
1054 |
self.assertEqual(r.status_code, 404)
|
|
1055 |
|
|
1056 |
# assert not allowed move for alice
|
|
1057 |
url = join_urls(self.pithos_path, 'alice', cname, oname)
|
|
1058 |
r = self.put(url, data='', user='alice',
|
|
1059 |
HTTP_X_OBJECT_META_TEST='testcopy',
|
|
1060 |
HTTP_X_MOVE_FROM='/%s/%s' % (
|
|
1061 |
self.container, self.object),
|
|
1062 |
HTTP_X_SOURCE_ACCOUNT='user')
|
|
1063 |
self.assertEqual(r.status_code, 403)
|
|
1064 |
|
|
1065 |
# assert no new object was created
|
|
1066 |
r = self.head(url, user='alice')
|
|
1067 |
self.assertEqual(r.status_code, 404)
|
|
1068 |
|
|
1069 |
# share object for write with dan
|
|
1070 |
url = join_urls(self.pithos_path, self.user, self.container,
|
|
1071 |
self.object)
|
|
1072 |
r = self.post(url, content_type='', HTTP_CONTENT_RANGE='bytes */*',
|
|
1073 |
HTTP_X_OBJECT_SHARING='write=dan')
|
|
1074 |
self.assertEqual(r.status_code, 202)
|
|
1075 |
|
|
1076 |
# assert not allowed move for alice
|
|
1077 |
url = join_urls(self.pithos_path, 'alice', cname, oname)
|
|
1078 |
r = self.put(url, data='', user='alice',
|
|
1079 |
HTTP_X_OBJECT_META_TEST='testcopy',
|
|
1080 |
HTTP_X_MOVE_FROM='/%s/%s' % (
|
|
1081 |
self.container, self.object),
|
|
1082 |
HTTP_X_SOURCE_ACCOUNT='user')
|
|
1083 |
self.assertEqual(r.status_code, 403)
|
|
1084 |
|
|
1085 |
# assert no new object was created
|
|
1086 |
r = self.head(url, user='alice')
|
|
1087 |
self.assertEqual(r.status_code, 404)
|
|
1088 |
|
|
1089 |
# assert not allowed move for dan
|
|
1090 |
self.create_container(cname, user='dan')
|
|
1091 |
url = join_urls(self.pithos_path, 'dan', cname, oname)
|
|
1092 |
r = self.put(url, data='', user='dan',
|
|
1093 |
HTTP_X_OBJECT_META_TEST='testcopy',
|
|
1094 |
HTTP_X_MOVE_FROM='/%s/%s' % (
|
|
1095 |
self.container, self.object),
|
|
1096 |
HTTP_X_SOURCE_ACCOUNT='user')
|
|
1097 |
self.assertEqual(r.status_code, 403)
|
|
1098 |
|
|
1099 |
# assert no new object was created
|
|
1100 |
r = self.head(url, user='dan')
|
|
1101 |
self.assertEqual(r.status_code, 404)
|
|
1102 |
|
|
1103 |
|
|
1104 |
class ObjectCopy(PithosAPITest):
|
|
1105 |
def setUp(self):
|
|
1106 |
PithosAPITest.setUp(self)
|
|
1107 |
self.container = 'c1'
|
|
1108 |
self.create_container(self.container)
|
|
1109 |
self.object, self.data = self.upload_object(self.container)[:-1]
|
|
1110 |
|
|
1111 |
url = join_urls(
|
|
1112 |
self.pithos_path, self.user, self.container, self.object)
|
|
1113 |
r = self.head(url)
|
|
1114 |
self.etag = r['X-Object-Hash']
|
|
1115 |
|
|
1116 |
def test_copy(self):
|
|
1117 |
with AssertMappingInvariant(self.get_object_info, self.container,
|
|
1118 |
self.object):
|
|
1119 |
oname = get_random_name()
|
|
1120 |
# copy object
|
|
1121 |
url = join_urls(self.pithos_path, self.user, self.container,
|
|
1122 |
self.object)
|
|
1123 |
r = self.copy(url, HTTP_X_OBJECT_META_TEST='testcopy',
|
|
1124 |
HTTP_DESTINATION='/%s/%s' % (self.container,
|
|
1125 |
oname))
|
|
1126 |
# assert copy success
|
|
1127 |
url = join_urls(self.pithos_path, self.user, self.container,
|
|
1128 |
oname)
|
|
1129 |
self.assertEqual(r.status_code, 201)
|
|
1130 |
|
|
1131 |
# assert access the new object
|
|
1132 |
r = self.head(url)
|
|
1133 |
self.assertEqual(r.status_code, 200)
|
|
1134 |
self.assertTrue('X-Object-Meta-Test' in r)
|
|
1135 |
self.assertEqual(r['X-Object-Meta-Test'], 'testcopy')
|
|
1136 |
|
|
1137 |
# assert etag is the same
|
|
1138 |
self.assertTrue('X-Object-Hash' in r)
|
|
1139 |
self.assertEqual(r['X-Object-Hash'], self.etag)
|
|
1140 |
|
|
1141 |
# assert source object still exists
|
|
1142 |
url = join_urls(self.pithos_path, self.user, self.container,
|
|
1143 |
self.object)
|
|
1144 |
r = self.head(url)
|
|
1145 |
self.assertEqual(r.status_code, 200)
|
|
1146 |
|
|
1147 |
# assert etag is the same
|
|
1148 |
self.assertTrue('X-Object-Hash' in r)
|
|
1149 |
self.assertEqual(r['X-Object-Hash'], self.etag)
|
|
1150 |
|
|
1151 |
r = self.get(url)
|
|
1152 |
self.assertEqual(r.status_code, 200)
|
|
1153 |
|
|
1154 |
# assert etag is the same
|
|
1155 |
self.assertTrue('X-Object-Hash' in r)
|
|
1156 |
self.assertEqual(r['X-Object-Hash'], self.etag)
|
|
1157 |
|
|
1158 |
# copy object to other container (not existing)
|
|
1159 |
cname = get_random_name()
|
|
1160 |
url = join_urls(self.pithos_path, self.user, self.container,
|
|
1161 |
self.object)
|
|
1162 |
r = self.copy(url, HTTP_X_OBJECT_META_TEST='testcopy',
|
|
1163 |
HTTP_DESTINATION='/%s/%s' % (cname, self.object))
|
|
1164 |
|
|
1165 |
# assert destination container does not exist
|
|
1166 |
url = join_urls(self.pithos_path, self.user, cname,
|
|
1167 |
self.object)
|
|
1168 |
self.assertEqual(r.status_code, 404)
|
|
1169 |
|
|
1170 |
# create container
|
|
1171 |
self.create_container(cname)
|
|
1172 |
|
|
1173 |
# copy object to other container (existing)
|
|
1174 |
url = join_urls(self.pithos_path, self.user, self.container,
|
|
1175 |
self.object)
|
|
1176 |
r = self.copy(url, HTTP_X_OBJECT_META_TEST='testcopy',
|
|
1177 |
HTTP_DESTINATION='/%s/%s' % (cname, self.object))
|
|
1178 |
|
|
1179 |
# assert copy success
|
|
1180 |
url = join_urls(self.pithos_path, self.user, cname,
|
|
1181 |
self.object)
|
|
1182 |
self.assertEqual(r.status_code, 201)
|
|
1183 |
|
|
1184 |
# assert access the new object
|
|
1185 |
r = self.head(url)
|
|
1186 |
self.assertEqual(r.status_code, 200)
|
|
1187 |
self.assertTrue('X-Object-Meta-Test' in r)
|
|
1188 |
self.assertEqual(r['X-Object-Meta-Test'], 'testcopy')
|
|
1189 |
|
|
1190 |
# assert etag is the same
|
|
1191 |
self.assertTrue('X-Object-Hash' in r)
|
|
1192 |
self.assertEqual(r['X-Object-Hash'], self.etag)
|
|
1193 |
|
|
1194 |
# assert source object still exists
|
|
1195 |
url = join_urls(self.pithos_path, self.user, self.container,
|
|
1196 |
self.object)
|
|
1197 |
r = self.head(url)
|
|
1198 |
self.assertEqual(r.status_code, 200)
|
|
1199 |
|
|
1200 |
# assert etag is the same
|
|
1201 |
self.assertTrue('X-Object-Hash' in r)
|
|
1202 |
self.assertEqual(r['X-Object-Hash'], self.etag)
|
|
1203 |
|
|
1204 |
r = self.get(url)
|
|
1205 |
self.assertEqual(r.status_code, 200)
|
|
1206 |
|
|
1207 |
# assert etag is the same
|
|
1208 |
self.assertTrue('X-Object-Hash' in r)
|
|
1209 |
self.assertEqual(r['X-Object-Hash'], self.etag)
|
|
1210 |
|
|
1211 |
def test_copy_to_other_account(self):
|
|
1212 |
# create a container under alice account
|
|
1213 |
cname = self.create_container(user='alice')[0]
|
|
1214 |
|
|
1215 |
# create a folder under this container
|
|
1216 |
folder = self.create_folder(cname, user='alice')[0]
|
|
1217 |
|
|
1218 |
oname = get_random_name()
|
|
1219 |
|
|
1220 |
# copy object to other account container
|
|
1221 |
url = join_urls(self.pithos_path, self.user, self.container,
|
|
1222 |
self.object)
|
|
1223 |
r = self.copy(url, HTTP_X_OBJECT_META_TEST='testcopy',
|
|
1224 |
HTTP_DESTINATION='/%s/%s/%s' % (cname, folder, oname),
|
|
1225 |
HTTP_DESTINATION_ACCOUNT='alice')
|
|
1226 |
self.assertEqual(r.status_code, 403)
|
|
1227 |
|
|
1228 |
# share object for read with user
|
|
1229 |
url = join_urls(self.pithos_path, 'alice', cname, folder)
|
|
1230 |
r = self.post(url, user='alice', content_type='',
|
|
1231 |
HTTP_CONTENT_RANGE='bytes */*',
|
|
1232 |
HTTP_X_OBJECT_SHARING='read=%s' % self.user)
|
|
1233 |
self.assertEqual(r.status_code, 202)
|
|
1234 |
|
|
1235 |
# assert copy object still is not allowed
|
|
1236 |
url = join_urls(self.pithos_path, self.user, self.container,
|
|
1237 |
self.object)
|
|
1238 |
r = self.copy(url, HTTP_X_OBJECT_META_TEST='testcopy',
|
|
1239 |
HTTP_DESTINATION='/%s/%s/%s' % (cname, folder, oname),
|
|
1240 |
HTTP_DESTINATION_ACCOUNT='alice')
|
|
1241 |
self.assertEqual(r.status_code, 403)
|
|
1242 |
|
|
1243 |
# share object for write with user
|
|
1244 |
url = join_urls(self.pithos_path, 'alice', cname, folder)
|
|
1245 |
r = self.post(url, user='alice', content_type='',
|
|
1246 |
HTTP_CONTENT_RANGE='bytes */*',
|
|
1247 |
HTTP_X_OBJECT_SHARING='write=%s' % self.user)
|
|
1248 |
self.assertEqual(r.status_code, 202)
|
|
1249 |
|
|
1250 |
# assert copy object now is allowed
|
|
1251 |
url = join_urls(self.pithos_path, self.user, self.container,
|
|
1252 |
self.object)
|
|
1253 |
r = self.copy(url, HTTP_X_OBJECT_META_TEST='testcopy',
|
|
1254 |
HTTP_DESTINATION='/%s/%s/%s' % (cname, folder, oname),
|
|
1255 |
HTTP_DESTINATION_ACCOUNT='alice')
|
|
1256 |
self.assertEqual(r.status_code, 201)
|
|
1257 |
|
|
1258 |
# assert access the new object
|
|
1259 |
url = join_urls(self.pithos_path, 'alice', cname, folder, oname)
|
|
1260 |
r = self.head(url, user='alice')
|
|
1261 |
self.assertEqual(r.status_code, 200)
|
|
1262 |
self.assertTrue('X-Object-Meta-Test' in r)
|
|
1263 |
self.assertEqual(r['X-Object-Meta-Test'], 'testcopy')
|
|
1264 |
|
|
1265 |
# assert etag is the same
|
|
1266 |
self.assertTrue('X-Object-Hash' in r)
|
|
1267 |
self.assertEqual(r['X-Object-Hash'], self.etag)
|
|
1268 |
|
|
1269 |
# assert source object still exists
|
|
1270 |
url = join_urls(self.pithos_path, self.user, self.container,
|
|
1271 |
self.object)
|
|
1272 |
r = self.head(url)
|
|
1273 |
self.assertEqual(r.status_code, 200)
|
|
1274 |
|
|
1275 |
# assert etag is the same
|
|
1276 |
self.assertTrue('X-Object-Hash' in r)
|
|
1277 |
self.assertEqual(r['X-Object-Hash'], self.etag)
|
|
1278 |
|
|
1279 |
r = self.get(url)
|
|
1280 |
self.assertEqual(r.status_code, 200)
|
|
1281 |
|
|
1282 |
# assert etag is the same
|
|
1283 |
self.assertTrue('X-Object-Hash' in r)
|
|
1284 |
self.assertEqual(r['X-Object-Hash'], self.etag)
|
|
1285 |
|
|
1286 |
|
|
1287 |
class ObjectMove(PithosAPITest):
|
|
1288 |
def setUp(self):
|
|
1289 |
PithosAPITest.setUp(self)
|
|
1290 |
self.container = 'c1'
|
|
1291 |
self.create_container(self.container)
|
|
1292 |
self.object, self.data = self.upload_object(self.container)[:-1]
|
|
1293 |
|
|
1294 |
url = join_urls(
|
|
1295 |
self.pithos_path, self.user, self.container, self.object)
|
|
1296 |
r = self.head(url)
|
|
1297 |
self.etag = r['X-Object-Hash']
|
|
1298 |
|
|
1299 |
def test_move(self):
|
|
1300 |
oname = get_random_name()
|
|
1301 |
|
|
1302 |
# move object
|
|
1303 |
url = join_urls(self.pithos_path, self.user, self.container,
|
|
1304 |
self.object)
|
|
1305 |
r = self.move(url, HTTP_X_OBJECT_META_TEST='testmove',
|
|
1306 |
HTTP_DESTINATION='/%s/%s' % (self.container,
|
|
1307 |
oname))
|
|
1308 |
# assert move success
|
|
1309 |
url = join_urls(self.pithos_path, self.user, self.container,
|
|
1310 |
oname)
|
|
1311 |
self.assertEqual(r.status_code, 201)
|
|
1312 |
|
|
1313 |
# assert access the new object
|
|
1314 |
r = self.head(url)
|
|
1315 |
self.assertEqual(r.status_code, 200)
|
|
1316 |
self.assertTrue('X-Object-Meta-Test' in r)
|
|
1317 |
self.assertEqual(r['X-Object-Meta-Test'], 'testmove')
|
|
1318 |
|
|
1319 |
# assert etag is the same
|
|
1320 |
self.assertTrue('X-Object-Hash' in r)
|
|
1321 |
self.assertEqual(r['X-Object-Hash'], self.etag)
|
|
1322 |
|
|
1323 |
# assert source object does not exist
|
|
1324 |
url = join_urls(self.pithos_path, self.user, self.container,
|
|
1325 |
self.object)
|
|
1326 |
r = self.head(url)
|
|
1327 |
self.assertEqual(r.status_code, 404)
|
|
1328 |
|
|
1329 |
def test_move_to_other_container(self):
|
|
1330 |
# move object to other container (not existing)
|
|
1331 |
cname = get_random_name()
|
|
1332 |
url = join_urls(self.pithos_path, self.user, self.container,
|
|
1333 |
self.object)
|
|
1334 |
r = self.move(url, HTTP_X_OBJECT_META_TEST='testmove',
|
|
1335 |
HTTP_DESTINATION='/%s/%s' % (cname, self.object))
|
|
1336 |
|
|
1337 |
# assert destination container does not exist
|
|
1338 |
url = join_urls(self.pithos_path, self.user, cname,
|
|
1339 |
self.object)
|
|
1340 |
self.assertEqual(r.status_code, 404)
|
|
1341 |
|
|
1342 |
# create container
|
|
1343 |
self.create_container(cname)
|
|
1344 |
|
|
1345 |
# move object to other container (existing)
|
|
1346 |
url = join_urls(self.pithos_path, self.user, self.container,
|
|
1347 |
self.object)
|
|
1348 |
r = self.move(url, HTTP_X_OBJECT_META_TEST='testmove',
|
|
1349 |
HTTP_DESTINATION='/%s/%s' % (cname, self.object))
|
|
1350 |
|
|
1351 |
# assert move success
|
|
1352 |
url = join_urls(self.pithos_path, self.user, cname,
|
|
1353 |
self.object)
|
|
1354 |
self.assertEqual(r.status_code, 201)
|
|
1355 |
|
|
1356 |
# assert access the new object
|
|
1357 |
r = self.head(url)
|
|
1358 |
self.assertEqual(r.status_code, 200)
|
|
1359 |
self.assertTrue('X-Object-Meta-Test' in r)
|
|
1360 |
self.assertEqual(r['X-Object-Meta-Test'], 'testmove')
|
|
1361 |
|
|
1362 |
# assert etag is the same
|
|
1363 |
self.assertTrue('X-Object-Hash' in r)
|
|
1364 |
self.assertEqual(r['X-Object-Hash'], self.etag)
|
|
1365 |
|
|
1366 |
# assert source object does not exist
|
|
1367 |
url = join_urls(self.pithos_path, self.user, self.container,
|
|
1368 |
self.object)
|
|
1369 |
r = self.head(url)
|
|
1370 |
self.assertEqual(r.status_code, 404)
|
|
1371 |
|
|
1372 |
def test_move_to_other_account(self):
|
|
1373 |
# create a container under alice account
|
|
1374 |
cname = self.create_container(user='alice')[0]
|
|
1375 |
|
|
1376 |
# create a folder under this container
|
|
1377 |
folder = self.create_folder(cname, user='alice')[0]
|
|
1378 |
|
|
1379 |
oname = get_random_name()
|
|
1380 |
|
|
1381 |
# move object to other account container
|
|
1382 |
url = join_urls(self.pithos_path, self.user, self.container,
|
|
1383 |
self.object)
|
|
1384 |
r = self.move(url, HTTP_X_OBJECT_META_TEST='testmove',
|
|
1385 |
HTTP_DESTINATION='/%s/%s/%s' % (cname, folder, oname),
|
|
1386 |
HTTP_DESTINATION_ACCOUNT='alice')
|
|
1387 |
self.assertEqual(r.status_code, 403)
|
|
1388 |
|
|
1389 |
# share object for read with user
|
|
1390 |
url = join_urls(self.pithos_path, 'alice', cname, folder)
|
|
1391 |
r = self.post(url, user='alice', content_type='',
|
|
1392 |
HTTP_CONTENT_RANGE='bytes */*',
|
|
1393 |
HTTP_X_OBJECT_SHARING='read=%s' % self.user)
|
|
1394 |
self.assertEqual(r.status_code, 202)
|
|
1395 |
|
|
1396 |
# assert move object still is not allowed
|
|
1397 |
url = join_urls(self.pithos_path, self.user, self.container,
|
|
1398 |
self.object)
|
|
1399 |
r = self.move(url, HTTP_X_OBJECT_META_TEST='testmove',
|
|
1400 |
HTTP_DESTINATION='/%s/%s/%s' % (cname, folder, oname),
|
|
1401 |
HTTP_DESTINATION_ACCOUNT='alice')
|
|
1402 |
self.assertEqual(r.status_code, 403)
|
|
1403 |
|
|
1404 |
# share object for write with user
|
|
1405 |
url = join_urls(self.pithos_path, 'alice', cname, folder)
|
|
1406 |
r = self.post(url, user='alice', content_type='',
|
|
1407 |
HTTP_CONTENT_RANGE='bytes */*',
|
|
1408 |
HTTP_X_OBJECT_SHARING='write=%s' % self.user)
|
|
1409 |
self.assertEqual(r.status_code, 202)
|
|
1410 |
|
|
1411 |
# assert move object now is allowed
|
|
1412 |
url = join_urls(self.pithos_path, self.user, self.container,
|
|
1413 |
self.object)
|
|
1414 |
r = self.move(url, HTTP_X_OBJECT_META_TEST='testmove',
|
|
1415 |
HTTP_DESTINATION='/%s/%s/%s' % (cname, folder, oname),
|
|
1416 |
HTTP_DESTINATION_ACCOUNT='alice')
|
|
1417 |
self.assertEqual(r.status_code, 201)
|
|
1418 |
|
|
1419 |
# assert source object does not exist
|
|
1420 |
url = join_urls(self.pithos_path, self.user, self.container,
|
|
1421 |
self.object)
|
|
1422 |
r = self.head(url)
|
|
1423 |
self.assertEqual(r.status_code, 404)
|
|
1424 |
|
904 |
1425 |
|
905 |
1426 |
class ObjectPost(PithosAPITest):
|
906 |
1427 |
def setUp(self):
|
... | ... | |
1277 |
1798 |
self.assertEqual(data, v[2][2])
|
1278 |
1799 |
append((r['X-Object-Version'], len(data), data))
|
1279 |
1800 |
|
|
1801 |
def test_update_from_other_version(self):
|
|
1802 |
versions = []
|
|
1803 |
info = self.get_object_info(self.container, self.object)
|
|
1804 |
versions.append(info['X-Object-Version'])
|
|
1805 |
pre_length = int(info['Content-Length'])
|
|
1806 |
|
|
1807 |
# update object
|
|
1808 |
d1, r = self.upload_object(self.container, self.object,
|
|
1809 |
length=pre_length - 1)[1:]
|
|
1810 |
self.assertTrue('X-Object-Version' in r)
|
|
1811 |
versions.append(r['X-Object-Version'])
|
|
1812 |
|
|
1813 |
# update object
|
|
1814 |
d2, r = self.upload_object(self.container, self.object,
|
|
1815 |
length=pre_length - 2)[1:]
|
|
1816 |
self.assertTrue('X-Object-Version' in r)
|
|
1817 |
versions.append(r['X-Object-Version'])
|
|
1818 |
|
|
1819 |
# get previous version
|
|
1820 |
url = join_urls(self.pithos_path, self.user, self.container,
|
|
1821 |
self.object)
|
|
1822 |
r = self.get('%s?version=list&format=json' % url)
|
|
1823 |
self.assertEqual(r.status_code, 200)
|
|
1824 |
l = json.loads(r.content)['versions']
|
|
1825 |
self.assertEqual(len(l), 3)
|
|
1826 |
self.assertEqual([str(v[0]) for v in l], versions)
|
|
1827 |
|
|
1828 |
# update with the previous version
|
|
1829 |
r = self.post(url,
|
|
1830 |
HTTP_CONTENT_RANGE='bytes 0-/*',
|
|
1831 |
HTTP_X_SOURCE_OBJECT='/%s/%s' % (self.container,
|
|
1832 |
self.object),
|
|
1833 |
HTTP_X_SOURCE_VERSION=versions[0])
|
|
1834 |
self.assertEqual(r.status_code, 204)
|
|
1835 |
|
|
1836 |
# check content
|
|
1837 |
r = self.get(url)
|
|
1838 |
content = r.content
|
|
1839 |
self.assertEqual(len(content), pre_length)
|
|
1840 |
self.assertEqual(content, self.object_data)
|
|
1841 |
|
|
1842 |
# update object
|
|
1843 |
d3, r = self.upload_object(self.container, self.object,
|
|
1844 |
length=len(d2) + 1)[1:]
|
|
1845 |
self.assertTrue('X-Object-Version' in r)
|
|
1846 |
versions.append(r['X-Object-Version'])
|
|
1847 |
|
|
1848 |
# update with the previous version
|
|
1849 |
r = self.post(url,
|
|
1850 |
HTTP_CONTENT_RANGE='bytes 0-/*',
|
|
1851 |
HTTP_X_SOURCE_OBJECT='/%s/%s' % (self.container,
|
|
1852 |
self.object),
|
|
1853 |
HTTP_X_SOURCE_VERSION=versions[-2])
|
|
1854 |
self.assertEqual(r.status_code, 204)
|
|
1855 |
|
|
1856 |
# check content
|
|
1857 |
r = self.get(url)
|
|
1858 |
content = r.content
|
|
1859 |
self.assertEqual(content, d2 + d3[-1])
|
|
1860 |
|
1280 |
1861 |
|
1281 |
1862 |
class ObjectDelete(PithosAPITest):
|
1282 |
1863 |
def setUp(self):
|