16
16
import xml .etree .cElementTree as ET
17
17
except Exception :
18
18
import xml .etree .ElementTree as ET
19
+
19
20
import json
20
21
from obs import util
21
22
from obs import const
36
37
from obs .model import DateTime , ListObjectsResponse , Content , CorsRule , ObjectVersionHead , ObjectVersion , \
37
38
ObjectDeleteMarker , DeleteObjectResult , NoncurrentVersionExpiration , NoncurrentVersionTransition , Rule , Condition , \
38
39
Redirect , FilterRule , FunctionGraphConfiguration , Upload , CompleteMultipartUploadResponse , ListPartsResponse , \
39
- Grant , ReplicationRule , Transition , Grantee
40
+ Grant , ReplicationRule , Transition , Grantee , BucketAliasModel , ListBucketAliasModel
40
41
41
42
if const .IS_PYTHON2 :
42
43
from urllib import unquote_plus , quote_plus
@@ -87,6 +88,10 @@ def acl_header(self):
87
88
def epid_header (self ):
88
89
return self ._get_header_prefix () + 'epid'
89
90
91
+ @staticmethod
92
+ def pfs_header ():
93
+ return 'x-obs-fs-file-interface'
94
+
90
95
def date_header (self ):
91
96
return self ._get_header_prefix () + 'date'
92
97
@@ -116,6 +121,10 @@ def indicator_header():
116
121
def location_header (self ):
117
122
return self ._get_header_prefix () + 'location'
118
123
124
+ @staticmethod
125
+ def queryPFS_header ():
126
+ return 'x-obs-bucket-type'
127
+
119
128
def bucket_region_header (self ):
120
129
return self ._get_header_prefix () + 'bucket-location' if self .is_obs \
121
130
else self ._get_header_prefix () + 'bucket-region'
@@ -207,6 +216,9 @@ def object_type_header():
207
216
def request_payer_header (self ):
208
217
return self ._get_header_prefix () + 'request-payer'
209
218
219
+ def location_clustergroup_id_header (self ):
220
+ return self ._get_header_prefix () + const .LOCATION_CLUSTERGROUP_ID
221
+
210
222
def oef_marker_header (self ):
211
223
return self ._get_header_prefix () + 'oef-marker'
212
224
@@ -305,6 +317,8 @@ def trans_create_bucket(self, **kwargs):
305
317
self .ha .adapt_storage_class (header .get ('storageClass' )))
306
318
self ._put_key_value (headers , self .ha .az_redundancy_header (), header .get ('availableZone' ))
307
319
self ._put_key_value (headers , self .ha .epid_header (), header .get ('epid' ))
320
+ if header .get ('isPFS' ):
321
+ self ._put_key_value (headers , self .ha .pfs_header (), "Enabled" )
308
322
extensionGrants = header .get ('extensionGrants' )
309
323
if extensionGrants is not None and len (extensionGrants ) > 0 :
310
324
grantDict = {}
@@ -331,6 +345,8 @@ def trans_list_buckets(self, **kwargs):
331
345
headers = {}
332
346
if kwargs .get ('isQueryLocation' ):
333
347
self ._put_key_value (headers , self .ha .location_header (), 'true' )
348
+ if kwargs .get ('bucketType' ):
349
+ self ._put_key_value (headers , self .ha .queryPFS_header (), kwargs .get ('bucketType' ))
334
350
return {'headers' : headers }
335
351
336
352
def trans_list_objects (self , ** kwargs ):
@@ -1049,16 +1065,23 @@ def trans_replication(self, replication):
1049
1065
ET .SubElement (ruleEle , 'Prefix' ).text = util .safe_decode (replicationRule ['prefix' ])
1050
1066
if replicationRule .get ('status' ) is not None :
1051
1067
ET .SubElement (ruleEle , 'Status' ).text = util .to_string (replicationRule ['status' ])
1068
+ if replicationRule .get ('historicalObjectReplication' ) is not None :
1069
+ ET .SubElement (ruleEle , 'HistoricalObjectReplication' ).text = util .to_string (
1070
+ replicationRule ['historicalObjectReplication' ])
1052
1071
1053
- if replication .get ('bucket' ) is not None :
1072
+ if replicationRule .get ('bucket' ) is not None :
1054
1073
destinationEle = ET .SubElement (ruleEle , 'Destination' )
1055
1074
bucket_name = util .to_string (replicationRule ['bucket' ])
1056
1075
bucket_name = bucket_name if self .is_obs else bucket_name if bucket_name .startswith (
1057
1076
'arn:aws:s3:::' ) else 'arn:aws:s3:::' + bucket_name
1058
1077
ET .SubElement (destinationEle , 'Bucket' ).text = bucket_name
1078
+
1059
1079
if replicationRule .get ('storageClass' ) is not None :
1060
- ET .SubElement (destinationEle , 'Bucket ' ).text = self .ha .adapt_storage_class (
1080
+ ET .SubElement (destinationEle , 'StorageClass ' ).text = self .ha .adapt_storage_class (
1061
1081
replicationRule ['storageClass' ])
1082
+
1083
+ if replicationRule .get ('deleteData' ) is not None :
1084
+ ET .SubElement (destinationEle , 'DeleteData' ).text = util .to_string (replicationRule ['deleteData' ])
1062
1085
return ET .tostring (root , 'UTF-8' )
1063
1086
1064
1087
@staticmethod
@@ -1070,7 +1093,9 @@ def trans_bucket_request_payment(payer):
1070
1093
def trans_get_extension_headers (self , headers ):
1071
1094
_headers = {}
1072
1095
if headers is not None and len (headers ) > 0 :
1073
- self ._put_key_value (_headers , self .ha .request_payer_header (), (headers .get ('requesterPayer' )))
1096
+ self ._put_key_value (_headers , self .ha .request_payer_header (), headers .get ('requesterPayer' ))
1097
+ self ._put_key_value (_headers , self .ha .location_clustergroup_id_header (),
1098
+ headers .get ('locationClusterGroupId' ))
1074
1099
return _headers
1075
1100
1076
1101
# OEF trans func
@@ -1113,6 +1138,16 @@ def _find_item(root, item_name, encoding_type=None):
1113
1138
return util .to_string (unquote_plus (result ))
1114
1139
return util .to_string (result )
1115
1140
1141
+ @staticmethod
1142
+ def _find_text (result , encoding_type = None ):
1143
+ if result is None :
1144
+ return None
1145
+ if const .IS_PYTHON2 :
1146
+ result = util .safe_encode (result )
1147
+ if encoding_type == "url" :
1148
+ return util .to_string (unquote_plus (result ))
1149
+ return util .to_string (result )
1150
+
1116
1151
def parseListBuckets (self , xml , headers = None ):
1117
1152
root = ET .fromstring (xml )
1118
1153
owner = root .find ('Owner' )
@@ -1129,8 +1164,9 @@ def parseListBuckets(self, xml, headers=None):
1129
1164
name = self ._find_item (bucket , 'Name' )
1130
1165
d = self ._find_item (bucket , 'CreationDate' )
1131
1166
location = self ._find_item (bucket , 'Location' )
1167
+ bucket_type = self ._find_item (bucket , 'BucketType' )
1132
1168
create_date = DateTime .UTCToLocal (d )
1133
- curr_bucket = Bucket (name = name , create_date = create_date , location = location )
1169
+ curr_bucket = Bucket (name = name , create_date = create_date , location = location , bucket_type = bucket_type )
1134
1170
entries .append (curr_bucket )
1135
1171
return ListBucketsResponse (buckets = entries , owner = Owners )
1136
1172
@@ -1873,8 +1909,11 @@ def parseGetBucketReplication(self, xml, headers=None):
1873
1909
status = self ._find_item (rule , 'Status' )
1874
1910
bucket = self ._find_item (rule , 'Destination/Bucket' )
1875
1911
storageClass = self ._find_item (rule , 'Destination/StorageClass' )
1912
+ deleteData = self ._find_item (rule , 'Destination/DeleteData' )
1913
+ historicalObjectReplication = self ._find_item (rule , 'Destination/HistoricalObjectReplication' )
1876
1914
_rules .append (
1877
- ReplicationRule (id = _id , prefix = prefix , status = status , bucket = bucket , storageClass = storageClass ))
1915
+ ReplicationRule (id = _id , prefix = prefix , status = status , bucket = bucket , storageClass = storageClass ,
1916
+ deleteData = deleteData , historicalObjectReplication = historicalObjectReplication ))
1878
1917
replication = Replication (agency = agency , replicationRules = _rules )
1879
1918
return replication
1880
1919
@@ -2066,3 +2105,79 @@ def parseGetTriggerPolicyResponse(jsons, header=None):
2066
2105
# end workflow related
2067
2106
# end workflow related
2068
2107
# end workflow related
2108
+
2109
+ # begin virtual bucket related
2110
+ # begin virtual bucket related
2111
+ # begin virtual bucket related
2112
+
2113
+ def trans_set_bucket_alias (self , ** kwargs ):
2114
+ aliasInfo = kwargs .get ('aliasInfo' )
2115
+ entity = None if aliasInfo is None or len (aliasInfo ) == 0 else self .trans_set_aliasInfo (aliasInfo )
2116
+ return {'pathArgs' : {const .OBSBUCKETALIAS_PARAM : None }, 'entity' : entity }
2117
+
2118
+ def trans_set_aliasInfo (self , aliasInfo ):
2119
+ root = ET .Element ('CreateBucketAlias' )
2120
+ bucketListEle = ET .SubElement (root , 'BucketList' )
2121
+ ET .SubElement (bucketListEle , 'Bucket' ).text = util .to_string (aliasInfo .get ('bucket1' ))
2122
+ ET .SubElement (bucketListEle , 'Bucket' ).text = util .to_string (aliasInfo .get ('bucket2' ))
2123
+ return ET .tostring (root , 'UTF-8' )
2124
+
2125
+ def trans_bind_bucket_alias (self , ** kwargs ):
2126
+ aliasInfo = kwargs .get ('aliasInfo' )
2127
+ entity = None if aliasInfo is None or len (aliasInfo ) == 0 else self .trans_bind_aliasInfo (aliasInfo )
2128
+ return {'pathArgs' : {const .OBSALIAS_PARAM : None }, 'entity' : entity }
2129
+
2130
+ def trans_bind_aliasInfo (self , aliasInfo ):
2131
+ root = ET .Element ('AliasList' )
2132
+ ET .SubElement (root , 'Alias' ).text = util .to_string (aliasInfo .get ('alias' ))
2133
+ return ET .tostring (root , 'UTF-8' )
2134
+
2135
+ def parseGetBucketAlias (self , xml , header = None ):
2136
+ root = ET .fromstring (xml )
2137
+ bucketAliasXml = root .find ('BucketAlias' )
2138
+ alias = self ._find_item (bucketAliasXml , 'Alias' )
2139
+ bucketAlias = BucketAliasModel (alias = alias )
2140
+
2141
+ bucketListXml = bucketAliasXml .find ('BucketList' ).findall ('Bucket' )
2142
+ bucketNameList = []
2143
+ for bucketXml in bucketListXml :
2144
+ bucketNameList .append (self ._find_text (bucketXml .text ))
2145
+
2146
+ if len (bucketNameList ) > 0 :
2147
+ bucketAlias .bucket1 = bucketNameList [0 ]
2148
+ if len (bucketNameList ) > 1 :
2149
+ bucketAlias .bucket2 = bucketNameList [1 ]
2150
+
2151
+ return bucketAlias
2152
+
2153
+ def parseListBucketAlias (self , xml , header = None ):
2154
+ root = ET .fromstring (xml )
2155
+ ownerXml = root .find ('Owner' )
2156
+ ownerID = self ._find_item (ownerXml , 'ID' )
2157
+ listBucketAlias = ListBucketAliasModel (owner = ownerID )
2158
+
2159
+ bucketAliasListXml = root .find ('BucketAliasList' ).findall ('BucketAlias' )
2160
+ bucketAliasList = []
2161
+ for bucketAliasXml in bucketAliasListXml :
2162
+ alias = self ._find_item (bucketAliasXml , 'Alias' )
2163
+ creationDate = self ._find_item (bucketAliasXml , 'CreationDate' )
2164
+ bucketAlias = BucketAliasModel (alias = alias , creationDate = creationDate )
2165
+
2166
+ bucketListXml = bucketAliasXml .find ('BucketList' ).findall ('Bucket' )
2167
+ bucketNameList = []
2168
+ for bucketXml in bucketListXml :
2169
+ bucketNameList .append (self ._find_text (bucketXml .text ))
2170
+
2171
+ if len (bucketNameList ) > 0 :
2172
+ bucketAlias .bucket1 = bucketNameList [0 ]
2173
+ if len (bucketNameList ) > 1 :
2174
+ bucketAlias .bucket2 = bucketNameList [1 ]
2175
+
2176
+ bucketAliasList .append (bucketAlias )
2177
+
2178
+ listBucketAlias .bucketAlias = bucketAliasList
2179
+ return listBucketAlias
2180
+
2181
+ # end virtual bucket related
2182
+ # end virtual bucket related
2183
+ # end virtual bucket related
0 commit comments