diff --git a/ngcp-update-db-schema b/ngcp-update-db-schema index ce0813e2..c9d0b80d 100755 --- a/ngcp-update-db-schema +++ b/ngcp-update-db-schema @@ -59,48 +59,99 @@ if ! mysql -usipwise -p${SIPWISE_DB_PASSWORD} ngcp -e 'describe db_schema' >/de exit 1 fi -if [ -x /usr/sbin/ngcp-check_active ] ; then - if /usr/sbin/ngcp-check_active -q ; then - echo "This seems to be the active node, nothing to do." - exit 0 +running_on_active_node() { + if [ -x /usr/sbin/ngcp-check_active ] ; then + if /usr/sbin/ngcp-check_active -q ; then + echo "This seems to be the active node, nothing to do." + return 0 + else + echo "This seems to be the inactive node, registering revisions." + return 1 + fi + fi +} + +apply_revision() { + [ -n "$1" ] || return 1 + + rev="$1" + revname="$(basename $rev)" + + printf "Applying revision script %s: " "$rev" + if mysql -usipwise -p${SIPWISE_DB_PASSWORD} < "$rev" ; then + echo done else - # TODO - what about /usr/share/ngcp-upgrade-2.4/db/5670.up? - echo "This seems to be the inactive node, registering revisions." + echo "failed. :(" + exit 1 fi -fi + + if mysql -usipwise -p${SIPWISE_DB_PASSWORD} ngcp -e "insert into db_schema values (0, '${revname}', \""${hostname}"\", CURRENT_TIMESTAMP);" ; then + echo "Marked revision $rev for being applied." + else + echo "Error while executing DB commands using revision $rev for host $hostname" >&2 + exit 1 + fi +} + +# execute the rev script iff there's no entry for *any* host yet +apply_generic_revs() { + [ -n "$1" ] || return 1 + + rev="$1" + revname="$(basename $rev)" + + if ngcp-check-rev-applied --schema db_schema --revision "$revname" ; then + echo "Revision $revname has been applied already, nothing to do." + return 0 + fi + + apply_revision "$rev" +} + +# execute the rev script iff there's no entry for the *current* host yet +apply_host_specific_revs() { + [ -n "$1" ] || return 1 + + rev="$1" + revname="$(basename $rev)" + + if ngcp-check-rev-applied --schema db_schema --revision "$revname" --node "$hostname" ; then + echo "Revision $revname has been applied on $hostname already, nothing to do." + return 0 + fi + + apply_revision "$rev" +} revision_wrapper() { [ -n "$1" ] || return 1 for rev in $* ; do - revname="$(basename $rev)" cd $(dirname $rev) || exit 1 # would fail if a script references a file (like language_strings.txt) in its CWD - if ngcp-check-rev-applied --schema db_schema --revision "$revname" ; then - echo "Revision $revname has been applied already, nothing to do." - continue - fi - - printf "Applying revision script %s: " "$rev" - if mysql -usipwise -p${SIPWISE_DB_PASSWORD} < "$rev" ; then - echo done - else - echo "failed. :(" - exit 1 - fi + revname="$(basename $rev)" + + case "$revname" in + # the scripts that should be executed on *all* hosts, no matter whether + # they are active or inactive, since the script's content doesn't get replicated + *_not_replicated.up) + apply_host_specific_revs "$rev" + ;; + *) + if running_on_active_node ; then + echo "Replication script ${revname} noted, nothing to do on active node" + else + apply_generic_revs "$rev" + fi + ;; + esac + - if mysql -usipwise -p${SIPWISE_DB_PASSWORD} ngcp -e "insert into db_schema values (0, '${revname}', \""${hostname}"\", CURRENT_TIMESTAMP);" ; then - echo "Marked revision $rev for being applied." - else - echo "Error while executing DB commands using revision $rev for host $hostname" >&2 - exit 1 - fi done } revision_wrapper /usr/share/ngcp-db-schema/db_scripts/base/*.up revision_wrapper /usr/share/ngcp-db-schema/db_scripts/diff/*.up -# TODO language_wrapper ## END OF FILE #################################################################