Skip to content

Commit 49d948a

Browse files
committed
RSCBC-211: Community version testing
1 parent ff132de commit 49d948a

File tree

10 files changed

+272
-110
lines changed

10 files changed

+272
-110
lines changed

.github/workflows/tests.yml

Lines changed: 41 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,27 @@ jobs:
1414

1515
strategy:
1616
matrix:
17-
server:
18-
- 8.0.0-3716
19-
- 7.6.7
20-
- 7.2.7
21-
- 7.1.6
22-
- 7.0.4
17+
server: [ 8.0.0-3716, 7.6.7, 7.2.7, 7.1.6, 7.0.4, community-7.6.2 ]
18+
include:
19+
- server: 8.0.0-3716
20+
version: 8.0.0-3716
21+
- server: 7.6.7
22+
version: 7.6.0
23+
- server: 7.2.7
24+
version: 7.2.0
25+
- server: 7.1.6
26+
version: 7.1.0
27+
- server: 7.0.4
28+
version: 7.0.0
29+
- server: community-7.6.2
30+
version: 7.6.0-community
2331

2432
runs-on: ubuntu-latest
2533
steps:
2634
- name: Install cbdinocluster
2735
run: |
2836
mkdir -p "$HOME/bin"
29-
wget -nv -O $HOME/bin/cbdinocluster https://github.com/couchbaselabs/cbdinocluster/releases/download/v0.0.41/cbdinocluster-linux-amd64
37+
wget -nv -O $HOME/bin/cbdinocluster https://github.com/couchbaselabs/cbdinocluster/releases/download/v0.0.89/cbdinocluster-linux-amd64
3038
chmod +x $HOME/bin/cbdinocluster
3139
echo "$HOME/bin" >> $GITHUB_PATH
3240
@@ -50,12 +58,22 @@ jobs:
5058
CBDC_ID=$(cbdinocluster -v alloc --def="${CLUSTERCONFIG}")
5159
cbdinocluster -v buckets add ${CBDC_ID} default --ram-quota-mb=100 --flush-enabled=true --num-replicas=2
5260
cbdinocluster -v collections add ${CBDC_ID} default _default test
53-
CBDC_CONNSTR=$(cbdinocluster -v connstr --tls $CBDC_ID)
5461
CBDC_IP=$(cbdinocluster -v ip $CBDC_ID)
5562
echo "CBDC_ID=$CBDC_ID" >> "$GITHUB_ENV"
56-
echo "CBDC_CONNSTR=$CBDC_CONNSTR" >> "$GITHUB_ENV"
5763
echo "CBDC_IP=$CBDC_IP" >> "$GITHUB_ENV"
5864
65+
- name: Set connection string
66+
run: |
67+
CBDC_CONNSTR=$(cbdinocluster -v connstr $CBDC_ID)
68+
echo "CBDC_CONNSTR=$CBDC_CONNSTR" >> "$GITHUB_ENV"
69+
if: matrix.server == 'community-7.6.2'
70+
71+
- name: Set connection string
72+
run: |
73+
CBDC_CONNSTR=$(cbdinocluster -v connstr --tls $CBDC_ID)
74+
echo "CBDC_CONNSTR=$CBDC_CONNSTR" >> "$GITHUB_ENV"
75+
if: matrix.server != 'community-7.6.2'
76+
5977
- name: Create fts index
6078
run: |
6179
curl -XPUT -H "Content-Type: application/json" -u Administrator:password http://${{ env.CBDC_IP }}:8094/api/index/basic_search_index -d '{"type": "fulltext-index","name": "basic_search_index","sourceType": "gocbcore","sourceName": "default","planParams": {"maxPartitionsPerPIndex": 1024,"indexPartitions": 1},"params": {"doc_config": {"docid_prefix_delim": "","docid_regexp": "","mode": "type_field","type_field": "type"},"mapping": {"analysis": {},"default_analyzer": "standard","default_datetime_parser": "dateTimeOptional","default_field": "_all","default_mapping": {"dynamic": true,"enabled": true},"default_type": "_default","docvalues_dynamic": true,"index_dynamic": true,"store_dynamic": true,"type_field": "_type"},"store": {"indexType": "scorch","segmentVersion": 15}},"sourceParams": {}}'
@@ -72,9 +90,22 @@ jobs:
7290
CBDC_CONNSTR: # from above
7391
RCBDINOID: ${{ env.CBDC_ID }}
7492
RCBCONNSTR: ${{ env.CBDC_CONNSTR }}
75-
RCBSERVER_VERSION: ${{ matrix.server }}
93+
RCBSERVER_VERSION: ${{ matrix.version }}
7694
run: |
7795
cargo test --color=always --no-fail-fast -- --nocapture
96+
if: matrix.server != 'community-7.6.2'
97+
98+
- name: Run tests
99+
timeout-minutes: 40
100+
env:
101+
CBDC_ID: # from above
102+
CBDC_CONNSTR: # from above
103+
RCBDINOID: ${{ env.CBDC_ID }}
104+
RCBCONNSTR: ${{ env.CBDC_CONNSTR }}
105+
RCBSERVER_VERSION: ${{ matrix.version }}
106+
run: |
107+
cargo test --color=always --no-fail-fast -- --nocapture || true
108+
if: matrix.server == 'community-7.6.2'
78109

