Skip to content

Commit 56052d7

Browse files
Add crr cascaded tests
Issue: ZENKO-5263
1 parent 5336705 commit 56052d7

11 files changed

Lines changed: 446 additions & 7 deletions

File tree

.github/scripts/end2end/configure-e2e.sh

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,12 @@ CRR_SOURCE_LOCATION_NAME=${CRR_SOURCE_LOCATION_NAME} \
9696
CRR_DESTINATION_LOCATION_NAME=${CRR_DESTINATION_LOCATION_NAME} \
9797
CRR_SOURCE_ACCOUNT_NAME=${CRR_SOURCE_ACCOUNT_NAME} \
9898
CRR_DESTINATION_ACCOUNT_NAME=${CRR_DESTINATION_ACCOUNT_NAME} \
99+
CRR_CASCADE_LOCATION_A_NAME=${CRR_CASCADE_LOCATION_A_NAME} \
100+
CRR_CASCADE_LOCATION_B_NAME=${CRR_CASCADE_LOCATION_B_NAME} \
101+
CRR_CASCADE_LOCATION_C_NAME=${CRR_CASCADE_LOCATION_C_NAME} \
102+
CRR_CASCADE_ACCOUNT_A_NAME=${CRR_CASCADE_ACCOUNT_A_NAME} \
103+
CRR_CASCADE_ACCOUNT_B_NAME=${CRR_CASCADE_ACCOUNT_B_NAME} \
104+
CRR_CASCADE_ACCOUNT_C_NAME=${CRR_CASCADE_ACCOUNT_C_NAME} \
99105
CRR_ROLE_NAME=${CRR_ROLE_NAME} \
100106
DEPLOY_CRR_LOCATIONS=${DEPLOY_CRR_LOCATIONS} \
101107
yarn --cwd "$FUNCTIONAL_TESTS_DIR" initializeFunctionalTestsResources

