Skip to content

Commit 2880a04

Browse files
committed
Merge upstream/main into feature/new-metadata-ui
2 parents 5a776df + 226e9c7 commit 2880a04

20 files changed

Lines changed: 34222 additions & 5738 deletions

.github/scripts/generate_ci_config.sh

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ set -xeuo pipefail
33

44
if [[ $# -lt 2 ]]; then
55
cat >&2 <<'USAGE'
6-
Usage: generate_ci_config.sh <output_path> <base_config_yaml> [--minio] [--jupyterhub] [--weko] [--flowable]
6+
Usage: generate_ci_config.sh <output_path> <base_config_yaml> [--minio] [--jupyterhub] [--weko] [--flowable] [--s3compatsigv4] [--s3compatsigv4-inst]
77
USAGE
88
exit 1
99
fi
@@ -15,6 +15,8 @@ MINIO=false
1515
JUPYTERHUB=false
1616
WEKO=false
1717
FLOWABLE=false
18+
S3COMPATSIGV4=false
19+
S3COMPATSIGV4_INST=false
1820

1921
for arg in "$@"; do
2022
case "$arg" in
@@ -30,6 +32,12 @@ for arg in "$@"; do
3032
--flowable)
3133
FLOWABLE=true
3234
;;
35+
--s3compatsigv4)
36+
S3COMPATSIGV4=true
37+
;;
38+
--s3compatsigv4-inst)
39+
S3COMPATSIGV4_INST=true
40+
;;
3341
*)
3442
echo "Unknown argument: ${arg}" >&2
3543
exit 1
@@ -146,4 +154,45 @@ workflow_enabled: false
146154
EOF
147155
fi
148156

157+
if [[ "${S3COMPATSIGV4}" == "true" ]]; then
158+
if [[ -z "${S3COMPATSIGV4_ACCESS_KEY_1:-}" || -z "${S3COMPATSIGV4_SECRET_KEY_1:-}" ]]; then
159+
echo "S3 compat sigv4 credentials are not set" >&2
160+
exit 1
161+
fi
162+
163+
cat >> "${OUTPUT}" <<EOF
164+
165+
s3compatsigv4_enabled: true
166+
167+
s3compatsigv4_access_key_1: '${S3COMPATSIGV4_ACCESS_KEY_1}'
168+
s3compatsigv4_secret_access_key_1: '${S3COMPATSIGV4_SECRET_KEY_1}'
169+
s3compatsigv4_endpoint_1: '${S3COMPATSIGV4_ENDPOINT}'
170+
s3compatsigv4_test_bucket_name_1: '${S3COMPATSIGV4_BUCKET_NAME_1}'
171+
172+
s3compatsigv4_access_key_2: '${S3COMPATSIGV4_ACCESS_KEY_2}'
173+
s3compatsigv4_secret_access_key_2: '${S3COMPATSIGV4_SECRET_KEY_2}'
174+
s3compatsigv4_endpoint_2: '${S3COMPATSIGV4_ENDPOINT}'
175+
s3compatsigv4_test_bucket_name_2: '${S3COMPATSIGV4_BUCKET_NAME_2}'
176+
177+
s3compatsigv4_type_name_1: '${S3COMPATSIGV4_SERVICE_NAME}'
178+
s3compatsigv4_type_name_2: '${S3COMPATSIGV4_SERVICE_NAME}'
179+
EOF
180+
fi
181+
182+
if [[ "${S3COMPATSIGV4_INST}" == "true" ]]; then
183+
if [[ -z "${S3COMPATSIGV4_INST_ACCESS_KEY:-}" || -z "${S3COMPATSIGV4_INST_SECRET_KEY:-}" ]]; then
184+
echo "S3 compat sigv4 institutional storage credentials are not set" >&2
185+
exit 1
186+
fi
187+
188+
cat >> "${OUTPUT}" <<EOF
189+
190+
s3compatsigv4_institutional_storage_enabled: true
191+
s3compatsigv4_inst_endpoint_url: '${S3COMPATSIGV4_INST_ENDPOINT}'
192+
s3compatsigv4_inst_access_key: '${S3COMPATSIGV4_INST_ACCESS_KEY}'
193+
s3compatsigv4_inst_secret_key: '${S3COMPATSIGV4_INST_SECRET_KEY}'
194+
s3compatsigv4_inst_bucket: '${S3COMPATSIGV4_INST_BUCKET}'
195+
EOF
196+
fi
197+
149198
cat "${OUTPUT}"

