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