Skip to content

Commit 734bb36

Browse files
committed
feat: updating discovery backup restore script for 5.2.0.
1 parent c5dfad3 commit 734bb36

8 files changed

Lines changed: 472 additions & 172 deletions

File tree

discovery-data/latest/all-backup-restore.sh

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -381,8 +381,10 @@ if ! "${BACKUP_RESTORE_IN_POD:-false}" ; then
381381
fi
382382

383383
if [ ${COMMAND} = 'backup' ] ; then
384-
ELASTIC_VERSION=$(get_elastic_version)
385-
validate_elastic_version "$ELASTIC_VERSION"
384+
if [ $(compare_version "${WD_VERSION}" "5.2.0") -lt 0 ] ; then
385+
ELASTIC_VERSION=$(get_elastic_version)
386+
validate_elastic_version "${ELASTIC_VERSION}"
387+
fi
386388
if [ $(compare_version "${WD_VERSION}" "4.0.6") -ge 0 ] ; then
387389
create_backup_instance_mappings
388390
fi
@@ -391,15 +393,17 @@ if [ ${COMMAND} = 'backup' ] ; then
391393
quiesce
392394
fi
393395
fi
394-
if [[ ${ELASTIC_VERSION} = "ES6" ]] && [[ ${REINDEX_OLD_INDEX} = "true" ]]; then
395-
reindex_elastic_es6
396-
fi
396+
if [ $(compare_version "${WD_VERSION}" "5.2.0") -lt 0 ] ; then
397+
if [[ ${ELASTIC_VERSION} = "ES6" ]] && [[ ${REINDEX_OLD_INDEX} = "true" ]]; then
398+
reindex_elastic_es6
399+
fi
400+
fi
401+
397402
if [ $(compare_version "${WD_VERSION}" "2.1.3") -ge 0 ] ; then
398403
ALL_COMPONENT=("wddata" "etcd" "postgresql" "elastic" "minio")
399404
else
400405
ALL_COMPONENT=("wddata" "etcd" "hdp" "postgresql" "elastic")
401406
fi
402-
403407
export ALL_COMPONENT
404408
export VERIFY_COMPONENT=( "${ALL_COMPONENT[@]}")
405409
BACKUP_FILE=${BACKUP_FILE:-"watson-discovery_$(date "+%Y%m%d_%H%M%S").backup"}

discovery-data/latest/elastic-backup-restore.sh

Lines changed: 348 additions & 144 deletions
Large diffs are not rendered by default.

discovery-data/latest/lib/function.bash

Lines changed: 96 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,19 @@ else
238238
TRANSFER_TAR_OPTIONS=("")
239239
fi
240240