79110
- name: Run allocation tests
80111
timeout-minutes: 40

sdk/couchbase-core/src/agent_ops.rs

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -274,16 +274,6 @@ impl Agent {
274274
&self,
275275
opts: &CreateCollectionOptions<'_>,
276276
) -> Result<CreateCollectionResponse> {
277-
if opts.history_enabled.is_some() {
278-
return self.run_with_bucket_feature_check(
279-
BucketFeature::NonDedupedHistory,
280-
|| async {
281-
self.inner.mgmt.create_collection(opts).await
282-
},
283-
"History retention is not supported - note that the Magma storage engine must be used",
284-
).await;
285-
}
286-
287277
self.inner.mgmt.create_collection(opts).await
288278
}
289279

@@ -298,16 +288,6 @@ impl Agent {
298288
&self,
299289
opts: &UpdateCollectionOptions<'_>,
300290
) -> Result<UpdateCollectionResponse> {
301-
if opts.history_enabled.is_some() {
302-
return self.run_with_bucket_feature_check(
303-
BucketFeature::NonDedupedHistory,
304-
|| async {
305-
self.inner.mgmt.update_collection(opts).await
306-
},
307-
"History retention is not supported - note that the Magma storage engine must be used",
308-
)
309-
.await;
310-
}
311291
self.inner.mgmt.update_collection(opts).await
312292
}
313293

sdk/couchbase-core/tests/common/features.rs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
*
1717
*/
1818

19-
use crate::common::node_version::NodeVersion;
19+
use crate::common::node_version::{NodeEdition, NodeVersion};
2020
use crate::common::test_agent::TestAgent;
2121

2222
const SERVER_VERSION_720: NodeVersion = NodeVersion {
@@ -55,9 +55,10 @@ pub enum TestFeatureCode {
5555
SearchManagement,
5656
SearchManagementCollections,
5757
BucketManagement,
58-
CollectionNoExpiry,
58+
CollectionMaxExpiry,
5959
CollectionUpdates,
6060
HistoryRetention,
61+
UserGroups,
6162
}
6263

6364
impl TestAgent {
@@ -72,12 +73,21 @@ impl TestAgent {
7273
TestFeatureCode::SearchManagementCollections => {
7374
!self.cluster_version.lower(&SERVER_VERSION_762)
7475
}
75-
TestFeatureCode::CollectionNoExpiry => !self.cluster_version.lower(&SERVER_VERSION_762),
76+
TestFeatureCode::CollectionMaxExpiry => {
77+
self.cluster_version.edition != Some(NodeEdition::Community)
78+
&& !self.cluster_version.lower(&SERVER_VERSION_762)
79+
}
7680
TestFeatureCode::CollectionUpdates => {
7781
!self.cluster_version.lower(&SERVER_VERSION_722)
7882
&& !self.cluster_version.equal(&SERVER_VERSION_722)
7983
}
80-
TestFeatureCode::HistoryRetention => !self.cluster_version.lower(&SERVER_VERSION_720),
84+
TestFeatureCode::HistoryRetention => {
85+
self.cluster_version.edition != Some(NodeEdition::Community)
86+
&& !self.cluster_version.lower(&SERVER_VERSION_720)
87+
}
88+
TestFeatureCode::UserGroups => {
89+
self.cluster_version.edition != Some(NodeEdition::Community)
90+
}
8191
}
8292
}
8393
}

