ccb991461b4f1bf6cc12fd9f82d2a9341ce780d4
[plcapi.git] / migrations / v42-to-v43 / migrate.sh
1 #!/bin/bash
2
3 COMMAND=$(basename $0)
4 BASENAME=$(basename $COMMAND .sh)
5 DIRNAME=$(dirname $0)
6 # normalize
7 DIRNAME=$(cd ${DIRNAME}; /bin/pwd)
8
9 MIGRATION_SED=$DIRNAME/${BASENAME}.sed
10 MIGRATION_SQL=$DIRNAME/${BASENAME}.sql
11 # look in ..
12 UP=$(dirname $DIRNAME)
13 UPUP=$(dirname $UP)
14 SCHEMA_SQL=$UPUP/planetlab5.sql
15
16 DATE=$(date +%Y-%m-%d-%H-%M)
17 DATE_=$(date +%Y_%m_%d_%H_%M)
18 LOG=${DIRNAME}/${DATE}.log
19 DUMP=${DIRNAME}/pl4.sql
20 RESTORE=${DIRNAME}/${DATE}-pl5.sql
21 FAKE=${DIRNAME}/input-pl4.sql
22 VIEWS_SQL=$DIRNAME/${DATE}-views5.sql
23 NODEGROUPS_DEF=$DIRNAME/site-nodegroups.def
24 NODEGROUPS_SQL=$DIRNAME/${DATE}-nodegroups.sql
25
26 PGM_VIEWS=$UP/extract-views.py
27 PGM_NODEGROUPS=$DIRNAME/parse-site-nodegroups.py
28
29 INTERACTIVE_MODE="true"
30
31 # load config
32 . /etc/planetlab/plc_config
33
34 function run () {
35     message=$1; shift
36
37     if [ -n "$DEBUG" ] ; then 
38         echo -n "Type enter to run next step XXX $message XXX ... "
39         read _answer_
40     fi
41
42     echo -n "$message "
43     echo "==================================================" >> $LOG
44     echo $message >> $LOG
45     echo "$@" >> $LOG
46     "$@" >> $LOG 2>&1
47     echo Done
48 }
49
50 # return 0 (yes) or 1 (no) whether the database exists
51 function check_for_database () {
52     dbname=$1; shift
53     psql --user=$PLC_DB_USER --quiet -c "SELECT datname from pg_database where datname= '$dbname' LIMIT 1" $dbname > /dev/null 2>&1 
54     return $?
55 }
56
57 # when 'service plc start' gets run, the planetlab5 DB gets created 
58 # so this script will drop the planetlab5 DB and re-create it from scratch 
59 # with the contents of the planetlab4 DB that is epxected to exist
60 function confirm_nodegroups () {
61     echo "========================================"
62     echo "$COMMAND"
63     echo "This script is designed to ease the migration from myplc 4.2 to 4.3"
64     echo "It attempts to (re)create the planetlab5 database from planetlab4"
65     echo ""
66     echo "You might wish to edit/review"
67     echo "    $NODEGROUPS_DEF"
68     echo "    to finetune your migration"
69     echo ""
70     echo "Please refer to http://svn.planet-lab.org/wiki/Migration4to5"
71     echo "========================================"
72     echo -n "Are you sure you want to proceed y/[n] ? "
73     if [ "$INTERACTIVE_MODE" = "true" ] ; then
74         read answer
75         case $answer in
76             y|Y) echo See log in $LOG ;;
77             *) echo "Bye" ; exit 1 ;;
78         esac
79     fi
80 }
81
82 function check_env () {
83     [ -f $MIGRATION_SED ] || { echo $MIGRATION_SED not found - exiting ; exit 1; }
84     [ -f $MIGRATION_SQL ] || { echo $MIGRATION_SQL not found - exiting ; exit 1; }
85     [ -f $SCHEMA_SQL ] || { echo $SCHEMA_SQL not found - exiting ; exit 1; }
86     [ -f $NODEGROUPS_DEF ] || { echo $NODEGROUPS_DEF not found - exiting ; exit 1; }
87 }
88
89 # connect to the former myplc, performs a local dump of planetlab4 and creates is locally
90 function get_planetlab4 () {
91
92     # for faster tests ..
93     if [ -f $FAKE ] ; then
94         echo ''
95         echo 'xxxx     WARNING     WARNING     WARNING     WARNING     WARNING     xxx'
96         echo ''
97         echo Using fake input for tests $FAKE
98         echo ''
99         echo 'xxxx     WARNING     WARNING     WARNING     WARNING     WARNING     xxx'
100         echo ''
101         DUMP=$FAKE
102     elif [ -f $DUMP ] ; then
103         echo "Using planetlab4 from $DUMP"
104     else
105
106         echo -n "Enter the hostname for the former DB service : "
107         if [ "$INTERACTIVE_MODE" = "true" ] ; then 
108                 read hostname
109                 echo "Running pg_dump on $hostname.."
110                 pg_dump --ignore-version --host=$hostname --user=$PLC_DB_USER planetlab4 -f ${DUMP}
111         else
112                 pg_dump --ignore-version --user=$PLC_DB_USER planetlab4 -f ${DUMP}
113         fi
114         DUMP=$DUMP
115     fi
116 }
117
118 function prepare_planetlab5 () {
119
120     # check if planetlab5 exists
121     if check_for_database planetlab5 ; then
122         rename=planetlab5_${DATE_}
123         echo -n "There is an existing DB named planetlab5, drop or rename into $rename d/[r] ? "
124         if [ "$INTERACTIVE_MODE" = "true" ] ; then
125                 read _answer_
126         else
127                 _answer_='r'
128         fi
129         case $_answer_ in
130             d|D)
131                 run "Dropping    planetlab5" psql --user=postgres template1 -c "DROP DATABASE planetlab5" || true
132                 ;;
133             *)
134                 if check_for_database $rename ; then
135                     echo "$rename already exists - exiting"
136                     exit 1
137                 else
138                     run "Renaming planetlab5 into $rename" \
139                         psql --user=postgres template1  -c "ALTER DATABASE planetlab5 RENAME TO $rename" 
140                 fi
141                 ;;
142         esac
143     fi
144
145     # again: now it should not exist
146     if check_for_database planetlab5 ; then
147         echo "ERROR : FOUND planetlab5 - should not happen - exiting"
148         exit 1
149     fi
150 }
151
152
153
154 function migrate () {
155     set -e
156     cd $DIRNAME
157
158     # dump planetlab4
159     
160     run "Copying     into $RESTORE" cp $DUMP $RESTORE
161     run "Renaming    identifiers in $RESTORE" sed -f $MIGRATION_SED -i $RESTORE
162
163     run "Creating    planetlab5 database" createdb --user=postgres --encoding=UNICODE --owner=$PLC_DB_USER planetlab5
164     run "Loading     language plpgsql" createlang -U postgres plpgsql planetlab5 || true
165     run "Populating  planetlab5 from $RESTORE" psql --user=postgres -f $RESTORE planetlab5 
166     run "Parsing     $NODEGROUPS_DEF" $PGM_NODEGROUPS $NODEGROUPS_DEF $NODEGROUPS_SQL
167     run "Loading     $NODEGROUPS_SQL" psql --user=$PLC_DB_USER -f $NODEGROUPS_SQL planetlab5
168     run "Fine-tuning it with $MIGRATION_SQL" psql --user=$PLC_DB_USER -f $MIGRATION_SQL planetlab5
169     run "Extracting  views definitions from $SCHEMA_SQL" $PGM_VIEWS $SCHEMA_SQL $VIEWS_SQL
170     run "Inserting   views definitions in planetlab5" \
171         psql --user=$PLC_DB_USER -f $VIEWS_SQL planetlab5
172 }
173
174 function manage_link () {
175     dest=$1; shift
176     src=$1; shift
177     cd $DIRNAME
178     echo "Managing link $dest"
179     rm -f $dest
180     ln -s $src $dest
181 }
182
183 function links () {
184     # tmp 
185     result=${DIRNAME}/${DATE}-output.sql
186     run "Dumping result in $result" pg_dump --user=$PLC_DB_USER -f $result planetlab5
187
188     manage_link latest.log $LOG
189     manage_link latest-pl4.sql $DUMP
190     manage_link latest-pl5.sql $RESTORE
191     manage_link latest-views5.sql $VIEWS_SQL
192     manage_link latest-output.sql $result
193
194 }
195
196 function main () {
197
198     while getopts "b" opt ; do
199         case $opt in
200             b) INTERACTIVE_MODE='false' ;;
201             *) 
202                 echo "migrate.sh [-b]"
203                 echo " -b -- execute in batch mode without asking for user feedback"
204                 exit
205             ;;
206         esac
207     done
208     
209     check_env
210     confirm_nodegroups
211     echo "OK, we're clear, let's go"
212     set -e
213     get_planetlab4
214     prepare_planetlab5
215     migrate
216     links
217     echo "See logfile $LOG for detailed log"
218     echo "Checking for 'error' in the logfile"
219     grep -i error $LOG
220
221 }
222
223 main "$@"