20808988 EVS to Neutron upgrade needs migration for ExternalNetwork and RouterPort
authorPadma Dakoju <padma.dakoju@oracle.com>
Thu, 02 Apr 2015 13:36:26 -0700
changeset 4047 9ab66cc72745
parent 4046 47a996abe340
child 4048 4c5ddf8de634
20808988 EVS to Neutron upgrade needs migration for ExternalNetwork and RouterPort
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()