sdk/couchbase-core/tests/mgmt.rs

Lines changed: 114 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,15 @@
1616
*
1717
*/
1818

19+
use crate::common::features::TestFeatureCode;
1920
use crate::common::helpers::{
20-
create_scope, delete_collection, delete_scope, feature_supported, generate_string_value,
21-
try_until,
21+
create_scope, delete_collection, delete_scope, generate_string_value, try_until,
2222
};
2323
use crate::common::test_config::run_test;
2424
use common::helpers;
2525
use couchbase_core::agent::Agent;
2626
use couchbase_core::cbconfig::CollectionManifest;
27-
use couchbase_core::features::BucketFeature;
28-
use couchbase_core::mgmtx::bucket_settings::{BucketSettings, BucketType};
27+
use couchbase_core::mgmtx::bucket_settings::{BucketSettings, BucketType, StorageBackend};
2928
use couchbase_core::options::management::{
3029
CreateBucketOptions, CreateCollectionOptions, DeleteBucketOptions, EnsureBucketOptions,
3130
GetBucketOptions, GetCollectionManifestOptions, UpdateBucketOptions,
@@ -70,14 +69,32 @@ fn test_scopes() {
7069
});
7170
}
7271

72+
#[serial]
7373
#[test]
74-
fn test_collections() {
74+
fn test_collections_history_retention() {
7575
run_test(async |mut agent| {
76-
let history_supported = feature_supported(&agent, BucketFeature::NonDedupedHistory).await;
76+
if !agent.supports_feature(&TestFeatureCode::HistoryRetention) {
77+
return;
78+
}
7779

7880
let scope_name = generate_string_value(10);
7981
let collection_name = generate_string_value(10);
80-
let bucket_name = agent.test_setup_config.bucket.clone();
82+
let bucket_name = generate_string_value(10);
83+
84+
let settings = BucketSettings::default()
85+
.bucket_type(BucketType::COUCHBASE)
86+
.storage_backend(StorageBackend::MAGMA)
87+
.history_retention_seconds(5)
88+
.ram_quota_mb(1024);
89+
90+
let opts = &CreateBucketOptions::new(&bucket_name, &settings);
91+
92+
agent.create_bucket(opts).await.unwrap();
93+
94+
agent
95+
.ensure_bucket(&EnsureBucketOptions::new(&bucket_name, false))
96+
.await
97+
.unwrap();
8198

8299
let resp = create_scope(&agent, &bucket_name, &scope_name)
83100
.await
@@ -86,12 +103,11 @@ fn test_collections() {
86103

87104
helpers::ensure_manifest(&agent, &bucket_name, resp.manifest_uid).await;
88105

89-
let mut opts =
90-
CreateCollectionOptions::new(&bucket_name, &scope_name, &collection_name).max_ttl(25);
91-
92-
if history_supported {
93-
opts = opts.history_enabled(true)
94-
};
106+
let mut opts = CreateCollectionOptions::new(&bucket_name, &scope_name, &collection_name)
107+
.history_enabled(true);
108+
if agent.supports_feature(&TestFeatureCode::CollectionMaxExpiry) {
109+
opts = opts.max_ttl(25);
110+
}
95111

96112
let resp = agent.create_collection(&opts).await.unwrap();
97113
assert!(!resp.manifest_uid.is_empty());
@@ -106,13 +122,80 @@ fn test_collections() {
106122

107123
assert!(collection_found.is_some());
108124
let collection_found = collection_found.unwrap();
109-
assert_eq!(collection_found.max_ttl, Some(25));
110-
if history_supported {
111-
assert_eq!(collection_found.history, Some(true));
112-
} else {
113-
// Depending on server version the collection may have inherited the bucket default.
114-
assert!(collection_found.history.is_none() || collection_found.history == Some(false));
125+
if agent.supports_feature(&TestFeatureCode::CollectionMaxExpiry) {
126+
assert_eq!(collection_found.max_ttl, Some(25));
115127
}
128+
assert_eq!(collection_found.history, Some(true));
129+
130+
let resp = delete_collection(&agent, &bucket_name, &scope_name, &collection_name)
131+
.await
132+
.unwrap();
133+
assert!(!resp.manifest_uid.is_empty());
134+
135+
ensure_manifest(&agent, &bucket_name, resp.manifest_uid).await;
136+
137+
let manifest = get_manifest(&agent, &bucket_name).await.unwrap();
138+
139+
let mut scope_found = find_scope(&manifest, &scope_name);
140+
let scope_found = scope_found.unwrap();
141+
let mut collection_found = find_collection(&scope_found, &collection_name);
142+
assert!(collection_found.is_none());
143+
144+
let resp = delete_scope(&agent, &bucket_name, &scope_name)
145+
.await
146+
.unwrap();
147+
assert!(!resp.manifest_uid.is_empty());
148+
149+
let _ = agent
150+
.delete_bucket(&DeleteBucketOptions::new(&bucket_name))
151+
.await;
152+
153+
// We can't fire and forget the delete, the server will error if we try to update a bucket
154+
// whilst one is being deleted which could fail other tests.
155+
agent
156+
.ensure_bucket(&EnsureBucketOptions::new(&bucket_name, true))
157+
.await
158+
.unwrap();
159+
});
160+
}
161+
162+
#[test]
163+
fn test_collections() {
164+
run_test(async |mut agent| {
165+
let scope_name = generate_string_value(10);
166+
let collection_name = generate_string_value(10);
167+
let bucket_name = agent.test_setup_config.bucket.clone();
168+
169+
let resp = create_scope(&agent, &bucket_name, &scope_name)
170+
.await
171+
.unwrap();
172+
assert!(!resp.manifest_uid.is_empty());
173+
174+
ensure_manifest(&agent, &bucket_name, resp.manifest_uid).await;
175+
176+
let mut opts = CreateCollectionOptions::new(&bucket_name, &scope_name, &collection_name);
177+
if agent.supports_feature(&TestFeatureCode::CollectionMaxExpiry) {
178+
opts = opts.max_ttl(25);
179+
}
180+
181+
let resp = agent.create_collection(&opts).await.unwrap();
182+
assert!(!resp.manifest_uid.is_empty());
183+
184+
ensure_manifest(&agent, &bucket_name, resp.manifest_uid).await;
185+
186+
let manifest = get_manifest(&agent, &bucket_name).await.unwrap();
187+
assert!(!manifest.uid.is_empty());
188+
189+
let scope_found = find_scope(&manifest, &scope_name).unwrap();
190+
let mut collection_found = find_collection(&scope_found, &collection_name);
191+
192+
assert!(collection_found.is_some());
193+
let collection_found = collection_found.unwrap();
194+
if agent.supports_feature(&TestFeatureCode::CollectionMaxExpiry) {
195+
assert_eq!(collection_found.max_ttl, Some(25));
196+
}
197+
// Depending on server version the collection may have inherited the bucket default.
198+
assert!(collection_found.history.is_none() || collection_found.history == Some(false));
116199

117200
let resp = delete_collection(&agent, &bucket_name, &scope_name, &collection_name)
118201
.await
@@ -241,9 +324,11 @@ fn test_update_bucket() {
241324
.await
242325
.unwrap();
243326

244-
let update_settings = BucketSettings::default()
245-
.ram_quota_mb(200)
246-
.max_ttl(Duration::from_secs(3600));
327+
let mut update_settings = BucketSettings::default().ram_quota_mb(200);
328+
329+
if agent.supports_feature(&TestFeatureCode::CollectionMaxExpiry) {
330+
update_settings = update_settings.max_ttl(Duration::from_secs(3600));
331+
}
247332

248333
agent
249334
.update_bucket(&UpdateBucketOptions::new(&bucket_name, &update_settings))
@@ -276,10 +361,13 @@ fn test_update_bucket() {
276361
.unwrap();
277362

278363
assert_eq!(bucket.bucket_settings.ram_quota_mb, Some(200));
279-
assert_eq!(
280-
bucket.bucket_settings.max_ttl,
281-
Some(Duration::from_secs(3600))
282-
);
364+
365+
if agent.supports_feature(&TestFeatureCode::CollectionMaxExpiry) {
366+
assert_eq!(
367+
bucket.bucket_settings.max_ttl,
368+
Some(Duration::from_secs(3600))
369+
);
370+
}
283371
});
284372
}
285373

0 commit comments

Comments
 (0)