@@ -42,9 +42,17 @@ trap_add(){
4242 trap " ${cmd} " 0 1 2 3 15
4343}
4444
45- trap_remove (){
46- # Remove $1 command from 'trap_commands'.
47- trap_commands=( " ${trap_commands[@]/ $1 } " )
45+ trap_remove () {
46+ local element_to_remove=" $1 "
47+
48+ # Remove element_to_remove from trap_commands array.
49+ new_trap_commands=()
50+ for element in " ${trap_commands[@]} " ; do
51+ if [[ " $element " != " $element_to_remove " ]]; then
52+ new_trap_commands+=(" $element " )
53+ fi
54+ done
55+ trap_commands=(" ${new_trap_commands[@]} " )
4856
4957 # NOTE: if 'trap_commands' is empty, "${trap_commands}" cause unbound variable error when set -u.
5058 if [[ -z " ${trap_commands[@]} " ]]; then
@@ -142,6 +150,8 @@ get_version(){
142150 fi
143151}
144152
153+ # Usage: compare_version VER_1 VER_2.
154+ # Output: return -1 if VER_1 < VER_2, 0 if VER_1 == VER_2, and +1 if VER_1 > VER_2.
145155compare_version (){
146156 VER_1=(${1// ./ } )
147157 VER_2=(${2// ./ } )
@@ -397,6 +407,62 @@ get_mc(){
397407 fi
398408}
399409
410+ # Compare two timestamps (i.e. 2024-06-12T14:34:03Z).
411+ # Return 1 if timestamp1 > timestamp2 else 0.
412+ compare_timestamps () {
413+ local timestamp1=" $1 "
414+ local timestamp2=" $2 "
415+
416+ # Convert timestamps to seconds since epoch
417+ local epoch1=$( date -d " $timestamp1 " +%s)
418+ local epoch2=$( date -d " $timestamp2 " +%s)
419+
420+ # Compare the two epoch values
421+ if [ " $epoch1 " -gt " $epoch2 " ]; then
422+ echo " 1"
423+ else
424+ echo " 0"
425+ fi
426+ }
427+
428+ # Extract timestamp from `mc --version` output.
429+ get_mc_version () {
430+ local version_output
431+ version_output=$( " ${MC} " --version 2> /dev/null)
432+
433+ local timestamp
434+ timestamp=$( echo " $version_output " | grep -oP ' (?<=mc version RELEASE\.)[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}-[0-9]{2}-[0-9]{2}Z' )
435+
436+ if [[ -z " $timestamp " ]]; then
437+ echo " Error extracting timestamp"
438+ return 1
439+ fi
440+
441+ # Correct format (replace hyphens with colons only in time part).
442+ timestamp=$( echo " $timestamp " | sed -E ' s/(T[0-9]{2})-([0-9]{2})-([0-9]{2}Z)/\1:\2:\3/' )
443+ echo " $timestamp "
444+ }
445+
446+ # Judge if the --retry option is available in mc mirror command.
447+ # If the option is available return 1 else 0.
448+ has_mc_mirror_retry () {
449+ local timestamp_current
450+ local timestamp_comparison=" 2023-10-24T05:18:28Z"
451+
452+ timestamp_current=$( get_mc_version)
453+
454+ if [[ $? -ne 0 ]]; then
455+ echo " Error extracting timestamp"
456+ return 1
457+ fi
458+
459+ if [ " $( compare_timestamps " $timestamp_current " " $timestamp_comparison " ) " -eq 1 ]; then
460+ echo " 1"
461+ else
462+ echo " 0"
463+ fi
464+ }
465+
400466start_minio_port_forward (){
401467 touch ${TMP_WORK_DIR} /keep_minio_port_forward
402468 trap " rm -f ${TMP_WORK_DIR} /keep_minio_port_forward" 0 1 2 3 15
@@ -408,7 +474,7 @@ keep_minio_port_forward(){
408474 while [ -e ${TMP_WORK_DIR} /keep_minio_port_forward ]
409475 do
410476 if [ -n " ${S3_NAMESPACE+UNDEF} " ] ; then
411- oc ${OC_ARGS} -n " ${S3_NAMESPACE} " port-forward svc/${S3_PORT_FORWARD_SVC} ${S3_FORWARD_PORT} :${S3_PORT} & >> " ${BACKUP_RESTORE_LOG_DIR} /port-forward.log" &
477+ oc ${OC_ARGS} -n " ${S3_NAMESPACE} " port-forward " svc/${S3_PORT_FORWARD_SVC} " " ${S3_FORWARD_PORT} :${S3_PORT} " & >> " ${BACKUP_RESTORE_LOG_DIR} /port-forward.log" &
412478 else
413479 oc ${OC_ARGS} port-forward svc/${S3_PORT_FORWARD_SVC} ${S3_FORWARD_PORT} :${S3_PORT} & >> " ${BACKUP_RESTORE_LOG_DIR} /port-forward.log" &
414480 fi
@@ -488,7 +554,7 @@ Backup/Restore failed.
488554You can restart ${COMMAND} with adding "--continue-from" option:
489555 ex) ./all-backup-restore.sh ${COMMAND} -f ${BACKUP_FILE} --continue-from ${CURRENT_COMPONENT} ${RETRY_ADDITIONAL_OPTION:- }
490556You can unquiesce WatsonDiscovery by this command:
491- oc patch wd wd --type merge --patch '{"spec": {"shared": {"quiesce": {"enabled": false}}}}'
557+ oc patch wd ${TENANT_NAME} --type merge --patch '{"spec": {"shared": {"quiesce": {"enabled": false}}}}'
492558EOS
493559)
494560 brlog " ERROR" " ${message} "
@@ -577,10 +643,10 @@ get_migrator_image(){
577643 if [ $( compare_version " ${wd_version} " " 4.6.0" ) -le 0 ] ; then
578644 echo " $( get_migrator_repo) :${MIGRATOR_TAG:- $(get_migrator_tag)} "
579645 else
580- utils_repo=" $( oc get watsondiscoveryapi wd -o jsonpath=' {.spec.shared.dockerRegistryPrefix}' ) "
581- utils_image=" $( oc get watsondiscoveryapi wd -o jsonpath=' {.spec.shared.initContainer.utils.image.name}' ) "
582- utils_tag=" $( oc get watsondiscoveryapi wd -o jsonpath=' {.spec.shared.initContainer.utils.image.tag}' ) "
583- utils_digest=" $( oc get watsondiscoveryapi wd -o jsonpath=' {.spec.shared.initContainer.utils.image.digest}' ) "
646+ utils_repo=" $( oc get watsondiscoveryapi ${TENANT_NAME} -o jsonpath=' {.spec.shared.dockerRegistryPrefix}' ) "
647+ utils_image=" $( oc get watsondiscoveryapi ${TENANT_NAME} -o jsonpath=' {.spec.shared.initContainer.utils.image.name}' ) "
648+ utils_tag=" $( oc get watsondiscoveryapi ${TENANT_NAME} -o jsonpath=' {.spec.shared.initContainer.utils.image.tag}' ) "
649+ utils_digest=" $( oc get watsondiscoveryapi ${TENANT_NAME} -o jsonpath=' {.spec.shared.initContainer.utils.image.digest}' ) "
584650 echo " ${utils_repo} /${utils_image} :${utils_tag} @${utils_digest} "
585651 fi
586652}
@@ -1351,7 +1417,7 @@ create_restore_instance_mappings(){
13511417 fi
13521418 done
13531419 else
1354- brlog " INFO" " No Discovery instance exist. Create new one."
1420+ brlog " INFO" " No Discovery instance exist. Creating a new one."
13551421 local src_instances=( $( fetch_cmd_result ${ZEN_ACCESS_POD} " jq -r '.instance_mappings[].source_instance_id' /tmp/mapping.json" ) )
13561422 local display_names=( $( fetch_cmd_result ${ZEN_ACCESS_POD} " jq -r '.instance_mappings[].display_name' /tmp/mapping.json" ) )
13571423 for i in " ${! src_instances[@]} "
@@ -1375,7 +1441,7 @@ create_restore_instance_mappings(){
13751441}
13761442
13771443check_instance_mappings (){
1378- brlog " INFO" " Check instance mapping"
1444+ brlog " INFO" " Checking instance mapping"
13791445 if [ -z " ${MAPPING_FILE: +UNDEF} " ] ; then
13801446 brlog " INFO" " Mapping file is not specified"
13811447 export MAPPING_FILE=" ${BACKUP_DIR} /instance_mapping.json"
@@ -1466,11 +1532,11 @@ create_service_instance(){
14661532 fi
14671533 fi
14681534 if [ -z " ${ZEN_UID+UNDEF} " ] ; then
1469- brlog " INFO" " Get CP4D user ID for ${ZEN_USER_NAME} " >&2
1535+ brlog " INFO" " Getting CP4D user ID for ${ZEN_USER_NAME} " >&2
14701536 token=" $( fetch_cmd_result ${ZEN_ACCESS_POD} " curl -ks '${ZEN_CORE_API_ENDPOINT} /internal/v1/service_token?expiration_time=1000' -H 'secret: ${ZEN_CORE_TOKEN} ' -H 'cache-control: no-cache' | jq -r .token" ) "
14711537 ZEN_UID=" $( fetch_cmd_result ${ZEN_ACCESS_POD} " curl -ks '${ZEN_CORE_API_ENDPOINT} /openapi/v1/users/${ZEN_USER_NAME} ' -H 'Authorization: Bearer ${token} ' | jq -r '.UserInfo.uid'" ) "
14721538 fi
1473- brlog " INFO" " Create Discovery instance as ${ZEN_USER_NAME} :${ZEN_UID} " >&2
1539+ brlog " INFO" " Creating Discovery instance as ${ZEN_USER_NAME} :${ZEN_UID} " >&2
14741540 local token=$( fetch_cmd_result ${ZEN_ACCESS_POD} " curl -ks '${ZEN_CORE_API_ENDPOINT} /internal/v1/service_token?uid=${ZEN_UID} &username=${ZEN_USER_NAME} &display_name=${ZEN_USER_NAME} ' -H 'secret: ${ZEN_CORE_TOKEN} ' -H 'cache-control: no-cache' | jq -r .token" )
14751541 local instance_id=$( fetch_cmd_result ${ZEN_ACCESS_POD} " curl -ks -X POST '${WATSON_GATEWAY_ENDPOINT} /api/ibmcloud/resource-controller/resource_instances' -H 'Authorization: Bearer ${token} ' -H 'Content-Type: application/json' -d@/tmp/request.json | jq -r 'if .zen_id == null or .zen_id == \"\" then \" null\" else .zen_id end'" )
14761542 if [ " ${instance_id} " != " null" ] ; then
0 commit comments