warning revised
[plcapi.git] / migrations / v4-to-v5 / 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}/${DATE}-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 # load config
30 . /etc/planetlab/plc_config
31
32 # return 0 (yes) or 1 (no) whether the database exists
33 function check_for_database () {
34     dbname=$1; shift
35     psql --user=$PLC_DB_USER --quiet -c "SELECT datname from pg_database where datname= '$dbname' LIMIT 1" $dbname > /dev/null 2>&1 
36     return $?
37 }
38
39 # when 'service plc start' gets run, the planetlab5 DB gets created 
40 # so this script will drop the planetlab5 DB and re-create it from scratch 
41 # with the contents of the planetlab4 DB that is epxected to exist
42 function warning () {
43     echo "========================================"
44     echo "$COMMAND"
45     echo "This script is designed to ease the migration from myplc 4.2 to 5.0"
46     echo "It attempts to (re)create the planetlab5 database from planetlab4"
47     echo ""
48     echo "You might wish to edit/review $NODEGROUPS_DEF to finetune your migration"
49     echo ""
50     echo "Please refer to http://svn.planet-lab.org/wiki/Migration4to5"
51     echo "========================================"
52     echo -n "Are you sure you want to proceed y/[n] ? "
53     read answer
54     case $answer in
55         y|Y) echo See log in $LOG ;;
56         *) echo "Bye" ; exit 1 ;;
57     esac
58 }
59
60 function check () {
61     [ -f $MIGRATION_SED ] || { echo $MIGRATION_SED not found - exiting ; exit 1; }
62     [ -f $MIGRATION_SQL ] || { echo $MIGRATION_SQL not found - exiting ; exit 1; }
63     [ -f $SCHEMA_SQL ] || { echo $SCHEMA_SQL not found - exiting ; exit 1; }
64     [ -f $NODEGROUPS_DEF ] || { echo $NODEGROUPS_DEF not found - exiting ; exit 1; }
65 }
66
67 function run () {
68     message=$1; shift
69
70     if [ -n "$DEBUG" ] ; then 
71         echo -n "Type enter to run next step XXX $message XXX ... "
72         read _answer_
73     fi
74
75     echo -n "$message "
76     echo "==================================================" >> $LOG
77     echo $message >> $LOG
78     echo "$@" >> $LOG
79     "$@" >> $LOG 2>&1
80     echo Done
81 }
82
83 function migrate () {
84     set -e
85     cd $DIRNAME
86
87     # check that planetlab4 exists
88     if check_for_database planetlab4 ; then
89         echo "OK : FOUND db planetlab4"
90     else
91         echo "ERROR : planetlab4 NOT FOUND - bye"
92         exit 1
93     fi
94
95     # check if planetlab5 exists
96     if check_for_database planetlab5 ; then
97         rename=planetlab5_${DATE_}
98         echo -n "There is an existing DB named planetlab5, drop or rename into $rename d/[r] ? "
99         read _answer_
100         case $_answer_ in
101             d|D)
102                 run "Dropping    planetlab5" psql --user=postgres template1 -c "DROP DATABASE planetlab5" || true
103                 ;;
104             *)
105                 if check_for_database $rename ; then
106                     echo "$rename already exists - exiting"
107                     exit 1
108                 else
109                     run "Renaming planetlab5 into $rename" \
110                         psql --user=postgres template1  -c "ALTER DATABASE planetlab5 RENAME TO $rename" 
111                 fi
112                 ;;
113         esac
114     fi
115
116     # again: now it should not exist
117     if check_for_database planetlab5 ; then
118         echo "ERROR : FOUND planetlab5 - should not happen - exiting"
119         exit 1
120     else
121         echo "OK, we're clear, let's go"
122     fi
123
124     # dump planetlab4
125     
126     if [ ! -f $FAKE ] ; then
127         run "Dumping     planetlab4 in $DUMP" pg_dump --user=$PLC_DB_USER -f $DUMP planetlab4 
128     else 
129         echo ''
130         echo 'xxxx     WARNING     WARNING     WARNING     WARNING     WARNING     xxx'
131         echo ''
132         echo Using fake input for tests $FAKE
133         echo ''
134         echo 'xxxx     WARNING     WARNING     WARNING     WARNING     WARNING     xxx'
135         echo ''
136         DUMP=$FAKE
137     fi
138
139     run "Copying     into $RESTORE" cp $DUMP $RESTORE
140     run "Renaming    identifiers in $RESTORE" sed -f $MIGRATION_SED -i $RESTORE
141
142     run "Creating    planetlab5 database" createdb --user=postgres --encoding=UNICODE --owner=$PLC_DB_USER planetlab5
143     run "Loading     language plpgsql" createlang -U postgres plpgsql planetlab5 || true
144     run "Populating  planetlab5 from $RESTORE" psql --user=postgres -f $RESTORE planetlab5 
145     run "Parsing     $NODEGROUPS_DEF" $PGM_NODEGROUPS $NODEGROUPS_DEF $NODEGROUPS_SQL
146     run "Loading     $NODEGROUPS_SQL" psql --user=$PLC_DB_USER -f $NODEGROUPS_SQL planetlab5
147     run "Fine-tuning it with $MIGRATION_SQL" psql --user=$PLC_DB_USER -f $MIGRATION_SQL planetlab5
148     run "Extracting  views definitions from $SCHEMA_SQL" $PGM_VIEWS $SCHEMA_SQL $VIEWS_SQL
149     run "Inserting   views definitions in planetlab5" \
150         psql --user=$PLC_DB_USER -f $VIEWS_SQL planetlab5
151 }
152
153 function manage_link () {
154     dest=$1; shift
155     src=$1; shift
156     cd $DIRNAME
157     echo "Managing link $dest"
158     rm -f $dest
159     ln -s $src $dest
160 }
161
162 function links () {
163     # tmp 
164     result=${DIRNAME}/${DATE}-output.sql
165     run "Dumping result in $result" pg_dump --user=$PLC_DB_USER -f $result planetlab5
166
167     manage_link latest.log $LOG
168     manage_link latest-pl4.sql $DUMP
169     manage_link latest-pl5.sql $RESTORE
170     manage_link latest-views5.sql $VIEWS_SQL
171     manage_link latest-output.sql $result
172
173 }
174
175 function main () {
176     
177     check
178     warning
179     set -e
180     migrate
181     links
182
183 }
184
185 main "$@"