# HG changeset patch # User Padma Dakoju # Date 1428006986 25200 # Node ID 9ab66cc72745725f1ddfa3ccfa8208a25f494ab4 # Parent 47a996abe3404ee2f5e4ffee25ca1a12602beb38 20808988 EVS to Neutron upgrade needs migration for ExternalNetwork and RouterPort diff -r 47a996abe340 -r 9ab66cc72745 components/openstack/neutron/files/evs/migrate/evs-neutron-migration.py --- a/components/openstack/neutron/files/evs/migrate/evs-neutron-migration.py Wed Apr 01 17:30:47 2015 -0700 +++ b/components/openstack/neutron/files/evs/migrate/evs-neutron-migration.py Thu Apr 02 13:36:26 2015 -0700 @@ -33,6 +33,7 @@ import sqlalchemy as sa from sqlalchemy import MetaData +from sqlalchemy.orm import sessionmaker from sqlalchemy.schema import DropConstraint from sqlalchemy import sql @@ -41,14 +42,17 @@ from oslo.db import exception as excp -def create_db_network(nw, engine): +def create_db_network(nw, engine, ext_ro): ''' Method for creating networks table in the neutron-server DB Input params: @nw - Dictionary with values from EVS DB + @engine - SQL engine + @ext_ro - External router ''' - # Importing locally because this module ends up importing neutron.wsgi + # Importing locally because these modules end up importing neutron.wsgi # which causes RAD to hang from neutron.db import db_base_plugin_v2 + from neutron.db import external_net_db as ext_net model_base.BASEV2.metadata.bind = engine model_base.BASEV2.metadata.create_all(engine) ctxt = ctx.get_admin_context() @@ -57,6 +61,13 @@ try: db_base_plugin_v2.NeutronDbPluginV2.create_network(inst, ctxt, nw) print "\nnetwork=%s added" % nw['network']['name'] + if ext_ro: + ext_nw = ext_net.ExternalNetwork(network_id=nw['network']['id']) + session = sessionmaker() + session.configure(bind=engine) + s = session() + s.add(ext_nw) + s.commit() except excp.DBDuplicateEntry: print "\nnetwork '%s' already exists" % nw['network']['name'] dup = True @@ -139,8 +150,13 @@ max_overflow=20, pool_timeout=10) neutron_engine = sa.create_engine(SQL_CONNECTION) + router_port_ids = {} for e in evsinfo: + ext_ro = False + for p in e.props: + if p.name == 'OpenStack:router:external' and p.value == 'True': + ext_ro = True # Populate networks table n = { 'tenant_id': e.tenantname, @@ -151,7 +167,7 @@ 'shared': False } nw = {'network': n} - dup = create_db_network(nw, neutron_engine) + dup = create_db_network(nw, neutron_engine, ext_ro) if dup: continue # No need to iterate over subnets and ports @@ -221,6 +237,9 @@ for v in j.props: if v.name == 'OpenStack:device_owner': device_owner = v.value + if v.value in ('network:router_interface', + 'network:router_gateway'): + router_port_ids[j.uuid] = v.value elif v.name == 'OpenStack:device_id': device_id = v.value elif v.name == 'macaddr': @@ -309,6 +328,7 @@ 'id': r['id'], 'name': r['name'], 'admin_state_up': r['admin_state_up'], + 'gw_port_id': r['gw_port_id'], 'status': 'ACTIVE' } @@ -365,9 +385,17 @@ tenant_id=r['tenant_id'], name=rt['name'], admin_state_up=rt['admin_state_up'], + gw_port_id=rt['gw_port_id'], status="ACTIVE") ctxt.session.add(router_db) print "\nrouter=%s updated" % rt['name'] + with ctxt.session.begin(subtransactions=True): + for i, j in router_port_ids.iteritems(): + router_port = l3_db.RouterPort( + port_id=i, + router_id=router_id, + port_type=j) + ctxt.session.add(router_port) if floatingips: ctxt = ctx.get_admin_context()