root / snf-pithos-backend / pithos / backends / lib / sqlalchemy / alembic / versions / 165ba3fbfe53_update_path_account.py @ 860c5d9c
History | View | Annotate | Download (6 kB)
1 | c700f742 | Sofia Papagiannaki | """update account in paths
|
---|---|---|---|
2 | c700f742 | Sofia Papagiannaki |
|
3 | c700f742 | Sofia Papagiannaki | Revision ID: 165ba3fbfe53
|
4 | c700f742 | Sofia Papagiannaki | Revises: 3dd56e750a3
|
5 | c700f742 | Sofia Papagiannaki | Create Date: 2012-12-04 19:08:23.933634
|
6 | c700f742 | Sofia Papagiannaki |
|
7 | c700f742 | Sofia Papagiannaki | """
|
8 | c700f742 | Sofia Papagiannaki | |
9 | c700f742 | Sofia Papagiannaki | # revision identifiers, used by Alembic.
|
10 | c700f742 | Sofia Papagiannaki | revision = '165ba3fbfe53'
|
11 | c700f742 | Sofia Papagiannaki | down_revision = '3dd56e750a3'
|
12 | c700f742 | Sofia Papagiannaki | |
13 | c700f742 | Sofia Papagiannaki | from alembic import op |
14 | 50149cc8 | Sofia Papagiannaki | from sqlalchemy.sql import table, column, literal, and_ |
15 | c700f742 | Sofia Papagiannaki | |
16 | 860c5d9c | Sofia Papagiannaki | from pithos.api.settings import (SERVICE_TOKEN, ASTAKOS_URL) |
17 | 860c5d9c | Sofia Papagiannaki | |
18 | 860c5d9c | Sofia Papagiannaki | from astakosclient import AstakosClient |
19 | 860c5d9c | Sofia Papagiannaki | from astakosclient.errors import NoUserName, NoUUID |
20 | 860c5d9c | Sofia Papagiannaki | astakos_client = AstakosClient(ASTAKOS_URL, retry=3, use_pool=True) |
21 | c700f742 | Sofia Papagiannaki | |
22 | e4d84803 | Sofia Papagiannaki | try:
|
23 | e4d84803 | Sofia Papagiannaki | from progress.bar import IncrementalBar |
24 | e4d84803 | Sofia Papagiannaki | except ImportError: |
25 | e4d84803 | Sofia Papagiannaki | class IncrementalBar(): |
26 | e4d84803 | Sofia Papagiannaki | def __init__(self, label, max=100): |
27 | e4d84803 | Sofia Papagiannaki | print label
|
28 | e4d84803 | Sofia Papagiannaki | |
29 | e4d84803 | Sofia Papagiannaki | def next(self): |
30 | e4d84803 | Sofia Papagiannaki | return
|
31 | e4d84803 | Sofia Papagiannaki | |
32 | e4d84803 | Sofia Papagiannaki | def finish(self): |
33 | e4d84803 | Sofia Papagiannaki | return
|
34 | e4d84803 | Sofia Papagiannaki | |
35 | c700f742 | Sofia Papagiannaki | import sqlalchemy as sa |
36 | c700f742 | Sofia Papagiannaki | |
37 | c700f742 | Sofia Papagiannaki | catalog = {} |
38 | c700f742 | Sofia Papagiannaki | def get_uuid(account): |
39 | c700f742 | Sofia Papagiannaki | global catalog
|
40 | e4d84803 | Sofia Papagiannaki | if account in catalog: |
41 | e4d84803 | Sofia Papagiannaki | return catalog[account]
|
42 | c700f742 | Sofia Papagiannaki | try:
|
43 | 860c5d9c | Sofia Papagiannaki | catalog[account] = astakos_client.service_get_uuid( |
44 | 860c5d9c | Sofia Papagiannaki | SERVICE_TOKEN, account |
45 | 860c5d9c | Sofia Papagiannaki | ) |
46 | e4d84803 | Sofia Papagiannaki | print '\n', account, '-->', catalog[account] |
47 | 860c5d9c | Sofia Papagiannaki | except NoUUID:
|
48 | 860c5d9c | Sofia Papagiannaki | return None |
49 | e31e4274 | Sofia Papagiannaki | except:
|
50 | e31e4274 | Sofia Papagiannaki | raise
|
51 | c700f742 | Sofia Papagiannaki | else:
|
52 | 0e1fce89 | Sofia Papagiannaki | return catalog[account]
|
53 | 890c2065 | Sofia Papagiannaki | |
54 | c700f742 | Sofia Papagiannaki | inverse_catalog = {} |
55 | 890c2065 | Sofia Papagiannaki | def get_displayname(account): |
56 | c700f742 | Sofia Papagiannaki | global inverse_catalog
|
57 | e4d84803 | Sofia Papagiannaki | if account in inverse_catalog: |
58 | e4d84803 | Sofia Papagiannaki | return inverse_catalog[account]
|
59 | c700f742 | Sofia Papagiannaki | try:
|
60 | 860c5d9c | Sofia Papagiannaki | inverse_catalog[account] = astakos_client.service_get_username( |
61 | 860c5d9c | Sofia Papagiannaki | SERVICE_TOKEN, account |
62 | 860c5d9c | Sofia Papagiannaki | ) |
63 | e4d84803 | Sofia Papagiannaki | print '\n', account, '-->', inverse_catalog[account] |
64 | 860c5d9c | Sofia Papagiannaki | except NoUserName:
|
65 | 860c5d9c | Sofia Papagiannaki | return None |
66 | e31e4274 | Sofia Papagiannaki | except:
|
67 | e31e4274 | Sofia Papagiannaki | raise
|
68 | c700f742 | Sofia Papagiannaki | else:
|
69 | 0e1fce89 | Sofia Papagiannaki | return inverse_catalog[account]
|
70 | c700f742 | Sofia Papagiannaki | |
71 | c700f742 | Sofia Papagiannaki | n = table( |
72 | c700f742 | Sofia Papagiannaki | 'nodes',
|
73 | c700f742 | Sofia Papagiannaki | column('node', sa.Integer),
|
74 | c700f742 | Sofia Papagiannaki | column('path', sa.String(2048)) |
75 | c700f742 | Sofia Papagiannaki | ) |
76 | c700f742 | Sofia Papagiannaki | |
77 | 42ea7e66 | Sofia Papagiannaki | v = table( |
78 | 42ea7e66 | Sofia Papagiannaki | 'versions',
|
79 | 42ea7e66 | Sofia Papagiannaki | column('node', sa.Integer),
|
80 | 42ea7e66 | Sofia Papagiannaki | column('muser', sa.String(2048)) |
81 | 42ea7e66 | Sofia Papagiannaki | ) |
82 | 42ea7e66 | Sofia Papagiannaki | |
83 | c700f742 | Sofia Papagiannaki | p = table( |
84 | c700f742 | Sofia Papagiannaki | 'public',
|
85 | c700f742 | Sofia Papagiannaki | column('public_id', sa.Integer),
|
86 | c700f742 | Sofia Papagiannaki | column('path', sa.String(2048)) |
87 | c700f742 | Sofia Papagiannaki | ) |
88 | c700f742 | Sofia Papagiannaki | |
89 | c700f742 | Sofia Papagiannaki | x = table( |
90 | c700f742 | Sofia Papagiannaki | 'xfeatures',
|
91 | c700f742 | Sofia Papagiannaki | column('feature_id', sa.Integer),
|
92 | c700f742 | Sofia Papagiannaki | column('path', sa.String(2048)) |
93 | c700f742 | Sofia Papagiannaki | ) |
94 | c700f742 | Sofia Papagiannaki | |
95 | 50149cc8 | Sofia Papagiannaki | xvals = table( |
96 | 50149cc8 | Sofia Papagiannaki | 'xfeaturevals',
|
97 | 50149cc8 | Sofia Papagiannaki | column('feature_id', sa.Integer),
|
98 | 50149cc8 | Sofia Papagiannaki | column('key', sa.Integer),
|
99 | 50149cc8 | Sofia Papagiannaki | column('value', sa.String(256)) |
100 | 50149cc8 | Sofia Papagiannaki | ) |
101 | 50149cc8 | Sofia Papagiannaki | |
102 | 32454501 | Sofia Papagiannaki | g = table( |
103 | 32454501 | Sofia Papagiannaki | 'groups',
|
104 | 32454501 | Sofia Papagiannaki | column('owner', sa.String(256)), |
105 | 32454501 | Sofia Papagiannaki | column('name', sa.String(256)), |
106 | 32454501 | Sofia Papagiannaki | column('member', sa.String(256)) |
107 | 32454501 | Sofia Papagiannaki | ) |
108 | 50149cc8 | Sofia Papagiannaki | |
109 | e4d84803 | Sofia Papagiannaki | def migrate(callback): |
110 | c700f742 | Sofia Papagiannaki | connection = op.get_bind() |
111 | e31e4274 | Sofia Papagiannaki | |
112 | c700f742 | Sofia Papagiannaki | s = sa.select([n.c.node, n.c.path]) |
113 | c700f742 | Sofia Papagiannaki | nodes = connection.execute(s).fetchall() |
114 | e4d84803 | Sofia Papagiannaki | bar = IncrementalBar('Migrating node paths...', max=len(nodes)) |
115 | c700f742 | Sofia Papagiannaki | for node, path in nodes: |
116 | c700f742 | Sofia Papagiannaki | account, sep, rest = path.partition('/')
|
117 | e4d84803 | Sofia Papagiannaki | match = callback(account) |
118 | e4d84803 | Sofia Papagiannaki | if not match: |
119 | e4d84803 | Sofia Papagiannaki | bar.next() |
120 | c700f742 | Sofia Papagiannaki | continue
|
121 | e4d84803 | Sofia Papagiannaki | path = sep.join([match, rest]) |
122 | c700f742 | Sofia Papagiannaki | u = n.update().where(n.c.node == node).values({'path':path})
|
123 | c700f742 | Sofia Papagiannaki | connection.execute(u) |
124 | e4d84803 | Sofia Papagiannaki | bar.next() |
125 | e4d84803 | Sofia Papagiannaki | bar.finish() |
126 | e31e4274 | Sofia Papagiannaki | |
127 | 97341ccb | Georgios D. Tsoukalas | s = sa.select([v.c.muser]).distinct() |
128 | 97341ccb | Georgios D. Tsoukalas | musers = connection.execute(s).fetchall() |
129 | e4d84803 | Sofia Papagiannaki | bar = IncrementalBar('Migrating version modification users...',
|
130 | 97341ccb | Georgios D. Tsoukalas | max=len(musers)
|
131 | e4d84803 | Sofia Papagiannaki | ) |
132 | 97341ccb | Georgios D. Tsoukalas | for muser, in musers: |
133 | e4d84803 | Sofia Papagiannaki | match = callback(muser) |
134 | e4d84803 | Sofia Papagiannaki | if not match: |
135 | e4d84803 | Sofia Papagiannaki | bar.next() |
136 | 42ea7e66 | Sofia Papagiannaki | continue
|
137 | 97341ccb | Georgios D. Tsoukalas | u = v.update().where(v.c.muser == muser).values({'muser': match})
|
138 | 42ea7e66 | Sofia Papagiannaki | connection.execute(u) |
139 | e4d84803 | Sofia Papagiannaki | bar.next() |
140 | e4d84803 | Sofia Papagiannaki | bar.finish() |
141 | 42ea7e66 | Sofia Papagiannaki | |
142 | c700f742 | Sofia Papagiannaki | s = sa.select([p.c.public_id, p.c.path]) |
143 | c700f742 | Sofia Papagiannaki | public = connection.execute(s).fetchall() |
144 | e4d84803 | Sofia Papagiannaki | bar = IncrementalBar('Migrating public paths...', max=len(public)) |
145 | c700f742 | Sofia Papagiannaki | for id, path in public: |
146 | c700f742 | Sofia Papagiannaki | account, sep, rest = path.partition('/')
|
147 | e4d84803 | Sofia Papagiannaki | match = callback(account) |
148 | e4d84803 | Sofia Papagiannaki | if not match: |
149 | e4d84803 | Sofia Papagiannaki | bar.next() |
150 | c700f742 | Sofia Papagiannaki | continue
|
151 | e4d84803 | Sofia Papagiannaki | path = sep.join([match, rest]) |
152 | c700f742 | Sofia Papagiannaki | u = p.update().where(p.c.public_id == id).values({'path':path}) |
153 | c700f742 | Sofia Papagiannaki | connection.execute(u) |
154 | e4d84803 | Sofia Papagiannaki | bar.next() |
155 | e4d84803 | Sofia Papagiannaki | bar.finish() |
156 | e31e4274 | Sofia Papagiannaki | |
157 | c700f742 | Sofia Papagiannaki | s = sa.select([x.c.feature_id, x.c.path]) |
158 | c700f742 | Sofia Papagiannaki | xfeatures = connection.execute(s).fetchall() |
159 | e4d84803 | Sofia Papagiannaki | bar = IncrementalBar('Migrating permission paths...', max=len(xfeatures)) |
160 | c700f742 | Sofia Papagiannaki | for id, path in xfeatures: |
161 | c700f742 | Sofia Papagiannaki | account, sep, rest = path.partition('/')
|
162 | e4d84803 | Sofia Papagiannaki | match = callback(account) |
163 | e4d84803 | Sofia Papagiannaki | if not match: |
164 | e4d84803 | Sofia Papagiannaki | bar.next() |
165 | c700f742 | Sofia Papagiannaki | continue
|
166 | e4d84803 | Sofia Papagiannaki | path = sep.join([match, rest]) |
167 | c700f742 | Sofia Papagiannaki | u = x.update().where(x.c.feature_id == id).values({'path':path}) |
168 | c700f742 | Sofia Papagiannaki | connection.execute(u) |
169 | e4d84803 | Sofia Papagiannaki | bar.next() |
170 | e4d84803 | Sofia Papagiannaki | bar.finish() |
171 | c700f742 | Sofia Papagiannaki | |
172 | 50149cc8 | Sofia Papagiannaki | s = sa.select([xvals.c.feature_id, xvals.c.key, xvals.c.value]) |
173 | 50149cc8 | Sofia Papagiannaki | s = s.where(xvals.c.value != '*')
|
174 | 50149cc8 | Sofia Papagiannaki | xfeaturevals = connection.execute(s).fetchall() |
175 | e4d84803 | Sofia Papagiannaki | bar = IncrementalBar('Migrating permission holders...',
|
176 | e4d84803 | Sofia Papagiannaki | max=len(xfeaturevals))
|
177 | 50149cc8 | Sofia Papagiannaki | for feature_id, key, value in xfeaturevals: |
178 | 50149cc8 | Sofia Papagiannaki | account, sep, group = value.partition(':')
|
179 | e4d84803 | Sofia Papagiannaki | match = callback(account) |
180 | e4d84803 | Sofia Papagiannaki | if not match: |
181 | e4d84803 | Sofia Papagiannaki | bar.next() |
182 | 50149cc8 | Sofia Papagiannaki | continue
|
183 | e4d84803 | Sofia Papagiannaki | new_value = sep.join([match, group]) |
184 | 50149cc8 | Sofia Papagiannaki | u = xvals.update() |
185 | 50149cc8 | Sofia Papagiannaki | u = u.where(and_( |
186 | 50149cc8 | Sofia Papagiannaki | xvals.c.feature_id == feature_id, |
187 | 50149cc8 | Sofia Papagiannaki | xvals.c.key == key, |
188 | 50149cc8 | Sofia Papagiannaki | xvals.c.value == value)) |
189 | 50149cc8 | Sofia Papagiannaki | u = u.values({'value':new_value})
|
190 | 50149cc8 | Sofia Papagiannaki | connection.execute(u) |
191 | e4d84803 | Sofia Papagiannaki | bar.next() |
192 | e4d84803 | Sofia Papagiannaki | bar.finish() |
193 | 50149cc8 | Sofia Papagiannaki | |
194 | 32454501 | Sofia Papagiannaki | s = sa.select([g.c.owner, g.c.name, g.c.member]) |
195 | 32454501 | Sofia Papagiannaki | groups = connection.execute(s).fetchall() |
196 | e4d84803 | Sofia Papagiannaki | bar = IncrementalBar('Migrating group owners & members...',
|
197 | e4d84803 | Sofia Papagiannaki | max=len(groups))
|
198 | 32454501 | Sofia Papagiannaki | for owner, name, member in groups: |
199 | e4d84803 | Sofia Papagiannaki | owner_match = callback(owner) |
200 | e4d84803 | Sofia Papagiannaki | member_match = callback(member) |
201 | e4d84803 | Sofia Papagiannaki | if owner_match or member_match: |
202 | 32454501 | Sofia Papagiannaki | u = g.update() |
203 | 32454501 | Sofia Papagiannaki | u = u.where(and_( |
204 | 32454501 | Sofia Papagiannaki | g.c.owner == owner, |
205 | 32454501 | Sofia Papagiannaki | g.c.name == name, |
206 | 32454501 | Sofia Papagiannaki | g.c.member == member)) |
207 | 32454501 | Sofia Papagiannaki | values = {} |
208 | e4d84803 | Sofia Papagiannaki | if owner_match:
|
209 | e4d84803 | Sofia Papagiannaki | values['owner'] = owner_match
|
210 | e4d84803 | Sofia Papagiannaki | if member_match:
|
211 | e4d84803 | Sofia Papagiannaki | values['member'] = member_match
|
212 | 32454501 | Sofia Papagiannaki | u = u.values(values) |
213 | 32454501 | Sofia Papagiannaki | connection.execute(u) |
214 | e4d84803 | Sofia Papagiannaki | bar.next() |
215 | e4d84803 | Sofia Papagiannaki | bar.finish() |
216 | c700f742 | Sofia Papagiannaki | |
217 | e4d84803 | Sofia Papagiannaki | def upgrade(): |
218 | e4d84803 | Sofia Papagiannaki | migrate(get_uuid) |
219 | 32454501 | Sofia Papagiannaki | |
220 | e4d84803 | Sofia Papagiannaki | def downgrade(): |
221 | e4d84803 | Sofia Papagiannaki | migrate(get_displayname) |