241+
# Extract gzip compressed file into plain tar file.
242+
gzip_to_plain_tar() {
243+
brlog "DEBUG" "Recompressing file"
244+
local original_backup="$1"
245+
local recompressed_backup="$2"
246+
gunzip -c "${original_backup}" > "${recompressed_backup}"
247+
# Debug.
248+
original_backup_info=$(ls -lh "${original_backup}")
249+
recompressed_backup_info=$(ls -lh "${recompressed_backup}")
250+
brlog "DEBUG" "Original backup: ${original_backup_info}"
251+
brlog "DEBUG" "Recompressed backup: ${recompressed_backup_info}"
252+
}
253+
241254
kube_cp_from_local(){
242255
IS_RECURSIVE=false
243256
if [ "$1" = "-r" ] ; then
@@ -413,6 +426,18 @@ get_mc(){
413426
fi
414427
}
415428

429+
setup_mc() {
430+
mkdir -p ${TMP_WORK_DIR}/.mc
431+
if [ -n "${MC_COMMAND+UNDEF}" ] ; then
432+
MC=${MC_COMMAND}
433+
else
434+
get_mc ${TMP_WORK_DIR}
435+
MC=${TMP_WORK_DIR}/mc
436+
fi
437+
export MINIO_CONFIG_DIR="${PWD}/${TMP_WORK_DIR}/.mc"
438+
MC_OPTS=(--config-dir ${MINIO_CONFIG_DIR} --quiet --insecure)
439+
}
440+
416441
# Compare two timestamps (i.e. 2024-06-12T14:34:03Z).
417442
# Return 1 if timestamp1 > timestamp2 else 0.
418443
compare_timestamps() {
@@ -1254,7 +1279,8 @@ check_datastore_available(){
12541279
# Assume there are only version 6 or 7 indices in the cluster.
12551280
get_elastic_version() {
12561281
ELASTIC_POD=$(get_elastic_pod)
1257-
run_script_in_pod ${ELASTIC_POD} "${SCRIPT_DIR}/reindex_es6_indices.sh" "--dry-run" -c elasticsearch ${OC_ARGS}
1282+
ELASTIC_POD_CONTAINER=$(get_elastic_pod_container)
1283+
run_script_in_pod ${ELASTIC_POD} "${SCRIPT_DIR}/reindex_es6_indices.sh" "--dry-run" -c "${ELASTIC_POD_CONTAINER}" ${OC_ARGS}
12581284
result=$(get_last_cmd_result_in_pod)
12591285

12601286
if echo "$result" | grep -q "Skip ElasticSearch 6 index"; then
@@ -1287,7 +1313,8 @@ validate_elastic_version() {
12871313
# Reindex elastic search indices from version 6 to 7.
12881314
reindex_elastic_es6() {
12891315
brlog "INFO" "Reindexing ..."
1290-
run_script_in_pod ${ELASTIC_POD} "${SCRIPT_DIR}/reindex_es6_indices.sh" "" -c elasticsearch ${OC_ARGS}
1316+
ELASTIC_POD_CONTAINER=$(get_elastic_pod_container)
1317+
run_script_in_pod ${ELASTIC_POD} "${SCRIPT_DIR}/reindex_es6_indices.sh" "" -c "${ELASTIC_POD_CONTAINER}" ${OC_ARGS}
12911318
brlog "INFO" "Reindex completed. Waiting for ElasticSearch status to be green ..."
12921319
# Wait a few moments for elastic search to be ready after the reindex.
12931320
# TODO: implement waiting logic inside of reindex_es6_indices.sh, and remove the sleep below from this function.
@@ -1341,12 +1368,49 @@ check_postgres_available(){
13411368
}
13421369

13431370
get_elastic_pod(){
1344-
echo "$(oc get pods ${OC_ARGS} -o jsonpath="{.items[0].metadata.name}" -l tenant=${TENANT_NAME},app=elastic,ibm-es-data=True)"
1371+
local wd_version=${WD_VERSION:-$(get_version)}
1372+
if [ $(compare_version ${wd_version} "5.2.0") -lt 0 ] ; then
1373+
echo "$(oc get pods ${OC_ARGS} -o jsonpath="{.items[0].metadata.name}" -l tenant=${TENANT_NAME},app=elastic,ibm-es-data=True)"
1374+
else
1375+
echo "$(oc get pods ${OC_ARGS} -o jsonpath="{.items[0].metadata.name}" -l tenant=${TENANT_NAME},app=opensearch)"
1376+
fi
1377+
}
1378+
1379+
get_elastic_pod_container() {
1380+
local wd_version=${WD_VERSION:-$(get_version)}
1381+
if [ $(compare_version ${wd_version} "5.2.0") -lt 0 ] ; then
1382+
echo "elasticsearch"
1383+
else
1384+
echo "opensearch"
1385+
fi
1386+
}
1387+
1388+
get_elastic_repo() {
1389+
local wd_version=${WD_VERSION:-$(get_version)}
1390+
if [ $(compare_version ${wd_version} "5.2.0") -lt 0 ] ; then
1391+
echo "my_backup"
1392+
else
1393+
echo "cloudpak"
1394+
fi
1395+
}
1396+
1397+
get_elastic_repo_location() {
1398+
local wd_version=${WD_VERSION:-$(get_version)}
1399+
if [ $(compare_version ${wd_version} "5.2.0") -lt 0 ] ; then
1400+
echo "/workdir/shared_storage"
1401+
else
1402+
echo "/workdir/snapshot_storage"
1403+
fi
1404+
}
1405+
1406+
get_opensearch_cluster() {
1407+
echo "$(oc get cluster.opensearch ${OC_ARGS} -o jsonpath="{.items[0].metadata.name}" -l tenant=${TENANT_NAME},app=opensearch)"
13451408
}
13461409

13471410
check_elastic_available(){
13481411
ELASTIC_POD=$(get_elastic_pod)
1349-
oc exec ${OC_ARGS} "${ELASTIC_POD}" -c elasticsearch -- bash -c 'export ELASTIC_ENDPOINT=https://localhost:9200 && \
1412+
ELASTIC_POD_CONTAINER=$(get_elastic_pod_container)
1413+
oc exec ${OC_ARGS} "${ELASTIC_POD}" -c "${ELASTIC_POD_CONTAINER}" -- bash -c 'export ELASTIC_ENDPOINT=https://localhost:9200 && \
13501414
curl -s -k -u ${ELASTIC_USER}:${ELASTIC_PASSWORD} "${ELASTIC_ENDPOINT}/_cluster/health" | grep "\"status\":\"yellow\"\\|\"status\":\"green\"" > /dev/null' || return 1
13511415
return 0
13521416
}
@@ -1355,8 +1419,9 @@ check_s3_available(){
13551419
setup_s3_env
13561420
local wd_version="${WD_VERSION:-$(get_version)}"
13571421
if [ $(compare_version ${wd_version} "4.7.0") -lt 0 ] ; then
1358-
ELASTIC_POD=$(oc get pods ${OC_ARGS} -o jsonpath="{.items[0].metadata.name}" -l tenant=${TENANT_NAME},app=elastic,ibm-es-data=True)
1359-
oc exec ${OC_ARGS} "${ELASTIC_POD}" -c elasticsearch -- bash -c "curl -ks 'https://${S3_SVC}:${S3_PORT}/minio/health/ready' -w '%{http_code}' -o /dev/null | grep 200 > /dev/null" || return 1
1422+
ELASTIC_POD=$(get_elastic_pod)
1423+
ELASTIC_POD_CONTAINER=$(get_elastic_pod_container)
1424+
oc exec ${OC_ARGS} "${ELASTIC_POD}" -c "${ELASTIC_POD_CONTAINER}" -- bash -c "curl -ks 'https://${S3_SVC}:${S3_PORT}/minio/health/ready' -w '%{http_code}' -o /dev/null | grep 200 > /dev/null" || return 1
13601425
return 0
13611426
else
13621427
launch_s3_pod
@@ -1487,10 +1552,12 @@ check_instance_mappings(){
14871552

14881553
get_instance_tuples(){
14891554
ELASTIC_POD=$(get_elastic_pod)
1555+
ELASTIC_POD_CONTAINER=$(get_elastic_pod_container)
1556+
14901557
local file_name="$(basename "${MAPPING_FILE}")"
1491-
_oc_cp "${MAPPING_FILE}" "${ELASTIC_POD}:/tmp/mapping.json" -c elasticsearch
1492-
local mappings=( $(fetch_cmd_result ${ELASTIC_POD} "jq -r '.instance_mappings[] | \"\(.source_instance_id),\(.dest_instance_id)\"' /tmp/mapping.json" -c elasticsearch) )
1493-
oc exec -c elasticsearch ${ELASTIC_POD} -- bash -c "rm -f /tmp/mapping.json"
1558+
_oc_cp "${MAPPING_FILE}" "${ELASTIC_POD}:/tmp/mapping.json" -c "${ELASTIC_POD_CONTAINER}"
1559+
local mappings=( $(fetch_cmd_result ${ELASTIC_POD} "jq -r '.instance_mappings[] | \"\(.source_instance_id),\(.dest_instance_id)\"' /tmp/mapping.json" -c "${ELASTIC_POD_CONTAINER}") )
1560+
oc exec -c "${ELASTIC_POD_CONTAINER}" ${ELASTIC_POD} -- bash -c "rm -f /tmp/mapping.json"
14941561
for map in "${mappings[@]}"
14951562
do
14961563
ORG_IFS=${IFS}
@@ -1642,6 +1709,16 @@ get_bucket_suffix(){
16421709
echo "${suffix}"
16431710
}
16441711

1712+
get_snapshot_repo_size() {
1713+
local wd_version=${WD_VERSION:-$(get_version)}
1714+
if [ $(compare_version "${wd_version}" "5.2.0") -lt 0 ] ; then
1715+
echo "$(oc ${OC_ARGS} get elasticsearchcluster ${TENANT_NAME} -o jsonpath='{.spec.snapshotRepo.size}')"
1716+
else
1717+
opensearch_cluster=$(get_opensearch_cluster)
1718+
echo "$(oc ${OC_ARGS} get cluster.opensearch ${opensearch_cluster} -o jsonpath='{.spec.backup.sizeLimit}')"
1719+
fi
1720+
}
1721+
16451722
create_elastic_shared_pvc(){
16461723
local wd_version=${WD_VERSION:-$(get_version)}
16471724
if [ $(compare_version "${wd_version}" "4.7.0") -ge 0 ] ; then
@@ -1667,7 +1744,7 @@ create_elastic_shared_pvc(){
16671744
brlog "ERROR" "numfmt command is not available. Please install numfmt."
16681745
exit 1
16691746
fi
1670-
local snapshot_repo_size="$(oc ${OC_ARGS} get elasticsearchcluster ${TENANT_NAME} -o jsonpath='{.spec.snapshotRepo.size}')"
1747+
local snapshot_repo_size=$(get_snapshot_repo_size)
16711748
local size_array=( $(echo "${snapshot_repo_size}" | awk 'match($0, /([[:digit:]]+)([[:alpha:]]+)/, array) {print array[1], array[2]}') )
16721749
ELASTIC_SHARED_PVC_SIZE="$((size_array[0]*2))${size_array[1]}"
16731750
ELASTIC_SHARED_PVC_DEFAULT_NAME="${TENANT_NAME}-discovery-backup-restore-pvc"
@@ -1685,6 +1762,15 @@ spec:
16851762
storageClassName: ${FILE_STORAGE_CLASS}
16861763
EOF
16871764
ELASTIC_SHARED_PVC="${ELASTIC_SHARED_PVC_DEFAULT_NAME}"
1765+
1766+
if [ $(compare_version "${wd_version}" "5.2.0") -ge 0 ] ; then
1767+
# Need those label when using custom shared PVC for opensearch.
1768+
# https://pages.github.ibm.com/CloudPakOpenContent/ibm-opensearch-operator/api/crds/#clusterspecbackup
1769+
oc label pvc $ELASTIC_SHARED_PVC icpdsupport/empty-on-nd-backup=false
1770+
oc label pvc $ELASTIC_SHARED_PVC icpdsupport/ignore-on-nd-backup=false
1771+
fi
1772+
1773+
brlog "DEBUG" "Created '$ELASTIC_SHARED_PVC' PVC for elasticsearch backup/restore."
16881774
fi
16891775
fi
16901776
}

discovery-data/latest/lib/restore-updates.bash

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,24 @@
33
set -euo pipefail
44

55
UPDATE_DIR="$SCRIPT_DIR/src"
6+
source "${SCRIPT_DIR}/lib/function.bash"
7+
8+
ELASTIC_POD_CONTAINER=$(get_elastic_pod_container)
69

710
elastic_updates(){
811
if ls "$UPDATE_DIR"/*.elupdate &> /dev/null ; then
912
for ELASTIC_COMMAND in "$UPDATE_DIR"/*.elupdate; do
1013
value=$(<${ELASTIC_COMMAND})
11-
oc ${OC_ARGS} exec ${ELASTIC_POD} -c elasticsearch -- bash -c "${value}" >> "${BACKUP_RESTORE_LOG_DIR}/${CURRENT_COMPONENT}.log"
14+
oc ${OC_ARGS} exec ${ELASTIC_POD} -c "${ELASTIC_POD_CONTAINER}" -- bash -c "${value}" >> "${BACKUP_RESTORE_LOG_DIR}/${CURRENT_COMPONENT}.log"
1215
done
1316
fi
1417
if [ $(compare_version "${BACKUP_FILE_VERSION:-$(get_backup_version)}" "2.1.2") -le 0 ] ; then
1518
if ls "$UPDATE_DIR"/*.elupdate_script &> /dev/null ; then
1619
for ELASTIC_COMMAND in "$UPDATE_DIR"/*.elupdate_script; do
1720
UPDATE_SCRIPT_NAME=$(basename ${ELASTIC_COMMAND})
1821
_oc_cp ${ELASTIC_COMMAND} ${ELASTIC_POD}:/tmp/${UPDATE_SCRIPT_NAME} ${OC_ARGS}
19-
oc ${OC_ARGS} exec ${ELASTIC_POD} -c elasticsearch -- bash /tmp/${UPDATE_SCRIPT_NAME}
20-
oc ${OC_ARGS} exec ${ELASTIC_POD} -c elsaticsearch -- rm /tmp/${UPDATE_SCRIPT_NAME}
22+
oc ${OC_ARGS} exec ${ELASTIC_POD} -c "${ELASTIC_POD_CONTAINER}" -- bash /tmp/${UPDATE_SCRIPT_NAME}
23+
oc ${OC_ARGS} exec ${ELASTIC_POD} -c "${ELASTIC_POD_CONTAINER}" -- rm /tmp/${UPDATE_SCRIPT_NAME}
2124
done
2225
fi
2326
fi

discovery-data/latest/mt-mt-migration.sh

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,8 @@ setup_s3_env
8888
launch_s3_pod
8989
MC_POD=${POD}
9090

91-
ELASTIC_POD=$(oc get pods ${OC_ARGS} -o jsonpath="{.items[0].metadata.name}" -l tenant=${TENANT_NAME},app=elastic,ibm-es-data=True)
91+
ELASTIC_POD=$(get_elastic_pod)
92+
ELASTIC_POD_CONTAINER=$(get_elastic_pod_container)
9293

9394
brlog "INFO" "Start MT migration"
9495

@@ -242,8 +243,8 @@ do
242243
else
243244
replica=1
244245
fi
245-
_oc_cp "${SCRIPT_DIR}/src/tenant_index_template.json" "${ELASTIC_POD}:/tmp/tenant_index_template.json" ${OC_ARGS} -c elasticsearch
246-
run_script_in_pod ${ELASTIC_POD} "${SCRIPT_DIR}/src/elastic-mt-migration.sh" "-s ${src} -t ${dst} --template /tmp/tenant_index_template.json --replica ${replica}" -c elasticsearch
246+
_oc_cp "${SCRIPT_DIR}/src/tenant_index_template.json" "${ELASTIC_POD}:/tmp/tenant_index_template.json" ${OC_ARGS} -c "${ELASTIC_POD_CONTAINER}"
247+
run_script_in_pod ${ELASTIC_POD} "${SCRIPT_DIR}/src/elastic-mt-migration.sh" "-s ${src} -t ${dst} --template /tmp/tenant_index_template.json --replica ${replica}" -c "${ELASTIC_POD_CONTAINER}"
247248

248249
done
249250

discovery-data/latest/src/elastic-backup-restore-in-pod.sh

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ ELASTIC_REQUEST_TIMEOUT="30m"
2222
TMP_WORK_DIR="/tmp/backup-restore-workspace"
2323
CURRENT_COMPONENT="elastic"
2424
ELASTIC_LOG="${TMP_WORK_DIR}/elastic.log"
25+
ELASTIC_POD_CONTAINER=$(get_elastic_pod_container)
2526

2627
# Need to export HOME on OCP 4.18 which is used to configure the default mc config directory.
2728
export HOME="${TMP_WORK_DIR}"
@@ -106,7 +107,7 @@ EOF
106107
break;
107108
else
108109
# comment out the progress because it shows always 0 until it complete.
109-
# brlog "INFO" "Progress: $(fetch_cmd_result ${ELASTIC_POD} 'curl -s -k -u ${ELASTIC_USER}:${ELASTIC_PASSWORD} "${ELASTIC_ENDPOINT}/_snapshot/'${ELASTIC_REPO}'/'${ELASTIC_SNAPSHOT}'" | jq -c ".snapshots[0].shards"' ${OC_ARGS} -c elasticsearch)"
110+
# brlog "INFO" "Progress: $(fetch_cmd_result ${ELASTIC_POD} 'curl -s -k -u ${ELASTIC_USER}:${ELASTIC_PASSWORD} "${ELASTIC_ENDPOINT}/_snapshot/'${ELASTIC_REPO}'/'${ELASTIC_SNAPSHOT}'" | jq -c ".snapshots[0].shards"' ${OC_ARGS} -c "${ELASTIC_POD_CONTAINER}")"
110111
sleep ${ELASTIC_STATUS_CHECK_INTERVAL}
111112
fi
112113
done
@@ -197,7 +198,7 @@ EOF
197198
if [ "${ELASTIC_WAIT_GREEN_STATE}" = "true" ] ; then
198199
brlog "INFO" "Wait for the ElasticSearch to be Green State"
199200
while true;
200-
cluster_status=$(fetch_cmd_result ${ELASTIC_POD} 'curl -s -k -u ${ELASTIC_USER}:${ELASTIC_PASSWORD} "${ELASTIC_ENDPOINT}/_cluster/health" | jq -r ".status"' ${OC_ARGS} -c elasticsearch)
201+
cluster_status=$(fetch_cmd_result ${ELASTIC_POD} 'curl -s -k -u ${ELASTIC_USER}:${ELASTIC_PASSWORD} "${ELASTIC_ENDPOINT}/_cluster/health" | jq -r ".status"' ${OC_ARGS} -c "${ELASTIC_POD_CONTAINER}")
201202
do
202203
if [ "${cluster_status}" = "green" ] ; then
203204
break;

discovery-data/latest/st-mt-migration.sh

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,11 @@ fetch_cmd_result ${PG_POD} "PGUSER=${PGUSER} PGPASSWORD=${PGPASSWORD} psql -d da
5454
brlog "INFO" "Correct ElasticSearch Index"
5555

5656
ELASTIC_POD=${ELASTIC_POD:-$(get_elastic_pod)}
57-
ARCHIVED_SETTINGS=$(fetch_cmd_result ${ELASTIC_POD} 'curl -XGET -s -k -u ${ELASTIC_USER}:${ELASTIC_PASSWORD} "${ELASTIC_ENDPOINT}/_settings" | jq -r "if ( . | length == 0 ) then \"null\" else .[].settings.archived end" | uniq' -c elasticsearch ${OC_ARGS})
57+
ELASTIC_POD_CONTAINER=$(get_elastic_pod_container)
58+
ARCHIVED_SETTINGS=$(fetch_cmd_result ${ELASTIC_POD} 'curl -XGET -s -k -u ${ELASTIC_USER}:${ELASTIC_PASSWORD} "${ELASTIC_ENDPOINT}/_settings" | jq -r "if ( . | length == 0 ) then \"null\" else .[].settings.archived end" | uniq' -c "${ELASTIC_POD_CONTAINER}" ${OC_ARGS})
5859
if [ "${ARCHIVED_SETTINGS}" != "null" ] ; then
5960
brlog "INFO" "Found archived Index."
60-
run_script_in_pod ${ELASTIC_POD} "${SCRIPT_DIR}/src/reindex_archived_indices.sh" "" -c elasticsearch ${OC_ARGS}
61+
run_script_in_pod ${ELASTIC_POD} "${SCRIPT_DIR}/src/reindex_archived_indices.sh" "" -c "${ELASTIC_POD_CONTAINER}" ${OC_ARGS}
6162
else
6263
brlog "INFO" "No archived Index. Skip."
6364
fi
@@ -95,4 +96,4 @@ oc annotate ${OC_ARGS} wd ${TENANT_NAME} --overwrite watsonDiscoveryMigrationSou
9596

9697
if ! "${was_quiesced}" ; then
9798
unquiesce
98-
fi
99+
fi

discovery-data/latest/version.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
The Backup and Restore Scripts for the Watson Discovery on CP4D.
2-
Scripts Version: 5.1.2
2+
Scripts Version: 5.2.0

0 commit comments

Comments
 (0)