aboutsummaryrefslogtreecommitdiffstats
path: root/packages/base/src/files/install/mysql/bin/db_upgrade_remote.sh
blob: a5b6e77da158819caa67e50e13b68081db086ed1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
#!/bin/bash 
###
# ============LICENSE_START=======================================================
# ECOMP Policy Engine
# ================================================================================
# Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
# ================================================================================
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ============LICENSE_END=========================================================

###
#
# db_upgrade_remote.sh: This script is to perform database schema upgrade on remote db, 
#                       no shecma downgrade will be performed in case db_version is higher then target_version
# 
# Logic: 1. Get target schema version from db scripts in $POLICY_HOME/data/mysql
#        2. Get current db schema version from support.db_version table (of target system)
#        3. Apply db upgrade script in order if target_version is HIGHER than db_version
#        4. Print out warning message        if target_version is LOWER than db_version
#        4. Print out message                if target_version is EQUAL to db_version
#
#
# Usage  : db_upgrade_remote.sh db_user_id  db_user_password hostname
# Example: db_upgrade_remote.sh policy_user password         localhost.com
#
# Assumption: 1. DB schema upgrade script in $POLICY_HOME/data/mysql folder with read permission
#             2. DB user has privilege to create/drop/alter database table
#
# Note: The default location for db schema upgrade script is $POLICY_HOME/data/mysql
#       The release level is represented as Two-digit-Year+Two-digit-Month+two-digit-Sub-release (151000, 151001)
#
#

TARGET_SCHEMA_VERSION=""
CURRENT_SCHEMA_VERSION=""
DB_UPGRADE_USER=""
DB_UPGRADE_PASSWORD=""
DB_HOSTNAME=""
DB_UPGRADE_DIR=$POLICY_HOME/data/mysql
DATE=`date +"%Y%m%d%H%M%S"`
LOG=""
ERR=""

function get_current_schema_version
{
  echo "Get current schema version from [${DB_HOSTNAME}] started ...@`date`" | tee -a $LOG
  # display output vertical
  query="select version from support.db_version where the_key = 'VERSION' \G"
  CURRENT_SCHEMA_VERSION=`${MYSQL} --skip-column-names --execute "${query}" 2>$ERR | grep -v "*"`
  error_msg=`cat $ERR | grep "doesn't exist"`
  if [ "${error_msg}" != "" ]; then 
    echo "Create support.db_version table ..." | tee -a $LOG
    sql="create database if not exists support;"
    ${MYSQL} --execute "${sql}"
    sql="create table support.db_version(the_key varchar(20) not null, version varchar(20), primary key(the_key));"
    ${MYSQL} --execute "${sql}" 
    CURRENT_SCHEMA_VERSION="00"
  fi
  echo "CURRENT_SCHEMA_VERSION: [$CURRENT_SCHEMA_VERSION]" | tee -a $LOG
  echo "Get current schema version from [${DB_HOSTNAME}] completed ...@`date`" | tee -a $LOG
}

function get_target_schema_version
{
  UPGRADE_LIST=/tmp/db_upgrade_list.$$
  find ${DB_UPGRADE_DIR} -name "*_upgrade_script.sql" 2>/dev/null | grep -v "droolspdp" | sort -r | head -1 > $UPGRADE_LIST
  while read -r file
  do
    TARGET_SCHEMA_VERSION=`basename $file | cut -d'_' -f1`
    echo "TARGET_SCHEMA_VERSION: [$TARGET_SCHEMA_VERSION]" | tee -a $LOG
    break
  done < $UPGRADE_LIST
  rm -f $UPGRADE_LIST
}