.github/scripts/end2end/setup-e2e-env.sh

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ export ZENKO_SESSION_TOKEN=$(kubectl get secret ${ZENKO_NAME}-account-zenko -o j
5555
# CRR account credentials
5656
_src_secret="${ZENKO_NAME}-account-${CRR_SOURCE_ACCOUNT_NAME:-crr-source-account}"
5757
_dst_secret="${ZENKO_NAME}-account-${CRR_DESTINATION_ACCOUNT_NAME:-crr-destination-account}"
58+
_cascade_a_secret="${ZENKO_NAME}-account-${CRR_CASCADE_ACCOUNT_A_NAME:-crr-cascade-account-a}"
59+
_cascade_b_secret="${ZENKO_NAME}-account-${CRR_CASCADE_ACCOUNT_B_NAME:-crr-cascade-account-b}"
60+
_cascade_c_secret="${ZENKO_NAME}-account-${CRR_CASCADE_ACCOUNT_C_NAME:-crr-cascade-account-c}"
5861

5962
SOURCE_ACCESS_KEY=$(kubectl get secret "${_src_secret}" -o jsonpath='{.data.AccessKeyId}' | base64 -d)
6063
SOURCE_SECRET_KEY=$(kubectl get secret "${_src_secret}" -o jsonpath='{.data.SecretAccessKey}' | base64 -d)
@@ -68,6 +71,24 @@ DESTINATION_SESSION_TOKEN=$(kubectl get secret "${_dst_secret}" -o jsonpath='{.d
6871
DESTINATION_ACCOUNT_ID=$(kubectl get secret "${_dst_secret}" -o jsonpath='{.data.AccountId}' | base64 -d)
6972
export CRR_DESTINATION_INFO="{\"AccessKeyId\":\"${DESTINATION_ACCESS_KEY}\",\"SecretAccessKey\":\"${DESTINATION_SECRET_KEY}\",\"SessionToken\":\"${DESTINATION_SESSION_TOKEN}\",\"AccountId\":\"${DESTINATION_ACCOUNT_ID}\"}"
7073

74+
CASCADE_A_ACCESS_KEY=$(kubectl get secret "${_cascade_a_secret}" -o jsonpath='{.data.AccessKeyId}' | base64 -d)
75+
CASCADE_A_SECRET_KEY=$(kubectl get secret "${_cascade_a_secret}" -o jsonpath='{.data.SecretAccessKey}' | base64 -d)
76+
CASCADE_A_SESSION_TOKEN=$(kubectl get secret "${_cascade_a_secret}" -o jsonpath='{.data.SessionToken}' | base64 -d)
77+
CASCADE_A_ACCOUNT_ID=$(kubectl get secret "${_cascade_a_secret}" -o jsonpath='{.data.AccountId}' | base64 -d)
78+
export CRR_CASCADE_INFO_A="{\"AccessKeyId\":\"${CASCADE_A_ACCESS_KEY}\",\"SecretAccessKey\":\"${CASCADE_A_SECRET_KEY}\",\"SessionToken\":\"${CASCADE_A_SESSION_TOKEN}\",\"AccountId\":\"${CASCADE_A_ACCOUNT_ID}\"}"
79+
80+
CASCADE_B_ACCESS_KEY=$(kubectl get secret "${_cascade_b_secret}" -o jsonpath='{.data.AccessKeyId}' | base64 -d)
81+
CASCADE_B_SECRET_KEY=$(kubectl get secret "${_cascade_b_secret}" -o jsonpath='{.data.SecretAccessKey}' | base64 -d)
82+
CASCADE_B_SESSION_TOKEN=$(kubectl get secret "${_cascade_b_secret}" -o jsonpath='{.data.SessionToken}' | base64 -d)
83+
CASCADE_B_ACCOUNT_ID=$(kubectl get secret "${_cascade_b_secret}" -o jsonpath='{.data.AccountId}' | base64 -d)
84+
export CRR_CASCADE_INFO_B="{\"AccessKeyId\":\"${CASCADE_B_ACCESS_KEY}\",\"SecretAccessKey\":\"${CASCADE_B_SECRET_KEY}\",\"SessionToken\":\"${CASCADE_B_SESSION_TOKEN}\",\"AccountId\":\"${CASCADE_B_ACCOUNT_ID}\"}"
85+
86+
CASCADE_C_ACCESS_KEY=$(kubectl get secret "${_cascade_c_secret}" -o jsonpath='{.data.AccessKeyId}' | base64 -d)
87+
CASCADE_C_SECRET_KEY=$(kubectl get secret "${_cascade_c_secret}" -o jsonpath='{.data.SecretAccessKey}' | base64 -d)
88+
CASCADE_C_SESSION_TOKEN=$(kubectl get secret "${_cascade_c_secret}" -o jsonpath='{.data.SessionToken}' | base64 -d)
89+
CASCADE_C_ACCOUNT_ID=$(kubectl get secret "${_cascade_c_secret}" -o jsonpath='{.data.AccountId}' | base64 -d)
90+
export CRR_CASCADE_INFO_C="{\"AccessKeyId\":\"${CASCADE_C_ACCESS_KEY}\",\"SecretAccessKey\":\"${CASCADE_C_SECRET_KEY}\",\"SessionToken\":\"${CASCADE_C_SESSION_TOKEN}\",\"AccountId\":\"${CASCADE_C_ACCOUNT_ID}\"}"
91+
7192
# --- 6. Keycloak test user ---
7293
export KEYCLOAK_TEST_USER="${OIDC_USERNAME}-norights"
7394
export KEYCLOAK_TEST_PASSWORD=${OIDC_PASSWORD}
@@ -103,6 +124,8 @@ export RING_S3C_BACKEND_SOURCE_NON_VERSIONED_LOCATION
103124
export RING_S3C_INGESTION_SRC_NON_VERSIONED_BUCKET_NAME
104125
export RING_S3C_INGESTION_NON_VERSIONED_OBJECT_COUNT_PER_TYPE
105126
export CRR_SOURCE_LOCATION_NAME CRR_DESTINATION_LOCATION_NAME CRR_ROLE_NAME
127+
export CRR_CASCADE_LOCATION_A_NAME CRR_CASCADE_LOCATION_B_NAME CRR_CASCADE_LOCATION_C_NAME
128+
export CRR_CASCADE_INFO_A CRR_CASCADE_INFO_B CRR_CASCADE_INFO_C
106129
export MOCHA_FILE=${MOCHA_FILE:-_reports/test-results-[hash].xml}
107130

108131
# Ensure test results dir exists for Mocha JUnit reporter
@@ -389,8 +412,14 @@ if [ -n "${GITHUB_ENV:-}" ]; then # Don't do it for Codespace
389412
echo "RING_S3C_ENDPOINT=$RING_S3C_ENDPOINT" >> "$GITHUB_ENV"
390413
echo "CRR_SOURCE_LOCATION_NAME=$CRR_SOURCE_LOCATION_NAME" >> "$GITHUB_ENV"
391414
echo "CRR_DESTINATION_LOCATION_NAME=$CRR_DESTINATION_LOCATION_NAME" >> "$GITHUB_ENV"
415+
echo "CRR_CASCADE_LOCATION_A_NAME=$CRR_CASCADE_LOCATION_A_NAME" >> "$GITHUB_ENV"
416+
echo "CRR_CASCADE_LOCATION_B_NAME=$CRR_CASCADE_LOCATION_B_NAME" >> "$GITHUB_ENV"
417+
echo "CRR_CASCADE_LOCATION_C_NAME=$CRR_CASCADE_LOCATION_C_NAME" >> "$GITHUB_ENV"
392418
echo "CRR_ROLE_NAME=$CRR_ROLE_NAME" >> "$GITHUB_ENV"
393419
# JSON vars need the heredoc delimiter syntax (values contain '=')
394420
printf 'CRR_SOURCE_INFO<<EOF\n%s\nEOF\n' "$CRR_SOURCE_INFO" >> "$GITHUB_ENV"
395421
printf 'CRR_DESTINATION_INFO<<EOF\n%s\nEOF\n' "$CRR_DESTINATION_INFO" >> "$GITHUB_ENV"
422+
printf 'CRR_CASCADE_INFO_A<<EOF\n%s\nEOF\n' "$CRR_CASCADE_INFO_A" >> "$GITHUB_ENV"
423+
printf 'CRR_CASCADE_INFO_B<<EOF\n%s\nEOF\n' "$CRR_CASCADE_INFO_B" >> "$GITHUB_ENV"
424+
printf 'CRR_CASCADE_INFO_C<<EOF\n%s\nEOF\n' "$CRR_CASCADE_INFO_C" >> "$GITHUB_ENV"
396425
fi

.github/workflows/end2end.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,12 @@ env:
7777
CRR_DESTINATION_LOCATION_NAME: crr-destination-location
7878
CRR_SOURCE_ACCOUNT_NAME: crr-source-account
7979
CRR_DESTINATION_ACCOUNT_NAME: crr-destination-account
80+
CRR_CASCADE_LOCATION_A_NAME: crr-cascade-location-a
81+
CRR_CASCADE_LOCATION_B_NAME: crr-cascade-location-b
82+
CRR_CASCADE_LOCATION_C_NAME: crr-cascade-location-c
83+
CRR_CASCADE_ACCOUNT_A_NAME: crr-cascade-account-a
84+
CRR_CASCADE_ACCOUNT_B_NAME: crr-cascade-account-b
85+
CRR_CASCADE_ACCOUNT_C_NAME: crr-cascade-account-c
8086
CRR_ROLE_NAME: crr-role
8187
# Enable this for Ring tests
8288
ENABLE_RING_TESTS: "false"

solution/deps.yaml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,21 @@
22
# to sort keys, use the following command
33
# yq eval 'sortKeys(.)' -i deps.yaml
44
backbeat:
5-
sourceRegistry: ghcr.io/scality
5+
sourceRegistry: ghcr.io/scality/playground/sylvainsenechal
66
dashboard: backbeat/backbeat-dashboards
77
image: backbeat
88
policy: backbeat/backbeat-policies
9-
tag: 9.4.0
9+
tag: 9.4.101
1010
envsubst: BACKBEAT_TAG
1111
busybox:
1212
image: busybox
1313
tag: 1.37.0
1414
envsubst: BUSYBOX_TAG
1515
cloudserver:
16-
sourceRegistry: ghcr.io/scality
16+
sourceRegistry: ghcr.io/scality/playground/sylvainsenechal
1717
dashboard: cloudserver/cloudserver-dashboards
1818
image: cloudserver
19-
tag: 9.3.9
19+
tag: 9.3.101
2020
envsubst: CLOUDSERVER_TAG
2121
drctl:
2222
sourceRegistry: ghcr.io/scality
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
Feature: CRR Cascade Replication
2+
3+
Cross-Region Replication (CRR) cascade allows an object written to a source
4+
Zenko location to automatically propagate through a chain of intermediate locations
5+
to a final destination. When Backbeat replicates an object via the putMetadata route
6+
with the x-scal-micro-version-id header, cloudserver rewrites the destination bucket's
7+
replicationInfo so Backbeat picks it up again for the next hop.
8+
9+
Three dedicated accounts (crr-cascade-account-a, crr-cascade-account-b,
10+
crr-cascade-account-c) each have their own IAM user, role and policy
11+
(s3:ReplicateObject), and three crr-v1 locations (crr-cascade-location-a,
12+
crr-cascade-location-b, crr-cascade-location-c) backed by those accounts.
13+
Credentials are injected via CRR_CASCADE_INFO_A, CRR_CASCADE_INFO_B,
14+
and CRR_CASCADE_INFO_C environment variables.
15+
16+
@2.15.0
17+
@PreMerge
18+
@ReplicationTest
19+
@CRRCascade
20+
Scenario: Object put in location A cascades through location B and arrives in location C
21+
Given a cascade replication chain from "crr-cascade-location-a" to "crr-cascade-location-b" to "crr-cascade-location-c"
22+
When I put object "cascade-obj" in the "crr-cascade-location-a" source bucket
23+
Then the object should replicate from "crr-cascade-location-a" to "crr-cascade-location-b" within 300 seconds
24+
And the object should replicate from "crr-cascade-location-b" to "crr-cascade-location-c" within 300 seconds
25+
26+
@2.15.0
27+
@PreMerge
28+
@ReplicationTest
29+
@CRRCascade
30+
Scenario: Object put in location A cascades through B and C and the loop back to A is detected
31+
Given a cascade replication loop from "crr-cascade-location-a" to "crr-cascade-location-b" to "crr-cascade-location-c" back to "crr-cascade-location-a"
32+
When I put object "cascade-loop-obj" in the "crr-cascade-location-a" source bucket
33+
Then the object should replicate from "crr-cascade-location-a" to "crr-cascade-location-b" within 300 seconds
34+
And the object should replicate from "crr-cascade-location-b" to "crr-cascade-location-c" within 300 seconds
35+
And the original object at "crr-cascade-location-a" should not be overwritten by the cascade loop within 30 seconds

tests/functional/ctst/features/crrReplicationS3utils.feature renamed to tests/functional/ctst/features/replication/crrReplicationS3utils.feature

File renamed without changes.

tests/functional/ctst/features/replication.feature renamed to tests/functional/ctst/features/replication/replication.feature

File renamed without changes.

0 commit comments

Comments
 (0)