@@ -78,6 +78,15 @@ def check_custom_conflict_resolution_supported(self, cb_env):
7878 def check_non_deduped_history_supported (self , cb_env ):
7979 cb_env .check_if_feature_supported ('non_deduped_history' )
8080
81+ @pytest .fixture (scope = "class" )
82+ def num_nodes (self , cb_env ):
83+ return len (cb_env .cluster ._cluster_info .nodes )
84+
85+ @pytest .fixture (scope = "class" )
86+ def check_multi_node (self , num_nodes ):
87+ if num_nodes == 1 :
88+ pytest .skip ("Test only for clusters with more than a single node." )
89+
8190 @pytest .fixture ()
8291 def test_bucket (self , test_buckets ):
8392 return choice (test_buckets )
@@ -97,6 +106,7 @@ async def purge_buckets(self, cb_env, test_buckets):
97106 await cb_env .purge_buckets (test_buckets )
98107
99108 @pytest .mark .usefixtures ("check_bucket_mgmt_supported" )
109+ @pytest .mark .usefixtures ("check_multi_node" )
100110 @pytest .mark .usefixtures ("purge_buckets" )
101111 @pytest .mark .asyncio
102112 async def test_bucket_create (self , cb_env , test_bucket ):
@@ -112,6 +122,20 @@ async def test_bucket_create(self, cb_env, test_bucket):
112122 @pytest .mark .usefixtures ("check_bucket_mgmt_supported" )
113123 @pytest .mark .usefixtures ("purge_buckets" )
114124 @pytest .mark .asyncio
125+ async def test_bucket_create_zero_replicas (self , cb_env , test_bucket ):
126+ await cb_env .bm .create_bucket (
127+ CreateBucketSettings (
128+ name = test_bucket ,
129+ bucket_type = BucketType .COUCHBASE ,
130+ ram_quota_mb = 100 ,
131+ num_replicas = 0 ))
132+ bucket = await cb_env .try_n_times (10 , 1 , cb_env .bm .get_bucket , test_bucket )
133+ assert bucket .get ("num_replicas" ) == 0
134+
135+ @pytest .mark .usefixtures ("check_bucket_mgmt_supported" )
136+ @pytest .mark .usefixtures ("check_multi_node" )
137+ @pytest .mark .usefixtures ("purge_buckets" )
138+ @pytest .mark .asyncio
115139 async def test_bucket_create_replica_index_true (self , cb_env , test_bucket ):
116140 await cb_env .bm .create_bucket (
117141 CreateBucketSettings (
@@ -124,6 +148,7 @@ async def test_bucket_create_replica_index_true(self, cb_env, test_bucket):
124148 assert bucket .replica_index is True
125149
126150 @pytest .mark .usefixtures ("check_bucket_mgmt_supported" )
151+ @pytest .mark .usefixtures ("check_multi_node" )
127152 @pytest .mark .usefixtures ("purge_buckets" )
128153 @pytest .mark .asyncio
129154 async def test_bucket_create_replica_index_false (self , cb_env , test_bucket ):
@@ -138,6 +163,7 @@ async def test_bucket_create_replica_index_false(self, cb_env, test_bucket):
138163 assert bucket .replica_index is False
139164
140165 @pytest .mark .usefixtures ("check_bucket_min_durability_supported" )
166+ @pytest .mark .usefixtures ("check_multi_node" )
141167 @pytest .mark .usefixtures ("purge_buckets" )
142168 @pytest .mark .asyncio
143169 async def test_bucket_create_durability (self , cb_env , test_bucket ):
@@ -150,6 +176,7 @@ async def test_bucket_create_durability(self, cb_env, test_bucket):
150176 assert bucket ["minimum_durability_level" ] == min_durability
151177
152178 @pytest .mark .usefixtures ("check_bucket_mgmt_supported" )
179+ @pytest .mark .usefixtures ("check_multi_node" )
153180 @pytest .mark .usefixtures ("purge_buckets" )
154181 @pytest .mark .asyncio
155182 async def test_bucket_create_fail (self , cb_env , test_bucket ):
@@ -162,6 +189,7 @@ async def test_bucket_create_fail(self, cb_env, test_bucket):
162189 await cb_env .bm .create_bucket (settings )
163190
164191 @pytest .mark .usefixtures ("check_bucket_mgmt_supported" )
192+ @pytest .mark .usefixtures ("check_multi_node" )
165193 @pytest .mark .asyncio
166194 async def test_bucket_drop_fail (self , cb_env , test_bucket ):
167195 settings = CreateBucketSettings (
@@ -174,6 +202,7 @@ async def test_bucket_drop_fail(self, cb_env, test_bucket):
174202 await cb_env .bm .drop_bucket (test_bucket )
175203
176204 @pytest .mark .usefixtures ("check_bucket_mgmt_supported" )
205+ @pytest .mark .usefixtures ("check_multi_node" )
177206 @pytest .mark .usefixtures ("purge_buckets" )
178207 @pytest .mark .asyncio
179208 async def test_bucket_list (self , cb_env , test_buckets ):
@@ -189,6 +218,7 @@ async def test_bucket_list(self, cb_env, test_buckets):
189218 set (map (lambda b : b .name , buckets )))
190219
191220 @pytest .mark .usefixtures ("check_bucket_mgmt_supported" )
221+ @pytest .mark .usefixtures ("check_multi_node" )
192222 @pytest .mark .usefixtures ("purge_buckets" )
193223 @pytest .mark .asyncio
194224 async def test_cluster_sees_bucket (self , cb_env , test_bucket ):
@@ -203,6 +233,7 @@ async def test_cluster_sees_bucket(self, cb_env, test_bucket):
203233 await cb_env .try_n_times (10 , 1 , b .on_connect )
204234
205235 @pytest .mark .usefixtures ("check_bucket_mgmt_supported" )
236+ @pytest .mark .usefixtures ("check_multi_node" )
206237 @pytest .mark .usefixtures ("purge_buckets" )
207238 @pytest .mark .asyncio
208239 async def test_change_expiry (self , cb_env , test_bucket ):
@@ -226,6 +257,7 @@ async def get_bucket_expiry_equal(name, expiry):
226257 await cb_env .try_n_times (10 , 3 , get_bucket_expiry_equal , test_bucket , timedelta (seconds = 500 ))
227258
228259 @pytest .mark .usefixtures ("check_bucket_mgmt_supported" )
260+ @pytest .mark .usefixtures ("check_multi_node" )
229261 @pytest .mark .usefixtures ("purge_buckets" )
230262 @pytest .mark .asyncio
231263 async def test_bucket_flush (self , cb_env , test_bucket ):
@@ -241,6 +273,7 @@ async def test_bucket_flush(self, cb_env, test_bucket):
241273 await cb_env .try_n_times (10 , 3 , cb_env .bm .flush_bucket , bucket .name )
242274
243275 @pytest .mark .usefixtures ("check_bucket_mgmt_supported" )
276+ @pytest .mark .usefixtures ("check_multi_node" )
244277 @pytest .mark .usefixtures ("purge_buckets" )
245278 @pytest .mark .asyncio
246279 async def test_bucket_flush_fail (self , cb_env , test_bucket ):
@@ -257,6 +290,7 @@ async def test_bucket_flush_fail(self, cb_env, test_bucket):
257290 await cb_env .bm .flush_bucket (test_bucket )
258291
259292 @pytest .mark .usefixtures ("check_bucket_storage_backend_supported" )
293+ @pytest .mark .usefixtures ("check_multi_node" )
260294 @pytest .mark .usefixtures ("purge_buckets" )
261295 @pytest .mark .asyncio
262296 async def test_bucket_backend_default (self , cb_env , test_bucket ):
@@ -273,6 +307,7 @@ async def test_bucket_backend_default(self, cb_env, test_bucket):
273307 assert bucket .storage_backend == StorageBackend .COUCHSTORE
274308
275309 @pytest .mark .usefixtures ("check_bucket_storage_backend_supported" )
310+ @pytest .mark .usefixtures ("check_multi_node" )
276311 @pytest .mark .usefixtures ("purge_buckets" )
277312 @pytest .mark .asyncio
278313 async def test_bucket_backend_magma (self , cb_env , test_bucket ):
@@ -287,6 +322,7 @@ async def test_bucket_backend_magma(self, cb_env, test_bucket):
287322 assert bucket .storage_backend == StorageBackend .MAGMA
288323
289324 @pytest .mark .usefixtures ("check_bucket_storage_backend_supported" )
325+ @pytest .mark .usefixtures ("check_multi_node" )
290326 @pytest .mark .usefixtures ("purge_buckets" )
291327 @pytest .mark .asyncio
292328 async def test_bucket_backend_couchstore (self , cb_env , test_bucket ):
@@ -301,6 +337,7 @@ async def test_bucket_backend_couchstore(self, cb_env, test_bucket):
301337 assert bucket .storage_backend == StorageBackend .COUCHSTORE
302338
303339 @pytest .mark .usefixtures ("check_bucket_storage_backend_supported" )
340+ @pytest .mark .usefixtures ("check_multi_node" )
304341 @pytest .mark .usefixtures ("purge_buckets" )
305342 @pytest .mark .asyncio
306343 async def test_bucket_backend_ephemeral (self , cb_env , test_bucket ):
@@ -315,6 +352,7 @@ async def test_bucket_backend_ephemeral(self, cb_env, test_bucket):
315352 assert bucket .storage_backend == StorageBackend .UNDEFINED
316353
317354 @pytest .mark .usefixtures ("check_custom_conflict_resolution_supported" )
355+ @pytest .mark .usefixtures ("check_multi_node" )
318356 @pytest .mark .usefixtures ("purge_buckets" )
319357 @pytest .mark .asyncio
320358 async def test_bucket_custom_conflict_resolution (self , cb_env , test_bucket ):
@@ -338,6 +376,7 @@ async def test_bucket_custom_conflict_resolution(self, cb_env, test_bucket):
338376 flush_enabled = False ))
339377
340378 @pytest .mark .usefixtures ("check_non_deduped_history_supported" )
379+ @pytest .mark .usefixtures ("check_multi_node" )
341380 @pytest .mark .usefixtures ("purge_buckets" )
342381 @pytest .mark .asyncio
343382 async def test_bucket_create_history_retention (self , cb_env , test_bucket ):
@@ -358,6 +397,7 @@ async def test_bucket_create_history_retention(self, cb_env, test_bucket):
358397 assert bucket .history_retention_duration == timedelta (days = 1 )
359398
360399 @pytest .mark .usefixtures ("check_non_deduped_history_supported" )
400+ @pytest .mark .usefixtures ("check_multi_node" )
361401 @pytest .mark .usefixtures ("purge_buckets" )
362402 @pytest .mark .asyncio
363403 async def test_bucket_create_history_retention_unsupported (self , cb_env , test_bucket ):
@@ -375,6 +415,7 @@ async def test_bucket_create_history_retention_unsupported(self, cb_env, test_bu
375415 )
376416
377417 @pytest .mark .usefixtures ("check_non_deduped_history_supported" )
418+ @pytest .mark .usefixtures ("check_multi_node" )
378419 @pytest .mark .usefixtures ("purge_buckets" )
379420 @pytest .mark .asyncio
380421 async def test_bucket_update_history_retention (self , cb_env , test_bucket ):
@@ -409,6 +450,7 @@ async def test_bucket_update_history_retention(self, cb_env, test_bucket):
409450 assert bucket .history_retention_duration == timedelta (minutes = 10 )
410451
411452 @pytest .mark .usefixtures ("check_non_deduped_history_supported" )
453+ @pytest .mark .usefixtures ("check_multi_node" )
412454 @pytest .mark .usefixtures ("purge_buckets" )
413455 @pytest .mark .asyncio
414456 async def test_bucket_update_history_retention_unsupported (self , cb_env , test_bucket ):
0 commit comments