.github/scripts/setup_minio.sh

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,4 +109,50 @@ PY
109109

110110
mv "${tmp_json}" "${settings_json}"
111111

112+
# Also register MinIO service for s3compatsigv4 addon if available
113+
sigv4_settings_json="${RDM_ROOT}/addons/s3compatsigv4/static/settings.json"
114+
115+
if [[ -f "${sigv4_settings_json}" ]]; then
116+
tmp_json_sigv4=$(mktemp)
117+
118+
python - "$sigv4_settings_json" "$tmp_json_sigv4" <<'PY'
119+
import json
120+
import sys
121+
122+
src, dst = sys.argv[1:3]
123+
with open(src) as f:
124+
data = json.load(f)
125+
126+
service_name = "MinIO (CI)"
127+
host = "minio:9000"
128+
129+
available_services = data.setdefault("availableServices", [])
130+
131+
if not any(s.get("name") == service_name for s in available_services):
132+
available_services.append({
133+
"name": service_name,
134+
"host": host,
135+
"bucketLocations": {
136+
"us-east-1": {
137+
"name": "us-east-1",
138+
"host": host,
139+
},
140+
"": {
141+
"name": "us-east-1",
142+
},
143+
},
144+
"serverSideEncryption": False,
145+
})
146+
147+
with open(dst, "w") as f:
148+
json.dump(data, f, ensure_ascii=False, indent=4)
149+
f.write("\n")
150+
PY
151+
152+
mv "${tmp_json_sigv4}" "${sigv4_settings_json}"
153+
echo "MinIO configuration applied for s3compatsigv4"
154+
else
155+
echo "WARNING: s3compatsigv4 settings.json not found: ${sigv4_settings_json} (skipping)"
156+
fi
157+
112158
echo "MinIO configuration applied"

.github/workflows/e2e-test.yml

