@@ -2161,6 +2161,43 @@ def test_zap_init_bucket_sync_run():
21612161 secondary .zone .start ()
21622162
21632163 zonegroup_bucket_checkpoint (zonegroup_conns , bucket .name )
2164+
2165+ def test_list_bucket_key_marker_encoding ():
2166+ zonegroup = realm .master_zonegroup ()
2167+ zonegroup_conns = ZonegroupConns (zonegroup )
2168+ primary = zonegroup_conns .rw_zones [0 ]
2169+ secondary = zonegroup_conns .rw_zones [1 ]
2170+
2171+ bucket = primary .create_bucket (gen_bucket_name ())
2172+ log .debug ('created bucket=%s' , bucket .name )
2173+ zonegroup_meta_checkpoint (zonegroup )
2174+
2175+ # test for object names with '%' character.
2176+ for obj in range (1 , 1100 ):
2177+ k = new_key (primary , bucket .name , f'obj%{ obj * 11 } ' )
2178+ k .set_contents_from_string ('foo' )
2179+
2180+ # wait for the secondary to catch up
2181+ zonegroup_bucket_checkpoint (zonegroup_conns , bucket .name )
2182+
2183+ cmd = ['bucket' , 'sync' , 'init' ] + secondary .zone .zone_args ()
2184+ cmd += ['--bucket' , bucket .name ]
2185+ cmd += ['--source-zone' , primary .name ]
2186+ secondary .zone .cluster .admin (cmd )
2187+
2188+ cmd = ['bucket' , 'sync' , 'run' ] + secondary .zone .zone_args ()
2189+ cmd += ['--bucket' , bucket .name , '--source-zone' , primary .name ]
2190+ secondary .zone .cluster .admin (cmd )
2191+
2192+ # write an object during incremental sync.
2193+ objname = 'test_incremental'
2194+ k = new_key (primary , bucket , objname )
2195+ k .set_contents_from_string ('foo' )
2196+ zonegroup_bucket_checkpoint (zonegroup_conns , bucket .name )
2197+
2198+ # the object uploaded after bucket sync init should be replicated
2199+ check_object_exists (bucket , objname )
2200+
21642201
21652202def test_role_sync ():
21662203 zonegroup = realm .master_zonegroup ()
@@ -5897,116 +5934,4 @@ def test_copy_obj_perm_check_between_zonegroups(zonegroup):
58975934 Bucket = dest_bucket .name ,
58985935 CopySource = {'Bucket' : source_bucket .name , 'Key' : objname },
58995936 Key = objname )
5900- assert e .response ['Error' ]['Code' ] == 'AccessDenied'
5901-
5902-
5903- @attr ('object_tagging' )
5904- def test_create_delete_obj_tagging ():
5905- zonegroup = realm .master_zonegroup ()
5906- zonegroup_conns = ZonegroupConns (zonegroup )
5907- primary = zonegroup_conns .rw_zones [0 ]
5908- secondary = zonegroup_conns .rw_zones [1 ]
5909-
5910- bucket = primary .create_bucket (gen_bucket_name ())
5911- log .debug ('created bucket=%s' , bucket .name )
5912-
5913- objname = 'dummy'
5914-
5915- # upload a dummy object and wait for sync.
5916- k = new_key (primary , bucket , objname )
5917- k .set_contents_from_string ('foo' )
5918- zonegroup_meta_checkpoint (zonegroup )
5919-
5920- zonegroup_data_checkpoint (zonegroup_conns )
5921- log .debug ('created object=%s' , objname )
5922-
5923- zonegroup_bucket_checkpoint (zonegroup_conns , bucket .name )
5924-
5925- # put object tagging on primary zone
5926- primary .s3_client .put_object_tagging (Bucket = bucket .name ,
5927- Key = objname ,
5928- Tagging = {
5929- 'TagSet' : [
5930- {
5931- 'Key' : 'key1' ,
5932- 'Value' : 'value1'
5933- },
5934- ]})
5935-
5936- zonegroup_bucket_checkpoint (zonegroup_conns , bucket .name )
5937-
5938- response = secondary .s3_client .get_object_tagging (Bucket = bucket .name ,
5939- Key = objname )
5940- assert (response ['TagSet' ][0 ]['Key' ] == 'key1' )
5941- assert (response ['TagSet' ][0 ]['Value' ] == 'value1' )
5942-
5943- primary .s3_client .delete_object_tagging (Bucket = bucket .name ,
5944- Key = objname )
5945-
5946- zonegroup_bucket_checkpoint (zonegroup_conns , bucket .name )
5947-
5948- response = secondary .s3_client .get_object_tagging (Bucket = bucket .name ,
5949- Key = objname )
5950-
5951- assert (response ['TagSet' ] == [])
5952-
5953- @attr ('object_tagging' )
5954- def test_create_delete_versioned_obj_tagging ():
5955-
5956- zonegroup = realm .master_zonegroup ()
5957- zonegroup_conns = ZonegroupConns (zonegroup )
5958-
5959- primary = zonegroup_conns .rw_zones [0 ]
5960- secondary = zonegroup_conns .rw_zones [1 ]
5961-
5962- bucket = primary .create_bucket (gen_bucket_name ())
5963- log .debug ('created bucket=%s' , bucket .name )
5964- zonegroup_meta_checkpoint (zonegroup )
5965-
5966- # upload an initial object
5967- objname = 'dummy'
5968- key = new_key (primary , bucket , objname )
5969- key .set_contents_from_string ('bar' )
5970- zonegroup_bucket_checkpoint (zonegroup_conns , bucket .name )
5971-
5972- # enable versioning
5973- bucket .configure_versioning (True )
5974- zonegroup_meta_checkpoint (zonegroup )
5975-
5976- # upload object
5977- k = new_key (primary , bucket , objname )
5978- k .set_contents_from_string ('foo' )
5979- log .debug ('created new version id=%s' , k .version_id )
5980- zonegroup_bucket_checkpoint (zonegroup_conns , bucket .name )
5981-
5982- # put object tagging on primary zone
5983- primary .s3_client .put_object_tagging (Bucket = bucket .name ,
5984- Key = objname ,
5985- VersionId = k .version_id ,
5986- Tagging = {
5987- 'TagSet' : [
5988- {
5989- 'Key' : 'key1' ,
5990- 'Value' : 'value1'
5991- },
5992- ]})
5993-
5994- zonegroup_bucket_checkpoint (zonegroup_conns , bucket .name )
5995-
5996- response = secondary .s3_client .get_object_tagging (Bucket = bucket .name ,
5997- Key = objname ,
5998- VersionId = k .version_id )
5999- assert (response ['TagSet' ][0 ]['Key' ] == 'key1' )
6000- assert (response ['TagSet' ][0 ]['Value' ] == 'value1' )
6001-
6002- primary .s3_client .delete_object_tagging (Bucket = bucket .name ,
6003- Key = objname ,
6004- VersionId = k .version_id )
6005-
6006- zonegroup_bucket_checkpoint (zonegroup_conns , bucket .name )
6007-
6008- response = secondary .s3_client .get_object_tagging (Bucket = bucket .name ,
6009- Key = objname ,
6010- VersionId = k .version_id )
6011-
6012- assert (response ['TagSet' ] == [])
5937+ assert e .response ['Error' ]['Code' ] == 'AccessDenied'
0 commit comments