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