Lines changed: 149 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,14 @@ on:
4343
description: 'Custom WaterButler image (default: niicloudoperation/rdm-waterbutler:latest)'
4444
required: false
4545
default: ''
46+
wb_repository:
47+
description: 'RDM-waterbutler repository (default: RCOSDP/RDM-waterbutler)'
48+
required: false
49+
default: ''
50+
wb_branch:
51+
description: 'RDM-waterbutler branch to build and test against'
52+
required: false
53+
default: ''
4654
tljh_version:
4755
description: 'TLJH version (default: 1.0.0)'
4856
required: false
@@ -165,6 +173,20 @@ jobs:
165173
skip_login: true
166174
skip_130mb_upload: true
167175
minio_enabled: true
176+
s3compatsigv4_enabled: true
177+
weko_enabled: false
178+
jupyterhub_enabled: false
179+
flowable_enabled: false
180+
- name: admin-minio
181+
display_name: "Admin Tests (MinIO)"
182+
include_admin: true
183+
skip_admin: true
184+
skip_metadata: true
185+
skip_default_storage: true
186+
skip_login: true
187+
skip_130mb_upload: true
188+
minio_enabled: true
189+
s3compatsigv4_institutional_storage: true
168190
weko_enabled: false
169191
jupyterhub_enabled: false
170192
flowable_enabled: false
@@ -249,6 +271,8 @@ jobs:
249271
name: E2E ${{ matrix.test-group.display_name }}
250272
env:
251273
MINIO_ENABLED: ${{ matrix.test-group.minio_enabled == true && 'true' || 'false' }}
274+
S3COMPATSIGV4_ENABLED: ${{ matrix.test-group.s3compatsigv4_enabled == true && 'true' || 'false' }}
275+
S3COMPATSIGV4_INST_ENABLED: ${{ matrix.test-group.s3compatsigv4_institutional_storage == true && 'true' || 'false' }}
252276
WEKO_ENABLED: ${{ matrix.test-group.weko_enabled == true && 'true' || 'false' }}
253277
JUPYTERHUB_ENABLED: ${{ matrix.test-group.jupyterhub_enabled == true && 'true' || 'false' }}
254278
FLOWABLE_ENABLED: ${{ matrix.test-group.flowable_enabled == true && 'true' || 'false' }}
@@ -639,6 +663,46 @@ jobs:
639663
export INCLUDE_ADMIN=${{ matrix.test-group.include_admin }}
640664
setup_config_files
641665
666+
- name: Parse PR body and workflow parameters
667+
run: |
668+
if [[ "${{ github.event_name }}" == "pull_request" ]]; then
669+
cat > /tmp/pr_body.txt << 'EOF'
670+
${{ github.event.pull_request.body }}
671+
EOF
672+
echo "WB_CUSTOM_REPO=$(grep -oP '^-\s*WB_REPOSITORY:\s*\K.*$' /tmp/pr_body.txt | head -1 | tr -d ' \r' || true)" >> $GITHUB_ENV
673+
echo "WB_CUSTOM_BRANCH=$(grep -oP '^-\s*WB_BRANCH:\s*\K.*$' /tmp/pr_body.txt | head -1 | tr -d ' \r' || true)" >> $GITHUB_ENV
674+
else
675+
echo "WB_CUSTOM_REPO=${{ github.event.inputs.wb_repository }}" >> $GITHUB_ENV
676+
echo "WB_CUSTOM_BRANCH=${{ github.event.inputs.wb_branch }}" >> $GITHUB_ENV
677+
fi
678+
679+
- name: Build custom WaterButler image
680+
if: env.WB_CUSTOM_BRANCH != ''
681+
run: |
682+
WB_REPO="${WB_CUSTOM_REPO:-RCOSDP/RDM-waterbutler}"
683+
WB_BRANCH="${WB_CUSTOM_BRANCH}"
684+
WB_BASE_BRANCH="develop"
685+
686+
echo "Building custom WaterButler image from ${WB_REPO}@${WB_BRANCH}"
687+
688+
# Clone base branch
689+
git clone --depth=50 -b "$WB_BASE_BRANCH" "https://github.com/${WB_REPO}.git" RDM-waterbutler
690+
cd RDM-waterbutler
691+
692+
# Merge custom branch
693+
git fetch origin "$WB_BRANCH"
694+
git config user.name "github-actions[bot]"
695+
git config user.email "RDM-e2e-test-nb@example.com"
696+
git merge --no-ff FETCH_HEAD -m "Merge ${WB_BRANCH} for E2E tests"
697+
698+
# Build Docker image
699+
docker build -t rdm-waterbutler:custom .
700+
cd ..
701+
702+
# Override WB_IMAGE for subsequent steps
703+
echo "WB_IMAGE=rdm-waterbutler:custom" >> $GITHUB_ENV
704+
echo "Custom WaterButler image built successfully"
705+
642706
- name: Create docker-compose override for NII Cloud Operation images
643707
working-directory: RDM-osf.io
644708
run: |
@@ -668,22 +732,31 @@ jobs:
668732
echo "TLJH_PLUGIN_OVERRIDE=$TLJH_PLUGIN_OVERRIDE" >> $GITHUB_ENV
669733
echo "TLJH_REPO2DOCKER_IMAGE_OVERRIDE=$TLJH_REPO2DOCKER_IMAGE_OVERRIDE" >> $GITHUB_ENV
670734
echo "TLJH_RDMFS_IMAGE_OVERRIDE=$TLJH_RDMFS_IMAGE_OVERRIDE" >> $GITHUB_ENV
671-
735+
672736
# Use overrides if found, otherwise defaults
737+
# If WB_IMAGE was set by "Build custom WaterButler image" step, use it
673738
export OSF_IMAGE="${OSF_OVERRIDE:-niicloudoperation/rdm-osf.io:latest}"
674739
export EMBER_IMAGE="${EMBER_OVERRIDE:-niicloudoperation/rdm-ember-osf-web:latest}"
675740
export CAS_IMAGE="${CAS_OVERRIDE:-niicloudoperation/rdm-cas-overlay:latest}"
676741
export MFR_IMAGE="${MFR_OVERRIDE:-niicloudoperation/rdm-modular-file-renderer:latest}"
677-
export WB_IMAGE="${WB_OVERRIDE:-niicloudoperation/rdm-waterbutler:latest}"
742+
if [[ -n "$WB_IMAGE" ]]; then
743+
export WB_IMAGE
744+
else
745+
export WB_IMAGE="${WB_OVERRIDE:-niicloudoperation/rdm-waterbutler:latest}"
746+
fi
678747
else
679748
# Use workflow dispatch inputs or defaults
680749
export OSF_IMAGE="${{ github.event.inputs.osf_image || 'niicloudoperation/rdm-osf.io:latest' }}"
681750
export EMBER_IMAGE="${{ github.event.inputs.ember_image || 'niicloudoperation/rdm-ember-osf-web:latest' }}"
682751
export CAS_IMAGE="${{ github.event.inputs.cas_image || 'niicloudoperation/rdm-cas-overlay:latest' }}"
683752
export MFR_IMAGE="${{ github.event.inputs.mfr_image || 'niicloudoperation/rdm-modular-file-renderer:latest' }}"
684-
export WB_IMAGE="${{ github.event.inputs.wb_image || 'niicloudoperation/rdm-waterbutler:latest' }}"
753+
if [[ -n "$WB_IMAGE" ]]; then
754+
export WB_IMAGE
755+
else
756+
export WB_IMAGE="${{ github.event.inputs.wb_image || 'niicloudoperation/rdm-waterbutler:latest' }}"
757+
fi
685758
fi
686-
759+
687760
source ${{ github.workspace }}/e2e-tests/.github/scripts/setup_rdm.sh
688761
create_docker_override
689762
@@ -786,6 +859,72 @@ jobs:
786859
echo "S3COMPAT_ENDPOINT=${MINIO_ENDPOINT}" >> $GITHUB_ENV
787860
echo "S3COMPAT_SERVICE_NAME=${MINIO_SERVICE_NAME}" >> $GITHUB_ENV
788861
862+
- name: Initialize MinIO for S3CompatSigV4 tests
863+
if: env.MINIO_ENABLED == 'true' && (env.S3COMPATSIGV4_ENABLED == 'true' || env.S3COMPATSIGV4_INST_ENABLED == 'true')
864+
working-directory: e2e-tests
865+
run: |
866+
set -eu
867+
868+
key_part() {
869+
LC_ALL=C tr -dc 'a-z0-9' < /dev/urandom | head -c 18
870+
}
871+
872+
secret_part() {
873+
LC_ALL=C tr -dc 'A-Za-z0-9' < /dev/urandom | head -c 40
874+
}
875+
876+
BUCKET_PREFIX="ci-${GITHUB_RUN_ID:-0}-${GITHUB_RUN_ATTEMPT:-0}-sigv4"
877+
878+
if [ "${S3COMPATSIGV4_ENABLED}" = "true" ]; then
879+
ACCESS_KEY_1="ci$(key_part)"
880+
SECRET_KEY_1="$(secret_part)"
881+
ACCESS_KEY_2="ci$(key_part)"
882+
SECRET_KEY_2="$(secret_part)"
883+
884+
BUCKET_NAME_1="${BUCKET_PREFIX}-a"
885+
BUCKET_NAME_2="${BUCKET_PREFIX}-b"
886+
887+
.github/scripts/setup_minio_buckets.sh \
888+
../RDM-osf.io \
889+
"${MINIO_ALIAS}" \
890+
"${MINIO_ENDPOINT}" \
891+
"${MINIO_ROOT_USER}" \
892+
"${MINIO_ROOT_PASSWORD}" \
893+
"${ACCESS_KEY_1}" "${SECRET_KEY_1}" "${BUCKET_NAME_1}" \
894+
"${ACCESS_KEY_2}" "${SECRET_KEY_2}" "${BUCKET_NAME_2}"
895+
896+
echo "S3COMPATSIGV4_ACCESS_KEY_1=${ACCESS_KEY_1}" >> $GITHUB_ENV
897+
echo "S3COMPATSIGV4_SECRET_KEY_1=${SECRET_KEY_1}" >> $GITHUB_ENV
898+
echo "S3COMPATSIGV4_ACCESS_KEY_2=${ACCESS_KEY_2}" >> $GITHUB_ENV
899+
echo "S3COMPATSIGV4_SECRET_KEY_2=${SECRET_KEY_2}" >> $GITHUB_ENV
900+
echo "S3COMPATSIGV4_BUCKET_NAME_1=${BUCKET_NAME_1}" >> $GITHUB_ENV
901+
echo "S3COMPATSIGV4_BUCKET_NAME_2=${BUCKET_NAME_2}" >> $GITHUB_ENV
902+
echo "S3COMPATSIGV4_ENDPOINT=${MINIO_ENDPOINT}" >> $GITHUB_ENV
903+
echo "S3COMPATSIGV4_SERVICE_NAME=${MINIO_SERVICE_NAME}" >> $GITHUB_ENV
904+
fi
905+
906+
if [ "${S3COMPATSIGV4_INST_ENABLED}" = "true" ]; then
907+
INST_ACCESS_KEY="ci$(key_part)"
908+
INST_SECRET_KEY="$(secret_part)"
909+
INST_BUCKET="${BUCKET_PREFIX}-inst"
910+
# Second bucket is required by setup_minio_buckets.sh but not used for inst storage
911+
INST_BUCKET_DUMMY="${BUCKET_PREFIX}-inst2"
912+
913+
.github/scripts/setup_minio_buckets.sh \
914+
../RDM-osf.io \
915+
"${MINIO_ALIAS}" \
916+
"${MINIO_ENDPOINT}" \
917+
"${MINIO_ROOT_USER}" \
918+
"${MINIO_ROOT_PASSWORD}" \
919+
"${INST_ACCESS_KEY}" "${INST_SECRET_KEY}" "${INST_BUCKET}" \
920+
"${INST_ACCESS_KEY}" "${INST_SECRET_KEY}" "${INST_BUCKET_DUMMY}"
921+
922+
echo "S3COMPATSIGV4_INST_ACCESS_KEY=${INST_ACCESS_KEY}" >> $GITHUB_ENV
923+
echo "S3COMPATSIGV4_INST_SECRET_KEY=${INST_SECRET_KEY}" >> $GITHUB_ENV
924+
echo "S3COMPATSIGV4_INST_BUCKET=${INST_BUCKET}" >> $GITHUB_ENV
925+
echo "S3COMPATSIGV4_INST_ENDPOINT=${MINIO_ENDPOINT}" >> $GITHUB_ENV
926+
fi
927+
789928
- name: Start MinIO trace
790929
if: env.MINIO_ENABLED == 'true'
791930
working-directory: RDM-osf.io
@@ -1007,6 +1146,12 @@ jobs:
10071146
if [ "${FLOWABLE_ENABLED}" = "true" ]; then
10081147
args+=(--flowable)
10091148
fi
1149+
if [ "${S3COMPATSIGV4_ENABLED}" = "true" ]; then
1150+
args+=(--s3compatsigv4)
1151+
fi
1152+
if [ "${S3COMPATSIGV4_INST_ENABLED}" = "true" ]; then
1153+
args+=(--s3compatsigv4-inst)
1154+
fi
10101155
10111156
.github/scripts/generate_ci_config.sh "${args[@]}"
10121157
rm base_ci.config.yaml

0 commit comments

Comments
 (0)