Statistics
| Branch: | Tag: | Revision:

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)