Update provider name when migrating to OVN

otherwise, any router created before migration becomes unmanageable,
as the only service provider ML2/OVN supports is 'ovn'.

Closes-Bug: #2103697
Change-Id: I104c188c2f86f4a2929ea00a8f28cf616c1bb64b
This commit is contained in:
Pavlo Shchelokovskyy
2025-03-18 09:03:50 +00:00
parent 819273f495
commit 90736b3517
2 changed files with 31 additions and 0 deletions

View File

@@ -25,6 +25,7 @@ from sqlalchemy.orm import exc as sqla_exc
from neutron.common import _constants as n_const from neutron.common import _constants as n_const
from neutron.db.models.plugins.ml2 import geneveallocation from neutron.db.models.plugins.ml2 import geneveallocation
from neutron.db.models.plugins.ml2 import vxlanallocation from neutron.db.models.plugins.ml2 import vxlanallocation
from neutron.db.models import servicetype
from neutron.objects import network as network_obj from neutron.objects import network as network_obj
from neutron.objects import ports as port_obj from neutron.objects import ports as port_obj
from neutron.objects import trunk as trunk_obj from neutron.objects import trunk as trunk_obj
@@ -40,6 +41,7 @@ def migrate_neutron_database_to_ovn():
- Removes bridge name from port binding vif details to support operations - Removes bridge name from port binding vif details to support operations
on instances with a trunk bridge. on instances with a trunk bridge.
- Updates the port profile for trunk ports. - Updates the port profile for trunk ports.
- Updates provider name in ProviderResourceAssociation
""" """
ctx = n_context.get_admin_context() ctx = n_context.get_admin_context()
with db_api.CONTEXT_WRITER.using(ctx) as session: with db_api.CONTEXT_WRITER.using(ctx) as session:
@@ -133,3 +135,16 @@ def migrate_neutron_database_to_ovn():
pb.update() pb.update()
trunk_updated.update(diff) trunk_updated.update(diff)
# update ``ProviderResourceAssociation`` objects
# NOTE(pas-ha): OVS has four L3 service providers, while OVN has only one
# (compare neutron/services/ovn_l3/service_providers/driver_controller.py
# and neutron/services/l3_router/service_providers/driver_controller.py),
# so we can blindly replace all OVS provider associations with "ovn" ones
pra_model = servicetype.ProviderResourceAssociation
ovs_providers = ("single_node", "ha", "dvr", "dvrha")
ovn_provider = "ovn"
with db_api.CONTEXT_WRITER.using(ctx) as session:
session.query(pra_model).filter(
pra_model.provider_name.in_(ovs_providers)
).update({"provider_name": ovn_provider})

View File

@@ -13,6 +13,7 @@
# under the License. # under the License.
import copy import copy
from unittest import mock from unittest import mock
import uuid
from neutron_lib.api.definitions import portbindings as pb from neutron_lib.api.definitions import portbindings as pb
from neutron_lib.api.definitions import provider_net as pnet from neutron_lib.api.definitions import provider_net as pnet
@@ -25,6 +26,7 @@ from neutron.common import _constants as n_const
from neutron.db.models.plugins.ml2 import geneveallocation from neutron.db.models.plugins.ml2 import geneveallocation
from neutron.db.models.plugins.ml2 import vxlanallocation from neutron.db.models.plugins.ml2 import vxlanallocation
from neutron.objects import ports as port_obj from neutron.objects import ports as port_obj
from neutron.objects import servicetype as servicetype_obj
from neutron.objects import trunk as trunk_obj from neutron.objects import trunk as trunk_obj
from neutron.plugins.ml2.drivers.ovn import db_migration from neutron.plugins.ml2.drivers.ovn import db_migration
from neutron.tests.unit.plugins.ml2.drivers.ovn.mech_driver import ( from neutron.tests.unit.plugins.ml2.drivers.ovn.mech_driver import (
@@ -97,6 +99,15 @@ class TestMigrateNeutronDatabaseToOvn(
self.subport_profiles[subport2['id']]["foo"] = "bar" self.subport_profiles[subport2['id']]["foo"] = "bar"
providers = ("fake", "ovn", "single_node", "ha", "dvr", "dvrha")
with db_api.CONTEXT_WRITER.using(ctx):
for name in providers:
servicetype_obj.ProviderResourceAssociation(
context=ctx,
provider_name=name,
resource_id=uuid.uuid4(),
).create()
def _validate_resources_after_migration(self, expected_vif_details): def _validate_resources_after_migration(self, expected_vif_details):
ctx = n_context.get_admin_context() ctx = n_context.get_admin_context()
@@ -133,6 +144,11 @@ class TestMigrateNeutronDatabaseToOvn(
self.subport_profiles[subport.port_id], self.subport_profiles[subport.port_id],
port["binding:profile"]) port["binding:profile"])
pra = servicetype_obj.ProviderResourceAssociation.get_objects(ctx)
self.assertEqual(6, len(pra))
self.assertEqual(5, len([p for p in pra if p.provider_name == "ovn"]))
self.assertEqual(1, len([p for p in pra if p.provider_name == "fake"]))
def test_db_migration(self): def test_db_migration(self):
"""Test the DB migration """Test the DB migration