[OVN] Call OVNClient methods with context when possible
The OVN maintenance code was not always calling into the OVNClient class methods with the correct number of arguments, leading to exceptions. After a deeper review, there were a number of places where this was happening, so changed most methods to take a 'context' argument since it's usually available in the caller. Change-Id: I1bcb0ca68747e4c32523e41307dc132291c55f6d Closes-bug: #1861502
This commit is contained in:
parent
0f1e360a8c
commit
ee73b50618
@ -66,7 +66,7 @@ class OVNMechanismDriver(mech_driver.OVNMechanismDriver):
|
|||||||
|
|
||||||
def create_port_postcommit(self, context):
|
def create_port_postcommit(self, context):
|
||||||
port = context.current
|
port = context.current
|
||||||
self.ovn_client.create_port(port)
|
self.ovn_client.create_port(context, port)
|
||||||
|
|
||||||
def update_port_precommit(self, context):
|
def update_port_precommit(self, context):
|
||||||
pass
|
pass
|
||||||
@ -74,7 +74,7 @@ class OVNMechanismDriver(mech_driver.OVNMechanismDriver):
|
|||||||
def update_port_postcommit(self, context):
|
def update_port_postcommit(self, context):
|
||||||
port = context.current
|
port = context.current
|
||||||
original_port = context.original
|
original_port = context.original
|
||||||
self.ovn_client.update_port(port, original_port)
|
self.ovn_client.update_port(context, port, original_port)
|
||||||
|
|
||||||
def delete_port_precommit(self, context):
|
def delete_port_precommit(self, context):
|
||||||
pass
|
pass
|
||||||
|
@ -265,7 +265,8 @@ class OVNMechanismDriver(api.MechanismDriver):
|
|||||||
|
|
||||||
def _create_security_group(self, resource, event, trigger,
|
def _create_security_group(self, resource, event, trigger,
|
||||||
security_group, **kwargs):
|
security_group, **kwargs):
|
||||||
self._ovn_client.create_security_group(security_group)
|
self._ovn_client.create_security_group(kwargs['context'],
|
||||||
|
security_group)
|
||||||
|
|
||||||
def _delete_security_group(self, resource, event, trigger,
|
def _delete_security_group(self, resource, event, trigger,
|
||||||
security_group_id, **kwargs):
|
security_group_id, **kwargs):
|
||||||
@ -290,7 +291,7 @@ class OVNMechanismDriver(api.MechanismDriver):
|
|||||||
self, resource, event, trigger, **kwargs):
|
self, resource, event, trigger, **kwargs):
|
||||||
if event == events.AFTER_CREATE:
|
if event == events.AFTER_CREATE:
|
||||||
self._ovn_client.create_security_group_rule(
|
self._ovn_client.create_security_group_rule(
|
||||||
kwargs.get('security_group_rule'))
|
kwargs['context'], kwargs.get('security_group_rule'))
|
||||||
elif event == events.BEFORE_DELETE:
|
elif event == events.BEFORE_DELETE:
|
||||||
sg_rule = self._plugin.get_security_group_rule(
|
sg_rule = self._plugin.get_security_group_rule(
|
||||||
kwargs['context'], kwargs.get('security_group_rule_id'))
|
kwargs['context'], kwargs.get('security_group_rule_id'))
|
||||||
@ -348,7 +349,7 @@ class OVNMechanismDriver(api.MechanismDriver):
|
|||||||
cause the deletion of the resource.
|
cause the deletion of the resource.
|
||||||
"""
|
"""
|
||||||
network = context.current
|
network = context.current
|
||||||
self._ovn_client.create_network(network)
|
self._ovn_client.create_network(context._plugin_context, network)
|
||||||
|
|
||||||
def update_network_precommit(self, context):
|
def update_network_precommit(self, context):
|
||||||
"""Update resources of a network.
|
"""Update resources of a network.
|
||||||
@ -388,7 +389,8 @@ class OVNMechanismDriver(api.MechanismDriver):
|
|||||||
# https://bugs.launchpad.net/neutron/+bug/1739798 is fixed.
|
# https://bugs.launchpad.net/neutron/+bug/1739798 is fixed.
|
||||||
if context._plugin_context.session.is_active:
|
if context._plugin_context.session.is_active:
|
||||||
return
|
return
|
||||||
self._ovn_client.update_network(context.current)
|
self._ovn_client.update_network(context._plugin_context,
|
||||||
|
context.current)
|
||||||
|
|
||||||
def delete_network_postcommit(self, context):
|
def delete_network_postcommit(self, context):
|
||||||
"""Delete a network.
|
"""Delete a network.
|
||||||
@ -412,15 +414,17 @@ class OVNMechanismDriver(api.MechanismDriver):
|
|||||||
ovn_const.TYPE_SUBNETS)
|
ovn_const.TYPE_SUBNETS)
|
||||||
|
|
||||||
def create_subnet_postcommit(self, context):
|
def create_subnet_postcommit(self, context):
|
||||||
self._ovn_client.create_subnet(context.current,
|
self._ovn_client.create_subnet(context._plugin_context,
|
||||||
|
context.current,
|
||||||
context.network.current)
|
context.network.current)
|
||||||
|
|
||||||
def update_subnet_postcommit(self, context):
|
def update_subnet_postcommit(self, context):
|
||||||
self._ovn_client.update_subnet(
|
self._ovn_client.update_subnet(
|
||||||
context.current, context.network.current)
|
context._plugin_context, context.current, context.network.current)
|
||||||
|
|
||||||
def delete_subnet_postcommit(self, context):
|
def delete_subnet_postcommit(self, context):
|
||||||
self._ovn_client.delete_subnet(context.current['id'])
|
self._ovn_client.delete_subnet(context._plugin_context,
|
||||||
|
context.current['id'])
|
||||||
|
|
||||||
def create_port_precommit(self, context):
|
def create_port_precommit(self, context):
|
||||||
"""Allocate resources for a new port.
|
"""Allocate resources for a new port.
|
||||||
@ -492,10 +496,11 @@ class OVNMechanismDriver(api.MechanismDriver):
|
|||||||
|
|
||||||
def _notify_dhcp_updated(self, port_id):
|
def _notify_dhcp_updated(self, port_id):
|
||||||
"""Notifies Neutron that the DHCP has been update for port."""
|
"""Notifies Neutron that the DHCP has been update for port."""
|
||||||
|
admin_context = n_context.get_admin_context()
|
||||||
if provisioning_blocks.is_object_blocked(
|
if provisioning_blocks.is_object_blocked(
|
||||||
n_context.get_admin_context(), port_id, resources.PORT):
|
admin_context, port_id, resources.PORT):
|
||||||
provisioning_blocks.provisioning_complete(
|
provisioning_blocks.provisioning_complete(
|
||||||
n_context.get_admin_context(), port_id, resources.PORT,
|
admin_context, port_id, resources.PORT,
|
||||||
provisioning_blocks.DHCP_ENTITY)
|
provisioning_blocks.DHCP_ENTITY)
|
||||||
|
|
||||||
def _validate_ignored_port(self, port, original_port):
|
def _validate_ignored_port(self, port, original_port):
|
||||||
@ -527,7 +532,7 @@ class OVNMechanismDriver(api.MechanismDriver):
|
|||||||
"""
|
"""
|
||||||
port = copy.deepcopy(context.current)
|
port = copy.deepcopy(context.current)
|
||||||
port['network'] = context.network.current
|
port['network'] = context.network.current
|
||||||
self._ovn_client.create_port(port)
|
self._ovn_client.create_port(context._plugin_context, port)
|
||||||
self._notify_dhcp_updated(port['id'])
|
self._notify_dhcp_updated(port['id'])
|
||||||
|
|
||||||
def update_port_precommit(self, context):
|
def update_port_precommit(self, context):
|
||||||
@ -590,11 +595,11 @@ class OVNMechanismDriver(api.MechanismDriver):
|
|||||||
if ((port['status'] == const.PORT_STATUS_DOWN and
|
if ((port['status'] == const.PORT_STATUS_DOWN and
|
||||||
ovn_const.MIGRATING_ATTR in port[portbindings.PROFILE].keys() and
|
ovn_const.MIGRATING_ATTR in port[portbindings.PROFILE].keys() and
|
||||||
port[portbindings.VIF_TYPE] == portbindings.VIF_TYPE_OVS)):
|
port[portbindings.VIF_TYPE] == portbindings.VIF_TYPE_OVS)):
|
||||||
admin_context = n_context.get_admin_context()
|
|
||||||
LOG.info("Setting port %s status from DOWN to UP in order "
|
LOG.info("Setting port %s status from DOWN to UP in order "
|
||||||
"to emit vif-interface-plugged event.",
|
"to emit vif-interface-plugged event.",
|
||||||
port['id'])
|
port['id'])
|
||||||
self._plugin.update_port_status(admin_context, port['id'],
|
self._plugin.update_port_status(context._plugin_context,
|
||||||
|
port['id'],
|
||||||
const.PORT_STATUS_ACTIVE)
|
const.PORT_STATUS_ACTIVE)
|
||||||
# The revision has been changed. In the meantime
|
# The revision has been changed. In the meantime
|
||||||
# port-update event already updated the OVN configuration,
|
# port-update event already updated the OVN configuration,
|
||||||
@ -602,7 +607,8 @@ class OVNMechanismDriver(api.MechanismDriver):
|
|||||||
# will fail that OVN has port with bigger revision.
|
# will fail that OVN has port with bigger revision.
|
||||||
return
|
return
|
||||||
|
|
||||||
self._ovn_client.update_port(port, port_object=original_port)
|
self._ovn_client.update_port(context._plugin_context, port,
|
||||||
|
port_object=original_port)
|
||||||
self._notify_dhcp_updated(port['id'])
|
self._notify_dhcp_updated(port['id'])
|
||||||
|
|
||||||
def delete_port_postcommit(self, context):
|
def delete_port_postcommit(self, context):
|
||||||
@ -811,13 +817,13 @@ class OVNMechanismDriver(api.MechanismDriver):
|
|||||||
self._update_dnat_entry_if_needed(port_id)
|
self._update_dnat_entry_if_needed(port_id)
|
||||||
self._wait_for_metadata_provisioned_if_needed(port_id)
|
self._wait_for_metadata_provisioned_if_needed(port_id)
|
||||||
|
|
||||||
|
admin_context = n_context.get_admin_context()
|
||||||
provisioning_blocks.provisioning_complete(
|
provisioning_blocks.provisioning_complete(
|
||||||
n_context.get_admin_context(),
|
admin_context,
|
||||||
port_id,
|
port_id,
|
||||||
resources.PORT,
|
resources.PORT,
|
||||||
provisioning_blocks.L2_AGENT_ENTITY)
|
provisioning_blocks.L2_AGENT_ENTITY)
|
||||||
|
|
||||||
admin_context = n_context.get_admin_context()
|
|
||||||
try:
|
try:
|
||||||
# NOTE(lucasagomes): Router ports in OVN is never bound
|
# NOTE(lucasagomes): Router ports in OVN is never bound
|
||||||
# to a host given their decentralized nature. By calling
|
# to a host given their decentralized nature. By calling
|
||||||
|
@ -156,7 +156,7 @@ class DBInconsistenciesPeriodics(object):
|
|||||||
ovn_obj = res_map['ovn_get'](row.resource_uuid)
|
ovn_obj = res_map['ovn_get'](row.resource_uuid)
|
||||||
|
|
||||||
if not ovn_obj:
|
if not ovn_obj:
|
||||||
res_map['ovn_create'](n_obj)
|
res_map['ovn_create'](context, n_obj)
|
||||||
else:
|
else:
|
||||||
if row.resource_type == ovn_const.TYPE_SECURITY_GROUP_RULES:
|
if row.resource_type == ovn_const.TYPE_SECURITY_GROUP_RULES:
|
||||||
LOG.error("SG rule %s found with a revision number while "
|
LOG.error("SG rule %s found with a revision number while "
|
||||||
@ -175,7 +175,7 @@ class DBInconsistenciesPeriodics(object):
|
|||||||
# If the resource exist in the OVN DB but the revision
|
# If the resource exist in the OVN DB but the revision
|
||||||
# number is different from Neutron DB, updated it.
|
# number is different from Neutron DB, updated it.
|
||||||
if ovn_revision != n_obj['revision_number']:
|
if ovn_revision != n_obj['revision_number']:
|
||||||
res_map['ovn_update'](n_obj)
|
res_map['ovn_update'](context, n_obj)
|
||||||
else:
|
else:
|
||||||
# If the resource exist and the revision number
|
# If the resource exist and the revision number
|
||||||
# is equal on both databases just bump the revision on
|
# is equal on both databases just bump the revision on
|
||||||
@ -200,9 +200,9 @@ class DBInconsistenciesPeriodics(object):
|
|||||||
context, sn_db_obj['network_id'])
|
context, sn_db_obj['network_id'])
|
||||||
|
|
||||||
if row.revision_number == ovn_const.INITIAL_REV_NUM:
|
if row.revision_number == ovn_const.INITIAL_REV_NUM:
|
||||||
self._ovn_client.create_subnet(sn_db_obj, n_db_obj)
|
self._ovn_client.create_subnet(context, sn_db_obj, n_db_obj)
|
||||||
else:
|
else:
|
||||||
self._ovn_client.update_subnet(sn_db_obj, n_db_obj)
|
self._ovn_client.update_subnet(context, sn_db_obj, n_db_obj)
|
||||||
|
|
||||||
# The migration will run just once per neutron-server instance. If the lock
|
# The migration will run just once per neutron-server instance. If the lock
|
||||||
# is held by some other neutron-server instance in the cloud, we'll attempt
|
# is held by some other neutron-server instance in the cloud, we'll attempt
|
||||||
@ -309,7 +309,8 @@ class DBInconsistenciesPeriodics(object):
|
|||||||
'type_': INCONSISTENCY_TYPE_DELETE})
|
'type_': INCONSISTENCY_TYPE_DELETE})
|
||||||
try:
|
try:
|
||||||
if row.resource_type == ovn_const.TYPE_SUBNETS:
|
if row.resource_type == ovn_const.TYPE_SUBNETS:
|
||||||
self._ovn_client.delete_subnet(row.resource_uuid)
|
self._ovn_client.delete_subnet(admin_context,
|
||||||
|
row.resource_uuid)
|
||||||
else:
|
else:
|
||||||
self._fix_delete(admin_context, row)
|
self._fix_delete(admin_context, row)
|
||||||
except Exception:
|
except Exception:
|
||||||
@ -322,11 +323,10 @@ class DBInconsistenciesPeriodics(object):
|
|||||||
LOG.info('Maintenance task: Synchronization finished '
|
LOG.info('Maintenance task: Synchronization finished '
|
||||||
'(took %.2f seconds)', self._sync_timer.elapsed())
|
'(took %.2f seconds)', self._sync_timer.elapsed())
|
||||||
|
|
||||||
def _create_lrouter_port(self, port):
|
def _create_lrouter_port(self, context, port):
|
||||||
admin_context = n_context.get_admin_context()
|
|
||||||
router_id = port['device_id']
|
router_id = port['device_id']
|
||||||
self._ovn_client._l3_plugin.add_router_interface(
|
self._ovn_client._l3_plugin.add_router_interface(
|
||||||
admin_context, router_id, {'port_id': port['id']}, may_exist=True)
|
context, router_id, {'port_id': port['id']}, may_exist=True)
|
||||||
|
|
||||||
def _check_subnet_global_dhcp_opts(self):
|
def _check_subnet_global_dhcp_opts(self):
|
||||||
inconsistent_subnets = []
|
inconsistent_subnets = []
|
||||||
@ -380,7 +380,8 @@ class DBInconsistenciesPeriodics(object):
|
|||||||
neutron_net = self._ovn_client._plugin.get_network(
|
neutron_net = self._ovn_client._plugin.get_network(
|
||||||
admin_context, subnet['network_id'])
|
admin_context, subnet['network_id'])
|
||||||
try:
|
try:
|
||||||
self._ovn_client.update_subnet(subnet, neutron_net)
|
self._ovn_client.update_subnet(admin_context, subnet,
|
||||||
|
neutron_net)
|
||||||
except Exception:
|
except Exception:
|
||||||
LOG.exception('Failed to update subnet %s',
|
LOG.exception('Failed to update subnet %s',
|
||||||
subnet['id'])
|
subnet['id'])
|
||||||
|
@ -302,7 +302,7 @@ class OVNClient(object):
|
|||||||
ovn_const.HA_CHASSIS_GROUP_DEFAULT_NAME).execute(
|
ovn_const.HA_CHASSIS_GROUP_DEFAULT_NAME).execute(
|
||||||
check_error=True).uuid
|
check_error=True).uuid
|
||||||
|
|
||||||
def create_port(self, port):
|
def create_port(self, context, port):
|
||||||
if utils.is_lsp_ignored(port):
|
if utils.is_lsp_ignored(port):
|
||||||
return
|
return
|
||||||
|
|
||||||
@ -321,7 +321,6 @@ class OVNClient(object):
|
|||||||
utils.get_revision_number(
|
utils.get_revision_number(
|
||||||
port, ovn_const.TYPE_PORTS))}
|
port, ovn_const.TYPE_PORTS))}
|
||||||
lswitch_name = utils.ovn_name(port['network_id'])
|
lswitch_name = utils.ovn_name(port['network_id'])
|
||||||
admin_context = n_context.get_admin_context()
|
|
||||||
sg_cache = {}
|
sg_cache = {}
|
||||||
subnet_cache = {}
|
subnet_cache = {}
|
||||||
|
|
||||||
@ -391,8 +390,7 @@ class OVNClient(object):
|
|||||||
allowed_address_pairs and
|
allowed_address_pairs and
|
||||||
port_info.type != ovn_const.LSP_TYPE_VIRTUAL):
|
port_info.type != ovn_const.LSP_TYPE_VIRTUAL):
|
||||||
addrs = [addr['ip_address'] for addr in allowed_address_pairs]
|
addrs = [addr['ip_address'] for addr in allowed_address_pairs]
|
||||||
self._set_unset_virtual_port_type(
|
self._set_unset_virtual_port_type(context, txn, port, addrs)
|
||||||
admin_context, txn, port, addrs)
|
|
||||||
|
|
||||||
port_cmd = txn.add(self._nb_idl.create_lswitch_port(
|
port_cmd = txn.add(self._nb_idl.create_lswitch_port(
|
||||||
**kwargs))
|
**kwargs))
|
||||||
@ -416,7 +414,7 @@ class OVNClient(object):
|
|||||||
utils.ovn_port_group_name(sg), port_cmd))
|
utils.ovn_port_group_name(sg), port_cmd))
|
||||||
else:
|
else:
|
||||||
# SGs modelled as Address Sets:
|
# SGs modelled as Address Sets:
|
||||||
acls_new = ovn_acl.add_acls(self._plugin, admin_context,
|
acls_new = ovn_acl.add_acls(self._plugin, context,
|
||||||
port, sg_cache, subnet_cache,
|
port, sg_cache, subnet_cache,
|
||||||
self._nb_idl)
|
self._nb_idl)
|
||||||
for acl in acls_new:
|
for acl in acls_new:
|
||||||
@ -448,7 +446,7 @@ class OVNClient(object):
|
|||||||
port, lswitch_name)
|
port, lswitch_name)
|
||||||
txn.add(self._nb_idl.qos_add(**qos_rule_column))
|
txn.add(self._nb_idl.qos_add(**qos_rule_column))
|
||||||
|
|
||||||
db_rev.bump_revision(admin_context, port, ovn_const.TYPE_PORTS)
|
db_rev.bump_revision(context, port, ovn_const.TYPE_PORTS)
|
||||||
|
|
||||||
def _set_unset_virtual_port_type(self, context, txn, parent_port,
|
def _set_unset_virtual_port_type(self, context, txn, parent_port,
|
||||||
addresses, unset=False):
|
addresses, unset=False):
|
||||||
@ -475,7 +473,7 @@ class OVNClient(object):
|
|||||||
|
|
||||||
# TODO(lucasagomes): The ``port_object`` parameter was added to
|
# TODO(lucasagomes): The ``port_object`` parameter was added to
|
||||||
# keep things backward compatible. Remove it in the Rocky release.
|
# keep things backward compatible. Remove it in the Rocky release.
|
||||||
def update_port(self, port, qos_options=None, port_object=None):
|
def update_port(self, context, port, qos_options=None, port_object=None):
|
||||||
if utils.is_lsp_ignored(port):
|
if utils.is_lsp_ignored(port):
|
||||||
return
|
return
|
||||||
# Does not need to add qos rule to port_info
|
# Does not need to add qos rule to port_info
|
||||||
@ -494,7 +492,6 @@ class OVNClient(object):
|
|||||||
utils.get_revision_number(
|
utils.get_revision_number(
|
||||||
port, ovn_const.TYPE_PORTS))}
|
port, ovn_const.TYPE_PORTS))}
|
||||||
lswitch_name = utils.ovn_name(port['network_id'])
|
lswitch_name = utils.ovn_name(port['network_id'])
|
||||||
admin_context = n_context.get_admin_context()
|
|
||||||
sg_cache = {}
|
sg_cache = {}
|
||||||
subnet_cache = {}
|
subnet_cache = {}
|
||||||
|
|
||||||
@ -549,9 +546,9 @@ class OVNClient(object):
|
|||||||
if (self._is_virtual_port_supported() and
|
if (self._is_virtual_port_supported() and
|
||||||
port_info.type != ovn_const.LSP_TYPE_VIRTUAL):
|
port_info.type != ovn_const.LSP_TYPE_VIRTUAL):
|
||||||
self._set_unset_virtual_port_type(
|
self._set_unset_virtual_port_type(
|
||||||
admin_context, txn, port, addr_pairs_diff.added)
|
context, txn, port, addr_pairs_diff.added)
|
||||||
self._set_unset_virtual_port_type(
|
self._set_unset_virtual_port_type(
|
||||||
admin_context, txn, port, addr_pairs_diff.removed,
|
context, txn, port, addr_pairs_diff.removed,
|
||||||
unset=True)
|
unset=True)
|
||||||
|
|
||||||
# NOTE(lizk): Fail port updating if port doesn't exist. This
|
# NOTE(lizk): Fail port updating if port doesn't exist. This
|
||||||
@ -613,7 +610,7 @@ class OVNClient(object):
|
|||||||
# ensure only the necessary ACLs are added and deleted
|
# ensure only the necessary ACLs are added and deleted
|
||||||
# on the transaction.
|
# on the transaction.
|
||||||
acls_new = ovn_acl.add_acls(self._plugin,
|
acls_new = ovn_acl.add_acls(self._plugin,
|
||||||
admin_context,
|
context,
|
||||||
port,
|
port,
|
||||||
sg_cache,
|
sg_cache,
|
||||||
subnet_cache,
|
subnet_cache,
|
||||||
@ -722,7 +719,7 @@ class OVNClient(object):
|
|||||||
self.add_txns_to_remove_port_dns_records(txn, port_object)
|
self.add_txns_to_remove_port_dns_records(txn, port_object)
|
||||||
|
|
||||||
if check_rev_cmd.result == ovn_const.TXN_COMMITTED:
|
if check_rev_cmd.result == ovn_const.TXN_COMMITTED:
|
||||||
db_rev.bump_revision(admin_context, port, ovn_const.TYPE_PORTS)
|
db_rev.bump_revision(context, port, ovn_const.TYPE_PORTS)
|
||||||
|
|
||||||
def _create_qos_rules(self, qos_options, port, lswitch_name,
|
def _create_qos_rules(self, qos_options, port, lswitch_name,
|
||||||
if_delete=False):
|
if_delete=False):
|
||||||
@ -1141,7 +1138,7 @@ class OVNClient(object):
|
|||||||
|
|
||||||
if fip_status:
|
if fip_status:
|
||||||
self._l3_plugin.update_floatingip_status(
|
self._l3_plugin.update_floatingip_status(
|
||||||
n_context.get_admin_context(), floatingip['id'], fip_status)
|
context, floatingip['id'], fip_status)
|
||||||
|
|
||||||
# TODO(lucasagomes): The ``fip_object`` parameter was added to
|
# TODO(lucasagomes): The ``fip_object`` parameter was added to
|
||||||
# keep things backward compatible since old FIPs might not have
|
# keep things backward compatible since old FIPs might not have
|
||||||
@ -1192,7 +1189,8 @@ class OVNClient(object):
|
|||||||
else const.IPv6_ANY))
|
else const.IPv6_ANY))
|
||||||
return gateways_info
|
return gateways_info
|
||||||
|
|
||||||
def _delete_router_ext_gw(self, context, router, networks, txn):
|
def _delete_router_ext_gw(self, router, networks, txn):
|
||||||
|
context = n_context.get_admin_context()
|
||||||
if not networks:
|
if not networks:
|
||||||
networks = []
|
networks = []
|
||||||
router_id = router['id']
|
router_id = router['id']
|
||||||
@ -1213,8 +1211,7 @@ class OVNClient(object):
|
|||||||
gw_lrouter_name))
|
gw_lrouter_name))
|
||||||
|
|
||||||
def _get_nets_and_ipv6_ra_confs_for_router_port(
|
def _get_nets_and_ipv6_ra_confs_for_router_port(
|
||||||
self, port_fixed_ips):
|
self, context, port_fixed_ips):
|
||||||
context = n_context.get_admin_context()
|
|
||||||
networks = set()
|
networks = set()
|
||||||
ipv6_ra_configs = {}
|
ipv6_ra_configs = {}
|
||||||
ipv6_ra_configs_supported = self._nb_idl.is_col_present(
|
ipv6_ra_configs_supported = self._nb_idl.is_col_present(
|
||||||
@ -1238,13 +1235,14 @@ class OVNClient(object):
|
|||||||
|
|
||||||
return list(networks), ipv6_ra_configs
|
return list(networks), ipv6_ra_configs
|
||||||
|
|
||||||
def _add_router_ext_gw(self, context, router, networks, txn):
|
def _add_router_ext_gw(self, router, networks, txn):
|
||||||
|
context = n_context.get_admin_context()
|
||||||
router_id = router['id']
|
router_id = router['id']
|
||||||
# 1. Add the external gateway router port.
|
# 1. Add the external gateway router port.
|
||||||
gateways = self._get_gw_info(context, router)
|
gateways = self._get_gw_info(context, router)
|
||||||
gw_port_id = router['gw_port_id']
|
gw_port_id = router['gw_port_id']
|
||||||
port = self._plugin.get_port(context, gw_port_id)
|
port = self._plugin.get_port(context, gw_port_id)
|
||||||
self._create_lrouter_port(router_id, port, txn=txn)
|
self._create_lrouter_port(context, router_id, port, txn=txn)
|
||||||
|
|
||||||
def _build_extids(gw_info):
|
def _build_extids(gw_info):
|
||||||
# TODO(lucasagomes): Remove this check after OVS 2.8.2 is tagged
|
# TODO(lucasagomes): Remove this check after OVS 2.8.2 is tagged
|
||||||
@ -1271,8 +1269,9 @@ class OVNClient(object):
|
|||||||
self.update_nat_rules(router, networks, enable_snat=True, txn=txn)
|
self.update_nat_rules(router, networks, enable_snat=True, txn=txn)
|
||||||
return port
|
return port
|
||||||
|
|
||||||
def _check_external_ips_changed(self, context, ovn_snats,
|
def _check_external_ips_changed(self, ovn_snats,
|
||||||
ovn_static_routes, router):
|
ovn_static_routes, router):
|
||||||
|
context = n_context.get_admin_context()
|
||||||
gateways = self._get_gw_info(context, router)
|
gateways = self._get_gw_info(context, router)
|
||||||
ovn_gw_subnets = None
|
ovn_gw_subnets = None
|
||||||
if self._nb_idl.is_col_present('Logical_Router_Static_Route',
|
if self._nb_idl.is_col_present('Logical_Router_Static_Route',
|
||||||
@ -1354,9 +1353,8 @@ class OVNClient(object):
|
|||||||
ovn_const.OVN_REV_NUM_EXT_ID_KEY: str(utils.get_revision_number(
|
ovn_const.OVN_REV_NUM_EXT_ID_KEY: str(utils.get_revision_number(
|
||||||
router, ovn_const.TYPE_ROUTERS))}
|
router, ovn_const.TYPE_ROUTERS))}
|
||||||
|
|
||||||
def create_router(self, router, add_external_gateway=True):
|
def create_router(self, context, router, add_external_gateway=True):
|
||||||
"""Create a logical router."""
|
"""Create a logical router."""
|
||||||
admin_context = n_context.get_admin_context()
|
|
||||||
external_ids = self._gen_router_ext_ids(router)
|
external_ids = self._gen_router_ext_ids(router)
|
||||||
enabled = router.get('admin_state_up')
|
enabled = router.get('admin_state_up')
|
||||||
lrouter_name = utils.ovn_name(router['id'])
|
lrouter_name = utils.ovn_name(router['id'])
|
||||||
@ -1371,22 +1369,21 @@ class OVNClient(object):
|
|||||||
# synchronization work
|
# synchronization work
|
||||||
if add_external_gateway:
|
if add_external_gateway:
|
||||||
networks = self._get_v4_network_of_all_router_ports(
|
networks = self._get_v4_network_of_all_router_ports(
|
||||||
admin_context, router['id'])
|
context, router['id'])
|
||||||
if router.get(l3.EXTERNAL_GW_INFO) and networks is not None:
|
if router.get(l3.EXTERNAL_GW_INFO) and networks is not None:
|
||||||
added_gw_port = self._add_router_ext_gw(
|
added_gw_port = self._add_router_ext_gw(
|
||||||
admin_context, router, networks, txn)
|
router, networks, txn)
|
||||||
|
|
||||||
if added_gw_port:
|
if added_gw_port:
|
||||||
db_rev.bump_revision(admin_context, added_gw_port,
|
db_rev.bump_revision(context, added_gw_port,
|
||||||
ovn_const.TYPE_ROUTER_PORTS)
|
ovn_const.TYPE_ROUTER_PORTS)
|
||||||
db_rev.bump_revision(admin_context, router, ovn_const.TYPE_ROUTERS)
|
db_rev.bump_revision(context, router, ovn_const.TYPE_ROUTERS)
|
||||||
|
|
||||||
# TODO(lucasagomes): The ``router_object`` parameter was added to
|
# TODO(lucasagomes): The ``router_object`` parameter was added to
|
||||||
# keep things backward compatible with old routers created prior to
|
# keep things backward compatible with old routers created prior to
|
||||||
# the database sync work. Remove it in the Rocky release.
|
# the database sync work. Remove it in the Rocky release.
|
||||||
def update_router(self, new_router, router_object=None):
|
def update_router(self, context, new_router, router_object=None):
|
||||||
"""Update a logical router."""
|
"""Update a logical router."""
|
||||||
admin_context = n_context.get_admin_context()
|
|
||||||
router_id = new_router['id']
|
router_id = new_router['id']
|
||||||
router_name = utils.ovn_name(router_id)
|
router_name = utils.ovn_name(router_id)
|
||||||
ovn_router = self._nb_idl.get_lrouter(router_name)
|
ovn_router = self._nb_idl.get_lrouter(router_name)
|
||||||
@ -1398,8 +1395,7 @@ class OVNClient(object):
|
|||||||
if router_object:
|
if router_object:
|
||||||
gateway_old = gateway_old or router_object.get(l3.EXTERNAL_GW_INFO)
|
gateway_old = gateway_old or router_object.get(l3.EXTERNAL_GW_INFO)
|
||||||
ovn_snats = utils.get_lrouter_snats(ovn_router)
|
ovn_snats = utils.get_lrouter_snats(ovn_router)
|
||||||
networks = self._get_v4_network_of_all_router_ports(
|
networks = self._get_v4_network_of_all_router_ports(context, router_id)
|
||||||
admin_context, router_id)
|
|
||||||
try:
|
try:
|
||||||
check_rev_cmd = self._nb_idl.check_revision_number(
|
check_rev_cmd = self._nb_idl.check_revision_number(
|
||||||
router_name, new_router, ovn_const.TYPE_ROUTERS)
|
router_name, new_router, ovn_const.TYPE_ROUTERS)
|
||||||
@ -1408,27 +1404,27 @@ class OVNClient(object):
|
|||||||
if gateway_new and not gateway_old:
|
if gateway_new and not gateway_old:
|
||||||
# Route gateway is set
|
# Route gateway is set
|
||||||
added_gw_port = self._add_router_ext_gw(
|
added_gw_port = self._add_router_ext_gw(
|
||||||
admin_context, new_router, networks, txn)
|
new_router, networks, txn)
|
||||||
elif gateway_old and not gateway_new:
|
elif gateway_old and not gateway_new:
|
||||||
# router gateway is removed
|
# router gateway is removed
|
||||||
txn.add(self._nb_idl.delete_lrouter_ext_gw(router_name))
|
txn.add(self._nb_idl.delete_lrouter_ext_gw(router_name))
|
||||||
if router_object:
|
if router_object:
|
||||||
self._delete_router_ext_gw(
|
self._delete_router_ext_gw(
|
||||||
admin_context, router_object, networks, txn)
|
router_object, networks, txn)
|
||||||
deleted_gw_port_id = router_object['gw_port_id']
|
deleted_gw_port_id = router_object['gw_port_id']
|
||||||
elif gateway_new and gateway_old:
|
elif gateway_new and gateway_old:
|
||||||
# Check if external gateway has changed, if yes, delete
|
# Check if external gateway has changed, if yes, delete
|
||||||
# the old gateway and add the new gateway
|
# the old gateway and add the new gateway
|
||||||
if self._check_external_ips_changed(
|
if self._check_external_ips_changed(
|
||||||
admin_context, ovn_snats, gateway_old, new_router):
|
ovn_snats, gateway_old, new_router):
|
||||||
txn.add(self._nb_idl.delete_lrouter_ext_gw(
|
txn.add(self._nb_idl.delete_lrouter_ext_gw(
|
||||||
router_name))
|
router_name))
|
||||||
if router_object:
|
if router_object:
|
||||||
self._delete_router_ext_gw(
|
self._delete_router_ext_gw(
|
||||||
admin_context, router_object, networks, txn)
|
router_object, networks, txn)
|
||||||
deleted_gw_port_id = router_object['gw_port_id']
|
deleted_gw_port_id = router_object['gw_port_id']
|
||||||
added_gw_port = self._add_router_ext_gw(
|
added_gw_port = self._add_router_ext_gw(
|
||||||
admin_context, new_router, networks, txn)
|
new_router, networks, txn)
|
||||||
else:
|
else:
|
||||||
# Check if snat has been enabled/disabled and update
|
# Check if snat has been enabled/disabled and update
|
||||||
new_snat_state = gateway_new.get('enable_snat', True)
|
new_snat_state = gateway_new.get('enable_snat', True)
|
||||||
@ -1448,18 +1444,18 @@ class OVNClient(object):
|
|||||||
added, removed = helpers.diff_list_of_dict(
|
added, removed = helpers.diff_list_of_dict(
|
||||||
old_routes, routes)
|
old_routes, routes)
|
||||||
self.update_router_routes(
|
self.update_router_routes(
|
||||||
admin_context, router_id, added, removed, txn=txn)
|
context, router_id, added, removed, txn=txn)
|
||||||
|
|
||||||
if check_rev_cmd.result == ovn_const.TXN_COMMITTED:
|
if check_rev_cmd.result == ovn_const.TXN_COMMITTED:
|
||||||
db_rev.bump_revision(admin_context, new_router,
|
db_rev.bump_revision(context, new_router,
|
||||||
ovn_const.TYPE_ROUTERS)
|
ovn_const.TYPE_ROUTERS)
|
||||||
|
|
||||||
if added_gw_port:
|
if added_gw_port:
|
||||||
db_rev.bump_revision(admin_context, added_gw_port,
|
db_rev.bump_revision(context, added_gw_port,
|
||||||
ovn_const.TYPE_ROUTER_PORTS)
|
ovn_const.TYPE_ROUTER_PORTS)
|
||||||
|
|
||||||
if deleted_gw_port_id:
|
if deleted_gw_port_id:
|
||||||
db_rev.delete_revision(admin_context, deleted_gw_port_id,
|
db_rev.delete_revision(context, deleted_gw_port_id,
|
||||||
ovn_const.TYPE_ROUTER_PORTS)
|
ovn_const.TYPE_ROUTER_PORTS)
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@ -1548,12 +1544,12 @@ class OVNClient(object):
|
|||||||
|
|
||||||
return options
|
return options
|
||||||
|
|
||||||
def _create_lrouter_port(self, router_id, port, txn=None):
|
def _create_lrouter_port(self, context, router_id, port, txn=None):
|
||||||
"""Create a logical router port."""
|
"""Create a logical router port."""
|
||||||
lrouter = utils.ovn_name(router_id)
|
lrouter = utils.ovn_name(router_id)
|
||||||
networks, ipv6_ra_configs = (
|
networks, ipv6_ra_configs = (
|
||||||
self._get_nets_and_ipv6_ra_confs_for_router_port(
|
self._get_nets_and_ipv6_ra_confs_for_router_port(
|
||||||
port['fixed_ips']))
|
context, port['fixed_ips']))
|
||||||
lrouter_port_name = utils.ovn_lrouter_port_name(port['id'])
|
lrouter_port_name = utils.ovn_lrouter_port_name(port['id'])
|
||||||
is_gw_port = const.DEVICE_OWNER_ROUTER_GW == port.get(
|
is_gw_port = const.DEVICE_OWNER_ROUTER_GW == port.get(
|
||||||
'device_owner')
|
'device_owner')
|
||||||
@ -1589,10 +1585,8 @@ class OVNClient(object):
|
|||||||
lsp_address=lsp_address)]
|
lsp_address=lsp_address)]
|
||||||
self._transaction(commands, txn=txn)
|
self._transaction(commands, txn=txn)
|
||||||
|
|
||||||
def create_router_port(self, router_id, router_interface):
|
def create_router_port(self, context, router_id, router_interface):
|
||||||
admin_context = n_context.get_admin_context()
|
port = self._plugin.get_port(context, router_interface['port_id'])
|
||||||
port = self._plugin.get_port(
|
|
||||||
admin_context, router_interface['port_id'])
|
|
||||||
with self._nb_idl.transaction(check_error=True) as txn:
|
with self._nb_idl.transaction(check_error=True) as txn:
|
||||||
multi_prefix = False
|
multi_prefix = False
|
||||||
if (len(router_interface.get('subnet_ids', [])) == 1 and
|
if (len(router_interface.get('subnet_ids', [])) == 1 and
|
||||||
@ -1601,16 +1595,16 @@ class OVNClient(object):
|
|||||||
# NOTE(lizk) It's adding a subnet onto an already
|
# NOTE(lizk) It's adding a subnet onto an already
|
||||||
# existing router interface port, try to update lrouter port
|
# existing router interface port, try to update lrouter port
|
||||||
# 'networks' column.
|
# 'networks' column.
|
||||||
self._update_lrouter_port(port, txn=txn)
|
self._update_lrouter_port(context, port, txn=txn)
|
||||||
multi_prefix = True
|
multi_prefix = True
|
||||||
else:
|
else:
|
||||||
self._create_lrouter_port(router_id, port, txn=txn)
|
self._create_lrouter_port(context, router_id, port, txn=txn)
|
||||||
|
|
||||||
router = self._l3_plugin.get_router(admin_context, router_id)
|
router = self._l3_plugin.get_router(context, router_id)
|
||||||
if router.get(l3.EXTERNAL_GW_INFO):
|
if router.get(l3.EXTERNAL_GW_INFO):
|
||||||
cidr = None
|
cidr = None
|
||||||
for fixed_ip in port['fixed_ips']:
|
for fixed_ip in port['fixed_ips']:
|
||||||
subnet = self._plugin.get_subnet(admin_context,
|
subnet = self._plugin.get_subnet(context,
|
||||||
fixed_ip['subnet_id'])
|
fixed_ip['subnet_id'])
|
||||||
if multi_prefix:
|
if multi_prefix:
|
||||||
if 'subnet_id' in router_interface:
|
if 'subnet_id' in router_interface:
|
||||||
@ -1623,13 +1617,13 @@ class OVNClient(object):
|
|||||||
self.update_nat_rules(router, networks=[cidr],
|
self.update_nat_rules(router, networks=[cidr],
|
||||||
enable_snat=True, txn=txn)
|
enable_snat=True, txn=txn)
|
||||||
|
|
||||||
db_rev.bump_revision(admin_context, port, ovn_const.TYPE_ROUTER_PORTS)
|
db_rev.bump_revision(context, port, ovn_const.TYPE_ROUTER_PORTS)
|
||||||
|
|
||||||
def _update_lrouter_port(self, port, if_exists=False, txn=None):
|
def _update_lrouter_port(self, context, port, if_exists=False, txn=None):
|
||||||
"""Update a logical router port."""
|
"""Update a logical router port."""
|
||||||
networks, ipv6_ra_configs = (
|
networks, ipv6_ra_configs = (
|
||||||
self._get_nets_and_ipv6_ra_confs_for_router_port(
|
self._get_nets_and_ipv6_ra_confs_for_router_port(
|
||||||
port['fixed_ips']))
|
context, port['fixed_ips']))
|
||||||
|
|
||||||
lsp_address = ovn_const.DEFAULT_ADDR_FOR_LSP_WITH_PEER
|
lsp_address = ovn_const.DEFAULT_ADDR_FOR_LSP_WITH_PEER
|
||||||
lrp_name = utils.ovn_lrouter_port_name(port['id'])
|
lrp_name = utils.ovn_lrouter_port_name(port['id'])
|
||||||
@ -1649,18 +1643,18 @@ class OVNClient(object):
|
|||||||
|
|
||||||
self._transaction(commands, txn=txn)
|
self._transaction(commands, txn=txn)
|
||||||
|
|
||||||
def update_router_port(self, port, if_exists=False):
|
def update_router_port(self, context, port, if_exists=False):
|
||||||
admin_context = n_context.get_admin_context()
|
|
||||||
lrp_name = utils.ovn_lrouter_port_name(port['id'])
|
lrp_name = utils.ovn_lrouter_port_name(port['id'])
|
||||||
check_rev_cmd = self._nb_idl.check_revision_number(
|
check_rev_cmd = self._nb_idl.check_revision_number(
|
||||||
lrp_name, port, ovn_const.TYPE_ROUTER_PORTS)
|
lrp_name, port, ovn_const.TYPE_ROUTER_PORTS)
|
||||||
with self._nb_idl.transaction(check_error=True) as txn:
|
with self._nb_idl.transaction(check_error=True) as txn:
|
||||||
txn.add(check_rev_cmd)
|
txn.add(check_rev_cmd)
|
||||||
self._update_lrouter_port(port, if_exists=if_exists, txn=txn)
|
self._update_lrouter_port(context, port, if_exists=if_exists,
|
||||||
|
txn=txn)
|
||||||
|
|
||||||
if check_rev_cmd.result == ovn_const.TXN_COMMITTED:
|
if check_rev_cmd.result == ovn_const.TXN_COMMITTED:
|
||||||
db_rev.bump_revision(
|
db_rev.bump_revision(
|
||||||
admin_context, port, ovn_const.TYPE_ROUTER_PORTS)
|
context, port, ovn_const.TYPE_ROUTER_PORTS)
|
||||||
|
|
||||||
def _delete_lrouter_port(self, context, port_id, router_id=None, txn=None):
|
def _delete_lrouter_port(self, context, port_id, router_id=None, txn=None):
|
||||||
"""Delete a logical router port."""
|
"""Delete a logical router port."""
|
||||||
@ -1687,7 +1681,7 @@ class OVNClient(object):
|
|||||||
port = self._plugin.get_port(context, port_id)
|
port = self._plugin.get_port(context, port_id)
|
||||||
# The router interface port still exists, call ovn to
|
# The router interface port still exists, call ovn to
|
||||||
# update it
|
# update it
|
||||||
self._update_lrouter_port(port, txn=txn)
|
self._update_lrouter_port(context, port, txn=txn)
|
||||||
except n_exc.PortNotFound:
|
except n_exc.PortNotFound:
|
||||||
# The router interface port doesn't exist any more,
|
# The router interface port doesn't exist any more,
|
||||||
# we will call ovn to delete it once we remove the snat
|
# we will call ovn to delete it once we remove the snat
|
||||||
@ -1782,11 +1776,10 @@ class OVNClient(object):
|
|||||||
ovn_const.MCAST_FLOOD_UNREGISTERED: value}
|
ovn_const.MCAST_FLOOD_UNREGISTERED: value}
|
||||||
return params
|
return params
|
||||||
|
|
||||||
def create_network(self, network):
|
def create_network(self, context, network):
|
||||||
# Create a logical switch with a name equal to the Neutron network
|
# Create a logical switch with a name equal to the Neutron network
|
||||||
# UUID. This provides an easy way to refer to the logical switch
|
# UUID. This provides an easy way to refer to the logical switch
|
||||||
# without having to track what UUID OVN assigned to it.
|
# without having to track what UUID OVN assigned to it.
|
||||||
admin_context = n_context.get_admin_context()
|
|
||||||
lswitch_params = self._gen_network_parameters(network)
|
lswitch_params = self._gen_network_parameters(network)
|
||||||
lswitch_name = utils.ovn_name(network['id'])
|
lswitch_name = utils.ovn_name(network['id'])
|
||||||
with self._nb_idl.transaction(check_error=True) as txn:
|
with self._nb_idl.transaction(check_error=True) as txn:
|
||||||
@ -1796,8 +1789,8 @@ class OVNClient(object):
|
|||||||
if physnet:
|
if physnet:
|
||||||
self._create_provnet_port(txn, network, physnet,
|
self._create_provnet_port(txn, network, physnet,
|
||||||
network.get(pnet.SEGMENTATION_ID))
|
network.get(pnet.SEGMENTATION_ID))
|
||||||
db_rev.bump_revision(admin_context, network, ovn_const.TYPE_NETWORKS)
|
db_rev.bump_revision(context, network, ovn_const.TYPE_NETWORKS)
|
||||||
self.create_metadata_port(admin_context, network)
|
self.create_metadata_port(context, network)
|
||||||
return network
|
return network
|
||||||
|
|
||||||
def delete_network(self, context, network_id):
|
def delete_network(self, context, network_id):
|
||||||
@ -1842,7 +1835,7 @@ class OVNClient(object):
|
|||||||
name=lrp_name, if_exists=True, options=options))
|
name=lrp_name, if_exists=True, options=options))
|
||||||
self._transaction(commands, txn=txn)
|
self._transaction(commands, txn=txn)
|
||||||
|
|
||||||
def update_network(self, network):
|
def update_network(self, context, network):
|
||||||
lswitch_name = utils.ovn_name(network['id'])
|
lswitch_name = utils.ovn_name(network['id'])
|
||||||
# Check if QoS needs to be update, before updating OVNDB
|
# Check if QoS needs to be update, before updating OVNDB
|
||||||
qos_update_required = self._is_qos_update_required(network)
|
qos_update_required = self._is_qos_update_required(network)
|
||||||
@ -1876,7 +1869,6 @@ class OVNClient(object):
|
|||||||
# ===========================
|
# ===========================
|
||||||
# in the DNS row for this network.
|
# in the DNS row for this network.
|
||||||
|
|
||||||
admin_context = n_context.get_admin_context()
|
|
||||||
with self._nb_idl.transaction(check_error=True) as txn:
|
with self._nb_idl.transaction(check_error=True) as txn:
|
||||||
txn.add(check_rev_cmd)
|
txn.add(check_rev_cmd)
|
||||||
lswitch_params = self._gen_network_parameters(network)
|
lswitch_params = self._gen_network_parameters(network)
|
||||||
@ -1890,18 +1882,19 @@ class OVNClient(object):
|
|||||||
ovn_const.OVN_NETWORK_MTU_EXT_ID_KEY) !=
|
ovn_const.OVN_NETWORK_MTU_EXT_ID_KEY) !=
|
||||||
str(network['mtu'])):
|
str(network['mtu'])):
|
||||||
subnets = self._plugin.get_subnets_by_network(
|
subnets = self._plugin.get_subnets_by_network(
|
||||||
admin_context, network['id'])
|
context, network['id'])
|
||||||
for subnet in subnets:
|
for subnet in subnets:
|
||||||
self.update_subnet(subnet, network, txn)
|
self.update_subnet(context, subnet, network, txn)
|
||||||
|
|
||||||
if utils.is_provider_network(network):
|
if utils.is_provider_network(network):
|
||||||
self.set_gateway_mtu(admin_context, network, txn)
|
# make sure to use admin context as this is a providernet
|
||||||
|
self.set_gateway_mtu(n_context.get_admin_context(),
|
||||||
|
network, txn)
|
||||||
|
|
||||||
if check_rev_cmd.result == ovn_const.TXN_COMMITTED:
|
if check_rev_cmd.result == ovn_const.TXN_COMMITTED:
|
||||||
if qos_update_required:
|
if qos_update_required:
|
||||||
self._qos_driver.update_network(network)
|
self._qos_driver.update_network(network)
|
||||||
db_rev.bump_revision(
|
db_rev.bump_revision(context, network, ovn_const.TYPE_NETWORKS)
|
||||||
admin_context, network, ovn_const.TYPE_NETWORKS)
|
|
||||||
|
|
||||||
def _add_subnet_dhcp_options(self, subnet, network,
|
def _add_subnet_dhcp_options(self, subnet, network,
|
||||||
ovn_dhcp_options=None):
|
ovn_dhcp_options=None):
|
||||||
@ -2142,13 +2135,12 @@ class OVNClient(object):
|
|||||||
txn.add(self._nb_idl.add_dhcp_options(
|
txn.add(self._nb_idl.add_dhcp_options(
|
||||||
subnet['id'], port_id=port_id, options=options))
|
subnet['id'], port_id=port_id, options=options))
|
||||||
|
|
||||||
def create_subnet(self, subnet, network):
|
def create_subnet(self, context, subnet, network):
|
||||||
admin_context = n_context.get_admin_context()
|
|
||||||
if subnet['enable_dhcp']:
|
if subnet['enable_dhcp']:
|
||||||
if subnet['ip_version'] == 4:
|
if subnet['ip_version'] == 4:
|
||||||
self.update_metadata_port(admin_context, network['id'])
|
self.update_metadata_port(context, network['id'])
|
||||||
self._add_subnet_dhcp_options(subnet, network)
|
self._add_subnet_dhcp_options(subnet, network)
|
||||||
db_rev.bump_revision(admin_context, subnet, ovn_const.TYPE_SUBNETS)
|
db_rev.bump_revision(context, subnet, ovn_const.TYPE_SUBNETS)
|
||||||
|
|
||||||
def _modify_subnet_dhcp_options(self, subnet, ovn_subnet, network, txn):
|
def _modify_subnet_dhcp_options(self, subnet, ovn_subnet, network, txn):
|
||||||
if subnet['enable_dhcp'] and not ovn_subnet:
|
if subnet['enable_dhcp'] and not ovn_subnet:
|
||||||
@ -2158,13 +2150,12 @@ class OVNClient(object):
|
|||||||
elif not subnet['enable_dhcp'] and ovn_subnet:
|
elif not subnet['enable_dhcp'] and ovn_subnet:
|
||||||
self._remove_subnet_dhcp_options(subnet['id'], txn)
|
self._remove_subnet_dhcp_options(subnet['id'], txn)
|
||||||
|
|
||||||
def update_subnet(self, subnet, network, txn=None):
|
def update_subnet(self, context, subnet, network, txn=None):
|
||||||
admin_context = n_context.get_admin_context()
|
|
||||||
ovn_subnet = self._nb_idl.get_subnet_dhcp_options(
|
ovn_subnet = self._nb_idl.get_subnet_dhcp_options(
|
||||||
subnet['id'])['subnet']
|
subnet['id'])['subnet']
|
||||||
|
|
||||||
if subnet['enable_dhcp'] or ovn_subnet:
|
if subnet['enable_dhcp'] or ovn_subnet:
|
||||||
self.update_metadata_port(admin_context, network['id'])
|
self.update_metadata_port(context, network['id'])
|
||||||
|
|
||||||
check_rev_cmd = self._nb_idl.check_revision_number(
|
check_rev_cmd = self._nb_idl.check_revision_number(
|
||||||
subnet['id'], subnet, ovn_const.TYPE_SUBNETS)
|
subnet['id'], subnet, ovn_const.TYPE_SUBNETS)
|
||||||
@ -2176,21 +2167,19 @@ class OVNClient(object):
|
|||||||
else:
|
else:
|
||||||
self._modify_subnet_dhcp_options(subnet, ovn_subnet, network, txn)
|
self._modify_subnet_dhcp_options(subnet, ovn_subnet, network, txn)
|
||||||
if check_rev_cmd.result == ovn_const.TXN_COMMITTED:
|
if check_rev_cmd.result == ovn_const.TXN_COMMITTED:
|
||||||
db_rev.bump_revision(admin_context, subnet, ovn_const.TYPE_SUBNETS)
|
db_rev.bump_revision(context, subnet, ovn_const.TYPE_SUBNETS)
|
||||||
|
|
||||||
def delete_subnet(self, subnet_id):
|
def delete_subnet(self, context, subnet_id):
|
||||||
admin_context = n_context.get_admin_context()
|
|
||||||
with self._nb_idl.transaction(check_error=True) as txn:
|
with self._nb_idl.transaction(check_error=True) as txn:
|
||||||
self._remove_subnet_dhcp_options(subnet_id, txn)
|
self._remove_subnet_dhcp_options(subnet_id, txn)
|
||||||
db_rev.delete_revision(
|
db_rev.delete_revision(
|
||||||
admin_context, subnet_id, ovn_const.TYPE_SUBNETS)
|
context, subnet_id, ovn_const.TYPE_SUBNETS)
|
||||||
|
|
||||||
def create_security_group(self, security_group):
|
def create_security_group(self, context, security_group):
|
||||||
# If the OVN schema supports Port Groups, we'll model security groups
|
# If the OVN schema supports Port Groups, we'll model security groups
|
||||||
# as such. Otherwise, for backwards compatibility, we'll keep creating
|
# as such. Otherwise, for backwards compatibility, we'll keep creating
|
||||||
# two Address Sets for each Neutron SG (one for IPv4 and one for
|
# two Address Sets for each Neutron SG (one for IPv4 and one for
|
||||||
# IPv6).
|
# IPv6).
|
||||||
admin_context = n_context.get_admin_context()
|
|
||||||
with self._nb_idl.transaction(check_error=True) as txn:
|
with self._nb_idl.transaction(check_error=True) as txn:
|
||||||
ext_ids = {ovn_const.OVN_SG_EXT_ID_KEY: security_group['id']}
|
ext_ids = {ovn_const.OVN_SG_EXT_ID_KEY: security_group['id']}
|
||||||
if self._nb_idl.is_port_groups_supported():
|
if self._nb_idl.is_port_groups_supported():
|
||||||
@ -2208,7 +2197,7 @@ class OVNClient(object):
|
|||||||
txn.add(self._nb_idl.create_address_set(
|
txn.add(self._nb_idl.create_address_set(
|
||||||
name=name, external_ids=ext_ids))
|
name=name, external_ids=ext_ids))
|
||||||
db_rev.bump_revision(
|
db_rev.bump_revision(
|
||||||
admin_context, security_group, ovn_const.TYPE_SECURITY_GROUPS)
|
context, security_group, ovn_const.TYPE_SECURITY_GROUPS)
|
||||||
|
|
||||||
def create_default_drop_port_group(self, ports=None):
|
def create_default_drop_port_group(self, ports=None):
|
||||||
pg_name = ovn_const.OVN_DROP_PORT_GROUP_NAME
|
pg_name = ovn_const.OVN_DROP_PORT_GROUP_NAME
|
||||||
@ -2255,11 +2244,10 @@ class OVNClient(object):
|
|||||||
self._plugin, admin_context, self._nb_idl,
|
self._plugin, admin_context, self._nb_idl,
|
||||||
rule['security_group_id'], rule, is_add_acl=is_add_acl)
|
rule['security_group_id'], rule, is_add_acl=is_add_acl)
|
||||||
|
|
||||||
def create_security_group_rule(self, rule):
|
def create_security_group_rule(self, context, rule):
|
||||||
admin_context = n_context.get_admin_context()
|
|
||||||
self._process_security_group_rule(rule)
|
self._process_security_group_rule(rule)
|
||||||
db_rev.bump_revision(
|
db_rev.bump_revision(
|
||||||
admin_context, rule, ovn_const.TYPE_SECURITY_GROUP_RULES)
|
context, rule, ovn_const.TYPE_SECURITY_GROUP_RULES)
|
||||||
|
|
||||||
def delete_security_group_rule(self, context, rule):
|
def delete_security_group_rule(self, context, rule):
|
||||||
self._process_security_group_rule(rule, is_add_acl=False)
|
self._process_security_group_rule(rule, is_add_acl=False)
|
||||||
|
@ -103,7 +103,7 @@ class OvnNbSynchronizer(OvnDbSynchronizer):
|
|||||||
|
|
||||||
# Create the port in OVN. This will include ACL and Address Set
|
# Create the port in OVN. This will include ACL and Address Set
|
||||||
# updates as needed.
|
# updates as needed.
|
||||||
self._ovn_client.create_port(port)
|
self._ovn_client.create_port(ctx, port)
|
||||||
|
|
||||||
def remove_common_acls(self, neutron_acls, nb_acls):
|
def remove_common_acls(self, neutron_acls, nb_acls):
|
||||||
"""Take out common acls of the two acl dictionaries.
|
"""Take out common acls of the two acl dictionaries.
|
||||||
@ -610,7 +610,7 @@ class OvnNbSynchronizer(OvnDbSynchronizer):
|
|||||||
LOG.warning("Creating the router %s in OVN NB DB",
|
LOG.warning("Creating the router %s in OVN NB DB",
|
||||||
router['id'])
|
router['id'])
|
||||||
self._ovn_client.create_router(
|
self._ovn_client.create_router(
|
||||||
router, add_external_gateway=False)
|
ctx, router, add_external_gateway=False)
|
||||||
if 'routes' in router:
|
if 'routes' in router:
|
||||||
update_sroutes_list.append(
|
update_sroutes_list.append(
|
||||||
{'id': router['id'], 'add': router['routes'],
|
{'id': router['id'], 'add': router['routes'],
|
||||||
@ -642,7 +642,7 @@ class OvnNbSynchronizer(OvnDbSynchronizer):
|
|||||||
LOG.warning("Creating the router port %s in OVN NB DB",
|
LOG.warning("Creating the router port %s in OVN NB DB",
|
||||||
rrport['id'])
|
rrport['id'])
|
||||||
self._ovn_client._create_lrouter_port(
|
self._ovn_client._create_lrouter_port(
|
||||||
rrport['device_id'], rrport)
|
ctx, rrport['device_id'], rrport)
|
||||||
except RuntimeError:
|
except RuntimeError:
|
||||||
LOG.warning("Create router port in OVN "
|
LOG.warning("Create router port in OVN "
|
||||||
"NB failed for router port %s", rrport['id'])
|
"NB failed for router port %s", rrport['id'])
|
||||||
@ -656,7 +656,7 @@ class OvnNbSynchronizer(OvnDbSynchronizer):
|
|||||||
LOG.warning(
|
LOG.warning(
|
||||||
"Updating networks on router port %s in OVN NB DB",
|
"Updating networks on router port %s in OVN NB DB",
|
||||||
rport['id'])
|
rport['id'])
|
||||||
self._ovn_client.update_router_port(rport)
|
self._ovn_client.update_router_port(ctx, rport)
|
||||||
except RuntimeError:
|
except RuntimeError:
|
||||||
LOG.warning("Update router port networks in OVN "
|
LOG.warning("Update router port networks in OVN "
|
||||||
"NB failed for router port %s", rport['id'])
|
"NB failed for router port %s", rport['id'])
|
||||||
@ -1000,7 +1000,7 @@ class OvnNbSynchronizer(OvnDbSynchronizer):
|
|||||||
try:
|
try:
|
||||||
LOG.debug('Creating the network %s in OVN NB DB',
|
LOG.debug('Creating the network %s in OVN NB DB',
|
||||||
network['id'])
|
network['id'])
|
||||||
self._ovn_client.create_network(network)
|
self._ovn_client.create_network(ctx, network)
|
||||||
except RuntimeError:
|
except RuntimeError:
|
||||||
LOG.warning("Create network in OVN NB failed for "
|
LOG.warning("Create network in OVN NB failed for "
|
||||||
"network %s", network['id'])
|
"network %s", network['id'])
|
||||||
|
@ -128,7 +128,7 @@ class OVNL3RouterPlugin(service_base.ServicePluginBase,
|
|||||||
def create_router(self, context, router):
|
def create_router(self, context, router):
|
||||||
router = super(OVNL3RouterPlugin, self).create_router(context, router)
|
router = super(OVNL3RouterPlugin, self).create_router(context, router)
|
||||||
try:
|
try:
|
||||||
self._ovn_client.create_router(router)
|
self._ovn_client.create_router(context, router)
|
||||||
except Exception:
|
except Exception:
|
||||||
with excutils.save_and_reraise_exception():
|
with excutils.save_and_reraise_exception():
|
||||||
# Delete the logical router
|
# Delete the logical router
|
||||||
@ -142,7 +142,8 @@ class OVNL3RouterPlugin(service_base.ServicePluginBase,
|
|||||||
result = super(OVNL3RouterPlugin, self).update_router(context, id,
|
result = super(OVNL3RouterPlugin, self).update_router(context, id,
|
||||||
router)
|
router)
|
||||||
try:
|
try:
|
||||||
self._ovn_client.update_router(result, original_router)
|
self._ovn_client.update_router(context, result,
|
||||||
|
original_router)
|
||||||
except Exception:
|
except Exception:
|
||||||
with excutils.save_and_reraise_exception():
|
with excutils.save_and_reraise_exception():
|
||||||
LOG.exception('Unable to update lrouter for %s', id)
|
LOG.exception('Unable to update lrouter for %s', id)
|
||||||
@ -192,7 +193,7 @@ class OVNL3RouterPlugin(service_base.ServicePluginBase,
|
|||||||
context, router_id, interface_info, may_exist=may_exist)
|
context, router_id, interface_info, may_exist=may_exist)
|
||||||
try:
|
try:
|
||||||
self._ovn_client.create_router_port(
|
self._ovn_client.create_router_port(
|
||||||
router_id, router_interface_info)
|
context, router_id, router_interface_info)
|
||||||
except Exception:
|
except Exception:
|
||||||
with excutils.save_and_reraise_exception():
|
with excutils.save_and_reraise_exception():
|
||||||
super(OVNL3RouterPlugin, self).remove_router_interface(
|
super(OVNL3RouterPlugin, self).remove_router_interface(
|
||||||
@ -402,4 +403,5 @@ class OVNL3RouterPlugin(service_base.ServicePluginBase,
|
|||||||
# internally creates the port, and then calls update, which will
|
# internally creates the port, and then calls update, which will
|
||||||
# trigger this callback even before we had the chance to create
|
# trigger this callback even before we had the chance to create
|
||||||
# the OVN NB DB side
|
# the OVN NB DB side
|
||||||
l3plugin._ovn_client.update_router_port(current, if_exists=True)
|
l3plugin._ovn_client.update_router_port(kwargs['context'],
|
||||||
|
current, if_exists=True)
|
||||||
|
@ -79,6 +79,7 @@ class TestOvnNbSync(base.TestOVNFunctionalBase):
|
|||||||
self.match_old_mac_dhcp_subnets = []
|
self.match_old_mac_dhcp_subnets = []
|
||||||
self.expected_dns_records = []
|
self.expected_dns_records = []
|
||||||
self.expected_ports_with_unknown_addr = []
|
self.expected_ports_with_unknown_addr = []
|
||||||
|
self.ctx = context.get_admin_context()
|
||||||
ovn_config.cfg.CONF.set_override('ovn_metadata_enabled', True,
|
ovn_config.cfg.CONF.set_override('ovn_metadata_enabled', True,
|
||||||
group='ovn')
|
group='ovn')
|
||||||
ovn_config.cfg.CONF.set_override(
|
ovn_config.cfg.CONF.set_override(
|
||||||
@ -1208,14 +1209,14 @@ class TestOvnNbSync(base.TestOVNFunctionalBase):
|
|||||||
_ovn_client = self.l3_plugin._ovn_client
|
_ovn_client = self.l3_plugin._ovn_client
|
||||||
networks, _ = (
|
networks, _ = (
|
||||||
_ovn_client._get_nets_and_ipv6_ra_confs_for_router_port(
|
_ovn_client._get_nets_and_ipv6_ra_confs_for_router_port(
|
||||||
port_fixed_ips))
|
self.ctx, port_fixed_ips))
|
||||||
return networks
|
return networks
|
||||||
|
|
||||||
def _get_ipv6_ra_configs_for_router_port(port_fixed_ips):
|
def _get_ipv6_ra_configs_for_router_port(port_fixed_ips):
|
||||||
_ovn_client = self.l3_plugin._ovn_client
|
_ovn_client = self.l3_plugin._ovn_client
|
||||||
networks, ipv6_ra_configs = (
|
networks, ipv6_ra_configs = (
|
||||||
_ovn_client._get_nets_and_ipv6_ra_confs_for_router_port(
|
_ovn_client._get_nets_and_ipv6_ra_confs_for_router_port(
|
||||||
port_fixed_ips))
|
self.ctx, port_fixed_ips))
|
||||||
return ipv6_ra_configs
|
return ipv6_ra_configs
|
||||||
|
|
||||||
for router_id in db_router_ids:
|
for router_id in db_router_ids:
|
||||||
|
@ -310,6 +310,7 @@ class FakeSubnetContext(object):
|
|||||||
self.fake_subnet = subnet
|
self.fake_subnet = subnet
|
||||||
self.fake_original_subnet = original_subnet
|
self.fake_original_subnet = original_subnet
|
||||||
self.fake_network = FakeNetworkContext(network, None)
|
self.fake_network = FakeNetworkContext(network, None)
|
||||||
|
self._plugin_context = mock.MagicMock()
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def current(self):
|
def current(self):
|
||||||
|
@ -132,13 +132,13 @@ class TestDBInconsistenciesPeriodics(testlib_api.SqlTestCaseLight,
|
|||||||
# database
|
# database
|
||||||
if ovn_rev < 0:
|
if ovn_rev < 0:
|
||||||
self.fake_ovn_client.create_network.assert_called_once_with(
|
self.fake_ovn_client.create_network.assert_called_once_with(
|
||||||
self.net)
|
self.ctx, self.net)
|
||||||
# If the revision number is > 0 it means that the object already
|
# If the revision number is > 0 it means that the object already
|
||||||
# exist and we just need to update to match the latest in the
|
# exist and we just need to update to match the latest in the
|
||||||
# neutron database so, update_network() should be called.
|
# neutron database so, update_network() should be called.
|
||||||
else:
|
else:
|
||||||
self.fake_ovn_client.update_network.assert_called_once_with(
|
self.fake_ovn_client.update_network.assert_called_once_with(
|
||||||
self.net)
|
self.ctx, self.net)
|
||||||
|
|
||||||
def test_fix_network_create(self):
|
def test_fix_network_create(self):
|
||||||
self._test_fix_create_update_network(ovn_rev=-1, neutron_rev=2)
|
self._test_fix_create_update_network(ovn_rev=-1, neutron_rev=2)
|
||||||
@ -174,13 +174,13 @@ class TestDBInconsistenciesPeriodics(testlib_api.SqlTestCaseLight,
|
|||||||
# database
|
# database
|
||||||
if ovn_rev < 0:
|
if ovn_rev < 0:
|
||||||
self.fake_ovn_client.create_port.assert_called_once_with(
|
self.fake_ovn_client.create_port.assert_called_once_with(
|
||||||
self.port)
|
self.ctx, self.port)
|
||||||
# If the revision number is > 0 it means that the object already
|
# If the revision number is > 0 it means that the object already
|
||||||
# exist and we just need to update to match the latest in the
|
# exist and we just need to update to match the latest in the
|
||||||
# neutron database so, update_port() should be called.
|
# neutron database so, update_port() should be called.
|
||||||
else:
|
else:
|
||||||
self.fake_ovn_client.update_port.assert_called_once_with(
|
self.fake_ovn_client.update_port.assert_called_once_with(
|
||||||
self.port)
|
self.ctx, self.port)
|
||||||
|
|
||||||
def test_fix_port_create(self):
|
def test_fix_port_create(self):
|
||||||
self._test_fix_create_update_port(ovn_rev=-1, neutron_rev=2)
|
self._test_fix_create_update_port(ovn_rev=-1, neutron_rev=2)
|
||||||
@ -211,7 +211,7 @@ class TestDBInconsistenciesPeriodics(testlib_api.SqlTestCaseLight,
|
|||||||
|
|
||||||
if revision_number < 0:
|
if revision_number < 0:
|
||||||
self.fake_ovn_client.create_security_group.assert_called_once_with(
|
self.fake_ovn_client.create_security_group.assert_called_once_with(
|
||||||
sg)
|
self.ctx, sg)
|
||||||
else:
|
else:
|
||||||
# If the object already exist let's make sure we just bump
|
# If the object already exist let's make sure we just bump
|
||||||
# the revision number in the ovn_revision_numbers table
|
# the revision number in the ovn_revision_numbers table
|
||||||
@ -228,10 +228,10 @@ class TestDBInconsistenciesPeriodics(testlib_api.SqlTestCaseLight,
|
|||||||
def test__create_lrouter_port(self):
|
def test__create_lrouter_port(self):
|
||||||
port = {'id': 'port-id',
|
port = {'id': 'port-id',
|
||||||
'device_id': 'router-id'}
|
'device_id': 'router-id'}
|
||||||
self.periodic._create_lrouter_port(port)
|
self.periodic._create_lrouter_port(self.ctx, port)
|
||||||
l3_mock = self.periodic._ovn_client._l3_plugin
|
l3_mock = self.periodic._ovn_client._l3_plugin
|
||||||
l3_mock.add_router_interface.assert_called_once_with(
|
l3_mock.add_router_interface.assert_called_once_with(
|
||||||
mock.ANY, port['device_id'], {'port_id': port['id']},
|
self.ctx, port['device_id'], {'port_id': port['id']},
|
||||||
may_exist=True)
|
may_exist=True)
|
||||||
|
|
||||||
@mock.patch.object(maintenance.LOG, 'debug')
|
@mock.patch.object(maintenance.LOG, 'debug')
|
||||||
|
@ -595,7 +595,7 @@ class TestOvnNbSyncML2(test_mech_driver.OVNMechanismDriverTestCase):
|
|||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
len(create_network_list),
|
len(create_network_list),
|
||||||
ovn_nb_synchronizer._ovn_client.create_network.call_count)
|
ovn_nb_synchronizer._ovn_client.create_network.call_count)
|
||||||
create_network_calls = [mock.call(net['net'])
|
create_network_calls = [mock.call(mock.ANY, net['net'])
|
||||||
for net in create_network_list]
|
for net in create_network_list]
|
||||||
ovn_nb_synchronizer._ovn_client.create_network.assert_has_calls(
|
ovn_nb_synchronizer._ovn_client.create_network.assert_has_calls(
|
||||||
create_network_calls, any_order=True)
|
create_network_calls, any_order=True)
|
||||||
@ -603,7 +603,8 @@ class TestOvnNbSyncML2(test_mech_driver.OVNMechanismDriverTestCase):
|
|||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
len(create_port_list),
|
len(create_port_list),
|
||||||
ovn_nb_synchronizer._ovn_client.create_port.call_count)
|
ovn_nb_synchronizer._ovn_client.create_port.call_count)
|
||||||
create_port_calls = [mock.call(port) for port in create_port_list]
|
create_port_calls = [mock.call(mock.ANY, port)
|
||||||
|
for port in create_port_list]
|
||||||
ovn_nb_synchronizer._ovn_client.create_port.assert_has_calls(
|
ovn_nb_synchronizer._ovn_client.create_port.assert_has_calls(
|
||||||
create_port_calls, any_order=True)
|
create_port_calls, any_order=True)
|
||||||
|
|
||||||
@ -677,7 +678,8 @@ class TestOvnNbSyncML2(test_mech_driver.OVNMechanismDriverTestCase):
|
|||||||
len(del_floating_ip_list),
|
len(del_floating_ip_list),
|
||||||
ovn_nb_synchronizer._ovn_client._delete_floatingip.call_count)
|
ovn_nb_synchronizer._ovn_client._delete_floatingip.call_count)
|
||||||
|
|
||||||
create_router_calls = [mock.call(r, add_external_gateway=False)
|
create_router_calls = [mock.call(mock.ANY, r,
|
||||||
|
add_external_gateway=False)
|
||||||
for r in create_router_list]
|
for r in create_router_list]
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
len(create_router_list),
|
len(create_router_list),
|
||||||
@ -685,7 +687,7 @@ class TestOvnNbSyncML2(test_mech_driver.OVNMechanismDriverTestCase):
|
|||||||
ovn_nb_synchronizer._ovn_client.create_router.assert_has_calls(
|
ovn_nb_synchronizer._ovn_client.create_router.assert_has_calls(
|
||||||
create_router_calls, any_order=True)
|
create_router_calls, any_order=True)
|
||||||
|
|
||||||
create_router_port_calls = [mock.call(p['device_id'],
|
create_router_port_calls = [mock.call(mock.ANY, p['device_id'],
|
||||||
mock.ANY)
|
mock.ANY)
|
||||||
for p in create_router_port_list]
|
for p in create_router_port_list]
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
@ -697,7 +699,7 @@ class TestOvnNbSyncML2(test_mech_driver.OVNMechanismDriverTestCase):
|
|||||||
|
|
||||||
self.assertEqual(len(del_router_list),
|
self.assertEqual(len(del_router_list),
|
||||||
ovn_api.delete_lrouter.call_count)
|
ovn_api.delete_lrouter.call_count)
|
||||||
update_router_port_calls = [mock.call(p)
|
update_router_port_calls = [mock.call(mock.ANY, p)
|
||||||
for p in update_router_port_list]
|
for p in update_router_port_list]
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
len(update_router_port_list),
|
len(update_router_port_list),
|
||||||
|
@ -111,7 +111,7 @@ class TestOVNMechanismDriver(test_plugin.Ml2PluginV2TestCase):
|
|||||||
def test__create_security_group(self, mock_bump):
|
def test__create_security_group(self, mock_bump):
|
||||||
self.mech_driver._create_security_group(
|
self.mech_driver._create_security_group(
|
||||||
resources.SECURITY_GROUP, events.AFTER_CREATE, {},
|
resources.SECURITY_GROUP, events.AFTER_CREATE, {},
|
||||||
security_group=self.fake_sg)
|
security_group=self.fake_sg, context=self.context)
|
||||||
external_ids = {ovn_const.OVN_SG_EXT_ID_KEY: self.fake_sg['id']}
|
external_ids = {ovn_const.OVN_SG_EXT_ID_KEY: self.fake_sg['id']}
|
||||||
ip4_name = ovn_utils.ovn_addrset_name(self.fake_sg['id'], 'ip4')
|
ip4_name = ovn_utils.ovn_addrset_name(self.fake_sg['id'], 'ip4')
|
||||||
ip6_name = ovn_utils.ovn_addrset_name(self.fake_sg['id'], 'ip6')
|
ip6_name = ovn_utils.ovn_addrset_name(self.fake_sg['id'], 'ip6')
|
||||||
@ -143,7 +143,7 @@ class TestOVNMechanismDriver(test_plugin.Ml2PluginV2TestCase):
|
|||||||
rule = {'security_group_id': 'sg_id'}
|
rule = {'security_group_id': 'sg_id'}
|
||||||
self.mech_driver._process_sg_rule_notification(
|
self.mech_driver._process_sg_rule_notification(
|
||||||
resources.SECURITY_GROUP_RULE, events.AFTER_CREATE, {},
|
resources.SECURITY_GROUP_RULE, events.AFTER_CREATE, {},
|
||||||
security_group_rule=rule)
|
security_group_rule=rule, context=self.context)
|
||||||
ovn_acl_up.assert_called_once_with(
|
ovn_acl_up.assert_called_once_with(
|
||||||
mock.ANY, mock.ANY, mock.ANY,
|
mock.ANY, mock.ANY, mock.ANY,
|
||||||
'sg_id', rule, is_add_acl=True)
|
'sg_id', rule, is_add_acl=True)
|
||||||
@ -1492,7 +1492,7 @@ class TestOVNMechanismDriver(test_plugin.Ml2PluginV2TestCase):
|
|||||||
self.mech_driver.create_port_postcommit(fake_ctx)
|
self.mech_driver.create_port_postcommit(fake_ctx)
|
||||||
passed_fake_port = copy.deepcopy(fake_port)
|
passed_fake_port = copy.deepcopy(fake_port)
|
||||||
passed_fake_port['network'] = fake_ctx.network.current
|
passed_fake_port['network'] = fake_ctx.network.current
|
||||||
mock_create_port.assert_called_once_with(passed_fake_port)
|
mock_create_port.assert_called_once_with(mock.ANY, passed_fake_port)
|
||||||
mock_notify_dhcp.assert_called_once_with(fake_port['id'])
|
mock_notify_dhcp.assert_called_once_with(fake_port['id'])
|
||||||
|
|
||||||
@mock.patch.object(mech_driver.OVNMechanismDriver,
|
@mock.patch.object(mech_driver.OVNMechanismDriver,
|
||||||
@ -1512,32 +1512,31 @@ class TestOVNMechanismDriver(test_plugin.Ml2PluginV2TestCase):
|
|||||||
passed_fake_port_orig['network'] = fake_ctx.network.current
|
passed_fake_port_orig['network'] = fake_ctx.network.current
|
||||||
|
|
||||||
mock_update_port.assert_called_once_with(
|
mock_update_port.assert_called_once_with(
|
||||||
passed_fake_port, port_object=passed_fake_port_orig)
|
mock.ANY, passed_fake_port, port_object=passed_fake_port_orig)
|
||||||
mock_notify_dhcp.assert_called_once_with(fake_port['id'])
|
mock_notify_dhcp.assert_called_once_with(fake_port['id'])
|
||||||
|
|
||||||
@mock.patch.object(mech_driver.OVNMechanismDriver,
|
@mock.patch.object(mech_driver.OVNMechanismDriver,
|
||||||
'_is_port_provisioning_required', lambda *_: True)
|
'_is_port_provisioning_required', lambda *_: True)
|
||||||
@mock.patch.object(mech_driver.OVNMechanismDriver, '_notify_dhcp_updated')
|
@mock.patch.object(mech_driver.OVNMechanismDriver, '_notify_dhcp_updated')
|
||||||
@mock.patch.object(ovn_client.OVNClient, 'update_port')
|
@mock.patch.object(ovn_client.OVNClient, 'update_port')
|
||||||
@mock.patch.object(context, 'get_admin_context')
|
|
||||||
def test_update_port_postcommit_live_migration(
|
def test_update_port_postcommit_live_migration(
|
||||||
self, mock_admin_context, mock_update_port, mock_notify_dhcp):
|
self, mock_update_port, mock_notify_dhcp):
|
||||||
self.plugin.update_port_status = mock.Mock()
|
self.plugin.update_port_status = mock.Mock()
|
||||||
foo_admin_context = mock.Mock()
|
fake_context = 'fake_context'
|
||||||
mock_admin_context.return_value = foo_admin_context
|
|
||||||
fake_port = fakes.FakePort.create_one_port(
|
fake_port = fakes.FakePort.create_one_port(
|
||||||
attrs={
|
attrs={
|
||||||
'status': const.PORT_STATUS_DOWN,
|
'status': const.PORT_STATUS_DOWN,
|
||||||
portbindings.PROFILE: {ovn_const.MIGRATING_ATTR: 'foo'},
|
portbindings.PROFILE: {ovn_const.MIGRATING_ATTR: 'foo'},
|
||||||
portbindings.VIF_TYPE: portbindings.VIF_TYPE_OVS}).info()
|
portbindings.VIF_TYPE: portbindings.VIF_TYPE_OVS}).info()
|
||||||
fake_ctx = mock.Mock(current=fake_port, original=fake_port)
|
fake_ctx = mock.Mock(current=fake_port, original=fake_port,
|
||||||
|
_plugin_context=fake_context)
|
||||||
|
|
||||||
self.mech_driver.update_port_postcommit(fake_ctx)
|
self.mech_driver.update_port_postcommit(fake_ctx)
|
||||||
|
|
||||||
mock_update_port.assert_not_called()
|
mock_update_port.assert_not_called()
|
||||||
mock_notify_dhcp.assert_not_called()
|
mock_notify_dhcp.assert_not_called()
|
||||||
self.plugin.update_port_status.assert_called_once_with(
|
self.plugin.update_port_status.assert_called_once_with(
|
||||||
foo_admin_context, fake_port['id'], const.PORT_STATUS_ACTIVE)
|
fake_context, fake_port['id'], const.PORT_STATUS_ACTIVE)
|
||||||
|
|
||||||
def _add_chassis_agent(self, nb_cfg, agent_type, updated_at=None):
|
def _add_chassis_agent(self, nb_cfg, agent_type, updated_at=None):
|
||||||
chassis = mock.Mock()
|
chassis = mock.Mock()
|
||||||
@ -1630,7 +1629,7 @@ class TestOVNMechanismDriver(test_plugin.Ml2PluginV2TestCase):
|
|||||||
device_owner=const.DEVICE_OWNER_ROUTER_GW) as port:
|
device_owner=const.DEVICE_OWNER_ROUTER_GW) as port:
|
||||||
# Let's update the MTU to something different
|
# Let's update the MTU to something different
|
||||||
network['network']['mtu'] = new_mtu
|
network['network']['mtu'] = new_mtu
|
||||||
fake_ctx = mock.Mock(current=network['network'])
|
fake_ctx = mock.MagicMock(current=network['network'])
|
||||||
fake_ctx._plugin_context.session.is_active = False
|
fake_ctx._plugin_context.session.is_active = False
|
||||||
|
|
||||||
self.mech_driver.update_network_postcommit(fake_ctx)
|
self.mech_driver.update_network_postcommit(fake_ctx)
|
||||||
|
@ -300,7 +300,7 @@ class TestOVNL3RouterPlugin(test_mech_driver.Ml2PluginV2TestCase):
|
|||||||
'router-port-id', 'lrp-router-port-id', is_gw_port=False,
|
'router-port-id', 'lrp-router-port-id', is_gw_port=False,
|
||||||
lsp_address=ovn_const.DEFAULT_ADDR_FOR_LSP_WITH_PEER)
|
lsp_address=ovn_const.DEFAULT_ADDR_FOR_LSP_WITH_PEER)
|
||||||
self.bump_rev_p.assert_called_once_with(
|
self.bump_rev_p.assert_called_once_with(
|
||||||
self.admin_context, self.fake_router_port,
|
mock.ANY, self.fake_router_port,
|
||||||
ovn_const.TYPE_ROUTER_PORTS)
|
ovn_const.TYPE_ROUTER_PORTS)
|
||||||
|
|
||||||
@mock.patch('neutron.db.l3_db.L3_NAT_dbonly_mixin.add_router_interface')
|
@mock.patch('neutron.db.l3_db.L3_NAT_dbonly_mixin.add_router_interface')
|
||||||
@ -526,9 +526,9 @@ class TestOVNL3RouterPlugin(test_mech_driver.Ml2PluginV2TestCase):
|
|||||||
lsp_address=ovn_const.DEFAULT_ADDR_FOR_LSP_WITH_PEER)
|
lsp_address=ovn_const.DEFAULT_ADDR_FOR_LSP_WITH_PEER)
|
||||||
self.l3_inst._ovn.add_static_route.assert_has_calls(expected_calls)
|
self.l3_inst._ovn.add_static_route.assert_has_calls(expected_calls)
|
||||||
|
|
||||||
bump_rev_calls = [mock.call(self.admin_context, self.fake_ext_gw_port,
|
bump_rev_calls = [mock.call(mock.ANY, self.fake_ext_gw_port,
|
||||||
ovn_const.TYPE_ROUTER_PORTS),
|
ovn_const.TYPE_ROUTER_PORTS),
|
||||||
mock.call(self.admin_context,
|
mock.call(mock.ANY,
|
||||||
self.fake_router_with_ext_gw,
|
self.fake_router_with_ext_gw,
|
||||||
ovn_const.TYPE_ROUTERS),
|
ovn_const.TYPE_ROUTERS),
|
||||||
]
|
]
|
||||||
@ -577,7 +577,7 @@ class TestOVNL3RouterPlugin(test_mech_driver.Ml2PluginV2TestCase):
|
|||||||
'neutron-router-id', logical_ip='10.0.0.0/24',
|
'neutron-router-id', logical_ip='10.0.0.0/24',
|
||||||
external_ip='192.168.1.1', type='snat')
|
external_ip='192.168.1.1', type='snat')
|
||||||
self.bump_rev_p.assert_called_with(
|
self.bump_rev_p.assert_called_with(
|
||||||
self.admin_context, self.fake_router_port,
|
mock.ANY, self.fake_router_port,
|
||||||
ovn_const.TYPE_ROUTER_PORTS)
|
ovn_const.TYPE_ROUTER_PORTS)
|
||||||
|
|
||||||
@mock.patch('neutron.db.db_base_plugin_v2.NeutronDbPluginV2.get_port')
|
@mock.patch('neutron.db.db_base_plugin_v2.NeutronDbPluginV2.get_port')
|
||||||
@ -648,7 +648,7 @@ class TestOVNL3RouterPlugin(test_mech_driver.Ml2PluginV2TestCase):
|
|||||||
external_ip='192.168.1.1', type='snat')
|
external_ip='192.168.1.1', type='snat')
|
||||||
|
|
||||||
self.bump_rev_p.assert_called_with(
|
self.bump_rev_p.assert_called_with(
|
||||||
self.admin_context, self.fake_router_port,
|
mock.ANY, self.fake_router_port,
|
||||||
ovn_const.TYPE_ROUTER_PORTS)
|
ovn_const.TYPE_ROUTER_PORTS)
|
||||||
|
|
||||||
@mock.patch('neutron.db.db_base_plugin_v2.NeutronDbPluginV2.get_port')
|
@mock.patch('neutron.db.db_base_plugin_v2.NeutronDbPluginV2.get_port')
|
||||||
@ -705,7 +705,7 @@ class TestOVNL3RouterPlugin(test_mech_driver.Ml2PluginV2TestCase):
|
|||||||
'neutron-router-id', type='snat',
|
'neutron-router-id', type='snat',
|
||||||
logical_ip='10.0.0.0/24', external_ip='192.168.1.1')
|
logical_ip='10.0.0.0/24', external_ip='192.168.1.1')
|
||||||
self.bump_rev_p.assert_called_with(
|
self.bump_rev_p.assert_called_with(
|
||||||
self.admin_context, self.fake_ext_gw_port,
|
mock.ANY, self.fake_ext_gw_port,
|
||||||
ovn_const.TYPE_ROUTER_PORTS)
|
ovn_const.TYPE_ROUTER_PORTS)
|
||||||
|
|
||||||
@mock.patch.object(utils, 'get_lrouter_ext_gw_static_route')
|
@mock.patch.object(utils, 'get_lrouter_ext_gw_static_route')
|
||||||
@ -763,10 +763,10 @@ class TestOVNL3RouterPlugin(test_mech_driver.Ml2PluginV2TestCase):
|
|||||||
external_ip='192.168.1.1')
|
external_ip='192.168.1.1')
|
||||||
|
|
||||||
self.bump_rev_p.assert_called_with(
|
self.bump_rev_p.assert_called_with(
|
||||||
self.admin_context, self.fake_ext_gw_port,
|
mock.ANY, self.fake_ext_gw_port,
|
||||||
ovn_const.TYPE_ROUTER_PORTS)
|
ovn_const.TYPE_ROUTER_PORTS)
|
||||||
self.del_rev_p.assert_called_once_with(
|
self.del_rev_p.assert_called_once_with(
|
||||||
self.admin_context, 'old-gw-port-id', ovn_const.TYPE_ROUTER_PORTS)
|
mock.ANY, 'old-gw-port-id', ovn_const.TYPE_ROUTER_PORTS)
|
||||||
|
|
||||||
@mock.patch.object(utils, 'get_lrouter_ext_gw_static_route')
|
@mock.patch.object(utils, 'get_lrouter_ext_gw_static_route')
|
||||||
@mock.patch('neutron.db.db_base_plugin_v2.NeutronDbPluginV2.get_port')
|
@mock.patch('neutron.db.db_base_plugin_v2.NeutronDbPluginV2.get_port')
|
||||||
@ -1387,16 +1387,20 @@ class TestOVNL3RouterPlugin(test_mech_driver.Ml2PluginV2TestCase):
|
|||||||
@mock.patch('neutron.plugins.ml2.drivers.ovn.mech_driver.ovsdb.'
|
@mock.patch('neutron.plugins.ml2.drivers.ovn.mech_driver.ovsdb.'
|
||||||
'ovn_client.OVNClient.update_router_port')
|
'ovn_client.OVNClient.update_router_port')
|
||||||
def test_port_update_postcommit(self, update_rp_mock):
|
def test_port_update_postcommit(self, update_rp_mock):
|
||||||
kwargs = {'port': {'device_owner': 'foo'}}
|
kwargs = {'port': {'device_owner': 'foo'},
|
||||||
|
'context': 'fake_context'}
|
||||||
self.l3_inst._port_update(resources.PORT, events.AFTER_UPDATE, None,
|
self.l3_inst._port_update(resources.PORT, events.AFTER_UPDATE, None,
|
||||||
**kwargs)
|
**kwargs)
|
||||||
update_rp_mock.assert_not_called()
|
update_rp_mock.assert_not_called()
|
||||||
|
|
||||||
kwargs = {'port': {'device_owner': constants.DEVICE_OWNER_ROUTER_INTF}}
|
kwargs = {'port': {'device_owner': constants.DEVICE_OWNER_ROUTER_INTF},
|
||||||
|
'context': 'fake_context'}
|
||||||
self.l3_inst._port_update(resources.PORT, events.AFTER_UPDATE, None,
|
self.l3_inst._port_update(resources.PORT, events.AFTER_UPDATE, None,
|
||||||
**kwargs)
|
**kwargs)
|
||||||
|
|
||||||
update_rp_mock.assert_called_once_with(kwargs['port'], if_exists=True)
|
update_rp_mock.assert_called_once_with(kwargs['context'],
|
||||||
|
kwargs['port'],
|
||||||
|
if_exists=True)
|
||||||
|
|
||||||
@mock.patch('neutron.plugins.ml2.plugin.Ml2Plugin.update_port_status')
|
@mock.patch('neutron.plugins.ml2.plugin.Ml2Plugin.update_port_status')
|
||||||
@mock.patch('neutron.plugins.ml2.plugin.Ml2Plugin.update_port')
|
@mock.patch('neutron.plugins.ml2.plugin.Ml2Plugin.update_port')
|
||||||
@ -1535,7 +1539,7 @@ class TestOVNL3RouterPlugin(test_mech_driver.Ml2PluginV2TestCase):
|
|||||||
external_ip='192.168.1.1', type='snat')
|
external_ip='192.168.1.1', type='snat')
|
||||||
|
|
||||||
self.bump_rev_p.assert_called_with(
|
self.bump_rev_p.assert_called_with(
|
||||||
self.admin_context, self.fake_router_port,
|
mock.ANY, self.fake_router_port,
|
||||||
ovn_const.TYPE_ROUTER_PORTS)
|
ovn_const.TYPE_ROUTER_PORTS)
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user