8def5cbabef00a52c714d40a66a14cd9f7ef4627
[osm/openvim.git] / database_utils / migrate_vim_db.sh
1 #!/bin/bash
2
3 ##
4 # Copyright 2015 Telefónica Investigación y Desarrollo, S.A.U.
5 # This file is part of openvim
6 # All Rights Reserved.
7 #
8 # Licensed under the Apache License, Version 2.0 (the "License"); you may
9 # not use this file except in compliance with the License. You may obtain
10 # a copy of the License at
11 #
12 # http://www.apache.org/licenses/LICENSE-2.0
13 #
14 # Unless required by applicable law or agreed to in writing, software
15 # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
16 # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
17 # License for the specific language governing permissions and limitations
18 # under the License.
19 #
20 # For those usages not covered by the Apache License, Version 2.0 please
21 # contact with: nfvlabs@tid.es
22 ##
23
24 #
25 #Upgrade/Downgrade openvim database preserving the content
26 #
27
28 DBUSER="vim"
29 DBPASS=""
30 DBHOST="localhost"
31 DBPORT="3306"
32 DBNAME="vim_db"
33
34 # Detect paths
35 MYSQL=$(which mysql)
36 AWK=$(which awk)
37 GREP=$(which grep)
38 DIRNAME=`dirname $0`
39
40 function usage(){
41 echo -e "Usage: $0 OPTIONS [{openvim_version}]"
42 echo -e " Upgrades/Downgrades openvim database preserving the content"
43 echo -e " if openvim_version is not provided it tries to get from openvimd.py using relative path"
44 echo -e " OPTIONS"
45 echo -e " -u USER database user. '$DBUSER' by default. Prompts if DB access fails"
46 echo -e " -p PASS database password. 'No password' or 'vimpw' by default. Prompts if DB access fails"
47 echo -e " -P PORT database port. '$DBPORT' by default"
48 echo -e " -h HOST database host. '$DBHOST' by default"
49 echo -e " -d NAME database name. '$DBNAME' by default. Prompts if DB access fails"
50 echo -e " --help shows this help"
51 }
52
53 while getopts ":u:p:P:h:d:-:" o; do
54 case "${o}" in
55 u)
56 DBUSER="$OPTARG"
57 ;;
58 p)
59 DBPASS="$OPTARG"
60 ;;
61 P)
62 DBPORT="$OPTARG"
63 ;;
64 d)
65 DBNAME="$OPTARG"
66 ;;
67 h)
68 DBHOST="$OPTARG"
69 ;;
70 -)
71 [ "${OPTARG}" == "help" ] && usage && exit 0
72 echo "Invalid option: --$OPTARG" >&2 && usage >&2
73 exit 1
74 ;;
75 \?)
76 echo "Invalid option: -$OPTARG" >&2 && usage >&2
77 exit 1
78 ;;
79 :)
80 echo "Option -$OPTARG requires an argument." >&2 && usage >&2
81 exit 1
82 ;;
83 *)
84 usage >&2
85 exit -1
86 ;;
87 esac
88 done
89 shift $((OPTIND-1))
90
91
92 #GET OPENVIM VERSION
93 OPENVIM_VER="$1"
94 if [ -z "$OPENVIM_VER" ]
95 then
96 OPENVIM_VER=`${DIRNAME}/../openvimd.py -v`
97 OPENVIM_VER=${OPENVIM_VER%%-r*}
98 OPENVIM_VER=${OPENVIM_VER##*version }
99 echo " Detected openvim version $OPENVIM_VER"
100 fi
101 VERSION_1=`echo $OPENVIM_VER | cut -f 1 -d"."`
102 VERSION_2=`echo $OPENVIM_VER | cut -f 2 -d"."`
103 VERSION_3=`echo $OPENVIM_VER | cut -f 3 -d"."`
104 if ! [ "$VERSION_1" -ge 0 -a "$VERSION_2" -ge 0 -a "$VERSION_3" -ge 0 ] 2>/dev/null
105 then
106 [ -n "$1" ] && echo "Invalid openvim version '$1', expected 'X.X.X'" >&2
107 [ -z "$1" ] && echo "Can not get openvim version" >&2
108 exit -1
109 fi
110 OPENVIM_VER_NUM=`printf "%d%03d%03d" ${VERSION_1} ${VERSION_2} ${VERSION_3}`
111
112 #Creating temporary file
113 TEMPFILE="$(mktemp -q --tmpdir "migratemanodb.XXXXXX")"
114 trap 'rm -f "$TEMPFILE"' EXIT
115 chmod 0600 "$TEMPFILE"
116
117 #if password is missing, before prompting for it try without password and with "manopw"
118 DBHOST_="-h$DBHOST"
119 DBPORT_="-P$DBPORT"
120 DEF_EXTRA_FILE_PARAM="--defaults-extra-file=$TEMPFILE"
121 if [ -z "${DBPASS}" ]
122 then
123 password_ok=""
124 echo -e "[client]\nuser='${DBUSER}'\npassword='vimpw'" > "$TEMPFILE"
125 mysql --defaults-extra-file="$TEMPFILE" $DBHOST_ $DBPORT_ $DBNAME -e "quit" >/dev/null 2>&1 && DBPASS="vimpw"
126 echo -e "[client]\nuser='${DBUSER}'\npassword=''" > "$TEMPFILE"
127 mysql --defaults-extra-file="$TEMPFILE" $DBHOST_ $DBPORT_ $DBNAME -e "quit" >/dev/null 2>&1 && DBPASS=""
128 fi
129 echo -e "[client]\nuser='${DBUSER}'\npassword='${DBPASS}'" > "$TEMPFILE"
130
131 #check and ask for database user password
132 while ! mysql "$DEF_EXTRA_FILE_PARAM" $DBHOST_ $DBPORT_ $DBNAME -e "quit" >/dev/null 2>&1
133 do
134 [ -n "$logintry" ] && echo -e "\nInvalid database credentials!!!. Try again (Ctrl+c to abort)"
135 [ -z "$logintry" ] && echo -e "\nProvide database name and credentials"
136 read -e -p "mysql database name($DBNAME): " KK
137 [ -n "$KK" ] && DBNAME="$KK"
138 read -e -p "mysql user($DBUSER): " KK
139 [ -n "$KK" ] && DBUSER="$KK"
140 read -e -s -p "mysql password: " DBPASS
141 echo -e "[client]\nuser='${DBUSER}'\npassword='${DBPASS}'" > "$TEMPFILE"
142 logintry="yes"
143 echo
144 done
145
146 DBCMD="mysql $DEF_EXTRA_FILE_PARAM $DBHOST_ $DBPORT_ $DBNAME"
147 #echo DBCMD $DBCMD
148
149 #GET DATABASE VERSION
150 #check that the database seems a openvim database
151 if ! echo -e "show create table instances;\nshow create table numas" | $DBCMD >/dev/null 2>&1
152 then
153 echo " database $DBNAME does not seem to be an openvim database" >&2
154 exit -1;
155 fi
156
157 if ! echo 'show create table schema_version;' | $DBCMD >/dev/null 2>&1
158 then
159 DATABASE_VER="0.0"
160 DATABASE_VER_NUM=0
161 else
162 DATABASE_VER_NUM=`echo "select max(version_int) from schema_version;" | $DBCMD | tail -n+2`
163 DATABASE_VER=`echo "select version from schema_version where version_int='$DATABASE_VER_NUM';" | $DBCMD | tail -n+2`
164 [ "$DATABASE_VER_NUM" -lt 0 -o "$DATABASE_VER_NUM" -gt 100 ] && echo " Error can not get database version ($DATABASE_VER?)" >&2 && exit -1
165 #echo "_${DATABASE_VER_NUM}_${DATABASE_VER}"
166 fi
167
168
169 #GET DATABASE TARGET VERSION
170 DATABASE_TARGET_VER_NUM=0
171 [ $OPENVIM_VER_NUM -gt 1091 ] && DATABASE_TARGET_VER_NUM=1 #>0.1.91 => 1
172 [ $OPENVIM_VER_NUM -ge 2003 ] && DATABASE_TARGET_VER_NUM=2 #0.2.03 => 2
173 [ $OPENVIM_VER_NUM -ge 2005 ] && DATABASE_TARGET_VER_NUM=3 #0.2.5 => 3
174 [ $OPENVIM_VER_NUM -ge 3001 ] && DATABASE_TARGET_VER_NUM=4 #0.3.1 => 4
175 [ $OPENVIM_VER_NUM -ge 4001 ] && DATABASE_TARGET_VER_NUM=5 #0.4.1 => 5
176 [ $OPENVIM_VER_NUM -ge 4002 ] && DATABASE_TARGET_VER_NUM=6 #0.4.2 => 6
177 [ $OPENVIM_VER_NUM -ge 4005 ] && DATABASE_TARGET_VER_NUM=7 #0.4.5 => 7
178 [ $OPENVIM_VER_NUM -ge 4010 ] && DATABASE_TARGET_VER_NUM=8 #0.4.10 => 8
179 [ $OPENVIM_VER_NUM -ge 5001 ] && DATABASE_TARGET_VER_NUM=9 #0.5.1 => 9
180 [ $OPENVIM_VER_NUM -ge 5002 ] && DATABASE_TARGET_VER_NUM=10 #0.5.2 => 10
181 [ $OPENVIM_VER_NUM -ge 5004 ] && DATABASE_TARGET_VER_NUM=11 #0.5.4 => 11
182 [ $OPENVIM_VER_NUM -ge 5005 ] && DATABASE_TARGET_VER_NUM=12 #0.5.5 => 12
183 [ $OPENVIM_VER_NUM -ge 5006 ] && DATABASE_TARGET_VER_NUM=13 #0.5.6 => 13
184 [ $OPENVIM_VER_NUM -ge 5007 ] && DATABASE_TARGET_VER_NUM=14 #0.5.7 => 14
185 #TODO ... put next versions here
186
187 function upgrade_to_1(){
188 echo " upgrade database from version 0.0 to version 0.1"
189 echo " CREATE TABLE \`schema_version\`"
190 echo "CREATE TABLE \`schema_version\` (
191 \`version_int\` INT NOT NULL COMMENT 'version as a number. Must not contain gaps',
192 \`version\` VARCHAR(20) NOT NULL COMMENT 'version as a text',
193 \`openvim_ver\` VARCHAR(20) NOT NULL COMMENT 'openvim version',
194 \`comments\` VARCHAR(2000) NULL COMMENT 'changes to database',
195 \`date\` DATE NULL,
196 PRIMARY KEY (\`version_int\`)
197 )
198 COMMENT='database schema control version'
199 COLLATE='utf8_general_ci'
200 ENGINE=InnoDB;" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
201 echo "INSERT INTO \`schema_version\` (\`version_int\`, \`version\`, \`openvim_ver\`, \`comments\`, \`date\`)
202 VALUES (1, '0.1', '0.2.00', 'insert schema_version; alter nets with last_error column', '2015-05-05');" | $DBCMD
203 echo " ALTER TABLE \`nets\`, ADD COLUMN \`last_error\`"
204 echo "ALTER TABLE \`nets\`
205 ADD COLUMN \`last_error\` VARCHAR(200) NULL AFTER \`status\`;" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
206 }
207 function downgrade_from_1(){
208 echo " downgrade database from version 0.1 to version 0.0"
209 echo " ALTER TABLE \`nets\` DROP COLUMN \`last_error\`"
210 echo "ALTER TABLE \`nets\` DROP COLUMN \`last_error\`;" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
211 echo " DROP TABLE \`schema_version\`"
212 echo "DROP TABLE \`schema_version\`;" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
213 }
214 function upgrade_to_2(){
215 echo " upgrade database from version 0.1 to version 0.2"
216 echo " ALTER TABLE \`of_ports_pci_correspondence\` \`resources_port\` \`ports\` ADD COLUMN \`switch_dpid\`"
217 for table in of_ports_pci_correspondence resources_port ports
218 do
219 echo "ALTER TABLE \`${table}\`
220 ADD COLUMN \`switch_dpid\` CHAR(23) NULL DEFAULT NULL AFTER \`switch_port\`; " | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
221 echo "ALTER TABLE ${table} CHANGE COLUMN switch_port switch_port VARCHAR(24) NULL DEFAULT NULL;" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
222 [ $table == of_ports_pci_correspondence ] ||
223 echo "ALTER TABLE ${table} DROP INDEX vlan_switch_port, ADD UNIQUE INDEX vlan_switch_port (vlan, switch_port, switch_dpid);" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
224 done
225 echo " UPDATE procedure UpdateSwitchPort"
226 echo "DROP PROCEDURE IF EXISTS UpdateSwitchPort;
227 delimiter //
228 CREATE PROCEDURE UpdateSwitchPort() MODIFIES SQL DATA SQL SECURITY INVOKER
229 COMMENT 'Load the openflow switch ports from of_ports_pci_correspondece into resoureces_port and ports'
230 BEGIN
231 #DELETES switch_port entry before writing, because if not it fails for key constrains
232 UPDATE ports
233 RIGHT JOIN resources_port as RP on ports.uuid=RP.port_id
234 INNER JOIN resources_port as RP2 on RP2.id=RP.root_id
235 INNER JOIN numas on RP.numa_id=numas.id
236 INNER JOIN hosts on numas.host_id=hosts.uuid
237 INNER JOIN of_ports_pci_correspondence as PC on hosts.ip_name=PC.ip_name and RP2.pci=PC.pci
238 SET ports.switch_port=null, ports.switch_dpid=null, RP.switch_port=null, RP.switch_dpid=null;
239 #write switch_port into resources_port and ports
240 UPDATE ports
241 RIGHT JOIN resources_port as RP on ports.uuid=RP.port_id
242 INNER JOIN resources_port as RP2 on RP2.id=RP.root_id
243 INNER JOIN numas on RP.numa_id=numas.id
244 INNER JOIN hosts on numas.host_id=hosts.uuid
245 INNER JOIN of_ports_pci_correspondence as PC on hosts.ip_name=PC.ip_name and RP2.pci=PC.pci
246 SET ports.switch_port=PC.switch_port, ports.switch_dpid=PC.switch_dpid, RP.switch_port=PC.switch_port, RP.switch_dpid=PC.switch_dpid;
247 END//
248 delimiter ;" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
249 echo "INSERT INTO \`schema_version\` (\`version_int\`, \`version\`, \`openvim_ver\`, \`comments\`, \`date\`)
250 VALUES (2, '0.2', '0.2.03', 'update Procedure UpdateSwitchPort', '2015-05-06');" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
251 }
252 function upgrade_to_3(){
253 echo " upgrade database from version 0.2 to version 0.3"
254 echo " change size of source_name at table resources_port"
255 echo "ALTER TABLE resources_port CHANGE COLUMN source_name source_name VARCHAR(24) NULL DEFAULT NULL AFTER port_id;"| $DBCMD || ! echo "ERROR. Aborted!" || exit -1
256 echo " CREATE PROCEDURE GetAllAvailablePorts"
257 echo "delimiter //
258 CREATE PROCEDURE GetAllAvailablePorts(IN Numa INT) CONTAINS SQL SQL SECURITY INVOKER
259 COMMENT 'Obtain all -including those not connected to switch port- ports available for a numa'
260 BEGIN
261 SELECT port_id, pci, Mbps, Mbps - Mbps_consumed as Mbps_free, totalSRIOV - coalesce(usedSRIOV,0) as availableSRIOV, switch_port, mac
262 FROM
263 (
264 SELECT id as port_id, Mbps, pci, switch_port, mac
265 FROM resources_port
266 WHERE numa_id = Numa AND id=root_id AND status = 'ok' AND instance_id IS NULL
267 ) as A
268 INNER JOIN
269 (
270 SELECT root_id, sum(Mbps_used) as Mbps_consumed, COUNT(id)-1 as totalSRIOV
271 FROM resources_port
272 WHERE numa_id = Numa AND status = 'ok'
273 GROUP BY root_id
274 ) as B
275 ON A.port_id = B.root_id
276 LEFT JOIN
277 (
278 SELECT root_id, COUNT(id) as usedSRIOV
279 FROM resources_port
280 WHERE numa_id = Numa AND status = 'ok' AND instance_id IS NOT NULL
281 GROUP BY root_id
282 ) as C
283 ON A.port_id = C.root_id
284 ORDER BY Mbps_free, availableSRIOV, pci;
285 END//
286 delimiter ;"| $DBCMD || ! ! echo "ERROR. Aborted!" || exit -1
287 echo "INSERT INTO schema_version (version_int, version, openvim_ver, comments, date) VALUES (3, '0.3', '0.2.5', 'New Procedure GetAllAvailablePorts', '2015-07-09');"| $DBCMD || ! echo "ERROR. Aborted!" || exit -1
288 }
289
290 function upgrade_to_4(){
291 echo " upgrade database from version 0.3 to version 0.4"
292 echo " remove unique VLAN index at 'resources_port', 'ports'"
293 echo "ALTER TABLE resources_port DROP INDEX vlan_switch_port;" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
294 echo "ALTER TABLE ports DROP INDEX vlan_switch_port;" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
295 echo " change table 'ports'"
296 echo "ALTER TABLE ports CHANGE COLUMN model model VARCHAR(12) NULL DEFAULT NULL COMMENT 'driver model for bridge ifaces; PF,VF,VFnotShared for data ifaces' AFTER mac;"| $DBCMD || ! echo "ERROR. Aborted!" || exit -1
297 echo "ALTER TABLE ports DROP COLUMN vlan_changed;"| $DBCMD || ! echo "ERROR. Aborted!" || exit -1
298 echo "ALTER TABLE resources_port DROP COLUMN vlan;"| $DBCMD || ! echo "ERROR. Aborted!" || exit -1
299 echo "INSERT INTO schema_version (version_int, version, openvim_ver, comments, date) VALUES (4, '0.4', '0.3.1', 'Remove unique index VLAN at resources_port', '2015-09-04');"| $DBCMD || ! echo "ERROR. Aborted!" || exit -1
300 }
301
302 function upgrade_to_X(){
303 #TODO, this change of foreign key does not work
304 echo " upgrade database from version 0.X to version 0.X"
305 echo "ALTER TABLE instances DROP FOREIGN KEY FK_instances_flavors, DROP INDEX FK_instances_flavors,
306 DROP FOREIGN KEY FK_instances_images, DROP INDEX FK_instances_flavors,;"| $DBCMD || ! echo "ERROR. Aborted!" || exit -1
307 echo "ALTER TABLE instances
308 ADD CONSTRAINT FK_instances_flavors FOREIGN KEY (flavor_id, tenant_id) REFERENCES tenants_flavors (flavor_id, tenant_id),
309 ADD CONSTRAINT FK_instances_images FOREIGN KEY (image_id, tenant_id) REFERENCES tenants_images (image_id, tenant_id);" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
310 }
311
312 function downgrade_from_2(){
313 echo " downgrade database from version 0.2 to version 0.1"
314 echo " UPDATE procedure UpdateSwitchPort"
315 echo "DROP PROCEDURE IF EXISTS UpdateSwitchPort;
316 delimiter //
317 CREATE PROCEDURE UpdateSwitchPort() MODIFIES SQL DATA SQL SECURITY INVOKER
318 BEGIN
319 UPDATE
320 resources_port INNER JOIN (
321 SELECT resources_port.id,KK.switch_port
322 FROM resources_port INNER JOIN numas on resources_port.numa_id=numas.id
323 INNER JOIN hosts on numas.host_id=hosts.uuid
324 INNER JOIN of_ports_pci_correspondence as KK on hosts.ip_name=KK.ip_name and resources_port.pci=KK.pci
325 ) as TABLA
326 ON resources_port.root_id=TABLA.id
327 SET resources_port.switch_port=TABLA.switch_port
328 WHERE resources_port.root_id=TABLA.id;
329 END//
330 delimiter ;" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
331 echo " ALTER TABLE \`of_ports_pci_correspondence\` \`resources_port\` \`ports\` DROP COLUMN \`switch_dpid\`"
332 for table in of_ports_pci_correspondence resources_port ports
333 do
334 [ $table == of_ports_pci_correspondence ] ||
335 echo "ALTER TABLE ${table} DROP INDEX vlan_switch_port, ADD UNIQUE INDEX vlan_switch_port (vlan, switch_port);" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
336 echo "ALTER TABLE \`${table}\` DROP COLUMN \`switch_dpid\`;" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
337 switch_port_size=12
338 [ $table == of_ports_pci_correspondence ] && switch_port_size=50
339 echo "ALTER TABLE ${table} CHANGE COLUMN switch_port switch_port VARCHAR(${switch_port_size}) NULL DEFAULT NULL;" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
340 done
341 echo "DELETE FROM \`schema_version\` WHERE \`version_int\` = '2';" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
342 }
343 function downgrade_from_3(){
344 echo " downgrade database from version 0.3 to version 0.2"
345 echo " change back size of source_name at table resources_port"
346 echo "ALTER TABLE resources_port CHANGE COLUMN source_name source_name VARCHAR(20) NULL DEFAULT NULL AFTER port_id;"| $DBCMD || ! echo "ERROR. Aborted!" || exit -1
347 echo " DROP PROCEDURE GetAllAvailablePorts"
348 echo "DROP PROCEDURE GetAllAvailablePorts;" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
349 echo "DELETE FROM schema_version WHERE version_int = '3';" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
350 }
351 function downgrade_from_4(){
352 echo " downgrade database from version 0.4 to version 0.3"
353 echo " adding back unique index VLAN at 'resources_port','ports'"
354 echo "ALTER TABLE resources_port ADD COLUMN vlan SMALLINT(5) UNSIGNED NULL DEFAULT NULL AFTER Mbps_used;"| $DBCMD || ! echo "ERROR. Aborted!" || exit -1
355 echo "UPDATE resources_port SET vlan= 99+id-root_id WHERE id != root_id;"| $DBCMD || ! echo "ERROR. Aborted!" || exit -1
356 echo "ALTER TABLE resources_port ADD UNIQUE INDEX vlan_switch_port (vlan, switch_port, switch_dpid);" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
357 echo "ALTER TABLE ports ADD UNIQUE INDEX vlan_switch_port (vlan, switch_port, switch_dpid);" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
358 echo " change back table 'ports'"
359 echo "ALTER TABLE ports CHANGE COLUMN model model VARCHAR(12) NULL DEFAULT NULL AFTER mac;"| $DBCMD || ! echo "ERROR. Aborted!" || exit -1
360 echo "ALTER TABLE ports ADD COLUMN vlan_changed SMALLINT(5) NULL DEFAULT NULL COMMENT '!=NULL when original vlan have been changed to match a pmp net with all ports in the same vlan' AFTER switch_port;"| $DBCMD || ! echo "ERROR. Aborted!" || exit -1
361 echo "DELETE FROM schema_version WHERE version_int = '4';" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
362 }
363
364
365 function upgrade_to_5(){
366 echo " upgrade database from version 0.4 to version 0.5"
367 echo " add 'ip_address' to ports'"
368 echo "ALTER TABLE ports ADD COLUMN ip_address VARCHAR(64) NULL DEFAULT NULL AFTER mac;" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
369 echo "INSERT INTO schema_version (version_int, version, openvim_ver, comments, date) VALUES (5, '0.5', '0.4.1', 'Add ip_address to ports', '2015-09-04');"| $DBCMD || ! echo "ERROR. Aborted!" || exit -1
370 }
371 function downgrade_from_5(){
372 echo " downgrade database from version 0.5 to version 0.4"
373 echo " removing 'ip_address' from 'ports'"
374 echo "ALTER TABLE ports DROP COLUMN ip_address;"| $DBCMD || ! echo "ERROR. Aborted!" || exit -1
375 echo "DELETE FROM schema_version WHERE version_int = '5';" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
376 }
377
378 function upgrade_to_6(){
379 echo " upgrade database from version 0.5 to version 0.6"
380 echo " Change enalarge name, description to 255 at all database"
381 for table in flavors images instances tenants
382 do
383 name_length=255
384 [[ $table == tenants ]] || name_length=64
385 echo -en " $table \r"
386 echo "ALTER TABLE $table CHANGE COLUMN name name VARCHAR($name_length) NOT NULL, CHANGE COLUMN description description VARCHAR(255) NULL DEFAULT NULL;" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
387 done
388 echo -en " hosts \r"
389 echo "ALTER TABLE hosts CHANGE COLUMN name name VARCHAR(255) NOT NULL, CHANGE COLUMN ip_name ip_name VARCHAR(64) NOT NULL, CHANGE COLUMN user user VARCHAR(64) NOT NULL, CHANGE COLUMN password password VARCHAR(64) NULL DEFAULT NULL, CHANGE COLUMN description description VARCHAR(255) NULL DEFAULT NULL, CHANGE COLUMN features features VARCHAR(255) NULL DEFAULT NULL;" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
390 echo -en " nets \r"
391 echo "ALTER TABLE nets CHANGE COLUMN name name VARCHAR(255) NOT NULL, CHANGE COLUMN last_error last_error VARCHAR(255) NULL DEFAULT NULL, CHANGE COLUMN bind bind VARCHAR(36) NULL DEFAULT NULL;" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
392 echo -en " instances \r"
393 echo "ALTER TABLE instances CHANGE COLUMN last_error last_error VARCHAR(255) NULL DEFAULT NULL;" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
394 echo -en " ports \r"
395 echo "ALTER TABLE ports CHANGE COLUMN name name VARCHAR(64) NOT NULL, CHANGE COLUMN switch_port switch_port VARCHAR(64) NULL DEFAULT NULL, CHANGE COLUMN switch_dpid switch_dpid VARCHAR(64) NULL DEFAULT NULL;" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
396 echo -en " of_flows \r"
397 echo "ALTER TABLE of_flows CHANGE COLUMN name name VARCHAR(64) NOT NULL, CHANGE COLUMN net_id net_id VARCHAR(36) NULL DEFAULT NULL, CHANGE COLUMN actions actions VARCHAR(255) NULL DEFAULT NULL;" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
398 echo -en " of_ports_pci_cor... \r"
399 echo "ALTER TABLE of_ports_pci_correspondence CHANGE COLUMN ip_name ip_name VARCHAR(64) NULL DEFAULT NULL, CHANGE COLUMN switch_port switch_port VARCHAR(64) NULL DEFAULT NULL, CHANGE COLUMN switch_dpid switch_dpid VARCHAR(64) NULL DEFAULT NULL;" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
400 echo -en " resources_port \r"
401 echo "ALTER TABLE resources_port CHANGE COLUMN source_name source_name VARCHAR(64) NULL DEFAULT NULL, CHANGE COLUMN switch_port switch_port VARCHAR(64) NULL DEFAULT NULL, CHANGE COLUMN switch_dpid switch_dpid VARCHAR(64) NULL DEFAULT NULL;" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
402 echo "INSERT INTO schema_version (version_int, version, openvim_ver, comments, date) VALUES (6, '0.6', '0.4.2', 'Enlarging name at database', '2016-02-01');" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
403 }
404 function downgrade_from_6(){
405 echo " downgrade database from version 0.6 to version 0.5"
406 echo " Change back name,description to shorter length at all database"
407 for table in flavors images instances tenants
408 do
409 name_length=50
410 [[ $table == flavors ]] || [[ $table == images ]] || name_length=36
411 echo -en " $table \r"
412 echo "ALTER TABLE $table CHANGE COLUMN name name VARCHAR($name_length) NOT NULL, CHANGE COLUMN description description VARCHAR(100) NULL DEFAULT NULL;" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
413 done
414 echo -en " hosts \r"
415 echo "ALTER TABLE hosts CHANGE COLUMN name name VARCHAR(36) NOT NULL, CHANGE COLUMN ip_name ip_name VARCHAR(36) NOT NULL, CHANGE COLUMN user user VARCHAR(36) NOT NULL, CHANGE COLUMN password password VARCHAR(36) NULL DEFAULT NULL, CHANGE COLUMN description description VARCHAR(100) NULL DEFAULT NULL, CHANGE COLUMN features features VARCHAR(50) NULL DEFAULT NULL;" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
416 echo -en " nets \r"
417 echo "ALTER TABLE nets CHANGE COLUMN name name VARCHAR(50) NOT NULL, CHANGE COLUMN last_error last_error VARCHAR(200) NULL DEFAULT NULL, CHANGE COLUMN bind bind VARCHAR(36) NULL DEFAULT NULL;" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
418 echo -en " instances \r"
419 echo "ALTER TABLE instances CHANGE COLUMN last_error last_error VARCHAR(200) NULL DEFAULT NULL;" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
420 echo -en " ports \r"
421 echo "ALTER TABLE ports CHANGE COLUMN name name VARCHAR(25) NULL DEFAULT NULL, CHANGE COLUMN switch_port switch_port VARCHAR(24) NULL DEFAULT NULL, CHANGE COLUMN switch_dpid switch_dpid VARCHAR(23) NULL DEFAULT NULL;" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
422 echo -en " of_flows \r"
423 echo "ALTER TABLE of_flows CHANGE COLUMN name name VARCHAR(50) NULL DEFAULT NULL, CHANGE COLUMN net_id net_id VARCHAR(50) NULL DEFAULT NULL, CHANGE COLUMN actions actions VARCHAR(100) NULL DEFAULT NULL;" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
424 echo -en " of_ports_pci_cor... \r"
425 echo "ALTER TABLE of_ports_pci_correspondence CHANGE COLUMN ip_name ip_name VARCHAR(50) NULL DEFAULT NULL, CHANGE COLUMN switch_port switch_port VARCHAR(24) NULL DEFAULT NULL, CHANGE COLUMN switch_dpid switch_dpid VARCHAR(23) NULL DEFAULT NULL;" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
426 echo -en " resources_port \r"
427 echo "ALTER TABLE resources_port CHANGE COLUMN source_name source_name VARCHAR(24) NULL DEFAULT NULL, CHANGE COLUMN switch_port switch_port VARCHAR(24) NULL DEFAULT NULL, CHANGE COLUMN switch_dpid switch_dpid VARCHAR(23) NULL DEFAULT NULL;" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
428 echo "DELETE FROM schema_version WHERE version_int='6';" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
429 }
430
431 function upgrade_to_7(){
432 echo " upgrade database from version 0.6 to version 0.7"
433 echo " add 'bind_net','bind_type','cidr','enable_dhcp' to 'nets'"
434 echo "ALTER TABLE nets ADD COLUMN cidr VARCHAR(64) NULL DEFAULT NULL AFTER bind, ADD COLUMN enable_dhcp ENUM('true','false') NOT NULL DEFAULT 'false' after cidr, ADD COLUMN dhcp_first_ip VARCHAR(64) NULL DEFAULT NULL AFTER enable_dhcp, ADD COLUMN dhcp_last_ip VARCHAR(64) NULL DEFAULT NULL AFTER dhcp_first_ip;" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
435 echo "ALTER TABLE nets CHANGE COLUMN bind provider VARCHAR(36) NULL DEFAULT NULL AFTER vlan;" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
436 echo "ALTER TABLE nets ADD COLUMN bind_net VARCHAR(36) NULL DEFAULT NULL COMMENT 'To connect with other net' AFTER provider, ADD COLUMN bind_type VARCHAR(36) NULL DEFAULT NULL COMMENT 'VLAN:<tag> to insert/remove' after bind_net;" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
437 echo "INSERT INTO schema_version (version_int, version, openvim_ver, comments, date) VALUES (7, '0.7', '0.4.5', 'Add bind_net to net table', '2016-02-12');"| $DBCMD || ! echo "ERROR. Aborted!" || exit -1
438 }
439 function downgrade_from_7(){
440 echo " downgrade database from version 0.7 to version 0.6"
441 echo " removing 'bind_net','bind_type','cidr','enable_dhcp' from 'nets'"
442 echo "ALTER TABLE nets CHANGE COLUMN provider bind NULL DEFAULT NULL AFTER vlan;" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
443 echo "ALTER TABLE nets DROP COLUMN cidr, DROP COLUMN enable_dhcp, DROP COLUMN bind_net, DROP COLUMN bind_type, DROP COLUMN dhcp_first_ip, DROP COLUMN dhcp_last_ip;"| $DBCMD || ! echo "ERROR. Aborted!" || exit -1
444 echo "DELETE FROM schema_version WHERE version_int = '7';" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
445 }
446
447 function upgrade_to_8(){
448 echo " upgrade database from version 0.7 to version 0.8"
449 echo " add column 'checksum' to 'images'"
450 echo "ALTER TABLE images ADD COLUMN checksum VARCHAR(32) NULL AFTER name;" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
451 echo "INSERT INTO schema_version (version_int, version, openvim_ver, comments, date) VALUES (8, '0.8', '0.4.10', 'add column checksum to images', '2016-09-30');"| $DBCMD || ! echo "ERROR. Aborted!" || exit -1
452 }
453 function downgrade_from_8(){
454 echo " downgrade database from version 0.8 to version 0.7"
455 echo " remove column 'checksum' from 'images'"
456 echo "ALTER TABLE images DROP COLUMN checksum;" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
457 echo "DELETE FROM schema_version WHERE version_int = '8';" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
458 }
459
460 function upgrade_to_9(){
461 echo " upgrade database from version 0.8 to version 0.9"
462 echo " change length of columns 'path' and 'name' to 255 in table 'images', and change length of column 'name' to 255 in table 'flavors'"
463 echo "ALTER TABLE images CHANGE COLUMN path path VARCHAR(255) NOT NULL AFTER uuid, CHANGE COLUMN name name VARCHAR(255) NOT NULL AFTER path;" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
464 echo "ALTER TABLE flavors CHANGE COLUMN name name VARCHAR(255) NOT NULL AFTER uuid;" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
465 echo "INSERT INTO schema_version (version_int, version, openvim_ver, comments, date) VALUES (9, '0.9', '0.5.1', 'increase length of columns path and name to 255 in table images, and change length of column name to 255 in table flavors', '2017-01-10');"| $DBCMD || ! echo "ERROR. Aborted!" || exit -1
466 }
467 function downgrade_from_9(){
468 echo " downgrade database from version 0.9 to version 0.8"
469 echo " change length of columns 'path' and 'name' to 100 and 64 in table 'images'"
470 echo "ALTER TABLE images CHANGE COLUMN path path VARCHAR(100) NOT NULL AFTER uuid, CHANGE COLUMN name name VARCHAR(64) NOT NULL AFTER path;" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
471 echo "ALTER TABLE flavors CHANGE COLUMN name name VARCHAR(64) NOT NULL AFTER uuid;" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
472 echo "DELETE FROM schema_version WHERE version_int = '9';" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
473 }
474
475 function upgrade_to_10(){
476 echo " upgrade database from version 0.9 to version 0.10"
477 echo " change types at 'ports'"
478 echo "ALTER TABLE ports CHANGE COLUMN type type ENUM('instance:bridge','instance:data','external','instance:ovs','controller:ovs') NOT NULL DEFAULT 'instance:bridge' AFTER status;" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
479 echo "INSERT INTO schema_version (version_int, version, openvim_ver, comments, date) VALUES (10, '0.10', '0.5.2', 'change ports type, adding instance:ovs', '2017-02-01');"| $DBCMD || ! echo "ERROR. Aborted!" || exit -1
480 }
481 function downgrade_from_10(){
482 echo " downgrade database from version 0.10 to version 0.9"
483 echo " change back types at 'ports'"
484 echo "ALTER TABLE ports CHANGE COLUMN type type ENUM('instance:bridge','instance:data','external') NOT NULL DEFAULT 'instance:bridge' AFTER status;" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
485 echo "DELETE FROM schema_version WHERE version_int = '10';" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
486 }
487
488 function upgrade_to_11(){
489 echo " upgrade database from version 0.10 to version 0.11"
490 echo " Add gateway_ip colum to 'nets'"
491 echo "ALTER TABLE nets ADD COLUMN gateway_ip VARCHAR(64) NULL DEFAULT NULL AFTER dhcp_last_ip;" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
492 echo "INSERT INTO schema_version (version_int, version, openvim_ver, comments, date) VALUES (11, '0.11', '0.5.4', 'Add gateway_ip colum to nets', '2017-02-13');"| $DBCMD || ! echo "ERROR. Aborted!" || exit -1
493 }
494 function downgrade_from_11(){
495 echo " downgrade database from version 0.11 to version 0.10"
496 echo " Delete gateway_ip colum from 'nets'"
497 echo "ALTER TABLE nets DROP COLUMN gateway_ip;" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
498 echo "DELETE FROM schema_version WHERE version_int = '11';" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
499 }
500 function upgrade_to_12(){
501 echo " upgrade database from version 0.11 to version 0.12"
502 echo " Create of_controller table "
503 echo "CREATE TABLE ofcs (
504 uuid VARCHAR(36) NOT NULL,
505 name VARCHAR(255) NOT NULL,
506 dpid VARCHAR(64) NOT NULL,
507 ip VARCHAR(64) NOT NULL,
508 port INT(5) NOT NULL,
509 type VARCHAR(64) NOT NULL,
510 version VARCHAR(12) NULL DEFAULT NULL,
511 user VARCHAR(64) NULL DEFAULT NULL,
512 password VARCHAR(64) NULL DEFAULT NULL,
513 PRIMARY KEY (uuid)
514 )
515 COLLATE='utf8_general_ci'
516 ENGINE=InnoDB;"| $DBCMD || ! echo "ERROR. Aborted!" || exit -1
517 echo " Modify user_at for uuids table"
518 echo "ALTER TABLE uuids CHANGE COLUMN used_at used_at VARCHAR(64) NULL DEFAULT NULL COMMENT 'Table that uses this UUID' ;"| $DBCMD || ! echo "ERROR. Aborted!" || exit -1
519 echo "INSERT INTO schema_version (version_int, version, openvim_ver, comments, date) VALUES (12, '0.12', '0.5.5', 'Add of_controller table', '2017-02-17');"| $DBCMD || ! echo "ERROR. Aborted!" || exit -1
520 }
521
522 function downgrade_from_12(){
523 echo " downgrade database from version 0.12 to version 0.11"
524 echo " Delete ofcs table"
525 echo "DROP TABLE ofcs;" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
526 echo "ALTER TABLE uuids CHANGE COLUMN used_at used_at ENUM('flavors', 'hosts', 'images', 'instances', 'nets', 'ports', 'tenants') NULL DEFAULT NULL COMMENT 'Table that uses this UUID' ;" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
527 echo "DELETE FROM schema_version WHERE version_int = '12';" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
528 }
529
530 function upgrade_to_13(){
531 echo " upgrade database from version 0.12 to version 0.13"
532 echo " Create of_port_mapings table "
533 echo "CREATE TABLE of_port_mappings (
534 uuid VARCHAR(36) NOT NULL,
535 ofc_id VARCHAR(36) NULL DEFAULT NULL,
536 region VARCHAR(64) NULL DEFAULT NULL,
537 compute_node VARCHAR(64) NULL DEFAULT NULL,
538 pci VARCHAR(50) NULL DEFAULT NULL,
539 switch_dpid VARCHAR(64) NULL DEFAULT NULL,
540 switch_port VARCHAR(64) NULL DEFAULT NULL,
541 switch_mac CHAR(18) NULL DEFAULT NULL,
542 UNIQUE INDEX switch_dpid_switch_port (switch_dpid, switch_port),
543 UNIQUE INDEX switch_dpid_switch_mac (switch_dpid, switch_mac),
544 UNIQUE INDEX region_compute_node_pci (region, compute_node, pci),
545 INDEX FK_of_port_mappings_ofcs (ofc_id),
546 CONSTRAINT FK_of_port_mappings_ofcs FOREIGN KEY (ofc_id) REFERENCES ofcs (uuid) ON UPDATE CASCADE ON DELETE CASCADE)
547 COLLATE='utf8_general_ci'
548 ENGINE=InnoDB;"| $DBCMD || ! echo "ERROR. Aborted!" || exit -1
549 echo "INSERT INTO schema_version (version_int, version, openvim_ver, comments, date) VALUES (13, '0.13', '0.5.6', 'Add of_port_mapings table', '2017-03-09');"| $DBCMD || ! echo "ERROR. Aborted!" || exit -1
550 }
551
552 function downgrade_from_13(){
553 echo " downgrade database from version 0.13 to version 0.12"
554 echo " Delete of_port_mappings table"
555 echo "DROP TABLE of_port_mappings;" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
556 echo "DELETE FROM schema_version WHERE version_int = '13';" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
557 }
558
559 function upgrade_to_14(){
560 echo " upgrade database from version 0.13 to version 0.14"
561 echo " Add switch_mac, ofc_id colum to 'ports' and 'resources_port'"
562 echo "ALTER TABLE ports
563 ADD COLUMN switch_mac VARCHAR(18) NULL DEFAULT NULL AFTER switch_port,
564 ADD COLUMN ofc_id VARCHAR(36) NULL DEFAULT NULL AFTER switch_dpid,
565 ADD CONSTRAINT FK_port_ofc_id FOREIGN KEY (ofc_id) REFERENCES ofcs (uuid);"| $DBCMD || ! echo "ERROR. Aborted!" || exit -1
566 echo "ALTER TABLE resources_port
567 ADD COLUMN switch_mac VARCHAR(18) NULL DEFAULT NULL AFTER switch_port,
568 ADD COLUMN ofc_id VARCHAR(36) NULL DEFAULT NULL AFTER switch_dpid,
569 ADD CONSTRAINT FK_resource_ofc_id FOREIGN KEY (ofc_id) REFERENCES ofcs (uuid);"| $DBCMD || ! echo "ERROR. Aborted!" || exit -1
570 echo "INSERT INTO schema_version (version_int, version, openvim_ver, comments, date) VALUES (14, '0.14', '0.5.7', 'Add switch_mac, ofc_id colum to ports and resources_port tables', '2017-03-09');"| $DBCMD || ! echo "ERROR. Aborted!" || exit -1
571 }
572
573 function downgrade_from_14(){
574 echo " downgrade database from version 0.14 to version 0.13"
575 echo " Delete switch_mac, ofc_id colum to 'ports'"
576 echo "ALTER TABLE ports
577 DROP COLUMN switch_mac,
578 DROP COLUMN ofc_id,
579 DROP FOREIGN KEY FK_port_ofc_id;" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
580 echo "ALTER TABLE resources_port
581 DROP COLUMN switch_mac,
582 DROP COLUMN ofc_id,
583 DROP FOREIGN KEY FK_resource_ofc_id;" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
584 echo "DELETE FROM schema_version WHERE version_int = '14';" | $DBCMD || ! echo "ERROR. Aborted!" || exit -1
585 }
586
587 #TODO ... put funtions here
588
589 echo "db version = "${DATABASE_VER_NUM}
590 [ $DATABASE_TARGET_VER_NUM -eq $DATABASE_VER_NUM ] && echo " current database version $DATABASE_VER is ok"
591 #UPGRADE DATABASE step by step
592 while [ $DATABASE_TARGET_VER_NUM -gt $DATABASE_VER_NUM ]
593 do
594 DATABASE_VER_NUM=$((DATABASE_VER_NUM+1))
595
596 upgrade_to_${DATABASE_VER_NUM}
597 #FILE_="${DIRNAME}/upgrade_to_${DATABASE_VER_NUM}.sh"
598 #[ ! -x "$FILE_" ] && echo "Error, can not find script '$FILE_' to upgrade" >&2 && exit -1
599 #$FILE_ || exit -1 # if fail return
600 done
601
602 #DOWNGRADE DATABASE step by step
603 while [ $DATABASE_TARGET_VER_NUM -lt $DATABASE_VER_NUM ]
604 do
605 #FILE_="${DIRNAME}/downgrade_from_${DATABASE_VER_NUM}.sh"
606 #[ ! -x "$FILE_" ] && echo "Error, can not find script '$FILE_' to downgrade" >&2 && exit -1
607 #$FILE_ || exit -1 # if fail return
608 downgrade_from_${DATABASE_VER_NUM}
609 DATABASE_VER_NUM=$((DATABASE_VER_NUM-1))
610 done
611
612 #echo done
613