Skip to content

Commit 9845595

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

File tree

13 files changed

+268
-123
lines changed

13 files changed

+268
-123
lines changed

.github/workflows/tests.yml

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,17 @@ 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
23-
17+
server: [ 8.0.0, 7.6.7, 7.2.7, 7.1.6, 7.0.4, community-8.0.0 ]
18+
include:
19+
- server: community-8.0.0
20+
rcbserverVersion: 8.0.0-community
21+
2422
runs-on: ubuntu-latest
2523
steps:
2624
- name: Install cbdinocluster
2725
run: |
2826
mkdir -p "$HOME/bin"
29-
wget -nv -O $HOME/bin/cbdinocluster https://github.com/couchbaselabs/cbdinocluster/releases/download/v0.0.41/cbdinocluster-linux-amd64
27+
wget -nv -O $HOME/bin/cbdinocluster https://github.com/couchbaselabs/cbdinocluster/releases/download/v0.0.89/cbdinocluster-linux-amd64
3028
chmod +x $HOME/bin/cbdinocluster
3129
echo "$HOME/bin" >> $GITHUB_PATH
3230
@@ -50,12 +48,20 @@ jobs:
5048
CBDC_ID=$(cbdinocluster -v alloc --def="${CLUSTERCONFIG}")
5149
cbdinocluster -v buckets add ${CBDC_ID} default --ram-quota-mb=100 --flush-enabled=true --num-replicas=2
5250
cbdinocluster -v collections add ${CBDC_ID} default _default test
53-
CBDC_CONNSTR=$(cbdinocluster -v connstr --tls $CBDC_ID)
5451
CBDC_IP=$(cbdinocluster -v ip $CBDC_ID)
5552
echo "CBDC_ID=$CBDC_ID" >> "$GITHUB_ENV"
56-
echo "CBDC_CONNSTR=$CBDC_CONNSTR" >> "$GITHUB_ENV"
5753
echo "CBDC_IP=$CBDC_IP" >> "$GITHUB_ENV"
5854
55+
- name: Set connection string
56+
run: |
57+
if [[ ${{ matrix.server }} == "community*" ]]; then
58+
CBDC_CONNSTR=$(cbdinocluster -v connstr --tls $CBDC_ID)
59+
else
60+
CBDC_CONNSTR=$(cbdinocluster -v connstr $CBDC_ID)
61+
fi
62+
63+
echo "CBDC_CONNSTR=$CBDC_CONNSTR" >> "$GITHUB_ENV"
64+
5965
- name: Create fts index
6066
run: |
6167
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,8 +78,13 @@ jobs:
7278
CBDC_CONNSTR: # from above
7379
RCBDINOID: ${{ env.CBDC_ID }}
7480
RCBCONNSTR: ${{ env.CBDC_CONNSTR }}
75-
RCBSERVER_VERSION: ${{ matrix.server }}
7681
run: |
82+
if [[ -z "${{ matrix.rcbserverVersion }}" ]]; then {
83+
echo "RCBSERVER_VERSION=${{ matrix.server }}"
84+
else
85+
echo "RCBSERVER_VERSION=${{ matrix.rcbserverVersion }}"
86+
fi
87+
7788
cargo test --color=always --no-fail-fast -- --nocapture
7889
7990
- name: Run allocation tests
@@ -83,8 +94,13 @@ jobs:
8394
CBDC_CONNSTR: # from above
8495
RCBDINOID: ${{ env.CBDC_ID }}
8596
RCBCONNSTR: ${{ env.CBDC_CONNSTR }}
86-
RCBSERVER_VERSION: ${{ matrix.server }}
8797
run: |
98+
if [[ -z "${{ matrix.rcbserverVersion }}" ]]; then {
99+
echo "RCBSERVER_VERSION=${{ matrix.server }}"
100+
else
101+
echo "RCBSERVER_VERSION=${{ matrix.rcbserverVersion }}"
102+
fi
103+
88104
cargo test --features dhat-heap --test allocations --color=always --no-fail-fast -- --nocapture
89105
90106
# - name: Collect couchbase logs

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/src/memdx/datatype.rs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,22 +15,19 @@
1515
* * limitations under the License.
1616
*
1717
*/
18+
use std::convert::From;
1819

1920
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
2021
#[non_exhaustive]
22+
#[derive(Default)]
2123
pub enum DataTypeFlag {
24+
#[default]
2225
None,
2326
Json,
2427
Compressed,
2528
Xattrs,
2629
}
2730

28-
impl Default for DataTypeFlag {
29-
fn default() -> Self {
30-
Self::None
31-
}
32-
}
33-
3431
impl From<DataTypeFlag> for u8 {
3532
fn from(value: DataTypeFlag) -> Self {
3633
match value {

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/diagnostics.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ fn test_ping() {
3737
run_test(async |mut agent| {
3838
let opts = PingOptions::new()
3939
.kv_timeout(Duration::from_millis(1000))
40-
.query_timeout(Duration::from_millis(1000))
41-
.search_timeout(Duration::from_millis(1000));
40+
.query_timeout(Duration::from_millis(75000))
41+
.search_timeout(Duration::from_millis(75000));
4242

4343
let report = agent.ping(&opts).await.unwrap();
4444

sdk/couchbase-core/tests/mgmt.rs

Lines changed: 114 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,16 @@
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+
create_scope, delete_collection, delete_scope, ensure_manifest, generate_string_value,
2122
try_until,
2223
};
2324
use crate::common::test_config::run_test;
2425
use common::helpers;
2526
use couchbase_core::agent::Agent;
2627
use couchbase_core::cbconfig::CollectionManifest;
27-
use couchbase_core::features::BucketFeature;
28-
use couchbase_core::mgmtx::bucket_settings::{BucketSettings, BucketType};
28+
use couchbase_core::mgmtx::bucket_settings::{BucketSettings, BucketType, StorageBackend};
2929
use couchbase_core::options::management::{
3030
CreateBucketOptions, CreateCollectionOptions, DeleteBucketOptions, EnsureBucketOptions,
3131
GetBucketOptions, GetCollectionManifestOptions, UpdateBucketOptions,
@@ -70,14 +70,32 @@ fn test_scopes() {
7070
});
7171
}
7272

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

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

82100
let resp = create_scope(&agent, &bucket_name, &scope_name)
83101
.await
@@ -86,12 +104,11 @@ fn test_collections() {
86104

87105
helpers::ensure_manifest(&agent, &bucket_name, resp.manifest_uid).await;
88106

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-
};
107+
let mut opts = CreateCollectionOptions::new(&bucket_name, &scope_name, &collection_name)
108+
.history_enabled(true);
109+
if agent.supports_feature(&TestFeatureCode::CollectionMaxExpiry) {
110+
opts = opts.max_ttl(25);
111+
}
95112

96113
let resp = agent.create_collection(&opts).await.unwrap();
97114
assert!(!resp.manifest_uid.is_empty());
@@ -106,13 +123,80 @@ fn test_collections() {
106123

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

117201
let resp = delete_collection(&agent, &bucket_name, &scope_name, &collection_name)
118202
.await
@@ -241,9 +325,11 @@ fn test_update_bucket() {
241325
.await
242326
.unwrap();
243327

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

248334
agent
249335
.update_bucket(&UpdateBucketOptions::new(&bucket_name, &update_settings))
@@ -276,10 +362,13 @@ fn test_update_bucket() {
276362
.unwrap();
277363

278364
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-
);
365+
366+
if agent.supports_feature(&TestFeatureCode::CollectionMaxExpiry) {
367+
assert_eq!(
368+
bucket.bucket_settings.max_ttl,
369+
Some(Duration::from_secs(3600))
370+
);
371+
}
283372
});
284373
}
285374

0 commit comments

Comments
 (0)