Mercurial > kallithea
comparison rhodecode/lib/db_manage.py @ 3907:c7b919b2d90d beta
Changed default behaviour of dbmanage to fix issues with continues
migrations from multiple versions
author | Marcin Kuzminski <marcin@python-works.com> |
---|---|
date | Tue, 28 May 2013 21:21:58 +0200 |
parents | a2de0de0a4a9 |
children | e87298ccdfdb |
comparison
equal
deleted
inserted
replaced
3906:a2de0de0a4a9 | 3907:c7b919b2d90d |
---|---|
24 # You should have received a copy of the GNU General Public License | 24 # You should have received a copy of the GNU General Public License |
25 # along with this program. If not, see <http://www.gnu.org/licenses/>. | 25 # along with this program. If not, see <http://www.gnu.org/licenses/>. |
26 | 26 |
27 import os | 27 import os |
28 import sys | 28 import sys |
29 import time | |
29 import uuid | 30 import uuid |
30 import logging | 31 import logging |
31 from os.path import dirname as dn, join as jn | 32 from os.path import dirname as dn, join as jn |
32 | 33 |
33 from rhodecode import __dbversion__, __py_version__ | 34 from rhodecode import __dbversion__, __py_version__ |
54 def notify(msg): | 55 def notify(msg): |
55 """ | 56 """ |
56 Notification for migrations messages | 57 Notification for migrations messages |
57 """ | 58 """ |
58 ml = len(msg) + (4 * 2) | 59 ml = len(msg) + (4 * 2) |
59 print >> sys.stdout, ('*** %s ***\n%s' % (msg, '*' * ml)).upper() | 60 print('\n%s\n*** %s ***\n%s' % ('*' * ml, msg, '*' * ml)).upper() |
61 | |
62 | |
63 class UpgradeSteps(object): | |
64 """ | |
65 Those steps follow schema versions so for example schema | |
66 for example schema with seq 002 == step_2 and so on. | |
67 """ | |
68 | |
69 def __init__(self, klass): | |
70 self.klass = klass | |
71 | |
72 def step_1(self): | |
73 pass | |
74 | |
75 def step_2(self): | |
76 notify('Patching repo paths for newer version of RhodeCode') | |
77 self.klass.fix_repo_paths() | |
78 | |
79 notify('Patching default user of RhodeCode') | |
80 self.klass.fix_default_user() | |
81 | |
82 log.info('Changing ui settings') | |
83 self.klass.create_ui_settings() | |
84 | |
85 def step_3(self): | |
86 notify('Adding additional settings into RhodeCode db') | |
87 self.klass.fix_settings() | |
88 notify('Adding ldap defaults') | |
89 self.klass.create_ldap_options(skip_existing=True) | |
90 | |
91 def step_4(self): | |
92 notify('create permissions and fix groups') | |
93 self.klass.create_permissions() | |
94 self.klass.fixup_groups() | |
95 | |
96 def step_5(self): | |
97 pass | |
98 | |
99 def step_6(self): | |
100 | |
101 notify('re-checking permissions') | |
102 self.klass.create_permissions() | |
103 | |
104 notify('installing new UI options') | |
105 sett4 = RhodeCodeSetting('show_public_icon', True) | |
106 Session().add(sett4) | |
107 sett5 = RhodeCodeSetting('show_private_icon', True) | |
108 Session().add(sett5) | |
109 sett6 = RhodeCodeSetting('stylify_metatags', False) | |
110 Session().add(sett6) | |
111 | |
112 notify('fixing old PULL hook') | |
113 _pull = RhodeCodeUi.get_by_key('preoutgoing.pull_logger') | |
114 if _pull: | |
115 _pull.ui_key = RhodeCodeUi.HOOK_PULL | |
116 Session().add(_pull) | |
117 | |
118 notify('fixing old PUSH hook') | |
119 _push = RhodeCodeUi.get_by_key('pretxnchangegroup.push_logger') | |
120 if _push: | |
121 _push.ui_key = RhodeCodeUi.HOOK_PUSH | |
122 Session().add(_push) | |
123 | |
124 notify('installing new pre-push hook') | |
125 hooks4 = RhodeCodeUi() | |
126 hooks4.ui_section = 'hooks' | |
127 hooks4.ui_key = RhodeCodeUi.HOOK_PRE_PUSH | |
128 hooks4.ui_value = 'python:rhodecode.lib.hooks.pre_push' | |
129 Session().add(hooks4) | |
130 | |
131 notify('installing new pre-pull hook') | |
132 hooks6 = RhodeCodeUi() | |
133 hooks6.ui_section = 'hooks' | |
134 hooks6.ui_key = RhodeCodeUi.HOOK_PRE_PULL | |
135 hooks6.ui_value = 'python:rhodecode.lib.hooks.pre_pull' | |
136 Session().add(hooks6) | |
137 | |
138 notify('installing hgsubversion option') | |
139 # enable hgsubversion disabled by default | |
140 hgsubversion = RhodeCodeUi() | |
141 hgsubversion.ui_section = 'extensions' | |
142 hgsubversion.ui_key = 'hgsubversion' | |
143 hgsubversion.ui_value = '' | |
144 hgsubversion.ui_active = False | |
145 Session().add(hgsubversion) | |
146 | |
147 notify('installing hg git option') | |
148 # enable hggit disabled by default | |
149 hggit = RhodeCodeUi() | |
150 hggit.ui_section = 'extensions' | |
151 hggit.ui_key = 'hggit' | |
152 hggit.ui_value = '' | |
153 hggit.ui_active = False | |
154 Session().add(hggit) | |
155 | |
156 notify('re-check default permissions') | |
157 default_user = User.get_by_username(User.DEFAULT_USER) | |
158 perm = Permission.get_by_key('hg.fork.repository') | |
159 reg_perm = UserToPerm() | |
160 reg_perm.user = default_user | |
161 reg_perm.permission = perm | |
162 Session().add(reg_perm) | |
163 | |
164 def step_7(self): | |
165 perm_fixes = self.klass.reset_permissions(User.DEFAULT_USER) | |
166 Session().commit() | |
167 if perm_fixes: | |
168 notify('There was an inconsistent state of permissions ' | |
169 'detected for default user. Permissions are now ' | |
170 'reset to the default value for default user. ' | |
171 'Please validate and check default permissions ' | |
172 'in admin panel') | |
173 | |
174 def step_8(self): | |
175 self.klass.create_permissions() | |
176 self.klass.populate_default_permissions() | |
177 self.klass.create_default_options(skip_existing=True) | |
178 Session().commit() | |
179 | |
180 def step_9(self): | |
181 pass | |
182 | |
183 def step_10(self): | |
184 pass | |
185 | |
186 def step_11(self): | |
187 self.klass.update_repo_info() | |
188 | |
189 def step_12(self): | |
190 self.klass.create_permissions() | |
191 Session().commit() | |
192 | |
193 self.klass.populate_default_permissions() | |
194 Session().commit() | |
195 | |
196 #fix all usergroups | |
197 ug_model = UserGroupModel() | |
198 for ug in UserGroup.get_all(): | |
199 perm_obj = ug_model._create_default_perms(ug) | |
200 Session().add(perm_obj) | |
201 Session().commit() | |
202 | |
203 adm = User.get_first_admin() | |
204 # fix owners of UserGroup | |
205 for ug in Session().query(UserGroup).all(): | |
206 ug.user_id = adm.user_id | |
207 Session().add(ug) | |
208 Session().commit() | |
209 | |
210 # fix owners of RepoGroup | |
211 for ug in Session().query(RepoGroup).all(): | |
212 ug.user_id = adm.user_id | |
213 Session().add(ug) | |
214 Session().commit() | |
215 | |
216 def step_13(self): | |
217 pass | |
60 | 218 |
61 | 219 |
62 class DbManage(object): | 220 class DbManage(object): |
63 def __init__(self, log_sql, dbconf, root, tests=False, cli_args={}): | 221 def __init__(self, log_sql, dbconf, root, tests=False, cli_args={}): |
64 self.dbname = dbconf.split('/')[-1] | 222 self.dbname = dbconf.split('/')[-1] |
153 | 311 |
154 # clear cache keys | 312 # clear cache keys |
155 log.info("Clearing cache keys now...") | 313 log.info("Clearing cache keys now...") |
156 CacheInvalidation.clear_cache() | 314 CacheInvalidation.clear_cache() |
157 | 315 |
158 #====================================================================== | |
159 # UPGRADE STEPS | |
160 #====================================================================== | |
161 | |
162 class UpgradeSteps(object): | |
163 """ | |
164 Those steps follow schema versions so for example schema | |
165 for example schema with seq 002 == step_2 and so on. | |
166 """ | |
167 | |
168 def __init__(self, klass): | |
169 self.klass = klass | |
170 | |
171 def step_1(self): | |
172 pass | |
173 | |
174 def step_2(self): | |
175 notify('Patching repo paths for newer version of RhodeCode') | |
176 self.klass.fix_repo_paths() | |
177 | |
178 notify('Patching default user of RhodeCode') | |
179 self.klass.fix_default_user() | |
180 | |
181 log.info('Changing ui settings') | |
182 self.klass.create_ui_settings() | |
183 | |
184 def step_3(self): | |
185 notify('Adding additional settings into RhodeCode db') | |
186 self.klass.fix_settings() | |
187 notify('Adding ldap defaults') | |
188 self.klass.create_ldap_options(skip_existing=True) | |
189 | |
190 def step_4(self): | |
191 notify('create permissions and fix groups') | |
192 self.klass.create_permissions() | |
193 self.klass.fixup_groups() | |
194 | |
195 def step_5(self): | |
196 pass | |
197 | |
198 def step_6(self): | |
199 | |
200 notify('re-checking permissions') | |
201 self.klass.create_permissions() | |
202 | |
203 notify('installing new UI options') | |
204 sett4 = RhodeCodeSetting('show_public_icon', True) | |
205 Session().add(sett4) | |
206 sett5 = RhodeCodeSetting('show_private_icon', True) | |
207 Session().add(sett5) | |
208 sett6 = RhodeCodeSetting('stylify_metatags', False) | |
209 Session().add(sett6) | |
210 | |
211 notify('fixing old PULL hook') | |
212 _pull = RhodeCodeUi.get_by_key('preoutgoing.pull_logger') | |
213 if _pull: | |
214 _pull.ui_key = RhodeCodeUi.HOOK_PULL | |
215 Session().add(_pull) | |
216 | |
217 notify('fixing old PUSH hook') | |
218 _push = RhodeCodeUi.get_by_key('pretxnchangegroup.push_logger') | |
219 if _push: | |
220 _push.ui_key = RhodeCodeUi.HOOK_PUSH | |
221 Session().add(_push) | |
222 | |
223 notify('installing new pre-push hook') | |
224 hooks4 = RhodeCodeUi() | |
225 hooks4.ui_section = 'hooks' | |
226 hooks4.ui_key = RhodeCodeUi.HOOK_PRE_PUSH | |
227 hooks4.ui_value = 'python:rhodecode.lib.hooks.pre_push' | |
228 Session().add(hooks4) | |
229 | |
230 notify('installing new pre-pull hook') | |
231 hooks6 = RhodeCodeUi() | |
232 hooks6.ui_section = 'hooks' | |
233 hooks6.ui_key = RhodeCodeUi.HOOK_PRE_PULL | |
234 hooks6.ui_value = 'python:rhodecode.lib.hooks.pre_pull' | |
235 Session().add(hooks6) | |
236 | |
237 notify('installing hgsubversion option') | |
238 # enable hgsubversion disabled by default | |
239 hgsubversion = RhodeCodeUi() | |
240 hgsubversion.ui_section = 'extensions' | |
241 hgsubversion.ui_key = 'hgsubversion' | |
242 hgsubversion.ui_value = '' | |
243 hgsubversion.ui_active = False | |
244 Session().add(hgsubversion) | |
245 | |
246 notify('installing hg git option') | |
247 # enable hggit disabled by default | |
248 hggit = RhodeCodeUi() | |
249 hggit.ui_section = 'extensions' | |
250 hggit.ui_key = 'hggit' | |
251 hggit.ui_value = '' | |
252 hggit.ui_active = False | |
253 Session().add(hggit) | |
254 | |
255 notify('re-check default permissions') | |
256 default_user = User.get_by_username(User.DEFAULT_USER) | |
257 perm = Permission.get_by_key('hg.fork.repository') | |
258 reg_perm = UserToPerm() | |
259 reg_perm.user = default_user | |
260 reg_perm.permission = perm | |
261 Session().add(reg_perm) | |
262 | |
263 def step_7(self): | |
264 perm_fixes = self.klass.reset_permissions(User.DEFAULT_USER) | |
265 Session().commit() | |
266 if perm_fixes: | |
267 notify('There was an inconsistent state of permissions ' | |
268 'detected for default user. Permissions are now ' | |
269 'reset to the default value for default user. ' | |
270 'Please validate and check default permissions ' | |
271 'in admin panel') | |
272 | |
273 def step_8(self): | |
274 self.klass.create_permissions() | |
275 self.klass.populate_default_permissions() | |
276 self.klass.create_default_options(skip_existing=True) | |
277 Session().commit() | |
278 | |
279 def step_9(self): | |
280 perm_fixes = self.klass.reset_permissions(User.DEFAULT_USER) | |
281 Session().commit() | |
282 if perm_fixes: | |
283 notify('There was an inconsistent state of permissions ' | |
284 'detected for default user. Permissions are now ' | |
285 'reset to the default value for default user. ' | |
286 'Please validate and check default permissions ' | |
287 'in admin panel') | |
288 | |
289 def step_10(self): | |
290 pass | |
291 | |
292 def step_11(self): | |
293 self.klass.update_repo_info() | |
294 | |
295 def step_12(self): | |
296 self.klass.create_permissions() | |
297 Session().commit() | |
298 | |
299 self.klass.populate_default_permissions() | |
300 Session().commit() | |
301 | |
302 #fix all usergroups | |
303 ug_model = UserGroupModel() | |
304 for ug in UserGroup.get_all(): | |
305 perm_obj = ug_model._create_default_perms(ug) | |
306 Session().add(perm_obj) | |
307 Session().commit() | |
308 | |
309 adm = User.get_first_admin() | |
310 # fix owners of UserGroup | |
311 for ug in Session().query(UserGroup).all(): | |
312 ug.user_id = adm.user_id | |
313 Session().add(ug) | |
314 Session().commit() | |
315 | |
316 # fix owners of RepoGroup | |
317 for ug in Session().query(RepoGroup).all(): | |
318 ug.user_id = adm.user_id | |
319 Session().add(ug) | |
320 Session().commit() | |
321 | |
322 def step_13(self): | |
323 pass | |
324 | |
325 upgrade_steps = range(curr_version + 1, __dbversion__ + 1) | 316 upgrade_steps = range(curr_version + 1, __dbversion__ + 1) |
326 notify('attempting to do database upgrade from ' | 317 notify('attempting to do database upgrade from ' |
327 'version %s to version %s' % (curr_version, __dbversion__)) | 318 'version %s to version %s' % (curr_version, __dbversion__)) |
328 | 319 |
329 # CALL THE PROPER ORDER OF STEPS TO PERFORM FULL UPGRADE | 320 # CALL THE PROPER ORDER OF STEPS TO PERFORM FULL UPGRADE |
330 _step = None | 321 _step = None |
331 for step in upgrade_steps: | 322 for step in upgrade_steps: |
332 notify('performing upgrade step %s' % step) | 323 notify('performing upgrade step %s' % step) |
324 time.sleep(2) | |
333 | 325 |
334 api.upgrade(db_uri, repository_path, step) | 326 api.upgrade(db_uri, repository_path, step) |
335 notify('Schema upgrade for step %s completed' % (step,)) | 327 notify('schema upgrade for step %s completed' % (step,)) |
336 | 328 |
337 getattr(UpgradeSteps(self), 'step_%s' % step)() | 329 fixture = 'step_%s' % step |
330 notify('performing fixture step %s' % fixture) | |
331 getattr(UpgradeSteps(self), fixture)() | |
338 self.sa.commit() | 332 self.sa.commit() |
333 notify('fixture %s completed' % (fixture,)) | |
339 _step = step | 334 _step = step |
340 | 335 |
341 notify('upgrade to version %s successful' % _step) | 336 notify('upgrade to version %s successful' % _step) |
342 | 337 |
343 def fix_repo_paths(self): | 338 def fix_repo_paths(self): |