21 from datetime
import datetime
22 from django.core.management.base
import BaseCommand
25 from django.conf
import settings
26 from django.db
import connections
27 from django.db
import transaction
28 from optparse
import make_option
40 'drop_column': [
'kwargs']
44 'drop_column': [
'public_key']
53 'image_id':
'system_image_id'
58 'drop_column': [
'interface']
61 'name':
'cm_template',
67 'name':
'cm_systemimagegroup',
77 MCURSOR.execute(query)
78 return MCURSOR.fetchall()
83 PCURSOR.execute(query)
88 PCURSOR.execute(query)
89 return PCURSOR.fetchall()
101 nrow.append(
"E'%s'" % str(i).replace(
"'",
"\\'").decode(
'utf-8'))
102 return ','.join(nrow)
107 help =
'Run migration from version 1.7'
108 option_list = BaseCommand.option_list + (
109 make_option(
'--name',
113 help=
'MySQL database name'),
114 make_option(
'--password',
118 help=
'MySQL database password'),
119 make_option(
'--user',
123 help=
'MySQL database user'),
124 make_option(
'--host',
128 help=
'MySQL database host'),
129 make_option(
'--port',
133 help=
'MySQL database port'),
137 sys.stdout.write(
'Run migration at: %s\n' % datetime.now())
139 settings.DATABASES.update({
141 'ENGINE':
'django.db.backends.mysql',
142 'NAME': options[
'name'],
143 'USER': options[
'user'],
144 'PASSWORD': options[
'password'],
145 'HOST': options[
'host'],
146 'PORT': options[
'port'],
151 MCURSOR = connections[
'mysql'].cursor()
153 print 'Cannot connect to MySQL database: %s' % e
158 PCURSOR = connections[
'default'].cursor()
160 print 'Cannot connect to PostgresSQL database: %s' % e
163 with transaction.commit_manually():
166 for table, desc
in tables.iteritems():
167 print 'Migrate table %s' % table
168 new_table = desc.get(
'name')
or 'cm_%s' % table
169 old_cols = [i[0]
for i
in mselect(
"describe %s;" % table)]
170 for name
in desc.get(
'drop_column', []):
171 old_cols.remove(name)
172 new_cols = old_cols[:]
173 rename_columns = desc.get(
'rename_columns')
175 for i, c
in enumerate(old_cols):
176 if c
in rename_columns:
177 new_cols[i] = rename_columns[c]
179 values =
mselect(
"select %s from %s;" % (
','.join(old_cols), table))
182 pinsert(
"insert into %s(%s) values (%s);" % (new_table,
','.join(new_cols),
prepare(row)))
184 seq_id_table = new_table +
'_id_seq'
185 if pselect(
"select column_name from information_schema.columns where table_name='%s' and column_name='id';" % (new_table)):
186 pinsert(
"select setval('%s', (select max(id) from %s));" % (seq_id_table, new_table))
189 values =
mselect(
"select id,name,description,user_id,type,disk_dev,creation_date,platform,size,access,"
190 "state,vm_id,storage_id,network_device,video_device,disk_controller,progress "
194 row[5] = ord(row[5][2]) - 96
196 row[4] =
'cm.isoimage'
198 row[4] =
'cm.storageimage'
200 row[4] =
'cm.systemimage'
201 pinsert(
"insert into cm_image (id,name,description,user_id,type,disk_dev,creation_date,"
202 "platform,size,access,state,vm_id,storage_id,network_device,video_device,"
203 "disk_controller,progress) values(%s);" %
prepare(row))
204 pinsert(
"select setval('%s', (select max(id) from %s));" % (
'cm_image_id_seq',
'cm_image'))
206 values =
mselect(
"select id, ip, user_id from public_lease;")
208 pinsert(
"insert into cm_publicip (id, address, user_id) values(%s);" %
prepare(row))
209 pinsert(
"select setval('%s', (select max(id) from %s));" % (
'cm_publicip_id_seq',
'cm_publicip'))
212 traceback.print_exc()
214 transaction.rollback()
215 print "Migration complete"