function evaluate_upgrade_downgrade
{
  echo "CURRENT_SCHEMA_VERSION --> [$CURRENT_SCHEMA_VERSION]" | tee -a $LOG
  echo "TARGET_SCHEMA_VERSION  --> [$TARGET_SCHEMA_VERSION] " | tee -a $LOG
  if [[ "${CURRENT_SCHEMA_VERSION}" < "${TARGET_SCHEMA_VERSION}" ]]; then 
    # perform db upgrade
    UPGRADE_LIST=/tmp/db_upgrade_list.$$
    find ${DB_UPGRADE_DIR} -name "*_upgrade_script.sql" 2>/dev/null | grep -v "droolspdp" | sort > $UPGRADE_LIST
    while read -r file
    do
      DB_VERSION=`basename $file | cut -d'_' -f1`
      #echo "[$DB_VERSION] [$TARGET_SCHEMA_VERSION]" | tee -a $LOG
      if [ "${DB_VERSION}" -gt "${CURRENT_SCHEMA_VERSION}" ] && [ "${DB_VERSION}" -le "${TARGET_SCHEMA_VERSION}" ]; then
        run_script "UPGRADE" "${file}" 2>&1 | tee -a $LOG
      fi
    done < $UPGRADE_LIST
    rm -f $UPGRADE_LIST
    set_current_release_level $TARGET_SCHEMA_VERSION
  elif [[ "${CURRENT_SCHEMA_VERSION}" > "${TARGET_SCHEMA_VERSION}" ]]; then 
    # db downgrade
    echo "WARNING: Target db schema version is LOWER than current db scema version, please run downgrade script manually." | tee -a $LOG | tee -a $ERR
  else
    echo "CURRENT SCHEMA VERSION THE SAME AS TARGET SCHEMA VERSION, NO ACTION TAKEN ..." | tee -a $LOG
  fi
}

function run_script
{
  action="${1}"
  script="${2}"
  echo "Perform DB $action on [${DB_HOSTNAME}] use $script ..." | tee -a $LOG
  echo "--" | tee -a $LOG
  ${MYSQL} --verbose < "${script}" 2>$ERR | tee -a $LOG
  echo "--" | tee -a $LOG
}

function set_current_release_level
{
  DB_VERSION="${1}"
  echo "Set current release level on [${DB_HOSTNAME}] to [$DB_VERSION] started ...@`date`" | tee -a $LOG
  update_statement="insert into support.db_version (the_key, version) values ('VERSION', '${DB_VERSION}') on duplicate key update version='${DB_VERSION}';"
  ${MYSQL} --execute "${update_statement}" 

  echo "" | tee -a $LOG
  echo "CURRENT_SCHEMA_VERSION set to: [$DB_VERSION]" | tee -a $LOG
  echo "" | tee -a $LOG
  echo "Set current release level on [${DB_HOSTNAME}] to [$DB_VERSION] completed ...@`date`" | tee -a $LOG
}

function check_directory
{
  if [ ! -d $DB_UPGRADE_DIR ]; then
    echo "ERROR, DIRECTORY NOT EXIST: $DB_UPGRADE_DIR, PROCESS EXIT ..."
    exit;
  else
    if [ ! -d $DB_UPGRADE_DIR/logs ]; then
      mkdir $DB_UPGRADE_DIR/logs
    fi
  fi
}

# MAIN
#check_directory
LOG=$POLICY_HOME/logs/db_upgrade_remote_$DATE.log
ERR=$POLICY_HOME/logs/db_upgrade_remote_$DATE.err
echo "db_upgrade_remote.sh started ..." | tee -a $LOG
if [ $# -eq 3 ]; then 
  DB_UPGRADE_USER="${1}"
  DB_UPGRADE_PASSWORD="${2}"
  DB_HOSTNAME="${3}"
  echo "DB_UPGRADE_USER: $DB_UPGRADE_USER" | tee -a $LOG
  echo "DB_UPGRADE_DIR : $DB_UPGRADE_DIR"  | tee -a $LOG
  echo "DB_HOSTNAME    : $DB_HOSTNAME"     | tee -a $LOG
  #
  typeset -r MYSQL="mysql -u${DB_UPGRADE_USER} -p${DB_UPGRADE_PASSWORD} -h ${DB_HOSTNAME}";
  get_target_schema_version
  if [ ${#TARGET_SCHEMA_VERSION} -ne 6 ]; then 
    echo "ERROR, TARGET_SCHEMA_VERSION MUST BE 6 DIGITS: $TARGET_SCHEMA_VERSION" | tee -a $LOG | tee -a $ERR
  else
    get_current_schema_version
    evaluate_upgrade_downgrade
  fi
else
  echo "Usage  : db_upgrade_remote.sh db_user_id   db_user_password db_hostname" | tee -a $LOG
  echo "Example: db_upgrade_remote.sh policy_user  password         localhost.com" | tee -a $LOG
fi

echo "db_upgrade_remote.sh completed ..." | tee -a $LOG