Utilize legacy_endpoint_id column (bug 1154918)
This column was created in migration 11 but isn't used because it wasn't added to the model definition. Attempting to store data here ended up putting it into 'extra'. Change-Id: I02680b5213f09fe3cddcf5365104554d3e6d6b8a
This commit is contained in:
parent
16b464376e
commit
85910ce347
@ -36,8 +36,10 @@ class Service(sql.ModelBase, sql.DictBase):
|
||||
|
||||
class Endpoint(sql.ModelBase, sql.DictBase):
|
||||
__tablename__ = 'endpoint'
|
||||
attributes = ['id', 'interface', 'region', 'service_id', 'url']
|
||||
attributes = ['id', 'interface', 'region', 'service_id', 'url',
|
||||
'legacy_endpoint_id']
|
||||
id = sql.Column(sql.String(64), primary_key=True)
|
||||
legacy_endpoint_id = sql.Column(sql.String(64))
|
||||
interface = sql.Column(sql.String(8), primary_key=True)
|
||||
region = sql.Column('region', sql.String(255))
|
||||
service_id = sql.Column(sql.String(64),
|
||||
|
@ -64,8 +64,13 @@ def downgrade(migrate_engine):
|
||||
|
||||
session = orm.sessionmaker(bind=migrate_engine)()
|
||||
for ref in session.query(new_table).all():
|
||||
extra = json.loads(ref.extra)
|
||||
legacy_id = ref.legacy_endpoint_id or extra.get('legacy_endpoint_id')
|
||||
if not legacy_id:
|
||||
continue
|
||||
|
||||
q = session.query(legacy_table)
|
||||
q = q.filter_by(id=ref.legacy_endpoint_id)
|
||||
q = q.filter_by(id=legacy_id)
|
||||
legacy_ref = q.first()
|
||||
if legacy_ref:
|
||||
# We already have one, so just update the extra
|
||||
@ -83,7 +88,7 @@ def downgrade(migrate_engine):
|
||||
extra = json.loads(ref.extra)
|
||||
extra['%surl' % ref.interface] = ref.url
|
||||
endpoint = {
|
||||
'id': ref.legacy_endpoint_id,
|
||||
'id': legacy_id,
|
||||
'region': ref.region,
|
||||
'service_id': ref.service_id,
|
||||
'extra': json.dumps(extra),
|
||||
|
@ -0,0 +1,52 @@
|
||||
import json
|
||||
|
||||
import sqlalchemy as sql
|
||||
from sqlalchemy import orm
|
||||
|
||||
from keystone import config
|
||||
|
||||
|
||||
CONF = config.CONF
|
||||
|
||||
|
||||
def upgrade(migrate_engine):
|
||||
meta = sql.MetaData()
|
||||
meta.bind = migrate_engine
|
||||
|
||||
endpoint_table = sql.Table('endpoint', meta, autoload=True)
|
||||
|
||||
session = orm.sessionmaker(bind=migrate_engine)()
|
||||
for endpoint in session.query(endpoint_table).all():
|
||||
try:
|
||||
extra = json.loads(endpoint.extra)
|
||||
legacy_endpoint_id = extra.pop('legacy_endpoint_id')
|
||||
except KeyError:
|
||||
# if there is no legacy_endpoint_id, there's nothing to do
|
||||
pass
|
||||
else:
|
||||
q = endpoint_table.update()
|
||||
q = q.where(endpoint_table.c.id == endpoint.id)
|
||||
q = q.values({
|
||||
endpoint_table.c.extra: json.dumps(extra),
|
||||
endpoint_table.c.legacy_endpoint_id: legacy_endpoint_id})
|
||||
migrate_engine.execute(q)
|
||||
|
||||
|
||||
def downgrade(migrate_engine):
|
||||
meta = sql.MetaData()
|
||||
meta.bind = migrate_engine
|
||||
|
||||
endpoint_table = sql.Table('endpoint', meta, autoload=True)
|
||||
|
||||
session = orm.sessionmaker(bind=migrate_engine)()
|
||||
for endpoint in session.query(endpoint_table).all():
|
||||
if endpoint.legacy_endpoint_id is not None:
|
||||
extra = json.loads(endpoint.extra)
|
||||
extra['legacy_endpoint_id'] = endpoint.legacy_endpoint_id
|
||||
|
||||
q = endpoint_table.update()
|
||||
q = q.where(endpoint_table.c.id == endpoint.id)
|
||||
q = q.values({
|
||||
endpoint_table.c.extra: json.dumps(extra),
|
||||
endpoint_table.c.legacy_endpoint_id: None})
|
||||
migrate_engine.execute(q)
|
@ -691,6 +691,43 @@ class SqlUpgradeTests(test.TestCase):
|
||||
'where extra is null')
|
||||
self.assertEqual(r.fetchone()['c'], 0)
|
||||
|
||||
def test_legacy_endpoint_id(self):
|
||||
session = self.Session()
|
||||
self.upgrade(21)
|
||||
|
||||
service = {
|
||||
'id': uuid.uuid4().hex,
|
||||
'name': 'keystone',
|
||||
'type': 'identity'}
|
||||
self.insert_dict(session, 'service', service)
|
||||
|
||||
legacy_endpoint_id = uuid.uuid4().hex
|
||||
endpoint = {
|
||||
'id': uuid.uuid4().hex,
|
||||
'service_id': service['id'],
|
||||
'interface': uuid.uuid4().hex[:8],
|
||||
'url': uuid.uuid4().hex,
|
||||
'extra': json.dumps({
|
||||
'legacy_endpoint_id': legacy_endpoint_id})}
|
||||
self.insert_dict(session, 'endpoint', endpoint)
|
||||
|
||||
self.upgrade(22)
|
||||
session.commit()
|
||||
session.close()
|
||||
|
||||
session = self.Session()
|
||||
endpoint_table = sqlalchemy.Table(
|
||||
'endpoint', self.metadata, autoload=True)
|
||||
|
||||
self.assertEqual(session.query(endpoint_table).count(), 1)
|
||||
ref = session.query(endpoint_table).one()
|
||||
self.assertEqual(ref.id, endpoint['id'], ref)
|
||||
self.assertEqual(ref.service_id, endpoint['service_id'])
|
||||
self.assertEqual(ref.interface, endpoint['interface'])
|
||||
self.assertEqual(ref.url, endpoint['url'])
|
||||
self.assertEqual(ref.legacy_endpoint_id, legacy_endpoint_id)
|
||||
self.assertEqual(ref.extra, '{}')
|
||||
|
||||
def populate_user_table(self, with_pass_enab=False,
|
||||
with_pass_enab_domain=False):
|
||||
# Populate the appropriate fields in the user
|
||||
|
Loading…
x
Reference in New Issue
Block a user